diff --git a/#20251122223053-keyboard.org# b/#20251122223053-keyboard.org# deleted file mode 100644 index 00dc4c1..0000000 --- a/#20251122223053-keyboard.org# +++ /dev/null @@ -1,166 +0,0 @@ -:PROPERTIES: -:ID: 0217f537-442a-4593-8c69-d481f0d1f2a8 -:END: -#+title: keyboard -#+filetags: :hardware:linux: - -This all comes from the fact that a “key press” isn’t one thing — it’s a stack of specs and translations from **keyboard hardware → USB/HID → Linux kernel → userspace (XKB/Wayland) → Hyprland binds**. - -Here are some structured notes you can keep / refer back to 👇 - ---- - -## 1. Big picture: what happens when you press a key? - -When you hit a key (like your “lock” key), roughly this happens: - -```text -Physical switch on keyboard - ↓ -Keyboard firmware → USB HID "usage" (e.g. 0x07:0xE3 = Left GUI) - ↓ -Linux kernel input subsystem (evdev) → KEY_LEFTMETA (code 125) - ↓ -libinput / xkbcommon → keysyms (like Super_L, L, etc.) - ↓ -Hyprland → your `bind = SUPER, L, exec, ...` -``` - -The “topic” we’ve been poking at is basically **understanding each layer in that stack**. - ---- - -## 2. USB HID: where `700e3` comes from - -Modern USB keyboards follow the **USB HID (Human Interface Device) specification**. -This spec defines **Usage Tables**: numerical codes for things like keys, buttons, axes, etc. - -* The keyboard page is **Usage Page 0x07 (Keyboard/Keypad)**. -* In your `evtest` output, `MSC_SCAN value 700e3` means: - - * `0x07` (Keyboard page) - * `0xE3` (Left GUI / “Windows/Super” key) - -You can see the official tables here (PDF): - -* **HID Usage Tables (includes Keyboard/Keypad page 0x07)** - [https://usb.org/sites/default/files/hut1_21.pdf](https://usb.org/sites/default/files/hut1_21.pdf) ([USB Implementers Forum][1]) - -If you scroll to the **Keyboard/Keypad Page (0x07)** section, it lists all the key usages: A, B, C, modifiers, function keys, etc. There’s also a standalone Keyboard/Keypad-page extract people mirror, like this PDF snippet: ([d1.amobbs.com][2]) - -So: - -* `700e3` = Page `0x07`, Usage `0xE3` → *Keyboard Left GUI* -* `7000f` = Page `0x07`, Usage `0x0F` → *Keyboard L* key - -That’s how we knew your lock key was sending **Super + L**. - ---- - -## 3. Linux input subsystem: `EV_MSC`, `EV_KEY`, `KEY_LEFTMETA` - -Linux has a dedicated **input subsystem** in the kernel (`drivers/input`, `drivers/hid` etc.) that takes those HID usages and turns them into a unified stream of **input events**. ([Linux Kernel Documentation][3]) - -Key ideas: - -* Devices expose `/dev/input/eventX` nodes. -* Each event is a struct with: - - * `type` (e.g. `EV_KEY`, `EV_MSC`, `EV_REL`, `EV_SYN`) - * `code` (e.g. `KEY_L`, `KEY_LEFTMETA`) - * `value` (pressed = 1, released = 0, repeat = 2) - -Docs worth bookmarking: - -* **Linux input subsystem overview** - [https://docs.kernel.org/input/input.html](https://docs.kernel.org/input/input.html) ([Linux Kernel Documentation][3]) - -* **Input event types and codes (`event-codes.txt`)** - [https://www.kernel.org/doc/Documentation/input/event-codes.txt](https://www.kernel.org/doc/Documentation/input/event-codes.txt) ([Kernel.org][4]) - -The **keycode definitions** (`KEY_L`, `KEY_LEFTMETA`, etc.) live in: - -* `include/uapi/linux/input-event-codes.h` in the kernel source - Example mirror: - [https://raw.githubusercontent.com/torvalds/linux/master/include/uapi/linux/input-event-codes.h](https://raw.githubusercontent.com/torvalds/linux/master/include/uapi/linux/input-event-codes.h) ([GitHub][5]) - -When `evtest` prints: - -```text -type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e3 -type 1 (EV_KEY), code 125 (KEY_LEFTMETA), value 0 -``` - -that means: - -* `EV_MSC / MSC_SCAN` → “Here is the raw hardware scancode” (from USB HID). -* `EV_KEY / KEY_LEFTMETA` → “Linux mapped that scancode to logical key LEFTMETA”. - - -## 4. XKB / xkbcommon: mapping to actual characters & modifiers - -Above the kernel, you’ve got an extra mapping layer that says: - -> For keycode N, with this layout, when Shift is held, produce this character/symbol. - -On X11 this is handled by **XKB (X Keyboard Extension)**; on Wayland compositors (including Hyprland) the same ideas are implemented via **xkbcommon**. - -Docs: - -* **X Keyboard Extension (XKB) protocol spec** - [https://www.x.org/releases/X11R7.7/doc/kbproto/xkbproto.html](https://www.x.org/releases/X11R7.7/doc/kbproto/xkbproto.html) ([X.Org][6]) - -* **Arch Wiki: X keyboard extension** (good high-level intro) - [https://wiki.archlinux.org/title/X_keyboard_extension](https://wiki.archlinux.org/title/X_keyboard_extension) ([ArchWiki][7]) - -* A nice “practical” walkthrough of XKB concepts: - [https://medium.com/@damko/a-simple-humble-but-comprehensive-guide-to-xkb-for-linux-6f1ad5e13450](https://medium.com/@damko/a-simple-humble-but-comprehensive-guide-to-xkb-for-linux-6f1ad5e13450) ([Medium][8]) - -Hyprland, Sway, etc. all use libinput + xkbcommon under the hood to interpret those keycodes and translate them into keysyms and modifiers. - ---- - -## 5. Hyprland / your config: where the bindings fit in - -Hyprland sits at the top of this stack: - -* It listens to the input events (via libinput). -* It sees keysyms/modifiers (e.g. `Super`, `L`). -* It matches them against your config: - -```ini -bind = SUPER, L, exec, hyprlock -``` - -So your keyboard’s “lock” key: - -1. Firmware sends HID usages `0xE3` (Left GUI) and `0x0F` (L). -2. Linux maps them to `KEY_LEFTMETA` (125) and `KEY_L` (38). -3. xkbcommon maps that to `Super` + `L`. -4. Hyprland says: “Ah, SUPER+L → run `hyprlock`”. - -The “topic” you stumbled into is just **peeling back each abstraction layer**. - -## 6. Handy tools & libraries if you want to go deeper - -* `evtest`, `libinput debug-events`, `showkey` - → To watch what your keyboard is actually sending. - -* **Python-evdev** – Python bindings to read `/dev/input/event*` yourself: - [https://python-evdev.readthedocs.io/](https://python-evdev.readthedocs.io/) ([python-evdev.readthedocs.io][9]) - -* Linux input subsystem docs again: - [https://docs.kernel.org/driver-api/input.html](https://docs.kernel.org/driver-api/input.html) ([Linux Kernel Documentation][10]) - ---- - -[1]: https://usb.org/sites/default/files/hut1_21.pdf?utm_source=chatgpt.com "HID Usage Tables" -[2]: https://d1.amobbs.com/bbs_upload782111/files_47/ourdev_692986N5FAHU.pdf?utm_source=chatgpt.com "10 Keyboard/Keypad Page (0x07)" -[3]: https://docs.kernel.org/input/input.html?utm_source=chatgpt.com "1. Introduction — The Linux Kernel documentation" -[4]: https://www.kernel.org/doc/Documentation/input/event-codes.txt?utm_source=chatgpt.com "event-codes.txt" -[5]: https://raw.githubusercontent.com/torvalds/linux/master/include/uapi/linux/input-event-codes.h?utm_source=chatgpt.com "Input event codes - GitHub" -[6]: https://www.x.org/releases/X11R7.7/doc/kbproto/xkbproto.html?utm_source=chatgpt.com "The X Keyboard Extension: Protocol Specification" -[7]: https://wiki.archlinux.org/title/X_keyboard_extension?utm_source=chatgpt.com "X keyboard extension" -[8]: https://medium.com/%40damko/a-simple-humble-but-comprehensive-guide-to-xkb-for-linux-6f1ad5e13450?utm_source=chatgpt.com "A simple, humble but comprehensive guide to XKB for linux" -[9]: https://python-evdev.readthedocs.io/?utm_source=chatgpt.com "Introduction — Python-evdev - Read the Docs" -[10]: https://docs.kernel.org/driver-api/input.html?utm_source=chatgpt.com "Input Subsystem" diff --git a/.packages/archives/gnu/archive-contents b/.packages/archives/gnu/archive-contents new file mode 100644 index 0000000..d90ff79 --- /dev/null +++ b/.packages/archives/gnu/archive-contents @@ -0,0 +1,3660 @@ +(1 + (a68-mode + . [(1 2) ((emacs (24 3))) "Major mode for editing Algol 68 code" tar + ((:url . "https://git.sr.ht/~jemarch/a68-mode") + (:keywords "languages") + (:maintainer "Jose E. Marchesi" . "jemarch@gnu.org") + (:authors ("Omar Polo" . "op@omarpolo.com")) + (:commit . "b79d05da4a5c0cea73a07db0df747d19cc6924d2"))]) + (ace-window + . [(0 10 0) ((avy (0 5 0))) "Quickly switch windows." tar + ((:url . "https://github.com/abo-abo/ace-window") + (:keywords "window" "location") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:commit . "7003c88cd9cad58dc35c7cd13ebc61c355fb5be7"))]) + (ack + . [(1 11) nil "interface to ack-like tools" tar + ((:url . "https://github.com/leoliu/ack-el") + (:keywords "tools" "processes" "convenience") + (:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors ("Leo Liu" . "sdl.web@gmail.com")) + (:commit . "90c90a80322aa9f26ce88f2f24a224afc4c994b8"))]) + (activities + . [(0 7 2) ((emacs (29 1)) (persist (0 6))) + "Save/restore sets of windows, tabs/frames, and their buffers" + tar + ((:url . "https://github.com/alphapapa/activities.el") + (:keywords "convenience") + (:maintainer "Adam Porter" . "adam@alphapapa.net") + (:authors ("Adam Porter" . "adam@alphapapa.net")) + (:commit . "a7e7842c615e149ad7d7e57f383936b49dcb129f"))]) + (ada-mode + . [(8 1 0) + ((uniquify-files (1 0 4)) (wisi (4 3 0)) (gnat-compiler (1 0 3)) + (emacs (25 3))) + "major-mode for editing Ada sources" tar + ((:url . "https://www.nongnu.org/ada-mode/") + (:keywords "languages" "ada") + (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:commit . "357ac189bea640023e33214e8efe9288d9d1416c"))]) + (ada-ref-man + . [(2020 1) nil "Ada Reference Manual 2012" tar + ((:url . "http://stephe-leake.org/ada/arm.html") + (:keywords "languages" "ada") + (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org") + (:authors ("Stephen Leake" . "stephen_leake@member.fsf.org")) + (:commit . "b86a173c1488989fd06f0b612e7b7acee9fda070"))]) + (adaptive-wrap + . [(0 8) nil "Smart line-wrapping with wrap-prefix" tar + ((:maintainer ("Stephen Berman" . "stephen.berman@gmx.net") + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:authors ("Stephen Berman" . "stephen.berman@gmx.net") + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/adaptive-wrap.html") + (:commit . "026c35f59174febab2bcdb3c50fb8344c248671c"))]) + (adjust-parens + . [(3 2) ((emacs (24 3))) + "Indent and dedent Lisp code, automatically adjust close parens" + tar + ((:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com") + (:authors ("Barry O'Reilly" . "gundaetiapo@gmail.com")) + (:url . "https://elpa.gnu.org/packages/adjust-parens.html") + (:commit . "a7e0ece3037821ea438fe401ade6d3c60b3d24e0"))]) + (advice-patch + . [(0 1) ((emacs (24 4))) + "Use patches to advise the inside of functions" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/advice-patch.html") + (:commit . "b0575729f34d1c45f1b47d8793e84311a4770826"))]) + (aggressive-completion + . [(1 7) ((emacs (27 1))) "Automatic minibuffer completion" tar + ((:keywords "minibuffer" "completion") + (:maintainer "Tassilo Horn" . "tsdh@gnu.org") + (:authors ("Tassilo Horn" . "tsdh@gnu.org")) + (:url + . "https://elpa.gnu.org/packages/aggressive-completion.html") + (:commit . "d92bf2428133b6e261780e16b7030afe91d3668e"))]) + (aggressive-indent + . [(1 10 0) ((emacs (24 3))) + "Minor mode to aggressively keep your code always indented" tar + ((:url . "https://github.com/Malabarba/aggressive-indent-mode") + (:keywords "indent" "lisp" "maint" "tools") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:commit . "cb416faf61c46977c06cf9d99525b04dc109a33c"))]) + (ahungry-theme + . [(1 10 0) ((emacs (24))) + "Ahungry color theme for Emacs. Make sure to (load-theme 'ahungry)." + tar + ((:url . "https://github.com/ahungry/color-theme-ahungry") + (:keywords "ahungry" "palette" "color" "theme" "emacs" + "color-theme" "deftheme") + (:maintainer "Matthew Carter" . "m@ahungry.com") + (:authors ("Matthew Carter" . "m@ahungry.com")) + (:commit . "45bf75f17752c8e8dd4c8a4531c0aa419cdccb84"))]) + (aircon-theme + . [(0 0 6) ((emacs (24 4))) "Cool and legible light theme" tar + ((:url . "https://git.sr.ht/~chambln/aircon-theme.el") + (:keywords "faces") + (:maintainer "Gregory Chamberlain" + . "~chambln/public-inbox@lists.sr.ht") + (:authors ("Gregory Chamberlain" . "greg@cosine.blue")) + (:commit . "0cecd81e7f6631c91ed0437d801517677e018c1d"))]) + (all + . [(1 1) ((emacs (24 3))) "Edit all lines matching a given regexp" + tar + ((:keywords "matching") + (:maintainer "Per Abrahamsen" . "per.abrahamsen@gmail.com") + (:authors ("Per Abrahamsen" . "per.abrahamsen@gmail.com")) + (:url . "https://elpa.gnu.org/packages/all.html") + (:commit . "55aa1ac8853d81040aec0b3a2bd43200923146fd"))]) + (altcaps + . [(1 3 0) ((emacs (27 1))) + "Apply alternating letter casing to convey sarcasm or mockery" + tar + ((:url . "https://github.com/protesilaos/altcaps") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "2606eafb4352a0c4a2d9f3a760ff234020772d8d"))]) + (ampc + . [(0 2) nil "Asynchronous Music Player Controller" tar + ((:keywords "ampc" "mpc" "mpd") + (:maintainer "Christopher Schmidt" + . "christopher@ch.ristopher.com") + (:authors + ("Christopher Schmidt" . "christopher@ch.ristopher.com")) + (:url . "https://elpa.gnu.org/packages/ampc.html") + (:commit . "70e1a282a9d91c3cab9d87e613259891e124aa35"))]) + (arbitools + . [(0 977) ((cl-lib (0 5))) + "Package for chess tournaments administration" tar + ((:maintainer "David Gonzalez Gandara" + . "dggandara@member.fsf.org") + (:authors + ("David Gonzalez Gandara" . "dggandara@member.fsf.org")) + (:url . "https://elpa.gnu.org/packages/arbitools.html") + (:commit . "93f48b7964909f92bdb410557a01db433826b95e"))]) + (ascii-art-to-unicode + . [(1 13) nil "a small artist adjunct" tar + ((:url . "http://www.gnuvola.org/software/aa2u/") + (:keywords "ascii" "unicode" "box-drawing") + (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") + (:authors ("Thien-Thi Nguyen" . "ttn@gnu.org")) + (:commit . "83ec71af9e1812df781b78f28fa9dac0ff7b61bc"))]) + (assess + . [(0 7) ((emacs (24 4)) (m-buffer (0 15))) "Test support functions" + tar + ((:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk") + (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) + (:url . "https://elpa.gnu.org/packages/assess.html") + (:commit . "cadeb24a5d8261fad4bdfdc09e7d571cc395a6ca"))]) + (async + . [(1 9 9) ((emacs (24 4))) "Asynchronous processing in Emacs" tar + ((:url . "https://github.com/jwiegley/emacs-async") + (:keywords "async") + (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") + (:authors ("John Wiegley" . "jwiegley@gmail.com")) + (:commit . "f317b0c9c3e60a959f45d035ed5e31a78f1263ac"))]) + (auctex + . [(14 1 0) ((emacs (28 1))) "Integrated environment for *TeX*" tar + ((:url . "https://www.gnu.org/software/auctex/") + (:keywords "tex" "latex" "texinfo" "context" "doctex" + "preview-latex") + (:maintainer nil . "auctex-devel@gnu.org") + (:commit . "6e1b6922d7428b839ecfd3184fe50adfe2866a7a"))]) + (auctex-cont-latexmk + . [(0 3) ((emacs (29 3)) (auctex (14 0 5))) + "run latexmk continuously, report errors via Flymake" tar + ((:url . "https://github.com/ultronozm/auctex-cont-latexmk.el") + (:keywords "tex") + (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com") + (:authors ("Paul D. Nelson" . "nelson.paul.david@gmail.com")) + (:commit . "5bd2e6f96fad055e4c3f7d22109aa6573b927406"))]) + (auctex-label-numbers + . [(0 2) ((emacs (27 1)) (auctex (14 0 5))) + "Numbering for LaTeX previews and folds" tar + ((:url . "https://github.com/ultronozm/auctex-label-numbers.el") + (:keywords "tex") + (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com") + (:authors ("Paul D. Nelson" . "nelson.paul.david@gmail.com")) + (:commit . "202e49bb9f754bc647deb112bd2c35f9a583b942"))]) + (aumix-mode + . [(7) nil "run the aumix program in a buffer" tar + ((:url . "http://user42.tuxfamily.org/aumix-mode/index.html") + (:keywords "multimedia" "mixer" "aumix") + (:maintainer "Kevin Ryde" . "user42_kevin@yahoo.com.au") + (:authors ("Kevin Ryde" . "user42_kevin@yahoo.com.au")) + (:commit . "72db1f3ee04f3d1db17487d5bd98466fcbad87fd"))]) + (auth-source-xoauth2-plugin + . [(0 3 2) ((emacs (28 1)) (oauth2 (0 18))) + "Authentication source plugin for xoauth2" tar + ((:url . "https://gitlab.com/manphiz/auth-source-xoauth2-plugin") + (:maintainer "Xiyue Deng" . "manphiz@gmail.com") + (:authors ("Xiyue Deng" . "manphiz@gmail.com")) + (:commit . "c99b5cbe0a015890eed3764c58ea06daaa712b09"))]) + (auto-correct + . [(1 1 4) nil "Remembers and automatically fixes past corrections" + tar + ((:keywords "editing") (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors ("Ian Dunn" . "dunni@gnu.org")) + (:url . "https://elpa.gnu.org/packages/auto-correct.html") + (:commit . "0d38425fad4cd96714c07cfa66983b20764ff518"))]) + (auto-overlays + . [(0 10 10) ((cl-lib (0 5))) "Automatic regexp-delimited overlays" + tar + ((:url . "http://www.dr-qubit.org/tags/computing-code-emacs.html") + (:keywords "extensions") + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:authors ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:commit . "0807a75d2606462ef636b737e8f3873f98141a82"))]) + (autocrypt + . [(0 4 2) ((emacs (24 3))) "Autocrypt implementation" tar + ((:url . "https://git.sr.ht/~pkal/autocrypt") (:keywords "comm") + (:maintainer "Philip Kaludercic" + . "~pkal/public-inbox@lists.sr.ht") + (:authors ("Philip Kaludercic" . "philipk@posteo.net")) + (:commit . "dc0223f11daf526621fda206b38bf06c29759c94"))]) + (autorevert-tail-truncate + . [(1 0 1) ((emacs (29 1))) + "auto-revert-tail your files with RAM control" tar + ((:url + . "https://github.com/shipmints/autorevert-tail-truncate.el") + (:keywords "convenience" "tools" "log files" "autorevert") + (:maintainer "Stephane Marks" . "shipmints@gmail.com") + (:authors ("Stephane Marks" . "shipmints@gmail.com")) + (:commit . "b54df5838159abf760a48de2fd33b21cabd12e66"))]) + (avy + . [(0 5 0) ((emacs (24 1)) (cl-lib (0 5))) + "Jump to arbitrary positions in visible text and select text quickly." + tar + ((:url . "https://github.com/abo-abo/avy") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "point" "location"))]) + (bbdb + . [(3 2 2 4) ((emacs (24)) (cl-lib (0 5))) "Big Brother DataBase" + tar + ((:maintainer "Roland Winkler" . "winkler@gnu.org") + (:url . "https://elpa.gnu.org/packages/bbdb.html") + (:commit . "641ff1f309e65ac8bd9794bd5f72cfc9ffc297a4"))]) + (beacon + . [(1 3 4) ((emacs (25 1))) + "Highlight the cursor whenever the window scrolls" tar + ((:url . "https://github.com/Malabarba/beacon") + (:keywords "convenience") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:commit . "0cf8b60f62876f3e75653a5fb30d5d5cdd74c586"))]) + (beframe + . [(1 4 0) ((emacs (28 1))) "Isolate buffers per frame" tar + ((:url . "https://github.com/protesilaos/beframe") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "2728f72174c1164e99bab4daaef64910e6b41c6c"))]) + (bicep-ts-mode + . [(0 1 4) nil "tree-sitter support for Bicep" tar + ((:url . "https://github.com/josteink/bicep-ts-mode") + (:keywords "bicep" "languages" "tree-sitter") + (:maintainer "Jostein Kjønigsen" . "jostein@kjonigsen.net") + (:authors ("Jostein Kjønigsen" . "jostein@kjonigsen.net")) + (:commit . "625d03d1f63e4a35a9e62dd4d8b06d80134109d8"))]) + (bind-key + . [(2 4 1) nil "A simple way to manage personal keybindings" tar + ((:url . "https://github.com/jwiegley/use-package") + (:keywords "keys" "keybinding" "config" "dotemacs") + (:maintainer "John Wiegley" . "johnw@newartisans.com") + (:authors ("John Wiegley" . "johnw@newartisans.com")) + (:commit . "4932ed21d40f9e8ad48ad2a1f086fdf9b3847ac9"))]) + (blist + . [(0 6) ((ilist (0 4)) (emacs (24))) + "Display bookmarks in an ibuffer way" tar + ((:url . "https://gitlab.com/mmemmew/blist") + (:keywords "convenience") + (:maintainer "Durand" . "durand@jsdurand.xyz") + (:authors ("Durand" . "durand@jsdurand.xyz")) + (:commit . "e3894193fd7602483e0132b82f1b0afbcebe654d"))]) + (bluetooth + . [(0 4 1) + ((emacs (26 1)) (dash (2 18 1)) (compat (30 0 0 0)) + (transient (0 5 0))) + "A mode for interacting with Bluetooth devices" tar + ((:url . "https://codeberg.org/rstocker/emacs-bluetooth") + (:keywords "hardware") + (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de") + (:authors ("Raffael Stocker" . "r.stocker@mnet-mail.de") + ("Etienne Prud homme" . "e.e.f.prudhomme@gmail.com")) + (:commit . "db880e306e00f51e5456b7388371ad6329452165"))]) + (bnf-mode + . [(0 4 5) ((cl-lib (0 5)) (emacs (24 3))) + "Major mode for editing BNF grammars." tar + ((:url . "https://github.com/sergeyklay/bnf-mode") + (:keywords "languages") + (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") + (:authors ("Serghei Iakovlev" . "egrep@protonmail.ch")) + (:commit . "a4fe013fc945d8396930bc6d0dcc1cf9d7102f41"))]) + (boxy + . [(2 0 0) ((emacs (26 1))) "A boxy layout framework" tar + ((:url . "https://gitlab.com/grinn.amy/boxy") (:keywords "tools") + (:maintainer "Amy Grinn" . "grinn.amy@gmail.com") + (:authors ("Amy Grinn" . "grinn.amy@gmail.com")) + (:commit . "c019061cbb3b8a3c93e1720ff4532ef915173adb"))]) + (boxy-headings + . [(2 1 10) ((emacs (26 1)) (boxy (2 0)) (org (9 4))) + "View org files in a boxy diagram" tar + ((:url . "https://gitlab.com/grinn.amy/boxy-headings") + (:keywords "tools") + (:maintainer "Amy Grinn" . "grinn.amy@gmail.com") + (:authors ("Amy Grinn" . "grinn.amy@gmail.com")) + (:commit . "d9ff199273bd96011fe5bfe20cafab57dc189930"))]) + (breadcrumb + . [(1 0 1) ((emacs (28 1)) (project (0 9 8))) + "project and imenu-based breadcrumb paths" tar + ((:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors ("João Távora" . "joaotavora@gmail.com")) + (:url . "https://elpa.gnu.org/packages/breadcrumb.html") + (:commit . "ff5fb77e2556c42aee9f1131f824bdfb955d861f"))]) + (brief + . [(5 92) ((nadvice (0 3)) (cl-lib (0 5))) + "Brief Editor Emulator (Brief Mode)" tar + ((:keywords "brief" "emulations" "crisp") + (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com") + (:authors ("Luke Lee" . "luke.yx.lee@gmail.com")) + (:url . "https://elpa.gnu.org/packages/brief.html") + (:commit . "58c2f484100fecd89248c476e3baf222cda5c7c7"))]) + (buffer-env + . [(0 6) ((emacs (27 1)) (compat (29 1))) + "Buffer-local process environments" tar + ((:url . "https://github.com/astoff/buffer-env") + (:keywords "processes" "tools") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "3814bdf3585ffffea3014b1d01549894ec1aa897"))]) + (buffer-expose + . [(0 4 3) ((emacs (25)) (cl-lib (0 5))) + "Visual buffer switching using a window grid" tar + ((:url . "https://github.com/clemera/buffer-expose") + (:keywords "convenience") + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:authors ("Clemens Radermacher" . "clemera@posteo.net")) + (:commit . "c4a1c745123b86c15ba7bb4858255b5252e8440a"))]) + (bufferlo + . [(1 2) ((emacs (29 1))) + "Frame/Tab Local Buffer Lists with Persistence" tar + ((:url . "https://github.com/florommel/bufferlo") + (:keywords "buffer" "frame" "tabs" "local") + (:maintainer ("Florian Rommel" . "mail@florommel.de") + ("Stephane Marks" . "shipmints@gmail.com")) + (:authors ("Florian Rommel" . "mail@florommel.de") + ("Stephane Marks" . "shipmints@gmail.com")) + (:commit . "8fc587ba341b2ec8189b4d948accc90140469147"))]) + (buframe + . [(0 2) ((emacs (27 1)) (timeout (2 1))) "Buffer-local frames" tar + ((:url . "https://github.com/haji-ali/buframe") + (:keywords "buffer" "frames" "convenience") + (:maintainer "Al Haji-Ali" . "abdo.haji.ali@gmail.com") + (:authors ("Al Haji-Ali" . "abdo.haji.ali@gmail.com")) + (:commit . "d2f1fcdb5f320a5ac583e1f4edc22397106e830a"))]) + (bug-hunter + . [(1 3 1) ((seq (1 3)) (cl-lib (0 5))) + "Hunt down errors by bisecting elisp files" tar + ((:url . "https://github.com/Malabarba/elisp-bug-hunter") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:keywords "lisp"))]) + (buildbot + . [(0 0 1) ((emacs (28))) "A Buildbot client for emacs" tar + ((:url . "https://g.ypei.me/buildbot.el.git") + (:keywords "buildbot" "continuous integration") + (:maintainer "Yuchen Pei" . "id@ypei.org") + (:authors ("Yuchen Pei" . "id@ypei.org")) + (:commit . "d614eea91ca5717c2b0019dae8c85e6a24873f39"))]) + (calibre + . [(1 5 0) ((emacs (27 1)) (compat (29 1 4 1))) + "Interact with Calibre libraries from Emacs" tar + ((:url . "https://git.disroot.org/kjartanoli/calibre.el") + (:maintainer "Kjartan Oli Agustsson" . "kjartanoli@disroot.org") + (:authors ("Kjartan Oli Agustsson" . "kjartanoli@disroot.org")) + (:commit . "dbbffe75c6a2492099e36dc93b6183800a7d6fcd"))]) + (cape + . [(2 4) ((emacs (29 1)) (compat (30))) + "Completion At Point Extensions" tar + ((:url . "https://github.com/minad/cape") + (:keywords "abbrev" "convenience" "matching" "completion" "text") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "281ef8d6f44faa12d6eb9990366ac4bc920c62b1"))]) + (capf-autosuggest + . [(0 3) ((emacs (25 1))) + "History autosuggestions for comint and eshell" tar + ((:url . "https://repo.or.cz/emacs-capf-autosuggest.git") + (:maintainer "jakanakaevangeli" . "jakanakaevangeli@chiru.no") + (:authors ("jakanakaevangeli" . "jakanakaevangeli@chiru.no")) + (:commit . "6d66f0ce52c6a41945a48e7b562dd6d262c62cd9"))]) + (caps-lock + . [(1 0) nil "Caps-lock as a minor mode" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/caps-lock.html") + (:commit . "ce94899c7619e748e8a811ad8cdeb09918e7ecd8"))]) + (captain + . [(1 0 3) nil "CAPiTalization is Automatic IN emacs" tar + ((:keywords "editing") (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors ("Ian Dunn" . "dunni@gnu.org")) + (:url . "https://elpa.gnu.org/packages/captain.html") + (:commit . "a341d4cf3288ebae410c1c9124b82a9e421f3779"))]) + (chess + . [(2 0 5) ((cl-lib (0 5))) "Play chess in GNU Emacs" tar + ((:keywords "games") + (:maintainer "Mario Lang" . "mlang@delysid.org") + (:authors ("John Wiegley" . "johnw@gnu.org")) + (:url . "https://elpa.gnu.org/packages/chess.html") + (:commit . "c98602f7b1aa7b74c708008209e698d0886a529c"))]) + (cl-generic + . [(0 3) nil "Forward cl-generic compatibility for Emacs<25" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/cl-generic.html") + (:commit . "d90985eee35afd48b96aa8f14e0d0c8a67ce62c9"))]) + (cl-lib + . [(0 7 1) nil "Forward cl-lib compatibility library for Emacs<24.3" + tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/cl-lib.html") + (:commit . "80dc6223f2e25db1f4b38d5c48365553abd793fc"))]) + (clipboard-collector + . [(0 3) ((emacs (25))) + "Collect clipboard entries according to regex rules" tar + ((:url . "https://github.com/clemera/clipboard-collector") + (:keywords "convenience") + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:authors ("Clemens Radermacher" . "clemera@posteo.net")) + (:commit . "ee4a0ee506c47666714cd61649334936d67e5a43"))]) + (cobol-mode + . [(1 1) ((cl-lib (0 5))) "Mode for editing COBOL code" tar + ((:keywords "languages") + (:maintainer "Edward Hart" . "edward.dan.hart@gmail.com") + (:authors ("Edward Hart" . "edward.dan.hart@gmail.com")) + (:url . "https://elpa.gnu.org/packages/cobol-mode.html") + (:commit . "bd7879daa71908616277688ba51d27b60c88b0a2"))]) + (code-cells + . [(0 5) ((emacs (27 1)) (compat (29 1))) + "Lightweight notebooks with support for ipynb files" tar + ((:url . "https://github.com/astoff/code-cells.el") + (:keywords "convenience" "outlines") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "caffb420be106cebbdfe4474ed0507a601603f83"))]) + (colorful-mode + . [(1 2 5) ((emacs (28 1)) (compat (30 1 0 0))) + "Preview any color in your buffer in real time" tar + ((:url . "https://github.com/DevelopmentCool2449/colorful-mode") + (:keywords "faces" "tools" "matching" "convenience") + (:maintainer ("Jen-Chieh" . "jcs090218@gmail.com") + ("Elias G. Perez" . "eg642616@gmail.com")) + (:authors ("Elias G. Perez" . "eg642616@gmail.com")) + (:commit . "484d1b8e7c3e98ef7ccf99eddfcea2e30f5c63a2"))]) + (comint-mime + . [(0 7) ((emacs (28 1)) (compat (29 1)) (mathjax (0 1))) + "Display content of various MIME types in comint buffers" tar + ((:url . "https://github.com/astoff/comint-mime") + (:keywords "processes" "multimedia") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "5e7b609a4f8c4ba8ec6d1d994c01143b79b93c33"))]) + (compact-docstrings + . [(0 2) nil "Shrink blank lines in docstrings and doc comments" tar + ((:url . "https://github.com/cpitclaudel/compact-docstrings") + (:keywords "convenience" "faces" "lisp" "maint" "c") + (:maintainer "Clément Pit-Claudel" + . "clement.pitclaudel@live.com") + (:authors + ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) + (:commit . "50b9ec928193f339c3c2ae20f088ea62cc82bb9d"))]) + (company + . [(1 0 2) ((emacs (25 1))) "Modular text completion framework" tar + ((:url . "http://company-mode.github.io/") + (:keywords "abbrev" "convenience" "matching") + (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev") + (:commit . "393940f76aec1f2500441d4e0b97f783acbb536b"))]) + (company-ebdb + . [(1 1) ((company (0 9 4)) (ebdb (0 2))) + "company-mode completion backend for EBDB in message-mode" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors ("Jan Tatarik" . "jan.tatarik@gmail.com")) + (:url . "https://elpa.gnu.org/packages/company-ebdb.html") + (:commit . "f4b8ad408a068f2c3d07782cb111db4d62fd69d8"))]) + (company-math + . [(1 5 1) ((company (0 8 0)) (math-symbol-lists (1 3))) + "Completion backends for unicode math symbols and latex tags" tar + ((:url . "https://github.com/vspinu/company-math") + (:keywords "unicode" "symbols" "completion") + (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") + (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) + (:commit . "3eb006874e309ff4076d947fcbd61bb6806aa508"))]) + (company-statistics + . [(0 2 3) ((emacs (24 3)) (company (0 8 5))) + "Sort candidates using completion history" tar + ((:url . "https://github.com/company-mode/company-statistics") + (:keywords "abbrev" "convenience" "matching") + (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") + (:authors ("Ingo Lohmar" . "i.lohmar@gmail.com")) + (:commit . "e62157d43b2c874d2edbd547c3bdfb05d0a7ae5c"))]) + (compat + . [(30 1 0 1) ((emacs (24 4)) (seq (2 23))) + "Emacs Lisp Compatibility Library" tar + ((:url . "https://github.com/emacs-compat/compat") + (:keywords "lisp" "maint") + (:maintainer "Compat Development" + . "~pkal/compat-devel@lists.sr.ht") + (:authors ("Philip Kaludercic" . "philipk@posteo.net") + ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "cccd41f549fa88031a32deb26253b462021d7e12"))]) + (cond-star + . [(1 0) ((emacs (24 3))) "Extended form of `cond' construct" tar + ((:maintainer "Richard Stallman" . "rms@gnu.org") + (:url . "https://elpa.gnu.org/packages/cond-star.html") + (:commit . "4719df9f42c157e2683ac641883cff5efaa480bc"))]) + (constants + . [(2 11 1) ((emacs (24 1))) + "Enter definition of constants into source code" tar + ((:url . "https://github.com/cdominik/constants-for-Emacs") + (:keywords "programming" "languages") + (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com") + (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) + (:commit . "f07e221d4d5597c7ccf4b0003c0909a88bdfcc9e"))]) + (consult + . [(3 1) ((emacs (29 1)) (compat (30))) "Consulting completing-read" + tar + ((:url . "https://github.com/minad/consult") + (:keywords "matching" "files" "completion") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:commit . "d0370320d9fdde5ac6e0a27720f51138315af882"))]) + (consult-denote + . [(0 4 2) ((emacs (28 1)) (denote (4 0 0)) (consult (2 2))) + "Use Consult in tandem with Denote" tar + ((:url . "https://github.com/protesilaos/consult-denote") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "122760ac3503f141625a2b3513d60c06c27cf84f"))]) + (consult-hoogle + . [(0 5 0) ((emacs (27 1)) (consult (2 0))) + "Hoogle frontend using consult" tar + ((:url . "https://codeberg.org/rahguzar/consult-hoogle") + (:keywords "docs" "languages") + (:maintainer "rahguzar" . "rahguzar@mailbox.org") + (:authors ("rahguzar" . "rahguzar@mailbox.org")) + (:commit . "384959016022d071464dc6e611e4fcded562834e"))]) + (consult-recoll + . [(1 0 0) ((emacs (26 1)) (consult (2 0))) + "Recoll queries using consult" tar + ((:url . "https://codeberg.org/jao/consult-recoll") + (:keywords "docs" "convenience") + (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") + (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) + (:commit . "eddbc7ba70439881e4781fa73fb0fb240e02fd3b"))]) + (context-coloring + . [(8 1 0) ((emacs (24 3))) "Highlight by scope" tar + ((:url . "https://github.com/jacksonrayhamilton/context-coloring") + (:keywords "convenience" "faces" "tools") + (:maintainer "Jackson Ray Hamilton" + . "jackson@jacksonrayhamilton.com") + (:authors + ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) + (:commit . "1b30a28857727202d1f6a027f83ad66151fb1e92"))]) + (corfu + . [(2 6) ((emacs (29 1)) (compat (30))) + "COmpletion in Region FUnction" tar + ((:url . "https://github.com/minad/corfu") + (:keywords "abbrev" "convenience" "matching" "completion" "text") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "81af89b43aceb5714fcd21daabcfd4b77008e22e"))]) + (coterm + . [(1 6) ((emacs (26 1)) (compat (28 1 2 0))) + "Terminal emulation for comint" tar + ((:url . "https://repo.or.cz/emacs-coterm.git") + (:keywords "processes") + (:maintainer "jakanakaevangeli" . "jakanakaevangeli@chiru.no") + (:authors ("jakanakaevangeli" . "jakanakaevangeli@chiru.no")) + (:commit . "d8e1b04cd359d9f27ab7c6dbf8cae90dde834085"))]) + (counsel + . [(0 15 1) ((emacs (24 5)) (ivy (0 15 1)) (swiper (0 15 1))) + "Various completion functions using Ivy" tar + ((:url . "https://github.com/abo-abo/swiper") + (:keywords "convenience" "matching" "tools") + (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:commit . "72f47d4d1e6dcf89d59f5af65f365dd704efe9e5"))]) + (cpio-mode + . [(0 17) nil "Handle cpio archives in the style of dired." tar + ((:keywords "files") + (:maintainer "Douglas Lewan" . "d.lewan2000@gmail.com") + (:authors ("Douglas Lewan" . "d.lewan2000@gmail.com")) + (:url . "https://elpa.gnu.org/packages/cpio-mode.html") + (:commit . "ce1183f52fa0cfc50145553804615e23d7d73046"))]) + (cpupower + . [(1 0 5) nil "cpupower command interface" tar + ((:url . "https://gitlab.com/steve-emacs-stuff/cpupower-el") + (:keywords "hardware" "cpupower" "cpu" "frequency-scaling") + (:maintainer "Stephen Meister" . "pallagun@gmail.com") + (:authors ("Stephen Meister" . "pallagun@gmail.com")) + (:commit . "fa979dfafa1beb374bf42e937f0b5b99ed06222e"))]) + (crdt + . [(0 3 5) nil + "Collaborative editing using Conflict-free Replicated Data Types" + tar + ((:url . "https://code.librehq.com/qhong/crdt.el") + (:keywords "collaboration" "crdt") + (:maintainer "Qiantan Hong" . "qhong@alum.mit.edu") + (:authors ("Qiantan Hong" . "qhong@alum.mit.edu")) + (:commit . "e6d42f42c5dedb73560048f4bf6263c63ffa21bb"))]) + (crisp + . [(1 3 6) nil "CRiSP/Brief Emacs emulator" tar + ((:keywords "emulations" "brief" "crisp") + (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com") + (:authors ("Gary D. Foster" . "Gary.Foster@Corp.Sun.COM")) + (:url . "https://elpa.gnu.org/packages/crisp.html") + (:commit . "810f057c640043ca9e419248b73f43d82b1a47a0"))]) + (csharp-mode + . [(2 0 0) ((emacs (26 1))) "C# mode derived mode" tar + ((:url . "https://github.com/emacs-csharp/csharp-mode") + (:keywords "c#" "languages" "oop" "mode") + (:maintainer ("Jostein Kjønigsen" . "jostein@gmail.com") + ("Theodor Thornhill" . "theo@thornhill.no")) + (:authors ("Theodor Thornhill" . "theo@thornhill.no")) + (:commit . "02c61c219b2c22491eff9b7315fed661fab423d4"))]) + (csv-mode + . [(1 27) ((emacs (27 1)) (cl-lib (0 5))) + "Major mode for editing comma/char separated values" tar + ((:keywords "convenience") + (:maintainer nil . "emacs-devel@gnu.org") + (:authors ("Francis J. Wright" . "F.J.Wright@qmul.ac.uk")) + (:url . "https://elpa.gnu.org/packages/csv-mode.html") + (:commit . "a16e9d8b0952de1badf6da8e652b178a7f6c4498"))]) + (cursor-undo + . [(1 1 5) nil "Undo Cursor Movement" tar + ((:keywords "undo" "cursor") + (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com") + (:authors ("Luke Lee" . "luke.yx.lee@gmail.com")) + (:url . "https://elpa.gnu.org/packages/cursor-undo.html") + (:commit . "e82084c3d491ff7199e14cc8da69c250b9bda492"))]) + (cursory + . [(1 2 0) ((emacs (29 1))) "Manage cursor styles using presets" tar + ((:url . "https://github.com/protesilaos/cursory") + (:keywords "convenience" "cursor") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "892c3b81037ece0e1753ab058e3cfda93f985693"))]) + (cycle-quotes + . [(0 1) nil "Cycle between quote styles" tar + ((:keywords "convenience") + (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com") + (:authors ("Simen Heggestøyl" . "simenheg@gmail.com")) + (:url . "https://elpa.gnu.org/packages/cycle-quotes.html") + (:commit . "836b19b39651419876e65cdb1a91e3eef83cc4e7"))]) + (dape + . [(0 25 0) ((emacs (29 1)) (jsonrpc (1 0 25))) + "Debug Adapter Protocol for Emacs" tar + ((:url . "https://github.com/svaante/dape") + (:maintainer "Daniel Pettersson" . "daniel@dpettersson.net") + (:commit . "41bfe422cc715f99b83b8a18b556de90005ccad1"))]) + (darkroom + . [(0 3) ((cl-lib (0 5))) + "Remove visual distractions and focus on writing" tar + ((:keywords "convenience" "emulations") + (:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors ("João Távora" . "joaotavora@gmail.com")) + (:url . "https://elpa.gnu.org/packages/darkroom.html") + (:commit . "4496945487130ae1123a9f17b40674ec24c54e8f"))]) + (dash + . [(2 20 0) ((emacs (24))) "A modern list library for Emacs" tar + ((:url . "https://github.com/magnars/dash.el") + (:keywords "extensions" "lisp") + (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") + (:authors ("Magnar Sveen" . "magnars@gmail.com")) + (:commit . "fcb5d831fc08a43f984242c7509870f30983c27c"))]) + (dbus-codegen + . [(0 1) ((cl-lib (0 5))) "Lisp code generation for D-Bus." tar + ((:keywords "comm" "dbus" "convenience") + (:maintainer nil . "emacs-devel@gnu.org") + (:authors ("Daiki Ueno" . "ueno@gnu.org")) + (:url . "https://elpa.gnu.org/packages/dbus-codegen.html") + (:commit . "4b0d8525943ebba797e1ebaf97fd9a608aef5ec1"))]) + (debbugs + . [(0 46) ((emacs (26 1)) (soap-client (3 1 5))) + "SOAP library to access debbugs servers" tar + ((:keywords "comm" "hypermedia") + (:maintainer "Michael Albinus" . "michael.albinus@gmx.de") + (:authors ("Michael Albinus" . "michael.albinus@gmx.de")) + (:url . "https://elpa.gnu.org/packages/debbugs.html") + (:commit . "b5d8fad4ac9481589294a2c4c2d392c33eb5bae2"))]) + (delight + . [(1 7) ((cl-lib (0 5)) (nadvice (0 3))) + "A dimmer switch for your lighter text" tar + ((:url . "https://savannah.nongnu.org/projects/delight") + (:keywords "convenience") + (:maintainer "Phil Sainty" . "psainty@orcon.net.nz") + (:authors ("Phil Sainty" . "psainty@orcon.net.nz")) + (:commit . "a763ec1e5c2987efea3ce2ee6d9c979f56ab6528"))]) + (denote + . [(4 1 3) ((emacs (28 1))) + "Simple notes with an efficient file-naming scheme" tar + ((:url . "https://github.com/protesilaos/denote") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "d86cb704260f9e4815d863eb4059514f4e587577"))]) + (denote-journal + . [(0 2 2) ((emacs (28 1)) (denote (4 0 0))) + "Convenience functions for daily journaling with Denote" tar + ((:url . "https://github.com/protesilaos/denote-journal") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "fdeacaa134e9de29a1888ad23d754b4ada3d8247"))]) + (denote-markdown + . [(0 2 1) ((emacs (28 1)) (denote (4 0 0))) + "Extensions that better integrate Denote with Markdown" tar + ((:url . "https://github.com/protesilaos/denote-markdown") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "a7d7e1c1dd609abec2a8bdd0197782f62885d95b"))]) + (denote-menu + . [(1 4 0) ((emacs (28 1)) (denote (3 0 0))) + "View denote files in a tabulated list." tar + ((:url . "https://github.com/namilus/denote-menu") + (:maintainer "Mohamed Suliman" . "sulimanm@tcd.ie") + (:authors ("Mohamed Suliman" . "sulimanm@tcd.ie")) + (:commit . "247a9b66d67b3fe409eda8f896feae87546f5b4d"))]) + (denote-org + . [(0 2 1) ((emacs (28 1)) (denote (4 0 0))) + "Denote extensions for Org mode" tar + ((:url . "https://github.com/protesilaos/denote-org") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "36f24f0f0f472e4cb50025ed62a1b32351d7d294"))]) + (denote-search + . [(1 0 3) ((emacs (29 1)) (denote (3 0))) + "Search the contents of your notes" tar + ((:url . "https://github.com/lmq-10/denote-search") + (:keywords "matching") + (:maintainer "Lucas Quintana" . "lmq10@protonmail.com") + (:authors ("Lucas Quintana" . "lmq10@protonmail.com")) + (:commit . "4df3e77a495b4f0df7fe56924509afe7f2fa735d"))]) + (denote-sequence + . [(0 2 0) ((emacs (28 1)) (denote (4 0 0))) + "Sequence notes or Folgezettel with Denote" tar + ((:url . "https://github.com/protesilaos/denote-sequence") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "22bdb31f20dd49ee13f511b74a9ae7ba5f8c2ade"))]) + (denote-silo + . [(0 2 0) ((emacs (28 1)) (denote (4 0 0))) + "Convenience functions for using Denote in multiple silos" tar + ((:url . "https://github.com/protesilaos/denote-silo") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "5710b3f15e477c1b2f71ddb9c8cf719f9589f1cb"))]) + (detached + . [(0 10 1) ((emacs (27 1))) + "A package to launch, and manage, detached processes" tar + ((:url . "https://sr.ht/~niklaseklund/detached.el/") + (:keywords "convenience" "processes") + (:maintainer "detached.el Development" + . "~niklaseklund/detached.el@lists.sr.ht") + (:authors ("Niklas Eklund" . "niklas.eklund@posteo.net")) + (:commit . "fedb0df5b0fbba13c662107855fb07a922793096"))]) + (devdocs + . [(0 7) ((emacs (27 1)) (compat (30 1))) "Emacs viewer for DevDocs" + tar + ((:url . "https://github.com/astoff/devdocs.el") + (:keywords "help") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "25c746024ddf73570195bf42b841f761a2fee10c"))]) + (devicetree-ts-mode + . [(0 3) ((emacs (29 1))) "Tree-sitter support for DTS" tar + ((:url . "https://sr.ht/~akagi/devicetree-ts-mode") + (:keywords "languages" "devicetree" "tree-sitter") + (:maintainer "Aleksandr Vityazev" . "avityazew@gmail.com") + (:authors ("Aleksandr Vityazev" . "avityazew@gmail.com")) + (:commit . "bc07c1124545cbf6e5ebe64e92bfaa306e309033"))]) + (dicom + . [(1 2) ((emacs (29 1)) (compat (30))) + "DICOM viewer - Digital Imaging & Communications in Medicine" tar + ((:url . "https://github.com/minad/dicom") + (:keywords "multimedia" "hypermedia" "files") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "161d7b6b990cf608f5f71b4a6c840cfa57107d35"))]) + (dict-tree + . [(0 17) ((trie (0 6)) (tNFA (0 1 1)) (heap (0 3)) (emacs (24 1))) + "Dictionary data structure" tar + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "matching" "data structures trie" "tree" + "dictionary" "completion" "regexp") + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:authors ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:commit . "a83ea986982b2d09d150456028a9f1e73658333a"))]) + (diff-hl + . [(1 10 0) ((cl-lib (0 2)) (emacs (25 1))) + "Highlight uncommitted changes using VC" tar + ((:url . "https://github.com/dgutov/diff-hl") + (:keywords "vc" "diff") + (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev") + (:authors ("Dmitry Gutov" . "dmitry@gutov.dev")) + (:commit . "b80ff9b4a772f7ea000e86fbf88175104ddf9557"))]) + (diffview + . [(1 0) nil "View diffs in side-by-side format" single + ((:keywords "convenience" "diff") + (:authors ("Mitchel Humpherys" . "mitch.special@gmail.com")) + (:maintainer "Mitchel Humpherys" . "mitch.special@gmail.com") + (:url . "https://github.com/mgalgs/diffview-mode"))]) + (diminish + . [(0 46) ((emacs (24 3))) + "Diminished modes are minor modes with no modeline display" tar + ((:url . "https://github.com/myrjola/diminish.el") + (:keywords "extensions" "diminish" "minor" "codeprose") + (:maintainer "Martin Yrjölä" . "martin.yrjola@gmail.com") + (:authors ("Will Mengarini" . "seldon@eskimo.com")) + (:commit . "66b3902401059d161424b1b8d0abc3cb0a7d6df0"))]) + (dired-du + . [(0 5 2) ((emacs (24 4)) (cl-lib (0 5))) + "Dired with recursive directory sizes" tar + ((:keywords "files" "unix" "convenience") + (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") + (:authors ("Tino Calancha" . "tino.calancha@gmail.com")) + (:url . "https://elpa.gnu.org/packages/dired-du.html") + (:commit . "c586a6bc255cec88e1027e70319030cb63ecdc4a"))]) + (dired-duplicates + . [(0 4) ((emacs (27 1))) + "Find duplicate files locally and remotely" tar + ((:url . "https://codeberg.org/hjudt/dired-duplicates") + (:keywords "files") + (:maintainer "Harald Judt" . "h.judt@gmx.at") + (:authors ("Harald Judt" . "h.judt@gmx.at")) + (:commit . "5c5f24bea92159987f65f01ef32b261e905997bd"))]) + (dired-git-info + . [(0 3 1) ((emacs (25))) "Show git info in dired" tar + ((:url . "https://github.com/clemera/dired-git-info") + (:keywords "dired" "files") + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:authors ("Clemens Radermacher" . "clemera@posteo.net")) + (:commit . "bd8556eef10e57b175406c117f18e1953422c803"))]) + (dired-preview + . [(0 6 0) ((emacs (28 1))) + "Automatically preview file at point in Dired" tar + ((:url . "https://github.com/protesilaos/dired-preview") + (:keywords "files" "convenience") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "fbb47740cf7f30df29539061e84c6827210d2846"))]) + (disk-usage + . [(1 3 3) ((emacs (26 1))) "Sort and browse disk usage listings" + tar + ((:url . "https://gitlab.com/Ambrevar/emacs-disk-usage") + (:keywords "files" "convenience" "tools") + (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") + (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) + (:commit . "b0fb8af34291a49b041eab8b5570e7bc8433a8d8"))]) + (dismal + . [(1 5 2) ((cl-lib (0))) + "Dis Mode Ain't Lotus: Spreadsheet program Emacs" tar + ((:maintainer "UnMaintainer" . "emacs-devel@gnu.org") + (:authors (nil . "fox@cs.nyu.edu") (nil . "ritter@cs.cmu.edu")) + (:url . "https://elpa.gnu.org/packages/dismal.html") + (:commit . "670c0001026ff437d14545aeed3ef5745f0a53d2"))]) + (djvu + . [(1 1 2) nil "Edit and view Djvu files via djvused" tar + ((:keywords "files" "wp") + (:maintainer "Roland Winkler" . "winkler@gnu.org") + (:authors ("Roland Winkler" . "winkler@gnu.org")) + (:url . "https://elpa.gnu.org/packages/djvu.html") + (:commit . "071c8ab168588897475899c46eaa16e70141db8c"))]) + (do-at-point + . [(0 1 2) ((emacs (26 1))) + "Generic context-sensitive action dispatcher." tar + ((:url . "https://git.sr.ht/~pkal/do-at-point") + (:keywords "convenience") + (:maintainer "Philip Kaludercic" + . "~pkal/public-inbox@lists.sr.ht") + (:authors ("Philip Kaludercic" . "philipk@posteo.net")) + (:commit . "da0742df74cbb36347aefd5dcb17d674ee4846d3"))]) + (doc-toc + . [(1 2) ((emacs (26 1))) + "Manage outlines/table of contents of pdf and djvu documents" tar + ((:url . "https://github.com/dalanicolai/doc-tools-toc") + (:keywords "tools" "outlines" "convenience") + (:maintainer "Daniel Laurens Nicolai" . "dalanicolai@gmail.com") + (:authors ("Daniel Laurens Nicolai" . "dalanicolai@gmail.com")) + (:commit . "4a179fbacd7bc9efbd6cfcdc8772d42935e6de29"))]) + (doc-view-follow + . [(0 3 2) ((emacs (29 1))) + "Synchronize windows showing the same document" tar + ((:url . "https://github.com/ultronozm/doc-view-follow.el") + (:keywords "convenience") + (:maintainer "Paul D. Nelson" . "ultrono@gmail.com") + (:authors ("Paul D. Nelson" . "ultrono@gmail.com")) + (:commit . "0393bfc9cdbec698201c9c69c247b201558f8511"))]) + (docbook + . [(0 1) nil "Info-like viewer for DocBook" tar + ((:keywords "docs" "help") + (:maintainer "Chong Yidong" . "cyd@gnu.org") + (:authors ("Chong Yidong" . "cyd@gnu.org")) + (:url . "https://elpa.gnu.org/packages/docbook.html") + (:commit . "a59f87c0dc04bcfcf9f55a124658c2e7a585dbd2"))]) + (doric-themes + . [(0 5 0) ((emacs (29 1))) + "Highly legible minimalist themes with precise typography" tar + ((:url . "https://github.com/protesilaos/doric-themes") + (:keywords "faces" "theme" "accessibility") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "1455871b4fc20b9b4e579681c339f05aa3e9e150"))]) + (drepl + . [(0 4) ((emacs (29 1)) (comint-mime (0 7))) + "REPL protocol for the dumb terminal" tar + ((:url . "https://github.com/astoff/drepl") + (:keywords "languages" "processes") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "949cc68612d9427e482d12c2b344a61082f25949"))]) + (dts-mode + . [(1 0) ((emacs (24))) "Major mode for Device Tree source files" + tar + ((:keywords "languages") + (:maintainer "Ben Gamari" . "ben@smart-cactus.org") + (:authors ("Ben Gamari" . "ben@smart-cactus.org")) + (:url . "https://elpa.gnu.org/packages/dts-mode.html") + (:commit . "8413d2dc9b3347831aa9e8c8b2524af3ef005441"))]) + (easy-escape + . [(0 2 1) nil + "Improve readability of escape characters in regular expressions" + tar + ((:url . "https://github.com/cpitclaudel/easy-escape") + (:keywords "convenience" "lisp" "tools") + (:maintainer "Clément Pit-Claudel" + . "clement.pitclaudel@live.com") + (:authors + ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) + (:commit . "938497a21e65ba6b3ff8ec90e93a6d0ab18dc9b4"))]) + (easy-kill + . [(0 9 5) ((emacs (25)) (cl-lib (0 5))) "kill & mark things easily" + tar + ((:url . "https://github.com/leoliu/easy-kill") + (:keywords "killing" "convenience") + (:maintainer "Leo Liu" . "sdl.web@gmail.com") + (:authors ("Leo Liu" . "sdl.web@gmail.com")) + (:commit . "f155d19c528e27f8f6c72f0d75f652edbdcab37f"))]) + (ebdb + . [(0 8 22) ((emacs (25 1)) (seq (2 15))) + "Contact management package" tar + ((:url . "https://github.com/girzel/ebdb") + (:keywords "convenience" "mail") + (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:commit . "b96e5470c54503eab2159e69c822648ad55e6915"))]) + (ebdb-gnorb + . [(1 0 2) ((gnorb (1 1 0)) (ebdb (0 2))) + "Utilities for connecting EBDB to Gnorb" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:url . "https://elpa.gnu.org/packages/ebdb-gnorb.html") + (:commit . "461a6b35dc9322d1ec59547ad845d26a6c65a698"))]) + (ebdb-i18n-chn + . [(1 3 2) ((pyim (1 6 0)) (ebdb (0 6 17))) + "China-specific internationalization support for EBDB" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:url . "https://elpa.gnu.org/packages/ebdb-i18n-chn.html") + (:commit . "b8c1f7c21204bda9c130ce21a75d69358d1bc49a"))]) + (ediprolog + . [(2 3) nil "Emacs Does Interactive Prolog" tar + ((:url . "https://www.metalevel.at/ediprolog/") + (:keywords "languages" "processes") + (:maintainer "Markus Triska" . "triska@metalevel.at") + (:authors ("Markus Triska" . "triska@metalevel.at")) + (:commit . "ea8710335eec483b576c7a800c92b8fd214aa6dd"))]) + (eev + . [(20251219) ((emacs (25 1))) + "Support for e-scripts (eepitch blocks, elisp hyperlinks, etc)" + tar + ((:url . "http://anggtwu.net/#eev") + (:keywords "lisp" "e-scripts") + (:maintainer "Eduardo Ochs" . "eduardoochs@gmail.com") + (:authors ("Eduardo Ochs" . "eduardoochs@gmail.com")) + (:commit . "84201105b1cb885749650c32bb1e3ce240c4f164"))]) + (ef-themes + . [(2 0 1) ((emacs (28 1)) (modus-themes (5 0 0))) + "Colorful and legible themes" tar + ((:url . "https://github.com/protesilaos/ef-themes") + (:keywords "faces" "theme" "accessibility") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "42d202b6a92841d075b0dd4008a2e94eb2f51764"))]) + (eglot + . [(1 19) + ((emacs (26 3)) (eldoc (1 14 0)) (external-completion (0 1)) + (flymake (1 4 2)) (jsonrpc (1 0 26)) (project (0 9 8)) + (seq (2 23)) (xref (1 6 2))) + "The Emacs Client for LSP servers" tar + ((:url . "https://github.com/joaotavora/eglot") + (:keywords "convenience" "languages") + (:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors ("João Távora" . "joaotavora@gmail.com")) + (:commit . "94a4bf8a39e319004a6cee0d6259adfb207e351b"))]) + (el-job + . [(2 6 1) ((emacs (29 1))) + "Contrived way to call a function using all CPU cores" tar + ((:url . "https://github.com/meedstrom/el-job") + (:keywords "processes") + (:maintainer "Martin Edström" . "meedstrom@runbox.eu") + (:authors ("Martin Edström" . "meedstrom@runbox.eu")) + (:commit . "274f999ceee3db6c48e3550964c547161a3ee1bb"))]) + (el-search + . [(1 12 6 1) ((emacs (25)) (stream (2 2 4)) (cl-print (1 0))) + "Expression based interactive search for Emacs Lisp" tar + ((:keywords "lisp") + (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") + (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) + (:url . "https://elpa.gnu.org/packages/el-search.html") + (:commit . "43779b910025aba2574213cf3eabee2132c0a175"))]) + (eldoc + . [(1 16 0) ((emacs (26 3))) + "Show function arglist or variable docstring in echo area" tar + ((:keywords "extensions") + (:maintainer "Noah Friedman" . "friedman@splode.com") + (:authors ("Noah Friedman" . "friedman@splode.com")) + (:url . "https://elpa.gnu.org/packages/eldoc.html") + (:commit . "b85d9048f4a32c7c50894e991423d021d9f95317"))]) + (electric-spacing + . [(5 0) nil "Insert operators with surrounding spaces smartly" tar + ((:maintainer "William Xu" . "william.xwl@gmail.com") + (:authors ("William Xu" . "william.xwl@gmail.com")) + (:url . "https://elpa.gnu.org/packages/electric-spacing.html") + (:commit . "122ac5d08c3d3d91251752136abab9721d90e36c"))]) + (elisa + . [(1 1 7) + ((emacs (29 2)) (ellama (0 11 2)) (llm (0 18 1)) (async (1 9 8)) + (plz (0 9))) + "Emacs Lisp Information System Assistant" tar + ((:url . "http://github.com/s-kostyaev/elisa") + (:keywords "help" "local" "tools") + (:maintainer "Sergey Kostyaev" . "sskostyaev@gmail.com") + (:authors ("Sergey Kostyaev" . "sskostyaev@gmail.com")) + (:commit . "b655b59d371639d357dcabe48f1c2cd1694ee8de"))]) + (elisp-benchmarks + . [(1 16) nil "elisp benchmarks collection" tar + ((:keywords "languages" "lisp") + (:maintainer "Andrea Corallo" . "acorallo@gnu.org") + (:authors ("Andrea Corallo" . "acorallo@gnu.org")) + (:url . "https://elpa.gnu.org/packages/elisp-benchmarks.html") + (:commit . "1a3d97954957a95a179806e0d49ca6d178b097af"))]) + (ellama + . [(1 9 1) + ((emacs (28 1)) (llm (0 24 0)) (plz (0 8)) (transient (0 7)) + (compat (29 1))) + "Tool for interacting with LLMs" tar + ((:url . "http://github.com/s-kostyaev/ellama") + (:keywords "help" "local" "tools") + (:maintainer "Sergey Kostyaev" . "sskostyaev@gmail.com") + (:authors ("Sergey Kostyaev" . "sskostyaev@gmail.com")) + (:commit . "dfda86230dd312ad259eb4b7b1264546f0a02810"))]) + (emacs-gc-stats + . [(1 4 2) ((emacs (25 1))) "Collect Emacs GC statistics" tar + ((:url . "https://git.sr.ht/~yantar92/emacs-gc-stats") + (:maintainer "Ihor Radchenko" . "yantar92@posteo.net") + (:authors ("Ihor Radchenko" . "yantar92@posteo.net")) + (:commit . "05d669e123f411c9582f99a9a6182efa43d01a6b"))]) + (embark + . [(1 1) ((emacs (27 1)) (compat (29 1 4 0))) + "Conveniently act on minibuffer completions" tar + ((:url . "https://github.com/oantolin/embark") + (:keywords "convenience") + (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") + (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) + (:commit . "195add1f1ccd1059472c9df7334c97c4d155425e"))]) + (embark-consult + . [(1 1) + ((emacs (27 1)) (compat (29 1 4 0)) (embark (1 0)) + (consult (1 0))) + "Consult integration for Embark" tar + ((:url . "https://github.com/oantolin/embark") + (:keywords "convenience") + (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") + (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) + (:commit . "195add1f1ccd1059472c9df7334c97c4d155425e"))]) + (ement + . [(0 17) + ((emacs (27 1)) (map (2 1)) (persist (0 5)) (plz (0 6)) + (taxy (0 10)) (taxy-magit-section (0 13)) (svg-lib (0 2 5)) + (transient (0 3 7))) + "Matrix client" tar + ((:url . "https://github.com/alphapapa/ement.el") + (:keywords "comm") + (:maintainer "Adam Porter" . "adam@alphapapa.net") + (:authors ("Adam Porter" . "adam@alphapapa.net")) + (:commit . "ca3b0e7da1626e692df14c56e105dc91480ef814"))]) + (emms + . [(24) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) + "The Emacs Multimedia System" tar + ((:url . "https://www.gnu.org/software/emms/") + (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" + "multimedia") + (:maintainer "Yoni Rabkin" . "yrk@gnu.org") + (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) + (:commit . "53db2bf1f0475c9404f56d67ab75edf1fdf18dfe"))]) + (engrave-faces + . [(0 3 1) ((emacs (27 1))) + "Convert font-lock faces to other formats" tar + ((:url . "https://github.com/tecosaur/engrave-faces") + (:keywords "faces") (:maintainer "TEC" . "tec@tecosaur.com") + (:authors ("TEC" . "https://github/tecosaur")) + (:commit . "fe29d9b593a0f7ada4df3f52dfb9f7f8c1bdaaa7"))]) + (enwc + . [(2 0) ((emacs (25 1))) "The Emacs Network Client" tar + ((:url . "https://savannah.nongnu.org/p/enwc") + (:keywords "external" "network" "wicd" "manager" "nm") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors ("Ian Dunn" . "dunni@gnu.org")) + (:commit . "9893d7f17a2ee7f83587c305c256bd1300995125"))]) + (epoch-view + . [(0 0 1) nil "Minor mode to visualize epoch timestamps" single + ((:url . "http://elpa.gnu.org/packages/epoch-view.html") + (:keywords "data" "timestamp" "epoch" "unix") + (:authors ("Ted Zlatanov" . "tzz@lifelogs.com")) + (:maintainer "Ted Zlatanov" . "tzz@lifelogs.com"))]) + (erc + . [(5 6 1) ((emacs (27 1)) (compat (29 1 4 5))) + "An Emacs Internet Relay Chat client" tar + ((:url . "https://www.gnu.org/software/emacs/erc.html") + (:keywords "irc" "chat" "client" "internet") + (:maintainer ("Amin Bandali" . "bandali@gnu.org") + ("F. Jason Park" . "jp@neverwas.me")) + (:authors ("Alexander L. Belikoff" . "alexander@belikoff.net")) + (:commit . "1b5fef63b483fba9908543da39365bd522ad6e4a"))]) + (ergoemacs-mode + . [(5 16 10 12) ((emacs (24 1)) (undo-tree (0 6 5)) (cl-lib (0 5))) + "Emacs mode based on common modern interface and ergonomics." tar + ((:url . "https://github.com/ergoemacs/ergoemacs-mode") + (:keywords "convenience") + (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") + (:authors ("Xah Lee" . "xah@xahlee.org") + ("David Capello" . "davidcapello@gmail.com") + ("Matthew L. Fidler" . "matthew.fidler@gmail.com")) + (:commit . "ac70b2563fb6e3d69ea382fddc87b5721c20c292"))]) + (ess + . [(25 1 0) ((emacs (25 1))) "Emacs Speaks Statistics" tar + ((:url . "https://ess.r-project.org/") + (:maintainer "ESS Core Team" . "ESS-core@r-project.org") + (: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")) + (:commit . "78f4db2879d00e21b71261f0a6e512504837ab9b"))]) + (excorporate + . [(1 1 3) + ((fsm (0 2 1)) (soap-client (3 2 0)) (url-http-ntlm (2 0 6)) + (url-http-oauth (0 8 4))) + "Exchange Web Services (EWS) integration" tar + ((:url . "https://www.fitzsim.org/blog/") (:keywords "calendar") + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) + (:commit . "d0dc6a28a0b39b67b01c63163217f8ebd055df4d"))]) + (expand-region + . [(1 0 0) ((emacs (24 4))) + "Increase selected region by semantic units." tar + ((:url . "https://github.com/magnars/expand-region.el") + (:keywords "marking" "region") + (:maintainer "Magnar Sveen" . "magnars@gmail.com") + (:authors ("Magnar Sveen" . "magnars@gmail.com")) + (:commit . "9e3f86c02c5e2ab6f0d95da8a34045b54f6166d1"))]) + (expreg + . [(1 4 1) ((emacs (29 1))) "Simple expand region" tar + ((:url . "https://github.com/casouri/expreg") + (:keywords "text" "editing") + (:maintainer "Yuan Fu" . "casouri@gmail.com") + (:authors ("Yuan Fu" . "casouri@gmail.com")) + (:commit . "b1dc64aef8ed8498a6d21e5e78ce7e0bda8407e0"))]) + (external-completion + . [(0 1) nil "Let external tools control completion style" tar + ((:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/external-completion.html") + (:commit . "4bc9c8972ac0a3dfa237a9c5704de89ef24ad82b"))]) + (exwm + . [(0 34) ((emacs (27 1)) (xelb (0 20)) (compat (30))) + "Emacs X Window Manager" tar + ((:url . "https://github.com/emacs-exwm/exwm") (:keywords "unix") + (:maintainer + ("Adrián Medraño Calvo" . "adrian@medranocalvo.com") + ("Steven Allen" . "steven@stebalien.com") + ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:authors ("Chris Feng" . "chris.w.feng@gmail.com")) + (:commit . "254fa6c43f2e2c29f87dcac404a054a393a6a0ea"))]) + (f90-interface-browser + . [(1 1) nil "Parse and browse f90 interfaces" single + ((:authors ("Lawrence Mitchell" . "wence@gmx.li")) + (:maintainer "Lawrence Mitchell" . "wence@gmx.li") + (:url . "http://github.com/wence-/f90-iface/"))]) + (filechooser + . [(0 2 4) ((emacs (28 1)) (compat (29 1))) + "An xdg-desktop-portal filechooser" tar + ((:url . "https://codeberg.org/rahguzar/filechooser") + (:keywords "convenience" "files" "tools" "unix") + (:maintainer "rahguzar" . "rahguzar@mailbox.org") + (:authors ("rahguzar" . "rahguzar@mailbox.org")) + (:commit . "e55c5ea294bbb2c67ab5c51d9489922a83c22456"))]) + (filladapt + . [(2 12 2) ((emacs (24 4))) "Adaptive fill" tar + ((:maintainer nil . "emacs-devel@gnu.org") + (:authors ("Kyle E. Jones" . "kyle_jones@wonderworks.com")) + (:url . "https://elpa.gnu.org/packages/filladapt.html") + (:commit . "6cce6acc6350541efe6b1064335b480e820fd325"))]) + (firefox-javascript-repl + . [(0 9 5) ((emacs (26 1))) "Jack into Firefox" tar + ((:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) + (:url + . "https://elpa.gnu.org/packages/firefox-javascript-repl.html") + (:commit . "fee99c20f1f4684ed845eeac9eda46fcde6bf1e9"))]) + (flylisp + . [(0 2) nil + "Color unbalanced parentheses and parentheses inconsistent with indentation" + tar + ((:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com") + (:authors ("Barry O'Reilly" . "gundaetiapo@gmail.com")) + (:url . "https://elpa.gnu.org/packages/flylisp.html") + (:commit . "20fe3e77bb73773c8678e65ae38020b0b7f996eb"))]) + (flymake + . [(1 4 3) ((emacs (26 1)) (eldoc (1 14 0)) (project (0 11 1))) + "A universal on-the-fly syntax checker" tar + ((:keywords "c" "languages" "tools") + (:maintainer "Spencer Baugh" . "sbaugh@janestreet.com") + (:authors ("Pavel Kobyakov" . "pk_at_work@yahoo.com")) + (:url . "https://elpa.gnu.org/packages/flymake.html") + (:commit . "683e7462df3d5b17e7da8956302069415bba6998"))]) + (flymake-clippy + . [(1 1 0) ((emacs (27))) "Flymake backend for Clippy" tar + ((:url . "https://github.com/mak-kirkland/flymake-clippy") + (:keywords "languages" "tools") + (:maintainer "Michael Kirkland" . "mak.kirkland@proton.me") + (:authors ("Michael Kirkland" . "mak.kirkland@proton.me")) + (:commit . "38aeda6a8f4090b00f3c7fdb5188f80e04c556de"))]) + (flymake-codespell + . [(0 1) ((emacs (26 1)) (compat (29 1 4 2))) + "Flymake backend for codespell" tar + ((:url . "https://www.github.com/skangas/flymake-codespell") + (:keywords "extensions") + (:maintainer "Stefan Kangas" . "stefankangas@gmail.com") + (:authors ("Stefan Kangas" . "stefankangas@gmail.com")) + (:commit . "d72e3ad4cdfd5cea1509a241d55e18f54ae2aeca"))]) + (flymake-proselint + . [(0 3 0) ((emacs (26 1))) "Flymake backend for proselint" tar + ((:url . "https://git.sr.ht/~manuel-uberti/flycheck-proselint") + (:keywords "convenience") + (:maintainer "Manuel Uberti" + . "~manuel-uberti/flymake-proselint@lists.sr.ht") + (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) + (:commit . "9c68ee881f18f554f0ab5bbf5bee1a4b753d792b"))]) + (fontaine + . [(3 0 1) ((emacs (29 1))) "Set font configurations using presets" + tar + ((:url . "https://github.com/protesilaos/fontaine") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "34d8b04bef350b270f52dc4defc9bac3e9617bf0"))]) + (frame-tabs + . [(1 1) nil "show buffer tabs in side window" tar + ((:keywords "frames" "tabs") + (:maintainer "Martin Rudalics" . "rudalics@gmx.at") + (:authors ("Martin Rudalics" . "rudalics@gmx.at")) + (:url . "https://elpa.gnu.org/packages/frame-tabs.html") + (:commit . "2142034967085642823f7f60f9a3e4f09ada089e"))]) + (frog-menu + . [(0 2 11) ((emacs (26)) (avy (0 4)) (posframe (0 4))) + "Quickly pick items from ad hoc menus" tar + ((:url . "https://github.com/clemera/frog-menu") + (:keywords "convenience") + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:authors ("Clemens Radermacher" . "clemera@posteo.net")) + (:commit . "3d99c10eb472b5f7fe761bb3f329fe10971ea903"))]) + (fsm + . [(0 2 1) ((emacs (24 1)) (cl-lib (0 5))) "state machine library" + tar + ((:keywords "extensions") + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) + (:url . "https://elpa.gnu.org/packages/fsm.html") + (:commit . "3acbc4df9b13d234ca1e297d85be27c54e81799e"))]) + (ftable + . [(1 1) ((emacs (26 0))) "Fill a table to fit in n columns" tar + ((:url . "https://github.com/casouri/ftable") + (:keywords "convenience" "text" "table") + (:maintainer "Yuan Fu" . "casouri@gmail.com") + (:authors ("Yuan Fu" . "casouri@gmail.com")) + (:commit . "d7c243ac3be2a67986f53f3dc31ba1426e82b771"))]) + (gcmh + . [(0 2 1) ((emacs (24))) "the Garbage Collector Magic Hack" tar + ((:url . "https://gitlab.com/koral/gcmh") (:keywords "internal") + (:maintainer nil . "akrl@sdf.org") + (:authors ("Andrea Corallo" . "akrl@sdf.org")) + (:commit . "0089f9c3a6d4e9a310d0791cf6fa8f35642ecfd9"))]) + (ggtags + . [(0 9 0) ((emacs (25))) + "emacs frontend to GNU Global source code tagging system" tar + ((:url . "https://github.com/leoliu/ggtags") + (:keywords "tools" "convenience") + (:maintainer "Leo Liu" . "sdl.web@gmail.com") + (:authors ("Leo Liu" . "sdl.web@gmail.com")) + (:commit . "a0809f5241d9accceb161ca40374680799021f04"))]) + (gited + . [(0 6 0) ((emacs (24 4)) (cl-lib (0 5))) + "Operate on Git branches like dired" tar + ((:keywords "git" "vc" "convenience") + (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") + (:authors ("Tino Calancha" . "tino.calancha@gmail.com")) + (:url . "https://elpa.gnu.org/packages/gited.html") + (:commit . "475e29723ad2d5ff08cae5fdaa122ab56e69141b"))]) + (gle-mode + . [(1 1) ((cl-lib (0 5))) + "Major mode to edit Graphics Layout Engine files" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/gle-mode.html") + (:commit . "b633a627bb15f77f7e64df89f82b8f556dcc0a6e"))]) + (gnat-compiler + . [(1 0 3) ((emacs (25 3)) (wisi (4 3 0))) + "Support for running GNAT tools" tar + ((:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org") + (:authors ("Stephen Leake" . "stephen_leake@member.fsf.org")) + (:url . "https://elpa.gnu.org/packages/gnat-compiler.html") + (:commit . "9db5c393ee0f9694e83305ef8b0b1e37f0560111"))]) + (gnome-c-style + . [(0 1) nil "minor mode for editing GNOME-style C source code" tar + ((:maintainer "Daiki Ueno" . "ueno@gnu.org") + (:authors ("Daiki Ueno" . "ueno@gnu.org")) + (:keywords "gnome" "c" "coding style") + (:url . "http://elpa.gnu.org/packages/gnome-c-style.html"))]) + (gnome-dark-style + . [(0 2 3) ((emacs (30 1))) "Sync theme with GNOME color-scheme" tar + ((:url . "https://github.com/dimagid/gnome-dark-style") + (:keywords "themes" "gnome" "sync" "dark" "light" "color-scheme") + (:maintainer "David Dimagid" . "davidimagid@gmail.com") + (:authors ("David Dimagid" . "davidimagid@gmail.com")) + (:commit . "a2e9248ea09776c13966d8181d3f2078e9a1c7ba"))]) + (gnorb + . [(1 6 11) ((cl-lib (0 5))) "Glue code between Gnus, Org, and BBDB" + tar + ((:keywords "mail" "org" "gnus" "bbdb" "todo" "task") + (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:url . "https://elpa.gnu.org/packages/gnorb.html") + (:commit . "409e4fc2c83f8406f362028dbcc3a1fc21182819"))]) + (gnu-elpa + . [(1 1) nil "Advertize GNU ELPA packages" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/gnu-elpa.html") + (:commit . "cd18964ec3176ab99d626da4ca6ca7d4bf2389db"))]) + (gnu-elpa-keyring-update + . [(2025 10 1) nil "Update Emacs's GPG keyring for GNU ELPA" tar + ((:keywords "maint" "tools") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url + . "https://elpa.gnu.org/packages/gnu-elpa-keyring-update.html") + (:commit . "62156e2ec72ca9f79eed3e7275aba38f71808361"))]) + (gnugo + . [(3 1 2) + ((ascii-art-to-unicode (1 5)) (xpm (1 0 1)) (cl-lib (0 5))) + "play GNU Go in a buffer" tar + ((:url . "https://www.gnuvola.org/software/gnugo/") + (:keywords "games" "processes") + (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") + (:authors ("Thien-Thi Nguyen" . "ttn@gnu.org")) + (:commit . "1fd2e8df042f8e51a87173ce36220ee9a8c4241c"))]) + (gnus-mock + . [(0 5) nil "Mock Gnus installation for testing" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:url . "https://elpa.gnu.org/packages/gnus-mock.html") + (:commit . "0ec119ff8ddca61fc0f3e05ac4e895d57cb2ca21"))]) + (gpastel + . [(0 5 0) ((emacs (25 1))) "Integrates GPaste with the kill-ring" + tar + ((:url + . "https://gitlab.petton.fr/DamienCassou/desktop-environment") + (:keywords "tools") + (:maintainer "Damien Cassou" . "damien@cassou.me") + (:authors ("Damien Cassou" . "damien@cassou.me")) + (:commit . "8a5522b274f79d55d7c9a0b2aaf062526f9253c7"))]) + (gpr-mode + . [(1 0 5) ((emacs (25 3)) (wisi (4 3 2)) (gnat-compiler (1 0 3))) + "Major mode for editing GNAT project files" tar + ((:url . "https://stephe-leake.org/ada/wisitoken.html") + (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org") + (:authors ("Stephen Leake" . "stephen_leake@member.fsf.org")) + (:commit . "9ca25ec5ca871f04b4704b39fb3ba129694e02ac"))]) + (gpr-query + . [(1 0 4) ((emacs (25 3)) (wisi (4 3 0)) (gnat-compiler (1 0 3))) + "Minor mode for navigating sources using gpr_query" tar + ((:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org") + (:authors ("Stephen Leake" . "stephen_leake@member.fsf.org")) + (:url . "https://elpa.gnu.org/packages/gpr-query.html") + (:commit . "d50f92fe46828b6b675770dba3004c1ea6ab0b50"))]) + (graphql + . [(0 1 2) ((emacs (25))) "GraphQL utilities" tar + ((:url . "https://github.com/vermiculus/graphql.el") + (:keywords "hypermedia" "tools" "lisp") + (:maintainer "Sean Allred" . "code@seanallred.com") + (:authors ("Sean Allred" . "code@seanallred.com")) + (:commit . "b57b5ca5d2d0837e1fb4a4f30c051d5f3e643f0f"))]) + (greader + . [(0 13 1) ((emacs (26 1)) (seq (2 24)) (compat (29 1 4 5))) + "Gnamù reader, send buffer contents to a speech engine" tar + ((:url . "https://gitlab.com/michelangelo-rodriguez/greader") + (:keywords "tools" "accessibility") + (:maintainer "Michelangelo Rodriguez" + . "michelangelo.rodriguez@gmail.com") + (:authors + ("Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com")) + (:commit . "b25974aeae49f11b91bb78d94ab51913fdfcdc05"))]) + (greenbar + . [(1 2) ((emacs (27 1))) + "Mark comint output with \"greenbar\" background" tar + ((:keywords "faces" "terminals") + (:maintainer "Michael R. Mauger" . "michael@mauger.com") + (:authors ("Michael R. Mauger" . "michael@mauger.com")) + (:url . "https://elpa.gnu.org/packages/greenbar.html") + (:commit . "7b651257bd0536d454f4b896212b3fe1f8c75024"))]) + (gtags-mode + . [(1 9 4) ((emacs (28))) + "GNU Global integration with xref, project and imenu." tar + ((:url . "https://github.com/Ergus/gtags-mode") + (:keywords "xref" "project" "imenu" "gtags" "global") + (:commit . "913da16515242c6ee26fd0f5af1a79b48a2daa29"))]) + (guess-language + . [(0 0 1) ((cl-lib (0 5)) (emacs (24)) (nadvice (0 1))) + "Robust automatic language detection" single + ((:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) + (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") + (:url . "https://github.com/tmalsburg/guess-language.el"))]) + (hcel + . [(1 0 0) ((emacs (28))) + "Haskell codebase explorer / cross referencer" tar + ((:url . "https://g.ypei.me/hc.el.git") (:keywords "haskell") + (:maintainer "Yuchen Pei" . "id@ypei.org") + (:authors ("Yuchen Pei" . "id@ypei.org")) + (:commit . "a215df2f884fb445d8f159a2b4d84e6853ac9816"))]) + (heap + . [(0 5) nil "Heap (a.k.a. priority queue) data structure" tar + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "data structures" "heap" + "priority queue") + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:authors ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:commit . "10a68e6000bdf630aa7232e57ba25390423991d8"))]) + (hiddenquote + . [(1 2) ((emacs (25 1))) + "Major mode for doing hidden quote puzzles" tar + ((:url . "http://mauroaranda.com/puzzles/hidden-quote-puzzle/") + (:keywords "games") + (:maintainer "Mauro Aranda" . "maurooaranda@gmail.com") + (:authors ("Mauro Aranda" . "maurooaranda@gmail.com")) + (:commit . "856438ee2950fa998561f71d40355a88cdb078b4"))]) + (highlight-escape-sequences + . [(0 4) nil "Highlight escape sequences" tar + ((:url . "https://github.com/dgutov/highlight-escape-sequences") + (:keywords "convenience") + (:maintainer ("Dmitry Gutov" . "dgutov@yandex.ru") + ("Pavel Matcula" . "dev.plvlml@gmail.com")) + (:authors ("Dmitry Gutov" . "dgutov@yandex.ru") + ("Pavel Matcula" . "dev.plvlml@gmail.com")) + (:commit . "08d846a7aa748209d65fecead2b6a766c3e5cb41"))]) + (hook-helpers + . [(1 1 1) ((emacs (25 1))) "Anonymous, modifiable hook functions" + tar + ((:url . "https://savannah.nongnu.org/projects/hook-helpers-el/") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors ("Ian Dunn" . "dunni@gnu.org")) + (:keywords "development" "hooks"))]) + (html5-schema + . [(0 1) nil "Add HTML5 schemas for use by nXML" tar + ((:url . "https://github.com/validator/validator") + (:keywords "html" "xml") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:commit . "784c471a9ea9ae817d70b222ec6fbe90ac64a057"))]) + (hugoista + . [(0 2 1) ((emacs (24 3)) (seq (0))) + "Manage Hugo posts like a barista" tar + ((:url . "https://codeberg.org/c-alpha/hugoista") + (:maintainer "Alexander Adolf" + . "alexander.adolf@condition-alpha.com") + (:authors + ("Alexander Adolf" . "alexander.adolf@condition-alpha.com") + ("Thanos Apollo" . "public@thanosapollo.org")) + (:commit . "22b543c0cb9c74ede7e762a16d44173c08c906ab"))]) + (hydra + . [(0 15 0) ((cl-lib (0 5)) (lv (0))) + "Make bindings that stick around." tar + ((:url . "https://github.com/abo-abo/hydra") + (:keywords "bindings") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:commit . "7081ee6d443dbf2b58e77fa7357c90e495173a2f"))]) + (hyperbole + . [(9 0 1) ((emacs (27 1))) + "GNU Hyperbole: The Everyday Hypertextual Information Manager" + tar + ((:url . "http://www.gnu.org/software/hyperbole") + (:keywords "comm" "convenience" "files" "frames" "hypermedia" + "languages" "mail" "matching" "mouse" "multimedia" + "outlines" "tools" "wp") + (:maintainer "Mats Lidell" . "matsl@gnu.org") + (:commit . "23b118ddb6e0595e3b0668dbce8fa4e8bcec5e71"))]) + (idlwave + . [(6 5 1) nil "IDL editing mode for GNU Emacs" tar + ((:keywords "languages") + (:maintainer "J.D. Smith" . "jdtsmith@gmail.com") + (:url . "https://elpa.gnu.org/packages/idlwave.html") + (:commit . "e1fcd7244cb32df1e90b09729e53474e50a2e808"))]) + (ilist + . [(0 4) nil "Display a list in an ibuffer way." tar + ((:url . "https://gitlab.com/mmemmew/ilist") + (:keywords "convenience") + (:maintainer "Durand" . "mmemmew@gmail.com") + (:authors ("Durand" . "mmemmew@gmail.com")) + (:commit . "5a57e52122fe483fa9bd39049c13a25334e408da"))]) + (indent-bars + . [(0 9 2) ((emacs (27 1)) (compat (30))) + "Highlight indentation with bars" tar + ((:url . "https://github.com/jdtsmith/indent-bars") + (:keywords "convenience") + (:maintainer "J.D. Smith" . "jdtsmith+elpa@gmail.com") + (:authors ("J.D. Smith" . "jdtsmith+elpa@gmail.com")) + (:commit . "aa07a3d812c64445d44796b85fca07044864f64b"))]) + (inspector + . [(0 39) ((emacs (27 1))) + "Tool for inspection of Emacs Lisp objects" tar + ((:url . "https://github.com/mmontone/emacs-inspector") + (:keywords "debugging" "tool" "lisp" "development") + (:maintainer "Mariano Montone" . "marianomontone@gmail.com") + (:authors ("Mariano Montone" . "marianomontone@gmail.com")) + (:commit . "52a64993ac36ed3ed0be51b6a0d54d190edc9c74"))]) + (ioccur + . [(2 6) ((emacs (24)) (cl-lib (0 5))) "Incremental occur" tar + ((:url . "https://github.com/thierryvolpiatto/ioccur") + (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") + (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) + (:commit . "33bf6f73e314ade8da27dd793c69c21312c97f10"))]) + (isearch-mb + . [(0 8) ((emacs (27 1))) "Control isearch from the minibuffer" tar + ((:url . "https://github.com/astoff/isearch-mb") + (:keywords "matching") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "927ea1790bd0c474be5f63bd9c23874e6c61fb48"))]) + (iso-date + . [(1 2 0) ((emacs (28 1))) "Utilities for working with ISO dates" + tar + ((:url . "https://github.com/lmq-10/iso-date") + (:maintainer "Lucas Quintana" . "lmq10@protonmail.com") + (:authors ("Lucas Quintana" . "lmq10@protonmail.com")) + (:commit . "a957d9ae579eeed146e929dd70e5d1a6e265bd06"))]) + (iterators + . [(0 1 1) ((emacs (25))) "Functions for working with iterators" tar + ((:keywords "extensions" "elisp") + (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") + (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) + (:url . "https://elpa.gnu.org/packages/iterators.html") + (:commit . "99bdcc8bdfcbc6a8de3d2675450c2fe0aa0e72fd"))]) + (ivy + . [(0 15 1) ((emacs (24 5))) "Incremental Vertical completYon" tar + ((:url . "https://github.com/abo-abo/swiper") + (:keywords "matching") + (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:commit . "d63d52f140105d4a072fbc18f1405ab8313a4cd5"))]) + (ivy-avy + . [(0 15 1) ((emacs (24 5)) (ivy (0 15 1)) (avy (0 5 0))) + "Avy integration for Ivy" tar + ((:url . "https://github.com/abo-abo/swiper") + (:keywords "convenience") + (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:commit . "b1fb126f19612aab7fdee74bccbf00fcaa3f908f"))]) + (ivy-explorer + . [(0 3 2) ((emacs (25)) (ivy (0 10 0))) + "Dynamic file browsing grid using ivy" tar + ((:url . "https://github.com/clemera/ivy-explorer") + (:keywords "convenience" "files" "matching") + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:authors ("Clemens Radermacher" . "clemera@posteo.net")) + (:commit . "14adb6164f1d1646f503c3e4bd9aa559805f93d7"))]) + (ivy-hydra + . [(0 15 1) ((emacs (24 5)) (ivy (0 15 1)) (hydra (0 14 0))) + "Additional key bindings for Ivy" tar + ((:url . "https://github.com/abo-abo/swiper") + (:keywords "convenience") + (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:commit . "1c9bc4e190199c891a69af03b2cf3e3f0d00c1ec"))]) + (ivy-posframe + . [(0 6 3) ((emacs (26 0)) (posframe (1 0 0)) (ivy (0 13 0))) + "Using posframe to show Ivy" tar + ((:url . "https://github.com/tumashu/ivy-posframe") + (:keywords "abbrev" "convenience" "matching" "ivy") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors ("Feng Shu" . "tumashu@163.com") + ("Naoya Yamashita" . "conao3@gmail.com")) + (:commit . "5d9420252ca855d6d206f1f8ef5993a6be3c618f"))]) + (jami-bot + . [(0 0 4) ((emacs (27 1))) + "An extendable chat bot for the private messenger GNU Jami" tar + ((:url . "https://gitlab.com/hperrey/jami-bot") + (:keywords "comm" "jami" "messenger" "chat bot" "dbus") + (:maintainer "Hanno Perrey" . "hanno@hoowl.se") + (:authors ("Hanno Perrey" . "hanno@hoowl.se")) + (:commit . "c2ad37e2ada14b5551a83211cc4692b39be4e5fb"))]) + (jarchive + . [(0 11 0) ((emacs (26 1))) + "Open project dependencies in jar archives" tar + ((:url . "https://git.sr.ht/~dannyfreeman/jarchive") + (:keywords "tools" "languages" "jvm" "java" "clojure") + (:maintainer "Danny Freeman" . "danny@dfreeman.email") + (:commit . "2c27714a72543bd115cb164ab25647b656c65b2d"))]) + (javaimp + . [(0 9 1) nil + "Add and reorder Java import statements in Maven/Gradle projects" + tar + ((:keywords "java" "maven" "gradle" "programming") + (:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm") + (:authors ("Filipp Gunbin" . "fgunbin@fastmail.fm")) + (:url . "https://elpa.gnu.org/packages/javaimp.html") + (:commit . "2ac7afce3c6f0b390c4b62c065a898883940d65a"))]) + (jgraph-mode + . [(1 1) ((cl-lib (0 5))) "Major mode for Jgraph files" tar + ((:keywords "tex" "wp") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/jgraph-mode.html") + (:commit . "4e13f89fe8837b84d40b969e6a5431816180a747"))]) + (jinx + . [(2 5) ((emacs (29 1)) (compat (30))) "Enchanted Spell Checker" + tar + ((:url . "https://github.com/minad/jinx") + (:keywords "convenience" "text") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "a678be8cf0888947789a10a493c8b1c3a7066f52"))]) + (jit-spell + . [(0 5) ((emacs (27 1)) (compat (29 1))) + "Just-in-time spell checking" tar + ((:url . "https://github.com/astoff/jit-spell") + (:keywords "tools" "wp") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "e6f3525b848c48906f06bf21a9e8678b95ccd3bf"))]) + (js2-mode + . [(20231224) ((emacs (24 1)) (cl-lib (0 5))) + "Improved JavaScript editing mode" tar + ((:url . "https://github.com/mooz/js2-mode/") + (:keywords "languages" "javascript") + (:maintainer ("Steve Yegge" . "steve.yegge@gmail.com") + ("mooz" . "stillpedant@gmail.com") + ("Dmitry Gutov" . "dgutov@yandex.ru")) + (:authors ("Steve Yegge" . "steve.yegge@gmail.com") + ("mooz" . "stillpedant@gmail.com") + ("Dmitry Gutov" . "dgutov@yandex.ru")) + (:commit . "010a536da6df345a0b9a55bbd892f5f4d0d9fdfc"))]) + (json-mode + . [(0 3 1) ((emacs (25 1))) "Major mode for editing JSON files" tar + ((:keywords "data") + (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com") + (:authors ("Simen Heggestøyl" . "simenheg@gmail.com")) + (:url . "https://elpa.gnu.org/packages/json-mode.html") + (:commit . "2eb4b83db23e61fa2112688148aeedbacfc3c18e"))]) + (jsonrpc + . [(1 0 27) ((emacs (25 2))) "JSON-RPC library" tar + ((:keywords "processes" "languages" "extensions") + (:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors ("João Távora" . "joaotavora@gmail.com")) + (:url . "https://elpa.gnu.org/packages/jsonrpc.html") + (:commit . "6caf598ac49b3ed592f22e31307fe71e71490f2b"))]) + (jumpc + . [(3 1) nil "jump to previous insertion points" tar + ((:maintainer "Ivan Kanis" . "ivan@kanis.fr") + (:authors ("Ivan Kanis" . "ivan@kanis.fr")) + (:url . "https://elpa.gnu.org/packages/jumpc.html") + (:commit . "ab83a2a5416f83405361e25df8cbd8aab35cb8b3"))]) + (kind-icon + . [(0 2 2) ((emacs (27 1)) (svg-lib (0 2 8))) + "Completion kind icons" tar + ((:url . "https://github.com/jdtsmith/kind-icon") + (:keywords "completion" "convenience") + (:maintainer "J.D. Smith" . "jdtsmith@gmail.com") + (:authors ("J.D. Smith" . "jdtsmith@gmail.com")) + (:commit . "d8e73fea45cba968de0deed4b7985f5fdaafadfe"))]) + (kiwix + . [(1 1 5) ((emacs (25 1)) (request (0 3 0))) + "Searching offline Wikipedia through Kiwix." tar + ((:url . "https://github.com/stardiviner/kiwix.el") + (:keywords "kiwix" "wikipedia") + (:maintainer "stardiviner" . "numbchild@gmail.com") + (:authors ("stardiviner" . "numbchild@gmail.com")) + (:commit . "cb843349c10b1a492ceb59da20bfcef3ef02f4b5"))]) + (kmb + . [(0 1) ((emacs (24 1))) + "Kill buffers matching a regexp w/o confirmation" tar + ((:keywords "lisp" "convenience") + (:authors ("Tino Calancha" . "tino.calancha@gmail.com")) + (:url . "https://elpa.gnu.org/packages/kmb.html") + (:commit . "4fee1c87e7e286d7ecd759fb74aa7a112bb51e3a"))]) + (kubed + . [(0 5 0) ((emacs (29 1))) "Kubernetes, Emacs, done!" tar + ((:url . "https://eshelyaron.com/kubed.html") + (:keywords "tools" "kubernetes" "containers") + (:maintainer "Eshel Yaron" . "~eshel/kubed-devel@lists.sr.ht") + (:authors ("Eshel Yaron" . "me@eshelyaron.com")) + (:commit . "e8a6f9b0dc25d44f3783036962d6c08eacbdbd23"))]) + (landmark + . [(1 0) nil "Neural-network robot that learns landmarks" tar + ((:keywords "games" "neural network" "adaptive search" + "chemotaxis") + (:maintainer "Terrence Brannon (was:" . "brannon@rana.usc.edu>)") + (:authors ("Terrence Brannon (was:" . "brannon@rana.usc.edu>)")) + (:url . "https://elpa.gnu.org/packages/landmark.html") + (:commit . "422d310c7726898b8d85f95f2336c79c8aaf30eb"))]) + (latex-table-wizard + . [(1 5 4) ((emacs (27 1)) (auctex (12 1)) (transient (0 3 7))) + "Magic editing of LaTeX tables" tar + ((:url . "https://github.com/enricoflor/latex-table-wizard") + (:keywords "convenience") + (:maintainer "Enrico Flor" . "enrico@eflor.net") + (:authors ("Enrico Flor" . "enrico@eflor.net")) + (:commit . "b55d215dbef321194dbf10553d4c0d3b244a50f0"))]) + (leaf + . [(4 5 5) ((emacs (24 1))) + "Simplify your init.el configuration, extended use-package" tar + ((:url . "https://github.com/conao3/leaf.el") + (:keywords "lisp" "settings") + (:maintainer "Naoya Yamashita" . "conao3@gmail.com") + (:authors ("Naoya Yamashita" . "conao3@gmail.com")) + (:commit . "7cc38f9739eadc569b1179fabe7f7893167105da"))]) + (lentic + . [(0 12) ((emacs (25)) (m-buffer (0 13)) (dash (2 5 0))) + "One buffer as a view of another" tar + ((:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk") + (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) + (:url . "https://elpa.gnu.org/packages/lentic.html") + (:commit . "180c1082c016de790f9e6596b63329657c83ce20"))]) + (lentic-server + . [(0 2) ((lentic (0 8)) (web-server (0 1 1))) + "Web Server for Emacs Literate Source" tar + ((:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk") + (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) + (:url . "https://elpa.gnu.org/packages/lentic-server.html") + (:commit . "732b88e7a183707ba65c38e8b3517cac42572644"))]) + (let-alist . + [(1 0 6) ((emacs (24 1))) + "Easily let-bind values of an assoc-list by their names" tar + ((:keywords "extensions" "lisp") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:url . "https://elpa.gnu.org/packages/let-alist.html") + (:commit . "77fb84e6db96cbaa70e230f4881e4ede6e028f15"))]) + (lex + . [(1 2) nil "Lexical analyser construction" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/lex.html") + (:commit . "c7d76551cce66901b9f172f903ce720526c0fb52"))]) + (lin + . [(1 1 0) ((emacs (27 1))) + "Make `hl-line-mode' more suitable for selection UIs" tar + ((:url . "https://github.com/protesilaos/lin") + (:keywords "convenience" "faces" "theme") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "647be281945185a20f37363fd335e99ad0540eff"))]) + (listen + . [(0 10) + ((emacs (29 1)) (persist (0 6)) (taxy (0 10)) + (taxy-magit-section (0 13)) (transient (0 5 3))) + "Audio/Music player" tar + ((:url . "https://github.com/alphapapa/listen.el") + (:keywords "multimedia") + (:maintainer "Adam Porter" . "adam@alphapapa.net") + (:authors ("Adam Porter" . "adam@alphapapa.net")) + (:commit . "e0a243d3c6ba0a8a14d1d16168ac23441bd5e6c9"))]) + (literate-scratch + . [(2 2) ((emacs (29 1))) "Lisp Interaction w/ text paragraphs" tar + ((:url + . "https://git.spwhitton.name/dotfiles/tree/.emacs.d/site-lisp/literate-scratch.el") + (:keywords "lisp" "text") + (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name") + (:authors ("Sean Whitton" . "spwhitton@spwhitton.name")) + (:commit . "00b8f65effe4f2673e6450d70000644b266aa78a"))]) + (llm + . [(0 28 3) + ((emacs (28 1)) (plz (0 8)) (plz-event-source (0 1 1)) + (plz-media-type (0 2 1)) (compat (29 1))) + "Interface to pluggable llm backends" tar + ((:url . "https://github.com/ahyatt/llm") + (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") + (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) + (:commit . "cbf1864089ceef6a1a733c55a2c72ca01dcbccb1"))]) + (lmc + . [(1 4) nil "Little Man Computer in Elisp" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/lmc.html") + (:commit . "b65ac802b4f55fd8e5809fcf7a6f6da1e11e853a"))]) + (load-dir + . [(0 0 5) nil "Load all Emacs Lisp files in a given directory" tar + ((:keywords "lisp" "files" "convenience") + (:url . "https://elpa.gnu.org/packages/load-dir.html") + (:commit . "4c43baee082cc5a6f966c441008c6c479acbc5b7"))]) + (load-relative + . [(1 3 2) nil + "Relative file load (within a multi-file Emacs package)" tar + ((:url . "https://github.com/rocky/emacs-load-relative") + (:keywords "internal") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")) + (:commit . "e79d8f1581991381a9e3f1657af59dd0c35058fa"))]) + (loc-changes + . [(1 2) nil "keep track of positions even after buffer changes" + single + ((:authors ("Rocky Bernstein" . "rocky@gnu.org")) + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:url . "http://github.com/rocky/emacs-loc-changes"))]) + (loccur + . [(1 2 5) ((emacs (25 1))) + "Perform an occur-like folding in current buffer" tar + ((:url . "https://github.com/fourier/loccur") + (:keywords "matching") + (:maintainer "Alexey Veretennikov" + . "alexey.veretennikov@gmail.com") + (:authors + ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) + (:commit . "2120345933a1617cc5359dabd7636fd3479441bf"))]) + (logos + . [(1 2 0) ((emacs (27 1))) "Simple focus mode and extras" tar + ((:url . "https://github.com/protesilaos/logos") + (:keywords "convenience" "focus" "writing" "presentation" + "narrowing") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "79270ec67d81f45f4431d850fbbb31eaca92f24f"))]) + (luwak + . [(1 0 0) ((emacs (28))) "Web browser based on lynx -dump." tar + ((:url . "https://g.ypei.me/luwak.git") + (:keywords "web-browser" "lynx" "html" "tor") + (:maintainer "Yuchen Pei" . "id@ypei.org") + (:authors ("Yuchen Pei" . "id@ypei.org")) + (:commit . "37a36288c8d4cdba461812dbdf5da434ca156fee"))]) + (lv + . [(0 15 0) nil "Other echo area" tar + ((:url . "https://elpa.gnu.org/packages/lv.html") + (:commit . "54e9db2b023e03b6f6b46aeec48ea74fd51d4e11"))]) + (m-buffer + . [(0 16 1) ((seq (2 14))) + "List-Oriented, Functional Buffer Manipulation" tar + ((:maintainer "Phillip Lord" . "phillip.lord@russet.rg.uk") + (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) + (:url . "https://elpa.gnu.org/packages/m-buffer.html") + (:commit . "5e7714835b2289f61dad24c0b5cf98d28fc313b0"))]) + (map + . [(3 3 1) ((emacs (26))) "Map manipulation functions" tar + ((:keywords "extensions" "lisp") + (:maintainer nil . "emacs-devel@gnu.org") + (:authors ("Nicolas Petton" . "nicolas@petton.fr")) + (:url . "https://elpa.gnu.org/packages/map.html") + (:commit . "9da2efb670574b473ab864ae0456b4f1b38e680b"))]) + (marginalia + . [(2 6) ((emacs (29 1)) (compat (30))) + "Enrich existing commands with completion annotations" tar + ((:url . "https://github.com/minad/marginalia") + (:keywords "docs" "help" "matching" "completion") + (:maintainer ("Omar Antolín Camarena" . "omar@matem.unam.mx") + ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx") + ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "c3e7b1904423bda143249c0d02cbb7cc7ed8bee0"))]) + (markchars + . [(0 2 2) nil "Mark chars fitting certain characteristics" tar + ((:maintainer "Lennart Borgman" . "lennart.borgman@gmail.com") + (:authors ("Lennart Borgman" . "lennart.borgman@gmail.com")) + (:url . "https://elpa.gnu.org/packages/markchars.html") + (:commit . "f069a7637a97239ecab7f34fd07fddfafb02ba3f"))]) + (math-symbol-lists + . [(1 3) nil "Lists of Unicode math symbols and latex commands" tar + ((:url . "https://github.com/vspinu/math-symbol-lists") + (:keywords "unicode" "symbols" "mathematics") + (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") + (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) + (:commit . "590d9f09f8ad9aab747b97f077396a2035dcf50f"))]) + (mathjax + . [(0 1) ((emacs (27 1))) "Render formulas using MathJax" tar + ((:url . "https://github.com/astoff/mathjax.el") + (:keywords "tex" "text" "tools") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "db669451bbee7d2ea9872c28661c4679391b9644"))]) + (mathsheet + . [(1 3) ((peg (1 0)) (emacs (28 1))) + "Generate dynamic math worksheets" tar + ((:url . "https://gitlab.com/ianxm/mathsheet") + (:keywords "tools" "education" "math") + (:maintainer "Ian Martins" . "ianxm@jhu.edu") + (:authors ("Ian Martins" . "ianxm@jhu.edu")) + (:commit . "da128406fca3eeb66358d479082cd78f2fdeabb4"))]) + (matlab-mode + . [(7 4 1) ((emacs (27 2))) "Major mode for MATLAB(R) dot-m files" + tar + ((:url . "https://github.com/mathworks/Emacs-MATLAB-Mode") + (:keywords "matlab(r)") + (:maintainer ("Eric M. Ludlam" . "eludlam@mathworks.com") + ("Uwe Brauer" . "oub@mat.ucm.es") + ("John Ciolfi" . "john.ciolfi.32@gmail.com")) + (:authors ("Matt Wette" . "mwette@alumni.caltech.edu") + ("Eric M. Ludlam" . "eludlam@mathworks.com")) + (:commit . "debcd15126d1f1ce97325b8cffc6c79c81c63d66"))]) + (mct + . [(1 1 0) ((emacs (29 1))) "Minibuffer Confines Transcended" tar + ((:url . "https://github.com/protesilaos/mct") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "306cb704196c643b552aceb5893693641ca747d9"))]) + (memory-usage + . [(0 2) nil "Analyze the memory usage of Emacs in various ways" tar + ((:keywords "maint") + (:maintainer "Stefan Monnier" . "monnier@cs.yale.edu") + (:authors ("Stefan Monnier" . "monnier@cs.yale.edu")) + (:url . "https://elpa.gnu.org/packages/memory-usage.html") + (:commit . "cb73fe66a59d737a72a5ed4259794b1d75aefa2c"))]) + (metar + . [(0 3) ((cl-lib (0 5))) + "Retrieve and decode METAR weather information" tar + ((:keywords "comm") + (:maintainer "Mario Lang" . "mlang@delysid.org") + (:authors ("Mario Lang" . "mlang@delysid.org")) + (:url . "https://elpa.gnu.org/packages/metar.html") + (:commit . "623639e7d6912c4d71dc8f0aea5ad1e9ede41cf8"))]) + (midi-kbd + . [(0 2) ((emacs (25))) "Create keyboard events from Midi input" tar + ((:keywords "convenience" "hardware" "multimedia") + (:maintainer "David Kastrup" . "dak@gnu.org") + (:authors ("David Kastrup" . "dak@gnu.org")) + (:url . "https://elpa.gnu.org/packages/midi-kbd.html") + (:commit . "d23eea421486cf94e0282ac0cc43fd9700174c77"))]) + (mines + . [(1 6) ((emacs (24 4)) (cl-lib (0 5))) "Minesweeper game" tar + ((:url . "https://github.com/calancha/Minesweeper") + (:keywords "games") + (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") + (:authors ("Tino Calancha" . "tino.calancha@gmail.com")) + (:commit . "868e9b9650be1bcc1a5e6ff5a66806eccd1fe26e"))]) + (minibuffer-header + . [(0 5) ((emacs (27 1))) "Minibuffer header line" tar + ((:url . "https://github.com/rougier/minibuffer-header") + (:keywords "convenience") + (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") + (:commit . "fe5d90d3f13c0010eed3b5dd437b458f8bf3da5f"))]) + (minibuffer-line + . [(0 1) nil "Display status info in the minibuffer window" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/minibuffer-line.html") + (:commit . "852874725fd06329109b2d431d8af5502b54036c"))]) + (minimail + . [(0 3) ((emacs (30 1))) "Simple, non-blocking IMAP email client" + tar + ((:url . "https://github.com/astoff/minimail") (:keywords "mail") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "897abe9606a8b1074d27b6b0da6ca67eb6e9606a"))]) + (minimap + . [(1 4) nil "Sidebar showing a \"mini-map\" of a buffer" tar + ((:maintainer "David Engster" . "deng@randomsample.de") + (:authors ("David Engster" . "deng@randomsample.de")) + (:url . "https://elpa.gnu.org/packages/minimap.html") + (:commit . "2ff29c5d6abae3637d6174d889f39745fcd13fa5"))]) + (minuet + . [(0 7 1) ((emacs (29)) (plz (0 9)) (dash (2 19 1))) + "Code completion using LLM" tar + ((:url . "https://github.com/milanglacier/minuet-ai.el") + (:maintainer "Milan Glacier" . "dev@milanglacier.com") + (:authors ("Milan Glacier" . "dev@milanglacier.com")) + (:commit . "7b34bf0f0334478dab15ce185eacc794a6c7415f"))]) + (mmm-mode + . [(0 5 11) ((emacs (25 1)) (cl-lib (0 2))) + "Allow Multiple Major Modes in a buffer" tar + ((:url . "https://github.com/dgutov/mmm-mode") + (:keywords "convenience" "faces" "languages" "tools") + (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev") + (:authors ("Michael Abraham Shulman" . "viritrilbia@gmail.com")) + (:commit . "b1f5c7dbdc405e6e10d9ddd99a43a6b2ad61b176"))]) + (modus-themes + . [(5 1 0) ((emacs (28 1))) + "Elegant, highly legible and customizable themes" tar + ((:url . "https://github.com/protesilaos/modus-themes") + (:keywords "faces" "theme" "accessibility") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "4fd8cdfc552e7e1e6a96625a752ab612706b15e3"))]) + (mpdired + . [(3) ((emacs (29))) "A dired-like client for Music Player Daemon" + tar + ((:keywords "multimedia") + (:maintainer "Manuel Giraud" . "manuel@ledu-giraud.fr") + (:authors ("Manuel Giraud" . "manuel@ledu-giraud.fr")) + (:url . "https://elpa.gnu.org/packages/mpdired.html") + (:commit . "793ec28c47d25f36806eb5e692025d61fb6a1bb3"))]) + (multi-mode + . [(1 14) nil "support for multiple major modes" tar + ((:url . "http://www.loveshack.ukfsn.org/emacs") + (:keywords "languages" "extensions" "files") + (:maintainer "Dave Love" . "fx@gnu.org") + (:authors ("Dave Love" . "fx@gnu.org")) + (:commit . "03dae71ad44bd5d10495011f124a1cd6f43f795d"))]) + (multishell + . [(1 1 10) ((cl-lib (0 5))) + "Organize use of multiple shell buffers, local and remote" tar + ((:url . "https://github.com/kenmanheimer/EmacsMultishell") + (:keywords "processes") + (:maintainer "Ken Manheimer" . "ken.manheimer@gmail.com") + (:authors ("Ken Manheimer" . "ken.manheimer@gmail.com")) + (:commit . "aa1433b8df6d950e8592c7e878922b4ec5374569"))]) + (muse + . [(3 20 2) nil "Authoring and publishing tool for Emacs" tar + ((:url . "http://mwolson.org/projects/EmacsMuse.html") + (:maintainer "Michael Olson" . "mwolson@gnu.org") + (:authors ("John Wiegley" . "johnw@gnu.org")) + (:keywords "hypermedia"))]) + (myers + . [(0 1) ((emacs (25))) "Random-access singly-linked lists" tar + ((:keywords "list" "containers") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/myers.html") + (:commit . "cc8d39d05c4a48545336510df7ac9ab186611ea2"))]) + (nadvice + . [(0 4) nil "Forward compatibility for Emacs-24.4's nadvice" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/nadvice.html") + (:commit . "d19e9ae649374a0f2fab1baa045ed192e0851750"))]) + (nameless + . [(1 0 2) ((emacs (24 4))) + "Hide package namespace in your emacs-lisp code" tar + ((:url . "https://github.com/Malabarba/nameless") + (:keywords "convenience" "lisp") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:commit . "ab1a5c589378334eafca105af1a17f73b9065423"))]) + (names + . [(20151201 0) ((emacs (24 1)) (cl-lib (0 5))) + "Namespaces for emacs-lisp. Avoid name clobbering without hiding symbols." + tar + ((:url . "https://github.com/Malabarba/names") + (:keywords "extensions" "lisp") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:commit . "465df8ed03f9d6c926566b81ef8abc93f8357983"))]) + (nano-agenda + . [(0 3) ((emacs (27 1))) "N Λ N O agenda" tar + ((:url . "https://github.com/rougier/nano-agenda") + (:keywords "convenience" "org-mode" "org-agenda") + (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") + (:commit . "6c38e95b8e846aceb88398c682fd283052924556"))]) + (nano-modeline + . [(1 1 0) ((emacs (27 1))) "N Λ N O modeline" tar + ((:url . "https://github.com/rougier/nano-modeline") + (:keywords "convenience" "mode-line" "header-line") + (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") + (:commit . "04676d57a1e602123a593836745a744d1b2028fb"))]) + (nano-theme + . [(0 3 4) ((emacs (27 1))) "N Λ N O theme" tar + ((:url . "https://github.com/rougier/nano-theme") + (:keywords "theme" "dark" "light") + (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") + (:commit . "34a3efc37b329064a320225361ad833c57017485"))]) + (nftables-mode + . [(1 1) ((emacs (25 1))) "Major mode for editing nftables" tar + ((:keywords "convenience") + (:maintainer nil . "emacs-devel@gnu.org") + (:authors ("Trent W. Buck" . "trentbuck@gmail.com")) + (:url . "https://elpa.gnu.org/packages/nftables-mode.html") + (:commit . "05600129ee8ea0774c6ac446a2bd18fc1dde54eb"))]) + (nhexl-mode + . [(1 5) ((emacs (24 4)) (cl-lib (0 5))) + "Minor mode to edit files via hex-dump format" tar + ((:keywords "data") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/nhexl-mode.html") + (:commit . "ec80692dec04e238f2ae3284cfd8f9d05ac1d2a3"))]) + (nlinum + . [(1 9) nil "Show line numbers in the margin" tar + ((:keywords "convenience") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/nlinum.html") + (:commit . "99d0fef381e9f44a3fdcf66f28c28109a7cdaf45"))]) + (notes-mode + . [(1 31) nil "Indexing system for on-line note-taking" tar + ((:url . "https://ant.isi.edu/~johnh/SOFTWARE/NOTES_MODE/") + (:maintainer "John Heidemann" . "johnh@isi.edu") + (:authors ("John Heidemann" . "johnh@isi.edu")) + (:commit . "2a25d79f7e5d9ab7298ba40e11e78d1f2ded06d2"))]) + (notmuch-indicator + . [(1 2 0) ((emacs (27 1))) + "Display mode line indicator with notmuch-count(1) output" tar + ((:url . "https://github.com/protesilaos/notmuch-indicator") + (:keywords "convenience" "mail") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "7aa1da708aeb9f729e8e0a99ef65341b7344815e"))]) + (ntlm + . [(2 1 0) nil "NTLM (NT LanManager) authentication support" tar + ((:keywords "ntlm" "sasl" "comm") + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors ("Taro Kawagishi" . "tarok@transpulse.org")) + (:url . "https://elpa.gnu.org/packages/ntlm.html") + (:commit . "1add5ec3a270cba99549dc7e78c529c3dd190784"))]) + (num3-mode + . [(1 5) nil "highlight groups of digits in long numbers" tar + ((:keywords "faces" "minor-mode") + (:maintainer "Michal Nazarewicz" . "mina86@mina86.com") + (:authors ("Felix Lee" . "felix8a@gmail.com") + ("Michal Nazarewicz" . "mina86@mina86.com")) + (:url . "https://elpa.gnu.org/packages/num3-mode.html") + (:commit . "fdf4d633e541875a6f765f5c3c8e0d4911122ed3"))]) + (oauth2 + . [(0 18 4) ((emacs (27 1))) "OAuth 2.0 Authorization Protocol" tar + ((:url . "https://elpa.gnu.org/packages/oauth2.html") + (:keywords "comm") + (:maintainer ("Xiyue Deng" . "manphiz@gmail.com") + (nil . "emacs-devel@gnu.org")) + (:authors ("Julien Danjou" . "julien@danjou.info")) + (:commit . "c88165b85e208a69c24fb12efe695f4c6e1333df"))]) + (ob-asymptote + . [(1 0 2) nil "Babel Functions for Asymptote" tar + ((:url . "https://github.com/hurrja/ob-asymptote") + (:keywords "literate programming" "reproducible research") + (:maintainer "Jarmo Hurri" . "jarmo.hurri@iki.fi") + (:commit . "339b5bef1434b1833d636c9fea9b95b3e990fe71"))]) + (ob-haxe + . [(1 0) nil "org-babel functions for haxe evaluation" tar + ((:url . "https://orgmode.org") + (:keywords "literate programming" "reproducible research") + (:maintainer "Ian Martins" . "ianxm@jhu.edu") + (:authors ("Ian Martins" . "ianxm@jhu.edu")) + (:commit . "d52fa3bc87310a560bed8e6362e412c4b3d73294"))]) + (objed + . [(0 8 3) ((emacs (25)) (cl-lib (0 5))) + "Navigate and edit text objects." tar + ((:url . "https://github.com/clemera/objed") + (:keywords "convenience") + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:authors ("Clemens Radermacher" . "clemera@posteo.net")) + (:commit . "01f062187912785ebaa2961036802c777cbbc65d"))]) + (omn-mode + . [(1 3) nil "Support for OWL Manchester Notation" tar + ((:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk") + (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) + (:url . "https://elpa.gnu.org/packages/omn-mode.html") + (:commit . "ec1d34f63b6d79fc0db7ed79c3d1c5747c0d6d6b"))]) + (on-screen + . [(1 3 3) ((cl-lib (0))) "guide your eyes while scrolling" tar + ((:url . "https://github.com/michael-heerdegen/on-screen.el") + (:keywords "convenience") + (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") + (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) + (:commit . "cfc449d68e762cf05297bb923a48e9bbd0af1b92"))]) + (orderless + . [(1 5) ((emacs (27 1)) (compat (30))) + "Completion style for matching regexps in any order" tar + ((:url . "https://github.com/oantolin/orderless") + (:keywords "matching" "completion") + (:maintainer ("Omar Antolín Camarena" . "omar@matem.unam.mx") + ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) + (:commit . "31812d9252c6cfa7eae8fa04cd40c8b2081e9936"))]) + (org + . [(9 7 39) ((emacs (26 1))) + "Outline-based notes management and organizer" tar + ((:url . "https://orgmode.org") + (:keywords "outlines" "hypermedia" "calendar" "text") + (:maintainer "Ihor Radchenko" . "yantar92@posteo.net") + (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) + (:commit . "b7bc0ede67f3e2a477f4d6ad0c46a6d80bca5aea"))]) + (org-contacts + . [(1 1) ((emacs (27 1)) (org (9 3 4))) + "Contacts management system for Org Mode" tar + ((:url . "https://repo.or.cz/org-contacts.git") + (:keywords "contacts" "org-mode" "outlines" "hypermedia" + "calendar") + (:maintainer "stardiviner" . "numbchild@gmail.com") + (:authors ("Julien Danjou" . "julien@danjou.info")) + (:commit . "217ba04c9d638067a6ccb0829cf1885f54c1d568"))]) + (org-edna + . [(1 1 2) ((emacs (25 1)) (seq (2 19)) (org (9 0 5))) + "Extensible Dependencies 'N' Actions" tar + ((:url . "https://savannah.nongnu.org/projects/org-edna-el/") + (:keywords "convenience" "text" "org") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors ("Ian Dunn" . "dunni@gnu.org")) + (:commit . "8258a4dfa00aa522249cdf9aeea5be4de97bd7c1"))]) + (org-gnosis + . [(0 1 1) ((emacs (27 2)) (emacsql (4 0 0)) (compat (29 1 4 2))) + "Roam-like Knowledge Management System" tar + ((:url . "https://thanosapollo.org/projects/org-gnosis/") + (:keywords "extensions") + (:maintainer "Thanos Apollo" . "public@thanosapollo.org") + (:authors ("Thanos Apollo" . "public@thanosapollo.org")) + (:commit . "7db80112f08547ae4526f4ca645dbe6e224d27c6"))]) + (org-jami-bot + . [(0 0 5) ((emacs (28 1)) (jami-bot (0 0 4))) + "Capture GNU Jami messages as notes and todos in Org mode" tar + ((:url . "https://gitlab.com/hperrey/org-jami-bot") + (:keywords "comm" "outlines" "org-capture" "jami") + (:maintainer "Hanno Perrey" . "hanno@hoowl.se") + (:authors ("Hanno Perrey" . "hanno@hoowl.se")) + (:commit . "020b03f299dad438f65d7bcbf93553b273fd7c33"))]) + (org-modern + . [(1 11) ((emacs (29 1)) (org (9 6)) (compat (30))) + "Modern looks for Org" tar + ((:url . "https://github.com/minad/org-modern") + (:keywords "outlines" "hypermedia" "text") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "55b5bbeb1eb9483d0cb43f4803615c380bf3b1ed"))]) + (org-notify + . [(0 1 2) ((emacs (25 1))) "Notifications for Org-mode" tar + ((:url . "https://github.com/p-m/org-notify") + (:keywords "notification" "todo-list" "alarm" "reminder" + "pop-up" "calendar") + (:maintainer "Peter Münster" . "pm@a16n.net") + (:authors ("Peter Münster" . "pm@a16n.net")) + (:commit . "aacd0efd8cb7906b3c0893791016d2e7f82e11e0"))]) + (org-real + . [(1 0 11) ((emacs (26 1)) (boxy (2 0)) (org (9 3))) + "Keep track of real things as org-mode links" tar + ((:url . "https://gitlab.com/grinn.amy/org-real") + (:keywords "tools") + (:maintainer "Amy Grinn" . "grinn.amy@gmail.com") + (:authors ("Amy Grinn" . "grinn.amy@gmail.com")) + (:commit . "aa45c5dc795779e4f25e4a8200da06454e070a79"))]) + (org-remark + . [(1 3 0) ((emacs (27 1)) (org (9 4))) + "Highlight & annotate text, Info, EPUB, EWW" tar + ((:url . "https://github.com/nobiot/org-remark") + (:keywords "org-mode" "annotation" "note-taking" + "marginal-notes" "wp") + (:maintainer "Noboru Ota" . "me@nobiot.com") + (:authors ("Noboru Ota" . "me@nobiot.com")) + (:commit . "c458649989ab32babb61cf9fc5c178cdaef1a62a"))]) + (org-transclusion + . [(1 4 0) ((emacs (27 1)) (org (9 4))) + "Transclude text content via links" tar + ((:url . "https://github.com/nobiot/org-transclusion") + (:keywords "org-mode" "transclusion" "writing") + (:maintainer "Noboru Ota" . "me@nobiot.com") + (:authors ("Noboru Ota" . "me@nobiot.com")) + (:commit . "e6e638710e90198070c9b07ebdaa345a79f74706"))]) + (org-translate + . [(0 1 4) ((emacs (27 1)) (org (9 1))) + "Org-based translation environment" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:url . "https://elpa.gnu.org/packages/org-translate.html") + (:commit . "bdc5d169ef0c502f46aa673918ccf34fcc8415f2"))]) + (orgalist + . [(1 16) ((emacs (26 1))) + "Manage Org-like lists in non-Org buffers" tar + ((:keywords "convenience") + (:maintainer "Nicolas Goaziou" . "mail@nicolasgoaziou.fr") + (:authors ("Nicolas Goaziou" . "mail@nicolasgoaziou.fr")) + (:url . "https://elpa.gnu.org/packages/orgalist.html") + (:commit . "1f540f645eeb338019750d4dca3c056a1f5eca6d"))]) + (osc + . [(0 4) nil "Open Sound Control protocol library" tar + ((:keywords "comm" "processes" "multimedia") + (:maintainer "Mario Lang" . "mlang@blind.guru") + (:authors ("Mario Lang" . "mlang@blind.guru")) + (:url . "https://elpa.gnu.org/packages/osc.html") + (:commit . "6b6dbb4176f45f9ff3a783c816c4556ca2931a22"))]) + (osm + . [(1 12) ((emacs (29 1)) (compat (30))) "OpenStreetMap viewer" tar + ((:url . "https://github.com/minad/osm") + (:keywords "network" "multimedia" "hypermedia" "mouse") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "5cd646e6e5bffe53acccf3fc06cf74eb5227a9da"))]) + (other-frame-window + . [(1 0 6) ((emacs (24 4))) + "Minor mode to enable global prefix keys for other frame/window buffer placement" + tar + ((:keywords "frame" "window") + (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org") + (:authors ("Stephen Leake" . "stephen_leake@member.fsf.org")) + (:url . "https://elpa.gnu.org/packages/other-frame-window.html") + (:commit . "7477b00664bff9b0b9edfe7ecbef379a7543ba77"))]) + (pabbrev + . [(4 3 0) ((emacs (25 1))) "Predictive abbreviation expansion" tar + ((:url . "https://github.com/phillord/pabbrev") + (:maintainer "Arthur Miller" . "arthur.miller@live.com") + (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) + (:commit . "0c281401b47bd67d2726326c1a415c2bd219395f"))]) + (paced + . [(1 1 3) ((emacs (25 1)) (async (1 9 1))) + "Predictive Abbreviation Completion and Expansion using Dictionaries" + tar + ((:url . "https://savannah.nongnu.org/projects/paced-el/") + (:keywords "convenience" "completion") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors ("Ian Dunn" . "dunni@gnu.org")) + (:commit . "c3683a0a8a611fbd15bb3ec78ccac121843711c9"))]) + (package-x + . [(1 0) nil "Package extras" tar + ((:keywords "tools") + (:maintainer "Philip Kaludercic" . "philipk@posteo.net") + (:authors ("Tom Tromey" . "tromey@redhat.com")) + (:url . "https://elpa.gnu.org/packages/package-x.html") + (:commit . "a4aaf1a7dc31af40b33435fae3c1674d744031f7"))]) + (parsec + . [(0 1 3) ((emacs (24)) (cl-lib (0 5))) "Parser combinator library" + tar + ((:url . "https://github.com/cute-jumper/parsec.el") + (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") + (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) + (:keywords "extensions"))]) + (parser-generator + . [(0 2 8) ((emacs (26))) "Parser Generator library" tar + ((:url . "https://github.com/cjohansson/emacs-parser-generator") + (:keywords "tools" "convenience") + (:maintainer "Christian Johansson" . "christian@cvj.se") + (:authors ("Christian Johansson" . "christian@cvj.se")) + (:commit . "0180a672911591b86ae25fd67e99bc9b91147fe6"))]) + (path-iterator + . [(1 0) ((emacs (25 0))) + "An iterator for traversing a directory path." tar + ((:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:url . "https://elpa.gnu.org/packages/path-iterator.html") + (:commit . "df6a5e2d7e0399bac4f6d016dc272943bbb04e5e"))]) + (peg + . [(1 0 2) ((emacs (25))) + "Parsing Expression Grammars in Emacs Lisp" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Helmut Eller" . "eller.helmut@gmail.com")) + (:url . "https://elpa.gnu.org/packages/peg.html") + (:commit . "2bccc414a94f067eb571fe614270494750a5de0e"))]) + (perl-doc + . [(0 82) ((emacs (27))) "Read Perl documentation" tar + ((:url . "https://github.com/HaraldJoerg/emacs-perl-doc") + (:keywords "languages") + (:maintainer "Harald Jörg" . "haj@posteo.de") + (:authors ("Harald Jörg" . "haj@posteo.de")) + (:commit . "9ac4eeb55b554601c2f0205f099645806a05dc82"))]) + (persist + . [(0 8) ((emacs (26 1)) (compat (30 0 2 0))) + "Persist Variables between Emacs Sessions" tar + ((:maintainer "Joseph Turner" . "persist-el@breatheoutbreathe.in") + (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) + (:url . "https://elpa.gnu.org/packages/persist.html") + (:commit . "3b4b421d5185f2c33bae478aa057dff13701cc25"))]) + (phpinspect + . [(3 0 1) ((compat (29))) + "PHP parsing and code intelligence package" tar + ((:url . "https://github.com/hugot/phpinspect.el") + (:keywords "php" "languages" "tools" "convenience") + (:maintainer "Hugo Thunnissen" . "devel@hugot.nl") + (:authors ("Hugo Thunnissen" . "devel@hugot.nl")) + (:commit . "ce64041a4be5da24514356a3d6e7f6b9fafdd51b"))]) + (phps-mode + . [(0 4 51) ((emacs (26))) + "Major mode for PHP with code intelligence" tar + ((:url . "https://github.com/cjohansson/emacs-phps-mode") + (:keywords "tools" "convenience") + (:maintainer "Christian Johansson" . "christian@cvj.se") + (:authors ("Christian Johansson" . "christian@cvj.se")) + (:commit . "ff5fbd617d8e67f14f8928fd21f4de56bead987a"))]) + (pinentry + . [(0 1) nil "GnuPG Pinentry server implementation" tar + ((:keywords "gnupg") (:maintainer "Daiki Ueno" . "ueno@gnu.org") + (:authors ("Daiki Ueno" . "ueno@gnu.org")) + (:url . "https://elpa.gnu.org/packages/pinentry.html") + (:commit . "ef0d62bba29dfab07624d030032ec0f67d34e865"))]) + (plz + . [(0 9 1) ((emacs (27 1))) "HTTP library" tar + ((:url . "https://github.com/alphapapa/plz.el") + (:keywords "comm" "network" "http") + (:maintainer "Adam Porter" . "adam@alphapapa.net") + (:authors ("Adam Porter" . "adam@alphapapa.net")) + (:commit . "c579f039ffdb52ff61775ff25510a9c26e25d0c5"))]) + (plz-event-source + . [(0 1 3) ((emacs (26 3)) (plz-media-type (0 2 4))) + "Plz Event Source" tar + ((:url . "https://github.com/r0man/plz-event-source") + (:keywords "comm" "network" "http") + (:maintainer "r0man" . "roman@burningswell.com") + (:authors ("r0man" . "roman@burningswell.com")) + (:commit . "236235a14cd33ab3d458627a3c169b1a0c7a887e"))]) + (plz-media-type + . [(0 2 4) ((emacs (26 3)) (plz (0 9 1))) "Plz Media Types" tar + ((:url . "https://github.com/r0man/plz-media-type") + (:keywords "comm" "network" "http") + (:maintainer "r0man" . "roman@burningswell.com") + (:authors ("r0man" . "roman@burningswell.com")) + (:commit . "4a0621e6d76860b0c331d58845af11c150e5f19a"))]) + (plz-see + . [(0 1) ((emacs (29 1)) (plz (0 7))) "Interactive HTTP client" tar + ((:url . "https://github.com/astoff/plz-see.el") + (:keywords "comm" "network" "http") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:commit . "c55e6aa2971caad582df1d449e0f57604250cae1"))]) + (poke + . [(3 2) ((emacs (25))) "Emacs meets GNU poke!" tar + ((:url . "https://www.jemarch.net/poke") + (:maintainer "Jose E. Marchesi" . "jemarch@gnu.org") + (:authors ("Jose E. Marchesi" . "jemarch@gnu.org")) + (:commit . "77bdcce97e06bbd6771f35acbb3f399457bebb71"))]) + (poke-mode + . [(3 1) nil "Major mode for editing Poke programs" tar + ((:maintainer "Jose E. Marchesi" . "jemarch@gnu.org") + (:authors ("Aurelien Aptel" . "aaptel@suse.com")) + (:url . "https://elpa.gnu.org/packages/poke-mode.html") + (:commit . "340bb45867cce7f86d09a00b809c2c2078302a9e"))]) + (poker + . [(0 2) nil "Texas hold 'em poker" tar + ((:keywords "games") + (:maintainer "Mario Lang" . "mlang@delysid.org") + (:authors ("Mario Lang" . "mlang@delysid.org")) + (:url . "https://elpa.gnu.org/packages/poker.html") + (:commit . "56469f23f29dba8f8beefd308b01a0b1bbc81756"))]) + (popper + . [(0 4 8) ((emacs (26 1))) "Summon and dismiss buffers as popups" + tar + ((:url . "https://github.com/karthink/popper") + (:keywords "convenience") + (:maintainer "Karthik Chikmagalur" + . "karthik.chikmagalur@gmail.com") + (:authors + ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) + (:commit . "91b71955db19014d7139191660272c736458d87d"))]) + (posframe + . [(1 5 0) ((emacs (26 1))) "Pop a posframe (just a frame) at point" + tar + ((:url . "https://github.com/tumashu/posframe") + (:keywords "convenience" "tooltip") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors ("Feng Shu" . "tumashu@163.com")) + (:commit . "d93828bf6c36383c365bd564ad3bab5a4403804c"))]) + (pq + . [(0 2) ((emacs (25))) "libpq binding" tar + ((:url . "https://github.com/anse1/emacs-libpq") + (:maintainer "Tom Gillespie" . "tgbugs@gmail.com") + (:authors ("Tom Gillespie" . "tgbugs@gmail.com")) + (:commit . "4dad5fcdbbb362a0dc2dfa7b5a38dd5be1551c68"))]) + (preview-auto + . [(0 4 1) ((emacs (29 3)) (auctex (14 0 5))) + "Automatic previews in AUCTeX" tar + ((:url . "https://github.com/ultronozm/preview-auto.el") + (:keywords "tex" "convenience") + (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com") + (:authors ("Paul D. Nelson" . "nelson.paul.david@gmail.com")) + (:commit . "4002b7569416eac640072ec7fe04337e2747910d"))]) + (preview-tailor + . [(0 2 1) ((emacs (29 1)) (auctex (0))) + "Tailor AUCTeX preview scale to monitor/text scale" tar + ((:url . "https://github.com/ultronozm/preview-tailor.el") + (:keywords "tex" "multimedia") + (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com") + (:authors ("Paul D. Nelson" . "nelson.paul.david@gmail.com")) + (:commit . "731d92247aab0a51c208d0fe196db3dec0d1b2e9"))]) + (project + . [(0 11 1) ((emacs (26 1)) (xref (1 7 0))) + "Operations on the current project" tar + ((:url . "https://elpa.gnu.org/packages/project.html") + (:commit . "08e38818f6ff4e514ac291bc5a7686f4390759b0"))]) + (psgml + . [(1 3 5) nil "SGML-editing mode with parsing support" tar + ((:keywords "languages") + (:maintainer "Lennart Staflin" . "lstaflin@gmail.com") + (:authors ("Lennart Staflin" . "lenst@lysator.liu.se") + ("James Clark" . "jjc@clark.com")) + (:url . "https://elpa.gnu.org/packages/psgml.html") + (:commit . "697fcf7d80513257d90b7331297495bb9e01003d"))]) + (pspp-mode + . [(1 1) nil "Major mode for editing PSPP files" single + ((:url . "http://elpa.gnu.org/packages/pspp-mode.html") + (:keywords "pspp" "major-mode") + (:authors ("Scott Andrew Borton" . "scott@pp.htv.fi")) + (:maintainer "John Darrington" . "john@darrington.wattle.id.au"))]) + (pulsar + . [(1 3 2) ((emacs (28 1))) + "Pulse highlight on demand or after select functions" tar + ((:url . "https://github.com/protesilaos/pulsar") + (:keywords "convenience" "pulse" "highlight") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "ff40a936a17818152448c0f544164b9e5945c1c3"))]) + (pyim + . [(5 3 5) ((emacs (27 1)) (async (1 6)) (xr (1 13))) + "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." + tar + ((:url . "https://github.com/tumashu/pyim") + (:keywords "convenience" "chinese" "pinyin" "input-method") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors ("Ye Wenbin" . "wenbinye@163.com") + ("Feng Shu" . "tumashu@163.com")) + (:commit . "bc85ecc3b2521d05c7585df97939f7c0ec5b1496"))]) + (pyim-basedict + . [(0 5 5) ((pyim (3 7))) "The default pinyin dict of pyim" tar + ((:url . "https://github.com/tumashu/pyim-basedict") + (:keywords "convenience" "chinese" "pinyin" "input-method" + "complete") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors ("Feng Shu" . "tumashu@163.com")) + (:commit . "55d9b324831b0fc79ff62f1c6f21aad72341a114"))]) + (python + . [(0 30) + ((emacs (29 1)) (compat (29 1 1 0)) (seq (2 23)) (project (0 1)) + (flymake (1 0))) + "Python's flying circus support for Emacs" tar + ((:url . "https://github.com/fgallina/python.el") + (:keywords "languages") + (:maintainer nil . "emacs-devel@gnu.org") + (:authors ("Fabián E. Gallina" . "fgallina@gnu.org")) + (:commit . "672df0288b55f8bb7ebacdce5335f9e11955482e"))]) + (quarter-plane + . [(0 1) nil "editing using quarter-plane screen model" tar + ((:keywords "convenience" "wp") + (:url . "https://elpa.gnu.org/packages/quarter-plane.html") + (:commit . "8cf26bf19d0193068bef34dd0103e8a7ea566afa"))]) + (queue + . [(0 2) nil "Queue data structure" tar + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "data structures" "queue") + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:authors ("Inge Wallin" . "inge@lysator.liu.se") + ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:commit . "c9ec2e33f26b068c40b8391e91a7839546fa8355"))]) + (rainbow-mode + . [(1 0 6) nil "Colorize color names in buffers" tar + ((:keywords "faces") + (:maintainer "Julien Danjou" . "julien@danjou.info") + (:authors ("Julien Danjou" . "julien@danjou.info")) + (:url . "https://elpa.gnu.org/packages/rainbow-mode.html") + (:commit . "ac68593018ef3555e64ea592d72334f4e3e39209"))]) + (rbit + . [(0 1) nil "Red-black persistent interval trees" tar + ((:keywords "data structures" "binary tree" "intervals") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/rbit.html") + (:commit . "59da8b3219a9632e1ed4ce85f58a6f3c68b61684"))]) + (rcirc-color + . [(0 4 5) ((emacs (24 4))) "color nicks" tar + ((:keywords "comm") + (:maintainer "Alex Schroeder" . "alex@gnu.org") + (:authors ("Alex Schroeder" . "alex@gnu.org")) + (:url . "https://elpa.gnu.org/packages/rcirc-color.html") + (:commit . "79449152cb71ec4d719d4b1a95c1192fb9831ceb"))]) + (rcirc-mentions + . [(1 0 5) ((emacs (29 1))) + "Log mentions of your nick or keywords in a separate buffer" tar + ((:url . "https://sr.ht/~tsdh/rcirc-mentions/") + (:keywords "rcirc" "irc") + (:maintainer "Tassilo Horn" . "tsdh@gnu.org") + (:authors ("Tassilo Horn" . "tsdh@gnu.org")) + (:commit . "f48c86345110433cfcda669d3ad6500334371a34"))]) + (rcirc-menu + . [(1 1) nil "A menu of all your rcirc connections" single + ((:url . "http://elpa.gnu.org/packages/rcirc-menu.html") + (:keywords "comm") + (:authors ("Alex Schroeder" . "alex@gnu.org")) + (:maintainer "Alex Schroeder" . "alex@gnu.org"))]) + (rcirc-sqlite + . [(1 0 4) ((emacs (30 0))) "rcirc logging in SQLite" tar + ((:url . "https://codeberg.org/mattof/rcirc-sqlite") + (:keywords "comm") + (:maintainer "Matto Fransen" . "matto@matto.nl") + (:authors ("Matto Fransen" . "matto@matto.nl")) + (:commit . "349aabcbb6bd10b007f431d180e870a5918b9e21"))]) + (realgud + . [(1 5 1) + ((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 + ((:url . "http://github.com/realgud/realgud/") + (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" + "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")) + (:commit . "53938f04d5252677484e5c48513e1c138aafc756"))]) + (realgud-ipdb + . [(1 0 0) ((realgud (1 4 5)) (emacs (24))) + "realgud front-end to ipdb" tar + ((:url . "http://github.com/rocky/realgud-ipdb") + (:commit . "ba41636ac4102bdc9d28a5ae7177b3792be55933"))]) + (realgud-jdb + . [(1 0 0) + ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) + (emacs (25))) + "Realgud front-end to Java's jdb debugger\"" tar + ((:url . "http://github.com/realgud/realgud-jdb") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")))]) + (realgud-lldb + . [(1 0 2) ((load-relative (1 3 1)) (realgud (1 5 0)) (emacs (25))) + "Realgud front-end to lldb" tar + ((:url . "http://github.com/realgud/realgud-lldb") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")) + (:commit . "f2f77d6ddfa42430ead400eaf81c605c3a04dead"))]) + (realgud-node-debug + . [(1 0 0) + ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) + (emacs (25))) + "Realgud front-end to older \"node debug\"" tar + ((:url . "http://github.com/realgud/realgud-node-debug") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")))]) + (realgud-node-inspect + . [(1 0 0) + ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) + (emacs (24))) + "Realgud front-end to newer \"node inspect\"" tar + ((:url . "http://github.com/realgud/realgud-node-inspect") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")))]) + (realgud-trepan-ni + . [(1 0 1) + ((load-relative (1 2)) (realgud (1 5 0)) (cl-lib (0 5)) + (emacs (25))) + "Realgud front-end to trepan-ni" tar + ((:url . "http://github.com/realgud/realgud-trepan-ni") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")) + (:commit . "ce008862ea33de0a9e6c06099b9ddff8f620f2e4"))]) + (realgud-trepan-xpy + . [(1 0 1) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) + "Realgud front-end to trepan-xpy" tar + ((:url . "https://github.com/realgud/realgud-trepan-xpy") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")) + (:commit . "f758f48266d90775643454e72214e40a4ed320b8"))]) + (rec-mode + . [(1 9 4) ((emacs (25))) "Major mode for viewing/editing rec files" + tar + ((:url . "https://www.gnu.org/software/recutils/") + (:maintainer "Antoine Kalmbach" . "ane@iki.fi") + (:authors ("Jose E. Marchesi" . "jemarch@gnu.org")) + (:commit . "8d9b73870acdd0a282a5c2829b139a93a39366dc"))]) + (register-list + . [(0 1) nil "Interactively list/edit registers" tar + ((:keywords "register") + (:maintainer "Bastien Guerry" . "bzgATalternDOTorg") + (:authors ("Bastien Guerry" . "bzgATalternDOTorg")) + (:url . "https://elpa.gnu.org/packages/register-list.html") + (:commit . "14d719a6f3596856228f08d3746a7bf92dd13240"))]) + (relint + . [(2 1) ((xr (2 0)) (emacs (27 1))) "Elisp regexp mistake finder" + tar + ((:url . "https://github.com/mattiase/relint") + (:keywords "lisp" "regexps") + (:maintainer "Mattias Engdegård" . "mattiase@acm.org") + (:authors ("Mattias Engdegård" . "mattiase@acm.org")) + (:commit . "9eda48e439e13479151be4abbf47906326bc732f"))]) + (repology + . [(1 2 4) ((emacs (26 1))) "Repology API access via Elisp" tar + ((:keywords "web") + (:maintainer "Nicolas Goaziou" . "mail@nicolasgoaziou.fr") + (:authors ("Nicolas Goaziou" . "mail@nicolasgoaziou.fr")) + (:url . "https://elpa.gnu.org/packages/repology.html") + (:commit . "a6b41709525e60bdac807f153a3199003ee9d50f"))]) + (rich-minority + . [(1 0 3) ((cl-lib (0 5))) + "Clean-up and Beautify the list of minor-modes." tar + ((:url . "https://github.com/Malabarba/rich-minority") + (:keywords "mode-line" "faces") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:commit . "d33d2e357c8eb0b38624dbc51e8b953b08b0cc98"))]) + (rnc-mode + . [(0 3) nil "Emacs mode to edit Relax-NG Compact files" tar + ((:keywords "xml" "relaxng") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/rnc-mode.html") + (:commit . "dfee31d83208b734ed1d1fdc523565d7056db850"))]) + (rt-liberation + . [(7) nil "Emacs interface to RT" tar + ((:url . "http://www.nongnu.org/rtliber/") + (:keywords "rt" "tickets") + (:maintainer "Yoni Rabkin" . "yrk@gnu.org") + (:authors ("Yoni Rabkin" . "yrk@gnu.org")) + (:commit . "3b98d22c76de94fae16434517b99525fabc58f31"))]) + (ruby-end + . [(0 4 3) nil "Automatic insertion of end blocks for Ruby" tar + ((:url . "http://github.com/rejeep/ruby-end") + (:keywords "speed" "convenience" "ruby") + (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") + (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) + (:commit . "fe39d34ba7a43d522c7bdc47406935611e782ca3"))]) + (rudel + . [(0 3 2) + ((emacs (24)) (cl-lib (0 5)) (cl-generic (0 3)) (cl-print (1 0))) + "A collaborative editing framework for Emacs" tar + ((:url . "http://rudel.sourceforge.net/") + (:keywords "rudel" "collaboration") + (:maintainer "Jan Moringen" . "scymtym@users.sourceforge.net") + (:authors ("Jan Moringen" . "scymtym@users.sourceforge.net")) + (:commit . "42684c4fb26318291c8c06b184166c470d465ff4"))]) + (satchel + . [(0 2) ((emacs (27 2)) (project (0 8 1))) + "A bag for your files, separated by git branches" tar + ((:keywords "tools" "languages") + (:maintainer "Theodor Thornhill" . "theo@thornhill.no") + (:authors ("Theodor Thornhill" . "theo@thornhill.no")) + (:url . "https://elpa.gnu.org/packages/satchel.html") + (:commit . "6e5613e203f6937202cb5d55249e7e6be939067b"))]) + (scanner + . [(0 3) ((emacs (25 1)) (dash (2 12 0))) + "Scan documents and images" tar + ((:url . "https://codeberg.org/rstocker/scanner.git") + (:keywords "hardware" "multimedia") + (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de") + (:authors ("Raffael Stocker" . "r.stocker@mnet-mail.de")) + (:commit . "44eab47963a61e67cd4aa3a96a6762764367de5f"))]) + (scroll-restore + . [(1 0) nil "restore original position after scrolling" tar + ((:keywords "scrolling") + (:maintainer "Martin Rudalics" . "rudalics@gmx.at") + (:authors ("Martin Rudalics" . "rudalics@gmx.at")) + (:url . "https://elpa.gnu.org/packages/scroll-restore.html") + (:commit . "af8f3beae533c030d4899c235473aa15bfcb2010"))]) + (sed-mode + . [(1 1) nil "Major mode to edit sed scripts" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/sed-mode.html") + (:commit . "6009f57567959387b9e34068567e982b6991eb24"))]) + (seq + . [(2 24) nil "Sequence manipulation functions" tar + ((:keywords "sequences") + (:maintainer nil . "emacs-devel@gnu.org") + (:authors ("Nicolas Petton" . "nicolas@petton.fr")) + (:url . "https://elpa.gnu.org/packages/seq.html") + (:commit . "27a90793a13f149121180e864fa53d68b9eac0b3"))]) + (setup + . [(1 5 0) ((emacs (26 1))) "Helpful Configuration Macro" tar + ((:url . "https://codeberg.org/pkal/setup.el") + (:keywords "lisp" "local") + (:maintainer "Philip Kaludercic" . "philipk@posteo.net") + (:authors ("Philip Kaludercic" . "philipk@posteo.net")) + (:commit . "5a69dab9bb79d8bebaaa9bc14795cbaafd1c2423"))]) + (shelisp + . [(1 0 0) nil "execute elisp in shell" tar + ((:keywords "terminals" "lisp" "processes") + (:maintainer "Michael R. Mauger" . "michael@mauger.com") + (:authors ("Michael R. Mauger" . "michael@mauger.com")) + (:url . "https://elpa.gnu.org/packages/shelisp.html") + (:commit . "32f91342f0039aa0e78a032b5b2a651ed5b1b79e"))]) + (shell-command+ + . [(2 5 0) ((emacs (24 3))) "An extended shell-command" tar + ((:url . "https://codeberg.org/pkal/shell-command-plus.el") + (:keywords "unix" "processes" "convenience") + (:maintainer "Philip Kaludercic" . "philipk@posteo.net") + (:authors ("Philip Kaludercic" . "philipk@posteo.net")) + (:commit . "8388de44c488106a53913e7028b0e3f3859982bb"))]) + (shen-mode + . [(0 1) nil "A major mode for editing shen source code" tar + ((:keywords "languages" "shen") + (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") + (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) + (:url . "https://elpa.gnu.org/packages/shen-mode.html") + (:commit . "df28df31317188a6d87c9df93444543ace4f7f4f"))]) + (show-font + . [(1 0 0) ((emacs (29 1))) "Show font features in a buffer" tar + ((:url . "https://github.com/protesilaos/show-font") + (:keywords "convenience" "writing" "font") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "07c46e3b96d726a674ae3d42e27eb4193208efd9"))]) + (sisu-mode + . [(7 1 8) nil "Major mode for SiSU markup text" tar + ((:url . "http://www.sisudoc.org/") + (:keywords "text" "syntax" "processes" "tools") + (:commit . "456acbde87a9fa9da0ed8b441c3f22c4d5310296"))]) + (site-lisp + . [(0 2 0) ((emacs (25 1))) "Manage site-lisp directories" tar + ((:url . "https://codeberg.org/pkal/site-lisp.el") + (:keywords "lisp" "local") + (:maintainer "Philip Kaludercic" . "philipk@posteo.net") + (:authors ("Philip Kaludercic" . "philipk@posteo.net")) + (:commit . "3b0c3abab49cf4ab70a43e2c882bb8a2a6db45a1"))]) + (sketch-mode + . [(1 0 4) nil + "Quickly create svg sketches using keyboard and mouse" tar + ((:url . "https://github.com/dalanicolai/sketch-mode") + (:keywords "multimedia") + (:maintainer "D.L. Nicolai" . "dalanicolai@gmail.com") + (:authors ("D.L. Nicolai" . "dalanicolai@gmail.com")) + (:commit . "ff42a587d90f9cfd3481db6f4e9a269e3a9300cd"))]) + (slime-volleyball + . [(1 2 0) ((cl-lib (0 5))) "An SVG Slime Volleyball Game" tar + ((:keywords "games") + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) + (:url . "https://elpa.gnu.org/packages/slime-volleyball.html") + (:commit . "361d22bba0b03cd81331439c97f84583dd87c752"))]) + (sm-c-mode + . [(1 2) nil "C major mode based on SMIE" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/sm-c-mode.html") + (:commit . "a56142cb82d3390faa3dbd0658d65fe06822206d"))]) + (smalltalk-mode + . [(4 0) nil "Major mode for the GNU Smalltalk programming language" + tar + ((:maintainer "Derek Zhou" . "derek@3qin.us") + (:url . "https://elpa.gnu.org/packages/smalltalk-mode.html") + (:commit . "570b705db9a02bb48cd61652639401715f419447"))]) + (smart-yank + . [(0 1 1) ((emacs (24))) + "A different approach of yank pointer handling" tar + ((:keywords "convenience") + (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") + (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) + (:url . "https://elpa.gnu.org/packages/smart-yank.html") + (:commit . "673e1884d3ca537143415fc91b0b06a4ae02f164"))]) + (sml-mode + . [(6 12) ((emacs (24 3)) (cl-lib (0 5))) + "Major mode for editing (Standard) ML" tar + ((:keywords "sml") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Matthew Morley" . "mjm@scs.leeds.ac.uk") + ("Matthias Blume" . "blume@cs.princeton.edu") + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/sml-mode.html") + (:commit . "7ebf91114292eead967d1a9bb4f235d66f6dd525"))]) + (so-long + . [(1 1 2) ((emacs (24 4))) + "Say farewell to performance problems with minified code." tar + ((:url . "https://savannah.nongnu.org/projects/so-long") + (:keywords "convenience") + (:maintainer "Phil Sainty" . "psainty@orcon.net.nz") + (:authors ("Phil Sainty" . "psainty@orcon.net.nz")) + (:commit . "045a4fe94c18cd36ef297e62a80cdff449af3aa5"))]) + (soap-client + . [(3 2 3) ((emacs (24 1)) (cl-lib (0 6 1))) + "Access SOAP web services" tar + ((:url . "https://github.com/alex-hhh/emacs-soap-client") + (:keywords "soap" "web-services" "comm" "hypermedia") + (:maintainer "Alexandru Harsanyi" . "AlexHarsanyi@gmail.com") + (:authors ("Alexandru Harsanyi" . "AlexHarsanyi@gmail.com")) + (:commit . "6234c3e0411a1d70bed2c85bbfb438d4479be51b"))]) + (sokoban + . [(1 4 9) ((emacs (23 1)) (cl-lib (0 5))) + "Implementation of Sokoban for Emacs." tar + ((:keywords "games") + (:maintainer "Dieter Deyke" . "dieter.deyke@gmail.com") + (:authors ("Glynn Clements" . "glynn.clements@xemacs.org")) + (:url . "https://elpa.gnu.org/packages/sokoban.html") + (:commit . "3043723a7c2557443aa28d871137c8d9c3b46edc"))]) + (sotlisp + . [(1 6 2) ((emacs (24 1))) "Write lisp at the speed of thought." + tar + ((:url . "https://github.com/Malabarba/speed-of-thought-lisp") + (:keywords "convenience" "lisp") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:commit . "fffe8d0b42b143a2e7df0470d9049fa57b6ecac5"))]) + (spacious-padding + . [(0 8 0) ((emacs (28 1))) + "Increase the padding/spacing of frames and windows" tar + ((:url . "https://github.com/protesilaos/spacious-padding") + (:keywords "convenience" "focus" "writing" "presentation") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "9507cb206e1187c08574e8fa65c3fe6aeab84063"))]) + (speedrect + . [(0 7) ((emacs (29 1)) (compat (30))) + "Fast modal rectangle commands" tar + ((:url . "https://github.com/jdtsmith/speedrect") + (:keywords "convenience") + (:maintainer "JD Smith" . "jdtsmith+elpa@gmail.com") + (:authors ("JD Smith" . "jdtsmith+elpa@gmail.com")) + (:commit . "2232149c300343732f424c1b22db296455f4c0ac"))]) + (spinner + . [(1 7 4) ((emacs (24 3))) + "Add spinners and progress-bars to the mode-line for ongoing operations" + tar + ((:url . "https://github.com/Malabarba/spinner.el") + (:keywords "processes" "mode-line") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:commit . "bca794fa6f6b007292cdac9b0a850a3711986db5"))]) + (sql-beeline + . [(0 2) nil "Beeline support for sql.el" tar + ((:keywords "sql" "hive" "beeline" "hiveserver2" "impala") + (:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm") + (:authors ("Filipp Gunbin" . "fgunbin@fastmail.fm")) + (:url . "https://elpa.gnu.org/packages/sql-beeline.html") + (:commit . "b7ffff9404d93f569e3c2bc59db1be6e848c894f"))]) + (sql-cassandra + . [(0 2 2) ((emacs (29))) "Cassandra support for sql.el" tar + ((:keywords "sql" "cassandra" "cql" "cqlsh") + (:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm") + (:authors ("Filipp Gunbin" . "fgunbin@fastmail.fm")) + (:url . "https://elpa.gnu.org/packages/sql-cassandra.html") + (:commit . "3e997c6ad82f4240bcd62630ad44b5f023bd16c1"))]) + (sql-indent + . [(1 7) ((cl-lib (0 5))) "Support for indenting code in SQL files." + tar + ((:url . "https://github.com/alex-hhh/emacs-sql-indent") + (:keywords "languages" "sql") + (:maintainer "Alex Harsanyi" . "AlexHarsanyi@gmail.com") + (:authors ("Alex Harsanyi" . "AlexHarsanyi@gmail.com")) + (:commit . "323ece64acaac7f27b7806db9dba0757d6e57885"))]) + (srht + . [(0 4) ((emacs (27 1)) (plz (0 7)) (transient (0 4 3))) + "Sourcehut" tar + ((:url . "https://sr.ht/~akagi/srht.el/") (:keywords "comm" "vc") + (:maintainer "Aleksandr Vityazev" . "avityazev@posteo.org") + (:authors ("Aleksandr Vityazev" . "avityazev@posteo.org")) + (:commit . "053c79fb41278f11e98c61785e8cc500ed4c853b"))]) + (ssh-deploy + . [(3 1 16) ((emacs (25))) + "Deployment via Tramp, global or per directory." tar + ((:url . "https://github.com/cjohansson/emacs-ssh-deploy") + (:keywords "tools" "convenience") + (:maintainer "Christian Johansson" . "christian@cvj.se") + (:authors ("Christian Johansson" . "christian@cvj.se")) + (:commit . "95fb076c9b657c5f1bfad3ee5bf1f8691c50d428"))]) + (standard-themes + . [(3 0 2) ((emacs (28 1)) (modus-themes (5 0 0))) + "Like the default theme but more consistent" tar + ((:url . "https://github.com/protesilaos/standard-themes") + (:keywords "faces" "theme" "accessibility") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "3f7c8af249fff314c8e3694f1fdd7526f135a638"))]) + (stream + . [(2 4 0) ((emacs (25))) "Implementation of streams" tar + ((:keywords "stream" "laziness" "sequences") + (:maintainer nil . "nicolas@petton.fr") + (:authors ("Nicolas Petton" . "nicolas@petton.fr")) + (:url . "https://elpa.gnu.org/packages/stream.html") + (:commit . "b9b3ad5c38063703cfa5a06522031e631c49b7e3"))]) + (substitute + . [(0 4 0) ((emacs (27 1))) + "Efficiently replace targets in the buffer or context" tar + ((:url . "https://github.com/protesilaos/substitute") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "63818140b432212ea2d5314a27469c53535b61f8"))]) + (svg + . [(1 1) ((emacs (25))) "SVG image creation functions" tar + ((:keywords "image") + (:maintainer ("Lars Magne Ingebrigtsen" . "larsi@gnus.org") + ("Felix E. Klee" . "felix.klee@inka.de")) + (:authors ("Lars Magne Ingebrigtsen" . "larsi@gnus.org") + ("Felix E. Klee" . "felix.klee@inka.de")) + (:url . "https://elpa.gnu.org/packages/svg.html") + (:commit . "2c1d8397788c1385debef514c59a6461b2e5408e"))]) + (svg-clock + . [(1 2) ((svg (1 0)) (emacs (27 0))) + "Analog clock using Scalable Vector Graphics" tar + ((:keywords "demo" "svg" "clock") + (:maintainer "Ulf Jasper" . "ulf.jasper@web.de") + (:authors ("Ulf Jasper" . "ulf.jasper@web.de")) + (:url . "https://elpa.gnu.org/packages/svg-clock.html") + (:commit . "1c04475520a125432c4e873ca944323999a3ff83"))]) + (svg-lib + . [(0 3) ((emacs (27 1))) "SVG tags, progress bars & icons" tar + ((:url . "https://github.com/rougier/svg-lib") + (:keywords "svg" "icons" "tags" "convenience") + (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") + (:commit . "f2cc9615ef3a052747135d34f31c423a26592f14"))]) + (svg-tag-mode + . [(0 3 3) ((emacs (27 1)) (svg-lib (0 2))) + "Replace keywords with SVG tags" tar + ((:url . "https://github.com/rougier/svg-tag-mode") + (:keywords "convenience") + (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") + (:authors ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")) + (:commit . "49809d64e6b8084c6468d4a6ffe5523fd4dda8f4"))]) + (swiper + . [(0 15 1) ((emacs (24 5)) (ivy (0 15 1))) + "Isearch with an overview. Oh, man!" tar + ((:url . "https://github.com/abo-abo/swiper") + (:keywords "matching") + (:maintainer "Basil L. Contovounesios" . "basil@contovou.net") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:commit . "6f9d587e7e5250cccf1d7f67394fcc59313db755"))]) + (switchy-window + . [(1 3) ((emacs (25 1)) (compat (29 1 4 1))) + "A most-recently-used window switcher" tar + ((:url . "https://sr.ht/~tsdh/switchy-window/") + (:keywords "windows") + (:maintainer "Tassilo Horn" . "tsdh@gnu.org") + (:authors ("Tassilo Horn" . "tsdh@gnu.org")) + (:commit . "c743c47b7b4326c411470ba98410b7bfe3685edc"))]) + (sxhkdrc-mode + . [(1 2 0) ((emacs (27 1))) + "Major mode for sxhkdrc files (Simple X Hot Key Daemon)" tar + ((:url . "https://github.com/protesilaos/sxhkdrc-mode") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "f9bc3f6f8639d4ed9c2d848fdcc84fab4b1b6cae"))]) + (system-packages + . [(1 1 2) ((emacs (24 3))) "functions to manage system packages" + tar + ((:url . "https://gitlab.com/jabranham/system-packages") + (:maintainer "J. Alexander Branham" . "alex.branham@gmail.com") + (:authors ("J. Alexander Branham" . "alex.branham@gmail.com")) + (:commit . "de2a98caad223ded3b58512d8f44a8307a228a93"))]) + (tNFA + . [(0 1 1) ((queue (0 1))) + "Tagged non-deterministic finite-state automata" single + ((:keywords "extensions" "matching" "data structures tnfa" "nfa" + "dfa" "finite state automata" "automata" "regexp") + (:authors ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:url . "http://www.dr-qubit.org/emacs.php"))]) + (tam + . [(0 1) ((queue (0 2)) (emacs (24 3))) + "Manage use of slots in a fixed size table" tar + ((:url + . "https://github.com/owinebar/emacs-table-allocation-manager") + (:keywords "lisp" "tools") + (:maintainer "Onnie Lynn Winebarger" . "owinebar@gmail.com") + (:authors ("Onnie Lynn Winebarger" . "owinebar@gmail.com")) + (:commit . "c254ec9f646ef5527eb1f834a90e5897caa977cf"))]) + (taxy + . [(0 10 2) ((emacs (26 3))) + "Programmable taxonomical grouping for arbitrary objects" tar + ((:url . "https://github.com/alphapapa/taxy.el") + (:keywords "lisp") + (:maintainer "Adam Porter" . "adam@alphapapa.net") + (:authors ("Adam Porter" . "adam@alphapapa.net")) + (:commit . "3099ae5cb27a34961e06a3af67555919c62c12d7"))]) + (taxy-magit-section + . [(0 14 3) ((emacs (26 3)) (magit-section (3 2 1)) (taxy (0 10))) + "View Taxy structs in a Magit Section buffer" tar + ((:url . "https://github.com/alphapapa/taxy.el") + (:keywords "lisp") + (:maintainer "Adam Porter" . "adam@alphapapa.net") + (:authors ("Adam Porter" . "adam@alphapapa.net")) + (:commit . "19c67f4d2e7a87cb9aed8e17058c4cf4dfd75406"))]) + (temp-buffer-browse + . [(1 5) ((emacs (24))) "temp buffer browse mode" tar + ((:keywords "convenience") + (:maintainer "Leo Liu" . "sdl.web@gmail.com") + (:authors ("Leo Liu" . "sdl.web@gmail.com")) + (:url . "https://elpa.gnu.org/packages/temp-buffer-browse.html") + (:commit . "db6041b0413fdeefb1f1285e1d9c1039c10fbf04"))]) + (tempel + . [(1 9) ((emacs (29 1)) (compat (30))) + "Tempo templates/snippets with in-buffer field editing" tar + ((:url . "https://github.com/minad/tempel") + (:keywords "abbrev" "languages" "tools" "text") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "506a8d570c145f4df63a18921e34bac6bef3ebe0"))]) + (termint + . [(0 2) ((emacs (29 1))) "Run REPLs in a terminal backend" tar + ((:url . "https://github.com/milanglacier/termint.el") + (:maintainer "Milan Glacier" . "dev@milanglacier.com") + (:authors ("Milan Glacier" . "dev@milanglacier.com")) + (:commit . "b69db24ddbcd4b5973b3ae8e7f8b3c12dd0546b3"))]) + (test-simple + . [(1 3 1) ((cl-lib (0))) + "Simple Unit Test Framework for Emacs Lisp" tar + ((:url . "https://github.com/rocky/emacs-test-simple") + (:keywords "unit-test") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors ("Rocky Bernstein" . "rocky@gnu.org")) + (:commit . "da8ddb6fecb820c8e0809ac0892374e755e4efec"))]) + (tex-item + . [(0 1) ((emacs (27 1))) "Commands for working with tex items" tar + ((:url . "https://github.com/ultronozm/tex-item.el") + (:keywords "tex" "convenience") + (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com") + (:authors ("Paul D. Nelson" . "nelson.paul.david@gmail.com")) + (:commit . "ee1957f3bce6ed04627b985e95a17db190781e06"))]) + (tex-parens + . [(0 7) ((emacs (27 1))) "Like lisp.el, but for tex" tar + ((:url . "https://github.com/ultronozm/tex-parens.el") + (:keywords "tex" "convenience") + (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com") + (:authors ("Paul D. Nelson" . "nelson.paul.david@gmail.com")) + (:commit . "00e41b4110b4fc049513a1e31d4a00c295580026"))]) + (theme-buffet + . [(0 1 2) ((emacs (29 1))) "Time based theme switcher" tar + ((:url . "https://git.sr.ht/~bboal/theme-buffet") + (:maintainer "Theme-Buffet Development" + . "~bboal/general-issues@lists.sr.ht") + (:authors ("Bruno Boal" . "egomet@bboal.com") + ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:commit . "06f1be349e9c3d124520b18742911307de9abda3"))]) + (timeout + . [(2 1) ((emacs (24 4))) "Throttle or debounce Elisp functions" tar + ((:url . "https://github.com/karthink/timeout") + (:keywords "convenience" "extensions") + (:maintainer "Karthik Chikmagalur" + . "karthikchikmagalur@gmail.com") + (:authors + ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) + (:commit . "6d31046c5b1817271a52ab810e5bc635fe7ab3b4"))]) + (timerfunctions + . [(1 4 2) ((cl-lib (0 5)) (emacs (24))) + "Enhanced versions of some timer.el functions" single + ((:url . "http://elpa.gnu.org/packages/timerfunctions.html") + (:authors ("Dave Goel" . "deego3@gmail.com")) + (:maintainer "Dave Goel" . "deego3@gmail.com"))]) + (tiny + . [(0 2 1) nil "Quickly generate linear ranges in Emacs" tar + ((:url . "https://github.com/abo-abo/tiny") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "convenience"))]) + (tmr + . [(1 2 1) ((emacs (29 1))) "Set timers using a convenient notation" + tar + ((:url . "https://github.com/protesilaos/tmr") + (:keywords "convenience" "timer") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors ("Protesilaos Stavrou" . "info@protesilaos.com") + ("Damien Cassou" . "damien@cassou.me") + ("Daniel Mendler" . "mail@daniel-mendler.de") + ("Steven Allen" . "steven@stebalien.com")) + (:commit . "f6b62106b64d4ff99875fd10aad2950be06009e7"))]) + (tomelr + . [(0 4 3) ((emacs (26 3)) (map (3 2 1)) (seq (2 23))) + "Convert S-expressions to TOML" tar + ((:url . "https://github.com/kaushalmodi/tomelr/") + (:keywords "data" "tools" "toml" "serialization" "config") + (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com") + (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com")) + (:commit . "670e0a08f625175fd80137cf69e799619bf8a381"))]) + (topspace + . [(0 3 1) ((emacs (25 1))) + "Recenter line 1 with scrollable upper margin/padding" tar + ((:url . "https://github.com/trevorpogue/topspace") + (:keywords "convenience" "scrolling" "center" "cursor" "margin" + "padding") + (:maintainer "Trevor Edwin Pogue" . "trevor.pogue@gmail.com") + (:authors ("Trevor Edwin Pogue" . "trevor.pogue@gmail.com")) + (:commit . "33c2a6f0a11d1d88cdb2065c5a897e33507f4c86"))]) + (track-changes + . [(1 4) ((emacs (24))) "API to react to buffer modifications" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/track-changes.html") + (:commit . "ffb7d656a2c89f86ccd2de51379de9612c7a4aa3"))]) + (tramp + . [(2 8 0 5) ((emacs (28 1))) + "Transparent Remote Access, Multiple Protocol" tar + ((:url . "https://www.gnu.org/software/tramp/") + (:keywords "comm" "processes") + (:maintainer "Michael Albinus" . "michael.albinus@gmx.de") + (:authors ("Kai Großjohann" . "kai.grossjohann@gmx.net") + ("Michael Albinus" . "michael.albinus@gmx.de")) + (:commit . "ffb5b3473a4054e8d5499370cae50032227e8644"))]) + (tramp-hlo + . [(0 0 2) ((tramp (2 8 0 5))) + "High level operations as Tramp handlers" tar + ((:url . "https://github.com/jsadusk/tramp-hlo") + (:maintainer "Joe Sadusk" . "joe@sadusk.com") + (:authors ("Joe Sadusk" . "joe@sadusk.com")) + (:commit . "a204c14a2eed4c92a455f12acae2ec7eeac6d8fd"))]) + (tramp-nspawn + . [(1 0 1) ((emacs (23))) + "Tramp integration for systemd-nspawn containers" tar + ((:url . "https://github.com/bjc/tramp-nspawn") + (:keywords "tramp" "nspawn" "machinectl" "systemd" + "systemd-nspawn") + (:maintainer "Brian Cully" . "bjc@kublai.com") + (:authors ("Brian Cully" . "bjc@kublai.com")) + (:commit . "c35ade49754e051c84eaa2733447b4307968f200"))]) + (tramp-theme + . [(0 3) ((emacs (24 1))) "Custom theme for remote buffers" tar + ((:keywords "convenience" "faces") + (:maintainer "Michael Albinus" . "michael.albinus@gmx.de") + (:authors ("Michael Albinus" . "michael.albinus@gmx.de")) + (:url . "https://elpa.gnu.org/packages/tramp-theme.html") + (:commit . "f89f0c8ac25455ae59ae3e4bd8c8cb673e16130e"))]) + (transcribe + . [(1 5 2) nil "Package for audio transcriptions" tar + ((:maintainer "David Gonzalez Gandara" + . "dggandara@member.fsf.org") + (:authors + ("David Gonzalez Gandara" . "dggandara@member.fsf.org")) + (:url . "https://elpa.gnu.org/packages/transcribe.html") + (:commit . "89832e4cdc1e6d8262a4a2c9d1ff70f398b8faf0"))]) + (transient + . [(0 11 0) + ((emacs (28 1)) (compat (30 1)) (cond-let (0 2)) (seq (2 24))) + "Transient commands" tar + ((:url . "https://github.com/magit/transient") + (:keywords "extensions") + (:maintainer "Jonas Bernoulli" + . "emacs.transient@jonas.bernoulli.dev") + (:authors + ("Jonas Bernoulli" . "emacs.transient@jonas.bernoulli.dev")) + (:commit . "0d3f8d4fb6d41b841126820a06ecc98579bd8265"))]) + (transient-cycles + . [(2 0) ((emacs (29 1))) + "Define command variants with transient cycling" tar + ((:url + . "https://git.spwhitton.name/dotfiles/tree/.emacs.d/site-lisp/transient-cycles.el") + (:keywords "buffer" "window" "processes" "minor-mode" + "convenience") + (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name") + (:authors ("Sean Whitton" . "spwhitton@spwhitton.name")) + (:commit . "11e547c11b84fa81bb4ef8ec33ee777f96576e8c"))]) + (tree-inspector + . [(0 4) ((emacs (27 1)) (treeview (1 1 0))) + "Inspector tool for Emacs Lisp object that uses a treeview" tar + ((:url . "https://github.com/mmontone/emacs-inspector") + (:keywords "debugging" "tool" "lisp" "development") + (:maintainer "Mariano Montone" . "marianomontone@gmail.com") + (:authors ("Mariano Montone" . "marianomontone@gmail.com")) + (:commit . "bbb8d2dfe84fbf857fcc1579de5a1324b09a877e"))]) + (trie + . [(0 6) ((tNFA (0 1 1)) (heap (0 3))) "Trie data structure" tar + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "matching" "data structures trie" + "ternary search tree" "tree" "completion" "regexp") + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:authors ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:commit . "e7326a61b1cd2605867063fcfc5ddddaeed6d993"))]) + (triples + . [(0 6 1) ((seq (2 0)) (emacs (28 1))) + "A flexible triple-based database for use in apps" tar + ((:url . "https://github.com/ahyatt/triples") + (:keywords "triples" "kg" "data" "sqlite") + (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") + (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) + (:commit . "f2b8fe6d500e3543bece24381fd4ce34a171c860"))]) + (ulisp-repl + . [(1 0 3) ((emacs (26 1))) "uLisp REPL" tar + ((:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) + (:url . "https://elpa.gnu.org/packages/ulisp-repl.html") + (:commit . "63e38a9080b2d15146680022e20700db6eb20657"))]) + (undo-tree + . [(0 8 2) ((queue (0 2))) "Treat undo history as a tree" tar + ((:url . "https://www.dr-qubit.org/undo-tree.html") + (:keywords "convenience" "files" "undo" "redo" "history" "tree") + (:maintainer "Toby Cubitt" . "toby-undo-tree@dr-qubit.org") + (:authors ("Toby Cubitt" . "toby-undo-tree@dr-qubit.org")) + (:commit . "42aab056e37e033816b2d192f9121b89410b958e"))]) + (uni-confusables + . [(0 3) nil "Unicode confusables table" tar + ((:maintainer "Teodor Zlatanov" . "tzz@lifelogs.com") + (:url . "https://elpa.gnu.org/packages/uni-confusables.html") + (:commit . "393e1adeec5b0eb51f9606983655cfe2272c6e54"))]) + (uniquify-files + . [(1 0 4) ((emacs (25 0))) + "Completion style for files, minimizing directories" tar + ((:keywords "completion" "table" "uniquify") + (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:url . "https://elpa.gnu.org/packages/uniquify-files.html") + (:commit . "1d76b4f0e283afaff2be053d85f8726ffc3abd6e"))]) + (urgrep + . [(0 5 2) ((emacs (27 1)) (compat (29 1 0 1)) (project (0 3 0))) + "Universal recursive grep" tar + ((:url . "https://github.com/jimporter/urgrep") + (:keywords "grep" "search") + (:commit . "d53d3168e52b021738515491de391d66e4bf865c"))]) + (url-http-ntlm + . [(2 0 6) ((emacs (24 4)) (ntlm (2 1 0))) + "NTLM authentication for the url library" tar + ((:url . "https://code.google.com/p/url-http-ntlm/") + (:keywords "comm" "data" "processes" "hypermedia") + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors ("Tom Schutzer-Weissmann" . "tom.weissmann@gmail.com")) + (:commit . "234228e02682b9000015f5aa668875ea5d4fe6f0"))]) + (url-http-oauth + . [(0 8 4) ((emacs (24 4))) "OAuth 2.0 for URL library" tar + ((:keywords "comm" "data" "processes" "hypermedia") + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) + (:url . "https://elpa.gnu.org/packages/url-http-oauth.html") + (:commit . "f951bb71c5c34542cc75940d5e179d023f352ad4"))]) + (url-scgi + . [(0 9) ((emacs (24 3))) "SCGI support for url.el" tar + ((:url . "https://github.com/skangas/url-scgi/") + (:keywords "comm" "data" "processes" "scgi") + (:maintainer "Stefan Kangas" . "stefankangas@gmail.com") + (:authors ("Stefan Kangas" . "stefankangas@gmail.com")) + (:commit . "ccf30c3647cd6a560cadc795bd92769c0a0c9de9"))]) + (use-package + . [(2 4 6) ((emacs (24 3)) (bind-key (2 4))) + "A configuration macro for simplifying your .emacs" tar + ((:url . "https://github.com/jwiegley/use-package") + (:keywords "dotemacs" "startup" "speed" "config" "package" + "extensions") + (:maintainer "John Wiegley" . "johnw@newartisans.com") + (:authors ("John Wiegley" . "johnw@newartisans.com")) + (:commit . "d8e9eb73c2b5f93adf3ae29d1349ce2161e23cb4"))]) + (validate + . [(1 0 4) ((emacs (24 1)) (cl-lib (0 5)) (seq (2 16))) + "Schema validation for Emacs-lisp" tar + ((:keywords "lisp") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:url . "https://elpa.gnu.org/packages/validate.html") + (:commit . "2bc1a7c5f09de5deb7f27b2b4ed731271f9f3f05"))]) + (valign + . [(3 1 1) ((emacs (26 0))) "Visually align tables" tar + ((:url . "https://github.com/casouri/valign") + (:keywords "convenience" "text" "table") + (:maintainer "Yuan Fu" . "casouri@gmail.com") + (:authors ("Yuan Fu" . "casouri@gmail.com")) + (:commit . "421c8c0cb4636e5fd87ac1022d6b8268c320f74f"))]) + (vc-backup + . [(1 1 1) ((emacs (24 3)) (compat (28 1 1 0))) + "VC backend for versioned backups" tar + ((:url . "https://codeberg.org/pkal/vc-backup.el") + (:keywords "vc") + (:maintainer "Philip Kaludercic" . "philipk@posteo.net") + (:authors ("Philip Kaludercic" . "philipk@posteo.net")) + (:commit . "28412c81c3b046616fd8edf82d05bb2d83d0c306"))]) + (vc-got + . [(1 2) ((emacs (25 1))) "VC backend for Game of Trees VCS" tar + ((:url . "https://projects.omarpolo.com/vc-got.html") + (:keywords "vc" "tools") + (:maintainer ("Omar Polo" . "op@omarpolo.com") + ("Timo Myyrä" . "timo.myyra@bittivirhe.fi")) + (:authors ("Omar Polo" . "op@omarpolo.com") + ("Timo Myyrä" . "timo.myyra@bittivirhe.fi")) + (:commit . "bc158324418fd8bef96a7f62856679de2569030f"))]) + (vc-hgcmd + . [(1 14 1) ((emacs (25 1))) + "VC mercurial backend that uses hg command server" tar + ((:url . "https://github.com/muffinmad/emacs-vc-hgcmd") + (:keywords "vc") + (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") + (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) + (:commit . "d044448965d31ca8214f8bca48487e4d9b9d9a0f"))]) + (vc-jj + . [(0 5) ((emacs (28 1)) (compat (29 4))) + "VC backend for the Jujutsu version control system" tar + ((:url . "https://codeberg.org/emacs-jj-vc/vc-jj.el") + (:keywords "vc" "tools") + (:maintainer ("Rudolf Schlatte" . "rudi@constantly.at") + ("Kristoffer Balintona" . "krisbalintona@gmail.com")) + (:authors ("Rudolf Schlatte" . "rudi@constantly.at") + ("Kristoffer Balintona" . "krisbalintona@gmail.com")) + (:commit . "13b00216330c381179659f5210472fe975c2805d"))]) + (vcard + . [(0 2 2) ((emacs (27 1))) "Package for handling vCard files" tar + ((:keywords "vcard" "mail" "news") + (:maintainer ("Noah Friedman" . "friedman@splode.com") + ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:authors ("Noah Friedman" . "friedman@splode.com")) + (:url . "https://elpa.gnu.org/packages/vcard.html") + (:commit . "28b88fd8ed53ca12d9499175217af81f5ea161fc"))]) + (vcl-mode + . [(1 1) nil "Major mode for Varnish Configuration Language" tar + ((:keywords "varnish" "vcl") + (:maintainer "Sergey Poznyakoff" . "gray@gnu.org.ua") + (:authors ("Sergey Poznyakoff" . "gray@gnu.org.ua")) + (:url . "https://elpa.gnu.org/packages/vcl-mode.html") + (:commit . "ff7331de91e399af4b222cad0b0a1d445f82b333"))]) + (vdiff + . [(0 2 4) ((emacs (24 4)) (hydra (0 13 0))) + "A diff tool similar to vimdiff" tar + ((:url . "https://github.com/justbur/emacs-vdiff") + (:keywords "diff") + (:maintainer "Justin Burkett" . "justin@burkett.cc") + (:authors ("Justin Burkett" . "justin@burkett.cc")) + (:commit . "007e44be19d068fd6b49874b6e9b8df8b1f552bd"))]) + (vecdb + . [(0 2 2) ((emacs (29 1)) (plz (0 8)) (pg (0 56))) + "An interface to vector databases for embeddings" tar + ((:url . "https://github.com/ahyatt/vecdb") + (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") + (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) + (:commit . "a0240be7a917dca47b95e401382affd1c11abea1"))]) + (verilog-mode + . [(2025 11 8 248496848) nil + "major mode for editing verilog source in Emacs" tar + ((:url . "https://www.veripool.org") (:keywords "languages") + (:maintainer ("Michael McNamara" . "mac@verilog.com") + ("Wilson Snyder" . "wsnyder@wsnyder.org")) + (:authors ("Michael McNamara" . "mac@verilog.com") + ("Wilson Snyder" . "wsnyder@wsnyder.org")) + (:commit . "266335374e29cfd304838b2109af93ab22f6009f"))]) + (vertico + . [(2 6) ((emacs (29 1)) (compat (30))) + "VERTical Interactive COmpletion" tar + ((:url . "https://github.com/minad/vertico") + (:keywords "convenience" "files" "matching" "completion") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:commit . "8cff876a15203d24c42e19585fe6dcce8f735bbe"))]) + (vertico-posframe + . [(0 9 0) ((emacs (26 0)) (posframe (1 4 0)) (vertico (2 5))) + "Using posframe to show Vertico" tar + ((:url . "https://github.com/tumashu/vertico-posframe") + (:keywords "abbrev" "convenience" "matching" "vertico") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors ("Feng Shu" . "tumashu@163.com")) + (:commit . "d89a70743cfd95b7fcda621679b7555bbef51acb"))]) + (vigenere + . [(1 0) ((emacs (25 1))) + "Run a vigenere cipher on a block of text ;" tar + ((:url . "https://elpa.gnu.org/packages/vigenere.html") + (:keywords "data" "vigenere" "cipher") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors ("Ian Dunn" . "dunni@gnu.org")) + (:commit . "434270403845789f4be32102c573ea965e870d19"))]) + (visual-filename-abbrev + . [(1 3) ((emacs (26 1))) "Visually abbreviate filenames" tar + ((:keywords "tools") + (:maintainer "Tassilo Horn" . "tsdh@gnu.org") + (:authors ("Tassilo Horn" . "tsdh@gnu.org")) + (:url + . "https://elpa.gnu.org/packages/visual-filename-abbrev.html") + (:commit . "4af7868db7bbc6a3c185540ba4e257d4c4c560c0"))]) + (visual-fill + . [(0 2) nil "Auto-refill paragraphs without modifying the buffer" + tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/visual-fill.html") + (:commit . "1951eaf59e25091d5597cc45e3dd5925be005122"))]) + (vlf + . [(1 7 2) nil "View Large Files" tar + ((:url . "https://github.com/m00natic/vlfi") + (:keywords "large files" "utilities") + (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") + (:commit . "efffeb5f54191d41a503d1d51343bb327fe2f871"))]) + (vundo + . [(2 4 0) ((emacs (28 1))) "Visual undo tree" tar + ((:url . "https://github.com/casouri/vundo") + (:keywords "undo" "text" "editing") + (:maintainer "Yuan Fu" . "casouri@gmail.com") + (:authors ("Yuan Fu" . "casouri@gmail.com")) + (:commit . "b89f719824fe5da0f6a7590fad3ece798fd59909"))]) + (wcheck-mode + . [(2021) nil "General interface for text checkers" tar + ((:url . "https://github.com/tlikonen/wcheck-mode") + (:keywords "text" "spell" "check" "languages" "ispell") + (:maintainer "Teemu Likonen" . "tlikonen@iki.fi") + (:authors ("Teemu Likonen" . "tlikonen@iki.fi")) + (:commit . "e1c86e6f9e150ed25efb58fcf21db374b1b7f519"))]) + (wconf + . [(0 2 1) ((emacs (24 4))) "Minimal window layout manager" tar + ((:url . "https://github.com/ilohmar/wconf") + (:keywords "windows" "frames" "layout") + (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") + (:authors ("Ingo Lohmar" . "i.lohmar@gmail.com")) + (:commit . "833ae431a5b35739be3076ea4b586d84d6fe269f"))]) + (web-server + . [(0 1 2) ((emacs (24 3))) "Emacs Web Server" tar + ((:url . "https://github.com/eschulte/emacs-web-server") + (:keywords "http" "server" "network") + (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") + (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) + (:commit . "33afdb46e1cd61251736816d965495525b36c9cd"))]) + (webfeeder + . [(1 1 2) ((emacs (25 1))) + "Build RSS and Atom webfeeds from HTML files" tar + ((:url . "https://gitlab.com/Ambrevar/emacs-webfeeder") + (:keywords "news" "hypermedia" "blog" "feed" "rss" "atom") + (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") + (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) + (:commit . "6037848ee495a67510d8b43f1fbe319b76dbd859"))]) + (websocket + . [(1 15) ((cl-lib (0 5))) "Emacs WebSocket client and server" tar + ((:url . "https://github.com/ahyatt/emacs-websocket") + (:keywords "communication" "websocket" "server") + (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") + (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) + (:commit . "40c208eaab99999d7c1e4bea883648da24c03be3"))]) + (which-key + . [(3 6 1) ((emacs (25 1))) "Display available keybindings in popup" + tar + ((:maintainer "Justin Burkett" . "justin@burkett.cc") + (:authors ("Justin Burkett" . "justin@burkett.cc")) + (:url . "https://elpa.gnu.org/packages/which-key.html") + (:commit . "34b832fce1d01c22aa644196cd6e6b50b1d403ee"))]) + (window-commander + . [(3 0 2) ((emacs (27 1))) "Simply execute commands on windows" tar + ((:url . "https://dsemy.com/projects/window-commander") + (:keywords "convenience") + (:maintainer "Daniel Semyonov" . "daniel@dsemy.com") + (:authors ("Daniel Semyonov" . "daniel@dsemy.com")) + (:commit . "ad92c184ccc06f46b2caf001bc8201d983eca626"))]) + (window-tool-bar + . [(0 3) ((emacs (27 1)) (compat (29 1))) + "Add tool bars inside windows" tar + ((:url . "http://github.com/chaosemer/window-tool-bar") + (:keywords "mouse") + (:maintainer "Jared Finder" . "jared@finder.org") + (:authors ("Jared Finder" . "jared@finder.org")) + (:commit . "72bbbff7e8128fe14c0b69c7282667788758b8b4"))]) + (windower + . [(0 0 1) ((emacs (25))) + "Helper functions for window manipulation." single + ((:keywords "convenience" "tools") + (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) + (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") + (:url . "https://gitlab.com/ambrevar/windower"))]) + (windresize + . [(0 1) nil "Resize windows interactively" tar + ((:keywords "window") + (:maintainer "Bastien" . "bzgATalternDOTorg") + (:authors ("Bastien" . "bzgATalternDOTorg")) + (:url . "https://elpa.gnu.org/packages/windresize.html") + (:commit . "0693d5d864ac9fd033c868bdd887e66278e056e9"))]) + (wisi + . [(4 3 2) ((emacs (25 3)) (seq (2 20))) + "Utilities for implementing an indentation/navigation engine using a generalized LR parser" + tar + ((:url . "https://stephe-leake.org/ada/wisitoken.html") + (:keywords "parser" "indentation" "navigation") + (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:commit . "1c4b099bf1f93cebee523b0ba75ccab6c6c2a2f0"))]) + (wisitoken-grammar-mode + . [(1 3 0) ((wisi (4 2 2)) (emacs (25 3)) (mmm-mode (0 5 7))) + "Major mode for editing WisiToken grammar files" tar + ((:url . "https://www.nongnu.org/ada-mode/") + (:keywords "languages") + (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:commit . "2d58879cea26b8a3b573d084d149dea94f93dfb8"))]) + (wpuzzle + . [(1 1) nil "find as many word in a given time" tar + ((:maintainer "Ivan Kanis" . "ivan@kanis.fr") + (:authors ("Ivan Kanis" . "ivan@kanis.fr")) + (:url . "https://elpa.gnu.org/packages/wpuzzle.html") + (:commit . "9373cbc013b978b31e38822bfdcc9a7fc5e0ed99"))]) + (wrap-search + . [(4 17 6) nil "wrapped, non-incremental search" tar + ((:url . "https://dataswamp.org/~incal/elpa/wrap-search.el") + (:keywords "matching") + (:maintainer "Emanuel Berg" . "incal@dataswamp.org") + (:authors ("Emanuel Berg" . "incal@dataswamp.org")) + (:commit . "980081a476dce22032e31b50eb4e34d54dc4788c"))]) + (xclip + . [(1 11 1) nil "Copy&paste GUI clipboard from text terminal" tar + ((:keywords "convenience" "tools") + (:maintainer "Leo Liu" . "sdl.web@gmail.com") + (:authors ("Leo Liu" . "sdl.web@gmail.com")) + (:url . "https://elpa.gnu.org/packages/xclip.html") + (:commit . "7febe164de2a881b83b9d604d3c7cf20b69f422d"))]) + (xeft + . [(3 6) ((emacs (26 0))) "Deft feat. Xapian" tar + ((:url . "https://sr.ht/~casouri/xeft") + (:keywords "applications" "note" "searching") + (:maintainer "Yuan Fu" . "casouri@gmail.com") + (:authors ("Yuan Fu" . "casouri@gmail.com")) + (:commit . "6c63bc4c40eae8fe7a3213efe11b75dfe73aaaa4"))]) + (xelb + . [(0 22) ((emacs (27 1)) (compat (30))) + "X protocol Emacs Lisp Binding" tar + ((:url . "https://github.com/emacs-exwm/xelb") (:keywords "unix") + (:maintainer + ("Adrián Medraño Calvo" . "adrian@medranocalvo.com") + ("Steven Allen" . "steven@stebalien.com") + ("Daniel Mendler" . "mail@daniel-mendler.de")) + (:authors ("Chris Feng" . "chris.w.feng@gmail.com")) + (:commit . "9e007c9eb595cd5d58e749c7679201bda999a229"))]) + (xpm + . [(1 0 5) ((cl-lib (0 5)) (queue (0 2))) "edit XPM images" tar + ((:url . "https://www.gnuvola.org/software/xpm/") + (:keywords "multimedia" "xpm") + (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") + (:authors ("Thien-Thi Nguyen" . "ttn@gnu.org")) + (:commit . "85e5c412dde7ec3c3f64c64d37079e233293e4d0"))]) + (xr + . [(2 1) ((emacs (27 1))) "Convert string regexp to rx notation" tar + ((:url . "https://github.com/mattiase/xr") + (:keywords "lisp" "regexps") + (:maintainer "Mattias Engdegård" . "mattiase@acm.org") + (:authors ("Mattias Engdegård" . "mattiase@acm.org")) + (:commit . "31cd397f54591e3692bf88d6e1995236928e3561"))]) + (xref + . [(1 7 0) ((emacs (26 1))) "Cross-referencing commands" tar + ((:url . "https://elpa.gnu.org/packages/xref.html") + (:commit . "cef848fe5f355ca34abc176739d0ace835b12eed"))]) + (xref-union + . [(0 2 0) ((emacs (25 1))) "Combine multiple Xref backends" tar + ((:url . "https://git.sr.ht/~pkal/xref-union/") + (:maintainer "Philip Kaludercic" + . "~pkal/public-inbox@lists.sr.ht") + (:authors ("Philip Kaludercic" . "philipk@posteo.net")) + (:commit . "2bb88d0dc526177c3c6612d6585cee6b2c57803a"))]) + (yaml + . [(1 2 1) ((emacs (25 1))) "YAML parser for Elisp" tar + ((:url . "https://github.com/zkry/yaml.el") (:keywords "tools") + (:maintainer "Zachary Romero" . "zkry@posteo.org") + (:authors ("Zachary Romero" . "zkry@posteo.org")) + (:commit . "3fbeaee97dce3c76a18b02a28c58777cbcdadf2f"))]) + (yasnippet + . [(0 14 3) ((cl-lib (0 5)) (emacs (24 4))) + "Yet another snippet extension for Emacs" tar + ((:url . "http://github.com/joaotavora/yasnippet") + (:keywords "convenience" "emulation") + (:maintainer "Noam Postavsky" . "npostavs@gmail.com") + (:commit . "dd570a6b22364212fff9769cbf4376bdbd7a63c5"))]) + (yasnippet-classic-snippets + . [(1 0 2) ((yasnippet (0 9 1))) "\"Classic\" yasnippet snippets" + tar + ((:keywords "snippets") + (:maintainer "Noam Postavsky" . "npostavs@gmail.com") + (:url + . "https://elpa.gnu.org/packages/yasnippet-classic-snippets.html") + (:commit . "43ff0337f5ec504f2a496f2f035a5087cd8e2074"))]) + (zones + . [(2023 6 11) nil "Zones of text - like multiple regions" tar + ((:url . "https://elpa.gnu.org/packages/zones.html") + (:keywords "narrow" "restriction" "widen" "region" "zone") + (:maintainer "Drew Adams" . "drew.adams@oracle.com") + (:commit . "10ebf386d48725fa3af2f8b0c60ad4ffa0ec9653"))]) + (ztree + . [(1 0 6) ((cl-lib (0))) "Text mode directory tree" tar + ((:url . "https://github.com/fourier/ztree") + (:keywords "files" "tools") + (:maintainer "Alexey Veretennikov" + . "alexey.veretennikov@gmail.com") + (:authors + ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) + (:commit . "c9ad9136d52ca5a81475693864e255d29448f43f"))]) + (zuul + . [(0 4 0) ((emacs (27 1)) (project (0 8 1))) "Interface to Zuul" + tar + ((:url . "https://sr.ht/~niklaseklund/zuul.el") + (:keywords "convenience" "tools") + (:maintainer "zuul.el Development" + . "~niklaseklund/zuul.el@lists.sr.ht") + (:authors ("Niklas Eklund" . "niklas.eklund@posteo.net")) + (:commit . "c94886cb7abdea66ba1d0a064a4d93efed10fed4"))])) diff --git a/.packages/archives/gnu/archive-contents.signed b/.packages/archives/gnu/archive-contents.signed new file mode 100644 index 0000000..89d776a --- /dev/null +++ b/.packages/archives/gnu/archive-contents.signed @@ -0,0 +1 @@ +Good signature from 645357D2883A0966 GNU ELPA Signing Agent (2023) (trust undefined) created at 2025-12-26T10:05:02+0000 using EDDSA \ No newline at end of file diff --git a/.packages/archives/melpa/archive-contents b/.packages/archives/melpa/archive-contents new file mode 100644 index 0000000..6961bd7 --- /dev/null +++ b/.packages/archives/melpa/archive-contents @@ -0,0 +1,6059 @@ +(1 + (0blayout . [(20190703 527) nil "Layout grouping with ease" tar ((:url . "https://github.com/etu/0blayout") (:commit . "fd9a8f353dbd45b4628b5f84b8d8c2525ebf571d") (:revdesc . "fd9a8f353dbd") (:keywords "convenience" "window-management"))]) + (0x0 . [(20230823 2214) ((emacs (26 1))) "Upload sharing to 0x0.st" tar ((:url . "https://git.sr.ht/~willvaughn/emacs-0x0") (:commit . "04f95142b25d8bb701f239539176df6617dcd982") (:revdesc . "04f95142b25d") (:authors ("William Vaughn" . "vaughnwilld@gmail.com")) (:maintainers ("William Vaughn" . "vaughnwilld@gmail.com")) (:maintainer "William Vaughn" . "vaughnwilld@gmail.com"))]) + (0xc . [(20201025 2105) ((emacs (24 4)) (s (1 11 0))) "Base conversion made easy" tar ((:url . "http://github.com/AdamNiederer/0xc") (:commit . "5bd6c0c901d03d1f24a3ddcf3a62d3b6d2428c80") (:revdesc . "5bd6c0c901d0") (:keywords "base" "conversion") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com"))]) + (2048-game . [(20230809 356) ((emacs (24 3))) "Play 2048 in Emacs" tar ((:url . "https://hg.sr.ht/~zck/game-2048") (:commit . "8175ca5191175183b9522141dcb55d30673d2323") (:revdesc . "8175ca519117") (:authors ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainers ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainer "Zachary Kanfer" . "zkanfer@gmail.com"))]) + (2bit . [(20200926 1418) ((emacs (24 3))) "Library for reading data from 2bit files" tar ((:url . "https://github.com/davep/2bit.el") (:commit . "69b4ec1d6d2ad95c9e59dacb43224abbec7a8989") (:revdesc . "69b4ec1d6d2a") (:keywords "files" "data") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (750words . [(20220625 1407) ((emacs (24 4))) "Emacs integration and Org exporter for 750words.com" tar ((:url . "https://github.com/zzamboni/750words-client") (:commit . "43eee19428fc8f5a133192398510d7313eb33d97") (:revdesc . "43eee19428fc") (:keywords "files" "org" "writing") (:authors ("Diego Zamboni" . "https://github.com/zzamboni")) (:maintainers ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org"))]) + (@ . [(20240923 1318) ((emacs (24 3))) "Multiple-inheritance prototype-based objects DSL" tar ((:url . "https://github.com/skeeto/at-el") (:commit . "0489e15cd0bc2fd9da56a4147f9083c6d816ebb9") (:revdesc . "0489e15cd0bc") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (a . [(20210929 1510) ((emacs (25))) "Associative data structure functions" tar ((:url . "https://github.com/plexus/a.el") (:commit . "9ad2d18252b729174fe22ed0b2b7670c88f60c31") (:revdesc . "9ad2d18252b7") (:keywords "lisp") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net"))]) + (aa-edit-mode . [(20170119 320) ((emacs (24 3)) (navi2ch (2 0 0))) "Major mode for editing AA(S_JIS Art) and .mlt file" tar ((:url . "https://github.com/zonuexe/aa-edit-mode") (:commit . "1dd801225b7ad3c23ad09698f5e77f0df7012a65") (:revdesc . "1dd801225b7a") (:keywords "wp" "text" "shiftjis" "mlt" "yaruo") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (aangit . [(20231106 2115) ((emacs (29 1)) (transient (0 4)) (s (1 13))) "Quickly scaffold new Angular apps with Aangit" tar ((:url . "https://github.com/stephenwithav/aangit") (:commit . "7527a366c542cb7b09672597876e83f429ca6b46") (:revdesc . "7527a366c542") (:keywords "angular" "tools") (:authors ("Steven Edwards" . "steven@stephenwithav.io")) (:maintainers ("Steven Edwards" . "steven@stephenwithav.io")) (:maintainer "Steven Edwards" . "steven@stephenwithav.io"))]) + (aas . [(20230303 2214) ((emacs (26 3))) "Snippet expansions mid-typing" tar ((:url . "https://github.com/ymarco/auto-activating-snippets") (:commit . "ddc2b7a58a2234477006af348b30e970f73bc2c1") (:revdesc . "ddc2b7a58a22") (:keywords "abbrev" "tools") (:authors ("Yoav Marco" . "yoavm448@gmail.com")) (:maintainers ("Yoav Marco" . "yoavm448@gmail.com")) (:maintainer "Yoav Marco" . "yoavm448@gmail.com"))]) + (abc-mode . [(20220713 1359) nil "Major mode for editing abc music files" tar ((:url . "https://github.com/mkjunker/abc-mode") (:commit . "45193b67508861cf77da7e76b71711855c002caa") (:revdesc . "45193b675088") (:keywords "local" "docs") (:authors ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainers ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainer "Matthew K. Junker" . "junker@alum.mit.edu"))]) + (abgaben . [(20171119 646) ((pdf-tools (0 80)) (f (0 19 0)) (s (1 11 0))) "Review and correct assignments received by mail" tar ((:url . "http://arne.chark.eu/") (:commit . "966bfcfdd3b2e288576ffe363d676ad282902090") (:revdesc . "966bfcfdd3b2") (:keywords "mail" "outlines" "convenience") (:authors ("Arne Köhn" . "arne@chark.eu")) (:maintainers ("Arne Köhn" . "arne@chark.eu")) (:maintainer "Arne Köhn" . "arne@chark.eu"))]) + (abl-mode . [(20240423 1214) nil "Python TDD minor mode" tar ((:url . "http://github.com/afroisalreadyinu/abl-mode") (:commit . "e918290b279112c367787ac704398d66759e5298") (:revdesc . "e918290b2791") (:authors ("Ulas Tuerkmen" . "ulas.tuerkmenatgmaildotcom")) (:maintainers ("Ulas Tuerkmen" . "ulas.tuerkmenatgmaildotcom")) (:maintainer "Ulas Tuerkmen" . "ulas.tuerkmenatgmaildotcom"))]) + (abridge-diff . [(20230307 2159) ((emacs (26 1))) "Abridge long line-based diff hunks, including in magit" tar ((:url . "https://github.com/jdtsmith/abridge-diff") (:commit . "31e0ccaa9d0bd4ad257f5de25cc3c0b3395fafa1") (:revdesc . "31e0ccaa9d0b") (:keywords "magit" "diffs" "tools") (:authors ("J.D. Smith" . "jdtsmithATgmail")) (:maintainers ("J.D. Smith" . "jdtsmithATgmail")) (:maintainer "J.D. Smith" . "jdtsmithATgmail"))]) + (abs-mode . [(20241217 839) ((emacs (26 1)) (erlang (2 8)) (maude-mode (0 3)) (flymake (1 0)) (yasnippet (0 14 0))) "Major mode for the modeling language Abs" tar ((:url . "https://github.com/abstools/abs-mode") (:commit . "debb48caef334870b4439609a9e818c7fd01f420") (:revdesc . "debb48caef33") (:keywords "languages") (:authors ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainers ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at"))]) + (abyss-theme . [(20170808 1345) ((emacs (24))) "A dark theme with contrasting colours" tar ((:url . "https://github.com/mgrbyte/emacs-abyss-theme") (:commit . "18791c6e8d9cc2b4815c9f08627a2e94fc0eeb14") (:revdesc . "18791c6e8d9c") (:keywords "theme" "dark" "contrasting colours") (:authors ("Matt Russell" . "matt@mgrbyte.co.uk")) (:maintainers ("Matt Russell" . "matt@mgrbyte.co.uk")) (:maintainer "Matt Russell" . "matt@mgrbyte.co.uk"))]) + (ac-alchemist . [(20150908 656) ((auto-complete (1 5 0)) (alchemist (1 5 0)) (cl-lib (0 5))) "Auto-complete source for alchemist" tar ((:url . "https://github.com/syohex/emacs-ac-alchemist") (:commit . "b1891c3d41aed83f61d78a609ea97be5cc2758d9") (:revdesc . "b1891c3d41ae") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (ac-c-headers . [(20200816 1007) ((auto-complete (1 3 1))) "Auto-complete source for C headers" tar ((:url . "http://zk-phi.gitub.io/") (:commit . "67e1e86a48c9bed57bc7ce5ce2553ad203f5752e") (:revdesc . "67e1e86a48c9"))]) + (ac-capf . [(20151101 217) ((auto-complete (1 4)) (cl-lib (0 5))) "Auto-complete source with completion-at-point" tar ((:url . "https://github.com/syohex/emacs-ac-capf") (:commit . "17571dba0a8f98111f2ab758e9bea285b263781b") (:revdesc . "17571dba0a8f") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (ac-clang . [(20180710 546) ((emacs (24)) (cl-lib (0 5)) (auto-complete (1 4 0)) (pos-tip (0 4 6)) (yasnippet (0 8 0))) "Auto Completion source by libclang for GNU Emacs" tar ((:url . "https://github.com/yaruopooner/ac-clang") (:commit . "3294b968eb1a8317049190940193f9da47c085ef") (:revdesc . "3294b968eb1a") (:keywords "completion" "convenience" "intellisense"))]) + (ac-dcd . [(20250925 946) ((auto-complete (1 3 1)) (flycheck-dmd-dub (0 7))) "Auto Completion source for dcd for GNU Emacs" tar ((:url . "http://github.com/atilaneves/ac-dcd") (:commit . "b95dfc61b9f2597e17f9a4a59b1745afd46a02d6") (:revdesc . "b95dfc61b9f2") (:keywords "languages") (:authors (nil . "atila.neves@gmail.com")) (:maintainers (nil . "atila.neves@gmail.com")) (:maintainer nil . "atila.neves@gmail.com"))]) + (ac-emmet . [(20131015 1558) ((emmet-mode (1 0 2)) (auto-complete (1 4))) "Auto-complete sources for emmet-mode's snippets" tar ((:url . "https://github.com/yasuyk/ac-emmet") (:commit . "88f24876ee3b759978d4614a758280b5d512d543") (:revdesc . "88f24876ee3b") (:keywords "completion" "convenience" "emmet") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))]) + (ac-emoji . [(20150823 711) ((auto-complete (1 5 0)) (cl-lib (0 5))) "Auto-complete source of Emoji" tar ((:url . "https://github.com/syohex/emacs-ac-emoji") (:commit . "53677f754929ead403ccde64b714ebb6b8fc808e") (:revdesc . "53677f754929") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (ac-etags . [(20161001 1507) ((auto-complete (1 4))) "Etags/ctags completion source for auto-complete" tar ((:url . "https://github.com/syohex/emacs-ac-etags") (:commit . "7983e631c226fe0fa53af3b2d56bf4eca3d785ce") (:revdesc . "7983e631c226") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (ac-geiser . [(20200318 824) ((geiser (0 5)) (auto-complete (1 4))) "Auto-complete backend for geiser" tar ((:url . "https://github.com/xiaohanyu/ac-geiser") (:commit . "93818c936ee7e2f1ba1b315578bde363a7d43d05") (:revdesc . "93818c936ee7"))]) + (ac-haskell-process . [(20150423 1402) ((auto-complete (1 4)) (haskell-mode (13))) "Haskell auto-complete source which uses the current haskell process" tar ((:url . "https://github.com/purcell/ac-haskell-process") (:commit . "0362d4323511107ec70e7165cb612f3ab01b712f") (:revdesc . "0362d4323511") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (ac-helm . [(20160319 233) ((helm (1 6 3)) (auto-complete (1 4 0)) (popup (0 5 0)) (cl-lib (0 5))) "Helm interface for auto-complete" tar ((:url . "https://github.com/yasuyk/ac-helm") (:commit . "baf2b1e04bcffa835084389c0fab415f26efbf32") (:revdesc . "baf2b1e04bcf") (:keywords "completion" "convenience" "helm") (:authors ("rubikitch" . "rubikitch@ruby-lang.org") ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))]) + (ac-html . [(20151005 731) ((auto-complete (1 4)) (s (1 9)) (f (0 17)) (dash (2 10))) "Auto complete source for html tags and attributes" tar ((:url . "https://github.com/cheunghy/ac-html") (:commit . "3de94a46d8cb93e8e62a1b6bdebbde4d65dc7cc2") (:revdesc . "3de94a46d8cb") (:keywords "html" "auto-complete" "slim" "haml" "jade") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com"))]) + (ac-html-angular . [(20151225 719) ((web-completion-data (0 1))) "Auto complete angular15 data for `ac-html' and `company-web'" tar ((:url . "https://github.com/osv/ac-html-bootstrap") (:commit . "6bafe09afe03112ca4183d58461c1a6f6c2b3c67") (:revdesc . "6bafe09afe03") (:keywords "html" "auto-complete" "angular") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainers ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com"))]) + (ac-html-bootstrap . [(20160302 1701) ((web-completion-data (0 1))) "Auto complete bootstrap3/fontawesome classes for `ac-html' and `company-web'" tar ((:url . "https://github.com/osv/ac-html-bootstrap") (:commit . "481e6e441cd566554ce71cd8cb28c9e7ebb1c24b") (:revdesc . "481e6e441cd5") (:keywords "html" "auto-complete" "bootstrap" "cssx") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainers ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com"))]) + (ac-html-csswatcher . [(20151208 2113) ((web-completion-data (0 1))) "Css/less class/id completion with `ac-html' or `company-web'" tar ((:url . "https://github.com/osv/ac-html-csswatcher") (:commit . "b0f3e7e1a3fe49e88b6eb6432377232fc715f221") (:revdesc . "b0f3e7e1a3fe") (:keywords "html" "css" "less" "auto-complete") (:authors ("Olexandr Sydorchuck" . "olexandr.syd@gmail.com")) (:maintainers ("Olexandr Sydorchuck" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuck" . "olexandr.syd@gmail.com"))]) + (ac-inf-ruby . [(20131115 1150) ((inf-ruby (2 3 2)) (auto-complete (1 4))) "Enable auto-complete in inf-ruby sessions" tar ((:url . "https://github.com/purcell/ac-inf-ruby") (:commit . "094d86761088ab0b16ddac75cf57eeb9c2afbee2") (:revdesc . "094d86761088") (:keywords "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (ac-ispell . [(20151101 226) ((auto-complete (1 4)) (cl-lib (0 5))) "Ispell completion source for auto-complete" tar ((:url . "https://github.com/syohex/emacs-ac-ispell") (:commit . "7e054793fe77f5fa1ced59d97da9c31df9807c48") (:revdesc . "7e054793fe77") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (ac-js2 . [(20190101 933) ((js2-mode (20090723)) (skewer-mode (1 4))) "Auto-complete source for Js2-mode, with navigation" tar ((:url . "https://github.com/ScottyB/ac-js2") (:commit . "2b56d09a16c1a0ce514cc1b85d64cb1be4502723") (:revdesc . "2b56d09a16c1") (:authors ("Scott Barnett" . "scott.n.barnett@gmail.com")) (:maintainers ("Scott Barnett" . "scott.n.barnett@gmail.com")) (:maintainer "Scott Barnett" . "scott.n.barnett@gmail.com"))]) + (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 ((:url . "https://github.com/vitoshka/ac-math") (:commit . "89478063dead68894f0d27687b63896633048c6f") (:revdesc . "89478063dead") (:keywords "latex" "auto-complete" "unicode" "symbols"))]) + (ac-mozc . [(20150227 1619) ((cl-lib (0 5)) (auto-complete (1 4)) (mozc (0))) "Auto-complete sources for Japanese input using Mozc" tar ((:url . "https://github.com/igjit/ac-mozc") (:commit . "4c6c8be4701010d9362184437c0f783e0335c631") (:revdesc . "4c6c8be47010") (:authors ("igjit" . "igjit1@gmail.com")) (:maintainers ("igjit" . "igjit1@gmail.com")) (:maintainer "igjit" . "igjit1@gmail.com"))]) + (ac-octave . [(20180406 334) ((auto-complete (1 4 0))) "An auto-complete source for Octave" tar ((:url . "https://github.com/coldnew/ac-octave") (:commit . "fe0f931f2024f43de3c4fff4b1ace672413adeae") (:revdesc . "fe0f931f2024") (:keywords "octave" "auto-complete" "completion") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com"))]) + (ac-php . [(20240328 1036) ((ac-php-core (2 0)) (auto-complete (1 4 0)) (yasnippet (0 8 0))) "Auto Completion source for PHP" tar ((:url . "https://github.com/xcwen/ac-php") (:commit . "a69ae4a12e40900619b4e5a1613fd449aef649c3") (:revdesc . "a69ae4a12e40") (:keywords "completion" "convenience" "intellisense") (:authors ("jim" . "xcwenn@qq.com")))]) + (ac-php-core . [(20240426 653) ((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 ((:url . "https://github.com/xcwen/ac-php") (:commit . "810ea813840b980b4f9b43c954e998032fe23f8a") (:revdesc . "810ea813840b") (:keywords "completion" "convenience" "intellisense") (:authors ("jim" . "xcwenn@qq.com") ("Serghei Iakovlev" . "sadhooklay@gmail.com")))]) + (ac-racer . [(20170114 809) ((emacs (24 3)) (auto-complete (1 5 0)) (racer (0 0 2))) "Auto-complete source of racer" tar ((:url . "https://github.com/syohex/emacs-ac-racer") (:commit . "4408c2d652dec0432e20c05e001db8222d778c6b") (:revdesc . "4408c2d652de") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (ac-rtags . [(20191222 920) ((auto-complete (1 4 0)) (rtags (2 10))) "Auto-complete back-end for RTags" tar ((:url . "https://github.com/Andersbakken/rtags") (:commit . "595055b5316a7c92ba1d638f324f98842a0f41a5") (:revdesc . "595055b5316a") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainers ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com"))]) + (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 ((:url . "https://github.com/myuhe/ac-skk.el") (:commit . "d25a265930430d080329789fb253d786c01dfa24") (:revdesc . "d25a26593043") (:keywords "convenience" "auto-complete") (:authors ("lugecy" . "https://twitter.com/lugecy")))]) + (ac-slime . [(20171027 2100) ((auto-complete (1 4)) (slime (2 9)) (cl-lib (0 5))) "An auto-complete source using slime completions" tar ((:url . "https://github.com/purcell/ac-slime") (:commit . "a91f664510d3da24b02e87e4aa59d049483a6529") (:revdesc . "a91f664510d3") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (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 ((:url . "https://github.com/qoocku/ac-sly") (:commit . "bf69c687c4ecf1994349d20c182e9b567399912e") (:revdesc . "bf69c687c4ec") (:authors ("Damian T. Dobroczy\\'nski" . "qoocku@gmail.com")) (:maintainers ("Damian T. Dobroczy\\'nski" . "qoocku@gmail.com")) (:maintainer "Damian T. Dobroczy\\'nski" . "qoocku@gmail.com"))]) + (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 ((:url . "https://github.com/nashamri/academic-phrases") (:commit . "25d9cf67feac6359cb213f061735e2679c84187f") (:revdesc . "25d9cf67feac") (:keywords "academic" "convenience" "papers" "writing" "wp") (:authors ("Nasser Alshammari" . "designernasser@gmail.com")) (:maintainers ("Nasser Alshammari" . "designernasser@gmail.com")) (:maintainer "Nasser Alshammari" . "designernasser@gmail.com"))]) + (accent . [(20250210 906) ((emacs (24 3)) (popup (0 5 8))) "Popup for accented characters (diacritics)" tar ((:url . "https://github.com/elias94/accent") (:commit . "d613700dc4159692f5c30dc5f241c9de41bbb1dc") (:revdesc . "d613700dc415") (:keywords "i18n") (:authors ("Elia Scotto" . "eliascotto94@gmail.com")) (:maintainers ("Elia Scotto" . "eliascotto94@gmail.com")) (:maintainer "Elia Scotto" . "eliascotto94@gmail.com"))]) + (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 ((:url . "https://github.com/tam17aki/ace-isearch") (:commit . "a24bfc626100f183dbad016bd7723eb12e238534") (:revdesc . "a24bfc626100"))]) + (ace-jump-buffer . [(20171031 1550) ((avy (0 4 0)) (dash (2 4 0))) "Fast buffer switching extension to `avy'" tar ((:url . "https://github.com/waymondo/ace-jump-buffer") (:commit . "ae5be0415c823f7bb66833aa4af2180d4cf99cef") (:revdesc . "ae5be0415c82") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com"))]) + (ace-jump-helm-line . [(20160918 1836) ((avy (0 4 0)) (helm (1 6 3))) "Ace-jump to a candidate in helm window" tar ((:url . "https://github.com/cute-jumper/ace-jump-helm-line") (:commit . "1483055255df3f8ae349f7520f05b1e43ea3ed37") (:revdesc . "1483055255df") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (ace-jump-mode . [(20140616 815) nil "A quick cursor location minor mode for emacs" tar ((:url . "https://github.com/winterTTr/ace-jump-mode/") (:commit . "8351e2df4fbbeb2a4003f2fb39f46d33803f3dac") (:revdesc . "8351e2df4fbb") (:keywords "motion" "location" "cursor") (:authors ("winterTTr" . "winterTTr@gmail.com")) (:maintainers ("winterTTr" . "winterTTr@gmail.com")) (:maintainer "winterTTr" . "winterTTr@gmail.com"))]) + (ace-jump-zap . [(20170717 1849) ((ace-jump-mode (1 0)) (dash (2 10 0))) "Character zapping, `ace-jump-mode` style" tar ((:url . "https://github.com/waymondo/ace-jump-zap") (:commit . "52b5d4c6c73bd0fc833a0dcb4e803a5287d8cae8") (:revdesc . "52b5d4c6c73b") (:keywords "convenience" "tools" "extensions") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainers ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com"))]) + (ace-link . [(20241101 1344) ((avy (0 4 0))) "Quickly follow links" tar ((:url . "https://github.com/abo-abo/ace-link") (:commit . "d9bd4a25a02bdfde4ea56247daf3a9ff15632ea4") (:revdesc . "d9bd4a25a02b") (:keywords "convenience" "links" "avy") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (ace-mc . [(20190206 749) ((ace-jump-mode (1 0)) (multiple-cursors (1 0)) (dash (2 10 0))) "Add multiple cursors quickly using ace jump" tar ((:url . "https://github.com/mm--/ace-mc") (:commit . "6877880efd99e177e4e9116a364576def3da391b") (:revdesc . "6877880efd99") (:keywords "motion" "location" "cursor") (:authors ("Josh Moller-Mara" . "jmm@cns.nyu.edu")) (:maintainers ("Josh Moller-Mara" . "jmm@cns.nyu.edu")) (:maintainer "Josh Moller-Mara" . "jmm@cns.nyu.edu"))]) + (ace-pinyin . [(20210827 355) ((avy (0 2 0)) (pinyinlib (0 1 0))) "Jump to Chinese characters using avy or ace-jump-mode" tar ((:url . "https://github.com/cute-jumper/ace-pinyin") (:commit . "47662c0b05775ba353464b44c0f1a037c85e746e") (:revdesc . "47662c0b0577") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (ace-popup-menu . [(20230606 1445) ((emacs (24 4)) (avy-menu (0 1))) "Replace GUI popup menu with something more efficient" tar ((:url . "https://github.com/mrkkrp/ace-popup-menu") (:commit . "a8b970d1b59efbe7e1e29ed16d71af257a22699f") (:revdesc . "a8b970d1b59e") (:keywords "convenience" "popup" "menu") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (ace-window . [(20220911 358) ((avy (0 5 0))) "Quickly switch windows" tar ((:url . "https://github.com/abo-abo/ace-window") (:commit . "77115afc1b0b9f633084cf7479c767988106c196") (:revdesc . "77115afc1b0b") (:keywords "window" "location") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (achievements . [(20240703 318) ((keyfreq (0 0 3))) "Achievements for emacs usage" tar ((:url . "https://gitlab.com/gvol/emacs-achievements") (:commit . "c229d21ad5d1e13be08e087ab498800b2b9b7c97") (:revdesc . "c229d21ad5d1") (:keywords "games") (:authors ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainers ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com"))]) + (ack-menu . [(20150504 2022) ((mag-menu (0 1 0))) "A menu-based front-end for ack" tar ((:url . "https://github.com/chumpage/ack-menu") (:commit . "f77be93a4697926ecf3195a355eb69580f695f4d") (:revdesc . "f77be93a4697") (:keywords "tools" "matching" "convenience"))]) + (acme-theme . [(20210430 302) nil "A color theme based on Acme & Sam from Plan 9" tar ((:url . "https://github.com/ianpan870102/acme-emacs-theme") (:commit . "ae8788b5851ea353fbb80ab586a3bbd5dc8e91aa") (:revdesc . "ae8788b5851e"))]) + (acp . [(20251219 2135) ((emacs (28 1))) "An ACP (Agent Client Protocol) implementation" tar ((:url . "https://github.com/xenodium/acp.el") (:commit . "7b67facc657a7388a53ea8bba5d6e7eba20fa3e0") (:revdesc . "7b67facc657a"))]) + (act-mode . [(20240718 39) ((emacs (26 1))) "Major mode for the ACT programming language" tar ((:url . "https://github.com/rafaelcn/act") (:commit . "90d7d626691591b24d83596149bc89fd51ba39b4") (:revdesc . "90d7d6266915"))]) + (actionscript-mode . [(20180527 1701) nil "A simple mode for editing Actionscript 3 files" tar ((:url . "https://codeberg.org/austinhaas/actionscript-mode") (:commit . "65abd58e198458a8e46748c5962c41d80d60c4ea") (:revdesc . "65abd58e1984") (:keywords "language" "modes"))]) + (activity-watch-mode . [(20240313 754) ((emacs (25)) (request (0)) (json (0)) (cl-lib (0))) "Automatic time tracking extension" tar ((:url . "https://github.com/pauldub/activity-watch-mode") (:commit . "19aed6ca81a3b1e549f47867c924d180d8536791") (:revdesc . "19aed6ca81a3") (:keywords "calendar" "comm") (:authors ("Gabor Torok" . "gabor@20y.hu") ("Alan Hamlett" . "alan@wakatime.com")) (:maintainers ("Paul d'Hubert" . "paul.dhubert@ya.ru")) (:maintainer "Paul d'Hubert" . "paul.dhubert@ya.ru"))]) + (acton-mode . [(20250113 1059) ((emacs (25 1))) "Major mode for editing Acton source code" tar ((:url . "https://github.com/actonlang/acton-mode") (:commit . "5a1a8509fb84dad4f8a02da47519ed7399c26d7f") (:revdesc . "5a1a8509fb84") (:keywords "languages" "programming"))]) + (ada-ts-mode . [(20251125 2018) ((emacs (29 1))) "Major mode for Ada using Tree-sitter" tar ((:url . "https://github.com/brownts/ada-ts-mode") (:commit . "52e0fd11604ab1d51a34c89e05692446d9dc5ecb") (:revdesc . "52e0fd11604a") (:keywords "ada" "languages" "tree-sitter") (:authors ("Troy Brown" . "brownts@troybrown.dev")) (:maintainers ("Troy Brown" . "brownts@troybrown.dev")) (:maintainer "Troy Brown" . "brownts@troybrown.dev"))]) + (adafruit-wisdom . [(20200217 306) ((emacs (25 1)) (request (0 3 1))) "Get/display adafruit.com quotes" tar ((:url . "https://github.com/gonewest818/adafruit-wisdom.el") (:commit . "c4ae0db35d0be94f0e9c50977758224d7e00234a") (:revdesc . "c4ae0db35d0b") (:keywords "games") (:authors ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (add-hooks . [(20171217 123) nil "Functions for setting multiple hooks" tar ((:url . "https://github.com/nickmccurdy/add-hooks") (:commit . "1845137703461fc44bd77cf24014ba58f19c369d") (:revdesc . "184513770346") (:keywords "lisp") (:authors ("Nick McCurdy" . "nick@nickmccurdy.com")) (:maintainers ("Nick McCurdy" . "nick@nickmccurdy.com")) (:maintainer "Nick McCurdy" . "nick@nickmccurdy.com"))]) + (add-node-modules-path . [(20230307 655) ((s (1 12 0))) "Add node_modules to your exec-path" tar ((:url . "https://github.com/codesuki/add-node-modules-path") (:commit . "841e93dfed50448da66c89a977c9182bb18796a1") (:revdesc . "841e93dfed50") (:keywords "javascript" "node" "node_modules" "eslint") (:authors ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainers ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainer "Neri Marschik" . "marschik_neri@cyberagent.co.jp"))]) + (addressbook-bookmark . [(20251106 1903) ((emacs (24))) "An address book based on Standard Emacs bookmarks" tar ((:url . "https://github.com/thierryvolpiatto/addressbook-bookmark") (:commit . "a93118ce6cb69c5766f5f74fab32b0108d410827") (:revdesc . "a93118ce6cb6") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net"))]) + (ado-mode . [(20251201 2259) ((emacs (25 1))) "Major mode for editing Stata-related files" tar ((:url . "https://github.com/louabill/ado-mode") (:commit . "0bf66c877e5773ae8e86d4bee286f29a4abd56e9") (:revdesc . "0bf66c877e57") (:keywords "tools" "languages" "files" "convenience" "stata" "mata" "ado") (:authors ("Bill Rising" . "brising@alum.mit.edu")) (:maintainers ("Bill Rising" . "brising@alum.mit.edu")) (:maintainer "Bill Rising" . "brising@alum.mit.edu"))]) + (adoc-mode . [(20250206 838) ((emacs (26))) "A major-mode for editing AsciiDoc files" tar ((:url . "https://github.com/bbatsov/adoc-mode") (:commit . "20772277b8a5b8c08d49bd03043d5d4dd7a815e9") (:revdesc . "20772277b8a5") (:keywords "docs" "wp") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (adwaita-dark-theme . [(20231209 1033) ((emacs (27 1))) "A dark color scheme inspired by Adwaita" tar ((:url . "https://gitlab.com/jessieh/adwaita-dark-theme") (:commit . "04fed0ef795bfe2482998c5b6f87c37c13fe8c50") (:revdesc . "04fed0ef795b") (:keywords "mode-line" "faces") (:authors ("Jessie Hildebrandt" . "jessieh.net")) (:maintainers ("Jessie Hildebrandt" . "jessieh.net")) (:maintainer "Jessie Hildebrandt" . "jessieh.net"))]) + (aes . [(20211204 2348) ((emacs (26 1))) "Implementation of AES" tar ((:url . "https://github.com/Sauermann/emacs-aes") (:commit . "c9cd12d6c1dbc18603eb4703276132cea59d5c78") (:revdesc . "c9cd12d6c1db") (:keywords "data" "tools") (:authors ("Markus Sauermann" . "emacs-aes@sauermann-consulting.de")) (:maintainers ("Markus Sauermann" . "emacs-aes@sauermann-consulting.de")) (:maintainer "Markus Sauermann" . "emacs-aes@sauermann-consulting.de"))]) + (affe . [(20250921 1712) ((emacs (29 1)) (consult (2 8))) "Asynchronous Fuzzy Finder for Emacs" tar ((:url . "https://github.com/minad/affe") (:commit . "10fc401cf2d35bafb7220b9456af7dbfd064e1f2") (:revdesc . "10fc401cf2d3") (:keywords "matching" "files" "completion") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (afterglow . [(20240312 953) ((emacs (26 1))) "Temporary Highlighting after Function Calls" tar ((:url . "https://github.com/ernstvanderlinden/emacs-afterglow") (:commit . "d90fcf4e5c8ac6f5bae2eb01dea32558b2b18fba") (:revdesc . "d90fcf4e5c8a") (:keywords "highlight" "line" "convenience" "evil") (: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"))]) + (afternoon-theme . [(20140104 1859) ((emacs (24 1))) "Dark color theme with a deep blue background" tar ((:url . "http://github.com/osener/emacs-afternoon-theme") (:commit . "89b1d778a1f8b385775c122f2bd1c62f0fbf931a") (:revdesc . "89b1d778a1f8") (:keywords "themes") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainers ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com"))]) + (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 ((:url . "https://github.com/Wilfred/ag.el") (:commit . "ed7e32064f92f1315cecbfc43f120bbc7508672c") (:revdesc . "ed7e32064f92") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (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 ((:url . "https://github.com/alhassy/next-700-module-systems") (:commit . "06e374516cb2ab17018985f3dc4fccdc4acefd08") (:revdesc . "06e374516cb2") (:keywords "abbrev" "convenience" "languages" "agda" "tools") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com"))]) + (agda-lib-mode . [(20251013 2307) ((emacs (24 3))) "Major mode for Agda library files" tar ((:url . "https://codeberg.org/heraplem/agda-lib-mode") (:commit . "1cf7d486753887736eef6cae2688b2a05f9c1854") (:revdesc . "1cf7d4867538") (:keywords "text") (:authors ("Nicholas Coltharp" . "mail@heraplem.xyz")) (:maintainers ("Nicholas Coltharp" . "mail@heraplem.xyz")) (:maintainer "Nicholas Coltharp" . "mail@heraplem.xyz"))]) + (age . [(20250806 1723) ((emacs (28 1))) "The Age Encryption Library" tar ((:url . "https://github.com/anticomputer/age.el") (:commit . "e99165ef5274bc4512b8d77ba2ac208c59b5d456") (:revdesc . "e99165ef5274") (:keywords "data") (:authors ("Daiki Ueno" . "ueno@unixuser.org") ("Bas Alberts" . "bas@anti.computer")) (:maintainers ("Bas Alberts" . "bas@anti.computer")) (:maintainer "Bas Alberts" . "bas@anti.computer"))]) + (agenix . [(20250209 551) ((emacs (27 1))) "Decrypt and encrypt agenix secrets" tar ((:url . "https://github.com/t4ccer/agenix.el") (:commit . "36ad60f0b7f2a12b730c6f568fcfd4daf2581158") (:revdesc . "36ad60f0b7f2") (:authors ("Tomasz Maciosowski" . "t4ccer@gmail.com")) (:maintainers ("Tomasz Maciosowski" . "t4ccer@gmail.com")) (:maintainer "Tomasz Maciosowski" . "t4ccer@gmail.com"))]) + (agent-shell . [(20251223 1829) ((emacs (29 1)) (shell-maker (0 84 4)) (acp (0 8 2))) "Native agentic integrations for Claude Code, Gemini CLI, etc" tar ((:url . "https://github.com/xenodium/agent-shell") (:commit . "6fc37ab6f54d850a8678d8fef95f7be1a96395a7") (:revdesc . "6fc37ab6f54d"))]) + (aggressive-fill-paragraph . [(20240213 2320) ((dash (2 10 0))) "A mode to automatically keep paragraphs filled" tar ((:url . "https://github.com/davidshepherd7/aggressive-fill-paragraph-mode") (:commit . "60e4eb5c57d4408e811d12c6b6491b8c89dfa695") (:revdesc . "60e4eb5c57d4") (:keywords "fill-paragraph" "automatic" "comments") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com"))]) + (aggressive-indent . [(20230112 1300) ((emacs (24 3))) "Minor mode to aggressively keep your code always indented" tar ((:url . "https://github.com/Malabarba/aggressive-indent-mode") (:commit . "a437a45868f94b77362c6b913c5ee8e67b273c42") (:revdesc . "a437a45868f9") (:keywords "indent" "lisp" "maint" "tools") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (agtags . [(20250523 1654) ((emacs (25))) "A frontend to GNU Global" tar ((:url . "https://github.com/vietor/agtags") (:commit . "afb45864557fe08570ee26b7bc7bf9197a6a7538") (:revdesc . "afb45864557f") (:keywords "tools" "convenience") (:authors ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainers ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainer "Vietor Liu" . "vietor.liu@gmail.com"))]) + (ah . [(20220730 1058) ((emacs (25 1))) "Additional hooks" tar ((:url . "https://github.com/takaxp/ah") (:commit . "8e12223f0f423e7fa882cc049a25af6db755902d") (:revdesc . "8e12223f0f42") (:keywords "convenience") (:authors ("Takaaki ISHIKAWA" . "takaxpatieeedotorg")) (:maintainers ("Takaaki ISHIKAWA" . "takaxpatieeedotorg")) (:maintainer "Takaaki ISHIKAWA" . "takaxpatieeedotorg"))]) + (ahg . [(20241113 748) nil "Alberto's Emacs interface for Mercurial (Hg)" tar ((:url . "https://bitbucket.org/agriggio/ahg") (:commit . "d57b91d52e5c2c501cb7112af53c6549397ea1b5") (:revdesc . "d57b91d52e5c") (:authors ("Alberto Griggio" . "agriggio@users.sourceforge.net")) (:maintainers ("Alberto Griggio" . "agriggio@users.sourceforge.net")) (:maintainer "Alberto Griggio" . "agriggio@users.sourceforge.net"))]) + (ahk-mode . [(20200412 1832) ((emacs (24 3))) "Major mode for editing AHK (AutoHotkey and AutoHotkey_L)" tar ((:url . "https://github.com/ralesi/ahk-mode") (:commit . "729007b5f22a49f5187ff47fca18c0d674e73047") (:revdesc . "729007b5f22a") (:keywords "ahk" "autohotkey" "hotkey" "keyboard shortcut" "automation"))]) + (ahungry-theme . [(20180131 328) ((emacs (24))) "Ahungry color theme for Emacs. Make sure to (load-theme 'ahungry)" tar ((:url . "https://github.com/ahungry/color-theme-ahungry") (:commit . "a038d91ec593d1f1b19ca66a0576d59bbc24c523") (:revdesc . "a038d91ec593") (:keywords "ahungry" "palette" "color" "theme" "emacs" "color-theme" "deftheme") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (aider . [(20251201 133) ((emacs (26 1)) (transient (0 9 0)) (magit (2 1 0)) (markdown-mode (2 5)) (s (1 13 0))) "AI assisted programming with Aider and LLM" tar ((:url . "https://github.com/tninja/aider.el") (:commit . "5c2c093f20e14ca5f47ebbb35d4e198550f9fffc") (:revdesc . "5c2c093f20e1") (:keywords "ai" "gpt" "sonnet" "llm" "aider" "gemini-pro" "deepseek" "ai-assisted-coding") (:authors ("Kang Tu" . "tninja@gmail.com")) (:maintainers ("Kang Tu" . "tninja@gmail.com")) (:maintainer "Kang Tu" . "tninja@gmail.com"))]) + (aidermacs . [(20251203 2318) ((emacs (26 1)) (transient (0 3 0)) (compat (30 0 2 0)) (markdown-mode (2 7))) "AI pair programming with Aider" tar ((:url . "https://github.com/MatthewZMD/aidermacs") (:commit . "6d0c41d1cfd24821fb32933edf8c0c2a9bb8c847") (:revdesc . "6d0c41d1cfd2") (:keywords "ai" "emacs" "llm" "aider" "ai-pair-programming" "tools") (:authors ("Mingde Zeng" . "matthewzmd@posteo.net")) (:maintainers ("Mingde Zeng" . "matthewzmd@posteo.net")) (:maintainer "Mingde Zeng" . "matthewzmd@posteo.net"))]) + (aidev-mode . [(20250318 2144) ((emacs (27 1)) (request (0 3 2))) "Minor mode for AI-assisted development" tar ((:url . "https://github.com/inaimathi/aidev-mode") (:commit . "5a71b7ddc43be3629e2c2928e349fee78099989f") (:revdesc . "5a71b7ddc43b") (:keywords "tools" "convenience" "ai") (:authors ("inaimathi" . "leo.zovic@example.com")) (:maintainers ("inaimathi" . "leo.zovic@example.com")) (:maintainer "inaimathi" . "leo.zovic@example.com"))]) + (aiken-mode . [(20230920 1210) ((emacs (26 1))) "Major mode for Aiken" tar ((:url . "https://github.com/aiken-lang/aiken-mode") (:commit . "1af54e4df02eb52cf62034acbe1c6dd54776d843") (:revdesc . "1af54e4df02e") (:keywords "languages" "aiken") (:authors ("Sebastian Nagel" . "sebastian.nagel@ncoding.at")) (:maintainers ("Sebastian Nagel" . "sebastian.nagel@ncoding.at")) (:maintainer "Sebastian Nagel" . "sebastian.nagel@ncoding.at"))]) + (aio . [(20251117 644) ((emacs (26 1))) "Async/await for Emacs Lisp" tar ((:url . "https://github.com/skeeto/emacs-aio") (:commit . "58157e51e7eb7a4b954894ee4182564c507a2f01") (:revdesc . "58157e51e7eb") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (airline-themes . [(20250502 1915) ((powerline (2 3))) "Vim-airline themes for emacs powerline" tar ((:url . "http://github.com/AnthonyDiGirolamo/airline-themes") (:commit . "827a2dae106ecf1fb14793c43f13c4a6cd045c9a") (:revdesc . "827a2dae106e") (:keywords "evil" "mode-line" "powerline" "airline" "themes") (:authors ("Anthony DiGirolamo" . "anthony.digirolamo@gmail.com")) (:maintainers ("Anthony DiGirolamo" . "anthony.digirolamo@gmail.com")) (:maintainer "Anthony DiGirolamo" . "anthony.digirolamo@gmail.com"))]) + (airplay . [(20130212 1226) ((request (20130110 2144)) (simple-httpd (1 4 1)) (deferred (0 3 1))) "Airplay bindings to Emacs" tar ((:url . "https://github.com/gongo/airplay-el") (:commit . "46fad71d293a3e18551cf464fe6c6208a7a32d9d") (:revdesc . "46fad71d293a") (:keywords "appletv" "airplay") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainers ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com"))]) + (alan-mode . [(20240309 650) ((flycheck (32)) (emacs (25 1)) (s (1 12))) "Major mode for editing Alan files" tar ((:url . "https://github.com/Kjerner/AlanForEmacs") (:commit . "df6c82f1a37a4bd6f18cb463c3f7ab7d087b91ab") (:revdesc . "df6c82f1a37a") (:keywords "alan" "languages") (:authors ("Paul van Dam" . "pvandam@kjerner.com")) (:maintainers ("Paul van Dam" . "pvandam@kjerner.com")) (:maintainer "Paul van Dam" . "pvandam@kjerner.com"))]) + (alarm-clock . [(20250123 556) ((emacs (24 4))) "Alarm Clock" tar ((:url . "https://github.com/wlemuel/alarm-clock") (:commit . "8a805d365aa38be32041c4e968bb624d3bb1b54b") (:revdesc . "8a805d365aa3") (:keywords "calendar" "tools" "convenience") (:authors ("Steve Lemuel" . "wlemuel@hotmail.com")) (:maintainers ("Steve Lemuel" . "wlemuel@hotmail.com")) (:maintainer "Steve Lemuel" . "wlemuel@hotmail.com"))]) + (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 ((:url . "http://www.github.com/tonini/alchemist.el") (:commit . "6f99367511ae209f8fe2c990779764bbb4ccb6ed") (:revdesc . "6f99367511ae") (:keywords "languages" "elixir" "elixirc" "mix" "hex" "alchemist") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainers ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com"))]) + (alda-mode . [(20251223 6) ((emacs (24 0))) "An Alda major mode" tar ((:url . "http://gitlab.com/jgkamat/alda-mode") (:commit . "bde0e9c5df2810deb48df57f46bb3a1a51d7a8f6") (:revdesc . "bde0e9c5df28") (:keywords "alda" "highlight") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainers ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com"))]) + (alect-themes . [(20251205 1503) ((emacs (24 0))) "Configurable light, dark and black themes for Emacs 24 or later" tar ((:url . "https://github.com/alezost/alect-themes") (:commit . "b1f97e4bc0dc6ec91c7e9999fbe9fa371016463b") (:revdesc . "b1f97e4bc0dc") (:keywords "color" "theme") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (alectryon . [(20220925 2236) ((flycheck (31)) (emacs (25 1))) "Toggle between Coq and reStructuredText" tar ((:url . "https://github.com/cpitclaudel/alectryon") (:commit . "8a1f3054c97fc86d628413800cfef75577c43485") (:revdesc . "8a1f3054c97f") (:keywords "convenience" "languages" "tools") (: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"))]) + (alert . [(20250823 650) ((gntp (0 1)) (log4e (0 3 0)) (cl-lib (0 5))) "Growl-style notification system for Emacs" tar ((:url . "https://github.com/jwiegley/alert") (:commit . "79f6936ab4d85227530959811143429347a6971b") (:revdesc . "79f6936ab4d8") (:keywords "notification" "emacs" "message") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com"))]) + (alert-termux . [(20181119 951) ((emacs (24 4))) "Alert.el notifications on Termux" tar ((:url . "https://github.com/gergelypolonkai/alert-termux") (:commit . "8215cf1d86392738c35a90bbc0055359265dfc4d") (:revdesc . "8215cf1d8639") (:keywords "terminals") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainers ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu"))]) + (alert-toast . [(20220312 229) ((emacs (25 1)) (alert (1 2)) (f (0 20 0)) (s (1 12 0))) "Windows 10 toast notifications" tar ((:url . "https://github.com/gkowzan/alert-toast") (:commit . "96c88c93c1084de681700f655223142ee0eb944a") (:revdesc . "96c88c93c108") (:authors ("Grzegorz Kowzan" . "grzegorz@kowzan.eu")) (:maintainers ("Grzegorz Kowzan" . "grzegorz@kowzan.eu")) (:maintainer "Grzegorz Kowzan" . "grzegorz@kowzan.eu"))]) + (align-cljlet . [(20160112 2101) ((clojure-mode (1 11 5))) "Space align various Clojure forms" tar ((:url . "https://github.com/gstamp/align-cljlet") (:commit . "ebcf0a912e836579a3a9d386e22c1c4bef7fba17") (:revdesc . "ebcf0a912e83"))]) + (all-ext . [(20200315 1443) ((emacs (24 4)) (all (1 0))) "M-x all with helm-swoop/anything/multiple-cursors/line-number" tar ((:url . "https://github.com/rubikitch/all-ext") (:commit . "c865c62506af2c9edc7705a7c24dc8b70d5d4de2") (:revdesc . "c865c62506af") (:keywords "matching" "all" "search" "replace" "anything" "helm" "helm-swoop" "occur") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (all-the-icons . [(20250527 927) ((emacs (24 3))) "A library for inserting Developer icons" tar ((:url . "https://github.com/domtronn/all-the-icons.el") (:commit . "4778632b29c8c8d2b7cd9ce69535d0be01d846f9") (:revdesc . "4778632b29c8") (:keywords "convenient" "lisp") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainers ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com"))]) + (all-the-icons-completion . [(20240128 2048) ((emacs (26 1)) (all-the-icons (5 0))) "Add icons to completion candidates" tar ((:url . "https://github.com/iyefrat/all-the-icons-completion") (:commit . "4c8bcad8033f5d0868ce82ea3807c6cd46c4a198") (:revdesc . "4c8bcad8033f") (:keywords "convenient" "lisp") (:authors ("Itai Y. Efrat" . "https://github.com/iyefrat")) (:maintainers ("Itai Y. Efrat" . "itai3397@gmail.com")) (:maintainer "Itai Y. Efrat" . "itai3397@gmail.com"))]) + (all-the-icons-dired . [(20231207 1324) ((emacs (26 1)) (all-the-icons (2 2 0))) "Shows icons for each file in dired mode" tar ((:url . "https://github.com/wyuenho/all-the-icons-dired") (:commit . "e157f0668f22ed586aebe0a2c0186ab07702986c") (:revdesc . "e157f0668f22") (:keywords "files" "icons" "dired") (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com"))]) + (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 ((:url . "https://github.com/nlamirault/all-the-icons-gnus") (:commit . "27f78996da0725943bcfb2d18038e6f7bddfa9c7") (:revdesc . "27f78996da07") (:keywords "mail" "tools") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (all-the-icons-ibuffer . [(20230503 1625) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" tar ((:url . "https://github.com/seagle0128/all-the-icons-ibuffer") (:commit . "400860b2990529bd3a915e4d0a55fbc6d128a3ba") (:revdesc . "400860b29905") (:keywords "convenience" "icons" "ibuffer") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com"))]) + (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 ((:url . "https://github.com/asok/all-the-icons-ivy") (:commit . "babea626db20773de4c408acb2788e2b9c8277e3") (:revdesc . "babea626db20") (: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 ((:url . "https://github.com/seagle0128/all-the-icons-ivy-rich") (:commit . "c098cc85123a401b0ab8f2afd3a25853e61d7d28") (:revdesc . "c098cc85123a") (:keywords "convenience" "icons" "ivy") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com"))]) + (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 ((:url . "https://github.com/mohkale/all-the-icons-nerd-fonts") (:commit . "67a9cc9de2d2d4516cbfb752879b1355234cb42a") (:revdesc . "67a9cc9de2d2") (:keywords "convenience" "lisp") (:authors ("Mohsin Kaleem" . "mohkale@gmail.com")) (:maintainers ("Mohsin Kaleem" . "mohkale@gmail.com")) (:maintainer "Mohsin Kaleem" . "mohkale@gmail.com"))]) + (almost-mono-themes . [(20250606 1558) ((emacs (24))) "Almost monochromatic color themes" tar ((:url . "https://github.com/cryon/almost-mono-themes") (:commit . "20bdff33fc007d5ef41f065418bef2042daa9d3b") (:revdesc . "20bdff33fc00") (:keywords "faces") (:authors ("John Olsson" . "john@cryon.se")) (:maintainers ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se"))]) + (alsamixer . [(20250106 1025) nil "Functions to call out to amixer" tar ((:url . "https://codeberg.org/rwv/alsamixer-el") (:commit . "5f5a1f26637ca1b2a8ac964fc86a59522e3f778e") (:revdesc . "5f5a1f26637c") (:keywords "convenience"))]) + (alt-codes . [(20250101 1002) ((emacs (26 1))) "Insert alt codes using meta key" tar ((:url . "https://github.com/jcs-elpa/alt-codes") (:commit . "24e3740f88c29efda5c4791720a55c4c548b1ed8") (:revdesc . "24e3740f88c2") (:keywords "convenience" "alt" "codes" "insertion" "meta") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (amber-glow-theme . [(20250305 936) ((emacs (24 1))) "A warm and inviting theme" tar ((:url . "https://github.com/madara123pain/unique-emacs-theme-pack") (:commit . "43afeb68b3ba0394f8cc925ebb90e9a6620b4b28") (:revdesc . "43afeb68b3ba") (:keywords "faces" "theme" "warm" "amber" "glow" "dark"))]) + (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 ((:url . "https://github.com/NicolasPetton/amd-mode.el") (:commit . "01fd19e0d635ccaf8e812364d8720733f2e84126") (:revdesc . "01fd19e0d635") (:keywords "javascript" "amd" "projectile") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))]) + (ameba . [(20200103 1454) ((emacs (24 4))) "An interface to Crystal Ameba linter" tar ((:url . "https://github.com/crystal-ameba/ameba.el") (:commit . "0c4925ae0e998818326adcb47ed27ddf9761c7dc") (:revdesc . "0c4925ae0e99") (:keywords "convenience"))]) + (ample-regexps . [(20200508 1021) nil "Ample regular expressions for Emacs" tar ((:url . "https://github.com/immerrr/ample-regexps.el") (:commit . "153969ce547afe410b8986f01c9ed4087c9cd20b") (:revdesc . "153969ce547a") (:keywords "regexps" "extensions" "tools") (:authors ("immerrr" . "immerrr@gmail.com")) (:maintainers ("immerrr" . "immerrr@gmail.com")) (:maintainer "immerrr" . "immerrr@gmail.com"))]) + (ample-theme . [(20240426 1545) nil "Calm Dark Theme for Emacs" tar ((:url . "https://github.com/jordonbiondo/ample-theme") (:commit . "39ac29cf9a1229bb076964335fbd71cfb52e498b") (:revdesc . "39ac29cf9a12") (:keywords "theme" "dark") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainers ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com"))]) + (ample-zen-theme . [(20150119 2154) nil "AmpleZen Theme for Emacs 24" tar ((:url . "https://github.com/mjwall/ample-zen") (:commit . "b277bb7abd4b6624e8d59f02474b79af50a007bd") (:revdesc . "b277bb7abd4b") (:keywords "theme" "dark" "emacs 24"))]) + (amread-mode . [(20240903 1534) ((emacs (28 1)) (pyim (5 2 8)) (hydra (0 15 0))) "A minor mode helper user speed-reading" tar ((:url . "https://repo.or.cz/amread-mode.git") (:commit . "bf06b05c6322fe74f0e5ac2436cad46f66f673c6") (:revdesc . "bf06b05c6322") (:keywords "wp"))]) + (amsreftex . [(20240512 1746) ((emacs (25 1))) "Add amsrefs bibliography support for reftex" tar ((:url . "https://github.com/franburstall/amsreftex") (:commit . "c508b05536a04ee153a9947f025d24930c52209a") (:revdesc . "c508b05536a0") (:keywords "tex") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainers ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com"))]) + (amx . [(20230413 1210) ((emacs (24 4)) (s (0))) "Alternative M-x with extra features" tar ((:url . "http://github.com/DarwinAwardWinner/amx/") (:commit . "1c2428d21e9d2ee8bee944b572a39ca8c91ca13b") (:revdesc . "1c2428d21e9d") (:keywords "convenience" "usability" "completion") (: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"))]) + (anaconda-mode . [(20250430 227) ((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 ((:url . "https://github.com/proofit404/anaconda-mode") (:commit . "ee1562c6b443be9208910c700e229824b2f1af7a") (:revdesc . "ee1562c6b443") (:keywords "convenience" "anaconda") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com"))]) + (anakondo . [(20210221 1727) ((emacs (26 3))) "Adds clj-kondo based Clojure[Script] editing facilities" tar ((:url . "https://github.com/didibus/anakondo") (:commit . "16b0ba14d94a5d7e55655efc9e1d6d069a9306f2") (:revdesc . "16b0ba14d94a") (:keywords "clojure" "clojurescript" "cljc" "clj-kondo" "completion" "languages" "tools") (:authors ("Didier A." . "didibus@users.noreply.github.com")) (:maintainers ("Didier A." . "didibus@users.noreply.github.com")) (:maintainer "Didier A." . "didibus@users.noreply.github.com"))]) + (anaphora . [(20240120 1744) nil "Anaphoric macros providing implicit temp variables" tar ((:url . "http://github.com/rolandwalker/anaphora") (:commit . "a755afa7db7f3fa515f8dd2c0518113be0b027f6") (:revdesc . "a755afa7db7f") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (ancient-one-dark-theme . [(20211030 1358) ((emacs (24 1))) "A color theme based off uetchy's Ancient One Dark Theme" tar ((:url . "https://github.com/DaniruKun/ancient-one-dark-emacs-theme") (:commit . "a0eaa8bce0ffc25d1469af48a74e80f820bab0ab") (:revdesc . "a0eaa8bce0ff"))]) + (android-env . [(20220810 1449) ((emacs (24 3)) (s (1 12 0))) "Helper functions for working in android" tar ((:url . "https://github.com/fernando-jascovich/android-env.el") (:commit . "d2890f1156ed184314adbfcf01cdceb6ea79b10d") (:revdesc . "d2890f1156ed") (:keywords "android" "gradle" "java" "tools" "convenience"))]) + (android-mode . [(20250106 1022) nil "Minor mode for Android application development" tar ((:url . "https://codeberg.org/rwv/android-mode") (:commit . "67f7c0d7d37605efc7f055b76d731556861c3eb9") (:revdesc . "67f7c0d7d376") (:keywords "tools" "processes"))]) + (angry-police-captain . [(20120829 1252) nil "Show quote from http://theangrypolicecaptain.com in the minibuffer" tar ((:url . "https://github.com/rolpereira/angry-police-captain-el") (:commit . "d11931c5cb63368dcc4a48797962428cca6d3e9d") (:revdesc . "d11931c5cb63") (:keywords "games" "web" "fun") (:authors ("Rolando Pereira" . "rolando_pereira@sapo.pt")) (:maintainers ("Rolando Pereira" . "rolando_pereira@sapo.pt")) (:maintainer "Rolando Pereira" . "rolando_pereira@sapo.pt"))]) + (angular-mode . [(20151201 2127) nil "Major mode for Angular.js" tar ((:url . "https://github.com/omouse/angularjs-mode") (:commit . "8720cde86af0f1859ccc8580571e8d0ad1c52cff") (:revdesc . "8720cde86af0") (:keywords "languages" "javascript") (:authors ("Rudolf Olah" . "omouse@gmail.com")) (:maintainers ("Rudolf Olah" . "omouse@gmail.com")) (:maintainer "Rudolf Olah" . "omouse@gmail.com"))]) + (angular-snippets . [(20140514 523) ((s (1 4 0)) (dash (1 2 0))) "Yasnippets for AngularJS" tar ((:url . "https://github.com/magnars/angular-snippets.el") (:commit . "af5ae0a4a8603b040446c28afcf6ca01a8b4bd7b") (:revdesc . "af5ae0a4a860") (:keywords "snippets") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (anki-connect . [(20250414 1301) ((emacs (24 3))) "AnkiConnect API" tar ((:url . "https://github.com/lujun9972/anki-connect.el") (:commit . "e32e611d54a3819f88c5ff58009df70c9ae01934") (:revdesc . "e32e611d54a3") (:keywords "lisp" "anki") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (anki-editor . [(20251222 1345) ((emacs (29 1))) "Minor mode for making Anki cards with Org" tar ((:url . "https://github.com/anki-editor/anki-editor") (:commit . "59d75f6b6b632c2616c85ff19f39cb9e85a3d8a7") (:revdesc . "59d75f6b6b63"))]) + (anki-editor-view . [(20230807 806) ((emacs (29 1))) "Open anki-editor notes from Anki" tar ((:url . "https://gitlab.com/vherrmann/anki-editor-view") (:commit . "6ad8c6be4f44de0c33eab012e507320b732d4800") (:revdesc . "6ad8c6be4f44") (:authors ("Valentin Herrmann" . "me@valentin-herrmann.de")) (:maintainers ("Valentin Herrmann" . "me@valentin-herrmann.de")) (:maintainer "Valentin Herrmann" . "me@valentin-herrmann.de"))]) + (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 ((:url . "https://github.com/davidshepherd7/anki-mode") (:commit . "7cde5a68c9d0ef3811b0bd480274ea79909d2ddc") (:revdesc . "7cde5a68c9d0") (:keywords "tools") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com"))]) + (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 ((:url . "https://github.com/lujun9972/anki-vocabulary.el") (:commit . "863fe0219577f996ab126f1b7902db3c2cc59b2b") (:revdesc . "863fe0219577") (:keywords "lisp" "anki" "translator" "chinese") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (annalist . [(20240501 1201) ((emacs (24 4)) (cl-lib (0 5))) "Record and display information such as keybindings" tar ((:url . "https://github.com/noctuid/annalist.el") (:commit . "e1ef5dad75fa502d761f70d9ddf1aeb1c423f41d") (:revdesc . "e1ef5dad75fa") (:keywords "convenience" "tools" "keybindings" "org") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net"))]) + (annotate . [(20251111 1635) ((emacs (27 1))) "Annotate files without changing them" tar ((:url . "https://github.com/bastibe/annotate.el") (:commit . "9c80b465297dce20901abaf0389a48951b6e030f") (:revdesc . "9c80b465297d") (:maintainers ("Bastian Bechtold" . "bastibe.dev@mailbox.org") ("cage" . "cage-dev@twistfold.it")) (:maintainer "Bastian Bechtold" . "bastibe.dev@mailbox.org"))]) + (annotate-depth . [(20160520 2040) nil "Annotate buffer if indentation depth is beyond threshold" tar ((:url . "https://github.com/netromdk/annotate-depth") (:commit . "fcb24fa36287250e40d195590c4ca4a8a696277b") (:revdesc . "fcb24fa36287") (:keywords "convenience") (:authors ("Morten Slot Kristensen" . "mskATnullpointerDOTdk")) (:maintainers ("Morten Slot Kristensen" . "mskATnullpointerDOTdk")) (:maintainer "Morten Slot Kristensen" . "mskATnullpointerDOTdk"))]) + (annotation . [(20250805 1029) nil "Functions for annotating text with faces and help bubbles" tar ((:url . "https://github.com/agda/agda") (:commit . "213db6e50bb89c1b0b2832eab4c6caafb137eb6d") (:revdesc . "213db6e50bb8"))]) + (annoying-arrows-mode . [(20161024 646) ((cl-lib (0 5))) "Ring the bell if using arrows too much" tar ((:url . "https://github.com/magnars/annoying-arrows-mode.el") (:commit . "3c42e9807d7696da2da2a21b63beebf9cdb3f5dc") (:revdesc . "3c42e9807d76") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (ansi . [(20251118 230) ((emacs (24 1)) (cl-lib (0 6))) "Turn string into ansi strings" tar ((:url . "http://github.com/rejeep/ansi") (:commit . "a3aa9daa37a75fec22186399014a790a6c554311") (:revdesc . "a3aa9daa37a7") (:keywords "terminals" "color" "ansi") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (ansible . [(20250613 2354) ((s (1 9 0)) (f (0 16 2)) (emacs (25 1))) "Ansible minor mode" tar ((:url . "https://gitlab.com/emacs-ansible/emacs-ansible") (:commit . "7385222a4f209eca6d72d412c03da99097e2755f") (:revdesc . "7385222a4f20") (:authors (nil . "k1lowxb[at]gmail[dot]com") (nil . "k1low[at]101000lab[dot]org")) (:maintainers (nil . "k1lowxb[at]gmail[dot]com") (nil . "k1low[at]101000lab[dot]org")) (:maintainer nil . "k1lowxb[at]gmail[dot]com"))]) + (ansible-doc . [(20160924 824) ((emacs (24 3))) "Ansible documentation Minor Mode" tar ((:url . "https://github.com/lunaryorn/ansible-doc.el") (:commit . "bc8128a85a79b14f4a121105d87a5eddc33975ad") (:revdesc . "bc8128a85a79") (:keywords "tools" "help") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn"))]) + (ansible-vault . [(20251029 2146) ((emacs (26 1))) "Minor mode for editing ansible vault files" tar ((:url . "http://github.com/freehck/ansible-vault-mode") (:commit . "74f96ce226f51bec203af343f73182ea132749a6") (:revdesc . "74f96ce226f5") (:keywords "ansible" "ansible-vault" "tools") (:maintainers ("Dmitrii Kashin" . "freehck@yandex.ru")) (:maintainer "Dmitrii Kashin" . "freehck@yandex.ru"))]) + (ansilove . [(20250105 1853) ((emacs (26 1))) "Display buffers as PNG images using ansilove" tar ((:url . "https://gitlab.com/xgqt/emacs-ansilove/") (:commit . "a75eb6c89a1d96e1b4fa028ecca9be8b13c95230") (:revdesc . "a75eb6c89a1d") (:keywords "multimedia") (:authors ("Maciej Barć" . "xgqt@xgqt.org")) (:maintainers ("Maciej Barć" . "xgqt@xgqt.org")) (:maintainer "Maciej Barć" . "xgqt@xgqt.org"))]) + (ant . [(20160211 1543) nil "Helpers for compiling with ant" tar ((:url . "https://github.com/apg/ant-el") (:commit . "510b5a3f57ee4b2855422d88d359a28922c1ab70") (:revdesc . "510b5a3f57ee") (:keywords "compilation" "ant" "java"))]) + (anti-zenburn-theme . [(20180712 1838) nil "Low-contrast Zenburn-inverted theme" tar ((:url . "https://github.com/m00natic/anti-zenburn-theme") (:commit . "dbafbaa86be67c1d409873f57a5c0bbe1e7ca158") (:revdesc . "dbafbaa86be6") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainers ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com"))]) + (anx-api . [(20140208 1514) nil "Interact with the AppNexus API from Emacs" tar ((:url . "https://github.com/rmloveland/emacs-appnexus-api") (:commit . "b2411ebc966ac32c3ffc61bc22bf183834df0fa0") (:revdesc . "b2411ebc966a") (:keywords "convenience" "json" "rest" "api" "appnexus"))]) + (anybar . [(20160816 1421) nil "Control AnyBar from Emacs" tar ((:url . "https://github.com/tie-rack/anybar-el") (:commit . "7a0743e0d31bcb36ab1bb2e351f3e7139c422ac5") (:revdesc . "7a0743e0d31b") (:keywords "anybar") (:authors ("Christopher Shea" . "cmshea@gmail.com")) (:maintainers ("Christopher Shea" . "cmshea@gmail.com")) (:maintainer "Christopher Shea" . "cmshea@gmail.com"))]) + (anyins . [(20131229 1041) nil "Insert content at multiple places from shell command or kill-ring" tar ((:url . "http://github.com/antham/anyins") (:commit . "cd5e3c1abd471c8a67aafc42c4c985a2796f4b9f") (:revdesc . "cd5e3c1abd47") (:keywords "insert" "rectangular") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainers ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com"))]) + (anzu . [(20240929 201) ((emacs (25 1))) "Show number of matches in mode-line while searching" tar ((:url . "https://github.com/emacsorphanage/anzu") (:commit . "bc3a0032bb6aa7f5886f10460cd53eb7b8b020af") (:revdesc . "bc3a0032bb6a") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("LemonBreezes" . "look@strawberrytea.xyz")) (:maintainer "LemonBreezes" . "look@strawberrytea.xyz"))]) + (aozora-view . [(20140310 1317) nil "Aozora Bunko text Emacs viewer" tar ((:url . "https://github.com/kawabata/aozora-view") (:commit . "b0390616d19e45f15f9a2f5d5688274831e721fd") (:revdesc . "b0390616d19e") (:keywords "text") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (apache-mode . [(20210519 1931) nil "Major mode for editing Apache httpd configuration files" tar ((:url . "https://github.com/emacs-php/apache-mode") (:commit . "f2c11aac2f5fc598123e04f4604bea248689a117") (:revdesc . "f2c11aac2f5f") (:keywords "languages" "faces") (:authors ("Karl Chen" . "quarl@nospam.quarl.org")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (apdl-mode . [(20250508 908) ((emacs (25 1))) "Major mode for the APDL programming language" tar ((:url . "https://github.com/dieter-wilhelm/apdl-mode") (:commit . "4883ab085811b85cc75c44b5af478ab8f7e98386") (:revdesc . "4883ab085811") (:keywords "languages" "convenience" "tools" "ansys" "apdl") (:authors ("H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de")))]) + (apel . [(20250608 1806) ((emacs (24 5))) "Support for portable Emacs Lisp programs" tar ((:url . "https://github.com/emacsmirror/apel") (:commit . "1b043cfea58ea146356c237a5286ead69e97417b") (:revdesc . "1b043cfea58e"))]) + (apheleia . [(20251223 1924) ((emacs (27))) "Reformat buffer stably" tar ((:url . "https://github.com/radian-software/apheleia") (:commit . "426616cf1799dbce89800ae2fe9f155311436503") (:revdesc . "426616cf1799") (:keywords "tools") (:authors ("Radian LLC" . "contact+apheleia@radian.codes")) (:maintainers ("Radian LLC" . "contact+apheleia@radian.codes")) (:maintainer "Radian LLC" . "contact+apheleia@radian.codes"))]) + (apib-mode . [(20200101 1017) ((markdown-mode (2 1))) "Major mode for API Blueprint files" tar ((:url . "http://github.com/w-vi/apib-mode") (:commit . "c6dd05201f6eb9295736d8668a79a7510d11159e") (:revdesc . "c6dd05201f6e") (:keywords "tools" "api-blueprint") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainers ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainer "Vilibald Wanča" . "vilibald@wvi.cz"))]) + (apiwrap . [(20180602 2231) ((emacs (25))) "Api-wrapping macros" tar ((:url . "https://github.com/vermiculus/apiwrap.el") (:commit . "e4c9c57d6620a788ec8a715ff1bb50542edea3a6") (:revdesc . "e4c9c57d6620") (:keywords "tools" "maint" "convenience") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com"))]) + (app-monochrome-themes . [(20250710 2315) ((emacs (26 1))) "Low contrast monochrome themes" tar ((:url . "https://github.com/Greybeard-Entertainment/app-monochrome") (:commit . "bd8bfee0b64bf10543f4cefaf40bb5dcd4cf123b") (:revdesc . "bd8bfee0b64b") (:authors ("Aleksandr Petrosyan" . "appetrosan3@gmail.com")) (:maintainers ("Aleksandr Petrosyan" . "appetrosan3@gmail.com")) (:maintainer "Aleksandr Petrosyan" . "appetrosan3@gmail.com"))]) + (apparmor-mode . [(20241014 554) ((emacs (26 1))) "Major mode for editing AppArmor policy files" tar ((:url . "https://github.com/alexmurray/apparmor-mode") (:commit . "73c34f8e5a102da05d78bad12931c8e2c80352f2") (:revdesc . "73c34f8e5a10") (:authors ("Alex Murray" . "alex.murray@canonical.com")) (:maintainers ("Alex Murray" . "alex.murray@canonical.com")) (:maintainer "Alex Murray" . "alex.murray@canonical.com"))]) + (apples-mode . [(20110121 418) nil "Major mode for editing and executing AppleScript code" tar ((:url . "https://github.com/tequilasunset/apples-mode") (:commit . "83a9ab0d6ba82496e2f7df386909b1a55701fccb") (:revdesc . "83a9ab0d6ba8") (:keywords "applescript" "languages") (:authors ("tequilasunset" . "tequilasunset.mac@gmail.com")) (:maintainers ("tequilasunset" . "tequilasunset.mac@gmail.com")) (:maintainer "tequilasunset" . "tequilasunset.mac@gmail.com"))]) + (applescript-mode . [(20210802 1715) ((emacs (24 3))) "Major mode for editing AppleScript source" tar ((:url . "https://github.com/emacsorphanage/applescript-mode") (:commit . "00c141bbff46c89a96598b605dee05dd1d89f624") (:revdesc . "00c141bbff46") (:keywords "languages" "tools") (:authors ("sakito" . "sakito@users.sourceforge.jp")) (:maintainers ("sakito" . "sakito@users.sourceforge.jp")) (:maintainer "sakito" . "sakito@users.sourceforge.jp"))]) + (apropospriate-theme . [(20251010 121) nil "A colorful, low-contrast, light & dark theme set for Emacs with a fun name" tar ((:url . "http://github.com/waymondo/apropospriate-theme") (:commit . "2b26eed7e2063ca93998a6807f5a4e602483a23d") (:revdesc . "2b26eed7e206") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com"))]) + (apt-sources-list . [(20180527 1241) ((emacs (24 4))) "Mode for editing APT source.list files" tar ((:url . "https://git.korewanetadesu.com/apt-sources-list.git") (:commit . "44112833b3fa7f4d7e43708e5996782e22bb2fa3") (:revdesc . "44112833b3fa") (:authors ("Dr. Rafael Sepúlveda" . "drs@gnulinux.org.mx")) (:maintainers ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com"))]) + (aqi . [(20230530 1204) ((emacs (25 1)) (request (0 3)) (let-alist (0 0))) "Air quality data from the World Air Quality Index" tar ((:url . "https://github.com/zzkt/aqi") (:commit . "cbff3c6ce691a3a1d2f5636384e29d43f0e1d236") (:revdesc . "cbff3c6ce691") (:keywords "air quality" "aqi" "pollution" "weather" "data") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am"))]) + (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 ((:url . "https://github.com/brotzeitmacher/arch-packer") (:commit . "940e96f7d357c6570b675a0f942181c787f1bfd7") (:revdesc . "940e96f7d357") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainers ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainer "Fritz Stelzer" . "brotzeitmacher@gmail.com"))]) + (archive-phar . [(20221009 2129) ((emacs (28 1)) (php-runtime (0 2)) (datetime-format (0 0 1))) "Phar file support for archive-mode" tar ((:url . "https://github.com/emacs-php/archive-phar.el") (:commit . "0bda3e338446d06dbe9d8c8837dee746de48632f") (:revdesc . "0bda3e338446") (:keywords "files") (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (archive-region . [(20200316 1425) ((emacs (24 4))) "Move region to archive file instead of killing" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/archive-region.el") (:commit . "53cd2d96ea7c33f320353982b36854f25c900c2e") (:revdesc . "53cd2d96ea7c") (:keywords "languages") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (archive-rpm . [(20220527 632) ((emacs (24 4))) "RPM and CPIO support for archive-mode" tar ((:url . "https://github.com/nbarrientos/archive-rpm") (:commit . "cb48fee04cb0cbb26f760a3b95649f7dac78c6ec") (:revdesc . "cb48fee04cb0") (:keywords "files") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainers ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com"))]) + (arduino-cli-mode . [(20250524 901) ((emacs (25 1))) "Arduino-CLI command wrapper" tar ((:url . "https://github.com/motform/arduino-cli-mode") (:commit . "aa93d49dc90c54e61b70f40fe88967fc0ae04927") (:revdesc . "aa93d49dc90c") (:keywords "processes" "tools"))]) + (arduino-mode . [(20240527 1603) ((emacs (25 1)) (spinner (1 7 3))) "Major mode for editing Arduino code" tar ((:url . "https://repo.or.cz/arduino-mode.git") (:commit . "b2ffd8441851659cb1cc844156073967729585e5") (:revdesc . "b2ffd8441851") (:keywords "languages" "arduino") (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com"))]) + (aria2 . [(20230314 2131) ((emacs (25 1))) "Control aria2c commandline tool from Emacs" tar ((:url . "https://bitbucket.org/ukaszg/aria2-mode") (:commit . "1f2cbe624f3a4e0109b5dc123bb4bbed496b15a7") (:revdesc . "1f2cbe624f3a") (:keywords "download" "bittorrent" "aria2") (:authors ("ukasz Gruner" . "lukasz@gruner.lu")) (:maintainers ("ukasz Gruner" . "lukasz@gruner.lu")) (:maintainer "ukasz Gruner" . "lukasz@gruner.lu"))]) + (ariadne . [(20131117 1711) ((bert (0 1))) "Ariadne plugin for Emacs" tar ((:url . "https://github.com/manzyuk/ariadne-el") (:commit . "6fe401c7f996bcbc2f685e7971324c6f5e5eaf15") (:revdesc . "6fe401c7f996") (:keywords "comm" "convenience" "processes") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainers ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com"))]) + (arjen-grey-theme . [(20170522 2047) nil "A soothing dark grey theme" tar ((:url . "https://github.com/credmp/arjen-grey") (:commit . "4cd0be72b65d42390e2105cfdaa408a1ead8d8d1") (:revdesc . "4cd0be72b65d") (:keywords "faces") (:authors ("Arjen Wiersma" . "arjen@wiersma.org")) (:maintainers ("Arjen Wiersma" . "arjen@wiersma.org")) (:maintainer "Arjen Wiersma" . "arjen@wiersma.org"))]) + (arscript-mode . [(20240819 1927) ((emacs (25 1))) "Major mode for editing arscript files" tar ((:url . "https://github.com/captainflasmr/arscript-mode") (:commit . "797e1d0ef1312e8ff846abd0c6853358041f7691") (:revdesc . "797e1d0ef131") (:keywords "convenience") (:authors ("James Dyer" . "captainflasmr@gmail.com")) (:maintainers ("James Dyer" . "captainflasmr@gmail.com")) (:maintainer "James Dyer" . "captainflasmr@gmail.com"))]) + (artbollocks-mode . [(20251211 1624) ((emacs (25 1))) "Improve your writing (especially about art)" tar ((:url . "https://github.com/sachac/artbollocks-mode") (:commit . "63d20ed2846226f45b35eded69a776143a772ea4") (:revdesc . "63d20ed28462") (:authors ("Rob Myers" . "rob@robmyers.org") ("Sacha Chua" . "sacha@sachachua.com")) (:maintainers ("Rob Myers" . "rob@robmyers.org") ("Sacha Chua" . "sacha@sachachua.com")) (:maintainer "Rob Myers" . "rob@robmyers.org"))]) + (arview . [(20160419 2109) nil "Extract and view archives in the temporary directory" tar ((:url . "https://github.com/afainer/arview") (:commit . "5437b4221b64b238c273a651d4792c577dba6d45") (:revdesc . "5437b4221b64") (:keywords "files") (:authors ("Andrey Fainer" . "fandrey@gmx.com")) (:maintainers ("Andrey Fainer" . "fandrey@gmx.com")) (:maintainer "Andrey Fainer" . "fandrey@gmx.com"))]) + (arxiv-citation . [(20230713 627) ((emacs (25 1)) (dash (2 19 1)) (s (1 12 0))) "Utility functions for dealing with arXiv papers" tar ((:url . "https://gitlab.com/slotThe/arXiv-citation") (:commit . "04de0dae1121fb92c30b393449c6f8d6d940dbed") (:revdesc . "04de0dae1121") (:keywords "convenience") (:authors ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainers ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainer "Tony Zorman" . "soliditsallgood@mailbox.org"))]) + (arxiv-mode . [(20240111 2203) ((emacs (27 1)) (hydra (0))) "Read and search for articles on arXiv.org" tar ((:url . "https://github.com/fizban007/arxiv-mode") (:commit . "f629ec64f8bbac0cadb472c6741f8f33d49e9160") (:revdesc . "f629ec64f8bb") (:keywords "bib" "convenience" "hypermedia") (:authors ("Alex Chen" . "fizban007@gmail.com") ("Simon Lin" . "n.sibetz@gmail.com")) (:maintainers ("Alex Chen" . "fizban007@gmail.com") ("Simon Lin" . "n.sibetz@gmail.com")) (:maintainer "Alex Chen" . "fizban007@gmail.com"))]) + (ascii-table . [(20231215 1527) ((emacs (24 3))) "Interactive ASCII table" tar ((:url . "https://github.com/lassik/emacs-ascii-table") (:commit . "dc3c91feff6282303b66816bdcee9e031558ff77") (:revdesc . "dc3c91feff62") (:keywords "help" "tools") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (asdf-vm . [(20250710 1053) ((emacs (29 1))) "ASDF-VM porcelain" tar ((:url . "https://github.com/zellio/emacs-asdf-vm") (:commit . "f6dbb4b6560cd7e5bb05006e9fc416c5c323b567") (:revdesc . "f6dbb4b6560c") (:keywords "tools" "asdf-vm" "asdf") (:authors ("Zachary Elliott" . "contact@zell.io")) (:maintainers ("Zachary Elliott" . "contact@zell.io")) (:maintainer "Zachary Elliott" . "contact@zell.io"))]) + (asilea . [(20150105 1525) ((emacs (24)) (cl-lib (0 5))) "Find best compiler options using simulated annealing" tar ((:url . "https://github.com/Fanael/asilea") (:commit . "2aab1cc63b64ef08d12e84fd7ba5c94065f6039f") (:revdesc . "2aab1cc63b64") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com"))]) + (asm-blox . [(20240106 1930) ((emacs (26 1)) (yaml (0 5 1))) "Programming game involving WAT" tar ((:url . "https://github.com/zkry/asm-blox") (:commit . "6731d8e4f78d0b43ec9b90d8184c1d86d725ac7c") (:revdesc . "6731d8e4f78d") (:keywords "games"))]) + (asn1-mode . [(20170729 226) ((emacs (24 3)) (s (1 10 0))) "ASN.1/GDMO mode for GNU Emacs" tar ((:url . "https://github.com/kawabata/asn1-mode/") (:commit . "d5d4a8259daf708411699bcea85d322f18beb972") (:revdesc . "d5d4a8259daf") (:keywords "languages" "processes" "tools") (:authors ("Taichi Kawabata" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi Kawabata" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi Kawabata" . "kawabata.taichi_at_gmail.com"))]) + (assess . [(20240303 1454) ((emacs (24 4)) (m-buffer (0 15))) "Test support functions" tar ((:url . "https://github.com/phillord/assess") (:commit . "cadeb24a5d8261fad4bdfdc09e7d571cc395a6ca") (:revdesc . "cadeb24a5d82") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))]) + (ast-grep . [(20250703 723) ((emacs (28 1))) "Search code using ast-grep with completing-read interface" tar ((:url . "https://github.com/sunskyxh/ast-grep.el") (:commit . "3682f0cab0147e85d3f8ffc6b68b1dc30ffba5cd") (:revdesc . "3682f0cab014") (:keywords "tools" "matching") (:authors ("SunskyxXH" . "sunskyxh@gmail.com")) (:maintainers ("SunskyxXH" . "sunskyxh@gmail.com")) (:maintainer "SunskyxXH" . "sunskyxh@gmail.com"))]) + (astro-ts-mode . [(20250308 2341) ((emacs (30))) "Major mode for editing Astro templates" tar ((:url . "https://github.com/Sorixelle/astro-ts-mode") (:commit . "886d692378d0da2071e710c1e6db02e5b2e0dd30") (:revdesc . "886d692378d0") (:keywords "languages") (:authors ("Ruby Iris Juric" . "ruby@srxl.me")) (:maintainers ("Ruby Iris Juric" . "ruby@srxl.me")) (:maintainer "Ruby Iris Juric" . "ruby@srxl.me"))]) + (astute . [(20241015 444) ((emacs (25 1))) "A minor mode to redisplay `smart' typography" tar ((:url . "https://github.com/rnkn/astute") (:commit . "69d413c952771c0d06cda161fb25fe495fb895b0") (:revdesc . "69d413c95277") (:keywords "faces" "wp") (:authors ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainers ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainer "Paul W. Rankin" . "rnkn@rnkn.xyz"))]) + (astyle . [(20200328 616) ((emacs (24 4)) (reformatter (0 3))) "Astyle formatter functions" tar ((:url . "https://github.com/storvik/emacs-astyle") (:commit . "04ff2941f08c4b731fe6a18ee1697436d1ca1cc0") (:revdesc . "04ff2941f08c") (:keywords "astyle" "c" "c++" "cpp" "reformatter"))]) + (asx . [(20191024 1100) ((emacs (26 1))) "Ask StackExchange/StackOverflow" tar ((:url . "https://github.com/ragone/asx") (:commit . "5ca12cc51bb02b5926adf9a7976ba9ca08a1ea21") (:revdesc . "5ca12cc51bb0") (:keywords "convenience") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainers ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com"))]) + (async . [(20251005 634) ((emacs (24 4))) "Asynchronous processing in Emacs" tar ((:url . "https://github.com/jwiegley/emacs-async") (:commit . "31cb2fea8f4bc7a593acd76187a89075d8075500") (:revdesc . "31cb2fea8f4b") (:keywords "async") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net"))]) + (async-await . [(20220827 437) ((emacs (25 1)) (promise (1 1)) (iter2 (0 9 10))) "Async/Await" tar ((:url . "https://github.com/chuntaro/emacs-async-await") (:commit . "e0d15e8057ed7520100bc50c5552278292ebcb07") (:revdesc . "e0d15e8057ed") (:keywords "async" "await" "convenience") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainers ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp"))]) + (async-backup . [(20230412 1534) ((emacs (24 4))) "Backup on each save without freezing Emacs" tar ((:url . "https://codeberg.org/contrapunctus/async-backup") (:commit . "d07a7bd4a5c3332a8a585680d67925385c595927") (:revdesc . "d07a7bd4a5c3") (:keywords "files") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de"))]) + (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 ((:url . "https://github.com/owinebar/emacs-async-job-queue") (:commit . "eeafcce7f960305666b2a51aec55cc6333f6af1b") (:revdesc . "eeafcce7f960") (:keywords "extensions" "lisp"))]) + (async-status . [(20230821 204) ((emacs (28 1)) (svg-lib (0 2 7)) (posframe (1 4 2))) "A package for indicator support" tar ((:url . "https://github.com/seokbeomkim/async-status") (:commit . "d2f5becc9850c26aa71fb581f9fc389eac740f52") (:revdesc . "d2f5becc9850") (:keywords "tools" "async") (:authors ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainers ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainer "Jason Kim" . "sukbeom.kim@gmail.com"))]) + (async1 . [(20250929 1752) ((emacs (24 1)) (compat (30 1))) "Unroll chain of async callbacks, parallel and sequencial" tar ((:url . "https://github.com/Anoncheg1/emacs-async1") (:commit . "ab8786693f7750f65fbfea07702fece812c57248") (:revdesc . "ab8786693f77") (:keywords "tools" "async" "callback" "lisp" "extensions") (:authors (nil . "github.com/Anoncheg1,codeberg.org/Anoncheg")) (:maintainers (nil . "github.com/Anoncheg1,codeberg.org/Anoncheg")) (:maintainer nil . "github.com/Anoncheg1,codeberg.org/Anoncheg"))]) + (asyncloop . [(20240818 1247) ((emacs (28))) "Non-blocking series of functions" tar ((:url . "https://github.com/meedstrom/asyncloop") (:commit . "7d60950d160098a879293e049b9863bc955f8666") (:revdesc . "7d60950d1600") (:keywords "tools") (:authors ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainers ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainer "Martin Edström" . "meedstrom91@gmail.com"))]) + (atcoder-tools . [(20200109 1236) ((emacs (26)) (f (0 20)) (s (1 12))) "An atcoder-tools client" tar ((:url . "https://github.com/sei40kr/atcoder-tools") (:commit . "cfe61ed18ea9b3b1bfb6f9e7d80a47599680cd1f") (:revdesc . "cfe61ed18ea9") (:keywords "extensions" "tools") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainers ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com"))]) + (atl-long-lines . [(20240101 929) ((emacs (24 3))) "Turn off truncate-lines when the line is long" tar ((:url . "https://github.com/jcs-elpa/atl-long-lines") (:commit . "82cdd4edefba2d5b1d491bf3fcc487385819d713") (:revdesc . "82cdd4edefba") (:keywords "convenience" "truncate" "lines" "auto" "long") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (atl-markup . [(20240101 933) ((emacs (24 3))) "Automatically truncate lines for markup languages" tar ((:url . "https://github.com/jcs-elpa/atl-markup") (:commit . "b616343ffe17060d521b214b8e90f5da1e880934") (:revdesc . "b616343ffe17") (:keywords "convenience" "automatic" "truncate" "visual" "lines") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (atom-dark-theme . [(20220114 1902) nil "An Emacs port of the Atom Dark theme from Atom.io" tar ((:url . "https://github.com/whitlockjc/atom-dark-theme-emacs") (:commit . "2b3c7ad42bbcab3214a131f8957b92e717b36ad3") (:revdesc . "2b3c7ad42bbc") (:keywords "themes" "atom" "dark") (:authors ("Jeremy Whitlock" . "jwhitlock@apache.org")) (:maintainers ("Jeremy Whitlock" . "jwhitlock@apache.org")) (:maintainer "Jeremy Whitlock" . "jwhitlock@apache.org"))]) + (atom-one-dark-theme . [(20210128 1640) nil "Atom One Dark color theme" tar ((:url . "https://github.com/jonathanchu/atom-one-dark-theme") (:commit . "b34b62e85593812b55ee552a1cb0eecfb04767bb") (:revdesc . "b34b62e85593") (:authors ("Jonathan Chu" . "me@jonathanchu.is")) (:maintainers ("Jonathan Chu" . "me@jonathanchu.is")) (:maintainer "Jonathan Chu" . "me@jonathanchu.is"))]) + (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 ((:url . "https://github.com/alpha22jp/atomic-chrome") (:commit . "f1b077be7e414f457191d72dcf5eedb4371f9309") (:revdesc . "f1b077be7e41") (:keywords "chrome" "edit" "textarea") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainers ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com"))]) + (attrap . [(20251221 914) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (s (1 11 0))) "ATtempt To Repair At Point" tar ((:url . "https://github.com/jyp/attrap") (:commit . "2cb8d146635a4e1fb92a027551253629c6f55a1b") (:revdesc . "2cb8d146635a") (:keywords "programming" "tools") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainers ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com"))]) + (auctex-cluttex . [(20240519 1303) ((emacs (24 4)) (auctex (13 1))) "ClutTeX support for AUCTeX" tar ((:url . "https://github.com/tsuu32/auctex-cluttex") (:commit . "1a940892dcbe3e4874d2d60db92de1cb34a1b773") (:revdesc . "1a940892dcbe") (:keywords "tex") (:authors ("Masahiro Nakamura" . "tsuucat@icloud.com")) (:maintainers ("Masahiro Nakamura" . "tsuucat@icloud.com")) (:maintainer "Masahiro Nakamura" . "tsuucat@icloud.com"))]) + (auctex-latexmk . [(20221025 1219) ((auctex (11 87))) "Add LatexMk support to AUCTeX" tar ((:url . "https://github.com/tom-tan/auctex-latexmk/") (:commit . "b00a95e6b34c94987fda5a57c20cfe2f064b1c7a") (:revdesc . "b00a95e6b34c") (:keywords "tex") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com"))]) + (auctex-lua . [(20151121 1610) ((auctex (11 86)) (lua-mode (20130419))) "Lua editing support for AUCTeX" tar ((:url . "http://github.com/vermiculus/auctex-lua") (:commit . "799cd8ac10c96991bb63d9aa60528ae5d8c786b5") (:revdesc . "799cd8ac10c9") (:keywords "latex" "lua") (:authors ("Sean Allred" . "(seallred@smcm.edu)")) (:maintainers ("Sean Allred" . "(seallred@smcm.edu)")) (:maintainer "Sean Allred" . "(seallred@smcm.edu)"))]) + (audacious . [(20210917 51) ((helm (3 6 2)) (emacs (24 4))) "Emacs interface to control audacious" tar ((:url . "https://github.com/shishimaru/audacious.el") (:commit . "65c37f12a5c774a0ae434beee27ff7737006dd2f") (:revdesc . "65c37f12a5c7") (:authors ("Hitoshi Uchida" . "hitoshi.uchida@gmail.com")) (:maintainers ("Hitoshi Uchida" . "hitoshi.uchida@gmail.com")) (:maintainer "Hitoshi Uchida" . "hitoshi.uchida@gmail.com"))]) + (audio-notes-mode . [(20170611 2159) nil "Play audio notes synced from somewhere else" tar ((:url . "http://github.com/Bruce-Connor/audio-notes-mode") (:commit . "fa38350829c7e97257efc746a010471d33748a68") (:revdesc . "fa38350829c7") (:keywords "hypermedia" "convenience") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (aurel . [(20170114 937) ((emacs (24 3)) (bui (1 1 0)) (dash (2 11 0))) "Search, get info, vote for and download AUR packages" tar ((:url . "https://github.com/alezost/aurel") (:commit . "fc7ad208f43f8525f84a18941c9b55f956df8961") (:revdesc . "fc7ad208f43f") (:keywords "tools") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (aurora-config-mode . [(20180216 2302) nil "Major mode for Apache Aurora configuration files" tar ((:url . "https://github.com/bdd/aurora-config.el") (:commit . "8273ec7937a21b469b9dbb6c11714255b890f410") (:revdesc . "8273ec7937a2") (:keywords "languages" "configuration") (:authors ("Berk D. Demir" . "bdd@mindcast.org")) (:maintainers ("Berk D. Demir" . "bdd@mindcast.org")) (:maintainer "Berk D. Demir" . "bdd@mindcast.org"))]) + (australia-holidays . [(20250706 1213) ((emacs (24 1))) "Australian holidays for calendar" tar ((:url . "https://github.com/jmibanez/australia-holidays.el") (:commit . "a73bbc940bc953164b8ed77e61e65a7a3aff4da5") (:revdesc . "a73bbc940bc9") (:keywords "calendar") (:authors ("JM Ibañez" . "jm@jmibanez.com")) (:maintainers ("JM Ibañez" . "jm@jmibanez.com")) (:maintainer "JM Ibañez" . "jm@jmibanez.com"))]) + (auth-source-1password . [(20230529 1349) ((emacs (24 4))) "1password integration for auth-source" tar ((:url . "https://github.com/dlobraico") (:commit . "7bb8ad3507c58cc642b2ebbd7e57a91efab80e14") (:revdesc . "7bb8ad3507c5") (:authors ("Dominick LoBraico" . "auth-source-1password@lobrai.co")) (:maintainers ("Dominick LoBraico" . "auth-source-1password@lobrai.co")) (:maintainer "Dominick LoBraico" . "auth-source-1password@lobrai.co"))]) + (auth-source-gopass . [(20230109 1213) ((emacs (24 4))) "Gopass integration for auth-source" tar ((:url . "https://github.com/") (:commit . "6f7f0cc0d682f66d11f7fac4fa5c1e79904232da") (:revdesc . "6f7f0cc0d682") (:authors ("Markus M. May" . "mmay@javafreedom.org")) (:maintainers ("Markus M. May" . "mmay@javafreedom.org")) (:maintainer "Markus M. May" . "mmay@javafreedom.org"))]) + (auth-source-keytar . [(20250101 849) ((emacs (24 4)) (keytar (0 1 2)) (s (1 12 0))) "Integrate auth-source with keytar" tar ((:url . "https://github.com/emacs-grammarly/auth-source-keytar") (:commit . "2dd34b937e99e367386679e9f42d6ea0411ffe12") (:revdesc . "2dd34b937e99") (:keywords "convenience" "keytar" "password" "credential" "secret" "security") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (auth-source-kwallet . [(20250419 1330) ((emacs (24 4))) "KWallet integration for auth-source" tar ((:url . "https://github.com/vaartis/auth-source-kwallet") (:commit . "1e1bff2403966c3a0683ee65fb28cb8d8ff2c389") (:revdesc . "1e1bff240396") (:authors ("Ekaterina Vaartis" . "vaartis@kotobank.ch")) (:maintainers ("Ekaterina Vaartis" . "vaartis@kotobank.ch")) (:maintainer "Ekaterina Vaartis" . "vaartis@kotobank.ch"))]) + (auth-source-xoauth2 . [(20220804 2219) ((emacs (26 1))) "Integrate auth-source with XOAUTH2" tar ((:url . "https://github.com/ccrusius/auth-source-xoauth2") (:commit . "99a03f8ce835412943d311b2746e77fcf5a1b500") (:revdesc . "99a03f8ce835") (:authors ("Cesar Crusius" . "ccrusius@google.com")) (:maintainers ("Cesar Crusius" . "ccrusius@google.com")) (:maintainer "Cesar Crusius" . "ccrusius@google.com"))]) + (auto-async-byte-compile . [(20160916 454) nil "Automatically byte-compile when saved" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/auto-async-byte-compile.el") (:commit . "8681e74ddb8481789c5dbb3cafabb327db4c4484") (:revdesc . "8681e74ddb84") (:keywords "lisp" "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (auto-auto-indent . [(20131106 1903) ((es-lib (0 1)) (cl-lib (1 0))) "Indents code as you type" tar ((:url . "https://github.com/sabof/auto-auto-indent") (:commit . "0139378577f936d34b20276af6f022fb457af490") (:revdesc . "0139378577f9"))]) + (auto-compile . [(20251111 1802) ((emacs (27 1))) "Automatically compile Emacs Lisp libraries" tar ((:url . "https://github.com/emacscollective/auto-compile") (:commit . "7d314cc13515a1bd6ded29e69a9d4be4aff205c3") (:revdesc . "7d314cc13515") (:keywords "compile" "convenience" "lisp") (:authors ("Jonas Bernoulli" . "emacs.auto-compile@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.auto-compile@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.auto-compile@jonas.bernoulli.dev"))]) + (auto-complete . [(20251123 1919) ((emacs (25 1)) (popup (0 5 8))) "Auto Completion for GNU Emacs" tar ((:url . "https://github.com/auto-complete/auto-complete") (:commit . "1dbfb343412f9444dcd2d9a08b7b42c7270c9547") (:revdesc . "1dbfb343412f") (:keywords "completion" "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (auto-complete-auctex . [(20140223 1758) ((yasnippet (0 6 1)) (auto-complete (1 4))) "Auto-completion for auctex" tar ((:url . "https://github.com/emacsattic/auto-complete-auctex") (:commit . "855633f668bcc4b9408396742a7cb84e0c4a2f77") (:revdesc . "855633f668bc") (: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 ((:url . "https://github.com/mooz/auto-complete-c-headers") (:commit . "52fef720c6f274ad8de52bef39a343421006c511") (:revdesc . "52fef720c6f2") (:keywords "c") (:authors ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainers ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainer "Masafumi Oyamada" . "stillpedant@gmail.com"))]) + (auto-complete-chunk . [(20140225 946) ((auto-complete (1 4))) "Auto-completion for dot.separated.words" tar ((:url . "https://github.com/tkf/auto-complete-chunk") (:commit . "a9aa77ffb84a1037984a7ce4dda25074272f13fe") (:revdesc . "a9aa77ffb84a"))]) + (auto-complete-clang . [(20140409 752) ((auto-complete (1 3 1))) "Auto Completion source for clang for GNU Emacs" tar ((:url . "https://github.com/brianjcj/auto-complete-clang") (:commit . "a195db1d0593b4fb97efe50885e12aa6764d998c") (:revdesc . "a195db1d0593") (:keywords "completion" "convenience") (:authors ("Brian Jiang" . "brianjcj@gmail.com")) (:maintainers ("Brian Jiang" . "brianjcj@gmail.com")) (:maintainer "Brian Jiang" . "brianjcj@gmail.com"))]) + (auto-complete-clang-async . [(20130526 1527) nil "Auto Completion source for clang for GNU Emacs" tar ((:url . "https://github.com/Golevka/emacs-clang-complete-async") (:commit . "a5114e3477793ccb9420acc5cd6a1cb26be65964") (:revdesc . "a5114e347779") (:keywords "completion" "convenience"))]) + (auto-complete-distel . [(20180827 1344) ((auto-complete (1 4)) (distel-completion-lib (1 0 0))) "Erlang/distel completion backend for auto-complete-mode" tar ((:url . "github.com/sebastiw/distel-completion") (:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:revdesc . "acc4c0a55219") (:keywords "erlang" "distel" "auto-complete"))]) + (auto-complete-exuberant-ctags . [(20140320 724) ((auto-complete (1 4 0))) "Exuberant ctags auto-complete.el source" tar ((:url . "http://code.101000lab.org") (:commit . "ff6121ff8b71beb5aa606d28fd389c484ed49765") (:revdesc . "ff6121ff8b71") (:keywords "anto-complete" "exuberant ctags") (:authors ("Kenichirou Oyama" . "k1lowxb@gmail.com")) (:maintainers ("Kenichirou Oyama" . "k1lowxb@gmail.com")) (:maintainer "Kenichirou Oyama" . "k1lowxb@gmail.com"))]) + (auto-complete-nxml . [(20140221 458) ((auto-complete (1 4))) "Do completion by auto-complete.el on nXML-mode" tar ((:url . "https://github.com/aki2o/auto-complete-nxml") (:commit . "ac7b09a23e45f9bd02affb31847263de4180163a") (:revdesc . "ac7b09a23e45") (:keywords "completion" "html" "xml") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (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 ((:url . "https://github.com/aki2o/auto-complete-pcmp") (:commit . "2595d3dab1ef3549271ca922f212928e9d830eec") (:revdesc . "2595d3dab1ef") (:keywords "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (auto-complete-rst . [(20140225 944) ((auto-complete (1 4))) "Auto-complete extension for ReST and Sphinx" tar ((:url . "https://github.com/tkf/auto-complete-rst") (:commit . "4803ce41a96224e6fa54e6741a5b5f40ebed7351") (:revdesc . "4803ce41a962"))]) + (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 ((:url . "https://github.com/stakemori/auto-complete-sage") (:commit . "51b8e3905196d266e1f8aa47881189833151b398") (:revdesc . "51b8e3905196") (:keywords "sage" "math" "auto-complete") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainers ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com"))]) + (auto-dark . [(20251006 358) ((emacs (24 4))) "Automatically set the dark-mode theme based on system status" tar ((:url . "https://github.com/LionyxML/auto-dark-emacs") (:commit . "a71e791e47d09c5bf4bcbc2bbd7300b71ff72f1a") (:revdesc . "a71e791e47d0") (:keywords "macos" "windows" "linux" "themes" "tools" "faces") (:authors ("Tim Harper" . "timcharperatgmaildotcom") ("Vincent Zhang" . "seagle0128@gmail.com") ("Jonathan Arnett" . "jonathan.arnett@protonmail.com") ("Greg Pfeil" . "greg@technomadic.org")) (:maintainers ("Tim Harper" . "timcharperatgmaildotcom") ("Vincent Zhang" . "seagle0128@gmail.com") ("Jonathan Arnett" . "jonathan.arnett@protonmail.com") ("Greg Pfeil" . "greg@technomadic.org")) (:maintainer "Tim Harper" . "timcharperatgmaildotcom"))]) + (auto-dictionary . [(20150410 1610) nil "Automatic dictionary switcher for flyspell" tar ((:url . "http://nschum.de/src/emacs/auto-dictionary/") (:commit . "b364e08009fe0062cf0927d8a0582fad5a12b8e7") (:revdesc . "b364e08009fe") (:keywords "wp") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainer "Nikolaj Schumacher" . "bugs*nschumde"))]) + (auto-dim-other-buffers . [(20250116 1402) ((emacs (27 1))) "Makes windows without focus less prominent" tar ((:url . "https://github.com/mina86/auto-dim-other-buffers.el") (:commit . "d8591d048f97478e75c71830fb6d7c009351c73d") (:revdesc . "d8591d048f97") (:keywords "faces") (:authors ("Michal Nazarewicz" . "mina86@mina86.com")) (:maintainers ("Michal Nazarewicz" . "mina86@mina86.com")) (:maintainer "Michal Nazarewicz" . "mina86@mina86.com"))]) + (auto-highlight-symbol . [(20240627 650) ((emacs (26 1)) (ht (2 3))) "Automatic highlighting current symbol minor mode" tar ((:url . "http://github.com/elp-revive/auto-highlight-symbol") (:commit . "fe230750fdd3de07f71e776cb3270754e0865234") (:revdesc . "fe230750fdd3") (:keywords "highlight" "face" "match" "convenience") (:authors ("Mitsuo Saito" . "arch320@NOSPAM.gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (auto-indent-mode . [(20211029 11) nil "Auto indent Minor mode" tar ((:url . "https://github.com/mlf176f2/auto-indent-mode.el/") (:commit . "664006b67329a8e27330541547f8c2187dab947c") (:revdesc . "664006b67329") (:keywords "auto" "indentation"))]) + (auto-minor-mode . [(20180527 1123) ((emacs (24 4))) "Enable minor modes by file name and contents" tar ((:url . "https://github.com/joewreschnig/auto-minor-mode") (:commit . "c62f4e04c7b73835c399f0348bea0ade2720bcbb") (:revdesc . "c62f4e04c7b7") (:keywords "convenience") (:authors ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainers ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com"))]) + (auto-org-md . [(20180213 2343) ((emacs (24 4))) "Export a markdown file automatically when you save an org-file" tar ((:url . "https://github.com/jamcha-aa/auto-org-md") (:commit . "9318338bdb7fe8bd698d88f3af89b2d6413efdd2") (:revdesc . "9318338bdb7f") (:keywords "org" "markdown") (:authors ("jamcha" . "jamcha.aa@gmail.com")) (:maintainers ("jamcha" . "jamcha.aa@gmail.com")) (:maintainer "jamcha" . "jamcha.aa@gmail.com"))]) + (auto-package-update . [(20211108 2025) ((emacs (24 4)) (dash (2 1 0))) "Automatically update Emacs packages" tar ((:url . "http://github.com/rranelli/auto-package-update.el") (:commit . "ad95435fefe2bb501d1d787b08272f9c1b7df488") (:revdesc . "ad95435fefe2") (:keywords "package" "update"))]) + (auto-pause . [(20160426 1216) ((emacs (24 4))) "Run processes which will be paused when Emacs is idle" tar ((:url . "https://github.com/lujun9972/auto-pause") (:commit . "a4d778de774ca3895542cb559a953e0d98657338") (:revdesc . "a4d778de774c") (:keywords "convenience" "menu") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (auto-read-only . [(20200827 1754) ((emacs (25 1)) (cl-lib (0 5))) "Automatically make the buffer to read-only" tar ((:url . "https://github.com/zonuexe/auto-read-only.el") (:commit . "db209bf5b7f76f4c3dc4d0892fc6a24430779f29") (:revdesc . "db209bf5b7f7") (:keywords "files" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (auto-rename-tag . [(20250101 906) ((emacs (24 4))) "Automatically rename paired HTML/XML tag" tar ((:url . "https://github.com/emacs-vs/auto-rename-tag") (:commit . "b38895ff4821df3a0461959146e9f912d2acde4e") (:revdesc . "b38895ff4821") (:keywords "convenience" "auto-complete" "html" "rename" "tag" "xml") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (auto-save-buffers-enhanced . [(20161109 710) nil "Automatically save buffers in a decent way" tar ((:url . "https://github.com/kentaro/auto-save-buffers-enhanced") (:commit . "461e8c816c1b7c650be5f209078b381fe55da8c6") (:revdesc . "461e8c816c1b") (:authors ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainers ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainer "Kentaro Kuribayashi" . "kentarok@gmail.com"))]) + (auto-save-visited-local-mode . [(20251021 1126) ((emacs (26 1))) "Buffer-local auto-save for visited files" tar ((:url . "https://github.com/pierrelegall/auto-save-visited-local-mode") (:commit . "78a46d8a02360b4c63e45496bd32efe351459c81") (:revdesc . "78a46d8a0236") (:keywords "convenience" "files" "autosave") (:authors ("Pierre Le Gall" . "pierre@legall.im")) (:maintainers ("Pierre" . "pierre@legall.im")) (:maintainer "Pierre" . "pierre@legall.im"))]) + (auto-shell-command . [(20180817 1502) ((deferred (20130312)) (popwin (20130329))) "Run the shell command asynchronously that you specified when you save the file" tar ((:url . "https://github.com/ongaeshi/auto-shell-command") (:commit . "a8f9213e3c773b5687b81881240e6e648f2f56ba") (:revdesc . "a8f9213e3c77") (:keywords "shell" "save" "async" "deferred" "auto"))]) + (auto-sort-mode . [(20230827 2124) ((emacs (24 1))) "Automatically sort lines between two delimiters" tar ((:url . "https://github.com/rweir/auto-sort-mode") (:commit . "3ffa4e2a76a6dda949fdfd200f623a17c4796559") (:revdesc . "3ffa4e2a76a6") (:keywords "sorting" "sort" "matching" "tools") (:authors ("Rob Weir" . "rweir@ertius.org")) (:maintainers ("Rob Weir" . "rweir@ertius.org")) (:maintainer "Rob Weir" . "rweir@ertius.org"))]) + (auto-sudoedit . [(20230907 724) ((emacs (26 1)) (f (0 19 0))) "Auto sudo edit by tramp" tar ((:url . "https://github.com/ncaq/auto-sudoedit") (:commit . "1caa127db200f86d1cfdeaae4410a673f0ae11e0") (:revdesc . "1caa127db200") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainers ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net"))]) + (auto-virtualenv . [(20250608 1633) ((cl-lib (0 5))) "Automatically activate Python virtualenvs based on project directory" tar ((:url . "https://github.com/marcwebbie/auto-virtualenv") (:commit . "b39a7496cc4e226ef1f9fcdfeb5a12400f71c982") (:revdesc . "b39a7496cc4e") (:keywords "python" "virtualenv" "environment" "tools" "projects") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainers ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com"))]) + (auto-virtualenvwrapper . [(20230317 1313) ((cl-lib (1 0)) (s (1 13 0)) (virtualenvwrapper (0))) "Lightweight auto activate python virtualenvs" tar ((:url . "https://github.com/robert-zaremba/auto-virtualenvwrapper.el") (:commit . "8cc2616af46d7e26c1d9ecea5fffd8974e5b1acb") (:revdesc . "8cc2616af46d") (:keywords "python" "virtualenv" "tools") (:authors ("Marcwebbie" . "marcwebbie@gmail.com") ("Robert Zaremba" . "robert-zaremba@scale-it.pl")) (:maintainers ("Marcwebbie" . "marcwebbie@gmail.com") ("Robert Zaremba" . "robert-zaremba@scale-it.pl")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com"))]) + (auto-yasnippet . [(20230208 331) ((yasnippet (0 14 0)) (emacs (25 1))) "Quickly create disposable yasnippets" tar ((:url . "https://github.com/abo-abo/auto-yasnippet") (:commit . "6a9e406d0d7f9dfd6dff7647f358cb05a0b1637e") (:revdesc . "6a9e406d0d7f") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com") ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (autobookmarks . [(20220509 1712) ((dash (2 10 0)) (cl-lib (0 5))) "Save recently visited files and buffers" tar ((:url . "https://github.com/Fuco1/autobookmarks") (:commit . "8acd6f182181e23257e01c1b5cf90b872507a74d") (:revdesc . "8acd6f182181") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (autobuild . [(20240430 1600) ((emacs (26 1)) (selcand (0 0 3))) "Define and execute build rules and compilation pipelines" tar ((:url . "https://github.com/erjoalgo/autobuild") (:commit . "4760f6ea843d5d15c3fcf7cbf6b69153b61739fa") (:revdesc . "4760f6ea843d") (:keywords "compile" "build" "pipeline" "autobuild" "extensions" "processes" "tools") (:maintainers ("concat \"erjoalgo\" \"@\" \"gmail\" \".com\"" . "")) (:maintainer "concat \"erjoalgo\" \"@\" \"gmail\" \".com\"" . ""))]) + (autodisass-java-bytecode . [(20230907 1729) nil "Automatically disassemble Java bytecode" tar ((:url . "https://github.com/gbalats/autodisass-java-bytecode") (:commit . "02788145f5c70e9004c4eba5acffbb584fe7de37") (:revdesc . "02788145f5c7") (:keywords "convenience" "data" "files") (:authors ("George Balatsouras" . "gbalatsgmailcom")) (:maintainers ("George Balatsouras" . "gbalatsgmailcom")) (:maintainer "George Balatsouras" . "gbalatsgmailcom"))]) + (autodisass-llvm-bitcode . [(20150411 125) nil "Automatically disassemble LLVM bitcode" tar ((:url . "https://github.com/gbalats/autodisass-llvm-bitcode") (:commit . "14bb1bfe2be3b04d6e0c87a7a9d1e88ce15506d0") (:revdesc . "14bb1bfe2be3") (:keywords "convenience" "data" "files") (:authors ("George Balatsouras" . "gbalatsgmailcom")) (:maintainers ("George Balatsouras" . "gbalatsgmailcom")) (:maintainer "George Balatsouras" . "gbalatsgmailcom"))]) + (automoji . [(20250814 2054) ((emacs (29 1))) "Discord-like emoji completion" tar ((:url . "https://github.com/Dev380/automoji-el") (:commit . "725e6915f9976bd7fd87a4daa7dc9f1968bcfe23") (:revdesc . "725e6915f997") (:keywords "completion" "abbrev" "convenience" "text"))]) + (autoscratch . [(20251217 1834) ((emacs (24 1))) "Automatically switch scratch buffer mode" tar ((:url . "https://codeberg.org/scip/autoscratch") (:commit . "c56cc89dc4a51e0d5966391d78849dc391634bb5") (:revdesc . "c56cc89dc4a5") (:keywords "convenience" "buffer" "scrach") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainers ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org"))]) + (autotetris-mode . [(20141114 1646) ((cl-lib (0 5))) "Automatically play tetris" tar ((:url . "https://github.com/skeeto/autotetris-mode") (:commit . "7d348d33829bc89ddbd2b4d5cfe5073c3b0cbaaa") (:revdesc . "7d348d33829b") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (autothemer . [(20251114 415) ((dash (2 10 0)) (emacs (26 1))) "Conveniently define themes" tar ((:url . "https://github.com/jasonm23/autothemer") (:commit . "e62bf83414abd8b1cefafb7480612faa30ed7878") (:revdesc . "e62bf83414ab") (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (autumn-light-theme . [(20150515 1447) nil "A light color theme with muted, autumnal colors" tar ((:url . "http://github.com/aalpern/emacs-color-theme-autumn-light") (:commit . "26a52a79e7fff401af6d24c4365bb4a250c1136a") (:revdesc . "26a52a79e7ff") (:keywords "color" "theme") (:authors ("Adam Alpern" . "adam.alpern@gmail.com")) (:maintainers ("Adam Alpern" . "adam.alpern@gmail.com")) (:maintainer "Adam Alpern" . "adam.alpern@gmail.com"))]) + (avandu . [(20221106 834) nil "Gateway to Tiny Tiny RSS" tar ((:url . "https://github.com/ryuslash/avandu") (:commit . "f064cd62f878d945cc2f202cda9a1a82b39d9e22") (:revdesc . "f064cd62f878") (:keywords "net") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org"))]) + (avk-emacs-themes . [(20230825 922) nil "Collection of avk themes" tar ((:url . "https://github.com/avkoval/avk-emacs-themes") (:commit . "abe6fd059e0a7e8fcf2eb95b16c3dfac5620b1e7") (:revdesc . "abe6fd059e0a") (:keywords "theme") (:authors ("Alex V. Koval" . "alex@koval.kharkov.ua")) (:maintainers ("Alex V. Koval" . "alex@koval.kharkov.ua")) (:maintainer "Alex V. Koval" . "alex@koval.kharkov.ua"))]) + (avy . [(20241101 1357) ((emacs (24 1)) (cl-lib (0 5))) "Jump to arbitrary positions in visible text and select text quickly" tar ((:url . "https://github.com/abo-abo/avy") (:commit . "933d1f36cca0f71e4acb5fac707e9ae26c536264") (:revdesc . "933d1f36cca0") (:keywords "point" "location") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (avy-act . [(20251104 1920) ((avy (0 5 0)) (emacs (29 1))) "Commands that let avy act from a distance" tar ((:url . "https://gitlab.com/nameiwillforget/avy-act") (:commit . "61b0bf036da3755ded04f8bc295a8a54407ea758") (:revdesc . "61b0bf036da3") (:keywords "tools" "convenience") (:authors ("Alexander Prähauser" . "ahprae@protonmail.com")) (:maintainers ("Alexander Prähauser" . "ahprae@protonmail.com")) (:maintainer "Alexander Prähauser" . "ahprae@protonmail.com"))]) + (avy-embark-collect . [(20250127 1315) ((emacs (25 1)) (embark (0 9)) (avy (0 5))) "Use avy to jump to Embark Collect entries" tar ((:url . "https://github.com/oantolin/embark") (:commit . "755cb49b59801ff420193cc0e3b1a7aa12bf22e3") (:revdesc . "755cb49b5980") (:keywords "convenience") (: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"))]) + (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 ((:url . "https://github.com/magicdirac/avy-flycheck") (:commit . "5522f3bbbed1801d9278ed696ec0cbba38352985") (:revdesc . "5522f3bbbed1") (:keywords "tools" "convenience" "avy" "flycheck") (:authors ("Xu Ma" . "magicdirac@gmail.com")) (:maintainers ("Xu Ma" . "magicdirac@gmail.com")) (:maintainer "Xu Ma" . "magicdirac@gmail.com"))]) + (avy-menu . [(20230606 1519) ((emacs (24 4)) (avy (0 4 0))) "Library providing avy-powered popup menu" tar ((:url . "https://github.com/mrkkrp/avy-menu") (:commit . "e79d892afd974105a6b24e8985fef0c9a1b10b4c") (:revdesc . "e79d892afd97") (:keywords "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (avy-migemo . [(20180716 1455) ((emacs (24 4)) (avy (0 4 0)) (migemo (1 9))) "Avy with migemo" tar ((:url . "https://github.com/momomo5717/avy-migemo") (:commit . "922a6dd82c0bfa316b0fbb56a9d4dd4ffa5707e7") (:revdesc . "922a6dd82c0b") (:keywords "avy" "migemo"))]) + (avy-zap . [(20190801 329) ((avy (0 2 0))) "Zap to char using `avy'" tar ((:url . "https://github.com/cute-jumper/avy-zap") (:commit . "7c8d1f40e43d03e2f6c1696bfa547526528ce8cb") (:revdesc . "7c8d1f40e43d") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (awk-ts-mode . [(20240517 1251) ((emacs (29 1))) "Major mode for awk using tree-sitter" tar ((:url . "https://github.com/nverno/awk-ts-mode") (:commit . "343d19c5b3c99f1a665d0c6bddb7b18278306b06") (:revdesc . "343d19c5b3c9") (:keywords "awk" "languages" "tree-sitter") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (awk-yasnippets . [(20230515 1756) ((emacs (26 3)) (yasnippet (0 8 0))) "Yasnippets for AWK" tar ((:url . "https://github.com/uberkael/awk-yasnippets") (:commit . "12e8e0b49878099bda5d3e4915cc3c738c87b95c") (:revdesc . "12e8e0b49878") (:keywords "extensions") (:maintainers ("Adriano Martinez" . "uberkael@gmail.com")) (:maintainer "Adriano Martinez" . "uberkael@gmail.com"))]) + (awqat . [(20250727 1902) ((emacs (27 1)) (s (1 13 0)) (alert (1 2))) "Islamic prayer times" tar ((:url . "http://github.com/zkry/awqat") (:commit . "52754b230c5796eb9c8aaeda87083855c4235f32") (:revdesc . "52754b230c57") (:authors ("Zachary Romero" . "zacromero@posteo.net")) (:maintainers ("Zachary Romero" . "zacromero@posteo.net")) (:maintainer "Zachary Romero" . "zacromero@posteo.net"))]) + (aws-ec2 . [(20221011 538) ((emacs (24 4)) (dash (2 12 1)) (tblui (0 1 0))) "Manage AWS EC2 instances" tar ((:url . "https://github.com/Yuki-Inoue/aws.el") (:commit . "7b500097ac3c2addbe1644f78595dc2ea4eb87c4") (:revdesc . "7b500097ac3c") (:authors ("Yuki Inoue" . "inouetakahiroki_at_gmail.com")) (:maintainers ("Yuki Inoue" . "inouetakahiroki_at_gmail.com")) (:maintainer "Yuki Inoue" . "inouetakahiroki_at_gmail.com"))]) + (aws-snippets . [(20191203 1553) ((yasnippet (0 8 0))) "Yasnippets for AWS" tar ((:url . "https://github.com/baron42bba/aws-snippets") (:commit . "557d19a0bc486e0fddb597b2be5087769d9bd47e") (:revdesc . "557d19a0bc48") (:keywords "snippets"))]) + (awscli-capf . [(20190930 1517) ((emacs (26))) "Completion at point function for the AWS CLI" tar ((:url . "https://github.com/sebasmonia/awscli-capf.git") (:commit . "1a75f88f53a2969fe821c31e6857861d0a0c0a5e") (:revdesc . "1a75f88f53a2") (:keywords "tools" "convenience" "abbrev") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com"))]) + (axe . [(20230120 1915) ((emacs (25 1)) (hmac (0 0)) (request (0 3 2)) (s (1 12 0)) (xmlgen (0 5)) (dash (2 17 0)) (mimetypes (1 0))) "AWS Extensions" tar ((:url . "https://github.com/cniles/axe") (:commit . "5168d4f4c33861a071285df34f17fce92137d497") (:revdesc . "5168d4f4c338") (:authors ("Craig Niles" . "niles.catgmail.com")) (:maintainers ("Craig Niles" . "niles.catgmail.com")) (:maintainer "Craig Niles" . "niles.catgmail.com"))]) + (ayu-theme . [(20230306 1924) ((emacs (24 1))) "Ayu theme" tar ((:url . "https://github.com/vutran1710/Ayu-Theme-Emacs") (:commit . "dc325520c1202463a0f05d4ece1644109830fef4") (:revdesc . "dc325520c120") (:keywords "lisp" "theme" "emacs"))]) + (babashka . [(20240527 732) ((emacs (27 1)) (parseedn (1 1 0))) "Babashka Tasks Interface" tar ((:url . "https://github.com/licht1stein/babashka.el") (:commit . "4ea9d7febf3e9d301c91231ba2833f3417ba9059") (:revdesc . "4ea9d7febf3e") (:authors ("Mykhaylo Bilyanskyy" . "mb@m1k.pw")) (:maintainers ("Mykhaylo Bilyanskyy" . "mb@m1k.pw")) (:maintainer "Mykhaylo Bilyanskyy" . "mb@m1k.pw"))]) + (babel . [(20210612 640) nil "Interface to web translation services such as Babelfish" tar ((:url . "http://github.com/juergenhoetzel/babel") (:commit . "946e69c61188bc41793402ac48466d8967ddb43d") (:revdesc . "946e69c61188") (:keywords "translation" "web") (:authors ("Juergen Hoetzel" . "juergen@hoetzel.info") ("Eric Marsden" . "emarsden@laas.fr")) (:maintainers ("Juergen Hoetzel" . "juergen@hoetzel.info") ("Eric Marsden" . "emarsden@laas.fr")) (:maintainer "Juergen Hoetzel" . "juergen@hoetzel.info"))]) + (babel-repl . [(20160504 2201) ((emacs (24))) "Run babel REPL" tar ((:url . "https://github.com/hung-phan/babel-repl/") (:commit . "0faa2f6518a2b46236f116ca1736a314f7d9c034") (:revdesc . "0faa2f6518a2") (:keywords "babel" "javascript" "es6"))]) + (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 ((:url . "http://github.com/rolandwalker/back-button") (:commit . "f8783c98a7fefc1d0419959c1b462c7dcadce5a8") (:revdesc . "f8783c98a7fe") (:keywords "convenience" "navigation" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (backlight . [(20210513 129) ((emacs (24 3))) "Backlight brightness adjustment on GNU/Linux" tar ((:url . "https://github.com/mschuldt/backlight.el") (:commit . "b6826a60440d8bf440618e3cdafb40158de920e6") (:revdesc . "b6826a60440d") (:keywords "hardware") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainers ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com"))]) + (backline . [(20251101 1936) ((emacs (27 1)) (compat (30 1)) (outline-minor-faces (1 2))) "Preserve appearance of outline headings" tar ((:url . "https://github.com/tarsius/backline") (:commit . "821dab84aba746247be184066b2a69a6545ed346") (:revdesc . "821dab84aba7") (:keywords "outlines") (:authors ("Jonas Bernoulli" . "emacs.backline@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.backline@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.backline@jonas.bernoulli.dev"))]) + (backup-each-save . [(20180227 557) nil "Backup each savepoint of a file" tar ((:url . "https://github.com/conornash/backup-each-save") (:commit . "3c414b9d6b278911c95c5b8b71819e6af6f8a02a") (:revdesc . "3c414b9d6b27") (: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 ((:url . "https://github.com/lewang/backup-walker") (:commit . "934a4128c122972ac32bb9952addf279a60a94da") (:revdesc . "934a4128c122") (:keywords "backup"))]) + (backward-forward . [(20161229 550) ((emacs (24 5))) "Navigation backwards and forwards across marks" tar ((:url . "https://gitlab.com/vancan1ty/emacs-backward-forward/tree/master") (:commit . "58489957a62a0da25dfb5df902624d2548d800b4") (:revdesc . "58489957a62a") (:keywords "navigation" "convenience" "backward" "forward") (:authors ("Currell Berry" . "currellberry@gmail.com")) (:maintainers ("Currell Berry" . "currellberry@gmail.com")) (:maintainer "Currell Berry" . "currellberry@gmail.com"))]) + (badger-theme . [(20140717 232) nil "A dark theme for Emacs 24" tar ((:url . "https://github.com/ccann/badger-theme") (:commit . "80fb9f8ace37b2e8807da639f7da499a53ffefd4") (:revdesc . "80fb9f8ace37") (:authors ("Cody Canning" . "cocanning11@gmail.com")) (:maintainers ("Cody Canning" . "cocanning11@gmail.com")) (:maintainer "Cody Canning" . "cocanning11@gmail.com"))]) + (badwolf-theme . [(20161004 715) ((emacs (24))) "Bad Wolf color theme" tar ((:url . "https://github.com/bkruczyk/badwolf-emacs") (:commit . "ea01a3d9358e968f75e3ed15dec6a2a96ce3d9a1") (:revdesc . "ea01a3d9358e") (:keywords "themes") (:authors ("bkruczyk" . "bartlomiej.kruczyk@gmail.com")) (:maintainers ("bkruczyk" . "bartlomiej.kruczyk@gmail.com")) (:maintainer "bkruczyk" . "bartlomiej.kruczyk@gmail.com"))]) + (baff . [(20200824 1807) ((emacs (24 3)) (f (0 20 0))) "Create a byte array from a file" tar ((:url . "https://github.com/dave-f/baff/") (:commit . "52a8508e2300ee810ce7806cb78a2b294f2630f2") (:revdesc . "52a8508e2300") (:keywords "convenience" "usability") (:authors ("Dave Footitt" . "dave.footitt@gmail.com")) (:maintainers ("Dave Footitt" . "dave.footitt@gmail.com")) (:maintainer "Dave Footitt" . "dave.footitt@gmail.com"))]) + (baidu-translate . [(20211130 1235) ((unicode-escape (1 1))) "A plugin using baidu-translate-api" tar ((:url . "https://github.com/liShiZhensPi/baidu-translate") (:commit . "16101d5e6ce19bbcc8badf4422a95db457160999") (:revdesc . "16101d5e6ce1") (:keywords "docs") (:authors (nil . "LiShizhengsu4017@gmail.com")) (:maintainers (nil . "LiShizhengsu4017@gmail.com")) (:maintainer nil . "LiShizhengsu4017@gmail.com"))]) + (balanced-windows . [(20190903 1120) ((emacs (25))) "Keep windows balanced" tar ((:url . "https://github.com/wbolster/emacs-balanced-windows") (:commit . "1da5354ad8a9235d13928e2ee0863f3642ccdd13") (:revdesc . "1da5354ad8a9") (:keywords "convenience") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (bank-buddy . [(20250526 1515) ((emacs (26 1)) (async (1 9 4))) "Financial analysis and reporting" tar ((:url . "https://github.com/captainflasmr/bank-buddy") (:commit . "762ad9e24fa2fe38991513b6b5166c0df8fdd689") (:revdesc . "762ad9e24fa2") (:keywords "matching") (:authors ("James Dyer" . "captainflasmr@gmail.com")) (:maintainers ("James Dyer" . "captainflasmr@gmail.com")) (:maintainer "James Dyer" . "captainflasmr@gmail.com"))]) + (banner-comment . [(20250131 300) ((emacs (24 4))) "For producing banner comments" tar ((:url . "https://github.com/WJCFerguson/banner-comment") (:commit . "216ba051451df72796daaae9744cd9dbdaeb5fc6") (:revdesc . "216ba051451d") (:keywords "convenience") (:authors ("James Ferguson" . "james@faff.org")) (:maintainers ("James Ferguson" . "james@faff.org")) (:maintainer "James Ferguson" . "james@faff.org"))]) + (bap-mode . [(20200128 1354) nil "Major-mode for BAP's IR" tar ((:url . "https://github.com/fkie-cad/bap-mode") (:commit . "8969679f60db0aa918d35f40d959c0a9c723b111") (:revdesc . "8969679f60db") (:keywords "languages") (:authors ("Thomas Barabosch" . "http://github/tbarabosch")) (:maintainers ("Thomas Barabosch" . "thomas.barabosch@fkie.fraunhofer.de")) (:maintainer "Thomas Barabosch" . "thomas.barabosch@fkie.fraunhofer.de"))]) + (bar-cursor . [(20201204 2244) nil "Package used to switch block cursor to a bar" tar ((:url . "https://github.com/ajsquared/bar-cursor") (:commit . "78f195b6db63459033c4f1c7e7add5d82f3ce424") (:revdesc . "78f195b6db63") (:keywords "files") (:authors ("Joe Casadonte" . "(emacs@northbound-train.com)")) (:maintainers ("Andrew Johnson" . "(andrew@andrewjamesjohnson.com)")) (:maintainer "Andrew Johnson" . "(andrew@andrewjamesjohnson.com)"))]) + (bart-mode . [(20190601 1004) ((emacs (24 3))) "Real time BART departures info" tar ((:url . "https://github.com/mschuldt/bart-mode") (:commit . "f70b6c42452e47c0c6b3ebd4c90e555a9bedeec7") (:revdesc . "f70b6c42452e") (:keywords "convenience" "transit") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainers ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com"))]) + (base16-theme . [(20251214 144) nil "Collection of themes built on combinations of 16 base colors" tar ((:url . "https://github.com/tinted-theming/base16-emacs") (:commit . "4166d35bb193f0d619072d671fbb1c76b750eb6f") (:revdesc . "4166d35bb193") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainers ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io"))]) + (base32 . [(20240227 1821) ((emacs (27 1))) "Base32 support" tar ((:url . "https://gitlab.com/fledermaus/totp.el") (:commit . "927257e97a602b6979a75028e8417bf1499582d4") (:revdesc . "927257e97a60") (:keywords "tools") (:authors ("Vivek Das Mohapatra" . "vivek@etla.org")) (:maintainers ("Vivek Das Mohapatra" . "vivek@etla.org")) (:maintainer "Vivek Das Mohapatra" . "vivek@etla.org"))]) + (bash-completion . [(20250721 2026) ((emacs (25 3))) "Bash completion for the shell buffer" tar ((:url . "http://github.com/szermatt/emacs-bash-completion") (:commit . "762f28fefba487e15d626691310f3194804eb71a") (:revdesc . "762f28fefba4") (:keywords "convenience" "unix") (:authors ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainers ("Stephane Zermatten" . "szermatt@gmail.com")) (:maintainer "Stephane Zermatten" . "szermatt@gmail.com"))]) + (basic-c-compile . [(20170302 1112) ((cl-lib (0 5)) (f (0 19 0))) "Quickly create a Makefile, compile and run C" tar ((:url . "https://github.com/nick96/basic-c-compile") (:commit . "335e96e19647ad7245fb68cf7e68cf86c5023d23") (:revdesc . "335e96e19647") (:keywords "c" "makefile" "compilation" "convenience") (:authors ("Nick Spain" . "nicholas.spain96@gmail.com")) (:maintainers ("Nick Spain" . "nicholas.spain96@gmail.com")) (:maintainer "Nick Spain" . "nicholas.spain96@gmail.com"))]) + (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 ((:url . "https://gitlab.com/sasanidas/emacs-c64-basic-ide") (:commit . "e33036f838e61b647927165e81be5d5b855e0518") (:revdesc . "e33036f838e6") (:keywords "languages" "basic") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainers ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net"))]) + (basic-mode . [(20231125 1617) ((seq (2 20)) (emacs (25 1))) "Major mode for editing BASIC code" tar ((:url . "https://github.com/dykstrom/basic-mode") (:commit . "1dc1a635d6d80668c8a583b974205e49ff0fc3ce") (:revdesc . "1dc1a635d6d8") (:keywords "basic" "languages"))]) + (basic-theme . [(20160817 827) ((emacs (24))) "Minimalistic light color theme" tar ((:url . "http://github.com/fgeller/basic-theme.el") (:commit . "9d0fd5f56898a5237c1de3363ad416aeab7f880e") (:revdesc . "9d0fd5f56898") (:keywords "theme" "basic" "minimal" "colors") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainers ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com"))]) + (bats-mode . [(20230325 7) nil "Emacs mode for editing and running Bats tests" tar ((:url . "https://github.com/dougm/bats-mode") (:commit . "fa88930b1baba101ae6474f289a239a236a7d19f") (:revdesc . "fa88930b1bab") (:keywords "bats" "tests"))]) + (battery-notifier . [(20220705 2030) ((alert (1 3))) "Notify when battery capacity is low" tar ((:url . "https://github.com/jasonmj/battery-notifier") (:commit . "b7301d3633afff78609afd45dcf78268f98d52d3") (:revdesc . "b7301d3633af") (:keywords "hardware" "battery") (:authors ("Jason Johnson" . "(jason@fullsteamlabs.com)")) (:maintainers ("Jason Johnson" . "(jason@fullsteamlabs.com)")) (:maintainer "Jason Johnson" . "(jason@fullsteamlabs.com)"))]) + (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 ((:url . "https://github.com/AlonTzarafi/battle-haxe") (:commit . "2f32c81dcecfc68fd410cb9d2aca303d6e3028c7") (:revdesc . "2f32c81dcecf") (:keywords "programming" "languages" "completion") (:authors ("Alon Tzarafi" . "alontzarafi@gmail.com")) (:maintainers ("Alon Tzarafi" . "alontzarafi@gmail.com")) (:maintainer "Alon Tzarafi" . "alontzarafi@gmail.com"))]) + (bazel . [(20230919 1445) ((emacs (28 1))) "Bazel support for Emacs" tar ((:url . "https://github.com/bazelbuild/emacs-bazel-mode") (:commit . "769b30dc18282564d614d7044195b5a0c1a0a5f3") (:revdesc . "769b30dc1828") (:keywords "build tools" "languages"))]) + (bbcode-mode . [(20231215 1539) ((emacs (24)) (cl-lib (0 5))) "Major mode for phpBB posts (BBCode markup)" tar ((:url . "https://github.com/lassik/emacs-bbcode-mode") (:commit . "109962f1070a5e6943c2e32c1eb84ce4debfb8f8") (:revdesc . "109962f1070a") (:keywords "bbcode" "languages") (:authors ("Eric James Michael Ritz" . "lobbyjones@gmail.com")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (bbdb . [(20231122 1326) ((emacs (24)) (cl-lib (0 5))) "Big Brother DataBase" tar ((:commit . "53e8ba04c47b3542db75b68f9663941daf2e6ca4") (:revdesc . "53e8ba04c47b") (: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 ((:url . "https://github.com/aki2o/bbdb-") (:commit . "2839e84c894de2513af41053e80a277a1b483d22") (:revdesc . "2839e84c894d") (:keywords "bbdb" "news" "mail") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (bbdb-csv-import . [(20140802 1142) ((pcsv (1 3 3)) (dash (2 5 0)) (bbdb (20140412 1949))) "Import csv to bbdb version 3+" tar ((:url . "https://gitlab.com/iankelling/bbdb-csv-import") (:commit . "7739d10ebe1787a72aa74085e9baedd0f4988b00") (:revdesc . "7739d10ebe17") (:keywords "csv" "util" "bbdb") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainers ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org"))]) + (bbdb-ext . [(20151220 2013) ((bbdb (2 36))) "Extra commands for BBDB" tar ((:url . "https://github.com/vapniks/bbdb-ext") (:commit . "fee97b1b3faa83edaea00fbc5ad3cbca5e791a55") (:revdesc . "fee97b1b3faa") (:keywords "extensions") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (bbdb-vcard . [(20210325 2208) ((bbdb (3 0))) "VCard import/export for BBDB" tar ((:url . "https://github.com/tohojo/bbdb-vcard") (:commit . "113c66115ce68316e209f51ebce56de8dded3606") (:revdesc . "113c66115ce6") (:keywords "data" "calendar" "mail" "news") (:authors ("Bert Burgemeister" . "trebbu@googlemail.com") ("Vincent Geddes" . "vincent.geddes@gmail.com")) (:maintainers ("Bert Burgemeister" . "trebbu@googlemail.com") ("Vincent Geddes" . "vincent.geddes@gmail.com")) (:maintainer "Bert Burgemeister" . "trebbu@googlemail.com"))]) + (bbdb2erc . [(20190822 907) ((bbdb (3 0))) "Make bbdb show if pal is online with ERC, click i to chat" tar ((:url . "https://github.com/unhammer/bbdb2erc") (:commit . "40b89e961762af3e7ade3a1844a9fbcd4084ac65") (:revdesc . "40b89e961762") (:keywords "irc" "contacts" "chat" "client" "internet") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (bbww . [(20230502 2239) ((mwim (1 0)) (emacs (24 3))) "Improved word-jumping functions" tar ((:url . "http://chud.wtf") (:commit . "9b4430f757e9c7fc7178541009676af1262c486b") (:revdesc . "9b4430f757e9") (:keywords "convenience" "files"))]) + (bbyac . [(20180206 1441) ((browse-kill-ring (1 3)) (cl-lib (0 5))) "Type a little Bit, and Bang! You Are Completed" tar ((:url . "https://github.com/baohaojun/bbyac") (:commit . "9f0de9cad13801891ffb590dc09f51ff9a7cb225") (:revdesc . "9f0de9cad138") (:keywords "abbrev") (:authors ("Bao Haojun" . "baohaojun@gmail.com")) (:maintainers ("Bao Haojun" . "baohaojun@gmail.com")) (:maintainer "Bao Haojun" . "baohaojun@gmail.com"))]) + (beacon . [(20220730 100) ((emacs (25 1))) "Highlight the cursor whenever the window scrolls" tar ((:url . "https://github.com/Malabarba/beacon") (:commit . "85261a928ae0ec3b41e639f05291ffd6bf7c231c") (:revdesc . "85261a928ae0") (:keywords "convenience") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (beans . [(20221114 1634) ((emacs (24 3))) "Major mode for Beans grammar" tar ((:url . "https://github.com/TheBlackBeans/emacs-beans") (:commit . "0d04b79222812aa4978b6486a9ccac461850fe7a") (:revdesc . "0d04b7922281"))]) + (bech32 . [(20221210 1154) ((emacs (26 1))) "Bech32 library" tar ((:url . "https://github.com/Titan-C/cardano.el") (:commit . "badbf267fa488df1cb87809ed234ebd67786f2f8") (:revdesc . "badbf267fa48") (:authors ("Oscar Najera" . "https://oscarnajera.com")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com"))]) + (beef-mode . [(20221227 203) ((emacs (24 3))) "A major mode for the Beef programming language" tar ((:url . "https://github.com/thechampagne/beef-mode") (:commit . "20906b41630d74eba56504fbb9fabb79562e0d6e") (:revdesc . "20906b41630d") (:keywords "files" "beef"))]) + (beeminder . [(20201227 2024) ((emacs (24 3)) (seq (2 16)) (org (7))) "Emacs interface for Beeminder" tar ((:url . "http://www.philnewton.net/code/beeminder-el/") (:commit . "161d9c94c594614a01cb08219693d9e000af4f69") (:revdesc . "161d9c94c594") (:keywords "tools" "beeminder") (:authors ("Phil Newton" . "phil@sodaware.net")) (:maintainers ("Phil Newton" . "phil@sodaware.net")) (:maintainer "Phil Newton" . "phil@sodaware.net"))]) + (beginend . [(20230902 1458) ((emacs (25 3))) "Redefine M-< and M-> for some modes" tar ((:url . "https://github.com/DamienCassou/beginend") (:commit . "2d3536971b7cca597ba3404c30b5d1ce9d56f1fe") (:revdesc . "2d3536971b7c"))]) + (belarus-holidays . [(20190102 1343) nil "Belarus holidays whith transfers" tar ((:url . "http://bitbucket.org/EugeneMakei/belarus-holidays.el") (:commit . "35a18273e19edc3b4c761030ffbd11116483b83e") (:revdesc . "35a18273e19e") (:authors ("Yauhen Makei" . "yauhen.makei@gmail.com")) (:maintainers ("Yauhen Makei" . "yauhen.makei@gmail.com")) (:maintainer "Yauhen Makei" . "yauhen.makei@gmail.com"))]) + (beluga-mode . [(20250930 700) ((emacs (24 4))) "Major mode for Beluga source code" tar ((:url . "https://github.com/Beluga-lang/Beluga") (:commit . "820615cc4758086eb7641f62340a3ab93a689303") (:revdesc . "820615cc4758") (:keywords "languages") (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:maintainers (nil . "beluga-dev@cs.mcgill.ca")) (:maintainer nil . "beluga-dev@cs.mcgill.ca"))]) + (benchmark-init . [(20250313 1200) ((emacs (24 3))) "Benchmarks for require and load calls" tar ((:url . "https://github.com/dholm/benchmark-init-el") (:commit . "6507caa3c4cb2a6c9b85c771c5e9e5aeb7d745bc") (:revdesc . "6507caa3c4cb") (:keywords "convenience" "benchmark") (:maintainers ("David Holm" . "dholmster@gmail.com")) (:maintainer "David Holm" . "dholmster@gmail.com"))]) + (benchstat . [(20171014 312) nil "Proper benchmarking made simple" tar ((:url . "https://github.com/Quasilyte/benchstat.el") (:commit . "fee86f521f22ef0f99564903d63e2023b591fc7f") (:revdesc . "fee86f521f22") (:keywords "lisp") (:authors ("Iskander Sharipov" . "quasilyte@gmail.com")) (:maintainers ("Iskander Sharipov" . "quasilyte@gmail.com")) (:maintainer "Iskander Sharipov" . "quasilyte@gmail.com"))]) + (bencode . [(20190317 2010) ((emacs (24 4))) "Bencode encoding / decoding" tar ((:url . "https://github.com/skeeto/emacs-bencode") (:commit . "b5fe9c9d4b9b5ea61cedd77987ca46eb8154bd16") (:revdesc . "b5fe9c9d4b9b") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (bencoding . [(20200331 1102) ((emacs (25 1))) "Bencoding decoding and encoding" tar ((:url . "https://github.com/xuchunyang/bencoding.el") (:commit . "409836f2cf4883826600de42519ee9cffeb48a11") (:revdesc . "409836f2cf48") (:keywords "tools"))]) + (berry-theme . [(20250224 923) ((emacs (24 1))) "A vibrant berry-colored theme" tar ((:url . "https://github.com/madara123pain/unique-emacs-theme-pack") (:commit . "ae9a0c318c371ed70ec568f3a618d47124817fe7") (:revdesc . "ae9a0c318c37") (:keywords "faces" "theme" "berry" "vibrant" "colorful"))]) + (berrys-theme . [(20191201 1609) ((emacs (24 1))) "A light, clean and elegant theme" tar ((:url . "https://github.com/vbuzin/berrys-theme") (:commit . "888a14206b2fb3dc45b5273aeb05075f3e0b5f60") (:revdesc . "888a14206b2f") (:authors ("Slava Buzin" . "v8v.buzin@gmail.com")) (:maintainers ("Slava Buzin" . "v8v.buzin@gmail.com")) (:maintainer "Slava Buzin" . "v8v.buzin@gmail.com"))]) + (bert . [(20131117 1014) nil "BERT serialization library for Emacs" tar ((:url . "https://github.com/manzyuk/bert-el") (:commit . "a3eec6980a725aa4abd2019e4c00246450260490") (:revdesc . "a3eec6980a72") (:keywords "comm" "data") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainers ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com"))]) + (better-defaults . [(20251012 2227) ((emacs (25 1))) "Fixing weird quirks and poor defaults" tar ((:url . "https://git.sr.ht/~technomancy/better-defaults") (:commit . "b4e566ddd368609c7df711c4f0d9cc345455aa0f") (:revdesc . "b4e566ddd368") (:keywords "convenience"))]) + (better-jumper . [(20241009 1517) ((emacs (25 1))) "Configurable jump list" tar ((:url . "https://github.com/gilbertw1/better-jumper") (:commit . "b1bf7a3c8cb820d942a0305e0e6412ef369f819c") (:revdesc . "b1bf7a3c8cb8") (:keywords "convenience" "jump" "history" "evil") (:authors ("Bryan Gilbert" . "http://github/gilbertw1")) (:maintainers ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainer "Bryan Gilbert" . "bryan@bryan.sh"))]) + (better-scroll . [(20250101 1002) ((emacs (24 3))) "Improve user experience when scrolling window" tar ((:url . "https://github.com/jcs-elpa/better-scroll") (:commit . "14c700f8b43771a47f16b3385adbbddb741a03eb") (:revdesc . "14c700f8b437") (:keywords "convenience" "scrolling" "scroll" "window" "better" "improvement") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (better-shell . [(20191025 1737) ((emacs (24 4))) "Better shell management" tar ((:url . "https://github.com/killdash9/better-shell") (:commit . "70c787b981caeef8c5f8012b170eb7b9f167cd13") (:revdesc . "70c787b981ca") (:keywords "convenience") (:authors ("Russell Black" . "(killdash9@github)")) (:maintainers ("Russell Black" . "(killdash9@github)")) (:maintainer "Russell Black" . "(killdash9@github)"))]) + (bf-mode . [(20130403 1442) nil "Browse file persistently on dired" tar ((:url . "https://github.com/emacs-jp/bf-mode") (:commit . "7cc4d09aed64d9db6be95646f5f5067de68f8895") (:revdesc . "7cc4d09aed64") (:keywords "convenience") (:maintainers ("myuhe" . "yuhei.maeda_at_gmail.com")) (:maintainer "myuhe" . "yuhei.maeda_at_gmail.com"))]) + (bfbuilder . [(20210228 1740) ((cl-lib (0 3)) (emacs (24 4))) "A brainfuck development environment with interactive debugger" tar ((:url . "http://zk-phi.gitub.io/") (:commit . "689f320a9a1326cdeff43b8538e0d739f8519c4b") (:revdesc . "689f320a9a13"))]) + (bibclean-format . [(20190302 2017) ((emacs (24 3)) (reformatter (0 3))) "Reformat BibTeX and Scribe using bibclean" tar ((:url . "https://github.com/peterwvj/bibclean-format") (:commit . "b4003950a925d1c659bc359ab5e88e4441775d77") (:revdesc . "b4003950a925") (:keywords "languages") (: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"))]) + (bible-gateway . [(20251219 2150) ((emacs (29 1))) "A Simple BibleGateway Client" tar ((:url . "https://github.com/kristjoc/bible-gateway") (:commit . "c9769ead9dc0bc9dbde015dfc367342a2c1c4bc3") (:revdesc . "c9769ead9dc0") (:keywords "convenience" "comm" "hypermedia"))]) + (biblio . [(20250812 1408) ((emacs (24 3)) (biblio-core (0 3))) "Browse and import bibliographic references and BibTeX records from CrossRef, arXiv, DBLP, HAL, IEEE Xplore, Dissemin, and doi.org" tar ((:url . "https://github.com/cpitclaudel/biblio.el") (:commit . "bb9d6b4b962fb2a4e965d27888268b66d868766b") (:revdesc . "bb9d6b4b962f") (:keywords "bib" "tex" "convenience" "hypermedia") (: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"))]) + (biblio-bibsonomy . [(20190105 1200) ((emacs (24 4)) (biblio-core (0 2))) "Lookup bibliographic entries from Bibsonomy" tar ((:url . "http://github.com/andreasjansson/biblio-bibsonomy/") (:commit . "fbdb3ecfcd88c179a2358d7967f7ecafef725835") (:revdesc . "fbdb3ecfcd88") (:keywords "bib" "tex" "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 ((:url . "https://github.com/cpitclaudel/biblio.el") (:commit . "ee52f6cda82ea6fbc3b400e7b12132595cc0374c") (:revdesc . "ee52f6cda82e") (:keywords "bib" "tex" "convenience" "hypermedia") (: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"))]) + (biblio-gbooks . [(20241025 1400) ((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 ((:url . "http://github.com/jrasband/biblio-gbooks") (:commit . "c7bdaba4dde8fca8b8e923f3c004d050a32c06c2") (:revdesc . "c7bdaba4dde8") (:keywords "bib" "tex"))]) + (bibliothek . [(20190124 1828) ((emacs (24 4)) (pdf-tools (0 70)) (a (0 1 0 -3 4))) "Managing a digital library of PDFs" tar ((:url . "https://dev.gkayaalp.com/elisp/index.html#bibliothek-el") (:commit . "b19b37be332bada6b18d4d895edf6ce78ab420c4") (:revdesc . "b19b37be332b") (:keywords "tools") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainers ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com"))]) + (bibretrieve . [(20191124 1855) ((auctex (11 87)) (emacs (24 3))) "Retrieve BibTeX entries from the internet" tar ((:url . "https://github.com/pzorin/bibretrieve") (:commit . "81dc8e0db3629cc180eafb2bc34b60dcd8980316") (:revdesc . "81dc8e0db362") (:keywords "bibtex" "bibliography" "mathscinet" "arxiv" "zbmath") (:maintainers ("Pavel Zorin-Kranich" . "pzorin@uni-bonn.de")) (:maintainer "Pavel Zorin-Kranich" . "pzorin@uni-bonn.de"))]) + (bibslurp . [(20151202 2346) ((s (1 6 0)) (dash (1 5 0))) "Retrieve BibTeX entries from NASA ADS" tar ((:url . "https://github.com/mkmcc/bibslurp") (:commit . "aeba96368f2a06959e4fe945375ce2a54d34b189") (:revdesc . "aeba96368f2a") (:keywords "bibliography" "nasa ads"))]) + (bibtex-capf . [(20240122 1558) ((emacs (27 1)) (parsebib (3 0)) (org (9 5))) "Completion at point for bibtex" tar ((:url . "https://github.com/mclear-tools/bibtex-capf") (:commit . "31826efefcbbdebdb700a06b5070df0f06ce2291") (:revdesc . "31826efefcbb") (:keywords "bibtex" "convenience"))]) + (bibtex-completion . [(20241116 726) ((parsebib (6 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 ((:url . "https://github.com/tmalsburg/helm-bibtex") (:commit . "6064e8625b2958f34d6d40312903a85c173b5261") (:revdesc . "6064e8625b29") (: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"))]) + (bibtex-utils . [(20190703 2117) nil "Provides utilities for extending BibTeX mode" tar ((:url . "https://github.com/plantarum/bibtex-utils") (:commit . "26a8f0909b6adbf545a2b5e57ce7f779bf7a65af") (:revdesc . "26a8f0909b6a") (:keywords "bibtex") (:authors ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainers ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainer "Tyler Smith" . "tyler@plantarum.ca"))]) + (bicycle . [(20251212 2319) ((emacs (28 1)) (compat (30 1))) "Cycle outline and code visibility" tar ((:url . "https://github.com/tarsius/bicycle") (:commit . "80643a60f8066cba20a51f419be0c168af7fcbd7") (:revdesc . "80643a60f806") (:keywords "outlines") (:authors ("Jonas Bernoulli" . "emacs.bicycle@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.bicycle@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.bicycle@jonas.bernoulli.dev"))]) + (bifocal . [(20200325 539) ((emacs (24 4))) "Split-screen scrolling for comint-mode buffers" tar ((:url . "https://github.com/riscy/bifocal-mode") (:commit . "773a6dde790c4a240e643a9071e4c7bce09d40de") (:revdesc . "773a6dde790c") (:keywords "frames" "processes"))]) + (bilibili . [(20250727 348) ((emacs (29 1)) (org (9 0)) (mpvi (1 3)) (pdd (0 2))) "Watch videos of BiliBili (哔哩哔哩) in org mode" tar ((:url . "https://github.com/lorniu/bilibili.el") (:commit . "f650983c9c29ea5fe4574dac3b3fd2a62ae49520") (:revdesc . "f650983c9c29") (:keywords "multimedia" "application") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com"))]) + (binclock . [(20170802 1116) ((cl-lib (0 5))) "Display the current time using a binary clock" tar ((:url . "https://github.com/davep/binclock.el") (:commit . "87042230d7f3fe3e9a77fae0dbab7d8f7e7794ad") (:revdesc . "87042230d7f3") (:keywords "games" "time" "display") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (bind . [(20231001 2051) ((emacs (25 1))) "Bind commands to keys" tar ((:url . "https://github.com/repelliuss/bind") (:commit . "4c1698a7c1c9f3d45559c3be871d87d76a1cbe00") (:revdesc . "4c1698a7c1c9") (:authors ("repelliuss" . "https://github.com/repelliuss")) (:maintainers ("repelliuss" . "repelliuss@gmail.com")) (:maintainer "repelliuss" . "repelliuss@gmail.com"))]) + (bind-chord . [(20250330 1852) ((emacs (24 3)) (bind-key (1 0)) (key-chord (0 6))) "Key-chord binding helper for use-package-chords" tar ((:url . "https://github.com/jwiegley/use-package") (:commit . "0793b50e2bf1ec8bfc532b10baeef716c5aa947a") (:revdesc . "0793b50e2bf1") (:keywords "convenience" "tools" "extensions") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com"))]) + (bind-map . [(20251119 201) ((emacs (24 3))) "Bind personal keymaps in multiple locations" tar ((:url . "https://github.com/justbur/emacs-bind-map") (:commit . "75aac732c10d97bc8dc49196c6623a09faf30d37") (:revdesc . "75aac732c10d") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc"))]) + (binder . [(20250101 1950) ((emacs (24 4)) (seq (2 20))) "Global minor mode to facilitate multi-file writing projects" tar ((:url . "https://codeberg.org/divyaranjan/binder") (:commit . "08a0c9d4179ed31dcbacea3ab0077cd22db341b5") (:revdesc . "08a0c9d4179e") (:keywords "files" "outlines" "wp" "text") (:authors ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainers ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainer "Paul W. Rankin" . "rnkn@rnkn.xyz"))]) + (bing-dict . [(20200216 110) nil "Minimalists' English-Chinese Bing dictionary" tar ((:url . "https://github.com/cute-jumper/bing-dict.el") (:commit . "1d581aaa9622b34f8fb83af5579fa252aa24cfef") (:revdesc . "1d581aaa9622") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (binky . [(20250123 1928) ((emacs (29 1)) (dash (2 19 1))) "Jump between points like a rabbit" tar ((:url . "https://github.com/eki3z/binky.el") (:commit . "29f2492366ced8ff13802faf4a1c6df5e0c9cb07") (:revdesc . "29f2492366ce") (:keywords "convenience") (:authors ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz95@gmail.com"))]) + (biome . [(20250623 1954) ((emacs (27 1)) (transient (0 9 2)) (ct (0 2)) (request (0 3 3)) (compat (29 1 4 1))) "Bountiful Interface to Open Meteo for Emacs" tar ((:url . "https://github.com/SqrtMinusOne/biome") (:commit . "b26c0a6ec533ba5c3524721af224708de9362979") (:revdesc . "b26c0a6ec533") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (biomejs-format . [(20240401 458) ((emacs (24 1))) "Minor mode to format JS code with Biome on file save" tar ((:url . "https://github.com/yadex205/emacs-biomejs-format") (:commit . "cbfb8aac8bfab6fd893f1ccb4eb9efa29b1b3214") (:revdesc . "cbfb8aac8bfa") (:keywords "convenience" "wp" "edit" "js") (:maintainers ("Kanon Kakuno" . "yadex205@yadex205.com")) (:maintainer "Kanon Kakuno" . "yadex205@yadex205.com"))]) + (birds-of-paradise-plus-theme . [(20130419 2129) nil "A brown/orange light-on-dark theme for Emacs 24 (deftheme)" tar ((:url . "https://github.com/jimeh/birds-of-paradise-plus-theme.el") (:commit . "bb9f9d4ef7f7872a388ec4eee1253069adcadb6f") (:revdesc . "bb9f9d4ef7f7") (:keywords "themes") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainers ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me"))]) + (bison-mode . [(20210527 717) nil "Major mode for editing bison, yacc and lex files" tar ((:url . "https://github.com/Wilfred/bison-mode") (:commit . "4f2e20394a475931409618c1635e9c9f1cf07d9c") (:revdesc . "4f2e20394a47") (:keywords "bison-mode" "yacc-mode") (:authors ("Eric Beuscher" . "beuscher@eecs.tulane.edu")) (:maintainers ("Eric Beuscher" . "beuscher@eecs.tulane.edu")) (:maintainer "Eric Beuscher" . "beuscher@eecs.tulane.edu"))]) + (bitbake . [(20240605 1322) ((emacs (24 1)) (dash (2 6 0)) (mmm-mode (0 5 4)) (s (1 10 0))) "Running bitbake from emacs" tar ((:url . "https://github.com/canatella/bitbake-el") (:commit . "8285f46fe19cb99fe5ed42d38de0fe5c51c98fb0") (:revdesc . "8285f46fe19c") (:keywords "convenience"))]) + (bitbake-ts-mode . [(20240908 1435) ((emacs (29 1))) "A major mode to use bitbake tree-sitter" tar ((:url . "https://github.com/seokbeomKim/bitbake-ts-mode") (:commit . "224d7fb93f0c06968421dd8536c64840a2f13273") (:revdesc . "224d7fb93f0c") (:keywords "bitbake" "tree-sitter" "languages") (:authors ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainers ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainer "Jason Kim" . "sukbeom.kim@gmail.com"))]) + (bitlbee . [(20151203 0) nil "Help get Bitlbee (http://www.bitlbee.org) up and running" tar ((:url . "https://github.com/pjones/bitlbee-el") (:commit . "f3342da46b0864ae8db4e82b553d9e617b090534") (:revdesc . "f3342da46b08"))]) + (bitpack . [(20230417 2032) ((emacs (24 3))) "Bit packing functions" tar ((:url . "https://github.com/skeeto/bitpack") (:commit . "38d000646b81ce52fcb90a0747059a15264e112b") (:revdesc . "38d000646b81") (:keywords "c" "comm") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (blackboard-bold-mode . [(20241216 2353) nil "Quail package for Blackboard bold symbols" tar ((:url . "https://github.com/grettke/blackboard-bold-mode") (:commit . "f4959eb0adca6b3096e5fea1f7e549533e4d8d79") (:revdesc . "f4959eb0adca") (:keywords "convenience" "i18n") (:authors ("Grant Rettke" . "grant@wisdomandwonder.com")) (:maintainers (nil . "grant@wisdomandwonder.com")) (:maintainer nil . "grant@wisdomandwonder.com"))]) + (blackboard-theme . [(20161216 656) ((emacs (24))) "TextMate Blackboard Theme" tar ((:url . "https://github.com/don9z/blackboard-theme") (:commit . "d8b984f2541bb86eb4363a2b4c94631e49843d4a") (:revdesc . "d8b984f2541b"))]) + (blacken . [(20231129 654) ((emacs (25 2))) "Reformat python buffers using the \"black\" formatter" tar ((:url . "https://github.com/proofit404/blacken") (:commit . "a43695f9cb412df93ac8d38b55ab1515e86e217e") (:revdesc . "a43695f9cb41") (:keywords "convenience" "blacken") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com"))]) + (blackjack . [(20230821 41) ((emacs (26 2))) "The game of Blackjack" tar ((:url . "https://github.com/gdonald/blackjack-el") (:commit . "7f9072630a159b59a146346b5dae24ab8fb5f290") (:revdesc . "7f9072630a15") (:keywords "card" "game" "games" "blackjack" "21") (:authors ("Greg Donald" . "gdonald@gmail.com")) (:maintainers ("Greg Donald" . "gdonald@gmail.com")) (:maintainer "Greg Donald" . "gdonald@gmail.com"))]) + (blackout . [(20220509 2350) ((emacs (26))) "Better mode lighter overriding" tar ((:url . "https://github.com/radian-software/blackout") (:commit . "7707211370f03f03a2f74df15f42ac24a1e99300") (:revdesc . "7707211370f0") (:keywords "extensions") (:authors ("Radian LLC" . "contact+blackout@radian.codes")) (:maintainers ("Radian LLC" . "contact+blackout@radian.codes")) (:maintainer "Radian LLC" . "contact+blackout@radian.codes"))]) + (blamer . [(20251001 620) ((emacs (27 1)) (posframe (1 1 7)) (async (1 9 8))) "Show git blame info about current line" tar ((:url . "https://github.com/artawower/blamer.el") (:commit . "aa9b22d4e847d15a5c4659c0407aa8bf4242cc94") (:revdesc . "aa9b22d4e847") (:authors ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainers ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainer "Artur Yaroshenko" . "artawower@protonmail.com"))]) + (blgrep . [(20150401 1416) ((clmemo (20140321 715))) "Block grep" tar ((:url . "https://github.com/ataka/blgrep") (:commit . "605beda210610a5829750a987f5fcebea97af546") (:revdesc . "605beda21061") (:keywords "tools" "convenience") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainers ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com"))]) + (blimp . [(20180903 2240) ((emacs (25)) (eimp (1 4 0))) "Bustling Image Manipulation Package" tar ((:url . "https://github.com/walseb/blimp") (:commit . "b048b037129b68674b99310bcc08fb96d44fdbb4") (:revdesc . "b048b037129b") (:keywords "multimedia" "unix") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com"))]) + (bliss-theme . [(20170808 1307) ((emacs (24 0))) "An Emacs 24 theme based on Bliss (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "c3cf6d8a666ab26909b7da158f9e94df71a5fbbf") (:revdesc . "c3cf6d8a666a"))]) + (blitzmax-mode . [(20250221 1408) ((emacs (24 1))) "A major mode for editing BlitzMax source code" tar ((:url . "https://www.sodaware.net/dev/tools/blitzmax-mode/") (:commit . "adf6444ca4cea047b5532495e9692ed044224ea4") (:revdesc . "adf6444ca4ce") (:keywords "languages" "blitzmax"))]) + (bln-mode . [(20181121 918) nil "Binary line navigation minor mode for cursor movement in long lines" tar ((:url . "https://github.com/mgrachten/bln-mode") (:commit . "a601b0bf975dd1432f6552ab6afe3f4f71133b4a") (:revdesc . "a601b0bf975d") (:keywords "motion" "location" "cursor" "convenience"))]) + (block-nav . [(20201005 202) ((emacs (25 1))) "Jump across indentation levels for quick navigation" tar ((:url . "https://github.com/nixin72/block-nav.el") (:commit . "bc02e545cfd9a048a8df777669a426a8edc2321f") (:revdesc . "bc02e545cfd9") (:keywords "convenience") (:maintainers ("Philip Dumaresq" . "phdumaresq@protonmail.com")) (:maintainer "Philip Dumaresq" . "phdumaresq@protonmail.com"))]) + (blockdiag-mode . [(20160427 524) ((emacs (24 3))) "Major mode for editing blockdiag files" tar ((:url . "https://github.com/xcezx/xdiag-mode") (:commit . "f3b21ba433d60327cebd103ae4492200750e24a9") (:revdesc . "f3b21ba433d6") (:authors ("xcezx" . "main.xcezx@gmail.com")) (:maintainers ("xcezx" . "main.xcezx@gmail.com")) (:maintainer "xcezx" . "main.xcezx@gmail.com"))]) + (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 ((:url . "https://github.com/xcodebuild/blog-admin") (:commit . "b5f2e1dad7d68ec903619f7280bb0bcb7e398a1e") (:revdesc . "b5f2e1dad7d6") (:keywords "tools" "blog" "org" "hexo" "org-page") (:authors (nil . "code.falling@gmail.com")) (:maintainers (nil . "code.falling@gmail.com")) (:maintainer nil . "code.falling@gmail.com"))]) + (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 ((:url . "https://github.com/thiefuniverse/blog-minimal") (:commit . "a634a2db0b80cb445ef0b072d1a1482ced91f9ad") (:revdesc . "a634a2db0b80") (:keywords "tools") (:authors ("Thank Fly" . "thiefuniverses@gmail.com")) (:maintainers ("Thank Fly" . "thiefuniverses@gmail.com")) (:maintainer "Thank Fly" . "thiefuniverses@gmail.com"))]) + (blox . [(20220521 807) ((emacs (25 1))) "Interaction with Roblox tooling" tar ((:url . "https://github.com/kennethloeffler/blox") (:commit . "9ebebb65fb38b5570ba8dfbb5ec835633c06b67d") (:revdesc . "9ebebb65fb38") (:keywords "roblox" "rojo" "tools") (:authors ("Kenneth Loeffler" . "kenloef@gmail.com")) (:maintainers ("Kenneth Loeffler" . "kenloef@gmail.com")) (:maintainer "Kenneth Loeffler" . "kenloef@gmail.com"))]) + (blue . [(20251223 1409) ((emacs (30 1)) (magit-section (4 3 8))) "BLUE build system interface" tar ((:url . "https://codeberg.org/lapislazuli/blue.el") (:commit . "b2778111dba48b0d7db4c17cbe352b541e6e7707") (:revdesc . "b2778111dba4") (:keywords "blue" "tools") (:authors ("Sergio Pastor Pérez" . "sergio.pastorperez@gmail.com")) (:maintainers ("Sergio Pastor Pérez" . "sergio.pastorperez@gmail.com")) (:maintainer "Sergio Pastor Pérez" . "sergio.pastorperez@gmail.com"))]) + (bluesound . [(20251022 1406) ((emacs (26 1))) "Play, pause, resume music on a Bluesound player" tar ((:url . "https://git.sr.ht/~rwv/bluesound-el/") (:commit . "60d7f422483bd7f3cf23983160e28ecff9c14b38") (:revdesc . "60d7f422483b") (:keywords "convenience" "multimedia"))]) + (bm . [(20250603 2137) nil "Visible bookmarks in buffer" tar ((:url . "https://github.com/joodland/bm") (:commit . "1fefbc46d10d5398ecca93aa18ef1af3fc1f44b4") (:revdesc . "1fefbc46d10d") (:keywords "bookmark" "highlight" "faces" "persistent") (:authors ("Jo Odland" . "jo.odlandgmail.com")) (:maintainers ("Jo Odland" . "jo.odlandgmail.com")) (:maintainer "Jo Odland" . "jo.odlandgmail.com"))]) + (bmp . [(20251005 2032) ((emacs (29))) "Version bumper for git projects" tar ((:url . "https://git.sr.ht/~lepisma/bmp") (:commit . "8f4fe653ee49860d764b789919bbd46a4a9d3768") (:revdesc . "8f4fe653ee49") (:authors ("Abhinav Tushar" . "lepisma@fastmail.com")) (:maintainers ("Abhinav Tushar" . "lepisma@fastmail.com")) (:maintainer "Abhinav Tushar" . "lepisma@fastmail.com"))]) + (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 ((:url . "http://github.com/josteink/bmx-mode") (:commit . "6f008707efe0bb5646f0c1b0d6f57f0a8800e200") (:revdesc . "6f008707efe0") (:keywords "c" "convenience" "tools") (:authors ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainers ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com"))]) + (bnf-mode . [(20240915 2118) ((cl-lib (0 5)) (emacs (27 1))) "Major mode for editing BNF grammars" tar ((:url . "https://github.com/sergeyklay/bnf-mode") (:commit . "5304ab647e04916c5be4fdde41477ad429a89120") (:revdesc . "5304ab647e04") (:keywords "languages") (:authors ("Serghei Iakovlev" . "gnu@serghei.pl")) (:maintainers ("Serghei Iakovlev" . "gnu@serghei.pl")) (:maintainer "Serghei Iakovlev" . "gnu@serghei.pl"))]) + (bnfc . [(20160605 1927) ((emacs (24 3))) "Define context-free grammars for the BNFC tool" tar ((:url . "https://github.com/jmitchell/bnfc-mode") (:commit . "1b58df1dd0cb9b81900632fb2843a03b94f56fdb") (:revdesc . "1b58df1dd0cb") (:keywords "languages" "tools") (:authors ("Jacob Mitchell" . "jmitchell@member.fsf.org")) (:maintainers ("Jacob Mitchell" . "jmitchell@member.fsf.org")) (:maintainer "Jacob Mitchell" . "jmitchell@member.fsf.org"))]) + (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 ((:url . "https://github.com/boalang/syntax-highlight") (:commit . "e1f960ada937be747ea2ec302bea155092e5c06b") (:revdesc . "e1f960ada937") (:keywords "languages") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (boa-mode . [(20230730 2216) ((emacs (26 1))) "Mode for boa language files" tar ((:url . "https://github.com/boalang/syntax-highlight") (:commit . "892f2a33ef95db9f19b45deb8309652534f91efd") (:revdesc . "892f2a33ef95") (:keywords "languages") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (bog . [(20240215 27) ((cl-lib (0 5))) "Extensions for research notes in Org mode" tar ((:url . "https://github.com/kyleam/bog") (:commit . "c8e7c8cb54b1787cc3d9383f0514eb76cadd4002") (:revdesc . "c8e7c8cb54b1") (:keywords "bib" "outlines") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com"))]) + (bolt-mode . [(20180310 810) ((emacs (24 3))) "Editing support for Bolt language" tar ((:url . "https://github.com/mpontus/bolt-mode") (:commit . "85a5a752bfbebb4aed884326c25db64c000e9934") (:revdesc . "85a5a752bfbe") (:keywords "languages") (:authors ("Mikhail Pontus" . "mpontus@gmail.com")) (:maintainers ("Mikhail Pontus" . "mpontus@gmail.com")) (:maintainer "Mikhail Pontus" . "mpontus@gmail.com"))]) + (bongo . [(20201002 1020) ((cl-lib (0 5)) (emacs (24 1))) "Play music with Emacs" tar ((:url . "https://github.com/dbrock/bongo") (:commit . "9e9629090262bba6d0003dabe5a375e47a4477f1") (:revdesc . "9e9629090262"))]) + (bonjourmadame . [(20170919 1134) nil "Say \"Hello ma'am!\"" tar ((:url . "https://github.com/pierre-lecocq/bonjourmadame") (:commit . "d3df185fce78aefa689fded8e56a654f0fde4ac0") (:revdesc . "d3df185fce78"))]) + (boogie-friends . [(20250310 1610) ((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 ((:url . "https://github.com/boogie-org/boogie-friends/") (:commit . "54905dab2944e7e808aa9445727646d7a3855174") (:revdesc . "54905dab2944") (:keywords "convenience" "languages") (: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"))]) + (bookmark-frecency . [(20250220 1407) ((emacs (27 1))) "Sort bookmarks by frecency" tar ((:url . "https://github.com/akirak/bookmark-frecency.el") (:commit . "c0a4dae3ff23a548538716cbd2ad533680dc7e9e") (:revdesc . "c0a4dae3ff23") (:keywords "convenience") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (bookmark-in-project . [(20251214 537) ((emacs (29 1))) "Bookmark access within a project" tar ((:url . "https://codeberg.org/ideasman42/emacs-bookmark-in-project") (:commit . "7839b4c9cd79d3993774867a97c9c5cf83944862") (:revdesc . "7839b4c9cd79") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (bookmarks-menu . [(20250508 2114) ((emacs (29 1))) "Add a Bookmarks menu to the menu bar" tar ((:url . "https://github.com/ajrosen/bookmarks-menu") (:commit . "e279bd3c27773e72b23eb698e9b1eed3f7d764c9") (:revdesc . "e279bd3c2777") (:keywords "matching" "convenience" "bookmark") (:authors ("Andy Rosen" . "ajr@corp.mlfs.org")) (:maintainers ("Andy Rosen" . "ajr@corp.mlfs.org")) (:maintainer "Andy Rosen" . "ajr@corp.mlfs.org"))]) + (bool-flip . [(20161215 1539) ((emacs (24 3))) "Flip the boolean under the point" tar ((:url . "http://github.com/michaeljb/bool-flip/") (:commit . "0f7cc9b387429239fb929896511727d4e49a795b") (:revdesc . "0f7cc9b38742") (:keywords "boolean" "convenience" "usability") (:authors ("Michael Brandt" . "michaelbrandt5@gmail.com")) (:maintainers ("Michael Brandt" . "michaelbrandt5@gmail.com")) (:maintainer "Michael Brandt" . "michaelbrandt5@gmail.com"))]) + (boon . [(20251212 1343) ((emacs (26 1)) (dash (2 12 0)) (expand-region (0 10 0)) (multiple-cursors (1 3 0))) "Ergonomic Command Mode for Emacs" tar ((:url . "https://github.com/jyp/boon") (:commit . "28b3ff88673d73a4a907a47c22e82864a5c7a031") (:revdesc . "28b3ff88673d"))]) + (borg . [(20251130 1841) ((emacs (28 1)) (epkg (4 1)) (magit (4 4))) "Assimilate Emacs packages as Git submodules" tar ((:url . "https://github.com/emacscollective/borg") (:commit . "eea04635be203f500a9f94024416518b84649528") (:revdesc . "eea04635be20") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.borg@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.borg@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.borg@jonas.bernoulli.dev"))]) + (borland-blue-theme . [(20160117 1321) ((emacs (24 1))) "Blue/yellow theme based on old DOS Borland/Turbo C IDE" tar ((:url . "http://github.com/fourier/borland-blue-theme") (:commit . "db74eefebbc89d3c62575f8f50b319e87b4a3470") (:revdesc . "db74eefebbc8") (:keywords "themes") (:authors ("Alexey Veretennikov" . "alexeydotveretennikovatgmaildotcom")) (:maintainers ("Alexey Veretennikov" . "alexeydotveretennikovatgmaildotcom")) (:maintainer "Alexey Veretennikov" . "alexeydotveretennikovatgmaildotcom"))]) + (boron-theme . [(20170808 1308) ((emacs (24 0))) "An Emacs 24 theme based on Boron (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "87ae1a765e07429fec25d2f29b004f84b52d2e0a") (:revdesc . "87ae1a765e07"))]) + (boxes . [(20241003 847) ((emacs (24 3))) "ASCII boxes unlimited!" tar ((:url . "https://boxes.thomasjensen.com") (:commit . "bae35281d0f814c704ef4a174a5f734541e1f457") (:revdesc . "bae35281d0f8") (:keywords "extensions") (:authors ("Jason L. Shiffer" . "jshiffer@zerotao.com")) (:maintainers ("Jason L. Shiffer" . "jshiffer@zerotao.com")) (:maintainer "Jason L. Shiffer" . "jshiffer@zerotao.com"))]) + (boxquote . [(20231216 852) ((cl-lib (0 5))) "Quote text with a semi-box" tar ((:url . "https://github.com/davep/boxquote.el") (:commit . "8d6c307ab3b783c5042065d0ae54961adb506484") (:revdesc . "8d6c307ab3b7") (:keywords "quoting") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (bpe . [(20141228 2205) ((emacs (24 1))) "Blog from Org mode to Blogger" tar ((:url . "https://github.com/yuutayamada/bpe") (:commit . "7b5b25f83506e6c9f4075d3803fa32404943a189") (:revdesc . "7b5b25f83506") (:keywords "blogger" "blog") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (bpftrace-mode . [(20190608 2201) ((emacs (24 0))) "Major mode for editing bpftrace script files" tar ((:url . "http://gitlab.com/jgkamat/bpftrace-mode") (:commit . "587b39ea7a1d786df5c04796d51bf2a5a4eda0d7") (:revdesc . "587b39ea7a1d") (:keywords "highlight" "c") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainers ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com"))]) + (bpr . [(20180220 1844) ((emacs (24))) "Background Process Runner" tar ((:url . "https://github.com/ilya-babanov/emacs-bpr") (:commit . "af84a83dea09d86e77d87ac30604f2c5b4bf4117") (:revdesc . "af84a83dea09") (:keywords "background" "async" "process" "management") (:authors ("Ilya Babanov" . "ilya-babanov@ya.ru")) (:maintainers ("Ilya Babanov" . "ilya-babanov@ya.ru")) (:maintainer "Ilya Babanov" . "ilya-babanov@ya.ru"))]) + (bqn-mode . [(20250705 1223) ((emacs (26 1)) (compat (30 0 0 0)) (eros (0 1 0))) "Emacs mode for BQN" tar ((:url . "https://github.com/museoa/bqn-mode") (:commit . "7c04ca9009e72b48da307b41d6814df1e383609a") (:revdesc . "7c04ca9009e7") (:authors ("Marshall Lochbaum" . "mwlochbaum@gmail.com")) (:maintainers ("Marshall Lochbaum" . "mwlochbaum@gmail.com")) (:maintainer "Marshall Lochbaum" . "mwlochbaum@gmail.com"))]) + (bracket-face . [(20251101 2048) ((emacs (30 1))) "A face for brackets" tar ((:url . "https://github.com/tarsius/paren-face") (:commit . "b121bc08ecb0c11a89705ed9f77c5343e2baec04") (:revdesc . "b121bc08ecb0") (:keywords "faces" "lisp") (:authors ("Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev"))]) + (bracketed-paste . [(20160407 2348) ((emacs (24 3))) "Bracketed paste mode support within emacs -nw" tar ((:url . "https://github.com/hchbaw/bracketed-paste.el") (:commit . "843ce3bbb63d560face889e13a57a2f7543957d5") (:revdesc . "843ce3bbb63d") (:keywords "terminals") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainers ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net"))]) + (brainfuck-mode . [(20150113 842) ((langdoc (20130601 1450))) "Brainfuck mode for Emacs" tar ((:url . "https://github.com/tom-tan/brainfuck-mode/") (:commit . "36e69552bb3b97a4f888d362c59845651bd0d492") (:revdesc . "36e69552bb3b") (:keywords "brainfuck" "langdoc") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com"))]) + (bray . [(20251012 25) ((emacs (29 1))) "Lightweight modal editing" tar ((:url . "https://codeberg.org/ideasman42/emacs-bray") (:commit . "d17c245a15bae1ba8aa83bb1fb71508e04ac1258") (:revdesc . "d17c245a15ba") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (brazilian-holidays . [(20220828 2348) ((emacs (26))) "Brazilian holidays" tar ((:url . "https://github.com/jadler/brazilian-holidays") (:commit . "03206ea673df49c91a8f924db799620713d86240") (:revdesc . "03206ea673df") (:keywords "calendar" "holidays" "brazilian") (:authors ("Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com")) (:maintainers ("Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com")) (:maintainer "Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com"))]) + (brec-mode . [(20240620 1213) ((emacs (24 3))) "A major mode for editing Breccian text" tar ((:url . "http://reluk.ca/project/Breccia/Emacs/") (:commit . "942e042cc22224ec3940d0867c8c08f71e036924") (:revdesc . "942e042cc222") (:keywords "outlines" "wp") (:authors ("Michael Allan" . "mike@reluk.ca")) (:maintainers ("Michael Allan" . "mike@reluk.ca")) (:maintainer "Michael Allan" . "mike@reluk.ca"))]) + (brf . [(20250301 1142) ((fringe-helper (0 1 1)) (emacs (24 4))) "Brf-mode provides features from the legendary editor Brief" tar ((:url . "https://bitbucket.org/MikeWoolley/brf-mode") (:commit . "4751ce5c76f53d4e3e6a658461651a4f3ce35045") (:revdesc . "4751ce5c76f5") (:keywords "brief" "crisp" "emulations") (:authors ("Mike Woolley" . "mike@bulsara.com")) (:maintainers ("Mike Woolley" . "mike@bulsara.com")) (:maintainer "Mike Woolley" . "mike@bulsara.com"))]) + (brightscript-mode . [(20220906 827) ((emacs (26 3))) "Major mode for editing Brightscript files" tar ((:url . "https://github.com/viseztrance/brightscript-mode") (:commit . "025d6f5a70752c62a28d4f86c053a283b3898a49") (:revdesc . "025d6f5a7075") (:keywords "languages") (:authors ("Daniel Mircea" . "daniel@viseztrance.com")) (:maintainers (nil . "daniel@viseztrance.com")) (:maintainer nil . "daniel@viseztrance.com"))]) + (bril-mode . [(20240315 1157) ((emacs (27 1))) "Major mode for Bril text format" tar ((:url . "https://github.com/nverno/bril-mode") (:commit . "da61316385e31973c462a1e8a3213327b34df3ff") (:revdesc . "da61316385e3") (:keywords "languages" "bril") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (broadcast . [(20250804 1815) ((emacs (24 4))) "Links buffers together for simultaneous editing" tar ((:url . "https://github.com/killdash9/broadcast.el") (:commit . "c6fff897c14f0aac9c44a7d8ca3f70782e4c38d0") (:revdesc . "c6fff897c14f") (:keywords "convenience" "frames" "link" "cursors") (:authors ("Russell Black" . "(killdash9@github)")) (:maintainers ("Russell Black" . "(killdash9@github)")) (:maintainer "Russell Black" . "(killdash9@github)"))]) + (browse-at-remote . [(20251223 2328) ((f (0 20 0)) (s (1 9 0)) (cl-lib (0 5))) "Open github/gitlab/bitbucket/stash/gist/phab/sourcehut page from Emacs" tar ((:url . "https://github.com/rmuslimov/browse-at-remote") (:commit . "27b17cc63b9f9dca893425908373251eb9b10f44") (:revdesc . "27b17cc63b9f") (:keywords "github" "gitlab" "bitbucket" "gist" "stash" "phabricator" "sourcehut" "pagure") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainers ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com"))]) + (browse-kill-ring . [(20251208 1041) nil "Interactively insert items from kill-ring" tar ((:url . "https://github.com/browse-kill-ring/browse-kill-ring") (:commit . "26ea5759c996e782abadc61b85c5f9324d1d1dae") (:revdesc . "26ea5759c996") (:keywords "convenience") (:authors ("Colin Walters" . "walters@verbum.org")) (:maintainers ("browse-kill-ring" . "browse-kill-ring@tonotdo.com")) (:maintainer "browse-kill-ring" . "browse-kill-ring@tonotdo.com"))]) + (browse-url-dwim . [(20140731 1922) ((string-utils (0 3 2))) "Context-sensitive external browse URL or Internet search" tar ((:url . "http://github.com/rolandwalker/browse-url-dwim") (:commit . "11f1c53126619c7ef1bb5f5d6914ce0b3cce0e30") (:revdesc . "11f1c5312661") (:keywords "hypermedia") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (browser-hist . [(20250501 1450) ((emacs (28 1))) "Search through the Browser history" tar ((:url . "https://github.com/agzam/browser-hist.el") (:commit . "1cd80081feaab99fef9e8eadd55d68b3cef90144") (:revdesc . "1cd80081feaa") (:keywords "convenience" "hypermedia" "matching" "tools") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com"))]) + (brutalist-theme . [(20250104 1112) ((emacs (24 1))) "Brutalist theme" tar ((:url . "https://git.madhouse-project.org/algernon/brutalist-theme.el") (:commit . "29f1c70451075e87a9f1747478cc78ed6d37de26") (:revdesc . "29f1c7045107"))]) + (bshell . [(20240112 2303) ((emacs (26)) (buffer-manage (1 1))) "Manage and track multiple inferior shells" tar ((:url . "https://github.com/plandes/bshell") (:commit . "d59559cf7c5dded8b9639346ae5c1384d8b9be4e") (:revdesc . "d59559cf7c5d") (:keywords "unix" "interactive" "shell" "management"))]) + (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 ((:url . "https://github.com/aki2o/emacs-bts") (:commit . "df42d58a36447697f93b56e69f5e700b2baef1f9") (:revdesc . "df42d58a3644") (:keywords "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (bts-github . [(20170401 1249) ((bts (0 0 1)) (gh (0 8 2))) "A plugin of bts.el for GitHub" tar ((:url . "https://github.com/aki2o/emacs-bts-github") (:commit . "ef2cf9202dc2128e5efdb613bfde9276a8cd95ad") (:revdesc . "ef2cf9202dc2") (:keywords "convenience" "git" "github") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (bubbleberry-theme . [(20141017 944) ((emacs (24 1))) "A theme based on LightTable for Emacs24" tar ((:url . "https://github.com/jasonm23/emacs-bubbleberry-theme") (:commit . "22e9adf4586414024e4592972022ec297321b320") (:revdesc . "22e9adf45864") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (buck . [(20250620 1333) ((ghub (4))) "Client library for the Bitbucket API" tar ((:url . "https://github.com/emacsattic/buck") (:commit . "3b6bd10ad5e7e6bf1ec36dce55b2b77545ec73e2") (:revdesc . "3b6bd10ad5e7") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev"))]) + (buckwalter . [(20191119 1950) nil "Write arabic using Buckwalter transliteration" tar ((:url . "https://github.com/joehakimrahme/buckwalter-arabic") (:commit . "1ef6f210f38c0686bc5b445b9704190f168f30ea") (:revdesc . "1ef6f210f38c") (:keywords "arabic" "transliteration" "i18n") (:authors ("Joe HAKIM RAHME" . "joehakimrahme@gmail.com")) (:maintainers ("Joe HAKIM RAHME" . "joehakimrahme@gmail.com")) (:maintainer "Joe HAKIM RAHME" . "joehakimrahme@gmail.com"))]) + (buffer-buttons . [(20150106 1439) nil "Define, save, and load code-safe buttons in files for emacs" tar ((:url . "https://github.com/rpav/buffer-buttons") (:commit . "2feb8494fa7863b98256bc85da670d74a3a8a975") (:revdesc . "2feb8494fa78") (:authors ("Ryan Pavlik" . "rpavlik@gmail.com")) (:maintainers ("Ryan Pavlik" . "rpavlik@gmail.com")) (:maintainer "Ryan Pavlik" . "rpavlik@gmail.com"))]) + (buffer-env . [(20250516 1223) ((emacs (27 1)) (compat (29 1))) "Buffer-local process environments" tar ((:url . "https://github.com/astoff/buffer-env") (:commit . "fc5cab4db55f0b95c4b97fbe3104e394da34b91a") (:revdesc . "fc5cab4db55f") (:keywords "processes" "tools") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com"))]) + (buffer-flip . [(20220718 10) ((cl-lib (0 5))) "Cycle through buffers like Alt-Tab in Windows" tar ((:url . "https://github.com/killdash9/buffer-flip.el") (:commit . "dda0cbcd202cdadf322942f9637a11ed92525756") (:revdesc . "dda0cbcd202c") (:keywords "convenience") (:authors ("Russell Black" . "(killdash9@github)")) (:maintainers ("Russell Black" . "(killdash9@github)")) (:maintainer "Russell Black" . "(killdash9@github)"))]) + (buffer-manage . [(20241019 1748) ((emacs (26 1)) (choice-program (0 13)) (dash (2 17 0))) "Manage buffers" tar ((:url . "https://github.com/plandes/buffer-manage") (:commit . "3d338b1e64f256ccb70adf81de4c04bcda7eb8d8") (:revdesc . "3d338b1e64f2") (:keywords "internal" "maint"))]) + (buffer-move . [(20220512 755) ((emacs (24 1))) "Easily swap buffers" tar ((:url . "https://github.com/lukhas/buffer-move/") (:commit . "e7800b3ab1bd76ee475ef35507ec51ecd5a3f065") (:revdesc . "e7800b3ab1bd") (:keywords "convenience"))]) + (buffer-name-relative . [(20251214 600) ((emacs (29 1))) "Relative buffer names" tar ((:url . "https://codeberg.org/ideasman42/emacs-buffer-name-relative") (:commit . "a2e902c04ab68ec52b7c721d89a999f8eb2daae2") (:revdesc . "a2e902c04ab6") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (buffer-ring . [(20251004 347) ((emacs (25 1)) (dynaring (0 3))) "Rings and tori for buffer navigation" tar ((:url . "https://github.com/countvajhula/buffer-ring") (:commit . "3d7ee2020aff07506e16220f86b6521af814c282") (:revdesc . "3d7ee2020aff") (:authors ("Mike Mattie" . "codermattie@gmail.com") ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com"))]) + (buffer-sets . [(20250226 2053) ((cl-lib (0 5))) "Sets of Buffers for Buffer Management" tar ((:url . "https://git.sr.ht/~swflint/buffer-sets") (:commit . "8d67ed8c9ea182abdcf457e0c247ab44675def9e") (:revdesc . "8d67ed8c9ea1") (:keywords "buffer-management") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (buffer-terminator . [(20250911 2238) ((emacs (25 1))) "Safely Terminate/Kill Buffers Automatically" tar ((:url . "https://github.com/jamescherti/buffer-terminator.el") (:commit . "68552751bcfd049e72a5b81b3077b121ec7a7d01") (:revdesc . "68552751bcfd") (:keywords "convenience"))]) + (buffer-utils . [(20140512 1400) nil "Buffer-manipulation utility functions" tar ((:url . "http://github.com/rolandwalker/buffer-utils") (:commit . "32e1f23817b9c6caedb53e5359baad29e99eaa2b") (:revdesc . "32e1f23817b9") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (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 ((:url . "https://github.com/NicolasPetton/buffer-watcher") (:commit . "b32c67c8a5d724257d759f4c903d0dedc32246ef") (:revdesc . "b32c67c8a5d7") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (buffer-wrap . [(20250101 1003) ((emacs (24 4))) "Wrap the beginning and the end of buffer" tar ((:url . "https://github.com/jcs-elpa/buffer-wrap") (:commit . "60f205258981d3433700b9c1c8d14026a001bd5e") (:revdesc . "60f205258981") (:keywords "convenience" "buffer" "tool" "wrap") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (bufferbin . [(20230706 110) ((emacs (26 1))) "Quick mouse access to buffers" tar ((:url . "https://github.com/blueridge-data/bufferbin") (:commit . "ee4bf49cc69573f690e2e9f36f03c20b322c1730") (:revdesc . "ee4bf49cc695") (:authors ("Ryan Walsh" . "blueridge-data@github")) (:maintainers ("Ryan Walsh" . "blueridge-data@github")) (:maintainer "Ryan Walsh" . "blueridge-data@github"))]) + (bufferfile . [(20251011 1158) ((emacs (26 1))) "Rename/Delete/Copy Files and Associated Buffers" tar ((:url . "https://github.com/jamescherti/bufferfile.el") (:commit . "e4e5c46fcf656fa06f7388b514fbf17636bba424") (:revdesc . "e4e5c46fcf65") (:keywords "convenience"))]) + (bufler . [(20250327 2246) ((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 ((:url . "https://github.com/alphapapa/bufler.el") (:commit . "b96822d2132fda6bd1dd86f017d7e76e3b990c82") (:revdesc . "b96822d2132f") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (bufshow . [(20130726 1838) ((emacs (24 1))) "A simple presentation tool for Emacs" tar ((:url . "https://github.com/pjones/bufshow") (:commit . "42d7fb74c3f914e127d5447c63d209bf19f5d517") (:revdesc . "42d7fb74c3f9") (:authors ("Peter Jones" . "pjones@pmade.com")) (:maintainers ("Peter Jones" . "pjones@pmade.com")) (:maintainer "Peter Jones" . "pjones@pmade.com"))]) + (bug-reference-github . [(20200206 2158) nil "Set `bug-reference-url-format' in Github repos" tar ((:url . "https://github.com/arnested/bug-reference-github") (:commit . "4e848472a5be464a3bc10a3c917322d1e344951a") (:revdesc . "4e848472a5be") (:keywords "programming" "tools") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainers ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk"))]) + (bui . [(20210108 1141) ((emacs (24 3)) (dash (2 11 0))) "Buffer interface library" tar ((:url . "https://github.com/alezost/bui.el") (:commit . "ab62fcefc3c7ddf5e5d64c18045148a3c297592d") (:revdesc . "ab62fcefc3c7") (:keywords "tools") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (build-farm . [(20181218 2002) ((emacs (24 4)) (bui (1 2 1)) (magit-popup (2 1 0))) "Interface for Nix and Guix build farms (Hydra and Cuirass)" tar ((:url . "https://gitlab.com/alezost-emacs/build-farm") (:commit . "5c268a3c235ace0d79ef1ec82c440120317e06f5") (:revdesc . "5c268a3c235a") (:keywords "tools") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (build-helper . [(20161009 1755) ((projectile (0 9 0))) "Utilities to help build code" tar ((:url . "http://github.com/afonso360/build-helper") (:commit . "d1962858734253eca791721ccf62d1c4a10719f5") (:revdesc . "d19628587342") (:keywords "convenience") (:authors ("Afonso Bordado" . "afonsobordado@az8.co")) (:maintainers ("Afonso Bordado" . "afonsobordado@az8.co")) (:maintainer "Afonso Bordado" . "afonsobordado@az8.co"))]) + (build-status . [(20190807 1231) ((cl-lib (0 5))) "Mode line build status indicator" tar ((:url . "http://github.com/sshaw/build-status") (:commit . "1a1d2473aa62f2fdda47d8bfeb9fe352d2579b48") (:revdesc . "1a1d2473aa62") (:keywords "mode-line" "ci" "circleci" "travis-ci") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com"))]) + (burly . [(20240727 545) ((emacs (27 1)) (map (2 1))) "Save and restore frame/window configurations with buffers" tar ((:url . "https://github.com/alphapapa/burly.el") (:commit . "d5b7133b5b629dd6bca29bb16660a9e472e82e25") (:revdesc . "d5b7133b5b62") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (burnt-toast . [(20201113 814) ((emacs (25 1)) (dash (2 10)) (alert (1 2))) "Elisp integration with the BurntToast PowerShell module" tar ((:url . "https://github.com/cedarbaum/burnt-toast.el") (:commit . "e9cf41928b7b502fdfa43718c35a24e503db32e2") (:revdesc . "e9cf41928b7b") (:keywords "alert" "notifications" "powershell" "comm") (:authors ("Sam Cedarbaum" . "(scedarbaum@gmail.com)")) (:maintainers ("Sam Cedarbaum" . "(scedarbaum@gmail.com)")) (:maintainer "Sam Cedarbaum" . "(scedarbaum@gmail.com)"))]) + (bury-successful-compilation . [(20181106 403) nil "Bury the *compilation* buffer after successful compilation" tar ((:url . "https://github.com/EricCrosson/bury-successful-compilation") (:commit . "674644c844184605a1bb4f9487a60f7a780a6fe7") (:revdesc . "674644c84418") (:keywords "compilation") (:authors ("Eric Crosson" . "esc@ericcrosson.com")) (:maintainers ("Eric Crosson" . "esc@ericcrosson.com")) (:maintainer "Eric Crosson" . "esc@ericcrosson.com"))]) + (buster-mode . [(20140928 1213) nil "Minor mode to speed up development when writing tests with Buster.js" tar ((:url . "https://github.com/magnars/buster-mode") (:commit . "de6958ef8369400922618b8d1e99abfa91b97ac5") (:revdesc . "de6958ef8369") (:keywords "buster" "testing" "javascript"))]) + (buster-snippets . [(20151125 1010) ((yasnippet (0 8 0))) "Yasnippets for the Buster javascript testing framework" tar ((:url . "https://github.com/magnars/buster-snippets.el") (:commit . "bb8769dae132659858e74d52f3f4e8790399423a") (:revdesc . "bb8769dae132") (:keywords "snippets") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (busybee-theme . [(20170719 928) nil "Port of vim's mustang theme" tar ((:url . "http://github.com/mswift42/busybee-theme") (:commit . "66b2315b030582d0ebee605cf455d386d8c30fcd") (:revdesc . "66b2315b0305"))]) + (buttercup . [(20250801 1) ((emacs (24 4))) "Behavior-Driven Emacs Lisp Testing" tar ((:url . "https://github.com/jorgenschaefer/emacs-buttercup") (:commit . "cc5a2ab7c7f18aaaf525fac61fe59bae5ad018dd") (:revdesc . "cc5a2ab7c7f1") (:authors ("Jorgen Schaefer" . "contact@jorgenschaefer.de")) (:maintainers ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com"))]) + (buttercup-junit . [(20240423 2158) ((emacs (24 4)) (buttercup (1 15))) "JUnit reporting for Buttercup" tar ((:url . "https://bitbucket.org/olanilsson/buttercup-junit") (:commit . "877daa33fc3fc23f2a3d633e28650c04534458b5") (:revdesc . "877daa33fc3f") (:keywords "tools" "test" "unittest" "buttercup" "ci") (:authors ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainers ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com"))]) + (button-lock . [(20230304 2212) nil "Clickable text defined by regular expression" tar ((:url . "http://github.com/rolandwalker/button-lock") (:commit . "1f7a89ca05b6167af7d1337ad23a5d923486caac") (:revdesc . "1f7a89ca05b6") (:keywords "mouse" "button" "hypermedia" "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (buttons . [(20230906 1631) ((emacs (24 1)) (cl-lib (0 3))) "Define and visualize hierarchies of keymaps" tar ((:url . "http://github.com/erjoalgo/emacs-buttons") (:commit . "6fd4a9b3f8b9d2344a316b0fd6576d90f53f5acb") (:revdesc . "6fd4a9b3f8b9") (:keywords "lisp" "extensions" "convenience" "tools") (:maintainers ("concat \"erjoalgo\" \"@\" \"gmail\" \".com\"" . "")) (:maintainer "concat \"erjoalgo\" \"@\" \"gmail\" \".com\"" . ""))]) + (c-c-combo . [(20151224 255) nil "Make stuff happen when you reach a target wpm" tar ((:url . "https://www.github.com/CestDiego/c-c-combo.el") (:commit . "a261a833499a7fdc29610863b3aafc74818770ba") (:revdesc . "a261a833499a") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com"))]) + (c-eldoc . [(20201004 2347) nil "Helpful description of the arguments to C functions" tar ((:url . "http://github.com/nflath/c-eldoc") (:commit . "f4ede1f37f6de583376669735326367d84a0a917") (:revdesc . "f4ede1f37f6d") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainers ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com"))]) + (c-eval . [(20210611 705) ((emacs (24 5))) "Compile and run one-off C code snippets" tar ((:url . "https://github.com/lassik/emacs-c-eval") (:commit . "fd129bfcb75475ac6820cc33862bd8efb8097fae") (:revdesc . "fd129bfcb754") (:keywords "c" "languages") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (c0-mode . [(20151110 1852) nil "Major mode for editing C0 files" tar ((:url . "http://c0.typesafety.net/") (:commit . "c214093c36864d6208fcb9e6a72413ed17ed5d60") (:revdesc . "c214093c3686") (:keywords "c0" "languages"))]) + (c2-mode . [(20250303 956) ((emacs (24 3))) "Major mode for C2 programming language" tar ((:url . "https://github.com/easimonenko/c2-mode") (:commit . "e3cc3a94f88d98e5a1b9086a4ad480009040a1ed") (:revdesc . "e3cc3a94f88d") (:keywords "languages" "c2") (:authors ("Evgeny Simonenko" . "easimonenko@gmail.com")) (:maintainers ("Evgeny Simonenko" . "easimonenko@gmail.com")) (:maintainer "Evgeny Simonenko" . "easimonenko@gmail.com"))]) + (ca65-mode . [(20210218 106) ((emacs (26 1))) "Major mode for ca65 assembly files" tar ((:url . "https://github.com/wendelscardua/ca65-mode") (:commit . "590d90cc0e1c1864dd7ce03df99b741ba866d52a") (:revdesc . "590d90cc0e1c") (:keywords "languages" "assembly" "ca65" "6502") (:authors ("Wendel Scardua" . "wendel@scardua.net")) (:maintainers ("Wendel Scardua" . "wendel@scardua.net")) (:maintainer "Wendel Scardua" . "wendel@scardua.net"))]) + (cabal-mode . [(20251119 1602) ((emacs (24 4))) "Support for Cabal packages" tar ((:url . "https://github.com/webdevred/cabal-mode") (:commit . "14183916674121ce49bff129c5c1f4f49092ee2c") (:revdesc . "141839166741") (:authors ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:maintainers ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (cabledolphin . [(20160204 938) ((emacs (24 4)) (seq (1 0))) "Capture Emacs network traffic" tar ((:url . "https://github.com/legoscia/cabledolphin") (:commit . "fffc192cafa61558e924323d6da8166fe5f2a6f9") (:revdesc . "fffc192cafa6") (:keywords "comm") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainers ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com"))]) + (cacao-theme . [(20251104 2135) ((emacs (24 1))) "Theme basd on a color-inverted image" tar ((:url . "https://github.com/Michael-Garibaldi/cacao-theme") (:commit . "72c1cff056fcfbada298d32811b14988dff1cf6d") (:revdesc . "72c1cff056fc"))]) + (cache . [(20111019 2300) nil "Implementation of a hash table whose key-value pairs expire" tar ((:url . "https://github.com/nflath/cache") (:commit . "7499586b6c8224df9f5c5bc4dec96b008258d580") (:revdesc . "7499586b6c82"))]) + (cacoo . [(20120319 2359) ((concurrent (0 3 1))) "Minor mode for Cacoo : http://cacoo.com" tar ((:url . "https://github.com/kiwanami/emacs-cacoo/") (:commit . "c9fa04fbe97639b24698709530361c2bb5f3273c") (:revdesc . "c9fa04fbe976") (:keywords "convenience" "diagram") (:authors ("SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net"))]) + (caddyfile-mode . [(20220626 945) ((emacs (25)) (loop (1 3))) "Major mode for Caddy configuration files" tar ((:url . "https://github.com/Schnouki/caddyfile-mode/") (:commit . "fc41148f5a7eb320f070666f046fb9d88cf17680") (:revdesc . "fc41148f5a7e") (:keywords "languages") (:authors ("Thomas Jost" . "schnouki@schnouki.net")) (:maintainers ("Thomas Jost" . "schnouki@schnouki.net")) (:maintainer "Thomas Jost" . "schnouki@schnouki.net"))]) + (cake-inflector . [(20140415 858) ((s (1 9 0))) "Lazy porting CakePHP infrector.php to el" tar ((:url . "https://github.com/k1LoW/emacs-cake-inflector") (:commit . "d9c6298fbca53efeb6f0f37140395659d9a6d7cc") (:revdesc . "d9c6298fbca5") (:authors (nil . "k1low[at]101000lab[dot]org")) (:maintainers (nil . "k1low[at]101000lab[dot]org")) (:maintainer nil . "k1low[at]101000lab[dot]org"))]) + (cakecrumbs . [(20180929 139) ((emacs (24 4))) "Show parents on header for HTML/Jade/Sass/Stylus" tar ((:url . "https://github.com/kuanyui/cakecrumbs.el") (:commit . "cf8c1df885eee004602f73c4f841301e200e5850") (:revdesc . "cf8c1df885ee") (:keywords "languages" "html" "jade" "pug" "sass" "scss" "stylus") (:authors ("ono hiroko" . "kuanyui.github.io")) (:maintainers ("ono hiroko" . "kuanyui.github.io")) (:maintainer "ono hiroko" . "kuanyui.github.io"))]) + (cal-china-x . [(20200924 1837) ((cl-lib (0 5))) "Chinese localization, lunar/horoscope/zodiac info and more.." tar ((:url . "https://github.com/xwl/cal-china-x") (:commit . "94005e678a1d2522b7a00299779f40c5c77286b8") (:revdesc . "94005e678a1d") (:authors ("William Xu" . "william.xwl@gmail.com")) (:maintainers ("William Xu" . "william.xwl@gmail.com")) (:maintainer "William Xu" . "william.xwl@gmail.com"))]) + (calc-at-point . [(20210219 1252) ((emacs (26)) (dash (2 18 0))) "Perform calculations at point or over selection" tar ((:url . "https://github.com/walseb/calc-at-point") (:commit . "0c1a9e94b519b0edb0abcbacdf6101eea2f2a524") (:revdesc . "0c1a9e94b519") (:keywords "convenience") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com"))]) + (calc-prog-utils . [(20220820 1855) ((emacs (24 1))) "Calc programmers utilities" tar ((:url . "https://github.com/Jesse-Millwood/calc-prog") (:commit . "190acfda56660a2d75df2d9eac5b14edaccccd80") (:revdesc . "190acfda5666") (:keywords "tools" "convenience"))]) + (calctape . [(20251016 857) ((emacs (29 1))) "Adding-machine, tape calculator, column sum-mer" tar ((:url . "https://github.com/Boruch-Baum/emacs-calctape") (:commit . "4fe05aa8d0071c7e057cec9985dd5bab65c3380c") (:revdesc . "4fe05aa8d007") (:keywords "convenience" "data") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainers ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com"))]) + (calendar-norway . [(20220211 1129) nil "Norwegian calendar" tar ((:url . "https://github.com/unhammer/calendar-norway.el") (:commit . "0db0ea63365f4ff5f7d18fb8335fa88af194a2cc") (:revdesc . "0db0ea63365f") (:keywords "calendar" "norwegian" "localization") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (calfw . [(20251031 1110) ((emacs (28 1))) "Calendar view framework" tar ((:url . "https://github.com/haji-ali/emacs-calfw") (:commit . "36846cdca91794cf38fa171d5a3ac291d3ebc060") (:revdesc . "36846cdca917") (:keywords "calendar") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.aliatgmail.com"))]) + (calfw-cal . [(20251030 845) ((emacs (28 1)) (calfw (2 0))) "Calendar view for diary" tar ((:url . "https://github.com/haji-ali/emacs-calfw") (:commit . "57be107b20625c13ed010cb0f70a603a61d47629") (:revdesc . "57be107b2062") (:keywords "calendar" "org") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.aliatgmail.com"))]) + (calfw-gcal . [(20120111 1000) nil "Edit Google calendar for calfw.el" tar ((:url . "https://github.com/myuhe/calfw-gcal.el") (:commit . "14aab20687d6cc9e6c5ddb9e11984c4e14c3d870") (:revdesc . "14aab20687d6") (:keywords "convenience" "calendar" "calfw.el") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (calfw-howm . [(20251030 1600) ((emacs (28 1)) (calfw (2 0)) (howm (1 5 0))) "Calendar view for howm" tar ((:url . "https://github.com/haji-ali/emacs-calfw") (:commit . "c34b6afaee33392e0bcd18441588e9a502f368eb") (:revdesc . "c34b6afaee33") (:keywords "calendar") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.aliatgmail.com"))]) + (calfw-ical . [(20251030 845) ((emacs (28 1)) (calfw (2 0))) "Calendar view for ical format" tar ((:url . "https://github.com/haji-ali/emacs-calfw") (:commit . "57be107b20625c13ed010cb0f70a603a61d47629") (:revdesc . "57be107b2062") (:keywords "calendar" "ical") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.aliatgmail.com"))]) + (calfw-org . [(20251030 845) ((emacs (28 1)) (calfw (2 0)) (org (9 7))) "Calendar view for org-agenda" tar ((:url . "https://github.com/haji-ali/emacs-calfw") (:commit . "57be107b20625c13ed010cb0f70a603a61d47629") (:revdesc . "57be107b2062") (:keywords "calendar" "org") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.aliatgmail.com"))]) + (calibredb . [(20250913 1233) ((emacs (29 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 ((:url . "https://github.com/chenyanming/calibredb.el") (:commit . "99a234167a092bc0017d11c814f0b8c0da53a107") (:revdesc . "99a234167a09") (:keywords "tools") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainers ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com"))]) + (call-graph . [(20251226 1055) ((emacs (28 1)) (tree-mode (1 0 0)) (ivy (0 10 0)) (beacon (1 3 4))) "Generate call graph for c/c++ functions" tar ((:url . "https://github.com/beacoder/call-graph") (:commit . "8e2bd21b31fbd8f774df1d03204efba95112262b") (:revdesc . "8e2bd21b31fb") (:keywords "programming" "convenience") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com"))]) + (calle24 . [(20251111 1755) ((emacs (29 1))) "Emacs Toolbar Support for SF Symbols" tar ((:url . "https://github.com/kickingvegas/calle24") (:commit . "a0b3ff3333fcc44f332ea0e3e04d0392bec2991e") (:revdesc . "a0b3ff3333fc") (:keywords "tools") (:authors ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainers ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainer "Charles Choi" . "kickingvegas@gmail.com"))]) + (calmer-forest-theme . [(20230302 2149) nil "Darkish theme with green/orange tint" tar ((:url . "https://github.com/caldwell/calmer-forest-theme") (:commit . "09fc50730ea386d3589863f8809e02e5bdd459cf") (:revdesc . "09fc50730ea3") (:authors ("David Caldwell" . "david@porkrind.org")) (:maintainers ("David Caldwell" . "david@porkrind.org")) (:maintainer "David Caldwell" . "david@porkrind.org"))]) + (camcorder . [(20190317 2138) ((emacs (24)) (names (20150000)) (cl-lib (0 5))) "Record screencasts in gif or other formats" tar ((:url . "http://github.com/Bruce-Connor/camcorder.el") (:commit . "b11ca61491a27681bb3131b72b51c105fd996bed") (:revdesc . "b11ca61491a2") (:keywords "multimedia" "screencast") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (caml . [(20250227 1734) ((emacs (24 4))) "Caml mode for GNU Emacs" tar ((:url . "https://github.com/ocaml/caml-mode") (:commit . "744333dc4c4bd8b93e037efa8f7362b0903b96a2") (:revdesc . "744333dc4c4b") (:keywords "ocaml") (: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"))]) + (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 ((:url . "https://github.com/kisaragi-hiu/cangjie.el") (:commit . "d6882e15f47fdde37e9f739dde604d77d25f11db") (:revdesc . "d6882e15f47f") (:keywords "convenience" "writing"))]) + (cape . [(20251224 1110) ((emacs (29 1)) (compat (30))) "Completion At Point Extensions" tar ((:url . "https://github.com/minad/cape") (:commit . "c675d8c142fc3265e3123e5e492b48e748846577") (:revdesc . "c675d8c142fc") (:keywords "abbrev" "convenience" "matching" "completion" "text") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (capnp-mode . [(20210707 2310) nil "Major mode for editing Capn' Proto Files" tar ((:url . "https://github.com/capnproto/capnproto") (:commit . "f7fccad7d737f77896211bec1173117497634143") (:revdesc . "f7fccad7d737") (:authors ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainers ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainer "Brian Taylor" . "el.wubo@gmail.com"))]) + (capture . [(20130828 1644) nil "Screencasting with \"avconv\" or \"ffmpeg\"" tar ((:url . "https://github.com/pashinin/capture.el") (:commit . "9140c207b48b3520a2f06674b3e1bee2fc92b80c") (:revdesc . "9140c207b48b") (:authors ("Sergey Pashinin" . "sergeyatpashinindotcom")) (:maintainers ("Sergey Pashinin" . "sergeyatpashinindotcom")) (:maintainer "Sergey Pashinin" . "sergeyatpashinindotcom"))]) + (carbon-now-sh . [(20220701 332) ((emacs (24 4))) "Https://carbon.now.sh integration" tar ((:url . "https://github.com/veelenga/carbon-now-sh.el") (:commit . "e66f2e43e288f35ad9075f5fc84d59ad348efc88") (:revdesc . "e66f2e43e288") (:keywords "convenience"))]) + (cargo . [(20231229 915) ((emacs (24 3)) (markdown-mode (2 4))) "Emacs Minor Mode for Cargo, Rust's Package Manager" tar ((:url . "https://github.com/kwrooijen/cargo.el") (:commit . "7f8466063381eed05d4e222ce822b1dd44e3bf17") (:revdesc . "7f8466063381") (:keywords "tools"))]) + (cargo-mode . [(20250529 1140) ((emacs (25 1))) "Cargo Major Mode. Cargo is the Rust package manager" tar ((:url . "https://github.com/ayrat555/cargo-mode") (:commit . "b1fb87c17fcd22d798bb04115e65ecf83e8c929a") (:revdesc . "b1fb87c17fcd") (:keywords "tools") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainers ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com"))]) + (cargo-transient . [(20241204 1217) ((emacs (28 1))) "A transient UI for Cargo, Rust's package manager" tar ((:url . "https://github.com/peterstuart/cargo-transient") (:commit . "b75511f911189b6b6c47976dd970eeb80ccfb3ee") (:revdesc . "b75511f91118") (:authors ("Peter Stuart" . "peter@peterstuart.org")) (:maintainers ("Peter Stuart" . "peter@peterstuart.org")) (:maintainer "Peter Stuart" . "peter@peterstuart.org"))]) + (caroline-theme . [(20160318 520) ((emacs (24))) "A trip down to New Orleans.." tar ((:url . "https://github.com/xjackk/carolines-theme") (:commit . "222fd483db304509f9e422dc82883d808e023ceb") (:revdesc . "222fd483db30") (:authors ("Jack Killilea" . "jaaacckz1@gmail.com")) (:maintainers ("Jack Killilea" . "jaaacckz1@gmail.com")) (:maintainer "Jack Killilea" . "jaaacckz1@gmail.com"))]) + (cascading-dir-locals . [(20211013 1955) ((emacs (26 1))) "Apply all (!) .dir-locals.el from root to current directory" tar ((:url . "https://github.com/fritzgrabo/cascading-dir-locals") (:commit . "345d4b70e837d45ee84014684127e7399932d5e6") (:revdesc . "345d4b70e837") (:keywords "convenience") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (caseformat . [(20160115 1615) ((emacs (24)) (cl-lib (0 5)) (dash (2 12 1)) (s (1 10 0))) "Format based letter case converter" tar ((:url . "https://github.com/HKey/caseformat") (:commit . "e4961889309408b3425da9b69c16ddfadd17a674") (:revdesc . "e49618893094") (:keywords "convenience") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com"))]) + (caser . [(20241003 131) ((emacs (29 1))) "Change text casing from camelCase to UpperCamelCase to dash-case to snake_case" tar ((:url . "https://hg.sr.ht/~zck/caser.el") (:commit . "6ed8fe13ff6a4c39a831cf51b031a9e9fdcba5ff") (:revdesc . "6ed8fe13ff6a"))]) + (cask-mode . [(20160410 1449) ((emacs (24 3))) "Major mode for editing Cask files" tar ((:url . "https://github.com/Wilfred/cask-mode") (:commit . "c97755267b7215f02df7b0c16b4210c04aee6566") (:revdesc . "c97755267b72") (: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 ((:url . "http://github.com/AdrieanKhisbe/cask-package-toolset.el") (:commit . "2c74cd827e88c7f8360581a841e45f0b794510e7") (:revdesc . "2c74cd827e88") (:keywords "convenience" "tools") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr"))]) + (caskxy . [(20140513 1539) ((log4e (0 2 0)) (yaxception (0 1))) "Control Cask in Emacs" tar ((:url . "https://github.com/aki2o/caskxy") (:commit . "279f3ab79bd77fe69cb3148a79896b9bf118a9b3") (:revdesc . "279f3ab79bd7") (:keywords "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (casual . [(20251202 2123) ((emacs (29 1)) (transient (0 9 0)) (csv-mode (1 27))) "Transient user interfaces for various modes" tar ((:url . "https://github.com/kickingvegas/casual") (:commit . "f38fb5e5d850d96d57559526bff973f41cf73940") (:revdesc . "f38fb5e5d850") (:keywords "tools" "wp") (:authors ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainers ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainer "Charles Choi" . "kickingvegas@gmail.com"))]) + (casual-avy . [(20250830 2115) ((emacs (29 1)) (avy (0 5 0)) (casual (2 0 0))) "Transient UI for Avy" tar ((:url . "https://github.com/kickingvegas/casual-avy") (:commit . "c5bc8e9d57a843f75e6125f097550414af3d5ec7") (:revdesc . "c5bc8e9d57a8") (:keywords "tools") (:authors ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainers ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainer "Charles Choi" . "kickingvegas@gmail.com"))]) + (casual-suite . [(20241022 3) ((emacs (29 1)) (casual (2 0 0)) (casual-avy (2 0 0)) (casual-symbol-overlay (2 0 0))) "A suite of opinionated Transient UIs" tar ((:url . "https://github.com/kickingvegas/casual-suite") (:commit . "c590e78d756bc6b3d43ab5cf8618e41b2a5bc88b") (:revdesc . "c590e78d756b") (:keywords "tools") (:authors ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainers ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainer "Charles Choi" . "kickingvegas@gmail.com"))]) + (casual-symbol-overlay . [(20241021 2358) ((emacs (29 1)) (casual (2 0 0)) (symbol-overlay (4 2))) "Transient UI for Symbol Overlay" tar ((:url . "https://github.com/kickingvegas/casual-symbol-overlay") (:commit . "1453e7486dd0921f0319f21dd8c8b603e4eb7300") (:revdesc . "1453e7486dd0") (:keywords "tools") (:authors ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainers ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainer "Charles Choi" . "kickingvegas@gmail.com"))]) + (catmacs . [(20170826 1157) ((emacs (24))) "Simple CAT interface for Yaesu Transceivers" tar ((:url . "https://bitbucket.org/pymaximus/catmacs") (:commit . "6ea9ee195661fe95355413856476c45dcc8e24e8") (:revdesc . "6ea9ee195661") (:keywords "comm" "hardware") (:authors ("Frank Singleton" . "b17flyboy@gmail.com")) (:maintainers ("Frank Singleton" . "b17flyboy@gmail.com")) (:maintainer "Frank Singleton" . "b17flyboy@gmail.com"))]) + (catppuccin-theme . [(20250910 2247) ((emacs (27 1))) "Catppuccin for Emacs - 🍄 Soothing pastel theme for Emacs" tar ((:url . "https://github.com/catppuccin/emacs") (:commit . "09b9b785014e74f8e2ba24f29f806f1c0a65ad54") (:revdesc . "09b9b785014e") (:maintainers ("Jeremy Baxter" . "jeremy@baxters.nz")) (:maintainer "Jeremy Baxter" . "jeremy@baxters.nz"))]) + (cats . [(20230407 1316) ((emacs (26 1))) "Monads for Elisp" tar ((:url . "https://github.com/Fuco1/emacs-cats") (:commit . "7fc70db0eeb2c33ffba5c13c4cdc0f31c7b95537") (:revdesc . "7fc70db0eeb2") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (cbm . [(20171116 1240) ((cl-lib (0 5))) "Switch to similar buffers" tar ((:url . "http://github.com/akermu/cbm.el") (:commit . "5b41c936ba9f6d170309a85ffebc9939c1050b31") (:revdesc . "5b41c936ba9f") (:keywords "buffers") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainers ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org"))]) + (cbor . [(20230810 1653) ((emacs (25 1))) "CBOR utilities" tar ((:url . "https://github.com/Titan-C/cardano.el") (:commit . "ba624ad3f8b726bee1d8dcb0a2a9e2b658bb4c9b") (:revdesc . "ba624ad3f8b7") (:authors ("Oscar Najera" . "https://oscarnajera.com")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com"))]) + (cc-cedict . [(20241221 1256) ((emacs (26 1))) "Interface to CC-CEDICT (a Chinese-English dictionary)" tar ((:url . "https://github.com/xuchunyang/cc-cedict.el") (:commit . "4b30010f98b34c7e1b3a3c327f9be0851ef83641") (:revdesc . "4b30010f98b3"))]) + (ccc . [(20210501 820) nil "Buffer local cursor color control library" tar ((:url . "https://github.com/skk-dev/ddskk") (:commit . "36fb9f7e527f975d333887fd0cca4d611ae1ab23") (:revdesc . "36fb9f7e527f") (:keywords "cursor") (:authors ("Masatake YAMATO" . "masata-y@is.aist-nara.ac.jp")))]) + (ccls . [(20250825 531) ((emacs (28 1)) (lsp-mode (6 3 1)) (dash (2 14 1))) "Ccls client for lsp-mode" tar ((:url . "https://github.com/emacs-lsp/emacs-ccls") (:commit . "80981d751198b59a7960a5437cb42a4d9974f254") (:revdesc . "80981d751198") (:keywords "languages" "lsp" "c++"))]) + (cd-compile . [(20141108 1957) nil "Run compile in a specific directory" tar ((:url . "https://github.com/jamienicol/emacs-cd-compile") (:commit . "10284ccae86afda4a37b09ba90acd1e2efedec9f") (:revdesc . "10284ccae86a") (: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 ((:url . "https://github.com/skk-dev/ddskk") (:commit . "3820fa6bb0d53132aafb611a643c1e41e444052b") (:revdesc . "3820fa6bb0d5") (:keywords "cdb") (:authors ("Yusuke Shinyama" . "yusukeatcs.nyu.edu")))]) + (cdlatex . [(20241007 1623) nil "Fast input methods for LaTeX environments and math" tar ((:url . "https://github.com/cdominik/cdlatex") (:commit . "fac070f0164ac9f5859cb4cccba7d29a65c337f3") (:revdesc . "fac070f0164a") (:keywords "tex") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainers ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com"))]) + (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 ((:url . "https://github.com/yasuyk/cdnjs.el") (:commit . "ce19880d3ec3d81e6c665d0b1dfea99cc7a3f908") (:revdesc . "ce19880d3ec3") (:keywords "tools") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))]) + (cedit . [(20200816 526) nil "Paredit-like commands for c-like languages" tar ((:url . "http://zk-phi.gitub.io/") (:commit . "cb38316903e6cfa8b8c978defa7e1dafcd4e0c12") (:revdesc . "cb38316903e6"))]) + (celery . [(20250221 1903) ((emacs (24)) (dash (2 18 0)) (s (1 9 0)) (deferred (0 3 2))) "A minor mode to draw stats from celery and more?" tar ((:url . "https://github.com/ardumont/emacs-celery") (:commit . "c689a47176d09a99382a4daecbe42ded94d4d649") (:revdesc . "c689a47176d0") (:keywords "celery" "convenience") (:authors ("ardumont" . "eniotna.t@gmail.com")) (:maintainers ("ardumont" . "eniotna.t@gmail.com")) (:maintainer "ardumont" . "eniotna.t@gmail.com"))]) + (celestial-mode-line . [(20230323 737) ((emacs (24))) "Show lunar phase and sunrise/-set time in modeline" tar ((:url . "https://github.com/ecraven/celestial-mode-line") (:commit . "90056322d6664e2e2b593912e4d5e68f1468cafc") (:revdesc . "90056322d666") (:keywords "extensions") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net"))]) + (centaur-tabs . [(20241215 1321) ((emacs (27 1)) (powerline (2 4))) "Aesthetic, modern looking customizable tabs plugin" tar ((:url . "https://github.com/ema2159/centaur-tabs") (:commit . "35389777bc7c4972e302d3793e1a5250f501404d") (:revdesc . "35389777bc7c") (:keywords "frames") (:authors ("Emmanuel Bustos" . "ema2159@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (centered-cursor-mode . [(20230914 1358) nil "Cursor stays vertically centered" tar ((:url . "https://github.com/andre-r/centered-cursor-mode.el") (:commit . "67ef719e685407dbc455c7430765e4e685fd95a9") (:revdesc . "67ef719e6854") (:keywords "convenience") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainers ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de"))]) + (centered-window . [(20250921 2101) ((emacs (24 4))) "Center the text when there's only one window" tar ((:url . "https://github.com/nullvec/centered-window-mode") (:commit . "701f56cd1d2b68352d29914f05ca1b0037bb2595") (:revdesc . "701f56cd1d2b") (:keywords "faces" "windows") (:authors ("A. Hdez" . "trefoil_chilled_7k@icloud.com")) (:maintainers ("A. Hdez" . "trefoil_chilled_7k@icloud.com")) (:maintainer "A. Hdez" . "trefoil_chilled_7k@icloud.com"))]) + (centimacro . [(20201225 1132) nil "Assign multiple macros as global key bindings" tar ((:url . "https://github.com/abo-abo/centimacro") (:commit . "0149877584b333c4f1953f0767f0cae23881b0df") (:revdesc . "0149877584b3") (:keywords "macros") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (cerbere . [(20181113 1641) ((pkg-info (0 5))) "Unit testing in Emacs for several programming languages" tar ((:url . "https://github.com/nlamirault/cerbere") (:commit . "bb18d932b16541105d41a668dbf6fc4e833a6dc2") (:revdesc . "bb18d932b165") (:keywords "python" "go" "php" "phpunit" "elisp" "ert" "tests" "tdd") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (cern-ldap . [(20230626 1158) ((emacs (27 1))) "Library to interact with CERN's LDAP servers" tar ((:url . "https://git.sr.ht/~nbarrientos/cern-ldap.el") (:commit . "70b5275f0e7b8e15a3def48281f364a32c55afce") (:revdesc . "70b5275f0e7b") (:keywords "tools" "convenience") (:authors ("Nacho Barrientos" . "nacho.barrientos@cern.ch")) (:maintainers ("Nacho Barrientos" . "nacho.barrientos@cern.ch")) (:maintainer "Nacho Barrientos" . "nacho.barrientos@cern.ch"))]) + (cern-root-mode . [(20240411 1355) ((emacs (26 1))) "Major-mode for running C++ code with ROOT" tar ((:url . "https://github.com/jaypmorgan/cern-root-mode") (:commit . "d769530ddfbe57cc3c319b430c8a37c72c8ce52c") (:revdesc . "d769530ddfbe") (:keywords "languages" "tools") (:authors ("Jay Morgan" . "jay@morganwastaken.com")) (:maintainers ("Jay Morgan" . "jay@morganwastaken.com")) (:maintainer "Jay Morgan" . "jay@morganwastaken.com"))]) + (cfengine-code-style . [(20171111 1027) nil "C code style for CFEngine project" tar ((:url . "https://github.com/cfengine/core") (:commit . "92a25872a6d1de00c5bfc2b9455ccb0082bf6569") (:revdesc . "92a25872a6d1") (:authors ("Mikhail Gusarov" . "mikhail.gusarov@cfengine.com")) (:maintainers ("Mikhail Gusarov" . "mikhail.gusarov@cfengine.com")) (:maintainer "Mikhail Gusarov" . "mikhail.gusarov@cfengine.com"))]) + (cff . [(20250209 2316) ((cl-lib (0 5)) (emacs (24))) "Search of the C/C++ file header by the source and vice versa" tar ((:url . "https://codeberg.org/fourier/cff") (:commit . "ebb2c9c24cae43283221219e95dac0ab43925a0f") (:revdesc . "ebb2c9c24cae") (:keywords "find-file") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainers ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com"))]) + (cfml-mode . [(20190617 1130) ((emacs (25))) "Emacs mode for editing CFML files" tar ((:url . "https://github.com/am2605/cfml-mode") (:commit . "b06d7cee2af0ed5d55a94f0db80fc1f429a1829a") (:revdesc . "b06d7cee2af0") (:authors ("Andrew Myers" . "am2605@gmail.com")) (:maintainers ("Andrew Myers" . "am2605@gmail.com")) (:maintainer "Andrew Myers" . "am2605@gmail.com"))]) + (cfn-mode . [(20251221 906) ((emacs (27 0)) (f (0 20 0)) (s (1 12 0)) (yaml-mode (0 0 13))) "AWS cloudformation mode" tar ((:url . "https://gitlab.com/worr/cfn-mode") (:commit . "86f2e7cdf4e49585bd1ff596e2170013f2deabf2") (:revdesc . "86f2e7cdf4e4") (:keywords "convenience" "languages" "tools") (:authors ("William Orr" . "will@worrbase.com")) (:maintainers ("William Orr" . "will@worrbase.com")) (:maintainer "William Orr" . "will@worrbase.com"))]) + (cframe . [(20250126 1800) ((emacs (26)) (buffer-manage (1 1)) (dash (2 17 0))) "Customize a frame and fast switch size and positions" tar ((:url . "https://github.com/plandes/cframe") (:commit . "c968e4d9fd6079e60ae90531dac4647a66d7d2b7") (:revdesc . "c968e4d9fd60") (:keywords "frames"))]) + (cfrs . [(20250729 1422) ((emacs (26 1)) (dash (2 11 0)) (s (1 10 0)) (posframe (0 6 0))) "Child-frame based read-string" tar ((:url . "https://github.com/Alexander-Miller/cfrs") (:commit . "981bddb3fb9fd9c58aed182e352975bd10ad74c8") (:revdesc . "981bddb3fb9f") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (cg . [(20250430 1005) ((emacs (26 1))) "Major mode for editing Constraint Grammar files" tar ((:url . "https://edu.visl.dk/constraint_grammar.html") (:commit . "8ab7e26352c615326d74feeec71f531fc7a8855d") (:revdesc . "8ab7e26352c6") (:keywords "languages") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (challenger-deep-theme . [(20240913 937) ((emacs (24))) "Challenger-deep Theme" tar ((:url . "https://github.com/challenger-deep-theme/emacs") (:commit . "8f688eda0d9b138e41e21d2ca246c89c3547002f") (:revdesc . "8f688eda0d9b"))]) + (champagne . [(20240515 310) ((emacs (28 1)) (posframe (1 4 2))) "Graphical countdowns" tar ((:url . "http://github.com/positron-solutions/champagne") (:commit . "42ef0451e4abe800f047583c4c3b04e51b29d5ee") (:revdesc . "42ef0451e4ab") (:keywords "games") (:authors ("Psionic K" . "contact@positron.solutions")) (:maintainers ("Psionic K" . "contact@positron.solutions")) (:maintainer "Psionic K" . "contact@positron.solutions"))]) + (change-inner . [(20250320 1600) ((expand-region (0 7))) "Change contents based on semantic units" tar ((:url . "https://github.com/magnars/change-inner.el") (:commit . "675056ff78aa5dc32286e56dd0008d0683ddfc79") (:revdesc . "675056ff78aa") (:keywords "convenience" "extensions") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (chaos-mode . [(20221227 223) ((emacs (24 3))) "A major mode for the Chaos programming language" tar ((:url . "https://github.com/thechampagne/chaos-mode") (:commit . "801d869c461166eb2face2554b9b7883a26374c6") (:revdesc . "801d869c4611") (:keywords "files" "chaos"))]) + (chapel-mode . [(20210513 457) ((emacs (25 1)) (hydra (0 15 0))) "A major mode for the Chapel programming language" tar ((:url . "https://github.com/damon-kwok/chapel-mode") (:commit . "39fd24bb7cf44808200354ac0496be4fc4fddd9a") (:revdesc . "39fd24bb7cf4") (:keywords "chapel" "chpl" "programming" "languages"))]) + (char-menu . [(20210321 1657) ((emacs (24 3)) (avy-menu (0 1))) "Create your own menu for fast insertion of arbitrary symbols" tar ((:url . "https://github.com/mrkkrp/char-menu") (:commit . "d77c4d64fc8acc386a0fb9727d346c838e75f011") (:revdesc . "d77c4d64fc8a") (:keywords "convenience" "editing") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (charmap . [(20200616 1418) nil "Unicode table for Emacs" tar ((:url . "https://github.com/lateau/charmap") (:commit . "feac50b87d2a596c5e5b7b82b79ddd65b6dedd8c") (:revdesc . "feac50b87d2a") (:keywords "unicode" "character" "ucs") (:authors ("Anan Mikami" . "lateau@gmail.com")) (:maintainers ("Anan Mikami" . "lateau@gmail.com")) (:maintainer "Anan Mikami" . "lateau@gmail.com"))]) + (chatgpt-shell . [(20251217 1818) ((emacs (28 1)) (shell-maker (0 82 3)) (transient (0 9 3))) "A family of utilities to interact with LLMs (ChatGPT, Claude, DeepSeek, Gemini, Kagi, Ollama, Perplexity)" tar ((:url . "https://github.com/xenodium/chatgpt-shell") (:commit . "e240b1a9004c1452b8bcb5279b4fa79d9f60def7") (:revdesc . "e240b1a9004c"))]) + (chatu . [(20251113 2350) ((org (9 6 6)) (emacs (29 1)) (plantuml-mode (1 2 9))) "Convert and insert any images to org-mode or markdown buffer" tar ((:url . "https://github.com/kimim/chatu") (:commit . "54fde21a03de78fc234ff3ce25a84fc4833adbca") (:revdesc . "54fde21a03de") (:keywords "multimedia" "convenience") (:authors ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainers ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainer "Kimi Ma" . "kimi.im@outlook.com"))]) + (chatwork . [(20240910 1531) nil "ChatWork client for Emacs" tar ((:url . "https://github.com/ataka/chatwork") (:commit . "5abbf07bd6063c922191cc645f5771a943e3043c") (:revdesc . "5abbf07bd606") (:keywords "web") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainers ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com"))]) + (cheat-sh . [(20210607 1307) ((emacs (25 1))) "Interact with cheat.sh" tar ((:url . "https://github.com/davep/cheat-sh.el") (:commit . "33bae22feae8d3375739c6bdef08d0dcdf47ee42") (:revdesc . "33bae22feae8") (:keywords "docs" "help") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (cheatsheet . [(20170126 2150) ((emacs (24)) (cl-lib (0 5))) "Create your own cheatsheet" tar ((:url . "http://github.com/darksmile/cheatsheet/") (:commit . "e4f8e0110167ea16a17a74517d1f10cb7ff805b8") (:revdesc . "e4f8e0110167") (:keywords "convenience" "usability") (:authors ("Shirin Nikita and contributors" . "shirin.nikita@gmail.com")) (:maintainers ("Shirin Nikita and contributors" . "shirin.nikita@gmail.com")) (:maintainer "Shirin Nikita and contributors" . "shirin.nikita@gmail.com"))]) + (checkbox . [(20141117 58) ((emacs (24)) (cl-lib (0 5))) "Quick manipulation of textual checkboxes" tar ((:url . "http://github.com/camdez/checkbox.el") (:commit . "2afc2011fa35ccfa0ce9ef46cb1896911fa340d1") (:revdesc . "2afc2011fa35") (:keywords "convenience") (:authors ("Cameron Desautels" . "camdez@gmail.com")) (:maintainers ("Cameron Desautels" . "camdez@gmail.com")) (:maintainer "Cameron Desautels" . "camdez@gmail.com"))]) + (chee . [(20171123 2233) ((dash (2 12 1)) (s (1 10 0)) (f (0 18 2))) "Interface to chee using dired and image-dired" tar ((:url . "https://github.com/eikek/chee/tree/release/0.3.0/emacs") (:commit . "669ff9ee429f24c3c2d03b83d9cb9aec5f86bb8b") (:revdesc . "669ff9ee429f"))]) + (cheerilee . [(20160313 1835) ((xelb (0 1))) "Toolkit library" tar ((:url . "https://github.com/Vannil/cheerilee.el") (:commit . "41bd81b5b0bb657241ceda5be6af5e07254d7376") (:revdesc . "41bd81b5b0bb") (:keywords "multimedia" "tools") (:authors ("Alessio Vanni" . "vannilla@firemail.cc")) (:maintainers ("Alessio Vanni" . "vannilla@firemail.cc")) (:maintainer "Alessio Vanni" . "vannilla@firemail.cc"))]) + (chef-mode . [(20180628 1453) nil "Minor mode for editing an opscode chef repository" tar ((:url . "https://github.com/mpasternacki/chef-mode") (:commit . "048d691cb63981ae235763d4a6ced4af5c729924") (:revdesc . "048d691cb639") (:keywords "chef" "knife") (:authors ("Maciej Pasternacki" . "maciej@pasternacki.net")) (:maintainers ("Maciej Pasternacki" . "maciej@pasternacki.net")) (:maintainer "Maciej Pasternacki" . "maciej@pasternacki.net"))]) + (chembalance . [(20210601 1653) ((emacs (24 4))) "Balance chemical equations" tar ((:url . "https://github.com/sergiruiztrepat/chembalance") (:commit . "ae36c823ca151f1dc6144ec96b2f5e98181c0dbb") (:revdesc . "ae36c823ca15") (:keywords "convenience" "chemistry"))]) + (chemtable . [(20230314 1825) ((emacs (24 1))) "Periodic table of the elements" tar ((:url . "https://github.com/sergiruiztrepat/chemtable") (:commit . "ca0fea2f28162e90a93be242279ec6aee9046475") (:revdesc . "ca0fea2f2816") (:keywords "convenience" "chemistry"))]) + (cherry-blossom-theme . [(20150622 342) ((emacs (24 0))) "A soothing color theme for Emacs24" tar ((:url . "https://github.com/inlinestyle/emacs-cherry-blossom-theme") (:commit . "e5ea23694c0f20ab670c0aa87214c27f2232d922") (:revdesc . "e5ea23694c0f") (:authors ("Ben Yelsey" . "byelsey1@gmail.com")) (:maintainers ("Ben Yelsey" . "byelsey1@gmail.com")) (:maintainer "Ben Yelsey" . "byelsey1@gmail.com"))]) + (chezmoi . [(20230726 1638) ((emacs (26 1))) "A package for interacting with chezmoi" tar ((:url . "http://www.github.com/tuh8888/chezmoi.el") (:commit . "1389782f8c0780c7e66f8e77b10345ba1f4eabae") (:revdesc . "1389782f8c07") (:keywords "vc"))]) + (chinese-conv . [(20170807 2128) ((cl-lib (0 5))) "Conversion between Chinese Characters with opencc or cconv" tar ((:url . "https://github.com/gucong/emacs-chinese-conv") (:commit . "b56815bbb163d642e97fa73093b5a7e87cc32574") (:revdesc . "b56815bbb163") (:authors ("gucong" . "gucong43216@gmail.com")) (:maintainers ("gucong" . "gucong43216@gmail.com")) (:maintainer "gucong" . "gucong43216@gmail.com"))]) + (chinese-number . [(20161008 509) nil "Convert numbers between Arabic and Chinese formats" tar ((:url . "https://github.com/zhcosin/chinese-number") (:commit . "1d0c440181848dfcd1d1e618b2650fb0562a32ac") (:revdesc . "1d0c44018184") (:authors ("zhcosin" . "zhcosin@163.com")) (:maintainers ("zhcosin" . "zhcosin@163.com")) (:maintainer "zhcosin" . "zhcosin@163.com"))]) + (chinese-wbim . [(20190727 854) nil "Enable Wubi Input Method in Emacs" tar ((:url . "https://github.com/andyque/chinese-wbim") (:commit . "5d496364b0b6bbaaf0f9b37e5a6d260d4994f260") (:revdesc . "5d496364b0b6") (:keywords "wubi" "input" "method.") (:authors ("Guanghui Qu" . "guanghui8827@gmail.com")) (:maintainers ("Guanghui Qu" . "guanghui8827@gmail.com")) (:maintainer "Guanghui Qu" . "guanghui8827@gmail.com"))]) + (chinese-word-at-point . [(20170811 941) ((cl-lib (0 5))) "Add `chinese-word' thing to `thing-at-point'" tar ((:url . "https://github.com/xuchunyang/chinese-word-at-point.el") (:commit . "8223d7439e005555b86995a005b225ae042f0538") (:revdesc . "8223d7439e00") (:keywords "convenience" "chinese") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com"))]) + (chinese-yasdcv . [(20171015 144) ((cl-lib (0 5)) (pyim (1 6 0))) "Yet another StarDict frontend" tar ((:url . "https://github.com/tumashu/chinese-yasdcv") (:commit . "5ab830daf1273d5a5cddcb94b56a9737f12d996f") (:revdesc . "5ab830daf127") (:keywords "convenience" "chinese" "dictionary") (:authors ("Feng Shu" . "tumashu@gmail.com")) (:maintainers ("Feng Shu" . "tumashu@gmail.com")) (:maintainer "Feng Shu" . "tumashu@gmail.com"))]) + (chip8 . [(20250405 1408) ((emacs (28 1))) "A CHIP-8 emulator" tar ((:url . "http://github.com/gabrielelana/chip8.el") (:commit . "e2d0131dc45e65151f9655833807fbe838267dbd") (:revdesc . "e2d0131dc45e") (:keywords "chip-8" "game" "games" "emulator") (:authors ("Gabriele Lana" . "gabriele.lana@gmail.com")) (:maintainers ("Gabriele Lana" . "gabriele.lana@gmail.com")) (:maintainer "Gabriele Lana" . "gabriele.lana@gmail.com"))]) + (chocolate-theme . [(20210128 1647) ((emacs (24 1)) (autothemer (0 2))) "A dark chocolaty theme" tar ((:url . "http://github.com/SavchenkoValeriy/emacs-chocolate-theme") (:commit . "ccc05f7ad96d3d1332727689bf6250443adc7ec0") (:revdesc . "ccc05f7ad96d"))]) + (choice-program . [(20250113 429) ((emacs (26)) (dash (2 17 0))) "Parameter based program" tar ((:url . "https://github.com/plandes/choice-program") (:commit . "09e5bf8fa73c22bc23b1afec35da6410d8b167bd") (:revdesc . "09e5bf8fa73c") (:keywords "execution" "processes" "unix" "lisp"))]) + (chordpro-mode . [(20250814 301) ((emacs (29 1)) (compat (29 1 4 1))) "Major mode for ChordPro lead sheet file format" tar ((:url . "https://git.sr.ht/~breatheoutbreathein/chordpro-mode.el/") (:commit . "ae6db74f2078e4ee3d6262ac1344df9c1ab87527") (:revdesc . "ae6db74f2078") (:keywords "convenience") (:authors ("Howard Ding" . "hading2@gmail.com")) (:maintainers ("Howard Ding" . "hading2@gmail.com")) (:maintainer "Howard Ding" . "hading2@gmail.com"))]) + (chroma . [(20240716 1131) ((emacs (24 1))) "Color manipulation library" tar ((:url . "https://github.com/galdor/chroma") (:commit . "89324b476498bdfc657079040cfbbe33d1da48a3") (:revdesc . "89324b476498") (:authors ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainers ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainer "Nicolas Martyanoff" . "nicolas@n16f.net"))]) + (chronometer . [(20190304 1528) ((emacs (24))) "A [not so] simple chronometer" tar ((:url . "https://github.com/marcelotoledo/chronometer") (:commit . "8457b296ef87be339cbe47730b922757d60bdcd5") (:revdesc . "8457b296ef87") (:keywords "tools" "convenience") (:authors ("Marcelo Toledo" . "marcelo@marcelotoledo.com")) (:maintainers ("Marcelo Toledo" . "marcelo@marcelotoledo.com")) (:maintainer "Marcelo Toledo" . "marcelo@marcelotoledo.com"))]) + (chronometrist . [(20240807 1850) ((emacs (27 1)) (dash (2 16 0)) (seq (2 20)) (ts (0 2))) "Friendly and powerful personal time tracker and analyzer" tar ((:url . "https://codeberg.org/contrapunctus/chronometrist") (:commit . "fdeeba0c0f23cd0ebfa76d5ec2bf4e5e93f87941") (:revdesc . "fdeeba0c0f23") (:keywords "calendar") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de"))]) + (chronometrist-goal . [(20210510 1831) ((emacs (25 1)) (alert (1 2)) (chronometrist (0 7 0))) "Adds support for time goals to Chronometrist" tar ((:url . "https://tildegit.org/contrapunctus/chronometrist-goal") (:commit . "6cb939d160f5d5966d7853aa23f3ed7c7ef9df44") (:revdesc . "6cb939d160f5") (:keywords "calendar") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabber.fr"))]) + (chronometrist-key-values . [(20220321 349) ((chronometrist (0 7 0))) "Add key-values to Chronometrist data" tar ((:url . "https://tildegit.org/contrapunctus/chronometrist") (:commit . "239f733dd8f784a5251ae253d350a99fb739da6e") (:revdesc . "239f733dd8f7") (:keywords "calendar") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de"))]) + (chronometrist-spark . [(20230629 1039) ((emacs (25 1)) (chronometrist (0 7 0)) (spark (0 1))) "Show sparklines in Chronometrist buffers" tar ((:url . "https://tildegit.org/contrapunctus/chronometrist") (:commit . "d8290a82ea65730413627325a705067269cfa2f1") (:revdesc . "d8290a82ea65") (:keywords "calendar") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de"))]) + (chronos . [(20240525 1339) ((emacs (27 1))) "Multiple simultaneous countdown / countup timers" tar ((:url . "http://github.com/DarkBuffalo/chronos") (:commit . "5ea0bf7c3881ea905e280446342539b242401979") (:revdesc . "5ea0bf7c3881") (:keywords "calendar") (:authors ("David Knight" . "dxknight@opmbx.org")) (:maintainers ("David Knight" . "dxknight@opmbx.org")) (:maintainer "David Knight" . "dxknight@opmbx.org"))]) + (chruby . [(20180114 1652) ((cl-lib (0 5))) "Emacs integration for chruby" tar ((:url . "https://github.com/plexus/chruby.el") (:commit . "42bc6d521f832eca8e2ba210f30d03ad5529788f") (:revdesc . "42bc6d521f83") (:keywords "languages") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net"))]) + (chyla-dark-theme . [(20240824 1615) ((emacs (24 1))) "Chyla.org - dark green color theme" tar ((:url . "https://github.com/chyla/ChylaDarkThemeForEmacs") (:commit . "274ff01146e265f773478b16a59483b638b986f8") (:revdesc . "274ff01146e2") (:authors ("Adam Chyła https://chyla.org/" . "adam@chyla.org")) (:maintainers ("Adam Chyła https://chyla.org/" . "adam@chyla.org")) (:maintainer "Adam Chyła https://chyla.org/" . "adam@chyla.org"))]) + (chyla-theme . [(20240708 2017) ((emacs (24 1))) "Chyla.org - green color theme" tar ((:url . "https://github.com/chyla/ChylaThemeForEmacs") (:commit . "c2bb425eaff0975e0c7081f282d291f7853f8376") (:revdesc . "c2bb425eaff0") (:authors ("Adam Chyła https://chyla.org/" . "adam@chyla.org")) (:maintainers ("Adam Chyła https://chyla.org/" . "adam@chyla.org")) (:maintainer "Adam Chyła https://chyla.org/" . "adam@chyla.org"))]) + (cider . [(20251224 2122) ((emacs (27)) (clojure-mode (5 19)) (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 ((:url . "https://www.github.com/clojure-emacs/cider") (:commit . "e10d11f2831a9f5b40b470774d2d71e88972cd65") (:revdesc . "e10d11f2831a") (:keywords "languages" "clojure" "cider") (: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"))]) + (cider-decompile . [(20151122 537) ((cider (0 3 0)) (javap-mode (9))) "Decompilation extension for cider" tar ((:url . "http://www.github.com/clojure-emacs/cider-decompile") (:commit . "5d87035f3c3c14025e8f01c0c53d0ce2c8f56651") (:revdesc . "5d87035f3c3c") (:keywords "languages" "clojure" "cider"))]) + (cider-eval-sexp-fu . [(20190311 2152) ((emacs (24)) (eval-sexp-fu (0 5 0))) "Briefly highlights an evaluated sexp" tar ((:url . "https://github.com/clojure-emacs/cider-eval-sexp-fu") (:commit . "7fd229f1441356866aedba611fd0cf4e89b50921") (:revdesc . "7fd229f14413") (:keywords "languages" "clojure" "cider") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com"))]) + (cider-hydra . [(20190816 1121) ((cider (0 22 0)) (hydra (0 13 0))) "Hydras for CIDER" tar ((:url . "https://github.com/clojure-emacs/cider-hydra") (:commit . "c3b8a15d72dddfbc390ab6a454bd7e4c765a2c95") (:revdesc . "c3b8a15d72dd") (:keywords "convenience" "tools") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainers ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com"))]) + (ciel . [(20180914 815) ((emacs (24))) "A command that is clone of \"ci\" in vim" tar ((:url . "https://github.com/cs14095/ciel.el") (:commit . "429773a3c551691a463ecfddd634b8bae2f48503") (:revdesc . "429773a3c551") (:keywords "convinience") (:authors ("Takuma Matsushita" . "cs14095@gmail.com")) (:maintainers ("Takuma Matsushita" . "cs14095@gmail.com")) (:maintainer "Takuma Matsushita" . "cs14095@gmail.com"))]) + (cil-mode . [(20160622 1431) nil "Common Intermediate Language mode" tar ((:url . "https://github.com/ForNeVeR/cil-mode") (:commit . "a78a88ca9a66a82f069329a96e34b67478ae2d9b") (:revdesc . "a78a88ca9a66") (:keywords "languages") (:authors ("Friedrich von Never" . "friedrich@fornever.me")) (:maintainers ("Friedrich von Never" . "friedrich@fornever.me")) (:maintainer "Friedrich von Never" . "friedrich@fornever.me"))]) + (cilk-mode . [(20220807 1629) ((emacs (25 1)) (flycheck (32 -4))) "Minor mode for Cilk code editing" tar ((:url . "https://github.com/ailiop/cilk-mode") (:commit . "d5ba732a5a313a97a96085943cd7840b8e2d9c7c") (:revdesc . "d5ba732a5a31") (:keywords "c" "convenience" "faces" "languages") (:authors ("Alexandros-Stavros Iliopoulos" . "https://github.com/ailiop")) (:maintainers ("Alexandros-Stavros Iliopoulos" . "1577182+ailiop@users.noreply.github.com")) (:maintainer "Alexandros-Stavros Iliopoulos" . "1577182+ailiop@users.noreply.github.com"))]) + (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 ((:url . "https://github.com/inlinestyle/cinspect-mode") (:commit . "4e199a90f89b335cccda1518aa0963e0a1d4fbab") (:revdesc . "4e199a90f89b") (:keywords "python") (:authors ("Ben Yelsey" . "ben.yelsey@gmail.com")) (:maintainers ("Ben Yelsey" . "ben.yelsey@gmail.com")) (:maintainer "Ben Yelsey" . "ben.yelsey@gmail.com"))]) + (circadian . [(20250222 1158) ((emacs (27 2))) "Theme-switching based on daytime" tar ((:url . "https://github.com/GuidoSchmidt/circadian") (:commit . "73fa3fd8b63af04bab877209397e42b83fbb9534") (:revdesc . "73fa3fd8b63a") (:keywords "themes") (:maintainers ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc"))]) + (circe . [(20251013 1911) ((emacs (25 1)) (cl-lib (0 5))) "Client for IRC in Emacs" tar ((:url . "https://github.com/emacs-circe/circe") (:commit . "e909ff49e59c396b19564855a3f282684a4e716e") (:revdesc . "e909ff49e59c") (:keywords "irc" "chat" "comm") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx"))]) + (circe-notifications . [(20180102 2318) ((emacs (24 4)) (circe (2 3)) (alert (1 2))) "Add desktop notifications to Circe" tar ((:url . "https://github.com/eqyiel/circe-notifications") (:commit . "291149ac12877bbd062da993479d3533a26862b0") (:revdesc . "291149ac1287") (:authors ("Ruben Maher" . "r@rkm.id.au")) (:maintainers ("Ruben Maher" . "r@rkm.id.au")) (:maintainer "Ruben Maher" . "r@rkm.id.au"))]) + (circleci-api . [(20210227 1607) ((emacs (27)) (request (0 3 2))) "Bindings for the CircleCI API" tar ((:url . "https://github.com/sulami/circleci-api") (:commit . "1432b0ad0f32b03fec564c0815951d5e096c2f6a") (:revdesc . "1432b0ad0f32"))]) + (circom-mode . [(20250604 1022) ((emacs (24 3))) "Major mode for editing Circom circuit" tar ((:url . "https://github.com/taquangtrung/emacs-circom-mode") (:commit . "80240776507ac2454546a8999bcfb6c39ab04a32") (:revdesc . "80240776507a") (:keywords "languages"))]) + (citar . [(20251109 1138) ((emacs (27 1)) (parsebib (4 2)) (org (9 5)) (citeproc (0 9)) (compat (30))) "Citation-related commands for org, latex, markdown" tar ((:url . "https://github.com/emacs-citar/citar") (:commit . "dc7018eb36fb3540cb5b7fc526d6747144437eef") (:revdesc . "dc7018eb36fb") (:authors ("Bruce D'Arcus" . "https://github.com/bdarcus")) (:maintainers ("Bruce D'Arcus" . "https://github.com/bdarcus")) (:maintainer "Bruce D'Arcus" . "https://github.com/bdarcus"))]) + (citar-denote . [(20251220 2230) ((emacs (28 1)) (citar (1 4)) (denote (4 1)) (dash (2 19 1))) "Minor mode integrating Citar and Denote" tar ((:url . "https://github.com/pprevos/citar-denote") (:commit . "0c04d022ff2c992ec233938a14cbfc4f4914c431") (:revdesc . "0c04d022ff2c") (:authors ("Peter Prevos" . "peter@prevos.net")) (:maintainers ("Peter Prevos" . "peter@prevos.net")) (:maintainer "Peter Prevos" . "peter@prevos.net"))]) + (citar-embark . [(20251027 1830) ((emacs (27 1)) (embark (0 17)) (citar (0 9 7))) "Citar/Embark integration" tar ((:url . "https://github.com/emacs-citar/citar") (:commit . "a71ec7c3f02e8d4051fb608d9c4918de5a8ba4e6") (:revdesc . "a71ec7c3f02e") (:keywords "bib" "extensions") (:authors ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainers ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainer "Bruce D'Arcus" . "bdarcus@gmail.com"))]) + (citar-org-node . [(20250727 650) ((emacs (26 1)) (citar (1 1)) (org-node (3 0 0)) (ht (1 6))) "Citar integration with org-node" tar ((:url . "https://github.com/krisbalintona/citar-org-node") (:commit . "b6f8e9db9bbff7675299bc3babb62db7e73bdc60") (:revdesc . "b6f8e9db9bbf") (:keywords "tools") (:authors ("Kristoffer Balintona" . "krisbalintona@gmail.com")) (:maintainers ("Kristoffer Balintona" . "krisbalintona@gmail.com")) (:maintainer "Kristoffer Balintona" . "krisbalintona@gmail.com"))]) + (citar-org-roam . [(20250424 1511) ((emacs (27 1)) (org-roam (2 2 0)) (citar (1 2 0))) "Citar/org-roam integration" tar ((:url . "https://github.com/emacs-citar/citar-org-roam") (:commit . "9750cfbbf330ab3d5b15066b65bd0a0fe7c296fb") (:revdesc . "9750cfbbf330") (:authors ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainers ("Bruce D'Arcus" . "bdarcus@gmail.com")) (:maintainer "Bruce D'Arcus" . "bdarcus@gmail.com"))]) + (citeproc . [(20251103 716) ((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 ((:url . "https://github.com/andras-simonyi/citeproc-el") (:commit . "a3d62ab8e40a75fcfc6e4c0c107e3137b4db6db8") (:revdesc . "a3d62ab8e40a") (:keywords "bib") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainers ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com"))]) + (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 ((:url . "https://github.com/andras-simonyi/citeproc-org") (:commit . "22a759c4f0ec80075014dcc594baa4d1b470d995") (:revdesc . "22a759c4f0ec") (:keywords "org-ref" "org-mode" "cite" "bib") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainers ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com"))]) + (citre . [(20251015 220) ((emacs (26 1))) "Superior code reading & auto-completion tool with pluggable backends" tar ((:url . "https://github.com/universal-ctags/citre") (:commit . "300596a34b61b486530ce3759e8fb722d9534325") (:revdesc . "300596a34b61") (:keywords "convenience" "tools") (:authors ("Hao Wang" . "amaikinono@gmail.com")) (:maintainers ("Hao Wang" . "amaikinono@gmail.com")) (:maintainer "Hao Wang" . "amaikinono@gmail.com"))]) + (cl-format . [(20230818 1726) nil "CL format routine" tar ((:url . "https://gitlab.com/akater/elisp-cl-format") (:commit . "42b662d27eefa458c1a39bea1836d6ada740b863") (:revdesc . "42b662d27eef") (:keywords "extensions") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainers ("akater" . "nuclearspace@gmail.com")) (:maintainer "akater" . "nuclearspace@gmail.com"))]) + (cl-libify . [(20181130 230) ((emacs (25))) "Update elisp code to use cl-lib instead of cl" tar ((:url . "https://github.com/purcell/cl-libify") (:commit . "e205b96f944a4f312fd523804cbbaf00027a3c8b") (:revdesc . "e205b96f944a") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (clang-capf . [(20221030 1830) ((emacs (24 4))) "Completion-at-point backend for c/c++ using clang" tar ((:url . "https://git.sr.ht/~pkal/clang-capf") (:commit . "5e4dfba90ce86bbc7ee61805edfca04fff93c291") (:revdesc . "5e4dfba90ce8") (:keywords "c" "abbrev" "convenience") (:authors ("Philip K." . "philipk[at]posteo[dot]net")) (:maintainers ("Philip K." . "philipk[at]posteo[dot]net")) (:maintainer "Philip K." . "philipk[at]posteo[dot]net"))]) + (clang-format . [(20250223 1620) ((cl-lib (0 3))) "Format code using clang-format" tar ((:url . "https://github.com/emacsmirror/clang-format") (:commit . "a099177b5cd5060597d454e4c1ffdc96b92ba985") (:revdesc . "a099177b5cd5") (:keywords "tools" "c"))]) + (clang-format+ . [(20190824 2216) ((emacs (25 1)) (clang-format (20180406 1514))) "Minor mode for automatic clang-format application" tar ((:url . "https://github.com/SavchenkoValeriy/emacs-clang-format-plus") (:commit . "ddd4bfe1a13c2fd494ce339a320a51124c1d2f68") (:revdesc . "ddd4bfe1a13c") (:keywords "c" "c++" "clang-format"))]) + (clang-format-lite . [(20250509 246) nil "Format code on-save with clang-format, supports remote files" tar ((:url . "https://github.com/arteen1000/clang-format-lite") (:commit . "46681aada7f93170a7e073332a43f8b19ee7b4c5") (:revdesc . "46681aada7f9") (:keywords "tools" "c" "c++" "clang-format" "formatting") (:authors ("Arteen Abrishami" . "arteen@ucla.edu")) (:maintainers ("Arteen Abrishami" . "arteen@ucla.edu")) (:maintainer "Arteen Abrishami" . "arteen@ucla.edu"))]) + (claude-code . [(20250919 1908) ((emacs (28 1)) (projectile (2 5 0)) (vterm (0 0 2)) (transient (0 4 0)) (markdown-mode (2 5))) "Run Claude Code sessions" tar ((:url . "https://github.com/yuya373/claude-code-emacs") (:commit . "56cccf63709b305bfd74ab72f20bd9d3b12f7d09") (:revdesc . "56cccf63709b") (:keywords "tools" "convenience"))]) + (claude-shell . [(20241130 2024) ((emacs (29 1)) (shell-maker (0 72 1))) "Integration with Anthropic's Claude LLM" tar ((:url . "https://github.com/arminfriedl/claude-shell") (:commit . "8e9e7e22b6fab50e19b293d1ebcf435ad937a41f") (:revdesc . "8e9e7e22b6fa") (:keywords "anthropic" "claude" "claude-shell" "shell-maker" "terminals" "wp" "help" "tools") (:authors ("Armin Friedl" . "dev@friedl.net")) (:maintainers ("Armin Friedl" . "dev@friedl.net")) (:maintainer "Armin Friedl" . "dev@friedl.net"))]) + (claudia . [(20250824 1704) ((emacs (29 1)) (uuidgen (0 3)) (markdown-mode (2 3))) "Claude AI integration" tar ((:url . "https://github.com/mzacho/claudia") (:commit . "f5a3398d588a83372169a277d3dd3ed467ff799b") (:revdesc . "f5a3398d588a") (:keywords "ai" "tools" "productivity" "codegen") (:authors ("Martin Zacho" . "hi@martinzacho.net")) (:maintainers ("Martin Zacho" . "hi@martinzacho.net")) (:maintainer "Martin Zacho" . "hi@martinzacho.net"))]) + (clause . [(20241020 1144) ((emacs (27 1)) (mark-thing-at (0 3))) "Functions to move, mark, kill by clause" tar ((:url . "https://codeberg.org/martianh/clause.el") (:commit . "e51261495d88e80709443817af3159633c9a2d7b") (:revdesc . "e51261495d88") (:keywords "wp" "convenience" "sentences" "text") (:authors ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainers ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainer "Marty Hiatt" . "mousebot@disroot.org"))]) + (clay . [(20240409 1321) ((emacs (26 1)) (cider (1 0))) "Emacs commands Clay - literate in Clojure" tar ((:url . "https://github.com/scicloj/clay.el") (:commit . "5d5512e67e7dd4b7b7ffae070517948cb1ad82e4") (:revdesc . "5d5512e67e7d") (:keywords "lisp"))]) + (clean-aindent-mode . [(20171017 2043) nil "Simple indent and unindent, trims indent white-space" tar ((:url . "https://github.com/pmarinov/clean-aindent-mode") (:commit . "a97bcae8f43a9ff64e95473e4ef0d8bafe829211") (:revdesc . "a97bcae8f43a") (:keywords "indentation" "whitespace" "backspace") (:authors ("peter marinov" . "efravia@gmail.com")) (:maintainers ("peter marinov" . "efravia@gmail.com")) (:maintainer "peter marinov" . "efravia@gmail.com"))]) + (clean-buffers . [(20160529 2259) ((cl-lib (0 5))) "Clean useless buffers" tar ((:url . "https://github.com/lujun9972/clean-buffers") (:commit . "1be6c54e3095761b6b64bf749faae3dfce94e72a") (:revdesc . "1be6c54e3095") (:keywords "convenience" "usability" "buffers") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (clean-kill-ring . [(20250926 1623) ((emacs (24 4))) "Keep the kill ring clean" tar ((:url . "http://github.com/NicholasBHubbard/clean-kill-ring.el") (:commit . "60172fc644d68c55b1c15c7fe1a09a63589a1d43") (:revdesc . "60172fc644d6") (:keywords "kill-ring" "convenience") (:authors ("Nicholas Hubbard" . "nicholashubbard@posteo.net")) (:maintainers ("Nicholas Hubbard" . "nicholashubbard@posteo.net")) (:maintainer "Nicholas Hubbard" . "nicholashubbard@posteo.net"))]) + (clear-text . [(20160406 2043) nil "Make you use clear text" tar ((:url . "https://github.com/xuchunyang/clear-text.el") (:commit . "b50669b6077d6948f72cb3c649281d206e0c2f2b") (:revdesc . "b50669b6077d") (:keywords "convenience") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com"))]) + (clevercss . [(20131229 155) nil "A major mode for editing CleverCSS files" tar ((:url . "https://github.com/jschaf/CleverCSS-Mode") (:commit . "b8a3c0dd674367c62b1a1ffec84d88fe0c0219bc") (:revdesc . "b8a3c0dd6743") (:keywords "languages" "css") (:authors ("Joe Schafer" . "(joesmoe10@gmail.com)")) (:maintainers ("Joe Schafer" . "(joesmoe10@gmail.com)")) (:maintainer "Joe Schafer" . "(joesmoe10@gmail.com)"))]) + (clhs . [(20210428 1911) nil "Access the Common Lisp HyperSpec (CLHS)" tar ((:url . "https://gitlab.com/sam-s/clhs") (:commit . "7b106c4fb5a6388ab753f94740f6dfadcdeedcbb") (:revdesc . "7b106c4fb5a6") (:keywords "lisp" "common lisp" "emacs" "ansi cl" "hyperspec") (:maintainers ("Sam Steingold" . "sds@gnu.org")) (:maintainer "Sam Steingold" . "sds@gnu.org"))]) + (click-mode . [(20180611 44) ((emacs (24))) "Major mode for the Click Modular Router Project" tar ((:url . "https://github.com/bmalehorn/click-mode") (:commit . "b94ea8cce89cf0e753b2ab915202d49ffc470fb6") (:revdesc . "b94ea8cce89c") (:keywords "click" "router") (:authors ("Brian Malehorn" . "bmalehorn@gmail.com")) (:maintainers ("Brian Malehorn" . "bmalehorn@gmail.com")) (:maintainer "Brian Malehorn" . "bmalehorn@gmail.com"))]) + (clingo-mode . [(20240724 1135) ((emacs (24 3))) "A major mode for editing Answer Set Programs" tar ((:url . "https://github.com/llaisdy/clingo-mode") (:commit . "feff7d3308a824e918740461e9df636ab67a8874") (:revdesc . "feff7d3308a8") (:keywords "asp" "clingo" "answer set programs" "potassco" "major mode" "languages") (:authors ("Ivan Uemlianin" . "ivan@llaisdy.com") ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainers ("Ivan Uemlianin" . "ivan@llaisdy.com")) (:maintainer "Ivan Uemlianin" . "ivan@llaisdy.com"))]) + (clipetty . [(20200327 2241) ((emacs (25 1))) "Send every kill from a TTY frame to the system clipboard" tar ((:url . "https://github.com/spudlyo/clipetty") (:commit . "7ee3f9c52f70f80820a8c66fb6f796d6e01dd92d") (:revdesc . "7ee3f9c52f70") (:keywords "terminals" "convenience") (:authors ("Mike Hamrick" . "mikeh@muppetlabs.com")) (:maintainers ("Mike Hamrick" . "mikeh@muppetlabs.com")) (:maintainer "Mike Hamrick" . "mikeh@muppetlabs.com"))]) + (cliphist . [(20220525 1034) ((emacs (25 1))) "Paste from clipboard managers" tar ((:url . "http://github.com/redguardtoo/cliphist") (:commit . "d02b97a2aa0da13711d9a6f845649115de8ac11b") (:revdesc . "d02b97a2aa0d") (:keywords "clipboard" "manager" "history") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (clipmon . [(20180129 1054) nil "Clipboard monitor - watch system clipboard, add changes to kill ring/autoinsert" tar ((:url . "https://github.com/bburns/clipmon") (:commit . "95dc56c7ed84a654ec90f4740eb6df1050de8cf1") (:revdesc . "95dc56c7ed84") (:keywords "convenience") (:authors ("Brian Burns" . "bburns.km@gmail.com")) (:maintainers ("Brian Burns" . "bburns.km@gmail.com")) (:maintainer "Brian Burns" . "bburns.km@gmail.com"))]) + (clippy . [(20250511 2020) ((pos-tip (1 0))) "Show tooltip with function documentation at point" tar ((:url . "https://github.com/Fuco1/clippy.el") (:commit . "006e0bbe3f695c0e0ebdc0de5095255608eb9e6c") (:revdesc . "006e0bbe3f69") (:keywords "docs") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (clips-mode . [(20170909 823) nil "Major mode for editing CLIPS code and REPL" tar ((:url . "https://github.com/clips-mode/clips-mode") (:commit . "dd38e2822640a38f7d8bfec4f69d8dd24be27074") (:revdesc . "dd38e2822640") (:keywords "clips") (:authors ("David E. Young" . "david.young@fnc.fujitsu.com") ("Andrey Kotlarski" . "m00naticus@gmail.com") ("Grant Rettke" . "grettke@acm.org")) (:maintainers ("Grant Rettke" . "grettke@acm.org")) (:maintainer "Grant Rettke" . "grettke@acm.org"))]) + (clj-decompiler . [(20220103 1746) ((emacs (26 1)) (clojure-mode (5 12)) (cider (1 2 0))) "Clojure Java decompiler expansion" tar ((:url . "https://www.github.com/bsless/clj-decompiler.el") (:commit . "8c0c53f87e6e33f2be7e7aff6095eb586b50be1a") (:revdesc . "8c0c53f87e6e") (:keywords "languages" "clojure" "cider" "java" "decompiler") (:authors ("Ben Sless" . "ben.sless@gmail.com")) (:maintainers ("Ben Sless" . "ben.sless@gmail.com")) (:maintainer "Ben Sless" . "ben.sless@gmail.com"))]) + (clj-deps-new . [(20230413 1833) ((emacs (25 1)) (transient (0 3 7))) "Create clojure projects from templates" tar ((:url . "https://github.com/jpe90/emacs-deps-new") (:commit . "72f25d86bbd9cd6cb4aa431e70bda38f35b19262") (:revdesc . "72f25d86bbd9") (:authors ("jpe90" . "eskinjp@gmail.com")) (:maintainers ("jpe90" . "eskinjp@gmail.com")) (:maintainer "jpe90" . "eskinjp@gmail.com"))]) + (clj-refactor . [(20250514 1903) ((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 ((:url . "https://github.com/clojure-emacs/clj-refactor.el") (:commit . "362cb46bf808dc42d2aaf022afe93048439680c4") (:revdesc . "362cb46bf808") (:keywords "convenience" "clojure" "cider") (: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") ("Lars Andersen" . "expez@expez.com") ("Benedek Fazekas" . "benedek.fazekas@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (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 ((:url . "https://github.com/philjackson/cljr-helm") (:commit . "2c1f9cbd892ec03335f671ea3f974ee2ff6078dc") (:revdesc . "2c1f9cbd892e") (:keywords "helm" "clojure" "refactor") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainers ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Phil Jackson" . "phil@shellarchive.co.uk"))]) + (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 ((:url . "https://github.com/wandersoncferreira/cljr-ivy") (:commit . "18e6e3526e872010a643c91aa71ff1d429431b83") (:revdesc . "18e6e3526e87") (:keywords "convenience" "matching") (:authors ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainers ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainer "Wanderson Ferreira" . "iagwanderson@gmail.com"))]) + (cljsbuild-mode . [(20160402 1700) nil "A minor mode for the ClojureScript 'lein cljsbuild' command" tar ((:url . "http://github.com/kototama/cljsbuild-mode") (:commit . "fa2315660cb3ce944b5e16c679dcf5afd6a97f4c") (:revdesc . "fa2315660cb3") (:keywords "clojure" "clojurescript" "leiningen" "compilation"))]) + (cljstyle-format . [(20220706 309) ((emacs (24)) (reformatter (0 3))) "Reformat Clojure code using cljstyle" tar ((:url . "http://www.github.com/dpassen/cljstyle-format") (:commit . "31a43dfbeea12bbd4639dcec4fbb043cc0ff86d3") (:revdesc . "31a43dfbeea1") (:keywords "clojure" "cljstyle" "tools" "languages") (:authors ("Derek Passen" . "dpassen1@gmail.com")) (:maintainers ("Derek Passen" . "dpassen1@gmail.com")) (:maintainer "Derek Passen" . "dpassen1@gmail.com"))]) + (clmemo . [(20220204 1345) nil "Change Log MEMO" tar ((:url . "https://github.com/ataka/clmemo") (:commit . "f695c38c551f72f6ac5e1a82badc540c80d3b33b") (:revdesc . "f695c38c551f") (:keywords "convenience") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainers ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com"))]) + (cloak-mode . [(20230130 613) ((emacs (27 1))) "A minor mode to cloak sensitive values" tar ((:url . "https://github.com/erickgnavar/cloak-mode") (:commit . "ca0896dfd0a0ee549150233ebd96aa0f65b56afb") (:revdesc . "ca0896dfd0a0") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io"))]) + (cloc . [(20170728 1824) ((cl-lib (0 5))) "Count lines of code over emacs buffers" tar ((:url . "https://github.com/cosmicexplorer/cloc-emacs") (:commit . "f30f0472e465cc8d433d2473e9d3b8dfe2c94491") (:revdesc . "f30f0472e465") (:keywords "cloc" "count" "source" "code" "lines") (:authors ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainers ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Danny McClanahan" . "danieldmcclanahan@gmail.com"))]) + (clocker . [(20190214 1833) ((projectile (0 11 0)) (dash (2 10)) (spaceline (2 0 1))) "Note taker and clock-in enforcer" tar ((:url . "https://github.com/roman/clocker.el") (:commit . "c4d76968a49287ce3bac0832bb5d5d076054c96f") (:revdesc . "c4d76968a492") (:keywords "org") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com"))]) + (clockodo . [(20220604 2049) ((emacs (26 1)) (request (0 3 2)) (ts (0 2 2)) (org (8))) "A small integration for the clockodo api" tar ((:url . "https://github.com/santifa/clockodo-el") (:commit . "6329aaebc4373edaa4cd1d046582a4cc36db4888") (:revdesc . "6329aaebc437") (:keywords "tools" "clockodo") (:authors ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainers ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainer "Henrik Jürges" . "juerges.henrik@gmail.com"))]) + (clojars . [(20180825 1951) ((request-deferred (0 2 0))) "Clojars.org search interface" tar ((:url . "https://github.com/joshuamiller/clojars.el") (:commit . "c78e4d5ddacda064c253e2b38d1c35188aa1ad71") (:revdesc . "c78e4d5ddacd") (:keywords "docs" "help" "tools") (:authors ("Joshua Miller" . "josh@joshmiller.io")) (:maintainers ("Joshua Miller" . "josh@joshmiller.io")) (:maintainer "Joshua Miller" . "josh@joshmiller.io"))]) + (clojure-essential-ref . [(20221215 1427) ((emacs (24)) (cider (0 24 0))) "Cider-doc to \"Clojure, The Essential Reference\"" tar ((:url . "https://github.com/p3r7/clojure-essential-ref") (:commit . "6741bf65cf9b9bc896ab1cc3c384573e8ffe5f96") (:revdesc . "6741bf65cf9b"))]) + (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 ((:url . "https://github.com/p3r7/clojure-essential-ref") (:commit . "6741bf65cf9b9bc896ab1cc3c384573e8ffe5f96") (:revdesc . "6741bf65cf9b"))]) + (clojure-mode . [(20250527 840) ((emacs (25 1))) "Major mode for Clojure code" tar ((:url . "https://github.com/clojure-emacs/clojure-mode") (:commit . "d336db623e7ae8cffff50aaaea3f1b05cc4ccecb") (:revdesc . "d336db623e7a") (:keywords "languages" "clojure" "clojurescript" "lisp") (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (clojure-mode-extra-font-locking . [(20250527 840) ((clojure-mode (3 0))) "Extra font-locking for Clojure mode" tar ((:url . "https://github.com/clojure-emacs/clojure-mode") (:commit . "d336db623e7ae8cffff50aaaea3f1b05cc4ccecb") (:revdesc . "d336db623e7a") (:keywords "languages" "lisp") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (clojure-quick-repls . [(20150814 736) ((cider (0 8 1)) (dash (2 9 0))) "Quickly create Clojure and ClojureScript repls for a project" tar ((:url . "https://github.com/symfrog/clojure-quick-repls") (:commit . "8fe4e44939e8a01a4cdf60c0001d9a6abf8a73c3") (:revdesc . "8fe4e44939e8") (:keywords "languages" "clojure" "cider" "clojurescript"))]) + (clojure-snippets . [(20241226 1639) ((yasnippet (0 10 0)) (cl-lib (0 5))) "Yasnippets for clojure" tar ((:url . "https://github.com/mpenet/clojure-snippets") (:commit . "1e96ed7215e9da7c003a370eb1f91ed5475e6b0d") (:revdesc . "1e96ed7215e9") (:keywords "snippets") (:authors ("Max Penet" . "m@qbits.cc")) (:maintainers ("Max Penet" . "m@qbits.cc")) (:maintainer "Max Penet" . "m@qbits.cc"))]) + (clojure-ts-mode . [(20251202 1521) ((emacs (30 1))) "Major mode for Clojure code" tar ((:url . "http://github.com/clojure-emacs/clojure-ts-mode") (:commit . "96fdffcbe9e1b8ebf9ad14e23b06f62cc3422e22") (:revdesc . "96fdffcbe9e1") (:keywords "languages" "clojure" "clojurescript" "lisp") (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (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 ((:url . "https://github.com/clojure-emacs/clomacs") (:commit . "9cd7c9fd86bc7bc627a31275d1ef131378b90a49") (:revdesc . "9cd7c9fd86bc") (:keywords "clojure" "interaction") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com"))]) + (closql . [(20251215 1734) ((emacs (28 1)) (compat (30 1)) (cond-let (0 2)) (emacsql (4 3))) "Store EIEIO objects using EmacSQL" tar ((:url . "https://github.com/emacscollective/closql") (:commit . "cbead2f2958449e6a1c4e93e956ef20c56593bc0") (:revdesc . "cbead2f29584") (:keywords "extensions") (:authors ("Jonas Bernoulli" . "emacs.closql@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.closql@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.closql@jonas.bernoulli.dev"))]) + (closure-lint-mode . [(20101118 2124) nil "Minor mode for the Closure Linter" tar ((:url . "https://github.com/r0man/closure-lint-mode") (:commit . "bc3d2fd5c35580bf1b8af43b12484c95a343b4b5") (:revdesc . "bc3d2fd5c355") (:keywords "tools" "closure" "javascript" "lint" "flymake") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainers ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com"))]) + (cloud-theme . [(20220205 1336) ((emacs (24))) "A light colored theme" tar ((:url . "https://github.com/vallyscode/cloud-theme") (:commit . "16ef7fbf0a423b29e3c3a0a2d9525afaf265aaed") (:revdesc . "16ef7fbf0a42") (:keywords "color" "theme") (:authors ("Valerii Lysenko" . "vallyscode@gmail.com")) (:maintainers ("Valerii Lysenko" . "vallyscode@gmail.com")) (:maintainer "Valerii Lysenko" . "vallyscode@gmail.com"))]) + (cloud-to-butt-erc . [(20130627 2308) nil "Replace 'the cloud' with 'my butt'" tar ((:url . "http://www.github.com/leathekd/cloud-to-butt-erc") (:commit . "6710c03d1bc91736435cbfe845924940cae34e5c") (:revdesc . "6710c03d1bc9") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainers ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com"))]) + (clues-theme . [(20161213 1127) ((emacs (24 0))) "An Emacs 24 theme which may well be fully awesome.." tar ((:url . "https://github.com/emacsfodder/emacs-clues-theme") (:commit . "abd61f2b7f3e98de58ca26e6d1230e70c6406cc7") (:revdesc . "abd61f2b7f3e") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (cm-mode . [(20240422 725) ((emacs (25 1)) (cl-lib (0 5))) "Minor mode for CriticMarkup" tar ((:url . "https://github.com/joostkremers/criticmarkup-emacs") (:commit . "a9381f57f3005a9b26f81085ecb2accf680c6f6b") (:revdesc . "a9381f57f300") (:keywords "text" "markdown") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm"))]) + (cmake-font-lock . [(20230304 2223) ((cmake-mode (0 0))) "Advanced, type aware, highlight support for CMake" tar ((:url . "https://github.com/Lindydancer/cmake-font-lock") (:commit . "a6038e916bcca807ae695f7d7e5c300c3f38f415") (:revdesc . "a6038e916bcc") (:keywords "faces" "languages"))]) + (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 ((:url . "http://github.com/atilaneves/cmake-ide") (:commit . "28dc4ab5bd01d99553901b4efeb7234280928b18") (:revdesc . "28dc4ab5bd01") (:keywords "languages") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainers ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com"))]) + (cmake-mode . [(20251208 1833) ((emacs (24 1))) "Major-mode for editing CMake sources" tar ((:commit . "485f11a780435eb6495b79227d3237383778ac3e") (:revdesc . "485f11a78043"))]) + (cmake-project . [(20171121 1115) nil "Integrates CMake build process with Emacs" tar ((:url . "http://github.com/alamaison/emacs-cmake-project") (:commit . "d3f408f226eff3f77f7e00dd519f4efc78fd292d") (:revdesc . "d3f408f226ef") (:keywords "c" "cmake" "languages" "tools") (:authors ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainers ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainer "Alexander Lamaison" . "alexander.lamaison@gmail"))]) + (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 ((:url . "https://github.com/mallt/cmd-to-echo") (:commit . "e0e874fc0e1ad6d291e39ed76023445297ad438a") (:revdesc . "e0e874fc0e1a") (: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 ((:url . "https://github.com/bgamari/cmm-mode") (:commit . "c3ad514dff3eb30434f6b20d953276d4c00de1ee") (:revdesc . "c3ad514dff3e"))]) + (cnfonts . [(20251223 636) ((emacs (24))) "A simple Chinese fonts config tool" tar ((:url . "https://github.com/tumashu/cnfonts") (:commit . "9daace1a96febb4f8ec72f1a845a4e63ae56bc4c") (:revdesc . "9daace1a96fe") (:keywords "convenience" "chinese" "font") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (cobalt . [(20180304 1155) ((emacs (24))) "Easily use the Cobalt.rs static site generator" tar ((:url . "https://github.com/cobalt-org/cobalt.el") (:commit . "634ace275697e188746ca22a30ff94380ec756be") (:revdesc . "634ace275697") (:keywords "convenience") (:authors ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainers ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainer "Juan Karlo Licudine" . "accidentalrebel@gmail.com"))]) + (cobra-mode . [(20140116 2116) nil "Major mode for .NET-based Cobra language" tar ((:url . "http://github.com/Nekroze/cobra-mode") (:commit . "acd6e53f6286af5176471d01f25257e5ddb6dd01") (:revdesc . "acd6e53f6286") (:keywords "languages"))]) + (coc-dc . [(20241104 1739) ((emacs (27 2)) (hydra (0 14 0))) "A Clash of Clans damage calculator" tar ((:url . "https://github.com/S0mbr3/coc-damage-calculator") (:commit . "097bc2496263fc1e69a04d0528b41baf2fd08115") (:revdesc . "097bc2496263") (:keywords "games") (:authors ("S0mbr3" . "0xf2f@proton.me")) (:maintainers ("S0mbr3" . "0xf2f@proton.me")) (:maintainer "S0mbr3" . "0xf2f@proton.me"))]) + (codcut . [(20190915 1009) nil "Share pieces of code to Codcut" tar ((:url . "https://github.com/codcut/codcut-emacs") (:commit . "bf07c3db3900e36b0b87423f3b715d6378f86393") (:revdesc . "bf07c3db3900") (:keywords "comm" "tools" "codcut" "share") (:authors ("Diego Pasquali" . "hello@dgopsq.space")) (:maintainers ("Diego Pasquali" . "hello@dgopsq.space")) (:maintainer "Diego Pasquali" . "hello@dgopsq.space"))]) + (code-archive . [(20190612 308) ((emacs (24 3))) "Git supported code archive and reference for org-mode" tar ((:url . "https://github.com/mschuldt/code-archive") (:commit . "1ad9af6679d0294c3056eab9cad673f29c562721") (:revdesc . "1ad9af6679d0") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainers ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com"))]) + (code-awareness . [(20251117 617) ((emacs (27 1))) "Code Awareness collaboration package" tar ((:url . "https://github.com/CodeAwareness/ca.emacs") (:commit . "16b700570ea8902830607575f3418f970dffe4c0") (:revdesc . "16b700570ea8") (:keywords "tools" "convenience" "vc") (:authors ("Mark Vasile" . "mark@code-awareness.com")) (:maintainers ("Mark Vasile" . "mark@code-awareness.com")) (:maintainer "Mark Vasile" . "mark@code-awareness.com"))]) + (code-cells . [(20241119 1421) ((emacs (27 1)) (compat (29 1))) "Lightweight notebooks with support for ipynb files" tar ((:url . "https://github.com/astoff/code-cells.el") (:commit . "caffb420be106cebbdfe4474ed0507a601603f83") (:revdesc . "caffb420be10") (:keywords "convenience" "outlines") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com"))]) + (code-compass . [(20250227 1124) ((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 ((:url . "https://github.com/ag91/code-compass") (:commit . "6b741978c83f0359c7e555ab78708eed6ced8486") (:revdesc . "6b741978c83f") (:keywords "tools" "extensions" "help") (:authors ("Andrea" . "andrea-dev@hotmail.com")) (:maintainers ("Andrea" . "andrea-dev@hotmail.com")) (:maintainer "Andrea" . "andrea-dev@hotmail.com"))]) + (code-library . [(20160426 1218) ((gist (1 3 1))) "Use org-mode to collect code snippets" tar ((:url . "https://github.com/lujun9972/code-library") (:commit . "3c79338eae5c892bfb4e4882298422d9fd65d2d7") (:revdesc . "3c79338eae5c") (:keywords "lisp" "code") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (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 ((:url . "https://github.com/wandersoncferreira/code-review") (:commit . "a8bb63b53f2a1fd31302c110e668ad7b5c871b34") (:revdesc . "a8bb63b53f2a") (:keywords "git" "tools" "vc") (:authors ("Wanderson Ferreira" . "https://github.com/wandersoncferreira")) (:maintainers ("Wanderson Ferreira" . "wand@hey.com")) (:maintainer "Wanderson Ferreira" . "wand@hey.com"))]) + (code-stats . [(20201209 2135) ((emacs (25)) (request (0 3 0))) "Code::Stats plugin" tar ((:url . "https://github.com/xuchunyang/code-stats-emacs") (:commit . "9a467dfd6a3cef849468623e1c085cbf59dac154") (:revdesc . "9a467dfd6a3c") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (codebug . [(20140929 2137) nil "Interact with codebug" tar ((:url . "http://www.shanedowling.com/") (:commit . "d95e5182fa1465406964873d9db1fdac77206f5b") (:revdesc . "d95e5182fa14"))]) + (codesearch . [(20240828 618) ((log4e (0 3 1))) "Core support for managing codesearch tools" tar ((:url . "https://github.com/abingham/emacs-codesearch") (:commit . "92b4c2557c0bbf7da4d26c413feccb6766e70a9c") (:revdesc . "92b4c2557c0b") (:keywords "tools" "development" "search") (:authors ("Austin Bingham" . "austin.bingham@gmail.com") ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com") ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (codespaces . [(20221018 1831) ((emacs (28 1))) "Connect to GitHub Codespaces via TRAMP" tar ((:url . "https://github.com/patrickt/codespaces.el") (:commit . "8e0843684ea685c2b25b8f5601cf02553bab4b08") (:revdesc . "8e0843684ea6") (:keywords "comm") (:authors ("Patrick Thomson" . "patrickt@github.com")) (:maintainers ("Patrick Thomson" . "patrickt@github.com")) (:maintainer "Patrick Thomson" . "patrickt@github.com"))]) + (codex-cli . [(20250913 1900) ((emacs (28 1))) "Codex CLI integration" tar ((:url . "https://github.com/bennfocus/codex-cli.el") (:commit . "172d62381851d82860186a56da6f936f40180b3f") (:revdesc . "172d62381851") (:keywords "tools" "convenience" "codex" "codex-cli") (:authors ("Benn" . "bennmsg@gmail.com")) (:maintainers ("Benn" . "bennmsg@gmail.com")) (:maintainer "Benn" . "bennmsg@gmail.com"))]) + (codex-theme . [(20240914 204) nil "Codex theme, a simple high contrast theme" tar ((:url . "https://github.com/hsnovel/codex-theme") (:commit . "fe5ce22e801423e7a5dafb7b57674e2dffbeb86d") (:revdesc . "fe5ce22e8014") (:authors ("ağan Korkmaz" . "root@hsnovel.net")) (:maintainers ("ağan Korkmaz" . "root@hsnovel.net")) (:maintainer "ağan Korkmaz" . "root@hsnovel.net"))]) + (codic . [(20150926 1127) ((emacs (24)) (cl-lib (0 5))) "Search Codic (codic.jp) naming dictionaries" tar ((:url . "https://github.com/syohex/emacs-codic") (:commit . "52bbb6997ef4ab9fb7fea43bbfff7f04671aa557") (:revdesc . "52bbb6997ef4") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (coercion . [(20250123 1931) ((emacs (29 1))) "Naming convention style switch" tar ((:url . "https://github.com/eki3z/coercion.el") (:commit . "aa50f6c51a2363f7827e614c3e533152619dd050") (:revdesc . "aa50f6c51a23") (:keywords "convenience" "editing") (:authors ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz95@gmail.com"))]) + (coffee-fof . [(20131012 1230) ((coffee-mode (0 4 1))) "A coffee-mode configuration for `ff-find-other-file'" tar ((:url . "http://github.com/yasuyk/coffee-fof") (:commit . "211529594bc074721c6cbc4edb73a63cc05f89ac") (:revdesc . "211529594bc0") (:keywords "coffee-mode") (:authors ("Yasuyki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyki Oka" . "yasuyk@gmail.com"))]) + (coffee-mode . [(20200315 1133) ((emacs (24 3))) "Major mode for CoffeeScript code" tar ((:url . "http://github.com/defunkt/coffee-mode") (:commit . "35a41c7d8233eac0b267d9593e67fb8b6235e134") (:revdesc . "35a41c7d8233") (:keywords "coffeescript" "major" "mode") (:authors ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainers ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainer "Chris Wanstrath" . "chris@ozmm.org"))]) + (coin-ticker . [(20170611 727) ((request (0 3 0)) (emacs (25))) "Show a cryptocurrency price ticker" tar ((:url . "https://github.com/eklitzke/coin-ticker-mode") (:commit . "45108e239e1d129c0cc1ff37f2870cf73087780b") (:revdesc . "45108e239e1d") (:keywords "news") (:authors ("Evan Klitzke" . "evan@eklitzke.org")) (:maintainers ("Evan Klitzke" . "evan@eklitzke.org")) (:maintainer "Evan Klitzke" . "evan@eklitzke.org"))]) + (colonoscopy-theme . [(20170808 1309) ((emacs (24 0))) "An Emacs 24 theme based on Colonoscopy (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "64bbb322b13dae91ce9f1e3581f836f94f800ead") (:revdesc . "64bbb322b13d"))]) + (color-identifiers-mode . [(20251205 2247) ((dash (2 5 0)) (emacs (24 4))) "Color identifiers based on their names" tar ((:url . "https://github.com/ankurdave/color-identifiers-mode") (:commit . "a868ccaeb2be5109391f8cb66004c9f457f0506f") (:revdesc . "a868ccaeb2be") (:keywords "faces" "languages") (:authors ("Ankur Dave" . "ankurdave@gmail.com")) (:maintainers ("Ankur Dave" . "ankurdave@gmail.com")) (:maintainer "Ankur Dave" . "ankurdave@gmail.com"))]) + (color-moccur . [(20141223 35) nil "Multi-buffer occur (grep) mode" tar ((:url . "http://www.bookshelf.jp/elc/color-moccur.el") (:commit . "4f1c59ffd1ccc2ab1a171cd6b721e8cb9e002fb7") (:revdesc . "4f1c59ffd1cc") (:keywords "convenience"))]) + (color-theme . [(20190220 1115) nil "An OBSOLETE color-theme implementation" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki.pl?ColorTheme") (:commit . "3a2f6b615f5e2401e30d93a3e0adc210bbb4b7aa") (:revdesc . "3a2f6b615f5e") (:keywords "faces") (:authors ("Jonadab the Unsightly One" . "jonadab@bright.net")) (:maintainers ("Xavier Maillard" . "zedek@gnu.org")) (:maintainer "Xavier Maillard" . "zedek@gnu.org"))]) + (color-theme-approximate . [(20140228 436) nil "Makes Emacs theme works on terminal transparently" tar ((:url . "https://github.com/tungd/color-theme-approximate") (:commit . "f54301ca39bc5d2ffb000f233f8114184a3e7d71") (:revdesc . "f54301ca39bc") (: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 ((:url . "http://github.com/vic/color-theme-buffer-local") (:commit . "faf7415c99e132094f1f09c6b6974ec118a18d87") (:revdesc . "faf7415c99e1") (:keywords "faces") (:authors ("Victor Borja" . "vic.borja@gmail.com")) (:maintainers ("Victor Borja" . "vic.borja@gmail.com")) (:maintainer "Victor Borja" . "vic.borja@gmail.com"))]) + (color-theme-modern . [(20241227 223) ((emacs (24))) "Ports of color-theme themes to deftheme" tar ((:url . "https://github.com/emacs-jp/replace-colorthemes") (:commit . "99839fe205ff7dd299b15355e98e6b0aeb9cc646") (:revdesc . "99839fe205ff") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (color-theme-sanityinc-solarized . [(20241126 1028) ((emacs (24 1))) "A version of Ethan Schoonover's Solarized themes" tar ((:url . "https://github.com/purcell/color-theme-sanityinc-solarized") (:commit . "f42431850e0ff0cff90c6cc39edc222faa40323d") (:revdesc . "f42431850e0f") (:keywords "faces" "themes") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (color-theme-sanityinc-tomorrow . [(20251107 1433) ((emacs (24 1))) "A version of Chris Kempson's \"tomorrow\" themes" tar ((:url . "https://github.com/purcell/color-theme-sanityinc-tomorrow") (:commit . "f3f05e31cd9fd2e99e8d7859a8d46a549fac9537") (:revdesc . "f3f05e31cd9f") (:keywords "faces" "themes") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (color-theme-x . [(20201204 2245) ((cl-lib (0 5))) "Convert color themes to X11 resource settings" tar ((:url . "https://github.com/ajsquared/color-theme-x") (:commit . "ec853dd931d625e07116fbc91d8829bd15f90889") (:revdesc . "ec853dd931d6") (:keywords "convenience" "faces" "frames") (:authors ("Matthew Kennedy" . "mkennedy@killr.ath.cx")) (:maintainers ("Andrew Johnson" . "andrew@andrewjamesjohnson.com")) (:maintainer "Andrew Johnson" . "andrew@andrewjamesjohnson.com"))]) + (colorless-themes . [(20210102 1035) ((emacs (24 1))) "A macro to generate mostly colorless themes" tar ((:url . "https://git.sr.ht/~lthms/colorless-themes.el") (:commit . "95fff8b4e313bdd2073454fd5be9420d95dab267") (:revdesc . "95fff8b4e313") (:keywords "faces themes" "faces") (:authors ("Thomas Letan" . "contact@thomasletan.fr")) (:maintainers ("Thomas Letan" . "contact@thomasletan.fr")) (:maintainer "Thomas Letan" . "contact@thomasletan.fr"))]) + (colormaps . [(20171008 2224) ((emacs (25))) "Hex colormaps" tar ((:url . "https://github.com/lepisma/colormaps.el") (:commit . "3a88961ba66b09a49ea5aa92b2b8776b2c92d68c") (:revdesc . "3a88961ba66b") (:keywords "tools") (:authors ("Abhinav Tushar" . "lepisma@fastmail.com")) (:maintainers ("Abhinav Tushar" . "lepisma@fastmail.com")) (:maintainer "Abhinav Tushar" . "lepisma@fastmail.com"))]) + (column-enforce-mode . [(20200605 1933) nil "Highlight text that extends beyond a column" tar ((:url . "www.github.com/jordonbiondo/column-enforce-mode") (:commit . "14a7622f2268890e33536ccd29510024d51ee96f") (:revdesc . "14a7622f2268"))]) + (com-css-sort . [(20250101 1004) ((emacs (25 1)) (s (1 12 0))) "Common way of sorting the CSS attributes" tar ((:url . "https://github.com/jcs-elpa/com-css-sort") (:commit . "4c6f8bfd88c0bcee9ac121f013d1fcd88f462bae") (:revdesc . "4c6f8bfd88c0") (:keywords "convenience" "matching" "css" "sort") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (comb . [(20201010 1147) ((emacs (25 1))) "Interactive code auditing and grep tool" tar ((:url . "https://github.com/cyrus-and/comb") (:commit . "31f3e94afb2a7f7d18d30c2468a0c683700f7a66") (:revdesc . "31f3e94afb2a") (:keywords "matching") (:authors ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainers ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainer "Andrea Cardaci" . "cyrus.and@gmail.com"))]) + (comby . [(20200629 140) ((emacs (25 1))) "Emacs comby integration" tar ((:url . "https://github.com/s-kostyaev/comby.el") (:commit . "928b8b8959a2556aba5526f2a25801341eb59dc3") (:revdesc . "928b8b8959a2") (:keywords "languages") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru"))]) + (comint-histories . [(20251116 1248) ((emacs (25 1)) (f (0 21 0))) "Many comint histories" tar ((:url . "https://github.com/NicholasBHubbard/comint-histories") (:commit . "36f37760a85bc5e8535180d9481c856768ea356d") (:revdesc . "36f37760a85b") (:keywords "convenience" "processes" "terminals") (:authors ("Nicholas Hubbard" . "nicholashubbard@posteo.net")) (:maintainers ("Nicholas Hubbard" . "nicholashubbard@posteo.net")) (:maintainer "Nicholas Hubbard" . "nicholashubbard@posteo.net"))]) + (comint-hyperlink . [(20211026 100) ((emacs (24 3))) "Create hyperlinks in comint for SGR URL control sequences" tar ((:url . "https://github.com/matthewbauer/comint-hyperlink") (:commit . "905f2db1f95950899301b9f71faed9e9362cf5dc") (:revdesc . "905f2db1f959") (:keywords "comint" "shell" "processes" "hypermedia" "terminals") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainers ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com"))]) + (comint-intercept . [(20241021 629) ((emacs (24 3)) (vterm (20240102 1640))) "Intercept input in comint-mode" tar ((:url . "https://github.com/hying-caritas/comint-intercept") (:commit . "99b17be632ff1d892f427244cad9e37752cbf71b") (:revdesc . "99b17be632ff") (:keywords "processes" "terminals") (:authors ("Huang, Ying" . "huang.ying.caritas@gmail.com")) (:maintainers ("Huang, Ying" . "huang.ying.caritas@gmail.com")) (:maintainer "Huang, Ying" . "huang.ying.caritas@gmail.com"))]) + (command-log-mode . [(20160413 447) nil "Log keyboard commands to buffer" tar ((:url . "https://github.com/lewang/command-log-mode") (:commit . "af600e6b4129c8115f464af576505ea8e789db27") (:revdesc . "af600e6b4129") (:keywords "help") (:authors ("Michael Weber" . "michaelw@foldr.org")) (:maintainers ("Michael Weber" . "michaelw@foldr.org")) (:maintainer "Michael Weber" . "michaelw@foldr.org"))]) + (command-queue . [(20160328 1725) ((emacs (24 3))) "Shell command queue" tar ((:url . "https://github.com/Yuki-Inoue/command-queue") (:commit . "f327c6f852592229a755ec6de0c62c6aeafd6659") (:revdesc . "f327c6f85259") (:authors ("Yuki INOUE" . "inouetakahirokiatgmail.com")) (:maintainers ("Yuki INOUE" . "inouetakahirokiatgmail.com")) (:maintainer "Yuki INOUE" . "inouetakahirokiatgmail.com"))]) + (commander . [(20140120 1852) ((s (1 6 0)) (dash (2 0 0)) (cl-lib (0 3)) (f (0 6 1))) "Emacs command line parser" tar ((:url . "http://github.com/rejeep/commander.el") (:commit . "2c8a57b9c619e29ccbe2d5a85921b9c689e95bf9") (:revdesc . "2c8a57b9c619") (:keywords "cli" "argv") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (comment-dwim-2 . [(20241219 1643) ((emacs (28 1))) "An all-in-one comment command to rule them all" tar ((:url . "https://github.com/remyferre/comment-dwim-2") (:commit . "6ab75d0a690f0080e9b97c730aac817d04144cd0") (:revdesc . "6ab75d0a690f") (:keywords "convenience" "tools") (:authors ("Rémy Ferré" . "dev@remyferre.net")) (:maintainers ("Rémy Ferré" . "dev@remyferre.net")) (:maintainer "Rémy Ferré" . "dev@remyferre.net"))]) + (comment-or-uncomment-sexp . [(20190225 1122) ((emacs (24))) "Command for commenting the sexp under point" tar ((:url . "https://github.com/Malabarba/comment-or-uncomment-sexp") (:commit . "bec730d3fc1e6c17ff1339eb134af16c034a4d95") (:revdesc . "bec730d3fc1e") (:keywords "convenience") (:authors ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "artur@endlessparentheses.com"))]) + (comment-tags . [(20170910 1735) ((emacs (24 5))) "Highlight & navigate comment tags like 'TODO'" tar ((:url . "https://github.com/vincekd/comment-tags") (:commit . "7ae64a8d7aca098f360e03e9a3e780e27715c6e3") (:revdesc . "7ae64a8d7aca") (:keywords "convenience" "comments" "tags") (:authors ("Vincent Dumas" . "vincekd@gmail.com")) (:maintainers ("Vincent Dumas" . "vincekd@gmail.com")) (:maintainer "Vincent Dumas" . "vincekd@gmail.com"))]) + (commentary-theme . [(20240620 1307) ((emacs (24))) "A minimal theme with contrasting comments" tar ((:url . "https://github.com/pzel/commentary-theme") (:commit . "31e3724631d20fe5854cf522443a31fc12245ce3") (:revdesc . "31e3724631d2"))]) + (commenter . [(20160219 1627) ((emacs (24 4)) (let-alist (1 0 4))) "Multiline-comment support package" tar ((:url . "https://github.com/yuutayamada/commenter") (:commit . "6d1885419434ba779270c6fda0e30d390bb074bd") (:revdesc . "6d1885419434") (:keywords "comment") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (commify . [(20240131 1455) ((s (1 9 0))) "Toggle grouping commas in numbers" tar ((:url . "https://github.com/ddoherty03/commify") (:commit . "1245bfe420e92b4274bce3421ee59ea201e72aaa") (:revdesc . "1245bfe420e9") (:keywords "convenience" "editing" "numbers" "grouping" "commas") (:authors ("Daniel E. Doherty" . "ded-commify@ddoherty.net")) (:maintainers ("Daniel E. Doherty" . "ded-commify@ddoherty.net")) (:maintainer "Daniel E. Doherty" . "ded-commify@ddoherty.net"))]) + (common-lisp-snippets . [(20180226 1523) ((yasnippet (0 8 0))) "Yasnippets for Common Lisp" tar ((:url . "https://github.com/mrkkrp/common-lisp-snippets") (:commit . "1ddf808311ba4d9e8444a1cb50bd5ee75e4111f6") (:revdesc . "1ddf808311ba") (:keywords "snippets") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (communinfo . [(20250927 28) ((emacs (30))) "Community maintained Info-url-alist" tar ((:url . "https://codeberg.org/mekeor/communinfo") (:commit . "a562535f385f1ff7a154b01047e4e2c9efc2dd65") (:revdesc . "a562535f385f") (:keywords "docs") (:authors ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainers ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainer "Mekeor Melire" . "mekeor@posteo.de"))]) + (company . [(20251021 2211) ((emacs (26 1))) "Modular text completion framework" tar ((:url . "http://company-mode.github.io/") (:commit . "4ff89f7369227fbb89fe721d1db707f1af74cd0f") (:revdesc . "4ff89f736922") (:keywords "abbrev" "convenience" "matching") (:maintainers ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev"))]) + (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 ((:url . "https://github.com/proofit404/anaconda-mode") (:commit . "14867265e474f7a919120bbac74870c3256cbacf") (:revdesc . "14867265e474") (:keywords "convenience" "company" "anaconda") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com"))]) + (company-ansible . [(20240221 2255) ((emacs (24 4)) (company (0 8 12))) "A company back-end for ansible" tar ((:url . "https://github.com/krzysztof-magosa/company-ansible") (:commit . "338922601cf9e8ada863fe6f2dd9d5145d9983b0") (:revdesc . "338922601cf9") (:keywords "ansible") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainers ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl"))]) + (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 ((:url . "https://github.com/yuutayamada/company-arduino") (:commit . "5958b917cc5cc729dc64d74d947da5ee91c48980") (:revdesc . "5958b917cc5c") (:keywords "convenience" "development" "company") (:authors ("Yuta Yamada" . "sleepboy.zzz@gmail.com")) (:maintainers ("Yuta Yamada" . "sleepboy.zzz@gmail.com")) (:maintainer "Yuta Yamada" . "sleepboy.zzz@gmail.com"))]) + (company-auctex . [(20200529 1835) ((yasnippet (0 8 0)) (company (0 8 0)) (auctex (11 87))) "Company-mode auto-completion for AUCTeX" tar ((:url . "https://github.com/alexeyr/company-auctex/") (:commit . "9400a2ec7459dde8cbf1a5d50dfee4e300ed7e18") (:revdesc . "9400a2ec7459") (:authors ("Christopher Monsanto" . "chris@monsan.to") ("Alexey Romanov" . "alexey.v.romanov@gmail.com")) (:maintainers ("Christopher Monsanto" . "chris@monsan.to") ("Alexey Romanov" . "alexey.v.romanov@gmail.com")) (:maintainer "Christopher Monsanto" . "chris@monsan.to"))]) + (company-bibtex . [(20171105 644) ((company (0 9 0)) (cl-lib (0 5)) (parsebib (1 0))) "Company completion for bibtex keys" tar ((:url . "https://github.com/gbgar/company-bibtex") (:commit . "225c6f5c0c070c94c8cdbbd452ea548cd94d76f4") (:revdesc . "225c6f5c0c07") (:keywords "company-mode" "bibtex") (:authors ("GB Gardner" . "gbgar@users.noreply.github.com")) (:maintainers ("GB Gardner" . "gbgar@users.noreply.github.com")) (:maintainer "GB Gardner" . "gbgar@users.noreply.github.com"))]) + (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 ((:url . "https://github.com/sebastiencs/company-box") (:commit . "c4f2e243fba03c11e46b1600b124e036f2be7691") (:revdesc . "c4f2e243fba0") (:keywords "company" "completion" "front-end" "convenience") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainers ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is"))]) + (company-c-headers . [(20190825 1631) ((emacs (24 1)) (company (0 8))) "Company mode backend for C/C++ header files" tar ((:url . "https://github.com/randomphrase/company-c-headers") (:commit . "5e676ab0c2f287c868b1e3931afd4c78895910cd") (:revdesc . "5e676ab0c2f2") (:keywords "development" "company") (:authors ("Alastair Rankine" . "alastair@girtby.net")) (:maintainers ("Alastair Rankine" . "alastair@girtby.net")) (:maintainer "Alastair Rankine" . "alastair@girtby.net"))]) + (company-cabal . [(20170917 1317) ((cl-lib (0 5)) (company (0 8 0)) (emacs (24))) "Company-mode cabal backend" tar ((:url . "https://github.com/iquiw/company-cabal") (:commit . "62112a7259e24bd6c08885629a185afe512b7d3d") (:revdesc . "62112a7259e2") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com"))]) + (company-coq . [(20250806 1134) ((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 ((:url . "https://github.com/cpitclaudel/company-coq") (:commit . "78ed04ce39e925232a556d2077718cc7b215469c") (:revdesc . "78ed04ce39e9") (:keywords "convenience" "languages") (: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"))]) + (company-ctags . [(20240511 856) ((emacs (27 1)) (company (0 9 0))) "Fastest company-mode completion backend for ctags" tar ((:url . "https://github.com/redguardtoo/company-ctags") (:commit . "2e079a634afa5687bdb004e3883ac0671a222401") (:revdesc . "2e079a634afa") (:keywords "convenience") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (company-dcd . [(20241024 1152) ((company (0 9)) (flycheck-dmd-dub (0 7)) (yasnippet (0 8)) (popwin (0 7)) (cl-lib (0 5))) "Company backend for Dlang using DCD" tar ((:url . "http://github.com/tsukimizake/company-dcd") (:commit . "d1f0bf4ed3b86ba6e4173450d237185df37ef464") (:revdesc . "d1f0bf4ed3b8") (:keywords "languages") (:authors ("tsukimizake" . "shomasd_at_gmail.com")) (:maintainers ("tsukimizake" . "shomasd_at_gmail.com")) (:maintainer "tsukimizake" . "shomasd_at_gmail.com"))]) + (company-dict . [(20190302 5) ((emacs (24 4)) (company (0 8 12)) (parent-mode (2 3))) "A backend that emulates ac-source-dictionary" tar ((:url . "https://github.com/hlissner/emacs-company-dict") (:commit . "cd7b8394f6014c57897f65d335d6b2bd65dab1f4") (:revdesc . "cd7b8394f601") (:keywords "company" "dictionary" "ac-source-dictionary") (:authors ("Henrik Lissner" . "http://github/hlissner")) (:maintainers ("Henrik Lissner" . "henrik@lissner.net")) (:maintainer "Henrik Lissner" . "henrik@lissner.net"))]) + (company-distel . [(20180827 1344) ((distel-completion-lib (1 0 0))) "Erlang/distel completion backend for company-mode" tar ((:url . "github.com/sebastiw/distel-completion") (:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:revdesc . "acc4c0a55219") (:keywords "erlang" "distel" "company"))]) + (company-eask . [(20240329 1742) ((emacs (26 1)) (company (0 8 0)) (eask (0 1 0))) "Company backend for Eask-file" tar ((:url . "https://github.com/emacs-eask/company-eask") (:commit . "3d8973a70f01121cad052b352ec0a3d76d8110d2") (:revdesc . "3d8973a70f01") (:keywords "convenience") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (company-emoji . [(20240331 2127) ((cl-lib (0 5)) (company (0 8 0))) "Company-mode backend for emoji" tar ((:url . "https://codeberg.org/egirl/company-emoji") (:commit . "0b4371d8668712e71236e0f174bdd6d03c04aede") (:revdesc . "0b4371d86687") (:keywords "emoji" "company") (:authors ("Alex Dunn" . "git@garbage.world")) (:maintainers ("Alex Dunn" . "git@garbage.world")) (:maintainer "Alex Dunn" . "git@garbage.world"))]) + (company-emojify . [(20250101 1006) ((emacs (26 1)) (company (0 8 0)) (emojify (1 2 1)) (ht (2 0))) "Company completion for Emojify" tar ((:url . "https://github.com/jcs-elpa/company-emojify") (:commit . "7eff81607354feb9992ab6ff0f2c44c5a0dab229") (:revdesc . "7eff81607354") (:keywords "convenience" "emoji" "company" "emojify") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (company-erlang . [(20170123 538) ((emacs (24 4)) (ivy-erlang-complete (0 1)) (company (0 9 2))) "Company backend based on ivy-erlang-complete" tar ((:url . "https://github.com/s-kostyaev/company-erlang") (:commit . "bc0524a16f17b66c7397690e4ca0e004f09ea6c5") (:revdesc . "bc0524a16f17") (:keywords "tools") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru"))]) + (company-flow . [(20180225 2159) ((company (0 8 0)) (dash (2 13 0))) "Flow backend for company-mode" tar ((:url . "https://github.com/aaronjensen/company-flow") (:commit . "76ef585c70d2a3206c2eadf24ba61e59124c3a16") (:revdesc . "76ef585c70d2") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com"))]) + (company-flx . [(20180103 518) ((emacs (24)) (company (0 8 12)) (flx (0 5))) "Flx based fuzzy matching for company" tar ((:url . "https://github.com/PythonNut/company-flx") (:commit . "05efcafb488f587bb6e60923078d97227462eb68") (:revdesc . "05efcafb488f") (:keywords "convenience" "company" "fuzzy" "flx") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com"))]) + (company-forge . [(20251217 942) ((emacs (29 1)) (company (1 0 0)) (forge (0 5 0)) (ghub (4 3 0))) "Company backend for mentions and topics from forge" tar ((:url . "https://github.com/pkryger/company-forge.el") (:commit . "690410aff610b55dac4b43d02c8f549803d46e7a") (:revdesc . "690410aff610") (:keywords "convenience" "completion" "company" "forge") (:authors ("Przemyslaw Kryger" . "pkryger@gmail.com")) (:maintainers ("Przemyslaw Kryger" . "pkryger@gmail.com")) (:maintainer "Przemyslaw Kryger" . "pkryger@gmail.com"))]) + (company-fuzzy . [(20250602 1018) ((emacs (26 1)) (company (0 8 12)) (s (1 12 0)) (ht (2 0))) "Fuzzy matching for `company-mode'" tar ((:url . "https://github.com/jcs-elpa/company-fuzzy") (:commit . "e2da8ca84c9ba0a4fe6fa0ccdad83ce47aa14828") (:revdesc . "e2da8ca84c9b") (:keywords "matching" "auto-complete" "complete" "fuzzy") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (company-ghci . [(20190707 311) ((company (0 8 11)) (haskell-mode (13))) "Company backend which uses the current ghci process" tar ((:url . "https://github.com/horellana/company-ghci") (:commit . "a1d25652583ab4666c5a78cac18cd8039776b50d") (:revdesc . "a1d25652583a") (: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 ((:url . "https://github.com/guidoschmidt/company-glsl") (:commit . "3a40501ba831a30a7fd3e8529b20d1305d0454aa") (:revdesc . "3a40501ba831") (:authors ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainers ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc"))]) + (company-go . [(20170825 1643) ((company (0 8 0)) (go-mode (1 0 0))) "Company-mode backend for Go (using gocode)" tar ((:url . "https://github.com/emacsattic/company-go") (:commit . "31948b463f2fc18f8801e5a8fe511fef300eb3dd") (:revdesc . "31948b463f2f") (:keywords "languages") (:authors ("nsf" . "no.smile.face@gmail.com")) (:maintainers ("nsf" . "no.smile.face@gmail.com")) (:maintainer "nsf" . "no.smile.face@gmail.com"))]) + (company-inf-ruby . [(20140805 2054) ((company (0 6 10)) (inf-ruby (2 2 7)) (emacs (24 1))) "Company-mode completion back-end for inf-ruby" tar ((:url . "https://github.com/company-mode/company-inf-ruby") (:commit . "9c2eab3bb82e8838c54013026e6ffb51cccbd37e") (:revdesc . "9c2eab3bb82e") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainers ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru"))]) + (company-ipa . [(20210307 1838) ((emacs (24 3)) (company (0 8 12))) "IPA backend for company" tar ((:url . "https://github.com/mguzmann/company-ipa") (:commit . "8634021cac885f53f3274ef6dcce7eab19321046") (:revdesc . "8634021cac88") (:keywords "convenience" "company" "ipa") (:authors ("Matías Guzmán Naranjo" . "mguzmann89@gmail.com")) (:maintainers ("Matías Guzmán Naranjo" . "mguzmann89@gmail.com")) (:maintainer "Matías Guzmán Naranjo" . "mguzmann89@gmail.com"))]) + (company-irony . [(20190124 2346) ((emacs (24 1)) (company (0 8 0)) (irony (1 1 0)) (cl-lib (0 5))) "Company-mode completion back-end for irony-mode" tar ((:url . "https://github.com/Sarcasm/company-irony/") (:commit . "b44711dfce445610c1ffaec4951c6ff3882b216a") (:revdesc . "b44711dfce44") (:keywords "convenience") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainers ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu"))]) + (company-irony-c-headers . [(20151018 909) ((cl-lib (0 5)) (company (0 9 0)) (irony (0 2 0))) "Company mode backend for C/C++ header files with Irony" tar ((:url . "https://github.com/hotpxl/company-irony-c-headers") (:commit . "ba304fe7eebdff90bbc7dea063b45b82638427fa") (:revdesc . "ba304fe7eebd") (:keywords "c" "company") (:authors ("Yutian Li" . "hotpxless@gmail.com")) (:maintainers ("Yutian Li" . "hotpxless@gmail.com")) (:maintainer "Yutian Li" . "hotpxless@gmail.com"))]) + (company-jedi . [(20200324 25) ((emacs (24)) (cl-lib (0 5)) (company (0 8 11)) (jedi-core (0 2 7))) "Company-mode completion back-end for Python JEDI" tar ((:url . "https://github.com/emacsorphanage/company-jedi") (:commit . "a5a9f7ddf2770bbfad9e39a275053923fe82a200") (:revdesc . "a5a9f7ddf277") (:authors ("Boy" . "boyw165@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (company-ledger . [(20210910 250) ((emacs (24 3)) (company (0 8 0))) "Fuzzy auto-completion for Ledger & friends" tar ((:url . "https://github.com/debanjum/company-ledger") (:commit . "55fdddd6c5e9c061c685b474ef5e148a4ac9b576") (:revdesc . "55fdddd6c5e9") (:keywords "abbrev" "matching" "auto-complete" "beancount" "ledger" "company") (:authors ("Debanjum Singh Solanky" . "debanjumATgmailDOTcom")) (:maintainers ("Debanjum Singh Solanky" . "debanjumATgmailDOTcom")) (:maintainer "Debanjum Singh Solanky" . "debanjumATgmailDOTcom"))]) + (company-lua . [(20171108 2306) ((company (0 8 12)) (s (1 10 0)) (f (0 17 0)) (lua-mode (20151025))) "Company backend for Lua" tar ((:url . "https://github.com/ptrv/company-lua") (:commit . "29f6819de4d691e5fd0b62893a9f4fbc1c6fcb52") (:revdesc . "29f6819de4d6") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainers ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))]) + (company-manually . [(20200721 1903) ((emacs (24 3)) (company (0 9 0)) (ivy (0 13 0))) "A company backend that lets you manually build candidates" tar ((:url . "https://github.com/yanghaoxie/company-manually") (:commit . "b922318da821fc3cf1d3155f21d543ea8470c881") (:revdesc . "b922318da821") (:keywords "convenience" "company-mode" "manually build candidates") (:maintainers ("Yanghao Xie" . "yhaoxie@gmail.com")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com"))]) + (company-math . [(20221227 1329) ((company (0 8 0)) (math-symbol-lists (1 3))) "Completion backends for unicode math symbols and latex tags" tar ((:url . "https://github.com/vspinu/company-math") (:commit . "3eb006874e309ff4076d947fcbd61bb6806aa508") (:revdesc . "3eb006874e30") (:keywords "unicode" "symbols" "completion") (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainers ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com"))]) + (company-maxima . [(20230529 1026) ((emacs (25 1)) (maxima (0 6 1)) (seq (2 20)) (company (0 9 13))) "Maxima company integration" tar ((:url . "https://gitlab.com/sasanidas/maxima") (:commit . "b2bcf2e6997a5ab3502baba9143af44ac2cc2eb3") (:revdesc . "b2bcf2e6997a") (:keywords "languages" "tools" "convenience") (:maintainers ("Fermin Munoz" . "fmfs@posteo.net")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net"))]) + (company-nand2tetris . [(20171201 1813) ((nand2tetris (1 1 0)) (company (0 5)) (cl-lib (0 5 0))) "Company backend for nand2tetris major mode" tar ((:url . "http://www.github.com/CestDiego/nand2tetris.el/") (:commit . "fe37ee41367ceff6f7d7a472a5f80cf1285e1e01") (:revdesc . "fe37ee41367c") (:keywords "nand2tetris" "hdl" "company") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com"))]) + (company-native-complete . [(20240816 1648) ((emacs (26 1)) (company (0 9 0)) (native-complete (0 1 0))) "Company completion using native-complete" tar ((:url . "https://github.com/CeleritasCelery/emacs-native-shell-complete") (:commit . "452c8d429f51434f5d53bd9920b7c2d06bf559d9") (:revdesc . "452c8d429f51") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainers ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com"))]) + (company-nginx . [(20220210 1411) ((emacs (24)) (cl-lib (0)) (company (0))) "Company-mode keywords support for nginx-mode" tar ((:url . "https://repo.or.cz/company-nginx.git") (:commit . "8a9f1a5653fe2d9a5042bfb9377d54f37fcc64c8") (:revdesc . "8a9f1a5653fe") (:keywords "company" "nginx"))]) + (company-ngram . [(20170129 1913) ((cl-lib (0 5)) (company (0 8 0))) "N-gram based completion" tar ((:url . "https://github.com/kshramt/company-ngram") (:commit . "d15182df3eac72b29772802759b77c9eafef5066") (:revdesc . "d15182df3eac"))]) + (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 ((:url . "http://www.github.com/travisbhartwell/nix-emacs/") (:commit . "a4e1d9ea9f2e773170caa3afbe54ecdf73d04ec8") (:revdesc . "a4e1d9ea9f2e") (:keywords "unix") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com"))]) + (company-org-block . [(20230115 1202) ((emacs (25 1)) (company (0 8 0)) (org (9 2 0))) "Org blocks company backend" tar ((:url . "https://github.com/xenodium/company-org-block") (:commit . "aee601a2bfcc86d26e762eeb84e5e42573f8c5ca") (:revdesc . "aee601a2bfcc"))]) + (company-php . [(20240328 1036) ((cl-lib (0 5)) (ac-php-core (2 0)) (company (0 9))) "A company back-end for PHP" tar ((:url . "https://github.com/xcwen/ac-php") (:commit . "a69ae4a12e40900619b4e5a1613fd449aef649c3") (:revdesc . "a69ae4a12e40") (:keywords "completion" "convenience" "intellisense") (:authors ("jim" . "xcwenn@qq.com")))]) + (company-phpactor . [(20240407 1015) ((emacs (24 3)) (company (0 9 6)) (phpactor (0 1 0))) "A company-mode backend for Phpactor" tar ((:url . "https://github.com/emacs-php/phpactor.el") (:commit . "e488ed4c46489861c15d83a43e70eb7c352adc09") (:revdesc . "e488ed4c4648") (:keywords "tools" "php") (:authors ("Martin Tang" . "martin.tang365@gmail.com") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainers ("Martin Tang" . "martin.tang365@gmail.com") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainer "Martin Tang" . "martin.tang365@gmail.com"))]) + (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 ((:url . "https://gitlab.com/sasanidas/company-plisp") (:commit . "0e6941e1832faafb2176238339667edd482acd95") (:revdesc . "0e6941e1832f") (:keywords "company" "plisp" "convenience" "auto-completion") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainers ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net"))]) + (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 ((:url . "https://github.com/CeleritasCelery/company-plsense") (:commit . "b48e3181e08ec597269621d621aa06636f02d883") (:revdesc . "b48e3181e08e") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainers ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com"))]) + (company-pollen . [(20160812 1510) ((company (0 9 0)) (pollen-mode (1 0))) "Company-mode completion backend for pollen" tar ((:url . "https://github.com/lijunsong/pollen-mode") (:commit . "9779f7f13b1e0cfb58af01af5d8ee9e783bb8a43") (:revdesc . "9779f7f13b1e") (:keywords "languages" "pollen" "pollenpub" "company") (:authors ("Junsong Li" . "ljs.darkfishATGMAIL")))]) + (company-posframe . [(20230104 1229) ((emacs (26 0)) (company (0 9 0)) (posframe (0 9 0))) "Use a posframe as company candidate menu" tar ((:url . "https://github.com/tumashu/company-posframe") (:commit . "18d6641bba72cba3c00018cee737ea8b454f64a8") (:revdesc . "18d6641bba72") (:keywords "abbrev" "convenience" "matching") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (company-prescient . [(20250816 19) ((emacs (25 1)) (prescient (6 1 0)) (company (0 9 6))) "Prescient.el + Company" tar ((:url . "https://github.com/raxod502/prescient.el") (:commit . "87e2d2f2ddf24f591a5f70cc90d2afb4537caa18") (:revdesc . "87e2d2f2ddf2") (:keywords "extensions") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes"))]) + (company-qml . [(20170428 1708) ((qml-mode (0 1)) (company (0 8 12))) "Company backend for QML files" tar ((:url . "https://github.com/cute-jumper/company-qml") (:commit . "4af4f32a7ad86d86bb9293fb0b675aec513b5736") (:revdesc . "4af4f32a7ad8") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (company-quickhelp . [(20231026 1714) ((emacs (24 3)) (company (0 8 9)) (pos-tip (0 4 6))) "Popup documentation for completion candidates" tar ((:url . "https://www.github.com/expez/company-quickhelp") (:commit . "5bda859577582cc42d16fc0eaf5f7c8bedfd9e69") (:revdesc . "5bda85957758") (:keywords "company" "popup" "documentation" "quickhelp") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainers ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com"))]) + (company-quickhelp-terminal . [(20240101 1005) ((emacs (24 4)) (company-quickhelp (2 2 0)) (popup (0 5 3))) "Terminal support for `company-quickhelp'" tar ((:url . "https://github.com/jcs-elpa/company-quickhelp-terminal") (:commit . "1ea1dcc8696714f349df21e151bc66fb2cf396a8") (:revdesc . "1ea1dcc86967") (:keywords "convenience" "terminal" "extends" "support" "tip" "help") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (company-racer . [(20171205 310) ((emacs (24 4)) (cl-lib (0 5)) (company (0 8 0)) (deferred (0 3 1))) "Company integration for racer" tar ((:url . "https://github.com/emacs-pe/company-racer") (:commit . "a00381c9d416f375f783fcb6ae8d40669ce1f567") (:revdesc . "a00381c9d416") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (company-reftex . [(20210418 1316) ((emacs (25 1)) (s (1 12)) (company (0 8))) "Company backend based on RefTeX" tar ((:url . "https://github.com/TheBB/company-reftex") (:commit . "42eb98c6504e65989635d95ab81b65b9d5798e76") (:revdesc . "42eb98c6504e") (:keywords "bib" "tex" "company" "latex" "reftex" "references" "labels" "citations") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainers ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com"))]) + (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 ((:url . "https://github.com/iquiw/company-restclient") (:commit . "e5a3ec54edb44776738c13e13e34c85b3085277b") (:revdesc . "e5a3ec54edb4") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com"))]) + (company-rtags . [(20250804 1613) ((emacs (24 3)) (company (0 8 1)) (rtags (2 10))) "RTags back-end for company" tar ((:url . "https://github.com/Andersbakken/rtags") (:commit . "d46dfed0e0f175937658ee642b39db05e2ee1477") (:revdesc . "d46dfed0e0f1") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainers ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com"))]) + (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 ((:url . "https://github.com/Alexander-Miller/company-shell") (:commit . "5f959a63a6e66eb0cbdac3168cad523a62cc2ccd") (:revdesc . "5f959a63a6e6") (:keywords "company" "shell" "auto-completion") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (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 ((:url . "https://github.com/ethereum/emacs-solidity") (:commit . "93412f211fad7dfc3b02aa226856fc52b6a15c22") (:revdesc . "93412f211fad") (:keywords "solidity" "completion" "company") (:authors ("Samuel Smolkin" . "sam@future-precedent.org")) (:maintainers ("Samuel Smolkin" . "sam@future-precedent.org")) (:maintainer "Samuel Smolkin" . "sam@future-precedent.org"))]) + (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 ((:url . "https://github.com/nathankot/company-sourcekit") (:commit . "a1860ad4dd3a542acd2fa0dfac2a388cbdf4af0c") (:revdesc . "a1860ad4dd3a") (:keywords "abbrev") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainers ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com"))]) + (company-spell . [(20230906 1635) ((emacs (24 4)) (company (0 9 13))) "Autocompleting spelling for Company" tar ((:url . "https://github.com/enzuru/company-spell") (:commit . "f25b592c271dd1098ebe06b233b6ebb6fbeed488") (:revdesc . "f25b592c271d") (:keywords "wp"))]) + (company-stan . [(20211129 2051) ((emacs (24 3)) (company (0 9 10)) (stan-mode (10 3 0))) "A company-mode completion backend for stan" tar ((:url . "https://github.com/stan-dev/stan-mode/tree/master/company-stan") (:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:revdesc . "150bbbe5fd3a") (:keywords "languages") (:authors ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainers ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu"))]) + (company-statistics . [(20250805 1524) ((emacs (24 3)) (company (0 8 5))) "Sort candidates using completion history" tar ((:url . "https://github.com/company-mode/company-statistics") (:commit . "120e982f47e01945c044e0762ba376741c41b76c") (:revdesc . "120e982f47e0") (:keywords "abbrev" "convenience" "matching") (:authors ("Ingo Lohmar" . "i.lohmar@gmail.com")) (:maintainers ("Ingo Lohmar" . "i.lohmar@gmail.com")) (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com"))]) + (company-suggest . [(20200911 1845) ((company (0 9 0)) (emacs (25 1))) "Company-mode back-end for search engine suggests" tar ((:url . "https://github.com/juergenhoetzel/company-suggest") (:commit . "1c89c9de3852f07ce28b0bedf1fbf56fe6eedcdc") (:revdesc . "1c89c9de3852") (:keywords "completion" "convenience") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainers ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org"))]) + (company-tabnine . [(20230216 817) ((emacs (25)) (company (0 9 3)) (cl-lib (0 5)) (dash (2 16 0)) (s (1 12 0))) "A company-mode backend for TabNine" tar ((:url . "https://github.com/TommyX12/company-tabnine/") (:commit . "96d0c2c05450359ce90ee99a474991391988d2e6") (:revdesc . "96d0c2c05450") (:keywords "convenience") (:authors ("Tommy Xiang" . "tommyx058@gmail.com")) (:maintainers ("Tommy Xiang" . "tommyx058@gmail.com")) (:maintainer "Tommy Xiang" . "tommyx058@gmail.com"))]) + (company-terraform . [(20220509 1759) ((emacs (24 4)) (company (0 8 12)) (terraform-mode (0 6))) "A company backend for terraform" tar ((:url . "https://github.com/rafalcieslak/emacs-company-terraform") (:commit . "8d5a16d1bbeeb18ca49a8fd57b5d8cd30c8b8dc7") (:revdesc . "8d5a16d1bbee") (:keywords "abbrev" "convenience" "terraform" "company") (:authors ("Rafał Cieślak" . "rafalcieslak256@gmail.com")) (:maintainers ("Rafał Cieślak" . "rafalcieslak256@gmail.com")) (:maintainer "Rafał Cieślak" . "rafalcieslak256@gmail.com"))]) + (company-try-hard . [(20200417 1603) ((emacs (24 3)) (company (0 8 0)) (dash (2 0))) "Get all completions from company backends" tar ((:url . "https://github.com/Wilfred/company-try-hard") (:commit . "2b41136b5ed6e02032d99bcdb0599ecf00394fa5") (:revdesc . "2b41136b5ed6") (:keywords "matching") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (company-web . [(20220115 2146) ((company (0 8 0)) (dash (2 8 0)) (cl-lib (0 5 0)) (web-completion-data (0 1 0))) "Company version of ac-html, complete for web,html,emmet,jade,slim modes" tar ((:url . "https://github.com/osv/company-web") (:commit . "e0c6bfa3ae7006c73d0fdfc0fdb69816309baf1b") (:revdesc . "e0c6bfa3ae70") (:keywords "html" "company") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainers ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com"))]) + (company-wordfreq . [(20220405 2000) ((emacs (27 1)) (company (0 9))) "Company backend for human language texts" tar ((:url . "https://github.com/johannes-mueller/company-wordfreq.el") (:commit . "83569cf346c2320ef22f6a858e3424f771c4324e") (:revdesc . "83569cf346c2") (:keywords "company" "convenience" "matching") (:authors ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainers ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainer "Johannes Mueller" . "github@johannes-mueller.org"))]) + (company-ycm . [(20140904 1817) ((ycm (0 1))) "Company-ycm" tar ((:url . "https://github.com/neuromage/ycm.el") (:commit . "b2cb611503cf8d256fa19fc76362d7d5d9449d01") (:revdesc . "b2cb611503cf") (:keywords "abbrev") (:authors ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainers ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainer "Ajay Gopinathan" . "ajay@gopinathan.net"))]) + (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 ((:url . "https://github.com/abingham/emacs-ycmd") (:commit . "966594701c1eef1f6d4dad0c71c6d43a029977d7") (:revdesc . "966594701c1e"))]) + (compdef . [(20200304 611) ((emacs (24 4))) "A local completion definer" tar ((:url . "https://gitlab.com/jjzmajic/compdef") (:commit . "30fb5846ed851efee641ce8c5d8879ad36cd7ac6") (:revdesc . "30fb5846ed85") (:keywords "convenience"))]) + (competitive-programming-snippets . [(20201115 1702) ((emacs (26)) (yasnippet (0 8 0))) "Competitive Programming snippets for yasnippet" tar ((:url . "https://github.com/sei40kr/competitive-programming-snippets") (:commit . "3b43c1aeaa6676d1d3d0c47e78790db9bee150b6") (:revdesc . "3b43c1aeaa66") (:keywords "tools") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainers ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com"))]) + (compile-angel . [(20251116 2222) ((emacs (26 3))) "Automatically Compile Elisp files (auto-compile alternative)" tar ((:url . "https://github.com/jamescherti/compile-angel.el") (:commit . "95a0d01dc9c6eeac5023465fadf8ab82726df097") (:revdesc . "95a0d01dc9c6") (:keywords "convenience"))]) + (compile-multi . [(20250831 1542) ((emacs (28 1))) "A multi target interface to compile" tar ((:url . "https://github.com/mohkale/compile-multi") (:commit . "d111f99303ceb0354e37e2a5cd7f504d19f105f7") (:revdesc . "d111f99303ce") (:keywords "tools" "compile" "build") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe"))]) + (compile-multi-all-the-icons . [(20250101 2156) ((emacs (28 0)) (all-the-icons-completion (0 0 1))) "Affixate `compile-multi' with icons" tar ((:url . "https://github.com/mohkale/compile-multi") (:commit . "19d16d8871b5f19f5625e1a66c1dc46a7c3f6a3a") (:revdesc . "19d16d8871b5") (:keywords "tools" "compile" "build") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe"))]) + (compile-multi-embark . [(20250101 2156) ((emacs (28 1)) (compile-multi (0 4)) (embark (0 22 1))) "Integration for `compile-multi' and `embark'" tar ((:url . "https://github.com/mohkale/compile-multi") (:commit . "19d16d8871b5f19f5625e1a66c1dc46a7c3f6a3a") (:revdesc . "19d16d8871b5") (:keywords "project" "convenience") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe"))]) + (compile-multi-nerd-icons . [(20250101 2156) ((emacs (28 0)) (nerd-icons-completion (0 0 1))) "Affixate `compile-multi' with nerd icons" tar ((:url . "https://github.com/mohkale/compile-multi") (:commit . "19d16d8871b5f19f5625e1a66c1dc46a7c3f6a3a") (:revdesc . "19d16d8871b5") (:keywords "tools" "compile" "build") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe"))]) + (compiler-explorer . [(20251020 1212) ((emacs (28 1)) (plz (0 9)) (eldoc (1 15 0)) (map (3 3 1)) (seq (2 23))) "Compiler explorer client (godbolt.org)" tar ((:url . "https://github.com/mkcms/compiler-explorer.el") (:commit . "efad3b9f92098d2eb28d6ae47b71e8853f6dfb49") (:revdesc . "efad3b9f9209") (:keywords "c" "tools") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com"))]) + (composable . [(20220608 1148) ((emacs (25 1))) "Composable editing" tar ((:url . "https://github.com/paldepind/composable.el") (:commit . "205a69c64ea95ef67070423c31ed70ec44ec980c") (:revdesc . "205a69c64ea9") (:keywords "lisp") (:authors ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainers ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainer "Simon Friis Vindum" . "simon@vindum.io"))]) + (composer . [(20241016 1900) ((emacs (25 1)) (seq (1 9)) (php-runtime (0 1 0))) "Interface to PHP Composer" tar ((:url . "https://github.com/zonuexe/composer.el") (:commit . "6c7e19256ff964546cea682edd21446c465a663c") (:revdesc . "6c7e19256ff9") (:keywords "tools" "php" "dependency" "manager") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (comware-router-mode . [(20240103 907) ((dash (2 16 0)) (emacs (24 3))) "Major mode for editing Comware configuration files" tar ((:url . "https://github.com/daviderestivo/comware-router-mode") (:commit . "e1671efe5e0ade2dcbea0c17697d460cd8f0ba67") (:revdesc . "e1671efe5e0a") (:keywords "convenience" "faces") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it"))]) + (conan . [(20250919 1412) ((emacs (29 1)) (s (1 7 0)) (f (0 20 0))) "Generate flags for c++ using conan 2.0" tar ((:url . "https://github.com/Carl2/conan-elisp") (:commit . "0c3cca9e832e837a037f8c88438cca979891b131") (:revdesc . "0c3cca9e832e") (:keywords "tools"))]) + (concurrent . [(20170601 435) ((emacs (24 3)) (deferred (0 5 0))) "Concurrent utility functions for emacs lisp" tar ((:url . "https://github.com/kiwanami/emacs-deferred/blob/master/README-concurrent.markdown") (:commit . "d012a1ab50edcc2c44e3e49006f054dbff47cb6c") (:revdesc . "d012a1ab50ed") (:keywords "deferred" "async" "concurrent") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatkiwanami.net"))]) + (cond-let . [(20251101 1942) ((emacs (28 1))) "Additional and improved binding conditionals" tar ((:url . "https://github.com/tarsius/cond-let") (:commit . "288b7d36563223ebaf64cb220a3b270bdffb63f1") (:revdesc . "288b7d365632") (:keywords "extensions"))]) + (conda . [(20251201 2104) ((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 ((:url . "http://github.com/necaris/conda.el") (:commit . "82b9f77a7f7d5c6ea91e06c5bd54d8a43a75f977") (:revdesc . "82b9f77a7f7d") (:keywords "languages" "local" "tools" "python" "environment" "conda") (:authors ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainers ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainer "Rami Chowdhury" . "rami.chowdhury@gmail.com"))]) + (conda-project . [(20250415 1442) ((emacs (28 1)) (s (1 13 0)) (yaml (0 1 1)) (pythonic (0 2 0)) (transient (0 8 6))) "Work with conda-project environments" tar ((:url . "http://github.com/gilbertwong96/conda-project.el") (:commit . "21becf078e21cc98a5890dff9049928c4712c235") (:revdesc . "21becf078e21") (:keywords "python" "conda-project" "tools") (:authors ("Gilbert" . "gilbertwong96@icloud.com")) (:maintainers ("Gilbert" . "gilbertwong96@icloud.com")) (:maintainer "Gilbert" . "gilbertwong96@icloud.com"))]) + (config-general-mode . [(20251217 1842) nil "Config::General config file mode" tar ((:url . "https://codeberg.org/scip/config-general-mode") (:commit . "f92cc6d9b3f3cc49e58cea2b10ad3c2e8aced813") (:revdesc . "f92cc6d9b3f3") (:keywords "files") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainers ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org"))]) + (config-parser . [(20160426 1219) ((emacs (24 4))) "A library for parsing config file" tar ((:url . "https://github.com/lujun9972/el-config-parser") (:commit . "85d559e7889d8f5b98b8794b79426ae25ec3caa5") (:revdesc . "85d559e7889d") (:keywords "convenience" "config") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (conkeror-minor-mode . [(20150114 1604) nil "Mode for editing conkeror javascript files" tar ((:url . "http://github.com/Bruce-Connor/conkeror-minor-mode") (:commit . "476e81c27b056e21c192391fe674a2bf875466b0") (:revdesc . "476e81c27b05") (:keywords "programming" "tools") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (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 ((:url . "https://github.com/odanoburu/conllu-mode") (:commit . "0db3063572b0de08874822e20570bb153747e6ed") (:revdesc . "0db3063572b0") (:keywords "extensions") (:authors ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainers ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com"))]) + (connection . [(20191111 446) nil "TCP-based client connection" tar ((:url . "https://github.com/myrkr/dictionary-el") (:commit . "c9cad101100975e88873636bfd426b7a19304ebd") (:revdesc . "c9cad1011009") (:keywords "network") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainers ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net"))]) + (conner . [(20250726 1900) ((emacs (29 1))) "Define and run project specific commands" tar ((:url . "https://github.com/tralph3/conner") (:commit . "c87ada981743184ad21cd41def1405520651d626") (:revdesc . "c87ada981743") (:keywords "tools"))]) + (constant-theme . [(20180921 1012) ((emacs (24 1))) "A calm, dark, almost monochrome color theme" tar ((:url . "https://github.com/jannis/emacs-constant-theme") (:commit . "0feb9f99d708633d62fa548c953ebbe68fd70de0") (:revdesc . "0feb9f99d708") (:keywords "themes") (:authors ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainers ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainer "Jannis Pohlmann" . "contact@jannispohlmann.de"))]) + (consult . [(20251224 1132) ((emacs (29 1)) (compat (30))) "Consulting completing-read" tar ((:url . "https://github.com/minad/consult") (:commit . "9bb753c6fdf82c4e66f002a9399d4bd9657ee51a") (:revdesc . "9bb753c6fdf8") (:keywords "matching" "files" "completion") (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (consult-ag . [(20230227 406) ((emacs (27 1)) (consult (0 32))) "The silver searcher integration using Consult" tar ((:url . "https://github.com/yadex205/consult-ag") (:commit . "9eb4df265aedf2628a714610c2ade6d2f21de053") (:revdesc . "9eb4df265aed") (:authors ("Kanon Kakuno and contributors" . "yadex205@outlook.jp")) (:maintainers ("Kanon Kakuno and contributors" . "yadex205@outlook.jp")) (:maintainer "Kanon Kakuno and contributors" . "yadex205@outlook.jp"))]) + (consult-codesearch . [(20230315 1424) ((emacs (27 1)) (consult (0 20))) "Consult interface for codesearch" tar ((:url . "https://github.com/youngker/consult-codesearch") (:commit . "51df545bb57b468058245950322ae15f6c3a0ce2") (:revdesc . "51df545bb57b") (:keywords "tools") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com"))]) + (consult-company . [(20230606 1824) ((emacs (27 1)) (company (0 9)) (consult (0 9))) "Consult frontend for company" tar ((:url . "https://github.com/mohkale/consult-company") (:commit . "6e309fa9115c9ecd29aa27bff4e3b733979e5dbc") (:revdesc . "6e309fa9115c") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe"))]) + (consult-compile-multi . [(20250101 2156) ((emacs (28 1)) (compile-multi (0 4)) (consult (0 34))) "Consulting read support for `compile-multi'" tar ((:url . "https://github.com/mohkale/compile-multi") (:commit . "19d16d8871b5f19f5625e1a66c1dc46a7c3f6a3a") (:revdesc . "19d16d8871b5") (:keywords "tools" "compile" "build") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe"))]) + (consult-dash . [(20250114 1511) ((emacs (27 2)) (dash-docs (1 4 0)) (consult (0 16))) "Consult front-end for dash-docs" tar ((:url . "https://codeberg.org/ravi/consult-dash") (:commit . "edb57bf8cdbef422b88667fadc83e1bb046957a6") (:revdesc . "edb57bf8cdbe") (:keywords "consult" "dash" "docs") (:authors ("Ravi R Kiran" . "lists.ravi@gmail.com")) (:maintainers ("Ravi R Kiran" . "lists.ravi@gmail.com")) (:maintainer "Ravi R Kiran" . "lists.ravi@gmail.com"))]) + (consult-dir . [(20251020 416) ((emacs (26 1)) (project (0 3 0)) (consult (2 0))) "Insert paths into the minibuffer prompt" tar ((:url . "https://github.com/karthink/consult-dir") (:commit . "1497b46d6f48da2d884296a1297e5ace1e050eb5") (:revdesc . "1497b46d6f48") (:keywords "convenience") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com"))]) + (consult-eglot . [(20250831 924) ((emacs (27 1)) (eglot (1 16)) (consult (0 31)) (project (0 3 0))) "A consulting-read interface for eglot" tar ((:url . "https://github.com/mohkale/consult-eglot") (:commit . "d7296fef3f9c4280229df51f32fc0b5db2392c22") (:revdesc . "d7296fef3f9c") (:keywords "tools" "completion" "lsp") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")))]) + (consult-eglot-embark . [(20250831 925) ((emacs (27 1)) (consult-eglot (0 3)) (embark-consult (1 0))) "Embark integration for `consult-eglot'" tar ((:url . "https://github.com/mohkale/consult-eglot") (:commit . "d8b444aac39edfc6473ffbd228df3e9119451b51") (:revdesc . "d8b444aac39e") (:keywords "tools" "completion" "lsp") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")))]) + (consult-flycheck . [(20250923 1114) ((emacs (29 1)) (consult (2 8)) (flycheck (35))) "Provides the command `consult-flycheck'" tar ((:url . "https://github.com/minad/consult-flycheck") (:commit . "062e223bc6cf5f2126d7a107a35069c33c018c36") (:revdesc . "062e223bc6cf") (:keywords "languages" "tools" "completion") (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (consult-flyspell . [(20230322 204) ((emacs (25 1)) (consult (0 12))) "Consult integration for flyspell" tar ((:url . "https://gitlab.com/OlMon/consult-flyspell") (:commit . "7011e6634598530ea2d874e7e7389dc1bb94e1ca") (:revdesc . "7011e6634598") (:keywords "convenience"))]) + (consult-gh . [(20250915 2043) ((emacs (29 4)) (consult (2 0)) (markdown-mode (2 6)) (ox-gfm (1 0)) (yaml (1 2 0))) "Consulting GitHub Client" tar ((:url . "https://github.com/armindarvish/consult-gh") (:commit . "699af6c2b179c6a7888352e78413b7e3f76ae6ba") (:revdesc . "699af6c2b179") (:keywords "convenience" "matching" "tools" "vc"))]) + (consult-gh-embark . [(20250906 1805) ((emacs (29 4)) (consult (2 0)) (consult-gh (3 0)) (embark-consult (1 1)) (which-key (3 6 0))) "Embark Actions for consult-gh" tar ((:url . "https://github.com/armindarvish/consult-gh") (:commit . "2b625a0331c9a92c67fef8ea2e694b28d5006421") (:revdesc . "2b625a0331c9") (:keywords "matching" "git" "repositories" "forges" "completion"))]) + (consult-gh-forge . [(20250906 1805) ((emacs (29 4)) (consult (2 0)) (forge (0 3 3)) (consult-gh (3 0))) "Magit/Forge Integration for consult-gh" tar ((:url . "https://github.com/armindarvish/consult-gh") (:commit . "2b625a0331c9a92c67fef8ea2e694b28d5006421") (:revdesc . "2b625a0331c9") (:keywords "matching" "git" "repositories" "forges" "completion"))]) + (consult-gh-nerd-icons . [(20250915 2241) ((emacs (29 4)) (nerd-icons (0 1 0)) (consult-gh (3 0))) "Nerd icons integration for consult-gh" tar ((:url . "https://github.com/armindarvish/consult-gh") (:commit . "feba9c563f3919401c89dd4008d23ae0896c47ce") (:revdesc . "feba9c563f39") (:keywords "matching" "git" "repositories" "completion"))]) + (consult-gh-with-pr-review . [(20250906 1805) ((emacs (29 4)) (consult (2 0)) (pr-review (0 1)) (consult-gh (3 0))) "\"pr-review\" Integration for consult-gh" tar ((:url . "https://github.com/armindarvish/consult-gh") (:commit . "2b625a0331c9a92c67fef8ea2e694b28d5006421") (:revdesc . "2b625a0331c9") (:keywords "matching" "git" "repositories" "completion"))]) + (consult-ghq . [(20231111 1303) ((emacs (26 1)) (consult (0 8))) "Ghq interface using consult" tar ((:url . "https://github.com/tomoya/consult-ghq") (:commit . "65a99980fb313d473376542cb87464a8a44ff25e") (:revdesc . "65a99980fb31") (:keywords "convenience" "usability" "consult" "ghq") (:authors ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainers ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainer "Tomoya Otake" . "tomoya.ton@gmail.com"))]) + (consult-git-log-grep . [(20250317 1916) ((emacs (28 1)) (consult (1 9))) "Consult integration for git log grep" tar ((:url . "https://github.com/Ghosty141/consult-git-log-grep") (:commit . "5b1669ebaff9a91000ea185264cfcb850885d21f") (:revdesc . "5b1669ebaff9") (:keywords "git" "convenience"))]) + (consult-hatena-bookmark . [(20250421 1501) ((emacs (27 1)) (consult (2 0))) "Consult commands for the Hatena Bookmark" tar ((:url . "https://github.com/Nyoho/consult-hatena-bookmark") (:commit . "8f2e48688455711df89533a7fe5af1d9cd02c137") (:revdesc . "8f2e48688455"))]) + (consult-hn . [(20250716 104) ((emacs (29 4)) (consult (2 0)) (ts (0 3)) (transient (0 9))) "Hacker News search with Consult" tar ((:url . "https://github.com/agzam/consult-hn") (:commit . "7e02d69296b880dd0cfbdaed45c0365d6daca647") (:revdesc . "7e02d69296b8") (:keywords "search" "extensions") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com"))]) + (consult-ls-git . [(20250419 1320) ((emacs (27 1)) (consult (0 16))) "Consult integration for git" tar ((:url . "https://github.com/rcj/consult-ls-git") (:commit . "85882e4b7af9ad40160d985e42b36b0fd6400ead") (:revdesc . "85882e4b7af9") (:keywords "convenience"))]) + (consult-lsp . [(20251025 719) ((emacs (27 1)) (lsp-mode (5 0)) (consult (1 9)) (f (0 20 0))) "LSP-mode Consult integration" tar ((:url . "https://github.com/gagbo/consult-lsp") (:commit . "d11102c9db33c4ca7817296a2edafc3e26a61117") (:revdesc . "d11102c9db33") (:keywords "tools" "completion" "lsp"))]) + (consult-notes . [(20251117 1511) ((emacs (27 1)) (consult (0 17)) (s (1 12 0)) (dash (2 19))) "Manage notes with consult" tar ((:url . "https://github.com/mclear-tools/consult-notes") (:commit . "3c11379514718db365a377ac8e4503d1ea4674a8") (:revdesc . "3c1137951471") (:keywords "convenience") (:authors ("Colin McLear" . "mclear@fastmail.com")))]) + (consult-notmuch . [(20250815 1739) ((emacs (28 1)) (consult (2 7)) (notmuch (0 31))) "Notmuch search using consult" tar ((:url . "https://codeberg.org/jao/consult-notmuch") (:commit . "abc0318c9971b4288cc96f6f934ad6d36e63d9f9") (:revdesc . "abc0318c9971") (:keywords "mail") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")))]) + (consult-org-roam . [(20251116 1230) ((emacs (27 1)) (org-roam (2 2 0)) (consult (0 16))) "Consult integration for org-roam" tar ((:url . "https://github.com/jgru/consult-org-roam") (:commit . "7d825fffd6f990b800485376f62dd9b277991709") (:revdesc . "7d825fffd6f9") (:authors ("jgru" . "https://github.com/jgru")) (:maintainers ("jgru" . "https://github.com/jgru")) (:maintainer "jgru" . "https://github.com/jgru"))]) + (consult-project-extra . [(20250926 603) ((emacs (28 1)) (consult (0 17)) (project (0 8 1))) "Consult integration for project.el" tar ((:url . "https://github.com/Qkessler/consult-project-extra") (:commit . "8067e2c0ca29432514dabfb47a45cf1132a03789") (:revdesc . "8067e2c0ca29") (:keywords "convenience" "project" "management"))]) + (consult-projectile . [(20230821 406) ((emacs (25 1)) (consult (0 12)) (projectile (2 5 0))) "Consult integration for projectile" tar ((:url . "https://gitlab.com/OlMon/consult-projectile") (:commit . "400439c56d17bca7888f7d143d8a11f84900a406") (:revdesc . "400439c56d17") (:keywords "convenience"))]) + (consult-recoll . [(20250205 1712) ((emacs (26 1)) (consult (2 0))) "Recoll queries using consult" tar ((:url . "https://codeberg.org/jao/consult-recoll") (:commit . "eddbc7ba70439881e4781fa73fb0fb240e02fd3b") (:revdesc . "eddbc7ba7043") (:keywords "docs" "convenience") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org"))]) + (consult-spotify . [(20211114 2258) ((emacs (26 1)) (consult (0 8)) (espotify (0 1))) "Spotify queries using consult" tar ((:url . "https://codeberg.org/jao/espotify") (:commit . "5c1dcf0182135cda4191d4ba206fe2f265100293") (:revdesc . "5c1dcf018213") (:keywords "multimedia") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")))]) + (consult-tex . [(20250306 1724) ((emacs (28 2)) (consult (0 35))) "Consult powered completion for tex" tar ((:url . "https://gitlab.com/titus.pinta/consult-TeX") (:commit . "546e4b16a3f98fa1d4d440acb158b8fa5147a14c") (:revdesc . "546e4b16a3f9") (:keywords "consult" "tex" "latex") (:maintainers ("Titus Pinta" . "titus.pinta@gmail.com")) (:maintainer "Titus Pinta" . "titus.pinta@gmail.com"))]) + (consult-todo . [(20250417 1903) ((emacs (29 1)) (consult (1 9)) (hl-todo (3 8 2))) "Search hl-todo keywords in consult" tar ((:url . "https://github.com/eki3z/consult-todo") (:commit . "f9ba063a6714cb95ddbd886786ada93771f3c140") (:revdesc . "f9ba063a6714") (:authors ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz95@gmail.com"))]) + (consult-vc-modified-files . [(20250724 2218) ((emacs (28 1)) (consult (0 9))) "Show git modified files with consult and vc" tar ((:url . "https://github.com/chmouel/consult-vc-modified-files") (:commit . "06837dc61a3b8f38dec0ad62b33293fc50ca03d2") (:revdesc . "06837dc61a3b") (:keywords "vc" "convenience") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainers ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com"))]) + (consult-yasnippet . [(20250411 1922) ((emacs (27 1)) (yasnippet (0 14)) (consult (0 16))) "A consulting-read interface for yasnippet" tar ((:url . "https://github.com/mohkale/consult-yasnippet") (:commit . "a3482dfbdcbe487ba5ff934a1bb6047066ff2194") (:revdesc . "a3482dfbdcbe") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainers ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe"))]) + (context-transient . [(20240530 1344) ((emacs (29 1))) "Context specific transients" tar ((:url . "https://github.com/licht1stein/context-transient.el") (:commit . "4461c3a5b8654cb1dacea404f78951172437804f") (:revdesc . "4461c3a5b865") (:authors ("Mykhaylo Bilyanskyy" . "mb@m1k.pw")) (:maintainers ("Mykhaylo Bilyanskyy" . "mb@m1k.pw")) (:maintainer "Mykhaylo Bilyanskyy" . "mb@m1k.pw"))]) + (contextual . [(20180726 800) ((emacs (24)) (dash (2 12 1)) (cl-lib (0 5))) "Contextual profile management system" tar ((:url . "https://github.com/lshift-de/contextual") (:commit . "7ad2bb36426fd182d4d5ee7fd9be1cc0db8c7a84") (:revdesc . "7ad2bb36426f") (:keywords "convenience" "tools") (:authors ("Alexander Kahl" . "ak@sodosopa.io")) (:maintainers ("Alexander Kahl" . "ak@sodosopa.io")) (:maintainer "Alexander Kahl" . "ak@sodosopa.io"))]) + (contextual-menubar . [(20180205 709) nil "Display the menubar only on a graphical display" tar ((:url . "https://github.com/aaronjensen/contextual-menubar") (:commit . "f76f55232ac07df76ef9a334a0c527dfab97c40b") (:revdesc . "f76f55232ac0") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com"))]) + (contrast-color . [(20160903 1807) ((emacs (24 3)) (cl-lib (0 5))) "Pick best contrast color for you" tar ((:url . "https://github.com/yuutayamada/contrast-color-el") (:commit . "6ff1b807e09ef6a775e4ab1032bb2ea3fc442d9e") (:revdesc . "6ff1b807e09e") (:keywords "color" "convenience") (:authors ("Yuta Yamada" . "cokesboy[at]gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy[at]gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy[at]gmail.com"))]) + (control-mode . [(20160624 1710) nil "A \"control\" mode, similar to vim's \"normal\" mode" tar ((:url . "https://github.com/stephendavidmarsh/control-mode") (:commit . "6bf487144119b03f9cc54168f70e3d7d8d84e22b") (:revdesc . "6bf487144119") (:keywords "convenience" "emulations") (:authors ("Stephen Marsh" . "stephen.david.marsh@gmail.com")) (:maintainers ("Stephen Marsh" . "stephen.david.marsh@gmail.com")) (:maintainer "Stephen Marsh" . "stephen.david.marsh@gmail.com"))]) + (conventional . [(20250630 600) ((emacs (28 1))) "Enable conventional syntax" tar ((:url . "https://github.com/KeyWeeUsr/conventional") (:commit . "d4172953ddb8239108014ee82164892f08371b3b") (:revdesc . "d4172953ddb8") (:keywords "convenience" "conventional" "mode" "helper" "git" "comment" "commit") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (cool-mode . [(20231026 456) ((emacs (25))) "Major mode for cool compiler language" tar ((:url . "https://github.com/nverno/cool-mode") (:commit . "46b6a38a99a954c5e77e90506eafec4092690692") (:revdesc . "46b6a38a99a9") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (copilot . [(20251210 1016) ((emacs (27 2)) (editorconfig (0 8 2)) (jsonrpc (1 0 14)) (f (0 20 0)) (track-changes (1 4))) "An unofficial Copilot plugin" tar ((:url . "https://github.com/copilot-emacs/copilot.el") (:commit . "7ee4758bb748beac7d29e62de5d2e752ebafb858") (:revdesc . "7ee4758bb748") (:keywords "convenience" "copilot") (:authors ("zerol" . "z@zerol.me")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com") ("Rakotomandimby Mihamina" . "mihamina.rakotomandimby@rktmb.org") ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (copilot-chat . [(20251211 520) ((emacs (29 1)) (aio (1 0)) (request (0 3 2)) (transient (0 8 3)) (polymode (0 2 2)) (org (9 4 6)) (markdown-mode (2 6)) (shell-maker (0 76 2)) (mcp (0 1 0))) "Copilot chat interface" tar ((:url . "https://github.com/chep/copilot-chat.el") (:commit . "ca446c226f08ae13fa6d173f4e3094a2e54adf09") (:revdesc . "ca446c226f08") (:keywords "convenience" "tools") (:authors ("cedric.chepied" . "cedric.chepied@gmail.com")) (:maintainers ("cedric.chepied" . "cedric.chepied@gmail.com")) (:maintainer "cedric.chepied" . "cedric.chepied@gmail.com"))]) + (copy-as-format . [(20231112 1710) ((cl-lib (0 5))) "Copy buffer locations as GitHub/Slack/JIRA etc... formatted code" tar ((:url . "https://github.com/sshaw/copy-as-format") (:commit . "b9f6f725ca9701c5a02bfb479573fdfcce2e1e30") (:revdesc . "b9f6f725ca97") (:keywords "github" "slack" "jira" "telegram" "gitlab" "bitbucket" "org-mode" "pod" "rst" "asciidoc" "whatsapp" "tools" "convenience") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com"))]) + (copy-file-on-save . [(20230402 1829) ((emacs (24 3)) (compat (29))) "Copy file on save, automatic deployment it" tar ((:url . "https://github.com/emacs-php/emacs-auto-deployment") (:commit . "370b1586feb2690d3c72185bd4f17c31ce03673a") (:revdesc . "370b1586feb2") (:keywords "files" "comm" "deploy") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (copyit . [(20241030 543) ((emacs (24 3)) (s (1 9 0))) "Copy it, yank anything!" tar ((:url . "https://github.com/zonuexe/emacs-copyit") (:commit . "09556ba8407dc2b132b7f76cd1b458c0773a1fe8") (:revdesc . "09556ba8407d") (:keywords "convenience" "yank" "clipboard") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (copyit-pandoc . [(20190919 1258) ((emacs (24 3)) (copyit (0 1 0)) (pandoc (0 0 1))) "Copy it, yank anything!" tar ((:url . "https://github.com/zonuexe/emacs-copyit") (:commit . "c4f2c28e5b6270e8e3364341619f1154bb4e682e") (:revdesc . "c4f2c28e5b62") (:keywords "convenience" "yank" "clipboard") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (coq-commenter . [(20170822 2309) ((dash (2 13 0)) (s (1 11 0)) (cl-lib (0 5))) "Coq commenting minor mode for proof" tar ((:url . "http://github.com/ailrun/coq-commenter") (:commit . "7fe9a2cc0ebdb0b1e54a24eb7971d757fb588ac3") (:revdesc . "7fe9a2cc0ebd") (:keywords "comment" "coq" "proof") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainers ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com"))]) + (corfu . [(20251223 2212) ((emacs (29 1)) (compat (30))) "COmpletion in Region FUnction" tar ((:url . "https://github.com/minad/corfu") (:commit . "0198f34f29a598c05c4b95dc3dfb8391f572d7d4") (:revdesc . "0198f34f29a5") (:keywords "abbrev" "convenience" "matching" "completion" "text") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (corfu-candidate-overlay . [(20240322 1814) ((emacs (28 1)) (corfu (0 36))) "Show first candidate in an overlay while typing" tar ((:url . "https://code.bsdgeek.org/adam/corfu-candidate-overlay/") (:commit . "f730de2c150720ee70d4d7be4b8bb533c7dfc97e") (:revdesc . "f730de2c1507") (:authors ("Adam Kruszewski" . "adam@kruszewski.name")) (:maintainers ("Adam Kruszewski" . "adam@kruszewski.name")) (:maintainer "Adam Kruszewski" . "adam@kruszewski.name"))]) + (corfu-prescient . [(20250816 19) ((emacs (27 1)) (prescient (6 1 0)) (corfu (1 1))) "Prescient.el + Corfu" tar ((:url . "https://github.com/radian-software/prescient.el") (:commit . "87e2d2f2ddf24f591a5f70cc90d2afb4537caa18") (:revdesc . "87e2d2f2ddf2") (:keywords "extensions") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes"))]) + (corral . [(20160502 948) nil "Quickly surround text with delimiters" tar ((:url . "http://github.com/nivekuil/corral") (:commit . "e7ab6aa118e46b93d4933d1364bc273f57cd6911") (:revdesc . "e7ab6aa118e4") (:authors ("Kevin Liu" . "mail@nivekuil.com")) (:maintainers ("Kevin Liu" . "mail@nivekuil.com")) (:maintainer "Kevin Liu" . "mail@nivekuil.com"))]) + (corsair . [(20241018 1015) ((emacs (28 1)) (gptel (0 9 0))) "Text accumulation enhancements for GPTel" tar ((:url . "https://github.com/rob137/Corsair") (:commit . "f750a435d6be68f0d75dc5a90f8aa3cb58e8c16a") (:revdesc . "f750a435d6be") (:keywords "convenience" "tools") (:authors ("Robert Kirby" . "corsair.el.package@gmail.com")) (:maintainers ("Robert Kirby" . "corsair.el.package@gmail.com")) (:maintainer "Robert Kirby" . "corsair.el.package@gmail.com"))]) + (cort . [(20241019 936) ((emacs (24 1)) (ansi (0 4)) (cl-lib (0 6))) "Simplify extended unit test framework" tar ((:url . "https://github.com/conao3/cort.el") (:commit . "262966c9bc7fd3aa7bcf2dc3b9edc286c7f19e58") (:revdesc . "262966c9bc7f") (:keywords "test" "lisp") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (cosmo . [(20170922 744) ((emacs (24 4))) "Cosmological Calculator" tar ((:url . "https://gitlab.com/montanari/cosmo-el") (:commit . "dd83b09a49a2843606b28279b674b2207040b36b") (:revdesc . "dd83b09a49a2") (:keywords "tools") (:authors ("Francesco Montanari" . "fmnt@fmnt.info")) (:maintainers ("Francesco Montanari" . "fmnt@fmnt.info")) (:maintainer "Francesco Montanari" . "fmnt@fmnt.info"))]) + (counsel . [(20250329 1401) ((emacs (24 5)) (ivy (0 15 1)) (swiper (0 15 1))) "Various completion functions using Ivy" tar ((:url . "https://github.com/abo-abo/swiper") (:commit . "e33b028ed4b1258a211c87fd5fe801bed25de429") (:revdesc . "e33b028ed4b1") (:keywords "convenience" "matching" "tools") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net"))]) + (counsel-ag-popup . [(20210121 805) ((emacs (26 1)) (counsel (0 13 0)) (transient (0 3 0))) "Interactive search with counsel-ag" tar ((:url . "https://github.com/gexplorer/counsel-ag-popup") (:commit . "41d85fe36edd72da68f5009ad9cf9013cd19960d") (:revdesc . "41d85fe36edd") (:keywords "convenience" "matching" "tools") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainers ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com"))]) + (counsel-at-point . [(20240616 2345) ((emacs (29 1)) (counsel (0 13 0))) "Context sensitive project search" tar ((:url . "https://codeberg.org/ideasman42/emacs-counsel-at-point") (:commit . "7da3813fe01e5a7a651632b1af031891c009b559") (:revdesc . "7da3813fe01e") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (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 ((:url . "https://github.com/redguard/counsel-bbdb") (:commit . "ccae56b0551abb305cad087d85f1b6a97adb7c0f") (:revdesc . "ccae56b0551a") (:keywords "mail" "abbrev" "convenience" "matching") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (counsel-chrome-bm . [(20211022 1427) ((emacs (25 1)) (counsel (0 13 0))) "Browse Chrom(e/ium) bookmarks with Ivy" tar ((:url . "https://github.com/BlueBoxWare/counsel-chrome-bm") (:commit . "3321bf78231e443cb98520dbb30a6c49e004c6a7") (:revdesc . "3321bf78231e") (:keywords "hypermedia") (:authors ("BlueBoxWare" . "(BlueBoxWare@users.noreply.github.com)")) (:maintainers ("BlueBoxWare" . "(BlueBoxWare@users.noreply.github.com)")) (:maintainer "BlueBoxWare" . "(BlueBoxWare@users.noreply.github.com)"))]) + (counsel-codesearch . [(20180925 803) ((codesearch (1)) (counsel (0 10 0)) (emacs (24)) (ivy (0 10 0))) "Counsel interface for codesearch.el" tar ((:url . "https://github.com/abingham/emacs-counsel-codesearch") (:commit . "b7989fad3e06f301c31d5e896c42b6cc549a0e0c") (:revdesc . "b7989fad3e06") (:keywords "tools") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (counsel-css . [(20211115 1755) ((emacs (24 4)) (counsel (0 7 0)) (cl-lib (0 5))) "Stylesheet-selector-aware swiper" tar ((:url . "https://github.com/hlissner/emacs-counsel-css") (:commit . "8e9c0515fc952452eee786d8ebb43d48ea86c9f8") (:revdesc . "8e9c0515fc95") (:keywords "convenience" "tools" "counsel" "swiper" "selector" "css" "less" "scss") (:authors ("Henrik Lissner" . "http://github/hlissner")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io"))]) + (counsel-dash . [(20221217 419) ((emacs (24 4)) (dash-docs (1 4 0)) (counsel (0 8 0)) (cl-lib (0 5))) "Browse dash docsets using Ivy" tar ((:url . "https://github.com/nathankot/counsel-dash") (:commit . "04117bffc8badd85c9f4fdb17648fd56e83fe832") (:revdesc . "04117bffc8ba") (:keywords "dash" "ivy" "counsel") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainers ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com"))]) + (counsel-edit-mode . [(20230411 1740) ((emacs (26 1)) (ht (2 3)) (s (1 12 0)) (counsel (0 10 0))) "Edit results of counsel commands in-place" tar ((:url . "https://github.com/tyler-dodge/counsel-edit-mode") (:commit . "8ff508a864d0fe4cac32c6868420df2ad77f041b") (:revdesc . "8ff508a864d0") (:keywords "convenience" "matching"))]) + (counsel-etags . [(20251204 1415) ((emacs (26 1)) (counsel (0 13 4))) "Fast and complete Ctags/Etags solution using ivy" tar ((:url . "http://github.com/redguardtoo/counsel-etags") (:commit . "476196a7e82dc118ec2c659658c3fc71d5f2ee60") (:revdesc . "476196a7e82d") (:keywords "tools" "convenience") (:authors ("Chen Bin" . "chenbindotshATgmaildotcom")) (:maintainers ("Chen Bin" . "chenbindotshATgmaildotcom")) (:maintainer "Chen Bin" . "chenbindotshATgmaildotcom"))]) + (counsel-fd . [(20221011 1853) ((counsel (0 12 0))) "Counsel interface for fd" tar ((:url . "https://github.com/CsBigDataHub/counsel-fd") (:commit . "7c1e413e4ce44df2232c19ebe3357ac8ec33cb3b") (:revdesc . "7c1e413e4ce4") (:keywords "tools"))]) + (counsel-ffdata . [(20191017 1237) ((emacs (25 1)) (counsel (0 11 0)) (emacsql (3 0 0))) "Use ivy to access firefox data" tar ((:url . "https://github.com/cireu/counsel-ffdata") (:commit . "913cb1b8cd5e4ca2ba6613eab56d52040e08a0a5") (:revdesc . "913cb1b8cd5e") (:keywords "convenience" "tools" "matching") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainers ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com"))]) + (counsel-gtags . [(20210222 1803) ((emacs (25 1)) (counsel (0 8 0)) (seq (1 0))) "Ivy for GNU global" tar ((:url . "https://github.com/FelipeLema/emacs-counsel-gtags") (:commit . "1d52eaeffeb60266434d4f7416a108ca058fde91") (:revdesc . "1d52eaeffeb6") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com") ("Felipe Lema" . "felipelema@mortemale.org") ("Jimmy Aguilar Mena" . "spacibba@aol.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com") ("Felipe Lema" . "felipelema@mortemale.org") ("Jimmy Aguilar Mena" . "spacibba@aol.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (counsel-jq . [(20210329 749) ((swiper (0 12 0)) (ivy (0 12 0)) (emacs (24 1))) "Live preview of \"jq\" queries using counsel" tar ((:url . "https://github.com/200ok-ch/counsel-jq") (:commit . "8cadd2e96470402ede4881b4e955872976443689") (:revdesc . "8cadd2e96470") (:keywords "convenience" "data" "matching") (:authors ("Alain M. Lafon" . "alain@200ok.ch")) (:maintainers ("Alain M. Lafon" . "alain@200ok.ch")) (:maintainer "Alain M. Lafon" . "alain@200ok.ch"))]) + (counsel-mairix . [(20210422 649) ((emacs (26 3)) (ivy (0 13 1))) "Counsel interface for Mairix" tar ((:url . "https://sr.ht/~ane/counsel-mairix") (:commit . "39fa2ad10a5f899cb3f3275f9a6ebd166c51216a") (:revdesc . "39fa2ad10a5f") (:keywords "mail") (:authors ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainers ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainer "Antoine Kalmbach" . "ane@iki.fi"))]) + (counsel-notmuch . [(20181203 935) ((emacs (24)) (ivy (0 10 0)) (notmuch (0 21)) (s (1 12 0))) "Search emails in Notmuch asynchronously with Ivy" tar ((:url . "https://github.com/fuxialexander/counsel-notmuch") (:commit . "a4a1562935e4180c42524c51609d1283e9be0688") (:revdesc . "a4a1562935e4") (:keywords "mail") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainers ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexander@gmail.com"))]) + (counsel-org-capture-string . [(20200810 1114) ((emacs (25 1)) (ivy (0 13))) "Counsel for org-capture-string" tar ((:url . "https://github.com/akirak/counsel-org-capture-string") (:commit . "f47de69458c9fceeecd7c69264f645c0cfeb2cd2") (:revdesc . "f47de69458c9") (:keywords "outlines") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (counsel-org-clock . [(20200810 1109) ((emacs (25 1)) (ivy (0 10 0)) (dash (2 0))) "Counsel commands for org-clock" tar ((:url . "https://github.com/akirak/counsel-org-clock") (:commit . "a32bb85205e877cc57f62765c225e8b288536918") (:revdesc . "a32bb85205e8") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (counsel-osx-app . [(20160821 809) ((ivy (0 8 0)) (emacs (24 3))) "Launch osx applications via ivy interface" tar ((:url . "https://github.com/d12frosted/counsel-osx-app") (:commit . "5cc93ec684f837dc31ce20e7625407f2c0445691") (:revdesc . "5cc93ec684f8") (:authors ("Boris Buliga" . "d12frosted@gmail.com")) (:maintainers ("Boris Buliga" . "d12frosted@gmail.com")) (:maintainer "Boris Buliga" . "d12frosted@gmail.com"))]) + (counsel-projectile . [(20211004 2003) ((counsel (0 13 4)) (projectile (2 5 0))) "Ivy integration for Projectile" tar ((:url . "https://github.com/ericdanan/counsel-projectile") (:commit . "e30150792a96968f55f34638cbfe63eaa30839cc") (:revdesc . "e30150792a96") (:keywords "project" "convenience"))]) + (counsel-pydoc . [(20171018 2042) ((emacs (24 3)) (ivy (0 9 1))) "Run pydoc with counsel" tar ((:url . "https://github.com/co-dh/pydoc_utils") (:commit . "08a4a1020da3d06604156303024c8a5e31ec36e4") (:revdesc . "08a4a1020da3") (:keywords "completion" "matching") (:authors ("Hao" . "Deng(denghao8888@gmail.com)")) (:maintainers ("Hao" . "Deng(denghao8888@gmail.com)")) (:maintainer "Hao" . "Deng(denghao8888@gmail.com)"))]) + (counsel-spotify . [(20200818 2055) ((emacs (25 1)) (ivy (0 13 0))) "Control Spotify search and select music with Ivy" tar ((:url . "https://github.com/Lautaro-Garcia/counsel-spotify") (:commit . "2743ad52a9def53534fd505397fbe1ac49e53015") (:revdesc . "2743ad52a9de") (:authors ("Lautaro García" . "https://github.com/Lautaro-Garcia")) (:maintainers ("Lautaro García" . "https://github.com/Lautaro-Garcia")) (:maintainer "Lautaro García" . "https://github.com/Lautaro-Garcia"))]) + (counsel-test . [(20190819 1920) ((emacs (25 1)) (ivy (0 11 0)) (s (1 12 0))) "Browse and execute tests with ivy" tar ((:url . "http://github.com/xmagpie/counsel-test") (:commit . "f0ea446def59a3a8ca40e868fe9d82de268b2abe") (:revdesc . "f0ea446def59") (:keywords "tools" "ivy" "counsel" "testing" "ctest" "pytest"))]) + (counsel-toki . [(20230705 1638) ((request (0 3 3)) (emacs (25 1)) (ivy (0 14 0))) "Counsel support for toki pona dictionary lookup" tar ((:url . "https://github.com/emiflake/counsel-toki") (:commit . "545aa4413ba8ce6a92d11d42e910a57a8cb58e2e") (:revdesc . "545aa4413ba8") (:authors ("Emily Martins" . "emi@haskell.fyi")) (:maintainers ("Emily Martins" . "emi@haskell.fyi")) (:maintainer "Emily Martins" . "emi@haskell.fyi"))]) + (counsel-tramp . [(20230714 936) ((emacs (24 3)) (counsel (0 10))) "Tramp ivy interface for ssh, docker, vagrant" tar ((:url . "https://github.com/masasam/emacs-counsel-tramp") (:commit . "70dcc6b9da5e76fefbc92646e7d780b2a06ca93f") (:revdesc . "70dcc6b9da5e"))]) + (counsel-web . [(20210609 2156) ((emacs (25 1)) (counsel (0 13 0)) (request (0 3 0))) "Search the Web using Ivy" tar ((:url . "https://github.com/mnewt/counsel-web") (:commit . "1359b3b204fcdac7a3d6664c7d540a88b5acecfd") (:revdesc . "1359b3b204fc") (:keywords "convenience" "hypermedia") (:authors ("Matthew Sojourner Newton" . "matt@mnewton.com")) (:maintainers ("Matthew Sojourner Newton" . "matt@mnewton.com")) (:maintainer "Matthew Sojourner Newton" . "matt@mnewton.com"))]) + (counsel-world-clock . [(20190709 2211) ((ivy (0 9 0)) (s (1 12 0))) "Display world clock using Ivy" tar ((:url . "https://github.com/kchenphy/counsel-world-clock") (:commit . "674e4c6b82a92ea765af97cc5f017b357284c7dc") (:revdesc . "674e4c6b82a9") (:authors ("Kuang Chen" . "http://github.com/kchenphy")) (:maintainers ("Kuang Chen" . "http://github.com/kchenphy")) (:maintainer "Kuang Chen" . "http://github.com/kchenphy"))]) + (countdown . [(20190626 244) ((emacs (25 1)) (stream (2 2 4))) "Countdown using big LCD-like digits" tar ((:url . "https://github.com/xuchunyang/countdown.el") (:commit . "139dea91fc818d65944aca5f16c9626abbdfbf04") (:revdesc . "139dea91fc81") (:keywords "tools") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (cov . [(20250126 2333) ((emacs (24 4)) (f (0 18 2)) (s (1 11 0)) (elquery (0))) "Show coverage stats in the fringe" tar ((:url . "https://github.com/AdamNiederer/cov") (:commit . "7a3599e42d4fe943b912701e04beffcf2ec812d2") (:revdesc . "7a3599e42d4f") (:keywords "coverage" "gcov" "c" "lcov" "coveralls" "clover"))]) + (coverage . [(20191113 1958) ((ov (1 0)) (cl-lib (0 5))) "Code coverage line highlighting" tar ((:url . "https://github.com/trezona-lecomte/coverage") (:commit . "6e3c6f2dcb759a76086adeeb1fdfe83e4f082482") (:revdesc . "6e3c6f2dcb75") (:keywords "coverage" "metrics" "simplecov" "ruby" "rspec") (: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"))]) + (coverlay . [(20190414 940) ((emacs (24 1)) (cl-lib (0 5))) "Test coverage overlays" tar ((:url . "https://github.com/twada/coverlay.el") (:commit . "0beae208d0e7d746a94385428bd61aa5cd7ea828") (:revdesc . "0beae208d0e7") (:keywords "coverage" "overlay") (:authors ("Takuto Wada" . "takuto.wadaatgmailcom")) (:maintainers ("Takuto Wada" . "takuto.wadaatgmailcom")) (:maintainer "Takuto Wada" . "takuto.wadaatgmailcom"))]) + (cowsay . [(20210510 1540) ((emacs (24 5))) "Poorly drawn ASCII cartoons saying things" tar ((:url . "https://github.com/lassik/emacs-cowsay") (:commit . "d8a72a311c6875f1aef6a30b3d23a1b02df75941") (:revdesc . "d8a72a311c68") (:keywords "games") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (cp5022x . [(20120323 2335) nil "Cp50220, cp50221, cp50222 coding system" tar ((:url . "https://github.com/awasira/cp5022x.el") (:commit . "ea7327dd75e54539576916f592ae1be98179ae35") (:revdesc . "ea7327dd75e5") (:keywords "languages" "cp50220" "cp50221" "cp50222" "cp51932" "cp932") (:authors ("ARISAWA Akihiro" . "ari@mbf.ocn.ne.jp")) (:maintainers ("ARISAWA Akihiro" . "ari@mbf.ocn.ne.jp")) (:maintainer "ARISAWA Akihiro" . "ari@mbf.ocn.ne.jp"))]) + (cpanfile-mode . [(20161001 710) ((emacs (24 4))) "Major mode for cpanfiles" tar ((:url . "https://github.com/zakame/cpanfile-mode") (:commit . "b09908b4342b3aa97940159dbe91ac074ec98e0b") (:revdesc . "b09908b4342b") (:keywords "perl") (:authors ("Zak B. Elep" . "zakame@zakame.net")) (:maintainers ("Zak B. Elep" . "zakame@zakame.net")) (:maintainer "Zak B. Elep" . "zakame@zakame.net"))]) + (cpp-auto-include . [(20210318 2217) ((cl-lib (0 5))) "Insert and delete C++ header files automatically" tar ((:url . "https://github.com/emacsorphanage/cpp-auto-include") (:commit . "0ce829f27d466c083e78b9fe210dcfa61fb417f4") (:revdesc . "0ce829f27d46") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (cppinsights . [(20250519 101) ((emacs (28 1))) "Integration with cppinsights tool" tar ((:url . "https://github.com/chrischen3121/cppinsights.el") (:commit . "941e48a0d5c4a6aed865d8be30ebca006b5a6e3f") (:revdesc . "941e48a0d5c4") (:keywords "c++" "tools" "cppinsights") (:authors ("Chris Chen" . "chrischen@ignity.xyz")) (:maintainers ("Chris Chen" . "chrischen@ignity.xyz")) (:maintainer "Chris Chen" . "chrischen@ignity.xyz"))]) + (cpputils-cmake . [(20181006 328) nil "Easy realtime C++ syntax check and IntelliSense with CMake" tar ((:url . "http://github.com/redguardtoo/cpputils-cmake") (:commit . "64b2b05eff5398b4cd522e66efaf14553ab18ff4") (:revdesc . "64b2b05eff53") (:keywords "cmake" "intellisense" "flymake" "flycheck") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (cpu-sos . [(20200409 2356) ((emacs (25 1))) "S.O.S. from a CPU in distress" tar ((:url . "https://github.com/oitofelix/cpu-sos") (:commit . "1594b76d4ad3a6e3c471d82da366226d156e6226") (:revdesc . "1594b76d4ad3") (:keywords "processes") (: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"))]) + (cql-mode . [(20190315 225) ((emacs (24))) "Major mode for editting CQLs" tar ((:url . "https://github.com/Yuki-Inoue/cql-mode") (:commit . "d400c046850d3cf404778b2c47d6be4ff84ca04b") (:revdesc . "d400c046850d") (:keywords "cql" "cassandra") (:authors ("Yuki Inoue" . "inouetakahirokiatgmail.com")) (:maintainers ("Yuki Inoue" . "inouetakahirokiatgmail.com")) (:maintainer "Yuki Inoue" . "inouetakahirokiatgmail.com"))]) + (cquery . [(20190118 542) ((emacs (25 1)) (lsp-mode (3 4)) (dash (0 13))) "Cquery client for lsp-mode" tar ((:url . "https://github.com/jacobdufault/cquery") (:commit . "555e50984ebda177421fdcdc8c76cb29235d9694") (:revdesc . "555e50984ebd") (:keywords "languages" "lsp" "c++"))]) + (crappy-jsp-mode . [(20140311 931) nil "A pretty crappy major-mode for jsp" tar ((:url . "https://github.com/magnars/crappy-jsp-mode") (:commit . "6c45ab92b452411cc0fab9bcee2f456276b4fc40") (:revdesc . "6c45ab92b452") (:keywords "jsp" "major" "mode"))]) + (crc . [(20250303 119) ((emacs (25 1))) "Cyclic Redundancy Check" tar ((:url . "https://codeberg.org/tomenzgg/Emacs-CRC") (:commit . "568bd5e0fddfbf430c295da33a17f6ed99484188") (:revdesc . "568bd5e0fddf") (:keywords "lisp" "checksum" "algorithms") (:authors ("Jean Libète" . "tomenzgg@mail.mayfirst.org")) (:maintainers ("Jean Libète" . "tomenzgg@mail.mayfirst.org")) (:maintainer "Jean Libète" . "tomenzgg@mail.mayfirst.org"))]) + (creamsody-theme . [(20250724 52) ((autothemer (0 2)) (emacs (24))) "Straight from the soda fountain" tar ((:url . "http://github.com/emacsfodder/emacs-theme-creamsody") (:commit . "98d55dcb2480889dee416c9fa0c6baf8c6af9844") (:revdesc . "98d55dcb2480"))]) + (creamy-theme . [(20251030 1829) ((emacs (24 1))) "A simple creamy theme" tar ((:url . "https://github.com/smallwat3r/emacs-creamy-theme") (:commit . "3bceabac758378d91d07ba39b855e744be7e3c54") (:revdesc . "3bceabac7583"))]) + (create-link . [(20220621 1440) ((emacs (25 1))) "Smart format link generator" tar ((:url . "https://github.com/kijimaD/create-link") (:commit . "276fafcc6fb568ede256c8d459c3beb408ad9b46") (:revdesc . "276fafcc6fb5") (:keywords "link" "format" "browser" "convenience") (:authors ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainers ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainer "Kijima Daigo" . "norimaking777@gmail.com"))]) + (creds . [(20140510 1706) ((s (1 9 0)) (dash (2 5 0))) "A parser credentials file library (not limited to credentials entries)" tar ((:url . "https://github.com/ardumont/emacs-creds") (:commit . "00ebefd10005c170b790a01380cb6a98f798ce5c") (:revdesc . "00ebefd10005") (:keywords "credentials") (:authors ("Antoine R. Dumont" . "eniotna.tATgmail.com")) (:maintainers ("Antoine R. Dumont" . "eniotna.tATgmail.com")) (:maintainer "Antoine R. Dumont" . "eniotna.tATgmail.com"))]) + (creole . [(20140924 1500) ((noflet (0 0 3)) (kv (0 0 17))) "A parser for the Creole Wiki language" tar ((:url . "https://github.com/nicferrier/elwikicreole") (:commit . "7d5cffe93857f6c75ca09ac79c0e47b8d4410e53") (:revdesc . "7d5cffe93857") (:keywords "lisp" "creole" "wiki") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (creole-mode . [(20130722 50) nil "A markup mode for creole" tar ((:url . "https://github.com/nicferrier/creole-mode") (:commit . "b5e79b2ec5f19fb5aacf689b5febc3e0b61515c4") (:revdesc . "b5e79b2ec5f1") (:keywords "hypermedia" "wp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (cricbuzz . [(20180804 2254) ((enlive (0 0 1)) (f (0 19 0)) (dash (2 13 0)) (s (1 11 0))) "Cricket scores from cricbuzz in emacs" tar ((:url . "https://github.com/lepisma/cricbuzz.el") (:commit . "0b95d45991bbcd2fa58d96ce921f6a57ba42c153") (:revdesc . "0b95d45991bb") (:keywords "cricket" "score") (:authors ("Abhinav Tushar" . "abhinav.tushar.vs@gmail.com")) (:maintainers ("Abhinav Tushar" . "abhinav.tushar.vs@gmail.com")) (:maintainer "Abhinav Tushar" . "abhinav.tushar.vs@gmail.com"))]) + (crm-custom . [(20160117 6) ((cl-lib (0 5))) "Alternate `completing-read-multiple' that uses `completing-read'" tar ((:url . "https://github.com/DarwinAwardWinner/crm-custom") (:commit . "f1aaccf64306a5f99d9bf7ba815d7ea41c15518d") (:revdesc . "f1aaccf64306") (:keywords "completion" "minibuffer" "multiple elements") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainers ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org"))]) + (crontab-mode . [(20210715 133) ((emacs (24 3))) "Major mode for crontab(5)" tar ((:url . "https://github.com/emacs-pe/crontab-mode") (:commit . "7412f3df0958812bfcacd5875a409fa795fa8ecc") (:revdesc . "7412f3df0958") (:keywords "languages") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (crossword . [(20210614 633) ((emacs (26 1))) "Download and play crossword puzzles" tar ((:url . "https://github.com/Boruch-Baum/emacs-crossword") (:commit . "e462de8ef15d1f979207a95b224e68d7feead92f") (:revdesc . "e462de8ef15d") (:keywords "games"))]) + (crux . [(20250421 936) ((emacs (26 1))) "A Collection of Ridiculously Useful eXtensions" tar ((:url . "https://github.com/bbatsov/crux") (:commit . "e42f5558199576628e827a6e3db29eae56f4126a") (:revdesc . "e42f55581995") (:keywords "convenience") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (cryptol-mode . [(20190531 2051) nil "Cryptol major mode for Emacs" tar ((:url . "http://github.com/thoughtpolice/cryptol-mode") (:commit . "81ebbde83f7cb75b2dfaefc09de6a1703068c769") (:revdesc . "81ebbde83f7c") (:keywords "cryptol" "cryptography") (:authors ("Austin Seipp" . "aseipp[@at]pobox[dot]com")) (:maintainers ("Austin Seipp" . "aseipp[@at]pobox[dot]com")) (:maintainer "Austin Seipp" . "aseipp[@at]pobox[dot]com"))]) + (crystal-mode . [(20250203 1157) ((emacs (24 4))) "Major mode for editing Crystal files" tar ((:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode") (:commit . "39993f821e6d7ca1da125d0ceba6218c3ca4c5b7") (:revdesc . "39993f821e6d") (:keywords "languages" "crystal"))]) + (crystal-playground . [(20251026 2240) ((emacs (25)) (crystal-mode (0 1 2))) "Local crystal playground for short code snippets" tar ((:url . "https://github.com/jasonrobot/crystal-playground") (:commit . "9920cab99b02c6da70dfe1c3325146d062c14288") (:revdesc . "9920cab99b02") (:keywords "tools" "crystal"))]) + (crystal-point . [(20250915 1107) ((emacs (24 4))) "Dynamic cursor color matching face at point" tar ((:url . "https://github.com/laluxx/crystal-point") (:commit . "bd7b9aca2f6153dd7d4bf3c74e4d138c77dcc748") (:revdesc . "bd7b9aca2f61") (:keywords "convenience" "cursor" "faces"))]) + (csgo-conf-mode . [(20161209 1619) nil "CS:GO Configuration files syntax highlighting" tar ((:url . "https://github.com/wynro/emacs-csgo-conf-mode") (:commit . "df45ca833eb68c394dd03acce5733a33c3b06bf8") (:revdesc . "df45ca833eb6") (:keywords "languages") (:authors ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainers ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainer "Guillermo Robles" . "guillerobles1995@gmail.com"))]) + (csharp-mode . [(20221126 2005) ((emacs (26 1))) "C# mode derived mode" tar ((:url . "https://github.com/emacs-csharp/csharp-mode") (:commit . "d8b058c9e9d0429ea7e81d121ce19b064bd7e0f5") (:revdesc . "d8b058c9e9d0") (:keywords "c#" "languages" "oop" "mode") (:authors ("Theodor Thornhill" . "theo@thornhill.no")) (:maintainers ("Jostein Kjønigsen" . "jostein@gmail.com") ("Theodor Thornhill" . "theo@thornhill.no")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com"))]) + (csound-mode . [(20250310 1026) ((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 ((:url . "https://github.com/hlolli/csound-mode") (:commit . "4a6aa20ad919f088d65b903814453bd56266cf77") (:revdesc . "4a6aa20ad919") (:authors ("Hlöðver Sigurðsson" . "hlolli@gmail.com")) (:maintainers ("Hlöðver Sigurðsson" . "hlolli@gmail.com")) (:maintainer "Hlöðver Sigurðsson" . "hlolli@gmail.com"))]) + (csproj-mode . [(20200801 1732) ((emacs (24))) "Work with .NET project files (csproj, vbproj)" tar ((:url . "https://github.com/omajid/csproj-mode") (:commit . "a7f0f4610c976a28c41b9b8299892f88b5d0336c") (:revdesc . "a7f0f4610c97") (:keywords "languages" "tools") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainers ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com"))]) + (css-autoprefixer . [(20180311 1600) ((emacs (24))) "Adds autoprefix to CSS" tar ((:url . "https://github.com/kkweon/emacs-css-autoprefixer") (:commit . "386a5defc8543a3b87820f1761c075c7d1d93b38") (:revdesc . "386a5defc854") (:keywords "convenience" "usability" "css") (:authors ("Kyung Mo Kweon and contributors" . "kkweon@gmail.com")) (:maintainers ("Kyung Mo Kweon and contributors" . "kkweon@gmail.com")) (:maintainer "Kyung Mo Kweon and contributors" . "kkweon@gmail.com"))]) + (css-comb . [(20160416 559) nil "Sort CSS properties in a particular order using CSS Comb" tar ((:url . "https://github.com/channikhabra/css-comb.el") (:commit . "6fa45e5af8a8bd3af6c1154cde3540e32c4206ee") (:revdesc . "6fa45e5af8a8") (:authors ("Charanjit Singh" . "ckhabra@gmail.com")) (:maintainers ("Charanjit Singh" . "ckhabra@gmail.com")) (:maintainer "Charanjit Singh" . "ckhabra@gmail.com"))]) + (css-eldoc . [(20220415 1629) nil "An eldoc-mode plugin for CSS source code" tar ((:url . "https://github.com/zenozeng/css-eldoc") (:commit . "73ebf9757a043b56b7d3b5befec5a38e6754b9e5") (:revdesc . "73ebf9757a04") (: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 ((:url . "http://tapoueh.org/emacs/cssh.html") (:commit . "2fe2754235225a59b63f08b130cfd4352e2e1c3f") (:revdesc . "2fe275423522") (:keywords "clusterssh" "ssh" "cssh") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org"))]) + (csv . [(20231216 1243) nil "Functions for reading and parsing CSV files" tar ((:url . "https://gitlab.com/u11/csv.el") (:commit . "8ed083c171a5e8caf11ebfbec67af3119ab1fd90") (:revdesc . "8ed083c171a5") (:keywords "extensions" "data" "csv") (:authors ("Ulf Jasper" . "ulf.jasper@web.de")) (:maintainers ("Ulf Jasper" . "ulf.jasper@web.de")) (:maintainer "Ulf Jasper" . "ulf.jasper@web.de"))]) + (ct . [(20250221 2339) ((emacs (26 1)) (dash (2 18 0)) (hsluv (1 0 0))) "Color Tools - a color api" tar ((:url . "https://github.com/neeasade/ct.el") (:commit . "e3d082136e06c0ec777ab032bec5a785239f412b") (:revdesc . "e3d082136e06") (:keywords "convenience" "color" "theming" "rgb" "hsv" "hsl" "lab" "oklab" "background"))]) + (ctable . [(20210128 629) ((emacs (24 3)) (cl-lib (0 5))) "Table component for Emacs Lisp" tar ((:url . "https://github.com/kiwanami/emacs-ctable") (:commit . "48b73742757a3ae5736d825fe49e00034cc453b5") (:revdesc . "48b73742757a") (:keywords "table") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatkiwanami.net"))]) + (ctags-update . [(20190609 613) nil "(auto) update TAGS in parent directory using exuberant-ctags" tar ((:url . "https://github.com/jixiuf/ctags-update") (:commit . "67faf248b92388442958a069263c62a345425a1b") (:revdesc . "67faf248b923") (:keywords "exuberant-ctags" "etags") (:authors ("纪秀峰" . "Josephjixiuf@gmail.com")) (:maintainers ("纪秀峰" . "Josephjixiuf@gmail.com")) (:maintainer "纪秀峰" . "Josephjixiuf@gmail.com"))]) + (ctl-mode . [(20151202 1006) nil "Major mode for editing GrADS script files" tar ((:url . "https://github.com/yyr/emacs-grads") (:commit . "1a13051db21b999c7682a015b33a03096ff9d891") (:revdesc . "1a13051db21b") (:keywords "grads" "script" "major-mode") (:authors ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainers ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainer "Joe Wielgosz" . "joew@cola.iges.org"))]) + (ctrlf . [(20251212 141) ((emacs (25 1))) "Emacs finally learns how to ctrl+F" tar ((:url . "https://github.com/radian-software/ctrlf") (:commit . "3e1d4d74b201e45a2d471675f5fdae370f23f947") (:revdesc . "3e1d4d74b201") (:keywords "extensions") (:authors ("Radian LLC" . "contact+ctrlf@radian.codes")) (:maintainers ("Radian LLC" . "contact+ctrlf@radian.codes")) (:maintainer "Radian LLC" . "contact+ctrlf@radian.codes"))]) + (ctrlxo . [(20201021 701) ((emacs (25 1))) "Switch to the most recently used window" tar ((:url . "https://github.com/muffinmad/emacs-ctrlxo") (:commit . "8ad95a81bd1ece06ebe40e2a83490775db64b419") (:revdesc . "8ad95a81bd1e") (:keywords "frames") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com"))]) + (ctune . [(20250310 2034) ((emacs (26 1))) "Tune out CC Mode Noise Macros" tar ((:url . "https://github.com/maurooaranda/ctune") (:commit . "7c26d7af3cd0d6cf4f94deb7f2bf3cf8ed8a1f11") (:revdesc . "7c26d7af3cd0") (:keywords "c" "convenience") (:authors ("Mauro Aranda" . "maurooaranda@gmail.com")) (:maintainers ("Mauro Aranda" . "maurooaranda@gmail.com")) (:maintainer "Mauro Aranda" . "maurooaranda@gmail.com"))]) + (ctxmenu . [(20140303 2142) ((popup (20140205 103)) (log4e (0 2 0)) (yaxception (0 1))) "Provide a context menu like right-click" tar ((:url . "https://github.com/aki2o/emacs-ctxmenu") (:commit . "5c2376859562b98c07c985d2b483658e4c0e888e") (:revdesc . "5c2376859562") (:keywords "popup") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (cubicaltt . [(20171108 1402) ((emacs (24 1)) (cl-lib (0 5))) "Mode for cubical type theory" tar ((:url . "https://github.com/mortberg/cubicaltt") (:commit . "a867f3d66172020e30dd0614bd7b50f90b6fddd7") (:revdesc . "a867f3d66172") (:keywords "languages"))]) + (cubicle-mode . [(20221031 2122) nil "Major mode for the Cubicle model checker" tar ((:url . "https://github.com/cubicle-model-checker/cubicle") (:commit . "7679c8452051ed5c89f891c72c6ada76757fc935") (:revdesc . "7679c8452051"))]) + (cuckoo-search . [(20251004 1847) ((emacs (29 1)) (elfeed (3 4 2))) "Content-based search and saved-searches for Elfeed" tar ((:url . "https://github.com/rtrppl/cuckoo-search") (:commit . "3c9840c4a3fe5cfe0c203ed4657324af8e5bb32f") (:revdesc . "3c9840c4a3fe") (:maintainers ("René Trappel" . "rtrappel@gmail.com")) (:maintainer "René Trappel" . "rtrappel@gmail.com"))]) + (cucumber-goto-step . [(20131210 519) ((pcre2el (1 5))) "Jump to cucumber step definition" tar ((:url . "http://orthogonal.me") (:commit . "f2713ffb26ebe1b757d1f2ea80e900b55e5895aa") (:revdesc . "f2713ffb26eb") (:authors ("Glen Stampoultzis" . "gstamp@gmail.com")) (:maintainers ("Glen Stampoultzis" . "gstamp@gmail.com")) (:maintainer "Glen Stampoultzis" . "gstamp@gmail.com"))]) + (cuda-mode . [(20240819 11) ((compat (29))) "NVIDIA CUDA Major Mode derived from C++-mode" tar ((:url . "https://github.com/chachi/cuda-mode") (:commit . "c3dae31b3d1abedf4d0b98840127e2cac73d6ad8") (:revdesc . "c3dae31b3d1a") (:keywords "c" "languages" "cuda") (:authors ("Jack Morrison" . "jackmorrison1@gmail.com")) (:maintainers ("Jack Morrison" . "jackmorrison1@gmail.com")) (:maintainer "Jack Morrison" . "jackmorrison1@gmail.com"))]) + (cue-mode . [(20220811 1938) ((emacs (25 1))) "Major mode for CUE language files" tar ((:url . "https://github.com/russell/cue-mode") (:commit . "31c671d56e7884fa87ad0f1d27d0bb439dc65380") (:revdesc . "31c671d56e78") (:keywords "data" "languages") (:authors ("Russell Sim" . "russell.sim@gmail.com")) (:maintainers ("Russell Sim" . "russell.sim@gmail.com")) (:maintainer "Russell Sim" . "russell.sim@gmail.com"))]) + (cue-sheet-mode . [(20230522 511) ((emacs (27 1))) "Major mode for editing CUE sheet files" tar ((:url . "https://github.com/peterhoeg/cue-sheet-mode") (:commit . "016dfa8aeed264e15e2f55b0b34fcfdb7e14b9d9") (:revdesc . "016dfa8aeed2") (:keywords "languages") (:authors ("Peter Hoeg" . "(peter@hoeg.com)")) (:maintainers ("Peter Hoeg" . "(peter@hoeg.com)")) (:maintainer "Peter Hoeg" . "(peter@hoeg.com)"))]) + (curl-to-elisp . [(20201124 1012) ((emacs (25 1))) "Convert cURL command to Emacs Lisp code" tar ((:url . "https://github.com/xuchunyang/curl-to-elisp") (:commit . "63d8d9c6d5efb8af8aa88042bfc0690ba699ef64") (:revdesc . "63d8d9c6d5ef") (:keywords "lisp"))]) + (currency-convert . [(20231215 1526) ((emacs (24 4))) "Currency converter" tar ((:url . "https://github.com/lassik/emacs-currency-convert") (:commit . "125a718e73f826f461856aabd19bb2de9327531b") (:revdesc . "125a718e73f8") (:keywords "comm" "convenience" "i18n") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (current-window-only . [(20241220 2006) ((emacs (25 1))) "Open things only in the current window" tar ((:url . "https://github.com/FrostyX/current-window-only") (:commit . "1e9c6fb55a4292c62818035f2bdc159512ac089f") (:revdesc . "1e9c6fb55a42") (:keywords "frames") (:authors ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainers ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainer "Jakub Kadlčík" . "frostyx@email.cz"))]) + (current-word-highlight . [(20210323 1401) nil "Highlight the current word minor mode" tar ((:url . "https://github.com/kijimaD/current-word-highlight") (:commit . "d860f4e170ffa4cef840da93647f458cc409d554") (:revdesc . "d860f4e170ff") (:keywords "highlight" "face" "convenience" "word") (:authors ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainers ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainer "Kijima Daigo" . "norimaking777@gmail.com"))]) + (curry-on-theme . [(20210322 1717) ((emacs (24 1))) "A low contrast color theme" tar ((:url . "https://github.com/mvarela/Curry-On-Theme") (:commit . "b53a61d443cc75906d9f97e19f19be71f1e19bc4") (:revdesc . "b53a61d443cc") (:authors ("Martín Varela" . "(martin@varela.fi)")) (:maintainers ("Martín Varela" . "(martin@varela.fi)")) (:maintainer "Martín Varela" . "(martin@varela.fi)"))]) + (cursor-flash . [(20210722 445) ((emacs (24 3))) "Highlight the cursor on buffer/window-switch" tar ((:url . "https://github.com/Boruch-Baum/emacs-cursor-flash") (:commit . "6bb54a1e2e1bf9df80926718b1b8b9ee49080484") (:revdesc . "6bb54a1e2e1b") (:keywords "convenience" "faces" "maint"))]) + (cursor-test . [(20131207 1732) ((emacs (24))) "Testing library for cursor position in emacs" tar ((:url . "https://github.com/ainame/cursor-test.el") (:commit . "e09956e048b88fd2ee8dd90b5678baed8b04d31b") (:revdesc . "e09956e048b8"))]) + (custom-keymap . [(20250906 1450) ((emacs (29 3))) "Configure user key sequence bindings from a custom variable" tar ((:url . "https://github.com/viandant/custom-keymap") (:commit . "d8db247fd8ce47bc9ecc7f75c4074fc4f82c4119") (:revdesc . "d8db247fd8ce") (:keywords "internal" "keymap" "keyboard" "customization") (:authors ("Viandant" . "viandant@langenst.de")) (:maintainers ("Viandant" . "viandant@langenst.de")) (:maintainer "Viandant" . "viandant@langenst.de"))]) + (cwl-mode . [(20210510 1150) ((yaml-mode (0 0 13)) (emacs (24 4))) "A major mode for editing CWL" tar ((:url . "https://github.com/tom-tan/cwl-mode") (:commit . "23a333119efaac78453cba95d316109805bd6aec") (:revdesc . "23a333119efa") (:keywords "languages" "cwl" "common workflow language") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com"))]) + (cyanometric-theme . [(20220822 301) ((autothemer (0 2)) (emacs (24))) "A Theme with overwhelming bias towards cyan" tar ((:url . "http://github.com/emacsfodder/emacs-theme-cyanometric") (:commit . "9b20e33a8cc2c76bfe6ad45916be6881386707f5") (:revdesc . "9b20e33a8cc2"))]) + (cybercafe-theme . [(20231122 1444) ((emacs (24 1))) "Cybercafe color theme" tar ((:url . "http://github.com/gboncoffee/cybercafe-emacs-theme") (:commit . "c241228914c9bd070733b1e97ea11a5cb6331e86") (:revdesc . "c241228914c9") (:keywords "faces") (:authors (nil . "GabrieldeBritogabrielgbrito@icloud.com")) (:maintainers (nil . "GabrieldeBritogabrielgbrito@icloud.com")) (:maintainer nil . "GabrieldeBritogabrielgbrito@icloud.com"))]) + (cyberpunk-2019-theme . [(20191008 1133) ((emacs (24 1))) "A retina-scorching cyberpunk theme" tar ((:url . "https://github.com/the-frey/cyberpunk-2019") (:commit . "7e40c37210c363b2819fd9bb98a73101d7a3c206") (:revdesc . "7e40c37210c3") (:keywords "cyberpunk" "theme" "themes") (:authors ("Alex Lynham" . "alex@lynh.am")) (:maintainers ("Alex Lynham" . "alex@lynh.am")) (:maintainer "Alex Lynham" . "alex@lynh.am"))]) + (cyberpunk-theme . [(20240112 1944) nil "Cyberpunk Color Theme" tar ((:url . "https://github.com/n3mo/cyberpunk-theme.el") (:commit . "1fd5350ddfc53c30e6eef82af77c62d7c825df3c") (:revdesc . "1fd5350ddfc5") (:keywords "color" "theme" "cyberpunk") (:authors ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com")) (:maintainers ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com")) (:maintainer "Nicholas M. Van Horn" . "nvanhorn@protonmail.com"))]) + (cycbuf . [(20131203 2037) nil "Cycle buffers, inspired by swbuff.el, swbuff-x.el, and bs.el" tar ((:url . "https://github.com/martinp26/cycbuf") (:commit . "1079b41c3eb27d65b66d4399959bb6253f84858e") (:revdesc . "1079b41c3eb2") (:keywords "files" "convenience" "buffer switching"))]) + (cycle-at-point . [(20250913 2251) ((emacs (29 1)) (recomplete (0 2))) "Cycle (rotate) the thing under the cursor" tar ((:url . "https://codeberg.org/ideasman42/emacs-cycle-at-point") (:commit . "c390803221816319ae6edcea470d12a4849606af") (:revdesc . "c39080322181") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (cycle-resize . [(20160521 1557) nil "Cycle resize the current window horizontally or vertically" tar ((:url . "https://github.com/pierre-lecocq/cycle-resize") (:commit . "7d255d6fe85f12c967a0f7fcfcf18633be194c88") (:revdesc . "7d255d6fe85f"))]) + (cycle-themes . [(20150403 309) ((cl-lib (0 5))) "A global minor mode to make switching themes easier" tar ((:url . "http://github.com/toroidal-code/cycle-themes.el") (:commit . "2660c3178be7b28c2cb5dde2dd70a4bd51dae3a2") (:revdesc . "2660c3178be7") (:keywords "themes" "utility" "global minor mode"))]) + (cyphejor . [(20250401 1135) ((emacs (24 4))) "Shorten major mode names using user-defined rules" tar ((:url . "https://github.com/mrkkrp/cyphejor") (:commit . "78bc40555e05f85d5fc2f7a110bee98b614d4cb7") (:revdesc . "78bc40555e05") (:keywords "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (cypher-mode . [(20151110 1142) nil "Major mode for editing cypher scripts" tar ((:url . "http://github.com/fxbois/cypher-mode") (:commit . "ce8543d7877c736c574a17b49874c9dcdc7a06d6") (:revdesc . "ce8543d7877c") (:keywords "cypher" "graph") (:authors ("François-Xavier Bois" . "fxboisATGoogleMailService")))]) + (cython-mode . [(20221130 1257) nil "Major mode for editing Cython files" tar ((:url . "https://github.com/cython/emacs-cython-mode") (:commit . "3e4790559d3168fe992cf2aa62f01423038cedb5") (:revdesc . "3e4790559d31"))]) + (czech-holidays . [(20160113 1752) nil "Adds a list of Czech public holidays to Emacs calendar" tar ((:url . "https://github.com/chkhd/czech-holidays") (:commit . "d19828122cf3322bcf50601cefa4ac385d2d8f82") (:revdesc . "d19828122cf3") (:keywords "calendar") (:authors ("David Chkhikvadze" . "david.chk@outlook.com")) (:maintainers ("David Chkhikvadze" . "david.chk@outlook.com")) (:maintainer "David Chkhikvadze" . "david.chk@outlook.com"))]) + (d-mode . [(20241225 1823) ((emacs (25 1))) "D Programming Language major mode for (X)Emacs" tar ((:url . "https://github.com/Emacs-D-Mode-Maintainers/Emacs-D-Mode") (:commit . "e8754635a7dbb7b1712dc9fcf380acd3ed5a2db6") (:revdesc . "e8754635a7db") (:keywords "d" "programming" "language" "emacs" "cc-mode") (:maintainers ("Russel Winder" . "russel@winder.org.uk") ("Vladimir Panteleev" . "vladimir@thecybershadow.net")) (:maintainer "Russel Winder" . "russel@winder.org.uk"))]) + (d2-mode . [(20241209 2156) ((emacs (26 1))) "Major mode for working with d2 graphs" tar ((:url . "https://github.com/andorsk/d2-mode") (:commit . "e1fc7d6c1915acaf476060c0f79b8bdef6bd1952") (:revdesc . "e1fc7d6c1915") (:keywords "d2" "graphs" "tools" "processes") (:authors ("Andor Kesselman" . "andor@henosisknot.com")) (:maintainers ("Andor Kesselman" . "andor@henosisknot.com")) (:maintainer "Andor Kesselman" . "andor@henosisknot.com"))]) + (dactyl-mode . [(20140906 1725) nil "Major mode for editing Pentadactyl config files" tar ((:url . "https://github.com/luxbock/dactyl-mode") (:commit . "cc55fe6b987271d9647492b8df4c812d884f661f") (:revdesc . "cc55fe6b9872") (:keywords "languages" "vim"))]) + (dad-joke . [(20170928 658) ((emacs (24))) "Get/display dad jokes" tar ((:url . "https://github.com/davep/dad-joke.el") (:commit . "bee47e7b746b403228fa7d7361cb095de19ac9ba") (:revdesc . "bee47e7b746b") (:keywords "games") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (daemons . [(20250514 1107) ((emacs (25 1)) (s (1 13 0)) (compat (29 1 4 2))) "UI for managing init system daemons (services)" tar ((:url . "https://github.com/cbowdon/daemons.el") (:commit . "7b08ce315c0be901d88c1099483f9607c653712e") (:revdesc . "7b08ce315c0b") (:keywords "unix" "convenience"))]) + (dag-draw . [(20251218 1333) ((emacs (26 1)) (dash (2 19 1)) (ht (2 3))) "Draw directed graphs using the GKNV algorithm" tar ((:url . "https://codeberg.org/trevoke/dag-draw.el") (:commit . "0c10afdff9f1ebfeea242e921fa22bb385cdf899") (:revdesc . "0c10afdff9f1") (:keywords "tools" "extensions"))]) + (dakrone-light-theme . [(20170808 2140) nil "Dakrone's custom light theme" tar ((:url . "https://github.com/dakrone/dakrone-light-theme") (:commit . "06f198dc8b4ca7421990b30a23d89c8e0b8c5de4") (:revdesc . "06f198dc8b4c") (:keywords "color" "themes" "faces") (:authors ("Lee Hinman" . "lee_AT_writequit.org")) (:maintainers ("Lee Hinman" . "lee_AT_writequit.org")) (:maintainer "Lee Hinman" . "lee_AT_writequit.org"))]) + (dakrone-theme . [(20170801 1933) nil "Dakrone's custom dark theme" tar ((:url . "https://github.com/dakrone/dakrone-theme") (:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:revdesc . "232ad1be5f35") (:keywords "color" "themes") (:authors ("Lee Hinman" . "lee_AT_writequit.org")) (:maintainers ("Lee Hinman" . "lee_AT_writequit.org")) (:maintainer "Lee Hinman" . "lee_AT_writequit.org"))]) + (dall-e-shell . [(20250821 1033) ((emacs (27 1)) (shell-maker (0 79 1))) "Interaction mode for DALL-E" tar ((:url . "https://github.com/xenodium/chatgpt-shell") (:commit . "428125f9fa8578703a9ca85d173b2cc9a3eb16b9") (:revdesc . "428125f9fa85"))]) + (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 ((:url . "https://github.com/bartfaitamas/daml-mode") (:commit . "26ea6a1b34c49aaa5a2b395a0468c8af710bfab7") (:revdesc . "26ea6a1b34c4"))]) + (daml-mode . [(20231106 916) ((emacs (27 1)) (haskell-mode (16 1))) "Major mode for daml" tar ((:url . "https://github.com/bartfaitamas/daml-mode") (:commit . "3ba1166edd4c22402996625b1f8a05a2d5b1cbc6") (:revdesc . "3ba1166edd4c"))]) + (danneskjold-theme . [(20250302 1553) nil "Beautiful high-contrast Emacs theme" tar ((:url . "https://github.com/rails-to-cosmos/danneskjold-theme") (:commit . "597cdf9135ce6cced22e46f81598723f11dbdcc5") (:revdesc . "597cdf9135ce") (:authors ("Dmitry Akatov" . "akatovda@google.com")) (:maintainers ("Dmitry Akatov" . "akatovda@google.com")) (:maintainer "Dmitry Akatov" . "akatovda@google.com"))]) + (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 ((:url . "https://github.com/jyp/dante") (:commit . "ca47f8cc1392c7045db7da8b4fafe86b7c044e90") (:revdesc . "ca47f8cc1392") (:keywords "haskell" "tools") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainers ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com"))]) + (dap-mode . [(20251105 2320) ((emacs (28 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 ((:url . "https://github.com/emacs-lsp/dap-mode") (:commit . "ab96fc8e8df4ae23eb895aea6bed5b2a329d5f23") (:revdesc . "ab96fc8e8df4") (:keywords "languages" "debug") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com"))]) + (darcsum . [(20190316 2215) nil "A pcl-cvs like interface for managing darcs patches" tar ((:url . "https://github.com/emacsmirror/darcsum") (:commit . "6a8b690539d133c5e3d17cb23fe4365fbb6fb493") (:revdesc . "6a8b690539d1") (:keywords "completion" "convenience" "tools" "vc") (:authors ("John Wiegley" . "johnw@gnu.org")) (:maintainers ("John Wiegley" . "johnw@gnu.org")) (:maintainer "John Wiegley" . "johnw@gnu.org"))]) + (darcula-theme . [(20171227 1845) nil "Inspired by IntelliJ's Darcula theme" tar ((:url . "https://gitlab.com/fommil/emacs-darcula-theme") (:commit . "d9b82b58ded9014985be6658f4ab17e26ed9e93e") (:revdesc . "d9b82b58ded9") (:keywords "faces") (:authors ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainers ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainer "Sam Halliday" . "Sam.Halliday@gmail.com"))]) + (dark-krystal-theme . [(20170808 1300) ((emacs (24 0))) "An Emacs 24 theme based on Dark Krystal (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "79084b99665dc9ffb0ec62cc092349a5ecebebbc") (:revdesc . "79084b99665d"))]) + (dark-mint-theme . [(20160302 642) nil "Dark & minty fresh theme" tar ((:url . "https://github.com/shaunvxc/dark-mint-theme") (:commit . "c8ad39b7115baf889b54c3e9bffe32daeab93c29") (:revdesc . "c8ad39b7115b"))]) + (dark-souls . [(20140314 1128) nil "Prepare to die" tar ((:url . "http://github.com/tomjakubowski/dark-souls.el") (:commit . "2c9437265b52f966b2fb13a410a12f3b1e167cb7") (:revdesc . "2c9437265b52") (:keywords "games") (:authors ("Tom Jakubowski" . "tom@crystae.net")) (:maintainers ("Tom Jakubowski" . "tom@crystae.net")) (:maintainer "Tom Jakubowski" . "tom@crystae.net"))]) + (darkman . [(20241019 1404) ((emacs (28 1))) "Seamless integration with Darkman" tar ((:url . "https://darkman.grtcdr.tn") (:commit . "beb2186e6eaf13ebe1ae56e460bcd1a4c0cb4f07") (:revdesc . "beb2186e6eaf") (:keywords "convenience") (: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"))]) + (darkmine-theme . [(20160406 624) nil "Yet another emacs dark color theme" tar ((:url . "https://github.com/pierre-lecocq/darkmine-theme") (:commit . "7f7e82ca03bcad52911fa41fb3e204e32d6ee63e") (:revdesc . "7f7e82ca03bc") (:authors ("Pierre Lecocq" . "pierre.lecocq@gmail.com")) (:maintainers ("Pierre Lecocq" . "pierre.lecocq@gmail.com")) (:maintainer "Pierre Lecocq" . "pierre.lecocq@gmail.com"))]) + (darkokai-theme . [(20250317 1704) nil "A darker variant on Monokai" tar ((:url . "http://github.com/sjrmanning/darkokai") (:commit . "2b02bf7687433555fc683d59bb4ff7eb3d9e6858") (:revdesc . "2b02bf768743"))]) + (darktooth-theme . [(20251019 304) ((emacs (27 1)) (autothemer (0 2))) "From the darkness... it watches" tar ((:url . "http://github.com/emacsfodder/emacs-theme-darktooth") (:commit . "998639b2ce629dbdc0901ed560371f82de7af490") (:revdesc . "998639b2ce62"))]) + (dart-mode . [(20251105 543) ((emacs (27 1))) "Major mode for editing Dart files" tar ((:url . "https://github.com/emacsorphanage/dart-mode") (:commit . "22288d0bb374f6880ffc211ce87c302acb3421e7") (:revdesc . "22288d0bb374") (:keywords "languages") (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (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 ((:url . "https://github.com/bradyt/dart-server") (:commit . "75562baf9a89b7e314bc2f795f6ecdc5d1f2cc8c") (:revdesc . "75562baf9a89") (:keywords "languages") (:authors ("Brady Trainor" . "mail@bradyt.com")) (:maintainers ("Brady Trainor" . "mail@bradyt.com")) (:maintainer "Brady Trainor" . "mail@bradyt.com"))]) + (daselt . [(20251107 1324) ((emacs (30 1))) "Module for the Daselt configuration scheme" tar ((:url . "https://gitlab.com/nameiwillforget/d-emacs/") (:commit . "ae3135b143027d857b3581dc93a4eb77773f1e67") (:revdesc . "ae3135b14302") (:keywords "tools") (:authors ("Alexander Prähauser" . "ahprae@protonmail.com")) (:maintainers ("Alexander Prähauser" . "ahprae@protonmail.com")) (:maintainer "Alexander Prähauser" . "ahprae@protonmail.com"))]) + (dash . [(20250312 1307) ((emacs (24))) "A modern list library for Emacs" tar ((:url . "https://github.com/magnars/dash.el") (:commit . "fcb5d831fc08a43f984242c7509870f30983c27c") (:revdesc . "fcb5d831fc08") (:keywords "extensions" "lisp") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net"))]) + (dash-alfred . [(20191024 450) ((emacs (25 1))) "Search Dash documentation via Dash-Alfred-Workflow" tar ((:url . "https://github.com/xuchunyang/dash-alfred.el") (:commit . "fcd21bd6c7eb5cd31377be970406ff3d2454bd5c") (:revdesc . "fcd21bd6c7eb") (:keywords "docs"))]) + (dash-at-point . [(20211023 104) nil "Search the word at point with Dash" tar ((:url . "https://github.com/stanaka/dash-at-point") (:commit . "fba1a6f42ea51d05110e12c62bdced664059eb55") (:revdesc . "fba1a6f42ea5") (:authors ("Shinji Tanaka" . "shinji.tanaka@gmail.com")) (:maintainers ("Shinji Tanaka" . "shinji.tanaka@gmail.com")) (:maintainer "Shinji Tanaka" . "shinji.tanaka@gmail.com"))]) + (dash-docs . [(20210830 926) ((emacs (24 4)) (cl-lib (0 5)) (async (1 9 3))) "Offline documentation browser using Dash docsets" tar ((:url . "http://github.com/areina/helm-dash") (:commit . "29848b6b347ac520f7646c200ed2ec36cea3feda") (:revdesc . "29848b6b347a") (:keywords "docs") (:authors ("Raimon Grau" . "raimonster@gmail.com") ("Toni Reina" . "areina0@gmail.com") ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainers ("Raimon Grau" . "raimonster@gmail.com") ("Toni Reina" . "areina0@gmail.com") ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainer "Raimon Grau" . "raimonster@gmail.com"))]) + (dash-functional . [(20250312 1307) ((dash (2 18 0))) "Collection of useful combinators for Emacs Lisp" tar ((:url . "https://github.com/magnars/dash.el") (:commit . "fcb5d831fc08a43f984242c7509870f30983c27c") (:revdesc . "fcb5d831fc08") (:keywords "extensions" "lisp") (:authors ("Matus Goljer" . "matus.goljer@gmail.com") ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com") ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (dashboard . [(20250708 57) ((emacs (27 1))) "A startup screen extracted from Spacemacs" tar ((:url . "https://github.com/emacs-dashboard/emacs-dashboard") (:commit . "8c2cf0cfde4f5dac8c477f755380fffef6824108") (:revdesc . "8c2cf0cfde4f") (:keywords "startup" "screen" "tools" "dashboard") (:authors ("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com") ("Ricardo Arredondo" . "ricardo.richo@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (dashboard-hackernews . [(20240918 1301) ((emacs (24)) (dashboard (1 2 5)) (request (0 3 0))) "Display Hacker News on dashboard" tar ((:url . "https://github.com/hyakt/emacs-dashboard-hackernews") (:commit . "ea49fd79d12c26a2c3f9bcdffd0d70dcfee7cd74") (:revdesc . "ea49fd79d12c") (:authors ("Hayato KAJIYAMA" . "kaji1216@gmail.com")) (:maintainers ("Hayato KAJIYAMA" . "kaji1216@gmail.com")) (:maintainer "Hayato KAJIYAMA" . "kaji1216@gmail.com"))]) + (dashboard-ls . [(20250226 929) ((emacs (27 1)) (dashboard (1 2 5))) "Display files/directories in current directory on Dashboard" tar ((:url . "https://github.com/emacs-dashboard/dashboard-ls") (:commit . "68ecc61d7302ccb71b0197096e8c9d80a03ad9b5") (:revdesc . "68ecc61d7302") (:keywords "convenience" "directory" "file" "show") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (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 ((:url . "https://github.com/functionreturnfunction/dashboard-project-status") (:commit . "7675c138e9df8fe2c626e7ba9bbb8b6717671a41") (:revdesc . "7675c138e9df") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainers ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com"))]) + (date-at-point . [(20150308 1243) nil "Add `date' to `thing-at-point' function" tar ((:url . "https://github.com/alezost/date-at-point.el") (:commit . "258c0268cc4357640c2af78774ba9667beff28ee") (:revdesc . "258c0268cc43") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (date-field . [(20141129 1539) ((dash (2 9 0)) (log4e (0 2 0)) (yaxception (0 3 2))) "Date widget" tar ((:url . "https://github.com/aki2o/emacs-date-field") (:commit . "11c9170d1f7b343233f7716d4c0a62be024c1654") (:revdesc . "11c9170d1f7b") (:keywords "widgets") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (date2name . [(20190630 933) ((emacs (24 4))) "Package to prepend ISO Timestamps to files" tar ((:url . "https://github.com/DerBeutlin/date2name.el") (:commit . "1d239e4d647ad8ba5cd23a8d4012a9f10bcf7d7d") (:revdesc . "1d239e4d647a") (:keywords "files" "convenience"))]) + (datetime . [(20250203 2047) ((emacs (25 1)) (extmap (1 1 1))) "Parsing, formatting and matching timestamps" tar ((:url . "https://github.com/doublep/datetime") (:commit . "2601120d4d2857cdbad1cf8d4b84d77308920835") (:revdesc . "2601120d4d28") (:keywords "lisp" "i18n") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com"))]) + (datetime-format . [(20240105 1901) ((emacs (26 3))) "Datetime functions" tar ((:url . "https://github.com/emacs-php/emacs-datetime") (:commit . "c4ee8ef11bc95c78c390497f1d1397ca57a96f97") (:revdesc . "c4ee8ef11bc9") (:keywords "lisp" "datetime" "calendar") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (datomic-snippets . [(20180817 1045) ((s (1 4 0)) (dash (1 2 0)) (yasnippet (0 6 1))) "Yasnippets for Datomic" tar ((:url . "https://github.com/magnars/datomic-snippets") (:commit . "4a14228840d5252e13d2bf6209670f26345bbb84") (:revdesc . "4a14228840d5") (:keywords "snippets") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (dayone . [(20160105 1240) ((uuid (0 0 3)) (mustache (0 22)) (ht (1 5))) "Utility script for Day One" tar ((:url . "https://github.com/mori-dev/emacs-dayone") (:commit . "ab628274f0806451f23bce16f62a6a11cbf91a2b") (:revdesc . "ab628274f080") (:keywords "day one" "tools" "convenience") (:authors ("mori-dev" . "mori.dev.asdf@gmail.com")) (:maintainers ("mori-dev" . "mori.dev.asdf@gmail.com")) (:maintainer "mori-dev" . "mori.dev.asdf@gmail.com"))]) + (db . [(20140421 2111) ((kv (0 0 11))) "A database for EmacsLisp" tar ((:url . "https://github.com/nicferrier/emacs-db") (:commit . "b3a423fb8e72f9013009cbe033d654df2ce31438") (:revdesc . "b3a423fb8e72") (:keywords "data" "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (db-pg . [(20130131 1902) ((pg (0 12)) (db (0 0 6))) "A PostgreSQL adapter for emacs-db" tar ((:url . "https://github.com/nicferrier/emacs-db-pg") (:commit . "7d5ab86b74b05fe003b3b434d4835f37f3f3eded") (:revdesc . "7d5ab86b74b0") (:keywords "data" "comm" "database" "postgresql") (:authors ("Nic Ferrier" . "nic@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nic@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nic@ferrier.me.uk"))]) + (dbc . [(20201001 1452) ((emacs (24 4)) (cl-lib (0 5)) (ht (2 3))) "Control how to open buffers" tar ((:url . "https://gitlab.com/matsievskiysv/display-buffer-control") (:commit . "6728e72f72347d098b7d75ac4c29a7d687cc9ed3") (:revdesc . "6728e72f7234") (:keywords "convenience"))]) + (dbml-mode . [(20241206 706) ((emacs (27 1))) "Major mode for DBML" tar ((:url . "https://github.com/KeyWeeUsr/dbml-mode") (:commit . "fd2e4ec1356a63b05a15103631bd007bd089867c") (:revdesc . "fd2e4ec1356a") (:keywords "convenience" "dbml" "language" "markup" "highlight" "dbdiagram" "diagram") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (ddate . [(20250306 1709) ((emacs (24 4))) "Manage Discordian dates with ddate" tar ((:url . "https://git.sr.ht/~earneson/emacs-ddate") (:commit . "ec3de36ae7bcf71829f03a5063ee9912fcca40bc") (:revdesc . "ec3de36ae7bc") (:keywords "lisp" "dates" "tools" "dashboard") (:authors ("Erik L. Arneson" . "earneson@arnesonium.com")) (:maintainers ("Erik L. Arneson" . "earneson@arnesonium.com")) (:maintainer "Erik L. Arneson" . "earneson@arnesonium.com"))]) + (ddp . [(20250421 353) ((emacs (29 1))) "Dynamic Data Processor with cmd tools" tar ((:url . "https://github.com/eki3z/ddp.el") (:commit . "ee02e658f3bf8f26115e2dd61c713137e01227a9") (:revdesc . "ee02e658f3bf") (:keywords "tools") (:authors ("Eki Zhang" . "liuyinz@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz@gmail.com"))]) + (ddskk . [(20241227 2223) ((ccc (1 43)) (cdb (20141201 754))) "Daredevil SKK (Simple Kana to Kanji conversion program)" tar ((:url . "https://github.com/skk-dev/ddskk") (:commit . "f81ed803e617ccd8175d4bf57a3062bc5ffe1945") (:revdesc . "f81ed803e617") (:keywords "japanese" "mule" "input method") (:authors ("Masahiko Sato" . "masahiko@kuis.kyoto-u.ac.jp")))]) + (ddskk-posframe . [(20200812 917) ((emacs (26 1)) (posframe (0 4 3)) (ddskk (16 2 50))) "Show Henkan tooltip for ddskk via posframe" tar ((:url . "https://github.com/conao3/ddskk-posframe.el") (:commit . "299493dd951e5a0b43b8213321e3dc0bac10f762") (:revdesc . "299493dd951e") (:keywords "tooltip" "convenience" "posframe") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (deadgrep . [(20241210 1630) ((emacs (25 1)) (dash (2 12 0)) (s (1 11 0)) (spinner (1 7 3))) "Fast, friendly searching with ripgrep" tar ((:url . "https://github.com/Wilfred/deadgrep") (:commit . "bb555790c6f404572d537e1e4adec8b4ff0515f5") (:revdesc . "bb555790c6f4") (:keywords "tools") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (debian-el . [(20250411 2043) nil "Startup file for the debian-el package" tar ((:commit . "ce6df85ee3c4220aedbaecdb6d623fb7b0707b21") (:revdesc . "ce6df85ee3c4") (:keywords "debian" "apt" "elisp") (: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"))]) + (debpaste . [(20161214 2023) ((xml-rpc (1 6 7))) "Interface for getting/posting/deleting pastes from paste.debian.net" tar ((:url . "http://github.com/alezost/debpaste.el") (:commit . "6f2a400665062468ebd03a2ce1de2a73d9084958") (:revdesc . "6f2a40066506") (:keywords "paste") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (debug-print . [(20140126 19) ((emacs (24))) "A nice printf debugging environment by the way Gauche do" tar ((:url . "https://github.com/kenoss/debug-print") (:commit . "d817fd9ea2d3f8d2c1ace4d8af155684f3a99dc5") (:revdesc . "d817fd9ea2d3") (:keywords "extensions" "lisp" "tools" "maint") (:authors ("Ken Okada" . "keno.ss57@gmail.com")) (:maintainers ("Ken Okada" . "keno.ss57@gmail.com")) (:maintainer "Ken Okada" . "keno.ss57@gmail.com"))]) + (decide . [(20241014 1927) nil "Rolling dice and other random things" tar ((:url . "https://github.com/lifelike/decide-mode") (:commit . "fa97462f9c9237551e99ec56dbfe13af14391ca6") (:revdesc . "fa97462f9c92") (: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 ((:url . "https://github.com/preetpalS/decl.el") (:commit . "1b11ee91c4b2a2d30b236debf65538fbe4bf10a9") (:revdesc . "1b11ee91c4b2"))]) + (declutter . [(20220310 2101) ((emacs (25 1))) "Read html content and (some) paywall sites without clutter" tar ((:url . "http://www.github.com/sanel/declutter") (:commit . "0b2ca86fa716dfc2fb3bc3425019f049dd65eda2") (:revdesc . "0b2ca86fa716") (:keywords "html" "hypermedia" "terminals") (:authors ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainers ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainer "Sanel Zukan" . "sanelz@gmail.com"))]) + (decor . [(20241210 646) ((emacs (24 1))) "Modify visual decorations" tar ((:url . "https://github.com/KeyWeeUsr/decor") (:commit . "fa91fd8dabc7e98d7c0fc5e01400aae90966b38d") (:revdesc . "fa91fd8dabc7") (:keywords "convenience" "window" "decoration" "distraction" "xprop" "xwayland") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (dedicated . [(20151202 110) nil "A very simple minor mode for dedicated buffers" tar ((:url . "https://github.com/emacsorphanage/dedicated") (:commit . "f47b504c0c56fa5ab9d1028417ca1f65a713a2f0") (:revdesc . "f47b504c0c56") (:keywords "dedicated" "buffer") (:authors ("Eric Crampton" . "eric@atdesk.com")) (:maintainers ("Eric Crampton" . "eric@atdesk.com")) (:maintainer "Eric Crampton" . "eric@atdesk.com"))]) + (dedukti-mode . [(20171103 1212) nil "Major mode for Dedukti files" tar ((:url . "https://github.com/rafoo/dedukti-mode") (:commit . "d7c3505a1046187de3c3aeb144455078d514594e") (:revdesc . "d7c3505a1046") (:keywords "languages" "dedukti"))]) + (default-font-presets . [(20251214 1133) ((emacs (26 1))) "Support selecting fonts from a list of presets" tar ((:url . "https://codeberg.org/ideasman42/emacs-default-font-presets") (:commit . "6d69a989409ba3498032d9218abe92f58148562f") (:revdesc . "6d69a989409b") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (default-text-scale . [(20191226 2234) ((emacs (24))) "Easily adjust the font size in all frames" tar ((:url . "https://github.com/purcell/default-text-scale") (:commit . "bfc0987c37e93742255d3b23d86c17096fda8e7e") (:revdesc . "bfc0987c37e9") (:keywords "frames" "faces") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (defcapture . [(20230909 353) ((emacs (25 1)) (doct (3 0))) "A convenience macro for the Doct DSL" tar ((:url . "https://github.com/aggu4/defcapture") (:commit . "777a10a3343da0553813d004a67e39e2df1bcbb2") (:revdesc . "777a10a3343d") (:keywords "convenience" "org") (:authors ("Abraham Aguilar" . "a.aguilar@ciencias.unam.mx")) (:maintainers ("Abraham Aguilar" . "a.aguilar@ciencias.unam.mx")) (:maintainer "Abraham Aguilar" . "a.aguilar@ciencias.unam.mx"))]) + (deferred . [(20170901 1330) ((emacs (24 4))) "Simple asynchronous functions for emacs lisp" tar ((:url . "https://github.com/kiwanami/emacs-deferred") (:commit . "2239671d94b38d92e9b28d4e12fd79814cfb9c16") (:revdesc . "2239671d94b3") (:keywords "deferred" "async") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatkiwanami.net"))]) + (define-it . [(20250101 1006) ((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 ((:url . "https://github.com/jcs-elpa/define-it") (:commit . "28e5ad9ef4bba59b61a9f1f4f5efe545e892540b") (:revdesc . "28e5ad9ef4bb") (:keywords "convenience" "dictionary" "explanation" "search" "wiki") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (define-scratch . [(20221220 946) ((emacs (24 3))) "Define new commands to make scratch buffers" tar ((:url . "https://github.com/lassik/emacs-define-scratch") (:commit . "26cf11f801c2b5df0fbd56d2c4f7ac41b3ccd1c6") (:revdesc . "26cf11f801c2") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (define-word . [(20220104 1848) ((emacs (24 3))) "Display the definition of word at point" tar ((:url . "https://github.com/abo-abo/define-word") (:commit . "31a8c67405afa99d0e25e7c86a4ee7ef84a808fe") (:revdesc . "31a8c67405af") (:keywords "dictionary" "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (deflate . [(20250703 808) ((dash (2 0 0)) (emacs (25 1))) "The DEFLATE compression algorithm in pure Emacs LISP" tar ((:url . "https://github.com/skuro/deflate") (:commit . "4896cdf0c1d031404c6705f52c03f048444ff927") (:revdesc . "4896cdf0c1d0") (:keywords "files" "tools") (:authors ("Carlo Sciolla" . "carlo.sciolla@gmail.com")) (:maintainers ("Carlo Sciolla" . "carlo.sciolla@gmail.com")) (:maintainer "Carlo Sciolla" . "carlo.sciolla@gmail.com"))]) + (defproject . [(20151201 2219) ((emacs (24))) "Manager dir-locals and project specific variables" tar ((:url . "https://github.com/kotfic/defproject") (:commit . "674d48a5e34cb4bba76faa38ee901322ec649086") (:revdesc . "674d48a5e34c") (:keywords "convenience") (:authors (nil . "kotfic@gmail.com")) (:maintainers (nil . "kotfic@gmail.com")) (:maintainer nil . "kotfic@gmail.com"))]) + (defrepeater . [(20180830 410) ((emacs (25 2)) (s (1 12 0))) "Easily make commands repeatable" tar ((:url . "http://github.com/alphapapa/defrepeater.el") (:commit . "62b00ede57d2e115b9ef9f21268c021ae1186873") (:revdesc . "62b00ede57d2") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (deft . [(20240524 1524) nil "Quickly browse, filter, and edit plain text notes" tar ((:url . "https://jblevins.org/projects/deft/") (:commit . "b369d7225d86551882568788a23c5497b232509c") (:revdesc . "b369d7225d86") (:keywords "plain text" "notes" "simplenote" "notational velocity") (:authors ("Jason R. Blevins" . "jrblevin@xbeta.org")) (:maintainers ("Jason R. Blevins" . "jrblevin@xbeta.org")) (:maintainer "Jason R. Blevins" . "jrblevin@xbeta.org"))]) + (delim-kill . [(20100517 620) nil "Kill text between delimiters" tar ((:url . "http://github.com/thomas11/delim-kill/tree/master") (:commit . "1dbe47344f2d2cbc8c54beedf0cf0bf10fd203c1") (:revdesc . "1dbe47344f2d") (:keywords "convenience" "languages") (:authors ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainers ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainer "Thomas Kappler" . "tkappler@gmail.com"))]) + (demangle-mode . [(20210822 2210) ((cl-lib (0 1)) (emacs (24 3))) "Automatically demangle C++, D, and Rust symbols" tar ((:url . "https://github.com/liblit/demangle-mode") (:commit . "04f545adab066708d6151f13da65aaf519f8ac4e") (:revdesc . "04f545adab06") (:keywords "c" "tools") (:authors ("Ben Liblit" . "liblit@acm.org")) (:maintainers ("Ben Liblit" . "liblit@acm.org")) (:maintainer "Ben Liblit" . "liblit@acm.org"))]) + (demap . [(20220322 2309) ((emacs (25 1))) "Detachable minimap package" tar ((:url . "https://gitlab.com/sawyerjgardner/demap.el") (:commit . "c42ec4752544f80ca7c172ff65e705a56089bc96") (:revdesc . "c42ec4752544") (:keywords "lisp" "tools" "convenience") (:authors ("Sawyer Gardner" . "https://gitlab.com/sawyerjgardner")) (:maintainers ("Sawyer Gardner" . "https://gitlab.com/sawyerjgardner")) (:maintainer "Sawyer Gardner" . "https://gitlab.com/sawyerjgardner"))]) + (demo-it . [(20211221 2152) nil "Create demonstrations" tar ((:url . "https://github.com/howardabrams/demo-it") (:commit . "8ade739bb2605275f1f56128a0a9a8c6b55bab6a") (:revdesc . "8ade739bb260") (:keywords "demonstration" "presentation" "test") (:authors ("Howard Abrams" . "howard.abrams@gmail.com")) (:maintainers ("Howard Abrams" . "howard.abrams@gmail.com")) (:maintainer "Howard Abrams" . "howard.abrams@gmail.com"))]) + (deno-fmt . [(20230117 1117) ((emacs (24))) "Minor mode for using deno fmt on save" tar ((:url . "https://github.com/russell/deno-emacs") (:commit . "6378966f448a3b9b5ae98af58cd13a031bd26702") (:revdesc . "6378966f448a") (:authors ("Russell Clarey" . "http://github/rclarey")) (:maintainers ("Russell Clarey" . "http://github/rclarey")) (:maintainer "Russell Clarey" . "http://github/rclarey"))]) + (deno-ts-mode . [(20230912 202) ((emacs (29 1))) "Major mode for Deno" tar ((:url . "https://git.sr.ht/~mgmarlow/deno-ts-mode") (:commit . "526b6c00483cd86a028805e31ebd8a4a7000c3da") (:revdesc . "526b6c00483c") (:keywords "languages") (:authors ("Graham Marlow" . "info@mgmarlow.com")) (:maintainers ("Graham Marlow" . "info@mgmarlow.com")) (:maintainer "Graham Marlow" . "info@mgmarlow.com"))]) + (denote-agenda . [(20251206 42) ((emacs (27 1)) (denote (3 1 0)) (seq (2 24))) "Integrate Denote and Org-Agenda" tar ((:url . "https://git.sr.ht/~swflint/denote-agenda") (:commit . "90876a96663c1cb8baf4281e79aea51a95bd5be6") (:revdesc . "90876a96663c") (:keywords "calendar") (:authors ("Samuel W. Flint" . "swflint@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "swflint@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "swflint@samuelwflint.com"))]) + (denote-citar-sections . [(20240608 1629) ((emacs (26 1)) (denote (2 2 4)) (universal-sidecar (2 5 0)) (citar-denote (2 2 2)) (citar (1 4))) "Universal Sidecar sections for citar-denote" tar ((:url . "https://git.sr.ht/~swflint/denote-sections") (:commit . "00c7084652fa32f9f4ab504facaaed623f299684") (:revdesc . "00c7084652fa") (:keywords "convenience" "files" "hypermedia" "notes") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (denote-explore . [(20251027 911) ((emacs (29 1)) (denote (4 0)) (dash (2 19 1)) (denote-regexp (20250415 2202))) "Explore and visualise Denote files" tar ((:url . "https://github.com/pprevos/denote-explore/") (:commit . "3adc8b4d342bbc411d667f93dbc1f1468a245e04") (:revdesc . "3adc8b4d342b") (:authors ("Peter Prevos" . "peter@prevos.net")) (:maintainers ("Peter Prevos" . "peter@prevos.net")) (:maintainer "Peter Prevos" . "peter@prevos.net"))]) + (denote-journal-capture . [(20250315 1919) ((emacs (24 1)) (denote-journal (0))) "Better Integration for Denote Journal and Org Capture" tar ((:url . "https://git.sr.ht/~swflint/denote-journal-capture") (:commit . "64ca22073b01b9a3fca15ff300342ce67932cd3d") (:revdesc . "64ca22073b01") (:keywords "convenience") (:authors ("Samuel W. Flint" . "swflint@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "swflint@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "swflint@samuelwflint.com"))]) + (denote-project-notes . [(20250610 1516) ((emacs (28 1)) (denote (3 0 0))) "Link Denote notes to a project" tar ((:url . "https://git.sr.ht/~swflint/denote-project-notes") (:commit . "697420c089d313bf65e7963248c1909a8fdb348d") (:revdesc . "697420c089d3") (:keywords "convenience") (:authors ("Samuel W. Flint" . "swflint@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "swflint@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "swflint@samuelwflint.com"))]) + (denote-regexp . [(20250415 2202) ((emacs (27 1)) (denote (3 1 0))) "Compose regexps to match Denote files" tar ((:url . "https://git.sr.ht/~swflint/denote-regexp") (:commit . "08d62cb5bb2d271eb4e0915b56a9601179f88627") (:revdesc . "08d62cb5bb2d") (:keywords "convenience") (:authors ("Samuel W. Flint" . "swflint@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "swflint@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "swflint@samuelwflint.com"))]) + (denote-sections . [(20240608 1629) ((universal-sidecar (2 5 0)) (denote (2 2 4)) (emacs (27 1))) "Universal Sidecar Sections for Denote" tar ((:url . "https://git.sr.ht/~swflint/denote-sections") (:commit . "00c7084652fa32f9f4ab504facaaed623f299684") (:revdesc . "00c7084652fa") (:keywords "convenience" "files" "notes" "hypermedia") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (departure-times-norway . [(20250921 1626) ((emacs (27 1)) (persist (0 6 1))) "Display public transport departure times in Norway" tar ((:url . "https://github.com/hsolg/emacs-departure-times-norway") (:commit . "3b0559bc55099cb025df63715ed9029885b64c39") (:revdesc . "3b0559bc5509") (:authors ("Henrik Solgaard" . "henrik.solgaard@gmail.com")) (:maintainers ("Henrik Solgaard" . "henrik.solgaard@gmail.com")) (:maintainer "Henrik Solgaard" . "henrik.solgaard@gmail.com"))]) + (describe-hash . [(20200718 1556) nil "Help function for examining a hash map" tar ((:url . "https://github.com/Junker/describe-hash") (:commit . "20dbbbea630055b2401f13a55fbb21216960dc46") (:revdesc . "20dbbbea6300"))]) + (describe-number . [(20151101 55) ((yabin (1 1))) "Describe arbitrarily large number at point" tar ((:url . "https://github.com/netromdk/describe-number") (:commit . "40618345a37831804b29589849a785ef5aa5ac24") (:revdesc . "40618345a378") (:keywords "describe" "value" "help") (:authors ("Morten Slot Kristensen" . "mskATnullpointerDOTdk")) (:maintainers ("Morten Slot Kristensen" . "mskATnullpointerDOTdk")) (:maintainer "Morten Slot Kristensen" . "mskATnullpointerDOTdk"))]) + (desktop+ . [(20170107 2132) ((emacs (24 4)) (dash (2 11 0)) (f (0 17 2))) "Handle special buffers when saving & restoring sessions" tar ((:url . "https://github.com/ffevotte/desktop-plus") (:commit . "d26f369bda96860eef18365cdb5c79f39a2c765c") (:revdesc . "d26f369bda96") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainers ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com"))]) + (desktop-environment . [(20250821 1428) ((emacs (25 1))) "Helps you control your GNU/Linux computer" tar ((:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment") (:commit . "1f16fa0fcc1b5b33773a8e334a60133a046e9fc7") (:revdesc . "1f16fa0fcc1b") (:authors ("Damien Cassou" . "damien@cassou.me") ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Damien Cassou" . "damien@cassou.me") ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (desktop-mail-user-agent . [(20210519 1008) ((emacs (24 3))) "Call OS default mail program to compose mail" tar ((:url . "https://github.com/lassik/emacs-desktop-mail-user-agent") (:commit . "caac672ef7e4ddced960fa31cef3a6ba5d7ab451") (:revdesc . "caac672ef7e4") (:keywords "mail") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (desktop-registry . [(20140119 2143) nil "Keep a central registry of desktop files" tar ((:url . "http://projects.ryuslash.org/desktop-registry/") (:commit . "244c2e7f9f0a1050aa8a47ad0b38f4e4584682dd") (:revdesc . "244c2e7f9f0a") (:keywords "convenience") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org"))]) + (detached . [(20221129 1430) ((emacs (27 1))) "A package to launch, and manage, detached processes" tar ((:url . "https://sr.ht/~niklaseklund/detached.el/") (:commit . "6b64d4d8064cee781e071e825857b442ea96c3d9") (:revdesc . "6b64d4d8064c") (:keywords "convenience" "processes") (: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"))]) + (detour . [(20181122 2138) ((emacs (24 4))) "Take a quick detour and return" tar ((:url . "https://github.com/ska2342/detour/") (:commit . "f41f17cf1cf4f3db41563ff011786b6567596fb4") (:revdesc . "f41f17cf1cf4") (:keywords "convenience" "abbrev") (:authors ("Stefan Kamphausen" . "www.skamphausen.de")) (:maintainers ("Stefan Kamphausen" . "www.skamphausen.de")) (:maintainer "Stefan Kamphausen" . "www.skamphausen.de"))]) + (devdocs . [(20251022 1255) ((emacs (27 1)) (compat (30 1))) "Emacs viewer for DevDocs" tar ((:url . "https://github.com/astoff/devdocs.el") (:commit . "25c746024ddf73570195bf42b841f761a2fee10c") (:revdesc . "25c746024ddf") (:keywords "help") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainers ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com"))]) + (devdocs-browser . [(20251129 225) ((emacs (27 1))) "Browse devdocs.io documents using EWW" tar ((:url . "https://github.com/blahgeek/emacs-devdocs-browser") (:commit . "f6c3b96748cb4e6d3022a2cece15d0d0fc437cd6") (:revdesc . "f6c3b96748cb") (:keywords "docs" "help" "tools") (:authors ("blahgeek" . "i@blahgeek.com")) (:maintainers ("blahgeek" . "i@blahgeek.com")) (:maintainer "blahgeek" . "i@blahgeek.com"))]) + (devil . [(20240107 2149) ((emacs (24 4))) "Minor mode for translating key sequences" tar ((:url . "https://github.com/susam/devil") (:commit . "dd29681fe07f37c4acbff32a5767bddcbf3b5b80") (:revdesc . "dd29681fe07f") (:keywords "convenience" "abbrev") (:authors ("Susam Pal" . "susam@susam.net")) (:maintainers ("Susam Pal" . "susam@susam.net")) (:maintainer "Susam Pal" . "susam@susam.net"))]) + (dfmt . [(20170728 1023) nil "Emacs Interface to D indenting/formatting tool dfmt" tar ((:url . "https://github.com/qsimpleq/elisp-dfmt") (:commit . "21b9094e907b7ac53f5ecb4ff4539613a9d12434") (:revdesc . "21b9094e907b") (:keywords "tools" "convenience" "languages" "dlang") (:maintainers ("Kirill Babikhin" . "qsimpleq")) (:maintainer "Kirill Babikhin" . "qsimpleq"))]) + (dhall-mode . [(20250105 1418) ((emacs (24 4)) (reformatter (0 3))) "Major mode for the dhall configuration language" tar ((:url . "https://github.com/psibi/dhall-mode") (:commit . "fca383a9c4622c1d9a39dc977572b34c7fa0b719") (:revdesc . "fca383a9c462") (:keywords "languages") (:authors ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainers ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainer "Sibi Prabakaran" . "sibi@psibi.in"))]) + (dianyou . [(20210525 1517) ((emacs (24 4))) "Search and analyze mails in Gnus" tar ((:url . "http://github.com/redguardtoo/dianyou") (:commit . "f77d9e76be5d8022fa6ee5426144f13f38dd09f2") (:revdesc . "f77d9e76be5d") (:keywords "mail") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (diary-manager . [(20220929 2042) ((emacs (25))) "Simple personal diary" tar ((:url . "https://github.com/radian-software/diary-manager") (:commit . "56c739224e5bb845d275bfe3f4e420285de3a929") (:revdesc . "56c739224e5b") (:keywords "extensions") (:authors ("Radian LLC" . "contact+diary-manager@radian.codes")) (:maintainers ("Radian LLC" . "contact+diary-manager@radian.codes")) (:maintainer "Radian LLC" . "contact+diary-manager@radian.codes"))]) + (dic-lookup-w3m . [(20180526 1621) ((w3m (20120723 324)) (stem (20120826))) "Look up dictionaries on the Internet" tar ((:url . "https://github.com/emacsattic/dic-lookup-w3m") (:commit . "3254ab10cbf0078c7162557dd1f68dac28459cf9") (:revdesc . "3254ab10cbf0") (:keywords "emacs-w3m" "w3m" "dictionary"))]) + (dicom . [(20251218 2251) ((emacs (29 1)) (compat (30))) "DICOM viewer - Digital Imaging & Communications in Medicine" tar ((:url . "https://github.com/minad/dicom") (:commit . "608963ef1475335d7466b50c38c5aaaeeb4cf98a") (:revdesc . "608963ef1475") (:keywords "multimedia" "hypermedia" "files") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (dictcc . [(20221231 1703) ((emacs (24 4)) (cl-lib (0 5))) "Look up translations on dict.cc" tar ((:url . "https://github.com/martenlienen/dictcc.el") (:commit . "30b505759e5a97c2aaa8b0e8ea5e187fdf625c65") (:revdesc . "30b505759e5a") (:keywords "convenience") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainers ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com"))]) + (dictionary . [(20201001 1727) ((connection (1 11)) (link (1 11))) "Client for rfc2229 dictionary servers" tar ((:url . "https://github.com/myrkr/dictionary-el") (:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:revdesc . "bdf0aa7761d1") (:keywords "interface" "dictionary") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainers ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net"))]) + (didyoumean . [(20251103 1002) ((emacs (24 4))) "Did you mean to open another file?" tar ((:url . "https://gitlab.com/kisaragi-hiu/didyoumean.el") (:commit . "398fc3bf8ea520cd0517076bdc9b609cc6858c80") (:revdesc . "398fc3bf8ea5") (:keywords "convenience"))]) + (diff-ansi . [(20251216 227) ((emacs (29 1))) "Display diffs using alternative diffing tools" tar ((:url . "https://codeberg.org/ideasman42/emacs-diff-ansi") (:commit . "dd600ebdc632c8f525dcba392526e6e56fcbca61") (:revdesc . "dd600ebdc632") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (diff-at-point . [(20251216 111) ((emacs (29 1))) "Diff navigation" tar ((:url . "https://codeberg.org/ideasman42/emacs-diff-at-point") (:commit . "9c1617f0fba88c1f7daef78276c86d4447c99d48") (:revdesc . "9c1617f0fba8") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (diff-hl . [(20251216 242) ((cl-lib (0 2)) (emacs (26 1))) "Highlight uncommitted changes using VC" tar ((:url . "https://github.com/dgutov/diff-hl") (:commit . "e79aa49ad3cbbe85379cf6646db3aaacd3b04708") (:revdesc . "e79aa49ad3cb") (:keywords "vc" "diff") (:authors ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainers ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev"))]) + (diffed . [(20240618 2037) ((emacs (27 1))) "Diffed is for recursive diff like Dired is for ls" tar ((:url . "https://github.com/ber-ro/diffed") (:commit . "93251169a4fc8c07fdd5f3d32c89b4d3401d37a1") (:revdesc . "93251169a4fc") (:keywords "tools") (:authors ("Bernhard Rotter" . "bernhard@b-rotter.de")) (:maintainers ("Bernhard Rotter" . "bernhard@b-rotter.de")) (:maintainer "Bernhard Rotter" . "bernhard@b-rotter.de"))]) + (difflib . [(20210224 2242) ((emacs (24 4)) (cl-generic (0 3)) (ht (2 2)) (s (1 12 0))) "Helpers for computing deltas between sequences" tar ((:url . "http://github.com/dieggsy/difflib.el") (:commit . "646fc4388274fe765bbf4661e17a24e4d081250c") (:revdesc . "646fc4388274") (:keywords "matching" "tools" "string") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainers ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me"))]) + (diffpdf . [(20210626 1447) ((emacs (25 1)) (transient (0 3 0))) "Transient diffpdf" tar ((:url . "https://github.com/ShuguangSun/diffpdf.el") (:commit . "a5b203b549e373cb9b0ef3f00c0010bd34dd644a") (:revdesc . "a5b203b549e3") (:keywords "tools") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (diffscuss-mode . [(20141014 2357) nil "Major mode for diffscuss files" tar ((:url . "https://github.com/tomheon/diffscuss") (:commit . "bbc6dbed4b97d1eb9ae5dae021ed1e066129bd98") (:revdesc . "bbc6dbed4b97") (:keywords "tools") (:authors ("Edmund Jorgensen" . "edmund@hut8labs.com")) (:maintainers ("Edmund Jorgensen" . "edmund@hut8labs.com")) (:maintainer "Edmund Jorgensen" . "edmund@hut8labs.com"))]) + (difftastic . [(20251217 921) ((emacs (28 1)) (compat (29 1 4 2)) (magit (4 0 0)) (transient (0 4 0))) "Wrapper for difftastic" tar ((:url . "https://github.com/pkryger/difftastic.el") (:commit . "1ed9a8459d84b7489efb2094250485c5e2913149") (:revdesc . "1ed9a8459d84") (:keywords "tools" "diff") (:authors ("Przemyslaw Kryger" . "pkryger@gmail.com")) (:maintainers ("Przemyslaw Kryger" . "pkryger@gmail.com")) (:maintainer "Przemyslaw Kryger" . "pkryger@gmail.com"))]) + (diffview . [(20230224 1916) nil "View diffs in side-by-side format" tar ((:url . "https://github.com/mgalgs/diffview-mode") (:commit . "8f07c0ff4a1acef990589df0d3e32288f19c9d71") (:revdesc . "8f07c0ff4a1a") (:keywords "convenience" "diff") (:authors ("Mitchel Humpherys" . "mitch.special@gmail.com")) (:maintainers ("Mitchel Humpherys" . "mitch.special@gmail.com")) (:maintainer "Mitchel Humpherys" . "mitch.special@gmail.com"))]) + (digistar-mode . [(20250710 1554) ((emacs (25 1))) "Major mode for Digistar scripts" tar ((:url . "https://github.com/retroj/digistar-mode/") (:commit . "09063c4f05129be3c4b595a318edabf6ad05393a") (:revdesc . "09063c4f0512") (:keywords "languages") (:authors ("John Foerch" . "jjfoerch@gmail.com")) (:maintainers ("John Foerch" . "jjfoerch@gmail.com")) (:maintainer "John Foerch" . "jjfoerch@gmail.com"))]) + (digit-groups . [(20200506 37) ((dash (2 11 0))) "Highlight place-value positions in numbers" tar ((:url . "https://github.com/adamsmd/digit-groups/") (:commit . "7b81930cad19b8b7913b7eedbcb498964bfdcbdb") (:revdesc . "7b81930cad19") (:authors ("Michael D. Adams" . "http://michaeldadams.org")) (:maintainers ("Michael D. Adams" . "http://michaeldadams.org")) (:maintainer "Michael D. Adams" . "http://michaeldadams.org"))]) + (digitalocean . [(20190607 726) ((request (2 5)) (emacs (24 4))) "Create and manipulate digitalocean droplets" tar ((:url . "https://github.com/olymk2/emacs-digitalocean") (:commit . "6c32d3593286e2a62d9afab0057c829407b0d1e8") (:revdesc . "6c32d3593286") (:keywords "processes" "tools") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainers ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com"))]) + (digitalocean-helm . [(20180610 746) ((emacs (24 3)) (helm (2 5)) (digitalocean (0 1))) "Create and manipulate digitalocean droplets" tar ((:url . "https://gitlab.com/olymk2/digitalocean-api") (:commit . "b125c9882eded7d73ec109d152b26625f333440b") (:revdesc . "b125c9882ede") (:keywords "processes" "tools") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainers ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com"))]) + (dilbert . [(20211118 1512) ((emacs (26 1)) (enlive (0 0 1)) (dash (2 19 1))) "View Dilbert comics" tar ((:url . "https://github.com/DaniruKun/dilbert-el") (:commit . "d8c586f1bac58c334822b64bce671dde5e25a27f") (:revdesc . "d8c586f1bac5") (:keywords "multimedia" "news") (:authors ("Daniils Petrovs" . "thedanpetrov@gmail.com")) (:maintainers ("Daniils Petrovs" . "thedanpetrov@gmail.com")) (:maintainer "Daniils Petrovs" . "thedanpetrov@gmail.com"))]) + (dim . [(20160818 949) ((emacs (24 4))) "Change mode-line names of major/minor modes" tar ((:url . "https://github.com/alezost/dim.el") (:commit . "110624657fec0c8a7b3589108230e6a635302ae0") (:revdesc . "110624657fec") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (dim-autoload . [(20251101 2000) ((emacs (26 1)) (compat (30 1))) "Dim or hide autoload cookie lines" tar ((:url . "https://github.com/tarsius/dim-autoload") (:commit . "793b259f6ad2c1b47152986ec2d39622792fb3d2") (:revdesc . "793b259f6ad2") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "emacs.dim-autoload@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.dim-autoload@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.dim-autoload@jonas.bernoulli.dev"))]) + (dime . [(20210613 1431) ((emacs (25 1)) (dylan (3 0))) "Dylan interaction mode" tar ((:url . "https://opendylan.org/") (:commit . "d85409dc3cba57a390ca85da95822f8078ecbfa2") (:revdesc . "d85409dc3cba"))]) + (diminish . [(20220909 847) ((emacs (24 3))) "Diminished modes are minor modes with no modeline display" tar ((:url . "https://github.com/myrjola/diminish.el") (:commit . "fbd5d846611bad828e336b25d2e131d1bc06b83d") (:revdesc . "fbd5d846611b") (:keywords "extensions" "diminish" "minor" "codeprose") (:authors ("Will Mengarini" . "seldon@eskimo.com")) (:maintainers ("Martin Yrjölä" . "martin.yrjola@gmail.com")) (:maintainer "Martin Yrjölä" . "martin.yrjola@gmail.com"))]) + (diminish-buffer . [(20250101 1007) ((emacs (24 4))) "Diminish (hide) buffers from buffer-menu" tar ((:url . "https://github.com/jcs-elpa/diminish-buffer") (:commit . "6cc16c7b29b7f77b7df1fc59287551b1120a7bf7") (:revdesc . "6cc16c7b29b7") (:keywords "convenience" "diminish" "hide" "buffer" "menu") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (dimmer . [(20220817 122) ((emacs (25 1))) "Visually highlight the selected buffer" tar ((:url . "https://github.com/gonewest818/dimmer.el") (:commit . "a5b697580e5aed6168b571ae3d925753428284f8") (:revdesc . "a5b697580e5a") (:keywords "faces" "editing"))]) + (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 ((:url . "https://github.com/nlamirault/dionysos") (:commit . "98bc789d20e41020d6e62d63d3c78f8032fa4bf2") (:revdesc . "98bc789d20e4") (:keywords "music") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (dir-config . [(20251103 1431) ((emacs (25 1))) "Find and evaluate .dir-config.el (dir-locals alternative)" tar ((:url . "https://github.com/jamescherti/dir-config.el") (:commit . "727e34c77b2b43c6b0d0bc10556ece8c21bd1f9e") (:revdesc . "727e34c77b2b") (:keywords "convenience"))]) + (dir-treeview . [(20241025 2251) ((emacs (25 1)) (treeview (1 3 0))) "A directory tree browser and simple file manager" tar ((:url . "https://github.com/tilmanrassy/emacs-dir-treeview") (:commit . "09cf976b0f5999e378141bb66361395f1832aeae") (:revdesc . "09cf976b0f59") (:keywords "tools" "convenience" "files") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainers ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com"))]) + (dir-treeview-themes . [(20230112 134) ((emacs (24 4)) (dir-treeview (1 3 3))) "Themes for dir-treeview" tar ((:url . "https://github.com/tilmanrassy/emacs-dir-treeview-themes") (:commit . "8e28c2501a978e6ff733fc9cf43a826fd8e7b87e") (:revdesc . "8e28c2501a97") (:keywords "tools" "convenience" "files") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainers ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com"))]) + (dircmp . [(20141204 1756) nil "Compare and sync directories" tar ((:url . "https://github.com/matthewlmcclure/dircmp-mode") (:commit . "558ee0b601c2de9d247612085aafe2926f56a09f") (:revdesc . "558ee0b601c2") (:keywords "unix" "tools"))]) + (director . [(20230213 1201) ((emacs (27 1))) "Simulate user sessions" tar ((:url . "https://bard.github.io/emacs-director") (:commit . "16afdbbd91b451fab44c68c8f7d0b810f5283f28") (:revdesc . "16afdbbd91b4") (:keywords "maint" "tools") (:authors ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainers ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainer "Massimiliano Mirra" . "hyperstruct@gmail.com"))]) + (directory-slideshow . [(20251218 554) ((emacs (29 4))) "Simple slideshows from files" tar ((:url . "https://github.com/Duncan-Britt/directory-slideshow") (:commit . "a54e6bc923f1f31867d7899ec179eb91f3dda300") (:revdesc . "a54e6bc923f1") (:keywords "multimedia"))]) + (dired-atool . [(20210719 404) ((emacs (24))) "Pack/unpack files with atool on dired" tar ((:url . "https://github.com/HKey/dired-atool") (:commit . "01416fd5961b901c50686c91cb59b3833adc831b") (:revdesc . "01416fd5961b") (:keywords "files") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com"))]) + (dired-auto-readme . [(20250726 1928) ((emacs (29 1)) (markdown-mode (2 5))) "Auto-display README file in Dired buffers" tar ((:url . "https://github.com/amno1/dired-auto-readme") (:commit . "d1cced1a5cf26ff50a8c1585b6e6813a3ddb8395") (:revdesc . "d1cced1a5cf2") (:keywords "tools" "convenience"))]) + (dired-avfs . [(20240629 1857) ((dash (2 5 0)) (dired-hacks-utils (0 0 1)) (emacs (24))) "AVFS support for dired" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "d1a85901c892ba7ec273995070a43cbbbe5d0b37") (:revdesc . "d1a85901c892") (:keywords "files") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (dired-collapse . [(20240629 1857) ((f (0 19 0)) (s (1 13 1)) (dired-hacks-utils (0 0 1)) (emacs (24))) "Collapse unique nested paths in dired listing" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "d1a85901c892ba7ec273995070a43cbbbe5d0b37") (:revdesc . "d1a85901c892") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (dired-du-duc . [(20251223 1946) ((emacs (29 1)) (dired-du (0 5 2))) "Speed up dired-du with duc" tar ((:url . "https://github.com/meedstrom/dired-du-duc") (:commit . "8b72d0a3c42332f23ca3c9fe7a940c9c0db2e474") (:revdesc . "8b72d0a3c423") (:keywords "files") (:authors ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainers ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainer "Martin Edström" . "meedstrom91@gmail.com"))]) + (dired-duplicates . [(20240328 2016) ((emacs (27 1))) "Find duplicate files locally and remotely" tar ((:url . "https://codeberg.org/hjudt/dired-duplicates") (:commit . "5c5f24bea92159987f65f01ef32b261e905997bd") (:revdesc . "5c5f24bea921") (:keywords "files") (:authors ("Harald Judt" . "h.judt@gmx.at")) (:maintainers ("Harald Judt" . "h.judt@gmx.at")) (:maintainer "Harald Judt" . "h.judt@gmx.at"))]) + (dired-dups . [(20130527 2125) nil "Find duplicate files and display them in a dired buffer" tar ((:url . "https://github.com/vapniks/dired-dups") (:commit . "694ad128c822c59348ced16c4a0c1356d43da47a") (:revdesc . "694ad128c822") (:keywords "unix") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (dired-efap . [(20250726 1400) nil "Edit Filename At Point in a dired buffer" tar ((:url . "https://github.com/juan-leon/dired-efap") (:commit . "34afe56327e26b90634e054e3b38e69c82f833bd") (:revdesc . "34afe56327e2") (:keywords "dired" "environment" "files" "renaming") (:authors ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainers ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainer "Juan-Leon Lahoz" . "juanleon1@gmail.com"))]) + (dired-explorer . [(20180607 221) ((cl-lib (0 5))) "Minor-mode provides Explorer like select file at dired" tar ((:url . "https://github.com/jidaikobo-shibata/dired-explorer") (:commit . "3ade0a31b5340271d05e9bf443f2504960f6c6dd") (:revdesc . "3ade0a31b534") (:keywords "dired" "explorer"))]) + (dired-filetype-face . [(20250412 1344) nil "Set different faces for different filetypes in dired" tar ((:url . "https://github.com/jixiuf/dired-filetype-face") (:commit . "41288f9f35a7ef830b9e78fe252b367aee078c96") (:revdesc . "41288f9f35a7") (:keywords "dired" "filetype" "face") (:authors (nil . "jixiufatgmaildotcom")) (:maintainers (nil . "jixiufatgmaildotcom")) (:maintainer nil . "jixiufatgmaildotcom"))]) + (dired-filter . [(20240629 1857) ((dash (2 10 0)) (dired-hacks-utils (0 0 1)) (f (0 17 0)) (cl-lib (0 3)) (emacs (24))) "Ibuffer-like filtering for dired" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "d1a85901c892ba7ec273995070a43cbbbe5d0b37") (:revdesc . "d1a85901c892") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (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 ((:url . "https://github.com/conao3/dired-git.el") (:commit . "e84387b947cd707d3ff0c039ddef753a468f88e7") (:revdesc . "e84387b947cd") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (dired-gitignore . [(20230909 1408) ((emacs (27 1))) "A minor mode to hide gitignored files in a dired buffer" tar ((:url . "https://github.com/johannes-mueller/dired-gitignore.el") (:commit . "b6e804c212b497d5502600bd4df10196e44d2bf7") (:revdesc . "b6e804c212b4") (:keywords "dired" "convenience" "git") (:authors ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainers ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainer "Johannes Mueller" . "github@johannes-mueller.org"))]) + (dired-hacks-utils . [(20240629 1906) ((dash (2 5 0)) (emacs (24 3))) "Utilities and helpers for dired-hacks collection" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "63b04d17936c98cb4ad7ce6bc3331cda8e30c55a") (:revdesc . "63b04d17936c") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (dired-hide-dotfiles . [(20240727 1720) ((emacs (25 1))) "Hide dotfiles in dired" tar ((:url . "https://github.com/mattiasb/dired-hide-dotfiles") (:commit . "0d035ba8c5decc5957d50f3c64ef860b5c2093a1") (:revdesc . "0d035ba8c5de") (:keywords "files") (:authors ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainers ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainer "Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com"))]) + (dired-hist . [(20251110 1828) ((emacs (27 1))) "Traverse Dired buffer's history: back, forward" tar ((:url . "https://codeberg.org/Anoncheg/dired-hist") (:commit . "8cca7292086b849ef170d17bc6beafbc2d3228b6") (:revdesc . "8cca7292086b") (:keywords "convenience" "dired" "history") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com"))]) + (dired-icon . [(20170223 526) ((emacs (24 3))) "A minor mode to display a list of associated icons in dired buffers" tar ((:url . "https://gitlab.com/xuhdev/dired-icon") (:commit . "f60e10757a5011235b519231ad35974ff25963ed") (:revdesc . "f60e10757a50") (:keywords "dired" "files") (:authors ("Hong Xu" . "hong@topbug.net")) (:maintainers ("Hong Xu" . "hong@topbug.net")) (:maintainer "Hong Xu" . "hong@topbug.net"))]) + (dired-imenu . [(20230904 1810) nil "Imenu binding for dired mode" tar ((:url . "https://github.com/DamienCassou/dired-imenu") (:commit . "4f6169f9056fe5f9b9a97e9e75f27825a15e05b9") (:revdesc . "4f6169f9056f") (:keywords "dired" "imenu") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com"))]) + (dired-k . [(20211002 2358) ((emacs (24 3))) "Highlight dired by size, date, git status" tar ((:url . "https://github.com/emacsorphanage/dired-k") (:commit . "b9507bac79fc8c030abbec389267262bc671f58b") (:revdesc . "b9507bac79fc") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (dired-launch . [(20250128 1955) ((emacs (24 3))) "Use dired as a launcher" tar ((:url . "https://codeberg.org/thomp/dired-launch") (:commit . "32ba5b600034a58511fc243fd06165cc07120cbb") (:revdesc . "32ba5b600034") (:keywords "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 ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "475be5486bc2d593283ba6e8c8c43053d4cbdd7f") (:revdesc . "475be5486bc2") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (dired-lsi . [(20200812 929) ((emacs (26 1))) "Add memo to directory and show it in dired" tar ((:url . "https://github.com/conao3/dired-lsi.el") (:commit . "0f4038c8b47f6cfc70f82062800700c14c9912c2") (:revdesc . "0f4038c8b47f") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (dired-narrow . [(20250511 2303) ((dash (2 7 0)) (dired-hacks-utils (0 0 1)) (emacs (24))) "Live-narrowing of search results for dired" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "bb5d1c3c8b0bb6025335dabb4b3639d60acc6a12") (:revdesc . "bb5d1c3c8b0b") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (dired-open . [(20240629 1857) ((dash (2 5 0)) (dired-hacks-utils (0 0 1)) (emacs (24))) "Open files from dired using using custom actions" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "d1a85901c892ba7ec273995070a43cbbbe5d0b37") (:revdesc . "d1a85901c892") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (dired-open-with . [(20240923 2050) ((emacs (28 1))) "And \"Open with\" dialog for Dired" tar ((:url . "https://github.com/FrostyX/dired-open-with") (:commit . "5f9fddecea3d467a6d7bdb6a1863505b92a81e0d") (:revdesc . "5f9fddecea3d") (:keywords "files" "dired" "xdg" "open-with") (:authors ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainers ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainer "Jakub Kadlčík" . "frostyx@email.cz"))]) + (dired-posframe . [(20200817 420) ((emacs (26 1)) (posframe (0 7))) "Peep dired items using posframe" tar ((:url . "https://github.com/conao3/dired-posframe.el") (:commit . "1a21eb9ad956a0371dd3c9e1bec53407d685f705") (:revdesc . "1a21eb9ad956") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (dired-quick-sort . [(20250212 2155) ((hydra (0 13 0)) (emacs (28))) "Persistent quick sorting of Dired buffers in various ways" tar ((:url . "https://gitlab.com/xuhdev/dired-quick-sort") (:commit . "611acc82919e99ac37ce504934f5e8c605ad7efa") (:revdesc . "611acc82919e") (:keywords "convenience" "files") (:authors ("Hong Xu" . "hong@topbug.net")) (:maintainers ("Hong Xu" . "hong@topbug.net")) (:maintainer "Hong Xu" . "hong@topbug.net"))]) + (dired-rainbow . [(20240629 1857) ((dash (2 5 0)) (dired-hacks-utils (0 0 1)) (emacs (24))) "Extended file highlighting according to its type" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "d1a85901c892ba7ec273995070a43cbbbe5d0b37") (:revdesc . "d1a85901c892") (:keywords "files") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (dired-ranger . [(20240629 1857) ((dash (2 7 0)) (dired-hacks-utils (0 0 1)) (emacs (24 3))) "Implementation of useful ranger features for dired" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "d1a85901c892ba7ec273995070a43cbbbe5d0b37") (:revdesc . "d1a85901c892") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (dired-recent . [(20211004 1924) ((emacs (24))) "Dired visited paths history" tar ((:url . "https://github.com/vifon/dired-recent.el") (:commit . "a376f53e42fdca80c3286e8111578c65c64b0711") (:revdesc . "a376f53e42fd") (:keywords "files") (:authors ("Wojciech Siewierski" . "wojciechdotsiewierskiatonetdotpl")) (:maintainers ("Wojciech Siewierski" . "wojciechdotsiewierskiatonetdotpl")) (:maintainer "Wojciech Siewierski" . "wojciechdotsiewierskiatonetdotpl"))]) + (dired-rifle . [(20250307 130) nil "Call rifle(1) from dired" tar ((:url . "https://github.com/vifon/dired-rifle.el") (:commit . "4bc28f2892cf586cde0a200e350b17218dc556c4") (:revdesc . "4bc28f2892cf") (:keywords "files" "convenience") (:authors ("Wojciech Siewierski" . "wojciechdotsiewierskiatonetdotpl")) (:maintainers ("Wojciech Siewierski" . "wojciechdotsiewierskiatonetdotpl")) (:maintainer "Wojciech Siewierski" . "wojciechdotsiewierskiatonetdotpl"))]) + (dired-rmjunk . [(20191007 1232) nil "A home directory cleanup utility for Dired" tar ((:url . "https://git.sr.ht/~jakob/dired-rmjunk") (:commit . "0e890a41fa680a45b4b4aad2c28f9d6dca999cee") (:revdesc . "0e890a41fa68") (:keywords "files" "matching") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainers ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org"))]) + (dired-rsync . [(20230822 1350) ((s (1 12 0)) (dash (2 0 0)) (emacs (25 1))) "Allow rsync from dired buffers" tar ((:url . "https://github.com/stsquad/dired-rsync") (:commit . "5bcb851f3bf9c4f7c07299fcc25be7c408a68cda") (:revdesc . "5bcb851f3bf9") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainers ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com"))]) + (dired-rsync-transient . [(20230714 1459) ((dired-rsync (0 6)) (transient (0 3 0)) (emacs (24 4))) "Transient command for dired-rsync" tar ((:url . "https://github.com/stsquad/dired-rsync") (:commit . "95607fc7eb84e792122b52d2b1d62f49199a2a37") (:revdesc . "95607fc7eb84") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainers ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com"))]) + (dired-sidebar . [(20250212 629) ((emacs (25 1)) (dired-subtree (0 0 1)) (compat (30 0 0 0))) "Tree browser leveraging dired" tar ((:url . "https://github.com/jojojames/dired-sidebar") (:commit . "3bc8927ed4d14a017eefc75d5af65022343e2ac1") (:revdesc . "3bc8927ed4d1") (:keywords "dired" "files" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (dired-subtree . [(20240629 1859) ((dash (2 5 0)) (dired-hacks-utils (0 0 1)) (emacs (24 3))) "Insert subdirectories in a tree-like fashion" tar ((:url . "https://github.com/Fuco1/dired-hacks") (:commit . "b769c7de9c8c5dc70e4dcdbb3267c70fae3cb9b7") (:revdesc . "b769c7de9c8c") (:keywords "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (dired-toggle . [(20190616 303) nil "Show dired as sidebar and will not create new buffers when changing dir" tar ((:url . "https://github.com/fasheng/dired-toggle") (:commit . "b694ba91a45d0762bd032ff1bb4109e4c62ca686") (:revdesc . "b694ba91a45d") (:keywords "dired" "sidebar") (:authors ("Xu FaSheng" . "fasheng[AT]fasheng.info")))]) + (dired-toggle-sudo . [(20211216 102) nil "Browse directory with sudo privileges" tar ((:url . "https://github.com/renard/dired-toggle-sudo") (:commit . "9f86cdf858225b15c20affb97ed105e4109047bf") (:revdesc . "9f86cdf85822") (:keywords "emacs" "dired") (:authors ("Sebastien Gross" . "seb•ɑƬ•chezwam•ɖɵʈ•org")) (:maintainers ("Sebastien Gross" . "seb•ɑƬ•chezwam•ɖɵʈ•org")) (:maintainer "Sebastien Gross" . "seb•ɑƬ•chezwam•ɖɵʈ•org"))]) + (dired-video-thumbnail . [(20251215 816) ((emacs (28 1))) "Display video thumbnails from dired" tar ((:url . "https://github.com/captainflasmr/dired-video-thumbnail") (:commit . "4735c6d81c48228f9dccc48a09ca715bf2e6ffad") (:revdesc . "4735c6d81c48") (:keywords "multimedia" "files" "dired"))]) + (dired-view-data . [(20240328 328) ((emacs (26 1)) (ess (18 10 1)) (ess-view-data (1 0))) "View data from dired via ESS and R" tar ((:url . "https://github.com/ShuguangSun/dired-view-data") (:commit . "2dadb995c3f32c572f5483adab21bdff3ac64186") (:revdesc . "2dadb995c3f3") (:keywords "tools") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (diredc . [(20251124 1412) ((emacs (26 1)) (key-assist (1 0))) "Midnight Commander features (plus) for dired" tar ((:url . "https://github.com/Boruch-Baum/emacs-diredc") (:commit . "11ffa50763ac06a4aa356ba27f8ce5b57a0ac36c") (:revdesc . "11ffa50763ac") (:keywords "files"))]) + (diredfd . [(20241209 623) ((emacs (28 1))) "Dired functions and settings to mimic FD/FDclone" tar ((:url . "https://github.com/knu/diredfd.el") (:commit . "d789710c7e9699dae6ca87dcbfc27641a85fa3b6") (:revdesc . "d789710c7e96") (:keywords "unix" "directories" "dired") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (diredfl . [(20241201 1141) ((emacs (24))) "Extra font lock rules for a more colourful dired" tar ((:url . "https://github.com/purcell/diredfl") (:commit . "fe72d2e42ee18bf6228bba9d7086de4098f18a70") (:revdesc . "fe72d2e42ee1") (:keywords "faces") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (diredful . [(20160529 2017) nil "Colorful file names in dired buffers" tar ((:url . "https://github.com/thamer/diredful") (:commit . "b17b3087e0084a5571a9ac4d47ccfc36d96b109e") (:revdesc . "b17b3087e008") (:keywords "dired" "colors" "extension" "widget") (:authors ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainers ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainer "Thamer Mahmoud" . "thamer.mahmoud@gmail.com"))]) + (direnv . [(20240314 715) ((emacs (25 1)) (dash (2 12 0))) "Direnv integration" tar ((:url . "https://github.com/wbolster/emacs-direnv") (:commit . "c0bf3b81c7a97e2a0d06d05495e86848254fcc1f") (:revdesc . "c0bf3b81c7a9") (:keywords "direnv" "environment" "processes" "unix" "tools") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (direx . [(20230409 1425) nil "Simple Directory Explorer" tar ((:url . "https://github.com/emacsorphanage/direx") (:commit . "935d2010234c02c93e22d6e1cc72d595341ba855") (:revdesc . "935d2010234c") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))]) + (direx-grep . [(20140515 1506) ((direx (0 1 -3))) "Grep node of direx.el using incremental search like anything.el/helm.el" tar ((:url . "https://github.com/aki2o/direx-grep") (:commit . "1109a512a80b2673a70b18b8568514049017faad") (:revdesc . "1109a512a80b") (:keywords "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (dirtree . [(20140129 832) ((tree-mode (1 1 1 1)) (windata (0))) "Directory tree views" tar ((:url . "https://github.com/emacsorphanage/dirtree") (:commit . "ba55f1e716e386fdd37cb8e7f48616e405dc7251") (:revdesc . "ba55f1e716e3") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainers ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))]) + (dirtree-prosjekt . [(20140129 904) ((prosjekt (0 3)) (dirtree (0 1))) "Dirtree integration for prosjekt" tar ((:url . "https://github.com/abingham/prosjekt") (:commit . "03e06910589ba5cd736868793eb436b3233c6a26") (:revdesc . "03e06910589b") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (dirvish . [(20250504 807) ((emacs (28 1)) (compat (30))) "A modern file manager based on dired mode" tar ((:url . "https://github.com/alexluigit/dirvish") (:commit . "d877433f957a363ad78b228e13a8e5215f2d6593") (:revdesc . "d877433f957a") (:keywords "files" "convenience") (:authors ("Alex Lu" . "https://github.com/alexluigit")) (:maintainers ("Alex Lu" . "https://github.com/alexluigit")) (:maintainer "Alex Lu" . "https://github.com/alexluigit"))]) + (disable-mouse . [(20240604 900) ((emacs (24 1))) "Disable mouse commands globally" tar ((:url . "https://github.com/purcell/disable-mouse") (:commit . "93a55a6453f34049375f97d3cf817b4e6db46f25") (:revdesc . "93a55a6453f3") (:keywords "mouse") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (disaster . [(20250828 2224) ((emacs (27))) "Disassemble C, C++ or Fortran code under cursor" tar ((:url . "https://github.com/jart/disaster") (:commit . "0299c129d4153e3a794358159737c3ff9d155654") (:revdesc . "0299c129d415") (:keywords "tools" "c") (:authors ("Justine Tunney" . "jtunney@gmail.com") ("Abdelhak Bougouffa" . "abougouffa@fedoraproject.org")) (:maintainers ("Abdelhak Bougouffa" . "abougouffa@fedoraproject.org")) (:maintainer "Abdelhak Bougouffa" . "abougouffa@fedoraproject.org"))]) + (discourse . [(20160911 819) ((cl-lib (0 5)) (request (0 2)) (s (1 11 0))) "Discourse api" tar ((:url . "https://github.com/lujun9972/discourse-api") (:commit . "a86c7e608851e186fe12e892a573994f08c8e65e") (:revdesc . "a86c7e608851") (:keywords "lisp" "discourse") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (discover . [(20140103 2139) ((makey (0 3))) "Discover more of Emacs" tar ((:url . "https://github.com/mickeynp/discover.el") (:commit . "bbfda2b4e429985a8fa7971d264c942767cfa816") (:revdesc . "bbfda2b4e429") (:authors ("Mickey Petersen" . "mickey@fyeah.org")) (:maintainers ("Mickey Petersen" . "mickey@fyeah.org")) (:maintainer "Mickey Petersen" . "mickey@fyeah.org"))]) + (discover-clj-refactor . [(20150328 1459) ((clj-refactor (0 14 0)) (discover (0 3))) "Adds discover context menu for clj-refactor" tar ((:url . "https://github.com/maio/discover-clj-refactor.el") (:commit . "3fbd5c1162739e606d7cf5d4f5d7426547d99647") (:revdesc . "3fbd5c116273") (:keywords "clj-refactor" "discover" "convenience") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainers ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com"))]) + (discover-js2-refactor . [(20140129 1552) ((js2-refactor (20131221 501)) (discover (20140103 1339))) "Adds discover context menu for js2-refactor" tar ((:url . "https://github.com/NicolasPetton/discover-js2-refactor") (:commit . "3812abf61f39f3e73a9f3daefa6fed4f21a429ba") (:revdesc . "3812abf61f39") (:keywords "js2-refactor" "discover") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))]) + (discover-my-major . [(20180606 511) ((makey (0 2))) "Discover key bindings and their meaning for the current Emacs major mode" tar ((:url . "https://framagit.org/steckerhalter/discover-my-major") (:commit . "66081546eac360c83a9c3270db92a2164288b0d0") (:revdesc . "66081546eac3") (:keywords "discover" "help" "major-mode" "keys"))]) + (disk . [(20171116 731) nil "Simplified find-file, revert-file, save-buffer interface" tar ((:url . "http://www.emacswiki.org/emacs/DiskKey") (:commit . "283e54e3be7d08f959076240b2ab324e25632137") (:revdesc . "283e54e3be7d") (:keywords "convenience") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Peter Barabas" . "peter.barabas+disk@gmail.com")) (:maintainers ("Alex Schroeder" . "alex@gnu.org") ("Peter Barabas" . "peter.barabas+disk@gmail.com")) (:maintainer "Alex Schroeder" . "alex@gnu.org"))]) + (dispass . [(20140202 1531) ((dash (1 0 0))) "Emacs wrapper for DisPass" tar ((:url . "http://projects.ryuslash.org/dispass.el/") (:commit . "b6e8f89040ebaaf0e7609b04bc27a8979f0ae861") (:revdesc . "b6e8f89040eb") (:keywords "processes") (:authors ("Tom Willemsen" . "tom@ryuslash.org")) (:maintainers ("Tom Willemsen" . "tom@ryuslash.org")) (:maintainer "Tom Willemsen" . "tom@ryuslash.org"))]) + (display-theme . [(20140115 1556) ((emacs (24))) "Display current theme(s) at mode-line" tar ((:url . "https://github.com/kawabata/emacs-display-theme/") (:commit . "b180b3be7a74ae4799a14e7e4bc2fe10e3ff7a15") (:revdesc . "b180b3be7a74") (:keywords "tools") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (display-wttr . [(20221102 1426) ((emacs (27 1))) "Display wttr(weather) in the mode line" tar ((:url . "https://github.com/josegpt/display-wttr") (:commit . "7062953d034e27c297d58748cf74dad552aa2873") (:revdesc . "7062953d034e") (:authors ("Jose G Perez Taveras" . "josegpt27@gmail.com")) (:maintainers ("Jose G Perez Taveras" . "josegpt27@gmail.com")) (:maintainer "Jose G Perez Taveras" . "josegpt27@gmail.com"))]) + (disproject . [(20251007 310) ((emacs (29 4)) (transient (0 9 2))) "Dispatch project commands with Transient" tar ((:url . "https://github.com/aurtzy/disproject") (:commit . "c2b14a5e1b1e9173b5089102a737e4ed110cd2b6") (:revdesc . "c2b14a5e1b1e") (:keywords "convenience" "files" "vc") (:authors ("Alvin Hsu" . "aurtzy@gmail.com")) (:maintainers ("Alvin Hsu" . "aurtzy@gmail.com")) (:maintainer "Alvin Hsu" . "aurtzy@gmail.com"))]) + (dispwatch . [(20210305 342) ((emacs (24 4))) "Watch displays for configuration changes" tar ((:url . "https://github.com/mnp/dispwatch") (:commit . "03abbac89a9f625aaa1a808dd49ae4906f466421") (:revdesc . "03abbac89a9f") (:keywords "frames") (:authors ("Mitchell Perilstein" . "mitchell.perilstein@gmail.com")) (:maintainers ("Mitchell Perilstein" . "mitchell.perilstein@gmail.com")) (:maintainer "Mitchell Perilstein" . "mitchell.perilstein@gmail.com"))]) + (dist-file-mode . [(20240107 2040) ((emacs (26))) "Dispatch major mode for *.dist files" tar ((:url . "https://github.com/emacs-php/dist-file-mode.el") (:commit . "8bb2f05487164cd690cac9c9c442969f6f79b81f") (:revdesc . "8bb2f0548716") (:keywords "files" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (distel-completion-lib . [(20180827 1344) nil "Completion library for Erlang/Distel" tar ((:url . "github.com/sebastiw/distel-completion") (:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:revdesc . "acc4c0a55219") (:keywords "erlang" "distel" "completion"))]) + (distinguished-theme . [(20151216 2015) nil "A dark and elegant theme for emacs" tar ((:url . "https://github.com/Lokaltog/distinguished-theme") (:commit . "9b1d25ac59465a5016d187ea84b7614c95a29b3b") (:revdesc . "9b1d25ac5946") (:authors ("Kim Silkebækken" . "kim.silkebaekken@gmail.com")) (:maintainers ("Kim Silkebækken" . "kim.silkebaekken@gmail.com")) (:maintainer "Kim Silkebækken" . "kim.silkebaekken@gmail.com"))]) + (ditz-mode . [(20150729 940) nil "Emacs interface to Ditz issue tracking system" tar ((:commit . "56668844acd91c3d15a08ba406dbb1ba0c2fe9b4") (:revdesc . "56668844acd9") (:keywords "tools") (:authors ("Glenn Hutchings" . "zondo42@gmail.com")) (:maintainers ("Glenn Hutchings" . "zondo42@gmail.com")) (:maintainer "Glenn Hutchings" . "zondo42@gmail.com"))]) + (dix . [(20250430 915) ((cl-lib (0 5)) (emacs (26 2))) "Apertium XML editing minor mode" tar ((:url . "http://wiki.apertium.org/wiki/Emacs") (:commit . "c833800623eaeab74b4d578a2d0219882320c0d2") (:revdesc . "c833800623ea") (:keywords "languages") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (dix-evil . [(20181210 1200) ((dix (0 3 0)) (evil (1 0 7))) "Optional evil-integration with dix.el" tar ((:url . "http://wiki.apertium.org/wiki/Emacs") (:commit . "b973de948deb7aa2995b1895e1e62bbe3129b5a5") (:revdesc . "b973de948deb") (:keywords "languages") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (dizzee . [(20171201 916) nil "A more pleasant way to manage your project's subprocesses in Emacs" tar ((:url . "https://github.com/davidmiller/dizzee") (:commit . "e3cf1c2ea5d0fc00747524b6f3c5b905d0a8c8e1") (:revdesc . "e3cf1c2ea5d0") (:keywords "emacs" "processes") (:authors ("David Miller" . "david@deadpansincerity.com")) (:maintainers ("David Miller" . "david@deadpansincerity.com")) (:maintainer "David Miller" . "david@deadpansincerity.com"))]) + (django-commands . [(20220314 1545) ((emacs (25 1))) "Run django commands" tar ((:url . "https://github.com/muffinmad/emacs-django-commands") (:commit . "7510c0f068bf214ad012c203d68e03ff4262efdf") (:revdesc . "7510c0f068bf") (:keywords "tools") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com"))]) + (django-manage . [(20160819 212) ((hydra (0 13 2))) "Django minor mode for commanding manage.py" tar ((:url . "https://github.com/gopar/django-manage") (:commit . "e72b1cf2fdbb5c624d19169176e60467b4918fe2") (:revdesc . "e72b1cf2fdbb") (:keywords "languages") (:authors ("Daniel Gopar" . "gopardaniel@yahoo.com")) (:maintainers ("Daniel Gopar" . "gopardaniel@yahoo.com")) (:maintainer "Daniel Gopar" . "gopardaniel@yahoo.com"))]) + (django-mode . [(20170522 714) ((projectile (0)) (s (0)) (helm-make (0))) "Major mode for Django web framework" tar ((:url . "https://github.com/unrelentingtech/django-mode") (:commit . "a71b8dd984e7f724b8321246e5c353a4ae5c986e") (:revdesc . "a71b8dd984e7") (:keywords "languages") (:authors ("Greg V" . "floatboth@me.com")) (:maintainers ("Greg V" . "floatboth@me.com")) (:maintainer "Greg V" . "floatboth@me.com"))]) + (django-snippets . [(20131229 1611) ((yasnippet (0 8 0))) "Yasnippets for django" tar ((:url . "https://github.com/myfreeweb/django-mode") (:commit . "f1e6fea8878bebc9bc0b761376a14cd5c9feda0f") (:revdesc . "f1e6fea8878b") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))]) + (django-theme . [(20131022 902) nil "Custom face theme for Emacs" tar ((:url . "http://github/anrzejsliwa/django-theme") (:commit . "86c8142b3eb1addd94a43aa6f1d98dab06401af0") (:revdesc . "86c8142b3eb1"))]) + (djangonaut . [(20230821 1713) ((emacs (25 2)) (magit-popup (2 6 0)) (pythonic (0 1 0)) (f (0 20 0)) (s (1 12 0))) "Minor mode to interact with Django projects" tar ((:url . "https://github.com/proofit404/djangonaut") (:commit . "f360e3b39dc830a0380e82b6f3c475a466d7dda6") (:revdesc . "f360e3b39dc8") (:keywords "convenience" "django") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com"))]) + (djinni-mode . [(20190303 139) ((emacs (24 4))) "Major-mode for editing Djinni files" tar ((:url . "https://github.com/danielmartin/djinni-mode") (:commit . "f0da31d8f45c4b1b2341cf88ec7f2d2e7d16267f") (:revdesc . "f0da31d8f45c") (:keywords "languages") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainers ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es"))]) + (dkdo . [(20131110 1119) ((dkmisc (0 50)) (emacs (24 1))) "Do List major mode based on org-mode" tar ((:url . "https://github.com/davidkeegan/dkdo") (:commit . "fd6bb105e8331fafb6385c5238c988c4c5bbe2da") (:revdesc . "fd6bb105e833") (:keywords "dolist" "task" "productivity") (:authors ("David Keegan" . "dksw@eircom.net")) (:maintainers ("David Keegan" . "dksw@eircom.net")) (:maintainer "David Keegan" . "dksw@eircom.net"))]) + (dkl . [(20161005 7) nil "Display keyboard layout" tar ((:url . "https://github.com/flexibeast/dkl") (:commit . "6b4584f86037bda3383960c678d51f340229fb91") (:revdesc . "6b4584f86037") (:keywords "input" "keyboard" "layout") (:authors ("Alexis" . "flexibeast@gmail.com")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com"))]) + (dklrt . [(20131110 1341) ((dkmisc (0 50)) (ledger-mode (20130908 1357)) (emacs (24 1))) "Ledger Recurring Transactions" tar ((:url . "https://github.com/davidkeegan/dklrt") (:commit . "4eceed270015b41d24a62a8b71bd239224a63063") (:revdesc . "4eceed270015") (:keywords "ledger" "ledger-cli" "recurring" "periodic" "automatic") (:authors ("David Keegan" . "dksw@eircom.net")) (:maintainers ("David Keegan" . "dksw@eircom.net")) (:maintainer "David Keegan" . "dksw@eircom.net"))]) + (dkmisc . [(20131110 1115) ((emacs (24 1))) "Miscellaneous functions required by dk* packages" tar ((:url . "https://github.com/davidkeegan/dkmisc") (:commit . "fe3d49c6f8322b6f89466361acd97585bdfe0608") (:revdesc . "fe3d49c6f832") (:keywords "utility" "time" "date" "file") (:authors ("David Keegan" . "dksw@eircom.net")) (:maintainers ("David Keegan" . "dksw@eircom.net")) (:maintainer "David Keegan" . "dksw@eircom.net"))]) + (dmacro . [(20241027 830) ((emacs (24 1)) (cl-lib (0 6))) "Repeated detection and execution of key operation" tar ((:url . "https://github.com/emacs-jp/dmacro") (:commit . "cb3ce0e1d6ce868baf47cb9225c8daae4b610dab") (:revdesc . "cb3ce0e1d6ce") (:keywords "convenience") (:authors ("Toshiyuki Masui" . "masui@ptiecan.com")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (dmenu . [(20190908 44) ((cl-lib (0 5))) "Simulate the dmenu command line program" tar ((:url . "https://github.com/lujun9972/el-dmenu") (:commit . "e8cc9b27c79d3ecc252267c082ab8e9c82eab264") (:revdesc . "e8cc9b27c79d") (:keywords "convenience" "usability") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (dna-mode . [(20191001 2108) nil "A major mode for editing dna sequences" tar ((:url . "http://www.mahalito.net/~harley/elisp/dna-mode.el") (:commit . "7a48393fcf0015eed2368fcb89b3091c9d029dc4") (:revdesc . "7a48393fcf00") (:keywords "dna" "emacs" "editing") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainers ("Harley Gorrell" . "harley@panix.com")) (:maintainer "Harley Gorrell" . "harley@panix.com"))]) + (doc-show-inline . [(20251126 1144) ((emacs (29 1))) "Show doc-strings found in external files" tar ((:url . "https://codeberg.org/ideasman42/emacs-doc-show-inline") (:commit . "87993d064d02dcdbb3dcfd883e4a0b498b0978d8") (:revdesc . "87993d064d02") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (docbook-snippets . [(20150714 1625) ((yasnippet (0 8 0))) "Yasnippets for DocBook" tar ((:url . "https://github.com/jhradilek/emacs-docbook-snippets") (:commit . "b06297fdec039a541aaa6312cb328a11062cfab4") (:revdesc . "b06297fdec03") (:keywords "snippets" "docbook") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainers ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com"))]) + (docean . [(20180605 1744) ((emacs (24)) (cl-lib (0 5)) (request (0 2 0))) "Interact with DigitalOcean from Emacs" tar ((:url . "https://github.com/emacs-pe/docean.el") (:commit . "bbe2298fd21f7876fc2d5c52a69b931ff59df979") (:revdesc . "bbe2298fd21f") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (dock . [(20250720 1954) ((emacs (28 1))) "Integration for desktop environment's taskbar/dock" tar ((:url . "https://github.com/hron/dock.el") (:commit . "8397c69d33444fa48ec24944e1886386801a27a1") (:revdesc . "8397c69d3344") (:keywords "lisp") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainers ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com"))]) + (docker . [(20251028 1026) ((aio (1 0)) (dash (2 19 1)) (emacs (28 1)) (s (1 13 0)) (tablist (1 1)) (transient (0 4 3))) "Interface to Docker" tar ((:url . "https://github.com/Silex/docker.el") (:commit . "375e0ed45bb1edc655d9ae2943a09864bec1fcba") (:revdesc . "375e0ed45bb1") (:keywords "filename" "convenience") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com"))]) + (docker-api . [(20160525 720) ((dash (2 12 1)) (request (0 2 0)) (s (1 11 0))) "Emacs interface to the Docker API" tar ((:url . "https://github.com/Silex/docker-api.el") (:commit . "206144346b7fa4165223349cfeb64a75d47ddd1b") (:revdesc . "206144346b7f") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com"))]) + (docker-cli . [(20190524 1624) nil "Running various commands in docker containers" tar ((:url . "https://github.com/bosko/docker-cli") (:commit . "328429219574555c5fb831a421b4b5d9a2338561") (:revdesc . "328429219574") (:keywords "processes") (: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"))]) + (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 ((:url . "https://github.com/meqif/docker-compose-mode") (:commit . "abaa4f3aeb5c62d7d16e186dd7d77f4e846e126a") (:revdesc . "abaa4f3aeb5c") (:keywords "convenience"))]) + (docker-tramp . [(20230809 511) ((emacs (24)) (cl-lib (0 5))) "TRAMP integration for docker containers for Emacs 28 and earlier" tar ((:url . "https://github.com/emacs-pe/docker-tramp.el") (:commit . "19d0771db4e6b89e19c00af5806438e315779c15") (:revdesc . "19d0771db4e6") (:keywords "docker" "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (dockerfile-mode . [(20251221 1644) ((emacs (24))) "Major mode for editing Docker's Dockerfiles" tar ((:url . "https://github.com/spotify/dockerfile-mode") (:commit . "97733ce074b1252c1270fd5e8a53d178b66668ed") (:revdesc . "97733ce074b1") (:keywords "docker" "languages" "processes" "tools"))]) + (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 ((:url . "https://github.com/r0man/docopt.el") (:commit . "21c575db68d4ccadb3125241a62136a0f8b76f63") (:revdesc . "21c575db68d4") (:keywords "docopt" "tools" "processes") (:authors ("r0man" . "roman@burningswell.com")) (:maintainers ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com"))]) + (docsim . [(20240906 421) ((emacs (24 4)) (org (8 0))) "Search and compare notes with a local search engine" tar ((:url . "https://github.com/hrs/docsim.el") (:commit . "1441436621835eb9c6fe80bb07299043133f2942") (:revdesc . "144143662183") (:authors ("Robin Schwartz" . "hello@robinschwartz.me")) (:maintainers ("Robin Schwartz" . "hello@robinschwartz.me")) (:maintainer "Robin Schwartz" . "hello@robinschwartz.me"))]) + (docstr . [(20250101 908) ((emacs (27 1)) (s (1 9 0))) "A document string minor mode" tar ((:url . "https://github.com/emacs-vs/docstr") (:commit . "76bfff172a1b915165854ed1ad3478d0366d528f") (:revdesc . "76bfff172a1b") (:keywords "convenience" "document" "string") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (doct . [(20230622 1847) ((emacs (25 1))) "DOCT: Declarative Org capture templates" tar ((:url . "https://github.com/progfolio/doct") (:commit . "5cab660dab653ad88c07b0493360252f6ed1d898") (:revdesc . "5cab660dab65") (:keywords "org" "convenience") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainers ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com"))]) + (doctest . [(20240421 1517) ((emacs (28 1))) "Doctests for Emacs Lisp" tar ((:url . "https://github.com/ag91/doctest") (:commit . "0620ab6283a4e4302761ac415354b0b2b889dcda") (:revdesc . "0620ab6283a4") (:keywords "lisp" "maint" "docs" "help"))]) + (dogears . [(20240412 850) ((emacs (26 3)) (map (2 1))) "Never lose your place again" tar ((:url . "https://github.com/alphapapa/dogears.el") (:commit . "162671e66cac601f1cfd5d22f7da2671af2e9866") (:revdesc . "162671e66cac") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (dokuwiki . [(20180102 59) ((emacs (24 3)) (xml-rpc (1 6 8))) "Edit Remote DokuWiki Pages Using XML-RPC" tar ((:url . "http://www.github.com/accidentalrebel/emacs-dokuwiki") (:commit . "594c4d4904dcc2796bbbd2c0845d9e7c09ccf6f7") (:revdesc . "594c4d4904dc") (:keywords "convenience") (:authors ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainers ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainer "Juan Karlo Licudine" . "accidentalrebel@gmail.com"))]) + (dokuwiki-mode . [(20170223 1301) nil "Major mode for DokuWiki document" tar ((:url . "https://github.com/kai2nenobu/emacs-dokuwiki-mode") (:commit . "e4e116f6fcc373e3f5937c1a7daa5c2c9c6d3fa1") (:revdesc . "e4e116f6fcc3") (:keywords "hypermedia" "text" "dokuwiki") (:authors ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainers ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainer "Tsunenobu Kai" . "kai2nenobu@gmail.com"))]) + (dollaro . [(20151123 1302) ((s (1 6 0))) "Simple text templates" tar ((:url . "https://github.com/laynor/dollaro") (:commit . "500127f0172ac7a1eec627e026b59136580a74ac") (:revdesc . "500127f0172a") (:keywords "tools" "convenience") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainers ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))]) + (doom . [(20180301 2308) ((cl-lib (0 5))) "DOM implementation and manipulation library" tar ((:url . "http://www.github.com/kensanata/doom.el/") (:commit . "e59040aefc92dd9b3134eb623624307fb9e4327b") (:revdesc . "e59040aefc92") (:keywords "xml" "dom") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Henrik.Motakef" . "elisp@henrik-motakef.de") ("Katherine Whitlock" . "toroidal-code@gmail.com") ("Syohei YOSHIDA" . "syohex@gmail.com")))]) + (doom-modeline . [(20251225 1102) ((emacs (25 1)) (compat (30 1 0 0)) (nerd-icons (0 1 0)) (shrink-path (0 3 1))) "A minimal and modern mode-line" tar ((:url . "https://github.com/seagle0128/doom-modeline") (:commit . "be399f2577709841818e942fb11238b46dd886bd") (:revdesc . "be399f257770") (:keywords "faces" "mode-line") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com"))]) + (doom-modeline-now-playing . [(20250906 630) ((emacs (26 1)) (doom-modeline (3 0 0))) "Segment for Doom Modeline to show media player information" tar ((:url . "https://github.com/elken/doom-modeline-now-playing") (:commit . "aff9417faaf5f1945b9ad95f27fa777bbcf269f7") (:revdesc . "aff9417faaf5") (:authors ("Ellis Kenyő" . "me@elken.dev")) (:maintainers ("Ellis Kenyő" . "me@elken.dev")) (:maintainer "Ellis Kenyő" . "me@elken.dev"))]) + (doom-themes . [(20251211 106) ((emacs (25 1)) (cl-lib (0 5))) "An opinionated pack of modern color-themes" tar ((:url . "https://github.com/doomemacs/themes") (:commit . "ad9b1bd1c21e25f044a4d2c3db41734666b00d16") (:revdesc . "ad9b1bd1c21e") (:keywords "themes" "faces") (:authors ("Henrik Lissner" . "contact@henrik.io")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io"))]) + (dot-env . [(20230820 2014) ((emacs (24 4)) (s (1 13 0))) "Dotenv functionality" tar ((:url . "https://github.com/amodelbello/dot-env.el") (:commit . "83ce690e8ef9175fc621c85d5fbef4f7ace7b7a8") (:revdesc . "83ce690e8ef9") (:keywords "convenience" "dotenv" "environment" "configuration"))]) + (dot-mode . [(20180312 2300) ((emacs (24 3))) "Minor mode to repeat typing or commands" tar ((:url . "https://github.com/wyrickre/dot-mode") (:commit . "6ca22b73bcdae2363ee9641b822a60685df16a3e") (:revdesc . "6ca22b73bcda") (:keywords "convenience") (:authors ("Robert Wyrick" . "rob@wyrick.org")) (:maintainers ("Robert Wyrick" . "rob@wyrick.org")) (:maintainer "Robert Wyrick" . "rob@wyrick.org"))]) + (dotenv-mode . [(20191027 2129) ((emacs (24 3))) "Major mode for .env files" tar ((:url . "https://github.com/preetpalS/emacs-dotenv-mode") (:commit . "e3701bf739bde44f6484eb7753deadaf691b73fb") (:revdesc . "e3701bf739bd"))]) + (dotnet . [(20200803 1032) nil "Interact with dotnet CLI tool" tar ((:url . "https://github.com/julienXX/dotnet.el") (:commit . "83ba1305d7895b03f3dffb2d3458b7ec75e6909f") (:revdesc . "83ba1305d789") (:keywords ".net" "tools") (:authors ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainers ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainer "Julien BLANCHARD" . "julien@sideburns.eu"))]) + (double-press . [(20250916 1005) ((emacs (24 4))) "Double-press key dispatcher" tar ((:url . "https://github.com/k-talo/double-press.el") (:commit . "380f7f1cab9045c9ef56b4b40c241037dc2c58d0") (:revdesc . "380f7f1cab90") (:keywords "abbrev" "convenience" "emulations" "wp") (:authors ("K-talo Miyazaki" . "Keitaro.Miyazaki@gmail.com")) (:maintainers ("K-talo Miyazaki" . "Keitaro.Miyazaki@gmail.com")) (:maintainer "K-talo Miyazaki" . "Keitaro.Miyazaki@gmail.com"))]) + (double-saber . [(20190325 1917) ((emacs (24 4))) "Narrow and delete in search buffers" tar ((:url . "https://github.com/dp12/double-saber.git") (:commit . "5555dc28cbaa228fa8f9390738a4200e071380b8") (:revdesc . "5555dc28cbaa") (:keywords "double-saber" "narrow" "delete" "sort" "tools" "convenience" "matching") (:authors ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainers ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainer "Daniel Ting" . "deep.paren.12@gmail.com"))]) + (download-region . [(20210306 415) ((cl-lib (0 3))) "Simple in-buffer download manager" tar ((:url . "http://zk-phi.github.io/") (:commit . "e0a721858a22896fa1d7f1d5689dd0878dbc58fa") (:revdesc . "e0a721858a22"))]) + (downplay-mode . [(20151125 2009) nil "Focus attention on a region of the buffer" tar ((:url . "https://github.com/tobias/downplay-mode/") (:commit . "4a2c3addc73c8ca3816345c3c11c08af265baedb") (:revdesc . "4a2c3addc73c") (:authors ("Toby Crawley" . "toby@tcrawley.org")) (:maintainers ("Toby Crawley" . "toby@tcrawley.org")) (:maintainer "Toby Crawley" . "toby@tcrawley.org"))]) + (doxy-graph-mode . [(20210604 723) ((emacs (26 3))) "Links source code editing with doxygen call graphs" tar ((:url . "https://github.com/gustavopuche/doxy-graph-mode") (:commit . "88af6ef4bc9c8918b66c7774f0a115b2addc310e") (:revdesc . "88af6ef4bc9c") (:keywords "languages" "all") (:authors ("Gustavo Puche" . "gustavo.puche@gmail.com")) (:maintainers ("Gustavo Puche" . "gustavo.puche@gmail.com")) (:maintainer "Gustavo Puche" . "gustavo.puche@gmail.com"))]) + (doxymacs . [(20250909 48) ((emacs (24 4)) (compat (28 1))) "Emacs integration with Doxygen" tar ((:url . "https://pniedzielski.github.io/doxymacs/") (:commit . "869b378b724e4bf4b7e4976e2b8a549d744fc1d2") (:revdesc . "869b378b724e") (:keywords "c" "convenience" "tools") (:authors ("Patrick M. Niedzielski" . "patrick@pniedzielski.net") ("Ryan T. Sammartino" . "ryan.sammartino@gmail.com") ("Kris Verbeeck" . "kris.verbeeck@advalvas.be")) (:maintainers ("Patrick M. Niedzielski" . "patrick@pniedzielski.net")) (:maintainer "Patrick M. Niedzielski" . "patrick@pniedzielski.net"))]) + (doxymin . [(20251122 1103) ((emacs (28 1))) "Create doxygen style docs the easy way" tar ((:url . "https://gitlab.com/L0ren2/doxymin") (:commit . "1de66de7bf4b0c3f6d09eaf461337840bd28715e") (:revdesc . "1de66de7bf4b") (:keywords "(abbref" "convenience" "docs)") (:authors ("Lorenz Schwab" . "lorenz_schwabatwebdotde")) (:maintainers ("Lorenz Schwab" . "lorenz_schwabatwebdotde")) (:maintainer "Lorenz Schwab" . "lorenz_schwabatwebdotde"))]) + (dpaste . [(20160303 2112) nil "Emacs integration for dpaste.com" tar ((:url . "https://github.com/gregnewman/dpaste.el") (:commit . "e7a1a18de77f752eb0dbb4b878925f2265538d0b") (:revdesc . "e7a1a18de77f") (:keywords "paste" "pastie" "pastebin" "dpaste" "python") (:authors ("Greg Newman" . "greg@gregnewman.org") ("Guilherme Gondim" . "semente@taurinus.org")) (:maintainers ("Greg Newman" . "greg@gregnewman.org")) (:maintainer "Greg Newman" . "greg@gregnewman.org"))]) + (dpaste_de . [(20131015 1225) ((web (0 3 7))) "Emacs mode to paste to dpaste.de" tar ((:url . "https://github.com/theju/dpaste_de.el") (:commit . "ab041443884a7a4bfdc81b055688821e8efc9b02") (:revdesc . "ab041443884a") (:keywords "pastebin") (:authors ("Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com")) (:maintainers ("Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com")) (:maintainer "Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com"))]) + (dpkg-dev-el . [(20251025 1006) ((emacs (27 1)) (debian-el (37 0))) "Startup file for the elpa-dpkg-dev-el package" tar ((:commit . "314f0dbbbb6410e8ebcdb99de34e345fc12e40fb") (:revdesc . "314f0dbbbb64") (: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 ((:url . "https://github.com/david-christiansen/dr-racket-like-unicode") (:commit . "d09b9be289e91e25c941107be5e8f52e7c8f0065") (:revdesc . "d09b9be289e9") (:keywords "i18n" "tools") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk"))]) + (dracula-theme . [(20250625 2011) ((emacs (24 3))) "Dracula Theme" tar ((:url . "https://github.com/dracula/emacs") (:commit . "ad30f50e06c1b4c3e461c647e976cd00b9bc4869") (:revdesc . "ad30f50e06c1") (:maintainers ("tienne Deparis" . "etienne@depar.is")) (:maintainer "tienne Deparis" . "etienne@depar.is"))]) + (draft-mode . [(20160106 859) nil "Rough drafting for Emacs" tar ((:url . "https://github.com/gaudecker/draft-mode") (:commit . "4779fb32daf53746459da2def7e08004492d4f18") (:revdesc . "4779fb32daf5") (:keywords "draft" "drafting") (:authors ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainers ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainer "Eeli Reilin" . "gaudecker@fea.st"))]) + (drag-stuff . [(20161108 749) nil "Drag stuff (lines, words, region, etc...) around" tar ((:url . "http://github.com/rejeep/drag-stuff") (:commit . "d49fe376d24f0f8ac5ade67b6d7fccc2487c81db") (:revdesc . "d49fe376d24f") (:keywords "speed" "convenience") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (drawille . [(20160418 1838) ((cl-lib (0 5))) "Drawille implementation in elisp" tar ((:url . "https://github.com/sshbio/elisp-drawille") (:commit . "d582b455c01432bc80933650c52a1f586bd1b5ad") (:revdesc . "d582b455c014") (:keywords "graphics") (:authors ("Josuah Demangeon" . "josuah.demangeon@gmail.com")) (:maintainers ("Josuah Demangeon" . "josuah.demangeon@gmail.com")) (:maintainer "Josuah Demangeon" . "josuah.demangeon@gmail.com"))]) + (dream-theme . [(20210419 605) ((emacs (26 1))) "Maximalist Nordic/Zenburn-inspired color theme" tar ((:url . "https://github.com/djcb/dream-theme") (:commit . "0c27f05544b90e41338f79ea923044b358a323c6") (:revdesc . "0c27f05544b9") (:keywords "faces" "theme") (:authors ("Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl")) (:maintainers ("Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl")) (:maintainer "Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl"))]) + (drill-instructor-AZIK-force . [(20151123 514) ((popup (0 5))) "Support AZIK input" tar ((:url . "https://github.com/myuhe/drill-instructor-AZIK-force.el") (:commit . "008cea202dc31d7d6fb1e7d8e6334d516403b7a5") (:revdesc . "008cea202dc3") (:keywords "convenience") (:authors ("Yuhei Maeda" . "yuhei.maeda_at_gmail.com")))]) + (drone . [(20161106 918) nil "Launch your drone test suite if drone.yml is present" tar ((:url . "https://github.com/olymk2/emacs-drone") (:commit . "1d4ee037ad3208847a4235426edf0c4a3e7b1899") (:revdesc . "1d4ee037ad32") (:keywords "drone" "tests" "ci") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainers ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com"))]) + (dropbox . [(20220314 1638) ((request (0 3 0)) (json (1 2)) (oauth (1 0 3))) "Emacs backend for dropbox" tar ((:url . "https://github.com/pavpanchekha/dropbox.el") (:commit . "c048faad0be24e8fa31974f08b710a87cf5b668c") (:revdesc . "c048faad0be2") (:keywords "dropbox") (:authors ("Pavel Panchekha" . "me@pavpanchekha.com")) (:maintainers ("Pavel Panchekha" . "me@pavpanchekha.com")) (:maintainer "Pavel Panchekha" . "me@pavpanchekha.com"))]) + (drupal-mode . [(20240816 1236) ((php-mode (1 5 0))) "Advanced minor mode for Drupal development" tar ((:url . "https://github.com/arnested/drupal-mode") (:commit . "3f91d1d44df11ebd0137a896055fca6a1bb2f554") (:revdesc . "3f91d1d44df1") (:keywords "programming" "php" "drupal") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainers ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk"))]) + (drupal-spell . [(20130520 1655) nil "Aspell extra dictionary for Drupal" tar ((:url . "https://github.com/arnested/drupal-spell") (:commit . "a69f5e3b62c4c0da74ce26c1d00d5b8f7395e4ae") (:revdesc . "a69f5e3b62c4") (:keywords "wp") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainers ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk"))]) + (dslide . [(20250102 819) ((emacs (29 2))) "Domain Specific sLIDEs. Programmable Presentation" tar ((:url . "https://github.com/positron-solutions/dslide") (:commit . "be47f2dcb939779067f8c77c3493162bcf242b83") (:revdesc . "be47f2dcb939") (:keywords "convenience" "org-mode" "presentation" "narrowing") (:authors ("Positron" . "contact@positron.solutions")) (:maintainers ("Positron" . "contact@positron.solutions")) (:maintainer "Positron" . "contact@positron.solutions"))]) + (dsvn . [(20221102 1416) nil "Subversion interface" tar ((:url . "https://github.com/emacsmirror/dsvn") (:commit . "36ecd5219584e46dcf6bd252e2ea1ec517d2fc05") (:revdesc . "36ecd5219584") (:keywords "docs") (: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"))]) + (dtb-mode . [(20210105 1132) ((emacs (25))) "Show device tree souce in dtbs" tar ((:url . "https://github.com/schspa/dtb-mode") (:commit . "d5bca7d1afaac5615c586b60c7314a1d0e2514dc") (:revdesc . "d5bca7d1afaa") (:keywords "dtb" "dts" "convenience") (:authors ("Schspa Shi" . "schspa@gmail.com")) (:maintainers ("Schspa Shi" . "schspa@gmail.com")) (:maintainer "Schspa Shi" . "schspa@gmail.com"))]) + (dtext-mode . [(20231120 1606) ((emacs (24 4))) "Major mode for Danbooru DText" tar ((:url . "https://github.com/JohnDevlopment/dtext-mode.el") (:commit . "5c68d1c05c4606f68384569d9baaef4f6e72fc73") (:revdesc . "5c68d1c05c46") (:keywords "languages") (:authors ("John Russell" . "johndevlopment7@gmail.com")) (:maintainers ("John Russell" . "johndevlopment7@gmail.com")) (:maintainer "John Russell" . "johndevlopment7@gmail.com"))]) + (dtk . [(20241013 331) ((emacs (24 4)) (cl-lib (0 6 1)) (dash (2 12 0)) (seq (1 9)) (s (1 9))) "Access SWORD content via diatheke" tar ((:url . "https://codeberg.org/thomp/dtk") (:commit . "a80891a3f59381de1ae902417a19bc4f75255d00") (:revdesc . "a80891a3f593") (:keywords "hypermedia"))]) + (dtrace-script-mode . [(20150214 623) nil "DTrace code editing commands for Emacs" tar ((:url . "https://github.com/dotemacs/dtrace-script-mode") (:commit . "a92f76c65b9fb64d448e503b4ea7ff06085be8ee") (:revdesc . "a92f76c65b9f"))]) + (dtrt-indent . [(20251102 857) ((emacs (28 1))) "Adapt to foreign indentation offsets" tar ((:url . "https://github.com/jscheid/dtrt-indent") (:commit . "7c372bec8d84c247e4bd0d5599024d66ee300429") (:revdesc . "7c372bec8d84") (:keywords "convenience" "files" "languages" "c") (:authors ("Julian Scheid" . "julians37@googlemail.com")) (:maintainers ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org"))]) + (dts-mode . [(20211202 18) nil "Major mode for Devicetree source code" tar ((:url . "https://github.com/bgamari/dts-mode") (:commit . "32517e7eeeccc785b7c669fd5e93c5df45597ef1") (:revdesc . "32517e7eeecc") (:keywords "languages") (:authors ("Ben Gamari" . "ben@smart-cactus.org")) (:maintainers ("Ben Gamari" . "ben@smart-cactus.org")) (:maintainer "Ben Gamari" . "ben@smart-cactus.org"))]) + (ducpel . [(20140702 1154) ((cl-lib (0 5))) "Logic game with sokoban elements" tar ((:url . "https://github.com/alezost/ducpel") (:commit . "2f2ce2df269d99261c808a5c4ebc00d6d2cddabc") (:revdesc . "2f2ce2df269d") (:keywords "games") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (dumb-diff . [(20171211 2122) ((emacs (24 3))) "Fast arbitrary diffs" tar ((:url . "https://github.com/jacktasia/dumb-diff") (:commit . "1a2331d283049b71a07c1b06b1e0627a950d55f4") (:revdesc . "1a2331d28304") (:keywords "programming" "diff"))]) + (dumb-jump . [(20250822 2314) ((emacs (24 3)) (s (1 11 0)) (dash (2 9 0)) (popup (0 5 3))) "Jump to definition for 50+ languages without configuration" tar ((:url . "https://github.com/jacktasia/dumb-jump") (:commit . "a9a7e1711ee100747877528bb3531b947233a99e") (:revdesc . "a9a7e1711ee1") (:keywords "programming"))]) + (dumber-jump . [(20241028 1822) ((emacs (28 1)) (s (1 11 0)) (dash (2 9 0))) "Jump to definition for 50+ languages without configuration" tar ((:url . "https://github.com/zenspider/dumber-jump") (:commit . "37ca96bd065ac6869549e17dec98940edfc59f5a") (:revdesc . "37ca96bd065a") (:keywords "tools"))]) + (dummyparens . [(20141009 1024) nil "Parenthesis auto-pairing and wrapping" tar ((:url . "https://github.com/snosov1/dummyparens") (:commit . "9798ef1d0eaa24e4fe66f8aa6022a8c62714cc89") (:revdesc . "9798ef1d0eaa") (:keywords "dummyparens" "auto-pair" "wrapping") (:authors ("Sergei Nosov" . "sergei.nosov[at]gmail.com")) (:maintainers ("Sergei Nosov" . "sergei.nosov[at]gmail.com")) (:maintainer "Sergei Nosov" . "sergei.nosov[at]gmail.com"))]) + (dune . [(20250903 1130) nil "Integration with the dune build system" tar ((:url . "https://github.com/ocaml/dune") (:commit . "1e54fd3f450aae7fb41ffb6b7c8b7a5aed754777") (:revdesc . "1e54fd3f450a"))]) + (dune-format . [(20210505 108) ((reformatter (0 6)) (emacs (24 1))) "Reformat OCaml's dune files automatically" tar ((:url . "https://github.com/purcell/emacs-dune-format") (:commit . "eda7a16ae378e7c482c11228c43ef32b893a1520") (:revdesc . "eda7a16ae378") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (dup-transform . [(20240922 1924) ((emacs (29 1))) "RGB/XY graphics code helpers" tar ((:url . "https://github.com/garyo/dup-transform.el") (:commit . "6cbfb9b6fdf811a4e1e2ddad993fb16f35ec7622") (:revdesc . "6cbfb9b6fdf8") (:keywords "graphics" "tools" "convenience" "c++" "3d" "video" "rgb") (:authors ("Gary Oberbrunner" . "garyo@darkstarsystems.com")) (:maintainers ("Gary Oberbrunner" . "garyo@darkstarsystems.com")) (:maintainer "Gary Oberbrunner" . "garyo@darkstarsystems.com"))]) + (duplexer . [(20250123 1844) ((emacs (29 1)) (dash (2 19 1))) "Handle conflicts between local minor modes and reuse rules" tar ((:url . "https://github.com/eki3z/duplexer.el") (:commit . "242b0bf47192164835a26ae5c553e689dd1b2974") (:revdesc . "242b0bf47192") (:keywords "tools") (:authors ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz95@gmail.com"))]) + (duplicate-thing . [(20181031 1500) nil "Duplicate current line & selection" tar ((:url . "https://github.com/ongaeshi/duplicate-thing") (:commit . "9d8fd05e3e5caa35d3f2a0c0032c92f0c0908e21") (:revdesc . "9d8fd05e3e5c") (:keywords "convenience" "command" "duplicate" "line" "selection"))]) + (dut-mode . [(20170729 2111) ((emacs (24))) "Major mode for the Dut programming language" tar ((:url . "https://github.com/dut-lang/dut-mode") (:commit . "9235c7acaa6690942e9de8b7acd1e4be0c859dc1") (:revdesc . "9235c7acaa66") (:keywords "languages" "gut"))]) + (dw . [(20210331 2311) ((emacs (25 1))) "Diceware passphrase generation commands" tar ((:url . "https://github.com/integral-dw/dw-passphrase-generator") (:commit . "61c5718ba64ace4c9e29de18aa2690ecc3f0f258") (:revdesc . "61c5718ba64a") (:keywords "convenience" "games") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainers ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net"))]) + (dwim-coder-mode . [(20250622 409) ((emacs (30))) "DWIM keybindings for C, Python, Rust, and more" tar ((:url . "https://sadiqpk.org/projects/dwim-coder-mode.html") (:commit . "ce1383d3bcfef68fba6c632556d1a09045343781") (:revdesc . "ce1383d3bcfe") (:keywords "convenience" "hacks") (:authors ("Mohammed Sadiq" . "sadiq@sadiqpk.org")) (:maintainers ("Mohammed Sadiq" . "sadiq@sadiqpk.org")) (:maintainer "Mohammed Sadiq" . "sadiq@sadiqpk.org"))]) + (dwim-shell-command . [(20251211 1325) ((emacs (28 1))) "Shell commands with DWIM behaviour" tar ((:url . "https://github.com/xenodium/dwim-shell-command") (:commit . "35ca64d529987578dbbdf3f07d34310ee727b4a5") (:revdesc . "35ca64d52998"))]) + (dwin . [(20251208 2300) ((emacs (28 1)) (compat (30 1 0 1))) "Navigate and arrange desktop windows" tar ((:url . "https://github.com/lsth/dwin") (:commit . "cbef68f873f02af3e40173c31013e01876a21b71") (:revdesc . "cbef68f873f0") (:keywords "frames" "processes" "convenience") (:authors ("Lars Schmidt-Thieme" . "schmidt-thieme@ismll.de")) (:maintainers ("Lars Schmidt-Thieme" . "schmidt-thieme@ismll.de")) (:maintainer "Lars Schmidt-Thieme" . "schmidt-thieme@ismll.de"))]) + (dyalog-mode . [(20230214 1027) ((cl-lib (0 2)) (emacs (24 3))) "Major mode for editing Dyalog APL source code" tar ((:url . "https://github.com/harsman/dyalog-mode.git") (:commit . "13c0d391aa878a1609259a89fe3e6db8d21935e8") (:revdesc . "13c0d391aa87") (:keywords "languages") (:authors ("Joakim Hårsman" . "joakim.harsman@gmail.com")) (:maintainers ("Joakim Hårsman" . "joakim.harsman@gmail.com")) (:maintainer "Joakim Hårsman" . "joakim.harsman@gmail.com"))]) + (dylan . [(20250319 1925) ((emacs (25 1))) "Dylan editing modes" tar ((:url . "https://opendylan.org/") (:commit . "342d86a58ad307a581fc95c0f271661444dbc13c") (:revdesc . "342d86a58ad3"))]) + (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 ((:url . "http://github.com/rolandwalker/dynamic-fonts") (:commit . "004ee6014dc7dbff8f14d26015c91d9229f6eac0") (:revdesc . "004ee6014dc7") (:keywords "faces" "frames") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (dynamic-graphs . [(20250701 853) ((emacs (26 1))) "Manipulation with graphviz graphs" tar ((:url . "https://github.com/zellerin/dynamic-graphs") (:commit . "5aa3182174de28b6c034a43cd9ef2f26024911b1") (:revdesc . "5aa3182174de") (:keywords "tools") (:authors ("Tomas Zellerin" . "tomas@zellerin.cz")) (:maintainers ("Tomas Zellerin" . "tomas@zellerin.cz")) (:maintainer "Tomas Zellerin" . "tomas@zellerin.cz"))]) + (dynamic-ruler . [(20231126 1915) nil "Displays a dynamic ruler at point" tar ((:url . "http://rocher.github.io/dynamic-ruler") (:commit . "984877f3ad8dd4e4bdec2fcacb82a11b4f3b5d75") (:revdesc . "984877f3ad8d") (:keywords "ruler" "tools" "convenience") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainers ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com"))]) + (dynamic-spaces . [(20250102 736) nil "Don't move text separated by multiple spaces" tar ((:url . "https://github.com/Lindydancer/dynamic-spaces") (:commit . "dade49afa9eb2700a02de0333935a28b39b15b7b") (:revdesc . "dade49afa9eb") (:keywords "convenience"))]) + (dynaring . [(20251104 1606) ((emacs (25 1))) "A dynamically sized ring structure" tar ((:url . "https://github.com/countvajhula/dynaring") (:commit . "d74e4f36da97a64baa023e5b2519bfaac7d8b02b") (:revdesc . "d74e4f36da97") (:authors ("Mike Mattie" . "codermattie@gmail.com") ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com"))]) + (dyncloze . [(20210712 145) ((emacs (25 1)) (dash (2 18))) "Language alternatives self-testing" tar ((:url . "https://github.com/ahyatt/emacs-dyncloze") (:commit . "aafc5adc25c7f714b619109bccf92e475d6c84ef") (:revdesc . "aafc5adc25c7") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainers ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com"))]) + (e2ansi . [(20250120 2241) ((face-explorer (0 0 6))) "Syntax highlighting for `less', powered by Emacs" tar ((:url . "https://github.com/Lindydancer/e2ansi") (:commit . "53c9c2aff5bf66864446a02a75e2e431aaef59d5") (:revdesc . "53c9c2aff5bf") (:keywords "faces" "languages"))]) + (e2wm . [(20241104 914) ((window-layout (1 5))) "Simple window manager for emacs" tar ((:url . "https://github.com/kiwanami/emacs-window-manager") (:commit . "33efca5504db9d8b3fdbd412c3d79663c9eec77a") (:revdesc . "33efca5504db") (:keywords "tools" "window manager") (:authors ("SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net"))]) + (e2wm-R . [(20151230 926) ((e2wm (1 3)) (inlineR (1 0)) (ess (15 3))) "Some e2wm plugin and perspective for GNU R" tar ((:url . "https://github.com/myuhe/e2wm-R.el") (:commit . "4350601ee1a96bf89777b3f09f1b79b88e2e6e4d") (:revdesc . "4350601ee1a9") (:keywords "convenience" "e2wm") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (e2wm-bookmark . [(20151123 521) ((e2wm (1 2))) "Bookmark plugin for e2wm.el" tar ((:url . "https://github.com/myuhe/e2wm-bookmark.el") (:commit . "bad816b6d8049984d69bcd277b7d325fb84d55eb") (:revdesc . "bad816b6d804") (:keywords "convenience") (:authors ("Yuhei Maeda" . "yuhei.maeda_at_gmail.com")) (:maintainers ("Yuhei Maeda" . "yuhei.maeda_at_gmail.com")) (:maintainer "Yuhei Maeda" . "yuhei.maeda_at_gmail.com"))]) + (e2wm-direx . [(20200805 1414) ((e2wm (1 2)) (direx (0 1 -3))) "Plugin of e2wm.el for direx.el" tar ((:url . "https://github.com/aki2o/e2wm-direx") (:commit . "5672bc44d8e5cea6bc3b84c3b58e522050ffae0e") (:revdesc . "5672bc44d8e5") (:keywords "tools" "window manager" "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (e2wm-pkgex4pl . [(20140525 2211) ((e2wm (1 2)) (plsense-direx (0 2 0))) "Plugin of e2wm.el for package explorer of Perl" tar ((:url . "https://github.com/aki2o/e2wm-pkgex4pl") (:commit . "7ea994450727190c4f3cb46cb429ba41b692ecc0") (:revdesc . "7ea994450727") (:keywords "tools" "window manager" "perl") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (e2wm-svg-clock . [(20150106 1306) ((e2wm (20130225 1602)) (svg-clock (0 4))) "E2wm plugin for svg-clock" tar ((:url . "https://github.com/myuhe/e2wm-svg-clock.el") (:commit . "d425925e3afffcbe2ff74edc80b714e4319d4c94") (:revdesc . "d425925e3aff") (:keywords "convenience" "e2wm") (:authors ("Yuhei Maeda" . "yuhei.maeda_at_gmail.com")))]) + (e2wm-sww . [(20200805 1339) ((e2wm (1 2))) "Plugin of e2wm.el to switch plugin quickly" tar ((:url . "https://github.com/aki2o/e2wm-sww") (:commit . "8926d0c70be05c7b4ef821e22e411e8813973687") (:revdesc . "8926d0c70be0") (:keywords "tools" "window manager") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (e2wm-term . [(20240107 850) ((e2wm (1 2)) (log4e (0 2 0)) (yaxception (1 0 0))) "Perspective of e2wm.el for work in terminal" tar ((:url . "https://github.com/aki2o/e2wm-term") (:commit . "4542e52138484933dd99a497ff1b048ea42f9246") (:revdesc . "4542e5213848") (:keywords "tools" "window manager") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (eacl . [(20220526 1434) ((emacs (25 1))) "Auto-complete lines by grepping project" tar ((:url . "http://github.com/redguardtoo/eacl") (:commit . "4fe2cafbfeb73d806ebea8801c3522ff2886f30b") (:revdesc . "4fe2cafbfeb7") (:keywords "abbrev" "convenience" "matching") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (eager-state . [(20251221 1617) ((emacs (29 1)) (llama (0 5 0))) "Eagerly persist data onto disk" tar ((:url . "https://github.com/meedstrom/eager-state") (:commit . "7d34fc1f4f341a971ec165fd54b1f42eb9982971") (:revdesc . "7d34fc1f4f34") (:keywords "convenience") (:authors ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainers ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainer "Martin Edström" . "meedstrom91@gmail.com"))]) + (earl . [(20241020 1847) ((emacs (29 1))) "Erlang distribution protocol implementation" tar ((:url . "https://github.com/axelf4/earl") (:commit . "aa10aae9891a599f523f269cc391ed316775d12a") (:revdesc . "aa10aae9891a") (:keywords "comm" "extensions" "languages" "processes") (:authors ("Axel Forsman" . "axel@axelf.se")) (:maintainers ("Axel Forsman" . "axel@axelf.se")) (:maintainer "Axel Forsman" . "axel@axelf.se"))]) + (earthfile-mode . [(20230809 2250) ((emacs (26))) "Major mode for editing Earthly file" tar ((:url . "https://github.com/earthly/earthly-mode") (:commit . "3029e5ab06171ca5947041e95053561e10e5ba41") (:revdesc . "3029e5ab0617") (:authors ("Thanabodee Charoenpiriyakij" . "wingyminus@gmail.com")) (:maintainers ("Thanabodee Charoenpiriyakij" . "wingyminus@gmail.com")) (:maintainer "Thanabodee Charoenpiriyakij" . "wingyminus@gmail.com"))]) + (eask . [(20251215 731) ((emacs (26 1))) "Core Eask APIs, for Eask CLI development" tar ((:url . "https://github.com/emacs-eask/eask") (:commit . "97ffac19407c499db8852b1cd5276b8005123a7d") (:revdesc . "97ffac19407c") (:keywords "lisp" "eask" "api") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (eask-mode . [(20250101 836) ((emacs (24 3)) (eask (0 1 0))) "Major mode for editing Eask files" tar ((:url . "https://github.com/emacs-eask/eask-mode") (:commit . "9bab3ad0d9a7df6284daed9ecd2cbd89298b958f") (:revdesc . "9bab3ad0d9a7") (:keywords "lisp" "eask") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (easky . [(20250630 1831) ((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 ((:url . "https://github.com/emacs-eask/easky") (:commit . "8c9f23446e3e728fc9fb12e3cc02b9b67c1e837d") (:revdesc . "8c9f23446e3e") (:keywords "maint" "easky") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (easy-after-load . [(20170817 1231) nil "Eval-after-load for all files in a directory" tar ((:url . "https://github.com/pd/easy-after-load") (:commit . "29e20145da49ac9ea40463c552130777408040de") (:revdesc . "29e20145da49"))]) + (easy-escape . [(20210917 1254) nil "Improve readability of escape characters in regular expressions" tar ((:url . "https://github.com/cpitclaudel/easy-escape") (:commit . "938497a21e65ba6b3ff8ec90e93a6d0ab18dc9b4") (:revdesc . "938497a21e65") (:keywords "convenience" "lisp" "tools") (: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"))]) + (easy-find . [(20250629 2002) ((emacs (24 4))) "Simple file searching like Nemo" tar ((:url . "https://github.com/emacselements/easy-find") (:commit . "b67ce974a72263ef9af65f23f89feae852786a64") (:revdesc . "b67ce974a722") (:keywords "files" "convenience" "tools"))]) + (easy-hugo . [(20251220 949) ((emacs (25 1)) (request (0 3 0)) (transient (0 3 6))) "Write blogs made with hugo by markdown or org-mode" tar ((:url . "https://github.com/masasam/emacs-easy-hugo") (:commit . "dafe607c5192d14234639fb45c65a5644a0adb23") (:revdesc . "dafe607c5192"))]) + (easy-jekyll . [(20250830 1006) ((emacs (25 1)) (request (0 3 0))) "Major mode managing jekyll blogs" tar ((:url . "https://github.com/masasam/emacs-easy-jekyll") (:commit . "4e85bb4568f87e08a93d7c5c82898a8e98109669") (:revdesc . "4e85bb4568f8"))]) + (easy-kill . [(20220511 557) ((emacs (25)) (cl-lib (0 5))) "Kill & mark things easily" tar ((:url . "https://github.com/leoliu/easy-kill") (:commit . "de7d66c3c864a4722a973ee9bc228a14be49ba0c") (:revdesc . "de7d66c3c864") (:keywords "killing" "convenience") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainers ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com"))]) + (easy-kill-extras . [(20240122 1649) ((easy-kill (0 9 4))) "Extra functions for easy-kill" tar ((:url . "https://github.com/knu/easy-kill-extras.el") (:commit . "6ec0a1ff47aee681f7aa7af4250ede75815385f2") (:revdesc . "6ec0a1ff47ae") (:keywords "killing" "convenience") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (easy-repeat . [(20150516 848) ((emacs (24 4))) "Repeat easily" tar ((:url . "https://github.com/xuchunyang/easy-repeat.el") (:commit . "060f0e6801c82c40c06961dc0528a00e18947a8c") (:revdesc . "060f0e6801c8") (:keywords "repeat" "convenience") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com"))]) + (easy-theme-preview . [(20251123 1604) ((emacs (24 3))) "Easily preview themes" tar ((:url . "https://git.sr.ht/~ayys/theme-preview-mode.el") (:commit . "999d89d88634e2eedcc82ac56fa54ed92ce38614") (:revdesc . "999d89d88634") (:keywords "theme" "convenience" "utility") (:authors ("Ayush Jha" . "ayys@duck.com")) (:maintainers ("Ayush Jha" . "ayys@duck.com")) (:maintainer "Ayush Jha" . "ayys@duck.com"))]) + (easysession . [(20251113 1422) ((emacs (25 1))) "Persist and restore your sessions (desktop.el alternative)" tar ((:url . "https://github.com/jamescherti/easysession.el") (:commit . "f30ffdf6e270e0420df99b1265081800a36ca4d5") (:revdesc . "f30ffdf6e270") (:keywords "convenience"))]) + (ebdb-mua-sidecar . [(20251029 1934) ((emacs (28 1)) (universal-sidecar (1 5 1)) (ebdb (0 8 20))) "EBDB Integration for Universal Sidecar" tar ((:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar") (:commit . "01b12aecca0ce66f5427e7fe65012d37e7e128b2") (:revdesc . "01b12aecca0c") (:keywords "mail" "convenience") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (ebf . [(20210225 1211) ((dash (2 18 0)) (cl-lib (0 5))) "Brainfuck language transpiler to Emacs Lisp" tar ((:url . "http://github.com/rexim/ebf") (:commit . "6cbeb4d62416f4cfd5be8906667342af8ecc44a6") (:revdesc . "6cbeb4d62416") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com"))]) + (ebib . [(20250909 1036) ((parsebib (6 0)) (emacs (27 1)) (compat (29 1 4 3))) "A BibTeX database manager" tar ((:url . "http://joostkremers.github.io/ebib/") (:commit . "72686b4d045dcbdb794e56c8ba60a77eed52ee83") (:revdesc . "72686b4d045d") (:keywords "text" "bibtex") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm"))]) + (ebib-sidecar . [(20251029 1934) ((emacs (28 1)) (citeproc (0 9 4)) (universal-sidecar (1 5 1)) (universal-sidecar-citeproc (1 0 0)) (ebib (2 39))) "Sidecar to show formatted reference of current Ebib Entry" tar ((:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar") (:commit . "01b12aecca0ce66f5427e7fe65012d37e7e128b2") (:revdesc . "01b12aecca0c") (:keywords "bib") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (ebnf-mode . [(20231022 1759) ((emacs (25 1))) "Major mode for EBNF files" tar ((:url . "https://github.com/nverno/ebnf-mode") (:commit . "61486b1c9d4746249640410e58087e318f801ed8") (:revdesc . "61486b1c9d47") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (ebuku . [(20240921 839) ((emacs (25 1))) "Interface to the buku Web bookmark manager" tar ((:url . "https://github.com/flexibeast/ebuku") (:commit . "45294cedeeefdcb0193b18dc3e2254db0aa700c3") (:revdesc . "45294cedeeef") (:keywords "bookmarks" "buku" "data" "web" "www") (:authors ("Alexis" . "flexibeast@gmail.com") ("Erik Sjöstrand" . "sjostrand.erik@gmail.com") ("Hilton Chain" . "hako@ultrarare.space")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com"))]) + (eca . [(20251220 2211) ((emacs (28 1)) (dash (2 18 0)) (f (0 20 0)) (markdown-mode (2 3)) (compat (30 1))) "AI pair programming via ECA (Editor Code Assistant)" tar ((:url . "https://github.com/editor-code-assistant/eca-emacs") (:commit . "d2a0a738e68c3d5ac8e4137de1e5bebf3637517d") (:revdesc . "d2a0a738e68c") (:keywords "tools") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainers ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com"))]) + (ecb . [(20251014 1427) nil "A code browser for Emacs" tar ((:url . "https://github.com/ecb-org/ecb") (:commit . "2f9028aa1d8791720e809954016dbc84fe8fc864") (:revdesc . "2f9028aa1d87") (:keywords "browser" "code" "programming" "tools") (: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"))]) + (echo-bar . [(20240601 1744) nil "Turn the echo area into a custom status bar" tar ((:url . "https://github.com/qaiviq/echo-bar.el") (:commit . "80f5a8bbd8ac848d4a69796c9568b4a55958e974") (:revdesc . "80f5a8bbd8ac") (:keywords "convenience" "tools") (:authors ("Adam Tillou" . "qaiviq@gmail.com")) (:maintainers ("Adam Tillou" . "qaiviq@gmail.com")) (:maintainer "Adam Tillou" . "qaiviq@gmail.com"))]) + (eclipse-theme . [(20191113 1518) nil "Theme based on Eclipse circa 2010" tar ((:url . "https://github.com/abo-abo/eclipse-theme") (:commit . "dcf97865512ed450f9d5137c1a05e12edb5b7f80") (:revdesc . "dcf97865512e") (:keywords "themes") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (ecukes . [(20241226 1759) ((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 ((:url . "https://github.com/ecukes/ecukes") (:commit . "70cb0748b222b7c96ab9821ef898ffbdb45eacd8") (:revdesc . "70cb0748b222") (:keywords "test"))]) + (edbi . [(20160225 141) ((concurrent (0 3 1)) (ctable (0 1 2)) (epc (0 1 1))) "Emacs Database Interface" tar ((:url . "https://github.com/kiwanami/emacs-edbi") (:commit . "6f50aaf4bde75255221f2292c7a4ad3fa9d918c0") (:revdesc . "6f50aaf4bde7") (:keywords "database" "epc") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatkiwanami.net"))]) + (ede-compdb . [(20150920 2033) ((ede (1 2)) (semantic (2 2)) (cl-lib (0 4))) "Support for compilation database projects in EDE" tar ((:url . "https://github.com/randomphrase/ede-compdb") (:commit . "23c91082270fcef24ea791b848f1604e36888ff0") (:revdesc . "23c91082270f") (:keywords "development" "ninja" "build" "cedet" "ede") (:authors ("Alastair Rankine" . "alastair@girtby.net")) (:maintainers ("Alastair Rankine" . "alastair@girtby.net")) (:maintainer "Alastair Rankine" . "alastair@girtby.net"))]) + (ede-php-autoload . [(20230916 441) nil "Simple EDE PHP Project" tar ((:url . "https://github.com/emacs-php/ede-php-autoload") (:commit . "a7c16292ecaf9b39321e7a99ccac259fcbf6c373") (:revdesc . "a7c16292ecaf") (:keywords "php" "project" "ede") (: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") ("original code for C++ by Eric M. Ludlam" . "eric@siege-engine.com")) (:maintainer "Steven Rémot" . "steven.remot@gmail.com"))]) + (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 ((:url . "https://github.com/xendk/ede-php-autoload-composer-installers") (:commit . "3e2fde975a06757b363e235c67e6341ebe668f60") (:revdesc . "3e2fde975a06") (:keywords "programming" "php") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainers ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk"))]) + (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 ((:url . "https://github.com/xendk/ede-php-autoload-drupal") (:commit . "54a04241d94fabc4f4d16ae4dc8ba4f0c6e3b435") (:revdesc . "54a04241d94f") (:keywords "programming" "php" "drupal") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainers ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk"))]) + (edebug-inline-result . [(20220820 2240) ((emacs (25 1))) "Show Edebug result inline" tar ((:url . "https://repo.or.cz/edebug-inline-result.git") (:commit . "90e401ae3e7b3c85da8b24af940fd97f5e744625") (:revdesc . "90e401ae3e7b") (:keywords "extensions" "lisp" "tools"))]) + (edebug-x . [(20130616 625) nil "Extensions for Edebug" tar ((:url . "https://github.com/ScottyB/edebug-x") (:commit . "a2c2c42553d3bcbd5ac11898554865acbed1bc46") (:revdesc . "a2c2c42553d3") (:keywords "extensions") (:authors ("Scott Barnett" . "scott.n.barnett@gmail.com")) (:maintainers ("Scott Barnett" . "scott.n.barnett@gmail.com")) (:maintainer "Scott Barnett" . "scott.n.barnett@gmail.com"))]) + (edit-as-format . [(20220221 1312) ((emacs (26 1)) (edit-indirect (0 1 5))) "Edit document as other format" tar ((:url . "https://github.com/etern/edit-as-format") (:commit . "59c6f439683846d994a7a2110b9b00cc16c08c40") (:revdesc . "59c6f4396838") (:keywords "files" "outlines" "convenience") (:authors ("Xiaobing Jing" . "jingxiaobing@gmail.com")) (:maintainers ("Xiaobing Jing" . "jingxiaobing@gmail.com")) (:maintainer "Xiaobing Jing" . "jingxiaobing@gmail.com"))]) + (edit-at-point . [(20191013 1218) nil "Edit(copy,cut..) current things(word,symbol..) under cursor" tar ((:url . "http://github.com/enoson/edit-at-point.el") (:commit . "28c85a65c9c61f2aff50bc5e93f61cde26a5d9c0") (:revdesc . "28c85a65c9c6") (:authors (nil . "e.enoson@gmail.com")) (:maintainers (nil . "e.enoson@gmail.com")) (:maintainer nil . "e.enoson@gmail.com"))]) + (edit-chrome-textarea . [(20200324 1513) ((emacs (25 1)) (websocket (1 4))) "Edit Chrome Textarea" tar ((:url . "https://github.com/xuchunyang/edit-chrome-textarea.el") (:commit . "302659e92b7ef88824691905df3f926766f64729") (:revdesc . "302659e92b7e") (:keywords "tools"))]) + (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 ((:url . "https://github.com/sabof/edit-color-stamp") (:commit . "32dc1ca5bcf3dcf83fad5e39b55dc5b77becb3d3") (:revdesc . "32dc1ca5bcf3"))]) + (edit-indirect . [(20240128 119) ((emacs (24 3))) "Edit regions in separate buffers" tar ((:url . "https://github.com/Fanael/edit-indirect") (:commit . "82a28d8a85277cfe453af464603ea330eae41c05") (:revdesc . "82a28d8a8527") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com"))]) + (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 ((:url . "https://github.com/niitsuma/edit-indirect-region-latex") (:commit . "05043f2c0c9838947d3ca4b51b695deb7c47612e") (:revdesc . "05043f2c0c98") (:authors ("Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com")) (:maintainers ("Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com")) (:maintainer "Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com"))]) + (edit-list . [(20100930 1443) nil "Edit a single list" tar ((:url . "http://mwolson.org/static/dist/elisp/edit-list.el") (:commit . "f460d3f9e208a4e606fe6ded307f1b011916ca71") (:revdesc . "f460d3f9e208") (:authors ("Michael Olson" . "mwolson@gnu.org")) (:maintainers ("Michael Olson" . "mwolson@gnu.org")) (:maintainer "Michael Olson" . "mwolson@gnu.org"))]) + (edit-server . [(20250417 1401) nil "Server that responds to edit requests from Chrome" tar ((:url . "https://github.com/stsquad/emacs_chrome") (:commit . "e45b213a22bc93ca52962203784e7b5d25a53245") (:revdesc . "e45b213a22bc") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainers ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com"))]) + (edit-server-htmlize . [(20130329 2248) ((edit-server (1 9))) "(de)HTMLization hooks for edit-server.el" tar ((:url . "https://github.com/frobtech/edit-server-htmlize") (:commit . "e7f8dadfabe869c77ca241cd6fbd4c52bd908392") (:revdesc . "e7f8dadfabe8") (:authors ("Roland McGrath" . "roland@hack.frob.com")) (:maintainers ("Roland McGrath" . "roland@hack.frob.com")) (:maintainer "Roland McGrath" . "roland@hack.frob.com"))]) + (editorconfig . [(20251221 650) ((emacs (27 2))) "EditorConfig Emacs Plugin" tar ((:url . "https://github.com/editorconfig/editorconfig-emacs#readme") (:commit . "6783cb2a9fb82dc152e633e2e40162c150a4e818") (:revdesc . "6783cb2a9fb8") (:keywords "convenience" "editorconfig") (:authors ("EditorConfig Team" . "editorconfig@googlegroups.com")) (:maintainers ("EditorConfig Team" . "editorconfig@googlegroups.com")) (:maintainer "EditorConfig Team" . "editorconfig@googlegroups.com"))]) + (editorconfig-charset-extras . [(20180223 457) ((editorconfig (0 6 0))) "Extra EditorConfig Charset Support" tar ((:url . "https://github.com/10sr/editorconfig-charset-extras-el") (:commit . "ddf60923c6f4841cb593b2ea04c9c710a01d262f") (:revdesc . "ddf60923c6f4") (:keywords "tools") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainers ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com"))]) + (editorconfig-custom-majormode . [(20180816 244) ((editorconfig (0 6 0))) "Decide major-mode and mmm-mode from EditorConfig" tar ((:url . "https://github.com/10sr/editorconfig-custom-majormode-el") (:commit . "13ad1c83f847bedd4b3a19f9df7fd925853b19de") (:revdesc . "13ad1c83f847") (:keywords "editorconfig" "util") (:authors ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainers ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainer "10sr" . "8slashes+el[at]gmail[dot]com"))]) + (editorconfig-domain-specific . [(20180505 924) ((cl-lib (0 5)) (editorconfig (0 6 0))) "Apply brace style and other \"domain-specific\" EditorConfig properties" tar ((:url . "https://github.com/lassik/editorconfig-emacs-domain-specific") (:commit . "e9824160fb2e466afa755240ee3ab7cc5657fb04") (:revdesc . "e9824160fb2e") (:keywords "editorconfig" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (editorconfig-generate . [(20190513 433) ((emacs (24))) "Generate .editorconfig" tar ((:url . "https://github.com/10sr/editorconfig-generate-el") (:commit . "47a31f928f46d2a0188db8e2cffa5d6354a81573") (:revdesc . "47a31f928f46") (:keywords "tools") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainers ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com"))]) + (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 ((:url . "https://www.github.com/expez/edn.el") (:commit . "be9e32d1b49e35247b263b0243df7cfdc8d413ab") (:revdesc . "be9e32d1b49e") (:keywords "edn" "clojure") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainers ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com"))]) + (ednc . [(20251104 1820) ((emacs (26 1))) "Emacs Desktop Notification Center" tar ((:url . "https://github.com/sinic/ednc") (:commit . "638d73e7c3fe4ffe86199e33fb85fbaa4cf1ab7f") (:revdesc . "638d73e7c3fe") (:keywords "unix") (:authors ("Simon Nicolussi" . "sinic@sinic.name")) (:maintainers ("Simon Nicolussi" . "sinic@sinic.name")) (:maintainer "Simon Nicolussi" . "sinic@sinic.name"))]) + (edts . [(20250214 2310) ((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 ((:url . "https://github.com/sebastiw/edts") (:commit . "5481bcbe61f2843fbb939daac5a32e59b9acfd69") (:revdesc . "5481bcbe61f2") (:keywords "erlang" "tools" "programming" "development") (:authors ("Thomas Järvstrand" . "tjarvstrand@gmail.com") ("Sebastian Weddmark Olsson" . "visnae@gmail.com")) (:maintainers ("Thomas Järvstrand" . "tjarvstrand@gmail.com") ("Sebastian Weddmark Olsson" . "visnae@gmail.com")) (:maintainer "Thomas Järvstrand" . "tjarvstrand@gmail.com"))]) + (edwina . [(20221206 1610) ((emacs (25))) "Dynamic window manager" tar ((:url . "https://gitlab.com/ajgrf/edwina") (:commit . "f95c31b1de95df7e83338a5d4daf3363df325862") (:revdesc . "f95c31b1de95") (:keywords "convenience") (:authors ("Alex Griffin" . "a@ajgrf.com")) (:maintainers ("Alex Griffin" . "a@ajgrf.com")) (:maintainer "Alex Griffin" . "a@ajgrf.com"))]) + (efar . [(20230216 1213) ((emacs (26 1))) "FAR-like file manager" tar ((:url . "https://github.com/suntsov/efar") (:commit . "78618a6cd9fe7d46c3728db3589d1fe50f7c1c6b") (:revdesc . "78618a6cd9fe") (:keywords "files") (:authors ("Vladimir Suntsov" . "vladimir@suntsov.online")) (:maintainers (nil . "vladimir@suntsov.online")) (:maintainer nil . "vladimir@suntsov.online"))]) + (eff . [(20240708 231) ((emacs (28))) "Show symbols in Executable File Formats" tar ((:url . "https://github.com/oxidase/eff") (:commit . "b8298439360b29333d3dcd8a352e00cde2b6ccd7") (:revdesc . "b8298439360b") (:keywords "elf" "readelf" "convenience"))]) + (efire . [(20151009 2031) ((circe (1 2))) "Use campfire from Emacs" tar ((:url . "https://github.com/capitaomorte/efire") (:commit . "d38dd6dd7974b7cb11bff6fd84846fd01163211a") (:revdesc . "d38dd6dd7974") (:keywords "convenience" "tools") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com"))]) + (eg . [(20170830 815) ((cl-lib (0 5)) (emacs (24 3))) "Norton Guide reader" tar ((:url . "https://github.com/davep/eg.el") (:commit . "1c7f1613d2aaae728ef540305f6ba030616f86bd") (:revdesc . "1c7f1613d2aa") (:keywords "docs") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (egalgo . [(20211105 1657) ((emacs (24 3))) "Genetic algorithm" tar ((:url . "https://github.com/ROCKTAKEY/egalgo") (:commit . "a56a86591351d53ca2add7c651757bfb0064fb22") (:revdesc . "a56a86591351") (:keywords "data") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (egg . [(20181126 500) nil "Emacs Got Git - Emacs interface to Git" tar ((:url . "https://github.com/byplayer/egg") (:commit . "00e768a78ac3d25f457eed667d02cac568480bf9") (:revdesc . "00e768a78ac3") (:keywords "git" "version control" "release management") (:authors ("Bogolisk" . "bogolisk@gmail.com")) (:maintainers ("Bogolisk" . "bogolisk@gmail.com")) (:maintainer "Bogolisk" . "bogolisk@gmail.com"))]) + (egg-timer . [(20200217 1650) ((emacs (25 1))) "Commonly used intervals for setting timers while working" tar ((:url . "https://github.com/wpcarro/egg-timer.el") (:commit . "53a9e9d20453ea4b0198ca413b8b5069a0b30b38") (:revdesc . "53a9e9d20453") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainers ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com"))]) + (egison-mode . [(20211218 1115) nil "Egison editing mode" tar ((:url . "https://github.com/egisatoshi/egison3/blob/master/elisp/egison-mode.el") (:commit . "dbb395b41a4e4eb69f3f045cbfbe95a1575ac45b") (:revdesc . "dbb395b41a4e") (:authors ("Satoshi Egi" . "egisatoshi@gmail.com")) (:maintainers ("Satoshi Egi" . "egisatoshi@gmail.com")) (:maintainer "Satoshi Egi" . "egisatoshi@gmail.com"))]) + (eglot-fsharp . [(20250403 1925) ((emacs (27 1)) (eglot (1 4)) (fsharp-mode (1 10)) (jsonrpc (1 0 14))) "Fsharp-mode eglot integration" tar ((:url . "https://github.com/fsharp/emacs-fsharp-mode") (:commit . "8d08f057889bcd19812d17d955865428626d8c47") (:revdesc . "8d08f057889b") (:keywords "languages") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info"))]) + (eglot-java . [(20250527 1232) ((emacs (26 1)) (eglot (1 0)) (jsonrpc (1 0 0))) "Java extension for the eglot LSP client" tar ((:url . "https://github.com/yveszoundi/eglot-java") (:commit . "b42b5190f3f59976d330fcec5fd27fc8e2701336") (:revdesc . "b42b5190f3f5") (:keywords "convenience" "languages") (:authors ("Yves Zoundi and contributors" . "yves_zoundi@hotmail.com")) (:maintainers ("Yves Zoundi" . "yves_zoundi@hotmail.com")) (:maintainer "Yves Zoundi" . "yves_zoundi@hotmail.com"))]) + (eglot-jl . [(20240911 1352) ((emacs (25 1)) (eglot (1 4)) (project (0 8 1)) (cl-generic (1 0))) "Julia support for eglot" tar ((:url . "https://github.com/non-Jedi/eglot-jl") (:commit . "7c968cc61fb64016ebe6dc8ff83fd05923db4374") (:revdesc . "7c968cc61fb6") (:keywords "convenience" "languages") (:authors ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz")) (:maintainers ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz")) (:maintainer "Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz"))]) + (eglot-luau . [(20241102 1924) ((emacs (29 1)) (eglot (1 17))) "Luau language server integration for eglot" tar ((:url . "https://github.com/kennethloeffler/eglot-luau") (:commit . "23335f45fb91de606e6971e93179df0fee0fd062") (:revdesc . "23335f45fb91") (:keywords "roblox" "luau" "tools") (:authors ("Kenneth Loeffler" . "kenloef@gmail.com")) (:maintainers ("Kenneth Loeffler" . "kenloef@gmail.com")) (:maintainer "Kenneth Loeffler" . "kenloef@gmail.com"))]) + (eglot-signature-eldoc-talkative . [(20240626 815) ((emacs (29 1)) (eglot (1 16)) (eldoc (1 14 0)) (jsonrpc (1 0 23))) "Make Eglot make ElDoc echo docs" tar ((:url . "https://codeberg.org/mekeor/eglot-signature-eldoc-talkative") (:commit . "34cc207265f26f13142f5c62276e0ba18e1d55e4") (:revdesc . "34cc207265f2") (:keywords "convenience" "documentation" "eglot" "eldoc" "languages" "lsp") (: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"))]) + (eglot-tempel . [(20241115 1110) ((eglot (1 9)) (tempel (0 5)) (emacs (29 1)) (peg (1 0 1))) "Use tempel to expand snippets from eglot" tar ((:url . "https://github.com/fejfighter/eglot-tempel") (:commit . "c6c9a18eba61f6bae7167fa62bab9b637592d20d") (:revdesc . "c6c9a18eba61") (:keywords "convenience" "languages" "tools") (:authors ("Jeff Walsh" . "fejfighter@gmail.com")) (:maintainers ("Jeff Walsh" . "fejfighter@gmail.com")) (:maintainer "Jeff Walsh" . "fejfighter@gmail.com"))]) + (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 ((:url . "https://github.com/emacs-china/EGO") (:commit . "211c4cb2af2582849d9df984fb2346deecaf79be") (:revdesc . "211c4cb2af25") (:keywords "org-mode" "convenience" "beautify") (:authors ("Feng Shu" . "tumashuAT163.com") ("Kelvin Hu" . "iniDOTkelvinATgmailDOTcom") ("Kuangdash" . "kuangdashAT163.com")) (:maintainers ("Feng Shu" . "tumashuAT163.com") ("Kelvin Hu" . "iniDOTkelvinATgmailDOTcom") ("Kuangdash" . "kuangdashAT163.com")) (:maintainer "Feng Shu" . "tumashuAT163.com"))]) + (eide . [(20251226 729) ((emacs (26 1))) "IDE features made available out of the box" tar ((:url . "https://forge.tedomum.net/hjuvi/eide") (:commit . "3767f271e7783deb85eafe7851fb2a0c597f9651") (:revdesc . "3767f271e778") (:authors ("Cédric Marie" . "hjuvi@tedomum.fr")) (:maintainers ("Cédric Marie" . "hjuvi@tedomum.fr")) (:maintainer "Cédric Marie" . "hjuvi@tedomum.fr"))]) + (eimp . [(20120826 2039) nil "Emacs Image Manipulation Package" tar ((:url . "https://github.com/nicferrier/eimp") (:commit . "2e7536fe6d8f7faf1bad7a8ae37faba0162c3b4f") (:revdesc . "2e7536fe6d8f") (:keywords "files" "frames") (:authors ("Matthew P. Hodges" . "MPHodges@member.fsf.org")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (ein . [(20251212 1623) ((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 ((:url . "https://github.com/dickmao/emacs-ipython-notebook") (:commit . "8fa836fcd1c22f45d36249b09590b32a890f2b9e") (:revdesc . "8fa836fcd1c2") (:keywords "jupyter" "literate programming" "reproducible research"))]) + (eink-theme . [(20190219 858) nil "E Ink color theme" tar ((:url . "http://github.com/maio/eink-emacs") (:commit . "326b07523dcb076d6209cdbc7fdbb73df296dbdb") (:revdesc . "326b07523dcb") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainers ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com"))]) + (ejc-sql . [(20241111 117) ((emacs (26 3)) (clomacs (0 0 5)) (dash (2 16 0)) (spinner (1 7 3))) "Emacs SQL client uses Clojure JDBC" tar ((:url . "https://github.com/kostafey/ejc-sql") (:commit . "1fc5a38d974aed401424ecd3b49a74e0a0ebc3bb") (:revdesc . "1fc5a38d974a") (:keywords "sql" "jdbc") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com"))]) + (ejson-mode . [(20190720 2138) ((emacs (25))) "Major mode for editing ejson files" tar ((:url . "https://github.com/dantecatalfamo/ejson-mode") (:commit . "9630dfac9549779711dbe89e621f516bb4b3a354") (:revdesc . "9630dfac9549") (:keywords "convenience" "languages" "tools"))]) + (ekg . [(20251219 454) ((triples (0 6 1)) (emacs (28 1)) (llm (0 18 0))) "A system for recording and linking information" tar ((:url . "https://github.com/ahyatt/ekg") (:commit . "c66fe562c2953304d404883b2811e6270d03cf74") (:revdesc . "c66fe562c295") (:keywords "outlines" "hypermedia") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainers ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com"))]) + (el-autoyas . [(20120918 1317) nil "Automatically create Emacs-Lisp Yasnippets" tar ((:url . "https://github.com/mlf176f2/el-autoyas.el") (:commit . "bde0251ecb504f585dfa27c205c8e312655310cc") (:revdesc . "bde0251ecb50") (:keywords "emacs" "lisp" "mode" "yasnippet"))]) + (el-fetch . [(20251225 1426) ((emacs (25 1))) "Show system information in Neofetch-like style (eg CPU, RAM)" tar ((:url . "https://gitlab.com/xgqt/xgqt-elisp-app-el-fetch") (:commit . "169e2bffe77b43577acbf83d7d8073b6808b880e") (:revdesc . "169e2bffe77b") (:keywords "games") (:authors ("Maciej Barć" . "xgqt@xgqt.org")) (:maintainers ("Maciej Barć" . "xgqt@xgqt.org")) (:maintainer "Maciej Barć" . "xgqt@xgqt.org"))]) + (el-fly-indent-mode . [(20180422 243) ((emacs (25))) "Indent Emacs Lisp on the fly" tar ((:url . "https://github.com/jiahaowork/el-fly-indent-mode.el") (:commit . "1dd4b907ff4d9581c18b4e38e8719e83ba0dace1") (:revdesc . "1dd4b907ff4d") (:keywords "lisp" "languages") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainers ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com"))]) + (el-get . [(20251110 758) nil "Manage the external elisp bits and pieces you depend upon" tar ((:url . "http://www.emacswiki.org/emacs/el-get") (:commit . "64112351b1f58c77463b8802ddd7f78964c9c5ca") (:revdesc . "64112351b1f5") (:keywords "emacs" "package" "elisp" "install" "elpa" "git" "git-svn" "bzr" "cvs" "svn" "darcs" "hg" "apt-get" "fink" "pacman" "http" "http-tar" "emacswiki") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org"))]) + (el-init . [(20150728 920) ((emacs (24)) (cl-lib (0 5)) (anaphora (1 0 0))) "A loader inspired by init-loader" tar ((:url . "https://github.com/HKey/el-init") (:commit . "25fd21d820bca1cf576b8f70c8d5a3bc76792597") (:revdesc . "25fd21d820bc") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com"))]) + (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 ((:url . "https://github.com/HKey/el-init-viewer") (:commit . "c40417db7808c8b8c9b2f196a69de5da7eee84a2") (:revdesc . "c40417db7808") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com"))]) + (el-job . [(20251202 2353) ((emacs (29 1))) "Contrived way to call a function using all CPU cores" tar ((:url . "https://github.com/meedstrom/el-job") (:commit . "274f999ceee3db6c48e3550964c547161a3ee1bb") (:revdesc . "274f999ceee3") (:keywords "processes") (:authors ("Martin Edström" . "meedstrom@runbox.eu")) (:maintainers ("Martin Edström" . "meedstrom@runbox.eu")) (:maintainer "Martin Edström" . "meedstrom@runbox.eu"))]) + (el-mock . [(20220625 1949) nil "Tiny Mock and Stub framework in Emacs Lisp" tar ((:url . "http://github.com/rejeep/el-mock.el") (:commit . "6cfbc9de8f1927295dca6864907fe4156bd71910") (:revdesc . "6cfbc9de8f19") (:keywords "lisp" "testing" "unittest") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (el-patch . [(20250816 21) ((emacs (26))) "Future-proof your Elisp" tar ((:url . "https://github.com/radian-software/el-patch") (:commit . "5adb7097d0ff3d9e004a8bb07c0b25f7ee20ba8a") (:revdesc . "5adb7097d0ff") (:keywords "extensions") (:authors ("Radian LLC" . "contact+el-patch@radian.codes")) (:maintainers ("Radian LLC" . "contact+el-patch@radian.codes")) (:maintainer "Radian LLC" . "contact+el-patch@radian.codes"))]) + (el-secretario . [(20250407 1946) ((emacs (27 1)) (org-ql (0 6 -1)) (hercules (0 3))) "Unify all your inboxes with the Emacs secretary" tar ((:url . "https://git.sr.ht/~zetagon/el-secretario") (:commit . "cb62184ee740df345665ba091267ca41f5895b04") (:revdesc . "cb62184ee740") (:keywords "convenience") (:authors ("Leo Okawa Ericson" . "https://sr.ht/~zetagon")) (:maintainers ("Leo Okawa Ericson" . "git@relevant-information.com")) (:maintainer "Leo Okawa Ericson" . "git@relevant-information.com"))]) + (el-secretario-elfeed . [(20250709 1937) ((emacs (27 1)) (el-secretario (0 0 1)) (elfeed (3 4 1))) "Add elfeed feeds to el-secretario" tar ((:url . "https://git.sr.ht/~zetagon/el-secretario") (:commit . "77bfa47532cfa06ad6d1627dbc61e60996b064e4") (:revdesc . "77bfa47532cf") (:keywords "convenience") (:authors ("Leo Okawa Ericson" . "https://sr.ht/~zetagon")) (:maintainers ("Leo Okawa Ericson" . "git@relevant-information.com")) (:maintainer "Leo Okawa Ericson" . "git@relevant-information.com"))]) + (el-secretario-mu4e . [(20250407 1946) ((emacs (27 1)) (org-ql (0 6 -1)) (el-secretario (0 0 1))) "Add mu4e inboxes to el-secretario" tar ((:url . "https://git.sr.ht/~zetagon/el-secretario") (:commit . "0c728c3bdd1d19356c192ba333a945d732bd16b8") (:revdesc . "0c728c3bdd1d") (:keywords "convenience" "mail") (:authors ("Leo Okawa Ericson" . "https://sr.ht/~zetagon")) (:maintainers ("Leo Okawa Ericson" . "git@relevant-information.com")) (:maintainer "Leo Okawa Ericson" . "git@relevant-information.com"))]) + (el-secretario-notmuch . [(20250407 1946) ((emacs (27 1)) (el-secretario (0 0 1)) (notmuch (0 3 1))) "Add notmuch inboxes to el-secretario" tar ((:url . "https://git.sr.ht/~zetagon/el-secretario") (:commit . "0c728c3bdd1d19356c192ba333a945d732bd16b8") (:revdesc . "0c728c3bdd1d") (:keywords "convenience" "mail") (:authors ("Leo Okawa Ericson" . "https://sr.ht/~zetagon")) (:maintainers ("Leo Okawa Ericson" . "git@relevant-information.com")) (:maintainer "Leo Okawa Ericson" . "git@relevant-information.com"))]) + (el-secretario-org . [(20250411 1608) ((emacs (27 1)) (org-ql (0 6 -1)) (dash (2 18 1)) (el-secretario (0 0 1))) "Create inboxes out of org-mode files for el-secretario" tar ((:url . "https://git.sr.ht/~zetagon/el-secretario") (:commit . "70dee3593e63384d536b59958d9765751c8065b9") (:revdesc . "70dee3593e63") (:keywords "convenience") (:authors ("Leo Okawa Ericson" . "https://sr.ht/~zetagon")) (:maintainers ("Leo Okawa Ericson" . "git@relevant-information.com")) (:maintainer "Leo Okawa Ericson" . "git@relevant-information.com"))]) + (el-spec . [(20121018 704) nil "Ruby's rspec like syntax test frame work" tar ((:url . "https://github.com/uk-ar/el-spec") (:commit . "1dbc465401d4aea5560318c4f13ff30920a0718d") (:revdesc . "1dbc465401d4") (:keywords "test") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainers ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com"))]) + (el-spice . [(20201013 1729) nil "Extra spice for emacs lisp programming" tar ((:url . "https://github.com/vedang/el-spice") (:commit . "a1adde201ee10881b522e67aa2c605378943a28d") (:revdesc . "a1adde201ee1") (:keywords "languages" "extensions") (:authors ("Vedang Manerikar" . "vedang.manerikar@gmail.com")) (:maintainers ("Vedang Manerikar" . "vedang.manerikar@gmail.com")) (:maintainer "Vedang Manerikar" . "vedang.manerikar@gmail.com"))]) + (el-sprunge . [(20200312 1212) ((web-server (20140105 2246)) (htmlize (20130207 1202)) (emacs (24 3))) "Command line paste server with Emacs highlighting" tar ((:url . "https://github.com/eschulte/el-sprunge") (:commit . "e4365ea0bdf60969817619376bdcc98003fec33d") (:revdesc . "e4365ea0bdf6") (:keywords "http" "html" "server" "sprunge" "paste") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainers ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com"))]) + (el-spy . [(20131226 2008) nil "Mocking framework for Emacs lisp. It also support spy, proxy" tar ((:url . "https://github.com/uk-ar/el-spy") (:commit . "b1dead9d1877660856ada22d906ac4e54695aec7") (:revdesc . "b1dead9d1877") (:keywords "test") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainers ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com"))]) + (el-who . [(20240916 613) ((emacs (25 1))) "A s-expression html DSL library compatible with cl-who" tar ((:url . "https://github.com/alejandrogallo/el-who") (:commit . "bfefb23742ac3695578d4b748895df5ccbba6b44") (:revdesc . "bfefb23742ac") (:keywords "lisp" "hypermedia" "docs" "tools" "html" "web") (:authors ("Alejandro Gallo" . "aamsgallo@gmail.com")) (:maintainers ("Alejandro Gallo" . "aamsgallo@gmail.com")) (:maintainer "Alejandro Gallo" . "aamsgallo@gmail.com"))]) + (el2markdown . [(20250105 1836) nil "Convert commentary of elisp files to markdown" tar ((:url . "https://github.com/Lindydancer/el2markdown") (:commit . "66f11d8e46f2def11b3c46abdc114bfd9cfa185e") (:revdesc . "66f11d8e46f2"))]) + (el2org . [(20200408 146) ((emacs (25 1))) "Convert elisp file to org file" tar ((:url . "https://github.com/tumashu/el2org") (:commit . "7db77fdd73f378d4e60e34c11bbdf00677adc32c") (:revdesc . "7db77fdd73f3") (:keywords "convenience") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (elbank . [(20180316 1343) ((emacs (25)) (seq (2 16))) "Personal finances reporting application" tar ((:url . "https://github.com/NicolasPetton/elbank") (:commit . "6dbd21e31fdf7cf62491f6d24b8198d4f91a031b") (:revdesc . "6dbd21e31fdf") (:keywords "tools" "personal-finances") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (elchacha . [(20250922 1827) ((emacs (25 1))) "Elisp ChaCha20 implementation" tar ((:url . "https://github.com/KeyWeeUsr/elchacha") (:commit . "e6e71b8b25eafefd23c33d0d9cb820c4eb646ff6") (:revdesc . "e6e71b8b25ea") (:keywords "convenience" "elchacha") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (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 ((:url . "https://github.com/rollacaster/elcontext") (:commit . "2efd3dd8c5176c4f071bb048be6cb069b05d6e9e") (:revdesc . "2efd3dd8c517") (:keywords "calendar" "convenience"))]) + (elcord . [(20250304 1743) ((emacs (25 1))) "Allows you to integrate Rich Presence from Discord" tar ((:url . "https://github.com/Mstrodl/elcord") (:commit . "deeb22f84378b382f09e78f1718bc4c39a3582b8") (:revdesc . "deeb22f84378") (:keywords "games") (:authors ("Wilfredo Velázquez-Rodríguez" . "zulu.inuoe@gmail.com")) (:maintainers ("Wilfredo Velázquez-Rodríguez" . "zulu.inuoe@gmail.com")) (:maintainer "Wilfredo Velázquez-Rodríguez" . "zulu.inuoe@gmail.com"))]) + (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 ((:url . "https://gitlab.petton.fr/DamienCassou/elcouch") (:commit . "a426e9bee9501284f4e1e84766621ca6b130c79a") (:revdesc . "a426e9bee950") (:keywords "data" "tools") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (elcute . [(20251018 1822) ((emacs (29 1))) "Commands for marking and killing lines electrically" tar ((:url . "https://codeberg.org/vilij/slurpbarf-elcute") (:commit . "f590cc7f9308c37231693e41bf773da002542d51") (:revdesc . "f590cc7f9308") (:keywords "convenience" "lisp" "xml"))]) + (eldev . [(20250314 2105) ((emacs (24 4))) "Elisp development tool" tar ((:url . "https://github.com/emacs-eldev/eldev") (:commit . "87373ddace0c4b2267d8f45ebd20e4b0eb27f821") (:revdesc . "87373ddace0c") (:keywords "maint" "tools") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com"))]) + (eldoc-box . [(20251218 435) ((emacs (27 1))) "Display documentation in childframe" tar ((:url . "https://github.com/casouri/eldoc-box") (:commit . "595262ec8ff56e8f86ef77d8e69339e84117e5f0") (:revdesc . "595262ec8ff5") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainers ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com"))]) + (eldoc-cmake . [(20250320 2017) ((emacs (25 1))) "Eldoc support for CMake" tar ((:url . "https://github.com/ikirill/eldoc-cmake") (:commit . "8ffe7ef0fc01f487834d6bb2468f2d55d68277f1") (:revdesc . "8ffe7ef0fc01"))]) + (eldoc-eask . [(20250101 837) ((emacs (26 1)) (eask (0 1 0))) "Eldoc support for Eask-file" tar ((:url . "https://github.com/emacs-eask/eldoc-eask") (:commit . "2433fa00abfa8d4b384aff022f496287e0975776") (:revdesc . "2433fa00abfa") (:keywords "convenience") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (eldoc-eval . [(20220106 1951) nil "Enable eldoc support when minibuffer is in use" tar ((:url . "https://github.com/thierryvolpiatto/eldoc-eval") (:commit . "e91800503c90cb75dc70abe42f1d6ae499346cc1") (:revdesc . "e91800503c90") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net"))]) + (eldoc-mouse . [(20251225 945) ((emacs (27 1)) (posframe (1 4 0)) (eglot (1 8))) "Display documentation for mouse hover" tar ((:url . "https://github.com/huangfeiyu/eldoc-mouse") (:commit . "6a4cb7338b79e74c0a0f83163aefb04440a4d224") (:revdesc . "6a4cb7338b79") (:keywords "tools" "languages" "convenience" "mouse" "hover") (:authors ("Huang Feiyu" . "sibadake1@163.com")) (:maintainers ("Huang Feiyu" . "sibadake1@163.com")) (:maintainer "Huang Feiyu" . "sibadake1@163.com"))]) + (eldoc-overlay . [(20230406 959) ((emacs (24 4)) (inline-docs (1 0 1)) (quick-peek (1 0))) "Display eldoc with contextual documentation overlay" tar ((:url . "https://repo.or.cz/eldoc-overlay.git") (:commit . "14a9e141918c2e18a107920e8631e622c580b3ef") (:revdesc . "14a9e141918c") (:keywords "docs" "eldoc" "overlay") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com"))]) + (eldoc-stan . [(20211129 2051) ((emacs (25)) (stan-mode (10 3 0))) "Eldoc support for stan functions" tar ((:url . "https://github.com/stan-dev/stan-mode/tree/master/eldoc-stan") (:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:revdesc . "150bbbe5fd3a") (:keywords "help" "tools") (:authors ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainers ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu"))]) + (eldoc-toml . [(20211026 1122) ((emacs (24 4))) "TOML table name at point for ElDoc" tar ((:url . "https://github.com/it-is-wednesday/eldoc-toml") (:commit . "61106be3c3f3a5b293c3f285eec8c6f400142b6d") (:revdesc . "61106be3c3f3") (:keywords "data") (:authors ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainers ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainer "Maor Kadosh" . "git@avocadosh.xyz"))]) + (electric-case . [(20150417 1112) nil "Insert camelCase, snake_case words without \"Shift\"ing" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "984b6a4c6c4cdcefeecb59e941f5f184cc1dedff") (:revdesc . "984b6a4c6c4c"))]) + (electric-cursor . [(20221221 438) ((emacs (25 1))) "Change cursor automatically depending on mode" tar ((:url . "https://github.com/duckwork/electric-cursor") (:commit . "bc09aa8c5d3cc32e3e6452cbf8018fc1ea772b73") (:revdesc . "bc09aa8c5d3c") (:keywords "terminals" "frames") (:authors ("Case Duckworth" . "acdw@acdw.net")) (:maintainers ("Case Duckworth" . "acdw@acdw.net")) (:maintainer "Case Duckworth" . "acdw@acdw.net"))]) + (electric-list-directory . [(20250821 520) ((emacs (26 1))) "Lightweight popup directory browser" tar ((:url . "https://github.com/kshartman/electric-directory-list") (:commit . "2e0d4342146f1c033a1dba54e814961649810a5f") (:revdesc . "2e0d4342146f") (:keywords "files" "convenience") (:authors ("K. Shane Hartman" . "shane@ai.mit.edu")) (:maintainers ("K. Shane Hartman" . "shane@ai.mit.edu")) (:maintainer "K. Shane Hartman" . "shane@ai.mit.edu"))]) + (electric-operator . [(20250524 1712) ((dash (2 10 0)) (emacs (24 4))) "Automatically add spaces around operators" tar ((:url . "https://github.com/davidshepherd7/electric-operator") (:commit . "7caf4955a6470cb61c743ab0fd9d4a8d8b15367b") (:revdesc . "7caf4955a647") (:keywords "electric") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com"))]) + (electric-ospl . [(20250502 1439) ((emacs (26 1))) "Electric OSPL Mode" tar ((:url . "https://git.sr.ht/~swflint/electric-ospl-mode") (:commit . "a17f7312ef48eba1586c7d0637336eb19aee057e") (:revdesc . "a17f7312ef48") (:keywords "convenience" "text") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (electric-spacing . [(20220220 1540) nil "Insert operators with surrounding spaces smartly" tar ((:url . "https://github.com/xwl/electric-spacing") (:commit . "c37b2502512dd49a8311d7c34e9bfd1af3d4dbcd") (:revdesc . "c37b2502512d") (: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 ((:url . "https://github.com/justinbarclay/elegant-agenda-mode") (:commit . "5cbc688584ba103ea3be7d7b30e5d94e52f59eb6") (:revdesc . "5cbc688584ba") (:keywords "faces") (:authors ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainers ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainer "Justin Barclay" . "justinbarclay@gmail.com"))]) + (elescope . [(20210312 1147) ((emacs (25 1)) (ivy (0 10)) (request (0 3)) (seq (2 0))) "Seach and clone projects from the minibuffer" tar ((:url . "https://github.com/freesteph/elescope") (:commit . "36566c8c1f5f993f67eadc85d18539ff375c0f98") (:revdesc . "36566c8c1f5f") (:keywords "vc") (:authors ("Stéphane Maniaci" . "stephane.maniaci@gmail.com")) (:maintainers ("Stéphane Maniaci" . "stephane.maniaci@gmail.com")) (:maintainer "Stéphane Maniaci" . "stephane.maniaci@gmail.com"))]) + (elf-mode . [(20161009 748) ((emacs (24 3))) "Show symbols in binaries" tar ((:url . "https://github.com/abo-abo/elf-mode") (:commit . "cd280d683cd3341d8bb31af6db7e3b74a133e6ab") (:revdesc . "cd280d683cd3") (:keywords "matching") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (elfeed . [(20241202 22) ((emacs (24 3))) "An Emacs Atom/RSS feed reader" tar ((:url . "https://github.com/skeeto/elfeed") (:commit . "a39fb78e34ee25dc8baea83376f929d7c128344f") (:revdesc . "a39fb78e34ee") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (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 ((:url . "https://github.com/paulelms/elfeed-autotag") (:commit . "bc62c37fb79b720ff8b6d67f04f2268841306dcd") (:revdesc . "bc62c37fb79b") (:keywords "news") (:authors ("Paul Elms" . "https://paul.elms.pro")) (:maintainers ("Paul Elms" . "paul@elms.pro")) (:maintainer "Paul Elms" . "paul@elms.pro"))]) + (elfeed-curate . [(20251026 311) ((emacs (27 1)) (elfeed (3 4 1))) "Elfeed entry curation" tar ((:url . "https://github.com/rnadler/elfeed-curate") (:commit . "c91caf36cefadd818c893ac219265367f9f7945d") (:revdesc . "c91caf36cefa") (:keywords "news") (:authors ("Robert Nadler" . "robert.nadler@gmail.com")) (:maintainers ("Robert Nadler" . "robert.nadler@gmail.com")) (:maintainer "Robert Nadler" . "robert.nadler@gmail.com"))]) + (elfeed-dashboard . [(20210727 603) ((emacs (25 1)) (elfeed (3 3 0))) "An extensible frontend for elfeed using org-mode" tar ((:url . "https://github.com/Manoj321/elfeed-dashboard") (:commit . "b143f8453aed2053e8fc6f05cef6233797408546") (:revdesc . "b143f8453aed") (:keywords "convenience") (:authors ("Manoj Kumar Manikchand" . "manojm321@protonmail.com")) (:maintainers ("Manoj Kumar Manikchand" . "manojm321@protonmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm321@protonmail.com"))]) + (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 ((:url . "https://github.com/algernon/elfeed-goodies") (:commit . "544ef42ead011d960a0ad1c1d34df5d222461a6b") (:revdesc . "544ef42ead01"))]) + (elfeed-org . [(20250219 950) ((emacs (28 1)) (elfeed (1 1 1)) (org (8 2 7))) "Configure elfeed with one or more org-mode files" tar ((:url . "https://github.com/remyhonig/elfeed-org") (:commit . "1197cf29f6604e572ec604874a8f50b58081176a") (:revdesc . "1197cf29f660") (:keywords "news") (:authors ("Remy Honig" . "remyhonig@gmail.com")) (:maintainers ("Remy Honig" . "remyhonig@gmail.com")) (:maintainer "Remy Honig" . "remyhonig@gmail.com"))]) + (elfeed-protocol . [(20240822 805) ((emacs (24 4)) (elfeed (2 1 1)) (cl-lib (0 5))) "Provide fever/newsblur/owncloud/ttrss protocols for elfeed" tar ((:url . "https://github.com/fasheng/elfeed-protocol") (:commit . "4f5e77a28c501db686ac06a2ea250a7b37d5420c") (:revdesc . "4f5e77a28c50") (:keywords "news") (:authors ("Xu Fasheng" . "fasheng[AT]fasheng.info")) (:maintainers ("Xu Fasheng" . "fasheng[AT]fasheng.info")) (:maintainer "Xu Fasheng" . "fasheng[AT]fasheng.info"))]) + (elfeed-score . [(20251012 2253) ((emacs (26 1)) (elfeed (3 3 0))) "Gnus-style scoring for Elfeed" tar ((:url . "https://github.com/sp1ff/elfeed-score") (:commit . "9e9874dc4f2a6b01199e0834ba52665d8383ad9f") (:revdesc . "9e9874dc4f2a") (:keywords "news") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainers ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com"))]) + (elfeed-summary . [(20240929 2043) ((emacs (27 1)) (magit-section (3 3 0)) (elfeed (3 4 1))) "Feed summary interface for elfeed" tar ((:url . "https://github.com/SqrtMinusOne/elfeed-summary.el") (:commit . "76b4b93838b0420a114f934bbf8c09f25bf6ad16") (:revdesc . "76b4b93838b0") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (elfeed-tube . [(20250815 629) ((emacs (27 1)) (elfeed (3 4 1)) (aio (1 0))) "YouTube integration for Elfeed" tar ((:url . "https://github.com/karthink/elfeed-tube") (:commit . "99e55ac428dc50bff271575cffddc5060f22087d") (:revdesc . "99e55ac428dc") (:keywords "news" "hypermedia" "convenience") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com"))]) + (elfeed-tube-mpv . [(20250815 629) ((emacs (27 1)) (elfeed-tube (0 10)) (mpv (0 2 0))) "Control mpv from Elfeed" tar ((:url . "https://github.com/karthink/elfeed-tube") (:commit . "99e55ac428dc50bff271575cffddc5060f22087d") (:revdesc . "99e55ac428dc") (:keywords "news" "hypermedia") (:authors ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthikchikmagalur@gmail.com"))]) + (elfeed-webkit . [(20230604 2111) ((emacs (26 1)) (elfeed (3 4 1))) "Render elfeed entries in embedded webkit widgets" tar ((:url . "https://github.com/fritzgrabo/elfeed-webkit") (:commit . "db7ee83f9c0e67f01960b1e0489717cf7a8fd2c2") (:revdesc . "db7ee83f9c0e") (:keywords "comm") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (elforth . [(20210522 928) ((emacs (26 1))) "Do you have what it takes to hack Emacs Lisp in Forth?" tar ((:url . "https://github.com/lassik/elforth") (:commit . "2d8540434a28e7edaa04a992c3c362832b2fd61e") (:revdesc . "2d8540434a28") (:keywords "games") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (elgrep . [(20230814 1215) ((emacs (26 2)) (async (1 5))) "Searching files for regular expressions" tar ((:url . "https://github.com/TobiasZawada/elgrep") (:commit . "329eaf2e9e994e5535c7f7fe2685ec21d8323384") (:revdesc . "329eaf2e9e99") (:keywords "tools" "matching" "files" "unix") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainers ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de"))]) + (elhome . [(20161025 2042) ((initsplit (20120630))) "A framework for a \"home\" Emacs configuration" tar ((:url . "http://github.com/demyanrogozhin/elhome") (:commit . "e789e806469af3e9705f72298683c21f6c3a516d") (:revdesc . "e789e806469a") (:keywords "lisp") (:authors ("Dave Abrahams" . "dave@boostpro.com")) (:maintainers ("Demyan Rogozhin" . "demyan.rogozhin@gmail.com")) (:maintainer "Demyan Rogozhin" . "demyan.rogozhin@gmail.com"))]) + (elisa . [(20250202 2040) ((emacs (29 2)) (ellama (0 11 2)) (llm (0 18 1)) (async (1 9 8)) (plz (0 9))) "Emacs Lisp Information System Assistant" tar ((:url . "http://github.com/s-kostyaev/elisa") (:commit . "b655b59d371639d357dcabe48f1c2cd1694ee8de") (:revdesc . "b655b59d3716") (:keywords "help" "local" "tools") (:authors ("Sergey Kostyaev" . "sskostyaev@gmail.com")) (:maintainers ("Sergey Kostyaev" . "sskostyaev@gmail.com")) (:maintainer "Sergey Kostyaev" . "sskostyaev@gmail.com"))]) + (elisp-autofmt . [(20251209 58) ((emacs (29 1))) "Emacs lisp auto-format" tar ((:url . "https://codeberg.org/ideasman42/emacs-elisp-autofmt") (:commit . "aa0adce42f6f3cb25677aa4fb67c18bdf5526926") (:revdesc . "aa0adce42f6f") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (elisp-def . [(20250818 2223) ((dash (2 12 0)) (f (0 19 0)) (s (1 11 0)) (emacs (24 3))) "Macro-aware go-to-definition for elisp" tar ((:url . "https://github.com/Wilfred/elisp-def") (:commit . "61a5f64498c9c8de8e9aab84a22775162f336144") (:revdesc . "61a5f64498c9") (:keywords "lisp") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (elisp-demos . [(20240128 810) ((emacs (26 3))) "Elisp API Demos" tar ((:url . "https://github.com/xuchunyang/elisp-demos") (:commit . "1a108d1c5011f9ced58be2ca98bea1fbd4130a2f") (:revdesc . "1a108d1c5011") (:keywords "lisp" "docs"))]) + (elisp-depend . [(20251121 2039) nil "Parse depend libraries of elisp file" tar ((:url . "https://github.com/emacsorphanage/elisp-depend") (:commit . "c604eee1a86a297cd13c0235ebde1431dcad59d2") (:revdesc . "c604eee1a86a"))]) + (elisp-depmap . [(20251029 1438) ((emacs (26 1)) (dash (0))) "Generate an elisp dependency map in graphviz" tar ((:url . "https://github.com/mtekman/elisp-depmap.el") (:commit . "c87e9ecae624b09d113c25b7ad1317d97eb2f434") (:revdesc . "c87e9ecae624") (:keywords "outlines"))]) + (elisp-dev-mcp . [(20251223 1126) ((emacs (27 1)) (mcp-server-lib (0 2 0))) "MCP server for agentic Elisp development" tar ((:url . "https://github.com/laurynas-biveinis/elisp-dev-mcp") (:commit . "481bb3edb9e991ad5dc48a37d486596dfed42e64") (:revdesc . "481bb3edb9e9") (:keywords "tools" "development"))]) + (elisp-docstring-mode . [(20170304 1615) nil "Major mode for editing elisp docstrings" tar ((:url . "https://github.com/Fuco1/elisp-docstring-mode") (:commit . "b135d95b158048927f12184e5cfb8fe01fc44713") (:revdesc . "b135d95b1580") (:keywords "languages") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (elisp-format . [(20160508 952) nil "Format elisp code" tar ((:url . "https://github.com/Yuki-Inoue/elisp-format") (:commit . "9fe516d39b349070537099a01fe34e47fbded2c8") (:revdesc . "9fe516d39b34") (:authors (nil . "AndyStewartlazycat.manatee@gmail.com")))]) + (elisp-lint . [(20220419 252) ((emacs (24 4)) (dash (2 15 0)) (package-lint (0 11))) "Basic linting for Emacs Lisp" tar ((:url . "http://github.com/gonewest818/elisp-lint/") (:commit . "c5765abf75fd1ad22505b349ae1e6be5303426c2") (:revdesc . "c5765abf75fd") (:keywords "lisp" "maint" "tools") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (elisp-refs . [(20230920 201) ((dash (2 12 0)) (s (1 11 0))) "Find callers of elisp functions or macros" tar ((:url . "https://github.com/Wilfred/elisp-refs") (:commit . "541a064c3ce27867872cf708354a65d83baf2a6d") (:revdesc . "541a064c3ce2") (:keywords "lisp") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (elisp-sandbox . [(20131116 1842) nil "Evaluate EmacsLisp expressions in a sandbox" tar ((:url . "https://github.com/joelmccracken/elisp-sandbox") (:commit . "ddd669266ca36d7e4ebba73eb1ab42523787e042") (:revdesc . "ddd669266ca3") (:keywords "lisp") (:authors ("Joel McCracken" . "mccracken.joel@gmail.com") ("D. Goel" . "deego@gnufans.org")) (:maintainers ("Joel McCracken" . "mccracken.joel@gmail.com") ("D. Goel" . "deego@gnufans.org")) (:maintainer "Joel McCracken" . "mccracken.joel@gmail.com"))]) + (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 ((:url . "https://github.com/purcell/elisp-slime-nav") (:commit . "8588d80d414aee1fafce5b9da0e913612ee0bcdd") (:revdesc . "8588d80d414a") (:keywords "languages" "navigation" "slime" "elisp" "emacs-lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (elixir-mode . [(20230626 1738) ((emacs (25))) "Major mode for editing Elixir files" tar ((:url . "https://github.com/elixir-editors/emacs-elixir") (:commit . "00d6580a040a750e019218f9392cf9a4c2dac23a") (:revdesc . "00d6580a040a") (:keywords "languages" "elixir"))]) + (elixir-ts-mode . [(20241228 919) ((emacs (29 1)) (heex-ts-mode (1 3))) "Major mode for Elixir with tree-sitter support" tar ((:url . "https://github.com/wkirschbaum/elixir-ts-mode") (:commit . "143b94f4a5ac1f161c232e3f25b84c6768be2f25") (:revdesc . "143b94f4a5ac") (:keywords "elixir" "languages" "tree-sitter"))]) + (elixir-yasnippets . [(20150417 1239) ((yasnippet (0 8 0))) "Yasnippets for Elixir" tar ((:url . "https://github.com/hisea/elixir-yasnippets") (:commit . "980ca7626c14ef0573bec0035ec7942796062783") (:revdesc . "980ca7626c14") (:keywords "snippets") (:authors ("Yinghai Zhao" . "zyinghai@gmail.com")) (:maintainers ("Yinghai Zhao" . "zyinghai@gmail.com")) (:maintainer "Yinghai Zhao" . "zyinghai@gmail.com"))]) + (elkee . [(20250928 2333) ((emacs (25 1)) (kaesar (0 9 5)) (elchacha (1 0 4))) "Keepass client" tar ((:url . "https://github.com/KeyWeeUsr/elkee") (:commit . "9caf0b086e6b4f8132163620a709de7b260b5ace") (:revdesc . "9caf0b086e6b") (:keywords "convenience" "keepass" "client") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (ellama . [(20251220 2246) ((emacs (28 1)) (llm (0 24 0)) (plz (0 8)) (transient (0 7)) (compat (29 1))) "Tool for interacting with LLMs" tar ((:url . "http://github.com/s-kostyaev/ellama") (:commit . "dfda86230dd312ad259eb4b7b1264546f0a02810") (:revdesc . "dfda86230dd3") (:keywords "help" "local" "tools") (:authors ("Sergey Kostyaev" . "sskostyaev@gmail.com")) (:maintainers ("Sergey Kostyaev" . "sskostyaev@gmail.com")) (:maintainer "Sergey Kostyaev" . "sskostyaev@gmail.com"))]) + (ellocate . [(20200112 1931) ((emacs (25 1)) (s (1 12 0)) (f (0 20 0))) "The locate command reimplemented in Emacs Lisp" tar ((:url . "https://github.com/walseb/ellocate") (:commit . "81405082f68f0577c9f176d3d4f034a7142aba59") (:revdesc . "81405082f68f") (:keywords "matching") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com"))]) + (elm-mode . [(20250401 915) ((f (0 17)) (s (1 7 0)) (emacs (25 1)) (seq (2 23)) (reformatter (0 3))) "Major mode for Elm" tar ((:url . "https://github.com/jcollard/elm-mode") (:commit . "90b72cd2c9bc4506f531bcdcd73fa2530d9f4f7c") (:revdesc . "90b72cd2c9bc"))]) + (elm-test-runner . [(20230905 331) ((emacs (24 4))) "Enhanced support for running elm-test" tar ((:url . "https://github.com/juanedi/elm-test-runner") (:commit . "b664e50a4c849f5f2e2f434fc01718da10515612") (:revdesc . "b664e50a4c84"))]) + (elm-yasnippets . [(20160401 524) ((yasnippet (0 8 0))) "Yasnippets for Elm" tar ((:url . "https://github.com/abingham/elm-yasnippets") (:commit . "45a11a0cef0c36633fb3477d3dc4167e82779ba4") (:revdesc . "45a11a0cef0c") (:keywords "snippets") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (elmacro . [(20210716 639) ((s (1 11 0)) (dash (2 13 0))) "Convert keyboard macros to emacs lisp" tar ((:url . "https://github.com/Silex/elmacro") (:commit . "d2e05012cee4f54fab6d8d8d6aced6e5eeef4f31") (:revdesc . "d2e05012cee4") (:keywords "macro" "elisp" "convenience") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com"))]) + (elmine . [(20200520 1237) ((s (1 10 0))) "Redmine API access via elisp" tar ((:url . "http://github.com/leoc/elmine") (:commit . "d42e328634828e0c1770b72d5e8b87671d081693") (:revdesc . "d42e32863482") (:keywords "tools") (:authors ("Arthur Andersen" . "leoc.git@gmail.com")) (:maintainers ("Arthur Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Andersen" . "leoc.git@gmail.com"))]) + (elmpd . [(20250910 327) ((emacs (25 1))) "A tight, ergonomic, async client library for mpd" tar ((:url . "https://github.com/sp1ff/elmpd") (:commit . "a68563fa3e3b09fcdaf4b9f070542f8cfa257067") (:revdesc . "a68563fa3e3b") (:keywords "comm") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainers ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com"))]) + (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 ((:url . "https://github.com/jcaw/elnode") (:commit . "29ef0f51a65a24fca7fdcdb4140d2e4556e4bb29") (:revdesc . "29ef0f51a65a") (:keywords "lisp" "http" "hypermedia") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")))]) + (elog . [(20250413 100) ((emacs (23 2))) "Logging library extended from logito" tar ((:url . "https://github.com/lujun9972/elog") (:commit . "c65288fd32eb187d3e63d4a7799a69e57da0eab4") (:revdesc . "c65288fd32eb") (:keywords "lisp" "tool" "log") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (elogcat . [(20230121 459) ((s (1 9 0)) (dash (2 10 0))) "Logcat interface" tar ((:url . "https://github.com/youngker/elogcat.el") (:commit . "f2f19d7ab6b77b8fec55cb67524df629fe967891") (:revdesc . "f2f19d7ab6b7") (:keywords "tools") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com"))]) + (eloud . [(20190706 1707) ((emacs (24 4))) "A lightweight, interactive screen reader" tar ((:url . "https://github.com/smythp/eloud") (:commit . "b8f4af1f652268d73281de91fb333b5984970847") (:revdesc . "b8f4af1f6522") (:keywords "extensions") (:authors ("Patrick Smyth" . "patricksmyth01@gmail.com")) (:maintainers ("Patrick Smyth" . "patricksmyth01@gmail.com")) (:maintainer "Patrick Smyth" . "patricksmyth01@gmail.com"))]) + (elpa-audit . [(20141023 1331) nil "Handy functions for inspecting and comparing package archives" tar ((:url . "https://github.com/purcell/elpa-audit") (:commit . "1ca4e6073f8c4cbb41688b69d3b3feaa1a392efc") (:revdesc . "1ca4e6073f8c") (:keywords "maint") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (elpa-clone . [(20240229 1034) ((emacs (24 4))) "Clone ELPA archive" tar ((:url . "https://github.com/dochang/elpa-clone") (:commit . "3c77587a6ab6cdf041f969d8606407e575374022") (:revdesc . "3c77587a6ab6") (:keywords "comm" "elpa" "clone" "mirror") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainers ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com"))]) + (elpa-deploy . [(20191022 718) ((emacs (24 4)) (f (0 0))) "ELPA deployment library" tar ((:url . "https://github.com/oitofelix/elpa-deploy") (:commit . "f5126a2da1e0e52981fad9c12028814be80328c2") (:revdesc . "f5126a2da1e0") (:keywords "tools") (: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"))]) + (elpa-mirror . [(20240413 1426) ((emacs (27 1))) "Create local package repository from installed packages" tar ((:url . "http://github.com/redguardtoo/elpa-mirror") (:commit . "d51a5b81af909727fac45f3c9d3653b1170e01f0") (:revdesc . "d51a5b81af90") (:keywords "tools") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (elpher . [(20250929 1422) ((emacs (27 1))) "A friendly gopher and gemini client" tar ((:url . "https://thelambdalab.xyz/elpher") (:commit . "dcdeb86f7ae633e252f9ef8a73d3458e87c1ab12") (:revdesc . "dcdeb86f7ae6") (:keywords "comm" "gopher" "gemini") (:authors ("Tim Vaughan" . "plugd@thelambdalab.xyz")) (:maintainers ("Tim Vaughan" . "plugd@thelambdalab.xyz")) (:maintainer "Tim Vaughan" . "plugd@thelambdalab.xyz"))]) + (elpl . [(20220328 316) ((emacs (24 4))) "Emacs Lisp REPL" tar ((:url . "https://github.com/twlz0ne/elpl") (:commit . "501871ab543b9967bfe87a8a82f83ab96b7f909e") (:revdesc . "501871ab543b") (:keywords "lisp" "tool") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com"))]) + (elpy . [(20250404 2349) ((company (0 9 10)) (emacs (24 4)) (highlight-indentation (0 7 0)) (pyvenv (1 20)) (yasnippet (0 13 0)) (s (1 12 0))) "Emacs Python Development Environment" tar ((:url . "https://github.com/jorgenschaefer/elpy") (:commit . "0b381f55969438ab2ccc2d1a1614045fcf7c9545") (:revdesc . "0b381f559694") (:keywords "python" "ide" "languages" "tools") (:authors ("Jorgen Schaefer" . "contact@jorgenschaefer.de") ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainers ("Jorgen Schaefer" . "contact@jorgenschaefer.de") ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Jorgen Schaefer" . "contact@jorgenschaefer.de"))]) + (elpygen . [(20171225 1736) ((emacs (25)) (yasnippet (0 8 0))) "Generate a Python function/method using a symbol under point" tar ((:url . "https://github.com/vkazanov/elpygen") (:commit . "21929c997a05968f9eefe52b85a76ceaab3b0d81") (:revdesc . "21929c997a05") (:keywords "python" "languages" "tools") (:authors ("Vladimir Kazanov" . "vkazanov@inbox.ru")) (:maintainers ("Vladimir Kazanov" . "vkazanov@inbox.ru")) (:maintainer "Vladimir Kazanov" . "vkazanov@inbox.ru"))]) + (elquery . [(20220331 143) ((emacs (25 1)) (dash (2 13 0))) "The HTML library for elisp" tar ((:url . "https://github.com/AdamNiederer/elquery") (:commit . "38f3bd41096cb270919b06095da0b9ac1add4598") (:revdesc . "38f3bd41096c") (:keywords "html" "hypermedia" "tools" "webscale"))]) + (elsa . [(20250717 1205) ((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 ((:url . "https://github.com/emacs-elsa/Elsa") (:commit . "4a4a180a7e6837ac359c0094e40da339e1300765") (:revdesc . "4a4a180a7e68") (:keywords "languages" "lisp") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (elscreen . [(20181009 451) ((emacs (24))) "Emacs window session manager" tar ((:url . "https://github.com/knu/elscreen") (:commit . "cc58337faf5ba1eae7e87f75f6ff3758675688f2") (:revdesc . "cc58337faf5b") (:keywords "window" "convenience") (:authors ("Naoto Morishima" . "naoto@morishima.net")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (elscreen-buffer-group . [(20200109 2338) ((emacs (24 4)) (elscreen (0)) (cl-lib (0 5))) "Elscreen buffer group" tar ((:url . "https://github.com/jeffgran/elscreen-buffer-group") (:commit . "b48e71d4782adfeb2958f227d78c04164d26e4bd") (:revdesc . "b48e71d4782a") (:keywords "buffer") (:authors ("Jeff Gran" . "jeff@jeffgran.com")) (:maintainers ("Jeff Gran" . "jeff@jeffgran.com")) (:maintainer "Jeff Gran" . "jeff@jeffgran.com"))]) + (elscreen-fr . [(20160920 953) ((elscreen (0)) (seq (1 11))) "Use frame title as screen tab" tar ((:url . "http://github.com/rocher/elscreen-fr") (:commit . "b9c11f80d277086d5d5bf88623e15fc7adbbbe3c") (:revdesc . "b9c11f80d277") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainers ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com"))]) + (elscreen-mew . [(20160504 1835) ((elscreen (20120413 807))) "ElScreen Add-On for Mew" tar ((:url . "https://github.com/masutaka/elscreen-mew") (:commit . "89871fad690ae161dc076e16ef481b1965612077") (:revdesc . "89871fad690a") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainers ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com"))]) + (elscreen-multi-term . [(20200417 821) ((emacs (24 4)) (elscreen (1 4 6)) (multi-term (1 3))) "Multi term for elscreen" tar ((:url . "https://github.com/wamei/elscreen-multi-term") (:commit . "4ea89bae0444d9d4377515929f76cb3e98140f1f") (:revdesc . "4ea89bae0444") (:keywords "elscreen" "multi term") (:authors ("wamei" . "wamei.cho@gmail.com")) (:maintainers ("wamei" . "wamei.cho@gmail.com")) (:maintainer "wamei" . "wamei.cho@gmail.com"))]) + (elscreen-separate-buffer-list . [(20200807 1324) ((emacs (24 4)) (elscreen (1 4 6))) "Separate buffer list manager for elscreen" tar ((:url . "https://github.com/wamei/elscreen-separate-buffer-list") (:commit . "88d8850108947949431425a2d938a09d941454e8") (:revdesc . "88d885010894") (:keywords "elscreen") (:authors ("wamei" . "wamei.cho@gmail.com")) (:maintainers ("wamei" . "wamei.cho@gmail.com")) (:maintainer "wamei" . "wamei.cho@gmail.com"))]) + (elscreen-tab . [(20230810 2114) ((emacs (26)) (elscreen (20180321)) (dash (2 14 1))) "Minor mode to display tabs of elscreen in a dedicated buffer" tar ((:url . "https://github.com/aki-s/elscreen-tab") (:commit . "21c1f3d3ec47f8b5e31bb0b26b4f60864e49e966") (:revdesc . "21c1f3d3ec47") (:keywords "tools" "extensions") (:authors ("Aki Syunsuke" . "sunny.day.dev@gmail.com")) (:maintainers ("Aki Syunsuke" . "sunny.day.dev@gmail.com")) (:maintainer "Aki Syunsuke" . "sunny.day.dev@gmail.com"))]) + (elune-theme . [(20231009 1709) nil "Elune theme" tar ((:url . "https://github.com/xcatalyst/elune-theme") (:commit . "4d0217a7601e34fa84fc174ccf7945cd598d4135") (:revdesc . "4d0217a7601e") (:authors ("ağan Korkmaz" . "xcatalystt@gmail.com")) (:maintainers ("ağan Korkmaz" . "xcatalystt@gmail.com")) (:maintainer "ağan Korkmaz" . "xcatalystt@gmail.com"))]) + (elvish-mode . [(20180809 1612) ((emacs (24 3))) "Defines a major mode for Elvish" tar ((:url . "https://github.com/ALSchwalm/elvish-mode") (:commit . "c3a7e31564256b9755b1ab9fb40d32ad78cd1ad2") (:revdesc . "c3a7e3156425") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainers ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com"))]) + (elwm . [(20150817 1007) ((dash (1 1 0))) "Minimalistic window manager for emacs" tar ((:url . "https://github.com/Fuco1/elwm") (:commit . "c33b183f006ad476c3a44dab316f580f8b369930") (:revdesc . "c33b183f006a") (:keywords "docs") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (elx . [(20251212 1101) ((emacs (29 1)) (compat (30 1)) (llama (1 0))) "Extract information from Emacs Lisp libraries" tar ((:url . "https://github.com/emacscollective/elx") (:commit . "c640a3a86b96dcca03c444147e1a63540e6d561e") (:revdesc . "c640a3a86b96") (:keywords "docs" "libraries" "packages") (:authors ("Jonas Bernoulli" . "emacs.elx@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.elx@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.elx@jonas.bernoulli.dev"))]) + (elysium . [(20250406 1638) ((emacs (27 1)) (gptel (0 9 0))) "Automatically apply LLM-created code-suggestions" tar ((:url . "https://github.com/lanceberge/elysium/") (:commit . "049ad3091baf3ce578791187c5e5e4f932c26044") (:revdesc . "049ad3091baf") (:authors ("Lance Bergeron" . "bergeron.lance6@gmail.com")) (:maintainers ("Lance Bergeron" . "bergeron.lance6@gmail.com")) (:maintainer "Lance Bergeron" . "bergeron.lance6@gmail.com"))]) + (emacs-everywhere . [(20251028 1701) ((emacs (28 1))) "System-wide popup windows for quick edits" tar ((:url . "https://github.com/tecosaur/emacs-everywhere") (:commit . "09a6a64dd07a712aad8ef1d0b99c086f025540d3") (:revdesc . "09a6a64dd07a") (:keywords "convenience" "frames") (:authors ("TEC" . "https://github.com/tecosaur")) (:maintainers ("TEC" . "contact@tecosaur.net")) (:maintainer "TEC" . "contact@tecosaur.net"))]) + (emacsc . [(20250710 1637) nil "Helper for emacsc(1)" tar ((:url . "https://github.com/knu/emacsc") (:commit . "c0d51eea7c5cbef4ea49350dff8c721227635be6") (:revdesc . "c0d51eea7c5c") (:keywords "tools") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (emacsist-view . [(20160426 1223) nil "Mode for viewing emacsist.com" tar ((:url . "https://github.com/lujun9972/emacsist-view") (:commit . "f67761259ed779a9bc95c9a4e0474522990c5c6b") (:revdesc . "f67761259ed7") (:keywords "convenience" "usability") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (emacsql . [(20251130 1841) ((emacs (26 1))) "High-level SQL database front-end" tar ((:url . "https://github.com/magit/emacsql") (:commit . "f177a41e93b92a4b1139a553eed5415ca33f439c") (:revdesc . "f177a41e93b9") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Jonas Bernoulli" . "emacs.emacsql@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.emacsql@jonas.bernoulli.dev"))]) + (emacsshot . [(20191206 944) ((emacs (24 4))) "Snapshot a frame or window from within" tar ((:url . "https://gitlab.com/marcowahl/emacsshot") (:commit . "fe958b11056f3c671ebdd604d5aa574323284ca5") (:revdesc . "fe958b11056f") (:keywords "convenience") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")))]) + (emamux . [(20251204 2049) ((emacs (26 1))) "Interact with tmux" tar ((:url . "https://github.com/emacsorphanage/emamux") (:commit . "0c42b04c1ee50d81872a736b768f44f544141b45") (:revdesc . "0c42b04c1ee5") (:keywords "unix") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (emamux-ruby-test . [(20130812 1639) ((emamux (0 1)) (projectile (0 9 1))) "Ruby test with emamux" tar ((:url . "https://github.com/syohex/emamux-ruby-test") (:commit . "785bfd44d097a46bb2ebe1e62ac7595fd4dc9ab5") (:revdesc . "785bfd44d097"))]) + (emaps . [(20200508 1759) ((dash (2 17 0)) (emacs (24))) "Utilities for working with keymaps" tar ((:url . "https://github.com/GuiltyDolphin/emaps") (:commit . "7c561f3ded2015ed3774e5784059d6601082743e") (:revdesc . "7c561f3ded20") (:keywords "convenience" "keyboard" "keymap" "utility") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainers ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com"))]) + (embark . [(20251118 111) ((emacs (28 1)) (compat (30))) "Conveniently act on minibuffer completions" tar ((:url . "https://github.com/oantolin/embark") (:commit . "7b3b2fa239c34c2e304eab4367a4f5924c047e2b") (:revdesc . "7b3b2fa239c3") (:keywords "convenience") (: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"))]) + (embark-consult . [(20250622 535) ((emacs (28 1)) (compat (30)) (embark (1 1)) (consult (1 8))) "Consult integration for Embark" tar ((:url . "https://github.com/oantolin/embark") (:commit . "a563786d0e07fc43601c1c83d1ffc801b86506b9") (:revdesc . "a563786d0e07") (:keywords "convenience") (: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"))]) + (embark-org-roam . [(20240303 335) ((emacs (27 1)) (embark (0 23)) (org-roam (2 2 0))) "Embark export buffer for org roam nodes" tar ((:url . "https://github.com/bramadams/embark-org-roam") (:commit . "5bc9efc33e74eb47becbc2f6467141864cb6ecea") (:revdesc . "5bc9efc33e74") (:keywords "outlines" "hypermedia") (:authors ("Bram Adams" . "bram.adams@queensu.ca")) (:maintainers ("Bram Adams" . "bram.adams@queensu.ca")) (:maintainer "Bram Adams" . "bram.adams@queensu.ca"))]) + (embark-vc . [(20250121 1558) ((emacs (27 1)) (embark (0 21 1)) (forge (0 3)) (compat (29 1 3 0))) "Embark actions for various version control integrations" tar ((:url . "https://github.com/elken/embark-vc") (:commit . "2bc2b3a3e610c217a61355a33b7e6c73b3b3ad44") (:revdesc . "2bc2b3a3e610") (:keywords "convenience" "matching" "terminals" "tools" "unix" "vc") (:authors ("Ellis Kenyő" . "https://github.com/elken")) (:maintainers ("Ellis Kenyő" . "me@elken.dev")) (:maintainer "Ellis Kenyő" . "me@elken.dev"))]) + (ember-mode . [(20240507 915) ((cl-lib (0 5))) "Ember navigation mode for emacs" tar ((:url . "https://github.com/madnificent/ember-mode") (:commit . "38145ad189000c58860594c05523e42bacb3d246") (:revdesc . "38145ad18900") (:keywords "ember" "ember.js" "emberjs") (:authors ("Aad Versteden" . "madnificent@gmail.com")) (:maintainers ("Aad Versteden" . "madnificent@gmail.com")) (:maintainer "Aad Versteden" . "madnificent@gmail.com"))]) + (ember-twilight-theme . [(20250224 923) ((emacs (24 1))) "Ember Twilight theme" tar ((:url . "https://github.com/madara123pain/unique-emacs-theme-pack") (:commit . "ae9a0c318c371ed70ec568f3a618d47124817fe7") (:revdesc . "ae9a0c318c37") (:keywords "faces" "theme" "ember" "twilight" "dark"))]) + (ember-yasnippets . [(20160526 1658) ((yasnippet (0 8 0))) "Snippets for Ember.js development" tar ((:url . "https://github.com/ronco/ember-yasnippets.el") (:commit . "3b5bd01569646237bf1b540d097e12f9118b67f4") (:revdesc . "3b5bd0156964") (:keywords "tools" "abbrev" "languages") (:authors ("Ron White" . "ronco@costite.com")) (:maintainers ("Ron White" . "ronco@costite.com")) (:maintainer "Ron White" . "ronco@costite.com"))]) + (embrace . [(20231027 419) ((cl-lib (0 5)) (expand-region (0 10 0))) "Add/Change/Delete pairs based on `expand-region'" tar ((:url . "https://github.com/cute-jumper/embrace.el") (:commit . "c7e748603151d7d91c237fd2d9cdf56e9f3b1ea8") (:revdesc . "c7e748603151") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (emc . [(20251014 1710) ((delight (1 7)) (emacs (29 1))) "Invoking a C/C++ (et al.) build toolchain from ELisp" tar ((:url . "https://github.com/marcoxa/emc") (:commit . "f788e164056801059b5821a64909d49472d0e77e") (:revdesc . "f788e1640568") (:keywords "extensions" "c" "lisp" "building tools" "development" "deployment.") (:authors ("Marco Antoniotti" . "marcoxa[at]gmail.com")) (:maintainers ("Marco Antoniotti" . "marcoxa[at]gmail.com")) (:maintainer "Marco Antoniotti" . "marcoxa[at]gmail.com"))]) + (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 ((:url . "https://github.com/nubank/emidje") (:commit . "7e92f053964d925c97dc8cca8d4d70a3030021db") (:revdesc . "7e92f053964d") (:keywords "tools") (:authors ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainers ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainer "Alan Ghelardi" . "alan.ghelardi@nubank.com.br"))]) + (emmet-mode . [(20240617 45) nil "Unofficial Emmet's support for emacs" tar ((:url . "https://github.com/smihica/emmet-mode") (:commit . "322d3bb112fced57d63b44863357f7a0b7eee1e3") (:revdesc . "322d3bb112fc") (:keywords "convenience") (:authors ("Shin Aoyama" . "smihica@gmail.com")) (:maintainers ("Shin Aoyama" . "smihica@gmail.com")) (:maintainer "Shin Aoyama" . "smihica@gmail.com"))]) + (emms . [(20251201 1510) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:url . "https://www.gnu.org/software/emms/") (:commit . "b5a5816e2b73952413927eacc5d701d524d0d494") (:revdesc . "b5a5816e2b73") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainers ("Yoni Rabkin" . "yrk@gnu.org")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org"))]) + (emms-info-mediainfo . [(20131223 1300) ((emms (0))) "Info-method for EMMS using medianfo" tar ((:url . "https://github.com/fgallina/emms-info-mediainfo") (:commit . "bce16eae9eacd38719fea62a9755225a888da59d") (:revdesc . "bce16eae9eac") (:keywords "multimedia" "processes") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainers ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org"))]) + (emms-mark-ext . [(20130529 327) ((emms (3 0))) "Extra functions for emms-mark-mode and emms-tag-edit-mode" tar ((:url . "https://github.com/vapniks/emms-mark-ext") (:commit . "ec68129e3e9e469e5bf160c6a1b7030e322f3541") (:revdesc . "ec68129e3e9e") (:keywords "convenience" "multimedia") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (emms-mode-line-cycle . [(20160221 1120) ((emacs (24)) (emms (4 0))) "Display the emms mode line as a ticker" tar ((:url . "https://github.com/momomo5717/emms-mode-line-cycle") (:commit . "2c2f395e484a1d345050ddd61ff5fab71a92a6bc") (:revdesc . "2c2f395e484a") (:keywords "emms" "mode-line"))]) + (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 ((:url . "https://github.com/momomo5717/emms-player-mpv-jp-radios") (:commit . "f6b37f5878c741124d5fca43c5b80af873541edd") (:revdesc . "f6b37f5878c7") (:keywords "emms" "mpv" "radio"))]) + (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 ((:url . "https://github.com/momomo5717/emms-player-simple-mpv") (:commit . "101d120ccdee1c2c213fd2f0423c858b21649c00") (:revdesc . "101d120ccdee") (:keywords "emms" "mpv"))]) + (emms-player-spotify . [(20250411 619) ((emacs (26 1)) (compat (29 1)) (emms (18)) (s (1 13 0))) "Spotify player for EMMS" tar ((:url . "https://github.com/sarg/emms-spotify") (:commit . "ca80431b00738e6130b924c64dc1f2cddadcc0b8") (:revdesc . "ca80431b0073") (:authors ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainers ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainer "Sergey Trofimov" . "sarg@sarg.org.ru"))]) + (emms-soundcloud . [(20131221 1145) ((emms (20131016)) (json (1 2))) "EMMS source for Soundcloud audio sharing platform" tar ((:url . "http://github.com/osener/emms-soundcloud") (:commit . "87e5cbf9609d1f26c24dc834fdeb78b33d453c2b") (:revdesc . "87e5cbf9609d") (:keywords "emms" "soundcloud") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainers ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com"))]) + (emms-state . [(20211023 1942) ((emms (0))) "Display track description and playing time in the mode line" tar ((:url . "https://github.com/alezost/emms-state.el") (:commit . "cdb3ee85369758727b3c082e4ade1ae2b559b334") (:revdesc . "cdb3ee853697") (:keywords "emms") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (emoji-cheat-sheet-plus . [(20200202 1412) ((emacs (24)) (helm (1 6 4))) "Emoji-cheat-sheet for emacs" tar ((:url . "https://github.com/syl20bnr/emacs-emoji-cheat-sheet-plus") (:commit . "ffcc84d7060dfa000148e7f8be4fd6701593a74f") (:revdesc . "ffcc84d7060d") (:keywords "emacs" "emoji"))]) + (emoji-display . [(20140117 1013) nil "Emoji displaying module" tar ((:url . "https://github.com/ikazuhiro/emoji-display") (:commit . "bb4217f6400151a9cfa6d4524b8427f01feb5193") (:revdesc . "bb4217f64001") (:keywords "emoji") (:authors ("Kazuhiro Ito" . "kzhr@d1.dion.ne.jp")) (:maintainers ("Kazuhiro Ito" . "kzhr@d1.dion.ne.jp")) (:maintainer "Kazuhiro Ito" . "kzhr@d1.dion.ne.jp"))]) + (emoji-fontset . [(20160726 1924) nil "Set font face for Emoji" tar ((:url . "https://github.com/zonuexe/emoji-fontset.el") (:commit . "e460c9a08e48ec4103e38a7a04acae20880149a9") (:revdesc . "e460c9a08e48") (:keywords "emoji" "font" "config") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (emoji-github . [(20250101 1007) ((emacs (24 4)) (emojify (1 0)) (request (0 3 0))) "Display list of GitHub's emoji. (cheat sheet)" tar ((:url . "https://github.com/jcs-elpa/emoji-github") (:commit . "ec055ddb0c650671112fb254257f413f4755e75a") (:revdesc . "ec055ddb0c65") (:keywords "convenience" "list" "github" "emoji" "display") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (emoji-recall . [(20160723 2208) ((emacs (24))) "How many emoji can you recall from memory?" tar ((:url . "https://github.com/lujun9972/emoji-recall.el") (:commit . "1c12d18e5592eaa2138dd3034012dced277e6d99") (:revdesc . "1c12d18e5592") (:keywords "game") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (emojify . [(20210108 1111) ((seq (1 11)) (ht (2 0)) (emacs (24 3))) "Display emojis in Emacs" tar ((:url . "https://github.com/iqbalansari/emacs-emojify") (:commit . "cfa00865388809363df3f884b4dd554a5d44f835") (:revdesc . "cfa008653888") (:keywords "multimedia" "convenience") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainers ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com"))]) + (emojify-logos . [(20180814 917) ((emojify (0 4))) "Add logos to emojify" tar ((:url . "https://github.com/mxgoldstein/emojify-logos") (:commit . "a3e78bcbdf863092d4c9b026ac08bf7d1c7c0e8b") (:revdesc . "a3e78bcbdf86") (:authors ("mxgoldstein" . "m_goldstein@gmx.net")) (:maintainers ("mxgoldstein" . "m_goldstein@gmx.net")) (:maintainer "mxgoldstein" . "m_goldstein@gmx.net"))]) + (empos . [(20151011 1916) nil "Locate bibtex citations from within emacs" tar ((:url . "http://github.com/dimalik/empos/") (:commit . "7b99ad30e56937adb7e6349777e5a2045597d564") (:revdesc . "7b99ad30e569") (:keywords "citations" "reference" "bibtex" "reftex") (:authors ("Dimitris Alikaniotis" . "da352[at]cam.ac.uk")) (:maintainers ("Dimitris Alikaniotis" . "da352[at]cam.ac.uk")) (:maintainer "Dimitris Alikaniotis" . "da352[at]cam.ac.uk"))]) + (empv . [(20251214 1032) ((emacs (28 1)) (s (1 13 0)) (compat (29 1 4 4))) "A multimedia player/manager, YouTube interface" tar ((:url . "https://github.com/isamert/empv.el") (:commit . "7ef178763d3d3044fd030368d66e15a0bbeed160") (:revdesc . "7ef178763d3d") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com"))]) + (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 ((:url . "https://github.com/Wilfred/emacs-refactor") (:commit . "cac1b52932926f56d7f6d2923732d20bbd20670d") (:revdesc . "cac1b5293292") (:keywords "tools" "convenience" "refactoring") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainers ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))]) + (enclose . [(20121008 1614) nil "Enclose cursor within punctuation pairs" tar ((:url . "http://github.com/rejeep/enclose") (:commit . "2fff3d4fcc1089f87647042d7164ba04282766ae") (:revdesc . "2fff3d4fcc10") (:keywords "speed" "convenience") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (encourage-mode . [(20151128 905) ((emacs (24 4))) "Encourages you in your work. :D" tar ((:url . "https://github.com/halbtuerke/encourage-mode.el") (:commit . "ca411e6bfd3d0edffe95852127bd995730b942e3") (:revdesc . "ca411e6bfd3d") (:keywords "fun") (:authors ("Patrick Mosby" . "patrick@schreiblogade.de")) (:maintainers ("Patrick Mosby" . "patrick@schreiblogade.de")) (:maintainer "Patrick Mosby" . "patrick@schreiblogade.de"))]) + (encrypt-region . [(20220802 918) ((emacs (26 1))) "Encrypts and decrypts regions" tar ((:url . "https://github.com/cgshep/encrypt-region") (:commit . "8ff5704bc6f4c57f935a8b7680129e599bbe474f") (:revdesc . "8ff5704bc6f4") (:keywords "tools" "convenience") (:authors ("Carlton Shepherd" . "carlton@linux.com")) (:maintainers ("Carlton Shepherd" . "carlton@linux.com")) (:maintainer "Carlton Shepherd" . "carlton@linux.com"))]) + (engine-mode . [(20240906 453) ((emacs (24 4))) "Define and query search engines" tar ((:url . "https://github.com/hrs/engine-mode") (:commit . "1cfdaef7e019aecc1b648036c3434c99d6d308bc") (:revdesc . "1cfdaef7e019") (:authors ("Robin Schwartz" . "hello@robinschwartz.me")) (:maintainers ("Robin Schwartz" . "hello@robinschwartz.me")) (:maintainer "Robin Schwartz" . "hello@robinschwartz.me"))]) + (enh-ruby-mode . [(20251001 2056) ((emacs (25 1))) "Major mode for editing Ruby files" tar ((:url . "https://github.com/zenspider/Enhanced-Ruby-Mode") (:commit . "cec9ea862ef196113ef19b16e347a522bc8fdd88") (:revdesc . "cec9ea862ef1") (:keywords "languages" "elisp" "ruby"))]) + (enhanced-evil-paredit . [(20251016 1351) ((emacs (24 1)) (evil (1 0 9)) (paredit (25 -2))) "Paredit support for evil keybindings" tar ((:url . "https://github.com/jamescherti/enhanced-evil-paredit.el") (:commit . "58f607ded07383cd6db5a6a39cc0f76dea61c4f7") (:revdesc . "58f607ded073") (:keywords "convenience"))]) + (enlight . [(20240602 2025) ((emacs (27 1)) (compat (29 1 4 1))) "Highly customizable startup screen" tar ((:url . "https://github.com/ichernyshovvv/enlight") (:commit . "5194c1a4f4c245a1ef544205d723381fac30414b") (:revdesc . "5194c1a4f4c2") (:keywords "startup" "screen" "tools" "dashboard") (:authors ("Ilya Chernyshov" . "ichernyshovvv@gmail.com")) (:maintainers ("Ilya Chernyshov" . "ichernyshovvv@gmail.com")) (:maintainer "Ilya Chernyshov" . "ichernyshovvv@gmail.com"))]) + (enlightened-theme . [(20210220 2327) nil "A theme based on enlightened" tar ((:url . "https://hg.sr.ht/~slondr/enlightened") (:commit . "1bfebd8f47e8a8357c9e557cf6e95d7027861e6d") (:revdesc . "1bfebd8f47e8"))]) + (enlive . [(20170725 1417) nil "Query html document with css selectors" tar ((:url . "http://github.com/zweifisch/enlive") (:commit . "604a8ca272b6889f114e2b5a13adb5b1dc4bae86") (:revdesc . "604a8ca272b6") (:keywords "css" "selector" "query") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com"))]) + (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 ((:url . "http://github.com/enoson/eno.el") (:commit . "c5c6193687c0bede1ddf507c430cf8b0a6d272d9") (:revdesc . "c5c6193687c0") (:authors (nil . "e.enoson@gmail.com")) (:maintainers (nil . "e.enoson@gmail.com")) (:maintainer nil . "e.enoson@gmail.com"))]) + (enotify . [(20130407 1348) nil "A networked notification system for emacs" tar ((:url . "https://github.com/laynor/enotify") (:commit . "7fd2f48ef4ff32c8f013c634ea2dd6b1d1409f80") (:revdesc . "7fd2f48ef4ff") (:keywords "tools") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainers ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))]) + (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 ((:url . "https://github.com/cfclrk/environ") (:commit . "9530e2f1ead5bd37aca4d298514800f73b3cc0a7") (:revdesc . "9530e2f1ead5") (:keywords "tools") (:authors ("Chris Clark" . "cfclrk@gmail.com")) (:maintainers ("Chris Clark" . "cfclrk@gmail.com")) (:maintainer "Chris Clark" . "cfclrk@gmail.com"))]) + (envrc . [(20250917 915) ((emacs (27 1)) (inheritenv (0 1)) (seq (2 24))) "Support for `direnv' that operates buffer-locally" tar ((:url . "https://github.com/purcell/envrc") (:commit . "de1ae6e538764f74659f358b04af0d84fa0fef42") (:revdesc . "de1ae6e53876") (:keywords "processes" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (eopengrok . [(20230114 1413) ((s (1 9 0)) (dash (2 10 0)) (magit (2 1 0)) (cl-lib (0 5))) "Opengrok interface for emacs" tar ((:url . "https://github.com/youngker/eopengrok.el") (:commit . "83b1695774f8bdc322e528ade9dffe9b2e93f32a") (:revdesc . "83b1695774f8") (:keywords "tools") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainers ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com"))]) + (epc . [(20140610 534) ((concurrent (0 3 1)) (ctable (0 1 2))) "A RPC stack for the Emacs Lisp" tar ((:url . "https://github.com/kiwanami/emacs-epc") (:commit . "94cd36a3bec752263ac9b1b3a9dd2def329d2af7") (:revdesc . "94cd36a3bec7") (:keywords "lisp" "rpc") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatkiwanami.net"))]) + (epic . [(20170210 23) ((htmlize (1 47))) "Evernote Picker for Cocoa Emacs" tar ((:url . "https://github.com/yoshinari-nomura/epic") (:commit . "a41826c330eb0ea061d58a08cc861b0c4ac8ec4e") (:revdesc . "a41826c330eb") (:keywords "evernote" "applescript") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net"))]) + (eping . [(20201027 2149) ((emacs (25 1))) "Ping websites to check internet connectivity" tar ((:url . "https://github.com/sean-hut/eping") (:commit . "004496ee06c0b8ead4a4f49e17109e8eb32eb49d") (:revdesc . "004496ee06c0") (:keywords "comm" "processes" "terminals" "unix") (:authors ("Sean Hutchings" . "seanhut@yandex.com")) (:maintainers ("Sean Hutchings" . "seanhut@yandex.com")) (:maintainer "Sean Hutchings" . "seanhut@yandex.com"))]) + (epkg . [(20251108 1325) ((emacs (28 1)) (compat (30 1)) (closql (2 3)) (emacsql (4 3)) (llama (1 0))) "Browse the Emacsmirror package database" tar ((:url . "https://github.com/emacscollective/epkg") (:commit . "a4c8dc4e760ff9d0079e25fa9000b06791ed009b") (:revdesc . "a4c8dc4e760f") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.epkg@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.epkg@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.epkg@jonas.bernoulli.dev"))]) + (epkg-marginalia . [(20251101 2117) ((emacs (28 1)) (compat (30 1)) (epkg (4 1)) (marginalia (2 4))) "Show Epkg information in completion annotations" tar ((:url . "https://github.com/emacscollective/epkg-marginalia") (:commit . "681295f585efdc3f615ba4be90a246eb46ef4018") (:revdesc . "681295f585ef") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.epkg-marginalia@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.epkg-marginalia@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.epkg-marginalia@jonas.bernoulli.dev"))]) + (epl . [(20180205 2049) ((cl-lib (0 3))) "Emacs Package Library" tar ((:url . "http://github.com/cask/epl") (:commit . "78ab7a85c08222cd15582a298a364774e3282ce6") (:revdesc . "78ab7a85c082") (:keywords "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (eplotly . [(20251221 1257) ((emacs (26 1)) (jack (1 0)) (f (0 21 0))) "Create Plotly charts" tar ((:url . "https://codeberg.org/GioBo/eplotly") (:commit . "7f36d03d7d3226da05c4e60a692f9a1055d92212") (:revdesc . "7f36d03d7d32") (:keywords "tools") (:maintainers ("GioBo" . "boccigionata@gmail.com")) (:maintainer "GioBo" . "boccigionata@gmail.com"))]) + (epm . [(20190509 443) ((emacs (24 3)) (epl (0 8))) "Emacs Package Manager" tar ((:url . "https://github.com/xuchunyang/epm") (:commit . "6375ddbf93c5f25647f6ebb25b54045b3c93a5be") (:revdesc . "6375ddbf93c5") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com"))]) + (epresent . [(20160411 201) ((org (8)) (cl-lib (0 5))) "Simple presentation mode for Emacs Org-mode" tar ((:url . "https://github.com/dakrone/epresent") (:commit . "bc3443879bb0111dcde2abd2f9c578e2cd438186") (:revdesc . "bc3443879bb0") (:keywords "gui"))]) + (eproject . [(20180312 1642) ((helm (1 6 4))) "Assign files to projects, programatically" tar ((:url . "https://github.com/jrockway/eproject") (:commit . "068218d2cf2138cb2e8fc29b57e773a0097a7e8b") (:revdesc . "068218d2cf21") (:keywords "programming" "projects") (:authors ("Jonathan Rockway" . "jon@jrock.us")) (:maintainers ("Jonathan Rockway" . "jon@jrock.us")) (:maintainer "Jonathan Rockway" . "jon@jrock.us"))]) + (eprolog . [(20250826 238) ((emacs (27 2))) "Native Prolog engine implementation" tar ((:url . "https://github.com/tani/eprolog") (:commit . "69e34857d0434fdae6ac19d2ad0ce0d030259bb9") (:revdesc . "69e34857d043") (:keywords "languages" "prolog" "logic programming"))]) + (epx . [(20250607 1427) ((emacs (29 1))) "Manage and run project-specific shell commands" tar ((:url . "https://git.sr.ht/~alex-iam/epx") (:commit . "91d7b924981f3a8f300ae7f420972022faed4b99") (:revdesc . "91d7b924981f") (:keywords "project" "shell" "tools") (:authors ("Oleksandr Korzh" . "alex@korzh.me")) (:maintainers ("Oleksandr Korzh" . "alex@korzh.me")) (:maintainer "Oleksandr Korzh" . "alex@korzh.me"))]) + (equake . [(20251208 2019) ((emacs (26 1)) (dash (2 14 1))) "Drop-down console for (e)shell & terminal emulation" tar ((:url . "https://github.com/emacsomancer/equake") (:commit . "60e9cbfae7a79e14a8e95da1148122c05500eb20") (:revdesc . "60e9cbfae7a7") (:keywords "convenience" "frames" "terminals" "tools" "window-system") (:authors ("Benjamin Slade" . "slade@lambda-y.net")) (:maintainers ("Benjamin Slade" . "slade@lambda-y.net")) (:maintainer "Benjamin Slade" . "slade@lambda-y.net"))]) + (eradio . [(20210327 1000) ((emacs (24 1))) "A simple Internet radio player" tar ((:url . "https://github.com/fossegrim/eradio") (:commit . "47769986c79def84307921f0277e9bb2714756c2") (:revdesc . "47769986c79d") (:authors ("Olav Fosse" . "mail@olavfosse.no")) (:maintainers ("Olav Fosse" . "mail@olavfosse.no")) (:maintainer "Olav Fosse" . "mail@olavfosse.no"))]) + (erblint . [(20200622 5) ((emacs (24))) "An interface for checking HTML ERB files using Erblint" tar ((:url . "https://github.com/leodcs/erblint-emacs") (:commit . "43706afb09ec8de91651a832b703c81ced10ec4e") (:revdesc . "43706afb09ec") (:keywords "project" "convenience"))]) + (erc-colorize . [(20241205 1612) nil "Per user colorization of whole message" tar ((:url . "https://github.com/thisirs/erc-colorize.git") (:commit . "998a37e950dc2ad026bdd192b37889f65d4e858e") (:revdesc . "998a37e950dc") (:keywords "erc" "convenience") (:authors ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainers ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainer "Sylvain Rousseau" . "thisirsatgmaildotcom"))]) + (erc-crypt . [(20251128 1224) ((cl-lib (0 5))) "Symmetric Encryption for ERC" tar ((:url . "https://github.com/atomontage/erc-crypt") (:commit . "fc7eb4896310cc274ab7d035a1daf6a2a608a1e1") (:revdesc . "fc7eb4896310") (:keywords "comm") (:authors ("xristos" . "xristos@sdf.org")) (:maintainers ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org"))]) + (erc-hl-nicks . [(20240615 2058) nil "ERC nick highlighter that ignores uniquifying chars when colorizing" tar ((:url . "http://www.github.com/leathekd/erc-hl-nicks") (:commit . "fd2759bde20c25226a332c3d19aed6c7f135bf10") (:revdesc . "fd2759bde20c") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainers ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com"))]) + (erc-image . [(20210604 753) nil "Show received image urls in the ERC buffer" tar ((:url . "https://github.com/kidd/erc-image.el") (:commit . "883084f0801d46a5ccf183e51ae9a734755bbb97") (:revdesc . "883084f0801d") (:keywords "multimedia") (:authors ("Jon de Andrés Frías" . "jondeandres@gmail.com") ("Raimon Grau Cuscó" . "raimonster@gmail.com")) (:maintainers ("Jon de Andrés Frías" . "jondeandres@gmail.com") ("Raimon Grau Cuscó" . "raimonster@gmail.com")) (:maintainer "Jon de Andrés Frías" . "jondeandres@gmail.com"))]) + (erc-matterircd . [(20210804 504) ((emacs (27 1))) "Integrate matterircd with ERC" tar ((:url . "https://github.com/alexmurray/erc-matterircd") (:commit . "e3a59267c044474f9ca066d36517e9a3d872759c") (:revdesc . "e3a59267c044") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (erc-scrolltoplace . [(20180608 606) ((emacs (24 0)) (switch-buffer-functions (0 0 1))) "An Erc module to scrolltobottom better with keep-place" tar ((:url . "http://gitlab.com/jgkamat/erc-scrolltoplace") (:commit . "feb0fbf1fd4bdf220ae2d31ea7c066d8e62089f9") (:revdesc . "feb0fbf1fd4b") (:keywords "erc" "module" "comm" "scrolltobottom" "keep-place") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainers ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com"))]) + (erc-social-graph . [(20150508 1204) nil "A social network graph module for ERC" tar ((:url . "https://github.com/vibhavp/erc-social-graph") (:commit . "e6ef3416a1c5064054bf054d9f0c1c7bf54a9cd0") (:revdesc . "e6ef3416a1c5") (:keywords "erc" "graph") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainers ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com"))]) + (erc-terminal-notifier . [(20140115 1024) nil "OSX notifications via the terminal-notifier gem for Emacs ERC" tar ((:url . "http://github.com/julienXX/") (:commit . "a3dacb935845e4a20031212bbd82b2170f68d2a8") (:revdesc . "a3dacb935845") (:keywords "erc" "terminal-notifier" "nick") (:authors ("Julien Blanchard" . "julien@sideburns.eu")) (:maintainers ("Julien Blanchard" . "julien@sideburns.eu")) (:maintainer "Julien Blanchard" . "julien@sideburns.eu"))]) + (erc-track-score . [(20130328 1215) nil "Add score support to tracked channel buffers" tar ((:url . "http://julien.danjou.info/erc-track-score.html") (:commit . "5b27531ea6b1a4c4b703b270dfa9128cb5bfdaa3") (:revdesc . "5b27531ea6b1") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainers ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info"))]) + (erc-tweet . [(20150920 1258) nil "Shows text of a tweet when an url is posted in erc buffers" tar ((:url . "https://github.com/kidd/erc-tweet.el") (:commit . "91fed61e139fa788d66a7358f0d50acc896414b8") (:revdesc . "91fed61e139f") (:keywords "extensions") (:authors ("Raimon Grau" . "raimonster@gmail.com")) (:maintainers ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com"))]) + (erc-twitch . [(20170427 606) ((json (1 3)) (erc (5 0))) "Support for Twitch emotes for ERC" tar ((:url . "https://github.com/vibhavp/erc-twitch") (:commit . "53c6af0cb72e56d897d30a40e7e5066668d6b5ec") (:revdesc . "53c6af0cb72e") (:keywords "twitch" "erc" "emotes") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainers ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com"))]) + (erc-view-log . [(20140227 2039) nil "Major mode for viewing ERC logs" tar ((:url . "http://github.com/Niluge-KiWi/erc-view-log/raw/master/erc-view-log.el") (:commit . "c5a25f0cbca84ed2e4f72068c02b66bd0ea3b266") (:revdesc . "c5a25f0cbca8") (:keywords "erc" "viewer" "logs" "colors") (:authors ("Thomas Riccardi" . "riccardi.thomas@gmail.com")) (:maintainers ("Thomas Riccardi" . "riccardi.thomas@gmail.com")) (:maintainer "Thomas Riccardi" . "riccardi.thomas@gmail.com"))]) + (erc-yank . [(20210220 1815) nil "Automagically create a Gist if pasting more than 5 lines" tar ((:url . "https://github.com/jwiegley/erc-yank") (:commit . "55d96f18c5df9d8fce51fa073d7a12c47a46ac80") (:revdesc . "55d96f18c5df") (:keywords "comm" "erc" "chat" "irc" "yank" "gist") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com"))]) + (erc-youtube . [(20150603 2136) nil "Show info about a YouTube URL in an ERC buffer" tar ((:url . "https://github.com/kidd/erc-youtube.el") (:commit . "97054ba8475b442e2aa81e5a291f668b7f28697f") (:revdesc . "97054ba8475b") (:keywords "multimedia") (:authors ("Raimon Grau Cuscó" . "raimonster@gmail.com")) (:maintainers ("Raimon Grau Cuscó" . "raimonster@gmail.com")) (:maintainer "Raimon Grau Cuscó" . "raimonster@gmail.com"))]) + (erc-yt . [(20150426 1249) ((dash (2 10 0))) "An erc module to display youtube links nicely" tar ((:url . "https://github.com/yhvh/erc-yt") (:commit . "43e7d49325b17a3217a6ffb4a9daf75c5ff4e6f8") (:revdesc . "43e7d49325b1") (:keywords "multimedia") (:authors ("William Stevenson" . "yhvh2000@gmail.com")) (:maintainers ("William Stevenson" . "yhvh2000@gmail.com")) (:maintainer "William Stevenson" . "yhvh2000@gmail.com"))]) + (ercn . [(20250317 2338) ((dash (0))) "Flexible ERC notifications" tar ((:url . "http://www.github.com/leathekd/ercn") (:commit . "ac063a64b9e04e4f74ba22b95275cec3bd9dfce1") (:revdesc . "ac063a64b9e0") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainers ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com"))]) + (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 ((:url . "https://github.com/bddean/emacs-ereader") (:commit . "f3bbd3f13195f8fba3e3c880aab0e4c60430dcf3") (:revdesc . "f3bbd3f13195") (:keywords "epub" "ebook") (:authors ("Ben Dean" . "bendean837@gmail.com")) (:maintainers ("Ben Dean" . "bendean837@gmail.com")) (:maintainer "Ben Dean" . "bendean837@gmail.com"))]) + (eredis . [(20181119 131) ((dash (0))) "Eredis, a Redis client in emacs lisp" tar ((:url . "http://github.com/justinhj/eredis/") (:commit . "cfbfc25832f6fbc507bdd56b02e3a0b851a3c368") (:revdesc . "cfbfc25832f6") (:keywords "redis" "api" "tools" "org") (:authors ("Justin Heyes-Jones" . "justinhj@gmail.com")) (:maintainers ("Justin Heyes-Jones" . "justinhj@gmail.com")) (:maintainer "Justin Heyes-Jones" . "justinhj@gmail.com"))]) + (erefactor . [(20200513 1252) ((cl-lib (0 3))) "Emacs-Lisp refactoring utilities" tar ((:url . "https://github.com/mhayashi1120/Emacs-erefactor") (:commit . "bfe27a1b8c7cac0fe054e76113e941efa3775fe8") (:revdesc . "bfe27a1b8c7c") (:keywords "extensions" "tools" "maint") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (ergoemacs-mode . [(20240809 2246) ((emacs (24 1)) (cl-lib (0 5)) (nadvice (0 4))) "Emacs mode based on common modern interface and ergonomics" tar ((:url . "https://github.com/ergoemacs/ergoemacs-mode") (:commit . "3c9081fe83f70cf791abc98d6b9184f8ea7fb714") (:revdesc . "3c9081fe83f7") (:keywords "convenience") (:authors ("Xah Lee" . "xah@xahlee.org") ("David Capello" . "davidcapello@gmail.com") ("Matthew L. Fidler" . "matthew.fidler@gmail.com") ("Kim F. Storm -- CUA approach for C-x and C-c" . "storm@cua.dk")) (:maintainers ("Matthew L. Fidler" . "matthew.fidler@gmail.com")) (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com"))]) + (ergoemacs-status . [(20160318 538) ((powerline (2 3)) (mode-icons (0 1 0))) "Adaptive Status Bar / Mode Line" tar ((:url . "https://github.com/ergoemacs/ergoemacs-status") (:commit . "d952cc2361adf6eb4d6af60950ad4ab699c81320") (:revdesc . "d952cc2361ad"))]) + (eri . [(20250328 1043) nil "Enhanced relative indentation (eri)" tar ((:url . "https://github.com/agda/agda") (:commit . "ad8ea74ccefd3507006a7ea9a7d9ff5b7a973603") (:revdesc . "ad8ea74ccefd"))]) + (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 ((:url . "http://github.com/positron-solutions/elisp-repo-kit") (:commit . "0d9906415a649caff2df7b4b1b3f8f6cc337032a") (:revdesc . "0d9906415a64") (:keywords "convenience" "programming") (:authors ("Positron Solutions" . "contact@positron.solutions")) (:maintainers ("Positron Solutions" . "contact@positron.solutions")) (:maintainer "Positron Solutions" . "contact@positron.solutions"))]) + (erlang . [(20250827 800) ((emacs (24 3))) "Major modes for editing and running Erlang" tar ((:url . "https://github.com/erlang/otp") (:commit . "ed8445a63861f510d21e27c9122e4fafa8039d9d") (:revdesc . "ed8445a63861") (:keywords "erlang" "languages" "processes"))]) + (erlang-ts . [(20251107 814) ((emacs (29 2)) (erlang (27 2))) "Major modes for editing Erlang" tar ((:url . "https://github.com/erlang/emacs-erlang-ts") (:commit . "959907d26d32f7d23bdcbb6f9d06ccb2a5db54c3") (:revdesc . "959907d26d32") (:keywords "erlang" "languages" "treesitter"))]) + (erlstack-mode . [(20230608 909) ((emacs (25 1)) (dash (2 12 0))) "Minor mode for analysing Erlang stacktraces" tar ((:url . "https://github.com/k32/erlstack-mode") (:commit . "51e3cd10a2fe77eb8eb60643aba6f8178374b069") (:revdesc . "51e3cd10a2fe") (:keywords "tools" "erlang"))]) + (eros . [(20251226 345) ((emacs (24 4))) "Evaluation Result OverlayS for Emacs Lisp" tar ((:url . "https://github.com/xiongtx/eros") (:commit . "66ee90baa3162fea028f5101ddcc370f7d1d4fcf") (:revdesc . "66ee90baa316") (:keywords "convenience" "lisp") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainers ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com"))]) + (eros-inspector . [(20240923 613) ((emacs (24 4)) (eros (0 1 0)) (inspector (0 38))) "Glue between eros and inspector" tar ((:url . "https://github.com/port19x/eros-inspector") (:commit . "c1625f553ec944883867f0975bff08f10dd3086f") (:revdesc . "c1625f553ec9") (:keywords "convenience" "lisp" "tool" "debugging" "development") (:authors ("port19" . "port19@port19.xyz")) (:maintainers ("port19" . "port19@port19.xyz")) (:maintainer "port19" . "port19@port19.xyz"))]) + (ert-async . [(20200105 1031) ((emacs (24 1))) "Async support for ERT" tar ((:url . "http://github.com/rejeep/ert-async.el") (:commit . "948cf2faa10e085bda3739034ca5ea1912893433") (:revdesc . "948cf2faa10e") (:keywords "lisp" "test") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (ert-expectations . [(20121009 734) nil "The simplest unit test framework in the world" tar ((:url . "http://www.emacswiki.org/emacs/download/ert-expectations.el") (:commit . "aed70e002c4305b66aed7f6d0d48e9addd2dc1e6") (:revdesc . "aed70e002c43") (:keywords "test" "unittest" "ert" "expectations") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (ert-junit . [(20190802 2232) ((ert (0)) (emacs (23 4))) "JUnit XML reports from ert results" tar ((:url . "http://bitbucket.org/olanilsson/ert-junit") (:commit . "65f91c35b088b87943dbbbe7e1ce354bc9bc0992") (:revdesc . "65f91c35b088") (:keywords "tools" "test" "unittest" "ert") (:authors ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainers ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com"))]) + (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 ((:url . "https://github.com/chrisbarrett/ert-modeline") (:commit . "7c6340834387f749519616f9601821cb73fd657b") (:revdesc . "7c6340834387") (:keywords "tools" "tests" "convenience") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainers ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))]) + (ert-results . [(20240108 1358) ((emacs (24 1))) "Filter ERT test results display" tar ((:url . "https://github.com/rswgnu/ert-results") (:commit . "32200a195f68c25a013497329d85ae0703ab475d") (:revdesc . "32200a195f68") (:keywords "lisp" "maint" "tools") (:authors ("Robert Weiner" . "rsw@gnu.org")) (:maintainers ("Robert Weiner" . "rsw@gnu.org")) (:maintainer "Robert Weiner" . "rsw@gnu.org"))]) + (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 ((:url . "http://github.com/rejeep/ert-runner.el") (:commit . "98a5a6f683663f9f0357459d75ce1dc36c987e4a") (:revdesc . "98a5a6f68366") (:keywords "test") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (es-lib . [(20141111 1830) ((cl-lib (0 3))) "A collection of emacs utilities" tar ((:url . "https://github.com/sabof/es-lib") (:commit . "753b27363e39c10edc9e4e452bdbbbe4d190df4a") (:revdesc . "753b27363e39"))]) + (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 ((:url . "http://www.github.com/dakrone/es-mode") (:commit . "e82465fd785688bb58918ea62ca4de06a2a23a1e") (:revdesc . "e82465fd7856") (:keywords "elasticsearch") (:authors ("Lee Hinman" . "lee@writequit.org")) (:maintainers ("Lee Hinman" . "lee@writequit.org")) (:maintainer "Lee Hinman" . "lee@writequit.org"))]) + (es-windows . [(20140211 904) ((cl-lib (0 3)) (emacs (24))) "Window-management utilities" tar ((:url . "https://github.com/sabof/es-windows") (:commit . "7ebe6c6e0831373847d7adbedeaa2e506b54b2af") (:revdesc . "7ebe6c6e0831"))]) + (esa . [(20180403 1525) ((cl-lib (0 5))) "Interface to esa.io" tar ((:url . "https://github.com/nabinno/esa.el") (:commit . "417e0ac55abe9b17e0b7165d0df26bc018aff42e") (:revdesc . "417e0ac55abe") (:keywords "tools" "esa") (:authors ("Nab Inno" . "nab@blahfe.com")) (:maintainers ("Nab Inno" . "nab@blahfe.com")) (:maintainer "Nab Inno" . "nab@blahfe.com"))]) + (esb . [(20251208 653) ((emacs (27 1))) "Emacs Simple Bookmark" tar ((:url . "https://github.com/0xhenrique/esb") (:commit . "3646ddab71ede860257182a7e772aad476533d39") (:revdesc . "3646ddab71ed") (:authors ("Henrique Marques" . "hm2030master@proton.me")) (:maintainers ("Henrique Marques" . "hm2030master@proton.me")) (:maintainer "Henrique Marques" . "hm2030master@proton.me"))]) + (esh-autosuggest . [(20241002 1820) ((emacs (24 4)) (company (0 9 4))) "History autosuggestions for eshell" tar ((:url . "http://github.com/dieggsy/esh-autosuggest") (:commit . "b3ae8eb2d6f8da1dc59f61a589003d741514d6f6") (:revdesc . "b3ae8eb2d6f8") (:keywords "completion" "company" "matching" "convenience" "abbrev") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainers ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me"))]) + (esh-buf-stack . [(20140107 1018) nil "Add a buffer stack feature to Eshell" tar ((:url . "https://github.com/tom-tan/esh-buf-stack") (:commit . "ea5da9ce8566ffe2e013f0e588701cb0825258b6") (:revdesc . "ea5da9ce8566") (:keywords "eshell" "extensions") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com"))]) + (esh-help . [(20190905 22) ((dash (1 4 0))) "Add some help functions and support for Eshell" tar ((:url . "https://github.com/tom-tan/esh-help/") (:commit . "417673ed18a983930a66a6692dbfb288a995cb80") (:revdesc . "417673ed18a9") (:keywords "eshell" "extensions") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com"))]) + (eshell-atuin . [(20250301 833) ((emacs (27 1)) (compat (29 1 4 1))) "Integrate eshell with atuin, a shell history tool" tar ((:url . "https://github.com/SqrtMinusOne/eshell-atuin") (:commit . "1ac4895529546839985c7f57c9858644f7be1e6a") (:revdesc . "1ac489552954") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (eshell-autojump . [(20201117 235) nil "Autojump command for Eshell" tar ((:url . "http://github.com/coldnew/eshell-autojump") (:commit . "c1056bfc6b46646ae1e606247689fef9aee621af") (:revdesc . "c1056bfc6b46") (:maintainers ("Lee" . "coldnew.tw@gmail.com")) (:maintainer "Lee" . "coldnew.tw@gmail.com"))]) + (eshell-bookmark . [(20170922 1514) ((emacs (24 3))) "Integrate bookmarks with eshell" tar ((:url . "https://github.com/Fuco1/eshell-bookmark") (:commit . "deda4b848b2fb979dbe73ead2cb866610e3596ed") (:revdesc . "deda4b848b2f") (:keywords "convenience" "files") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (eshell-command-not-found . [(20240708 512) ((emacs (25 1))) "Integrate command-not-found in eshell" tar ((:url . "https://github.com/jaeyeom/eshell-command-not-found") (:commit . "28427f0ca266fd75890ceafdd96997b5507e1bc4") (:revdesc . "28427f0ca266") (:keywords "convenience") (:authors ("Jaehyun Yeom" . "jae.yeom@gmail.com")) (:maintainers ("Jaehyun Yeom" . "jae.yeom@gmail.com")) (:maintainer "Jaehyun Yeom" . "jae.yeom@gmail.com"))]) + (eshell-did-you-mean . [(20211104 237) ((emacs (24 1)) (cl-lib (0 5))) "Command not found (\"did you mean…\" feature) in Eshell" tar ((:url . "https://github.com/xuchunyang/eshell-did-you-mean") (:commit . "80cd8c4b186a2fb29621cf634bcf2bcd914f1e3d") (:revdesc . "80cd8c4b186a") (:keywords "eshell") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com"))]) + (eshell-fixed-prompt . [(20250414 914) ((emacs (25)) (s (1 11 0))) "Restrict eshell to a single fixed prompt" tar ((:url . "https://github.com/mallt/eshell-fixed-prompt-mode") (:commit . "f495a7bdf0f5da87e9eb3021862aa8e2ec578948") (:revdesc . "f495a7bdf0f5") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainers ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) + (eshell-fringe-status . [(20170117 2316) nil "Show last status in fringe" tar ((:url . "http://projects.ryuslash.org/eshell-fringe-status/") (:commit . "adc6997c68e39c0d52a2af1b2fd5cf2057783797") (:revdesc . "adc6997c68e3") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org"))]) + (eshell-git-prompt . [(20220830 2000) ((emacs (24 1)) (cl-lib (0 5)) (dash (2 11 0))) "Some Eshell prompt for Git users" tar ((:url . "https://github.com/xuchunyang/eshell-git-prompt") (:commit . "dfcf9cd93add6763e2c46603b0323274d4c22906") (:revdesc . "dfcf9cd93add") (:keywords "eshell" "git") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (eshell-info-banner . [(20220728 1006) ((emacs (25 1)) (s (1))) "System information as your Eshell banner" tar ((:url . "https://github.com/Phundrak/eshell-info-banner.el") (:commit . "987e69a66276ca057798896c606e5c5d5fb9ee5c") (:revdesc . "987e69a66276") (:authors ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainers ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com"))]) + (eshell-outline . [(20201121 620) ((emacs (25 1))) "Enhanced outline-mode for Eshell" tar ((:url . "https://git.jamzattack.xyz/eshell-outline") (:commit . "6f917afa5b3d36764d76d7864589094647d8c3b4") (:revdesc . "6f917afa5b3d") (:keywords "unix" "eshell" "outline" "convenience") (:authors ("Jamie Beardslee" . "jdb@jamzattack.xyz")) (:maintainers ("Jamie Beardslee" . "jdb@jamzattack.xyz")) (:maintainer "Jamie Beardslee" . "jdb@jamzattack.xyz"))]) + (eshell-prompt-extras . [(20231019 1405) ((emacs (25))) "Display extra information for your eshell prompt" tar ((:url . "https://github.com/zwild/eshell-prompt-extras") (:commit . "14eabe593e110ed6937ac3b95f7979263d716a26") (:revdesc . "14eabe593e11") (:keywords "eshell" "prompt") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainers ("Xu Chunyang" . "xuchunyang56@gmail.com")) (:maintainer "Xu Chunyang" . "xuchunyang56@gmail.com"))]) + (eshell-syntax-highlighting . [(20241222 2030) ((emacs (25 1))) "Highlight eshell commands" tar ((:url . "https://github.com/akreisher/eshell-syntax-highlighting") (:commit . "62418fd8b2380114a3f6dad699c1ba45329db1d2") (:revdesc . "62418fd8b238") (:keywords "convenience") (:authors ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainers ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainer "Alex Kreisher" . "akreisher18@gmail.com"))]) + (eshell-toggle . [(20250513 1742) ((emacs (25 1)) (dash (2 11 0))) "Show/hide eshell under active window" tar ((:url . "https://github.com/4da/eshell-toggle") (:commit . "04e501e02c475bd9067eebcf8807c951f2316194") (:revdesc . "04e501e02c47") (:keywords "processes") (:authors ("Dmitry Cherkassov" . "dcherkassov@gmail.com")) (:maintainers ("Dmitry Cherkassov" . "dcherkassov@gmail.com")) (:maintainer "Dmitry Cherkassov" . "dcherkassov@gmail.com"))]) + (eshell-up . [(20240226 1747) ((emacs (24))) "Quickly go to a specific parent directory in eshell" tar ((:url . "https://github.com/peterwvj/eshell-up") (:commit . "1999afaa509204b780db44e99ac9648fe7d92d32") (:revdesc . "1999afaa5092") (:keywords "eshell") (: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"))]) + (eshell-vterm . [(20240305 1149) ((emacs (27 1)) (vterm (0 0 1))) "Vterm for visual commands in eshell" tar ((:url . "https://github.com/iostapyshyn/eshell-vterm") (:commit . "20f4b246fa605a1533cdfbe3cb7faf31a24e3d2e") (:revdesc . "20f4b246fa60") (:keywords "eshell" "vterm" "terminals" "shell" "visual" "tools" "processes") (:authors ("Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com")) (:maintainers ("Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com")) (:maintainer "Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com"))]) + (eshell-z . [(20191116 333) ((cl-lib (0 5))) "Cd to frequent directory in eshell" tar ((:url . "https://github.com/xuchunyang/eshell-z") (:commit . "337cb241e17bd472bd3677ff166a0800f684213c") (:revdesc . "337cb241e17b") (:keywords "convenience") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (eslint-disable-rule . [(20230904 1821) ((emacs (27 2))) "Commands to add JS comments disabling eslint rules" tar ((:url . "https://github.com/DamienCassou/eslint-disable-rule") (:commit . "54771405e09e2cf5cb8f47aab2818e77d3046f53") (:revdesc . "54771405e09e"))]) + (eslint-fix . [(20211005 221) nil "Fix JavaScript files using ESLint" tar ((:url . "https://github.com/codesuki/eslint-fix") (:commit . "636bf8d8797bdd58f1b543c9d3f4910e3ce879ab") (:revdesc . "636bf8d8797b") (:keywords "tools" "javascript" "eslint" "lint" "formatting" "style") (:authors ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainers ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainer "Neri Marschik" . "marschik_neri@cyberagent.co.jp"))]) + (eslint-rc . [(20220328 800) ((emacs (24 3)) (eslint-fix (0 1 0))) "Use local rc rules with ESLint" tar ((:url . "https://github.com/jjuliano/eslint-rc-emacs") (:commit . "eb6f3e715792952bc957d5dc8ab1a607f3dbbd55") (:revdesc . "eb6f3e715792") (:keywords "convenience" "edit" "js" "ts" "rc" "eslintrc" "eslint-rc" "eslint" "eslint-fix") (:authors ("Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom")) (:maintainers ("Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom")) (:maintainer "Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom"))]) + (eslintd-fix . [(20240224 1517) ((dash (2 12 0)) (emacs (26 3))) "Use eslint_d to automatically fix js files" tar ((:url . "https://github.com/aaronjensen/eslintd-fix") (:commit . "99665b66686cc5974499cec4aff1e29faef1c028") (:revdesc . "99665b66686c") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com"))]) + (esmond-theme . [(20230526 124) nil "Esmond dark theme" tar ((:url . "https://github.com/xcatalyst/esmond-theme") (:commit . "22b414599fbda46f90a210e846ca64b8427dd3f2") (:revdesc . "22b414599fbd") (:authors ("ağan Korkmaz" . "cagankorkmaz35@gmail.com")) (:maintainers ("ağan Korkmaz" . "cagankorkmaz35@gmail.com")) (:maintainer "ağan Korkmaz" . "cagankorkmaz35@gmail.com"))]) + (esonify . [(20190110 1621) ((deferred (0 3 1)) (cl-lib (0 5))) "Sonify your code" tar ((:url . "https://github.com/oflatt/esonify") (:commit . "bdc79d4ab2e3c449b5bef46e5cabc552beeed5c6") (:revdesc . "bdc79d4ab2e3") (:authors ("Oliver Flatt" . "oflatt@gmail.com")) (:maintainers ("Oliver Flatt" . "oflatt@gmail.com")) (:maintainer "Oliver Flatt" . "oflatt@gmail.com"))]) + (espotify . [(20220121 2057) ((emacs (26 1))) "Spotify access library" tar ((:url . "https://codeberg.org/jao/espotify") (:commit . "ea6d6021e5acc550560325db2f09198839ee702f") (:revdesc . "ea6d6021e5ac") (:keywords "multimedia") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")))]) + (espresso-theme . [(20210505 1957) nil "Espresso Tutti Colori port for Emacs" tar ((:url . "https://github.com/dgutov/espresso-theme") (:commit . "580f673729f02aa07070c5300bedf24733d56e74") (:revdesc . "580f673729f0") (:authors ("Martin Kühl" . "purl.org/net/mkhl")) (:maintainers ("Martin Kühl" . "purl.org/net/mkhl")) (:maintainer "Martin Kühl" . "purl.org/net/mkhl"))]) + (espuds . [(20230218 910) ((emacs (25)) (s (1 7 0)) (dash (2 2 0)) (f (0 12 1))) "Ecukes step definitions" tar ((:url . "http://github.com/ecukes/espuds") (:commit . "57c18a48f1a01d8174298eaab4fcf3b2c6549291") (:revdesc . "57c18a48f1a0") (:keywords "test") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (espy . [(20250417 1352) ((emacs (24))) "Emacs Simple Password Yielder" tar ((:url . "https://github.com/walseb/espy") (:commit . "f58049ed86798b6cb7f462e0a71bf3ecb1f0f9e5") (:revdesc . "f58049ed8679") (:keywords "convenience") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com"))]) + (esqlite . [(20151206 1206) ((pcsv (1 3 3))) "Manipulate sqlite file from Emacs" tar ((:url . "https://github.com/mhayashi1120/Emacs-esqlite") (:commit . "fae9826cbc255b0f0686a801288f1441bda5f631") (:revdesc . "fae9826cbc25") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (esqlite-helm . [(20151116 850) ((esqlite (0 2 0)) (helm (20131207 845))) "Define helm source for sqlite database" tar ((:url . "https://github.com/mhayashi1120/Emacs-esqlite") (:commit . "84d5b16198f30949c544affba751ee0d58a000d9") (:revdesc . "84d5b16198f3") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (ess . [(20251212 937) ((emacs (25 1))) "Emacs Speaks Statistics" tar ((:url . "https://ess.r-project.org/") (:commit . "e39ca8fa7fce703aa2851e83987a412737d575f0") (:revdesc . "e39ca8fa7fce") (: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"))]) + (ess-R-data-view . [(20130509 1158) ((ctable (20130313 1743)) (popup (20130324 1305)) (ess (20130225 1754))) "Data viewer for GNU R" tar ((:url . "https://github.com/myuhe/ess-R-data-view.el") (:commit . "d6e98d3ae1e2a2ea39a56eebcdb73e99d29562e9") (:revdesc . "d6e98d3ae1e2") (:keywords "convenience") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (ess-r-insert-obj . [(20220610 1406) ((emacs (26 1)) (ess (18 10 1))) "Insert objects in ESS-R" tar ((:url . "https://github.com/ShuguangSun/ess-r-insert-obj") (:commit . "2ded9c23d0af2a7f6c0e02f9ea4af0e5b3cb7fb4") (:revdesc . "2ded9c23d0af") (:keywords "tools") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (ess-smart-equals . [(20210411 1333) ((emacs (25 1)) (ess (18 10))) "Flexible, context-sensitive assignment key for R/S" tar ((:url . "https://github.com/genovese/ess-smart-equals") (:commit . "fea9eea4b59c3e9559b379508e3500076ca99ef1") (:revdesc . "fea9eea4b59c") (:keywords "r" "s" "ess" "convenience") (:authors ("Christopher R. Genovese" . "genovese@cmu.edu")) (:maintainers ("Christopher R. Genovese" . "genovese@cmu.edu")) (:maintainer "Christopher R. Genovese" . "genovese@cmu.edu"))]) + (ess-smart-underscore . [(20190309 101) ((ess (0))) "Ess Smart Underscore" tar ((:url . "http://github.com/mlf176f2/ess-smart-underscore.el") (:commit . "aa871c5b0448515db439ea9bed6a8574e82ddb47") (:revdesc . "aa871c5b0448") (:keywords "ess" "underscore"))]) + (ess-view . [(20250409 2120) ((ess (15)) (s (1 8 0)) (f (0 16 0))) "View R dataframes in a spreadsheet software" tar ((:url . "https://github.com/GioBo/ess-view") (:commit . "82df032e6e367e7f587e6131925c0a349c685f93") (:revdesc . "82df032e6e36") (:keywords "extensions" "ess") (:authors ("Bocci Gionata" . "boccigionata@gmail.com")) (:maintainers ("Bocci Gionata" . "boccigionata@gmail.com")) (:maintainer "Bocci Gionata" . "boccigionata@gmail.com"))]) + (ess-view-data . [(20251219 1514) ((emacs (26 1)) (ess (18 10 1)) (csv-mode (1 12)) (transient (0 3 7))) "View Data" tar ((:url . "https://github.com/ShuguangSun/ess-view-data") (:commit . "7dcbd23d4cef2030753d16e1ca1811d3466484e7") (:revdesc . "7dcbd23d4cef") (:keywords "tools") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (essgd . [(20240929 2107) ((websocket (1 15)) (ess (24 1 1)) (emacs (29 1))) "Show R plots from ESS within a buffer" tar ((:url . "https://github.com/sje30/essgd") (:commit . "d9a3729ebaeeeec78984f00508cf2785bc7e8978") (:revdesc . "d9a3729ebaee") (:authors ("Stephen Eglen" . "sje30@cam.ac.uk")) (:maintainers ("Stephen Eglen" . "sje30@cam.ac.uk")) (:maintainer "Stephen Eglen" . "sje30@cam.ac.uk"))]) + (esup . [(20220202 2335) ((cl-lib (0 5)) (s (1 2)) (emacs (25 1))) "The Emacs StartUp Profiler (ESUP)" tar ((:url . "https://github.com/jschaf/esup") (:commit . "4b49c8d599d4cc0fbf994e9e54a9c78e5ab62a5f") (:revdesc . "4b49c8d599d4") (:keywords "convenience" "processes") (:authors ("Joe Schafer" . "joe@jschaf.com")) (:maintainers ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch"))]) + (esxml . [(20250421 1632) ((emacs (24 1)) (cl-lib (0 5))) "Library for working with xml via esxml and sxml" tar ((:url . "https://github.com/tali713/esxml") (:commit . "affada143fed7e2da08f2b3d927a027f26ad4a8f") (:revdesc . "affada143fed") (:keywords "tools" "lisp" "comm") (:authors ("Vanya Izaksonas-Smith" . "izak0002atumndotedu")))]) + (eta . [(20210115 1655) ((emacs (25 1)) (ht (2 2)) (dash (2 17))) "Standard and multi dispatch key bind" tar ((:url . "https://www.github.com/zcaudate/eta") (:commit . "651f96c46eeb7ff8a0f0efcfacad5b4d25bfaa4b") (:revdesc . "651f96c46eeb") (:keywords "convenience" "usability"))]) + (etc-sudoers-mode . [(20240417 2126) ((sudo-edit (0)) (with-editor (0))) "Edit Sudo security policies" tar ((:url . "https://gitlab.com/mavit/etc-sudoers-mode/") (:commit . "133f342e7a249ed4b3e3983e6d8bf541bae05c4b") (:revdesc . "133f342e7a24") (:keywords "languages") (:authors ("Peter Oliver" . "git@mavit.org.uk")) (:maintainers ("Peter Oliver" . "git@mavit.org.uk")) (:maintainer "Peter Oliver" . "git@mavit.org.uk"))]) + (etd . [(20230711 547) ((emacs (24 4))) "Examples to Tests and Docs" tar ((:url . "https://github.com/emacsfodder/kurecolor") (:commit . "65f713935c9d2598f6fa4674bf2bdac2169005a9") (:revdesc . "65f713935c9d") (:keywords "lisp" "tools" "extensions") (:authors ("Jason M23" . "jasonm23@gmail.com")) (:maintainers ("Jason M23" . "jasonm23@gmail.com")) (:maintainer "Jason M23" . "jasonm23@gmail.com"))]) + (eterm-256color . [(20210224 2241) ((emacs (24 4)) (xterm-color (1 7)) (f (0 19 0))) "Customizable 256 colors for term" tar ((:url . "http://github.com/dieggsy/eterm-256color") (:commit . "05fdbd336a888a0f4068578a6d385d8bf812a4e8") (:revdesc . "05fdbd336a88") (:keywords "faces") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainers ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me"))]) + (eterm-fn . [(20250110 1354) ((emacs (25))) "Function (F1--F12) keys for term" tar ((:url . "https://github.com/oitofelix/eterm-fn") (:commit . "b5d433fedc030046ea0e4a217f4dd3846a113fe4") (:revdesc . "b5d433fedc03") (:keywords "terminals") (: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"))]) + (ethan-wspace . [(20201106 2059) nil "Whitespace customizations for emacs" tar ((:url . "https://github.com/glasserc/ethan-wspace") (:commit . "035c7d698c99e3891a522d6e6f8fde23c6267c15") (:revdesc . "035c7d698c99") (:keywords "whitespace" "tab" "newline" "trailing" "clean") (:authors ("Ethan Glasser-Camp" . "ethan@betacantrips.com")) (:maintainers ("Ethan Glasser-Camp" . "ethan@betacantrips.com")) (:maintainer "Ethan Glasser-Camp" . "ethan@betacantrips.com"))]) + (etherpad . [(20230530 1248) ((emacs (27 1)) (request (0 3)) (let-alist (0 0)) (websocket (1 12)) (parsec (0 1)) (0xc (0 1))) "Interface to the Etherpad API" tar ((:url . "https://github.com/zzkt/ethermacs") (:commit . "29409bf9ff05b74d942c1cd7a421eeec2ef96e49") (:revdesc . "29409bf9ff05") (:keywords "comm" "etherpad" "collaborative editing") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am"))]) + (euslisp-mode . [(20250823 1454) ((emacs (28 1)) (s (1 9)) (exec-path-from-shell (1 0)) (helm (3 0))) "Major mode for Euslisp-formatted text" tar ((:url . "https://github.com/iory/euslisp-mode") (:commit . "bf74f683f3b0e127bf2c0e8082fe097e897cd572") (:revdesc . "bf74f683f3b0") (:keywords "languages" "lisp") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainers ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com"))]) + (eval-expr . [(20120619 647) nil "Enhanced eval-expression command" tar ((:url . "https://github.com/jwiegley/eval-expr") (:commit . "a0e69e83de41df8dbccefc1962ab4f02206a3328") (:revdesc . "a0e69e83de41") (:keywords "lisp" "extensions") (:authors ("Noah Friedman" . "friedman@splode.com")) (:maintainers (nil . "friedman@splode.com")) (:maintainer nil . "friedman@splode.com"))]) + (eval-in-repl . [(20230805 2125) ((dash (0)) (paredit (0)) (ace-window (0))) "Consistent ESS-like eval interface for various REPLs" tar ((:url . "https://github.com/kaz-yos/eval-in-repl") (:commit . "a57c6a790c0ca72b0d1218b837d3114ef874dd1f") (:revdesc . "a57c6a790c0c") (:keywords "tools" "convenience") (:authors ("Kazuki YOSHIDA" . "kazukiyoshida@mail.harvard.edu")) (:maintainers ("Kazuki YOSHIDA" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki YOSHIDA" . "kazukiyoshida@mail.harvard.edu"))]) + (eval-sexp-fu . [(20191128 825) ((cl-lib (0))) "Tiny functionality enhancements for evaluating sexps" tar ((:url . "https://github.com/hchbaw/eval-sexp-fu.el") (:commit . "36d2fe3bcf602e15ca10a7f487da103515ef391a") (:revdesc . "36d2fe3bcf60") (:keywords "lisp" "highlight" "convenience") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainers ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net"))]) + (evalator . [(20160213 128) ((helm-core (1 9 1))) "Package for interactive transformation of data with helm" tar ((:url . "http://www.github.com/seanirby/evalator") (:commit . "f30da4da48c0b3f3cfa1fc1c7cfdb53ffe79df36") (:revdesc . "f30da4da48c0") (:keywords "languages" "elisp" "helm") (:maintainers ("Sean Irby" . "sean.t.irby@gmail.com")) (:maintainer "Sean Irby" . "sean.t.irby@gmail.com"))]) + (evalator-clojure . [(20160208 2148) ((cider (0 10 0)) (evalator (1 0 0))) "Clojure evaluation context for evalator via CIDER" tar ((:url . "http://www.github.com/seanirby/evalator-clojure") (:commit . "caa4e0a137bdfada86593128a654e16aa617ad50") (:revdesc . "caa4e0a137bd") (:keywords "languages" "clojure" "cider" "helm") (:maintainers ("Sean Irby" . "sean.t.irby@gmail.com")) (:maintainer "Sean Irby" . "sean.t.irby@gmail.com"))]) + (evangelion-theme . [(20241116 1036) ((emacs (27 1))) "A dark colour scheme inspired by Neon Genesis Evangelion" tar ((:url . "https://github.com/crmsnbleyd/evangelion-theme") (:commit . "89577330e93f1c11b3e75d1c8bbae6accc18fc48") (:revdesc . "89577330e93f") (:keywords "faces" "theme") (:authors ("Andrew Jose" . "mail@drewsh.com")) (:maintainers ("Andrew Jose" . "mail@drewsh.com")) (:maintainer "Andrew Jose" . "mail@drewsh.com"))]) + (eve-mode . [(20170822 2231) ((emacs (25)) (polymode (1 0)) (markdown-mode (2 0))) "Major mode for editing Eve documents" tar ((:url . "https://github.com/witheve/emacs-eve-mode") (:commit . "a4661114d9c18725691b76321d72167ca5a9070a") (:revdesc . "a4661114d9c1") (:keywords "languages" "wp" "tools") (:authors ("Joshua Cole" . "joshuafcole@gmail.com")) (:maintainers ("Joshua Cole" . "joshuafcole@gmail.com")) (:maintainer "Joshua Cole" . "joshuafcole@gmail.com"))]) + (evedel . [(20250303 1213) ((emacs (29 1)) (gptel (0 9 0))) "Instructed LLM programmer/assistant" tar ((:url . "https://github.com/daedsidog/evedel") (:commit . "d979801f5f496ff20aebf4c3343bffcd0e0d3a0b") (:revdesc . "d979801f5f49") (:keywords "convenience" "tools") (:authors ("daedsidog" . "contact@daedsidog.com")) (:maintainers ("daedsidog" . "contact@daedsidog.com")) (:maintainer "daedsidog" . "contact@daedsidog.com"))]) + (evenok . [(20250606 812) ((emacs (28 1))) "Themes with perceptively evenly distributed colors" tar ((:url . "https://codeberg.org/mekeor/evenok") (:commit . "eccc70e577bac3c9901e508fc06ae21b8364e6e9") (:revdesc . "eccc70e577ba") (:keywords "faces" "theme") (:authors ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainers ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainer "Mekeor Melire" . "mekeor@posteo.de"))]) + (everlasting-scratch . [(20250206 628) ((emacs (25 1))) "The *scratch* that lasts forever" tar ((:url . "https://github.com/beacoder/everlasting-scratch") (:commit . "a990e8d2261e5ac109729eb8c2c8e1947e45c8ed") (:revdesc . "a990e8d2261e") (:keywords "convenience" "tool") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com"))]) + (evil . [(20251108 138) ((emacs (24 1)) (cl-lib (0 5)) (goto-chg (1 6)) (nadvice (0 3))) "Extensible vi layer" tar ((:url . "https://github.com/emacs-evil/evil") (:commit . "729d9a58b387704011a115c9200614e32da3cefc") (:revdesc . "729d9a58b387") (:keywords "emulations") (:maintainers ("Tom Dalziel" . "tom.dalziel@gmail.com")) (:maintainer "Tom Dalziel" . "tom.dalziel@gmail.com"))]) + (evil-anzu . [(20250316 1617) ((evil (1 0 0)) (anzu (0 46))) "Anzu for evil-mode" tar ((:url . "https://github.com/syohex/emacs-evil-anzu") (:commit . "7309650425797420944075c9c1556c7c1ff960b3") (:revdesc . "730965042579") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com") ("Fredrik Bergroth" . "fbergroth@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com") ("Fredrik Bergroth" . "fbergroth@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (evil-args . [(20240210 504) ((evil (1 0 8))) "Motions and text objects for delimited arguments in Evil" tar ((:url . "http://github.com/wcsmith/evil-args") (:commit . "a8151556f63c9d45d0c44c8a7ef9e5a542f3cdc7") (:revdesc . "a8151556f63c") (:keywords "evil" "vim-emulation") (:authors ("Connor Smith" . "wconnorsmith@gmail.com")) (:maintainers ("Connor Smith" . "wconnorsmith@gmail.com")) (:maintainer "Connor Smith" . "wconnorsmith@gmail.com"))]) + (evil-avy . [(20150908 748) ((emacs (24 1)) (cl-lib (0 5)) (avy (0 3 0)) (evil (1 2 3))) "Set-based completion" tar ((:url . "https://github.com/louy2/evil-avy") (:commit . "2dd955cc3ecaa7ddeb67b295298abdc6d16dd3a5") (:revdesc . "2dd955cc3eca") (:keywords "point" "location" "evil" "vim") (:authors ("Yufan Lou" . "loganlyf@gmail.com")) (:maintainers ("Yufan Lou" . "loganlyf@gmail.com")) (:maintainer "Yufan Lou" . "loganlyf@gmail.com"))]) + (evil-better-visual-line . [(20200123 2045) ((evil (1 2 13))) "Gj and gk visual line mode fix" tar ((:url . "https://github.com/yourfin/evil-better-visual-line") (:commit . "7a65dfb17ab93857eb4c7a39d4018d9399705293") (:revdesc . "7a65dfb17ab9") (:keywords "evil" "vim" "motion") (:authors (nil . "nuckollspatgmail.com")) (:maintainers (nil . "nuckollspatgmail.com")) (:maintainer nil . "nuckollspatgmail.com"))]) + (evil-cleverparens . [(20250518 1741) ((evil (1 0)) (paredit (1)) (smartparens (1 6 1)) (emacs (24 4)) (dash (2 12 0))) "Evil friendly minor-mode for editing lisp" tar ((:url . "https://github.com/emacs-evil/evil-cleverparens") (:commit . "4c413a132934695b975004d429b0b0a6e3d8ca38") (:revdesc . "4c413a132934") (:keywords "convenience" "emulations") (:authors ("Olli Piepponen" . "opieppo@gmail.com")) (:maintainers ("Olli Piepponen" . "opieppo@gmail.com")) (:maintainer "Olli Piepponen" . "opieppo@gmail.com"))]) + (evil-colemak-basics . [(20241004 1613) ((emacs (24 3)) (evil (1 2 12)) (evil-snipe (2 0 3))) "Basic Colemak key bindings for evil-mode" tar ((:url . "https://github.com/wbolster/evil-colemak-basics") (:commit . "9465c8da35fe7dd0f66184e671e357ec91faa3fe") (:revdesc . "9465c8da35fe") (:keywords "convenience" "emulations" "colemak" "evil") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee"))]) + (evil-colemak-minimal . [(20171006 1317) ((emacs (24)) (evil (1 2 12))) "Minimal Colemak key bindings for evil-mode" tar ((:url . "https://github.com/bmallred/evil-colemak-minimal") (:commit . "6d98b6da60f414524a0d718f76024c26dce742b3") (:revdesc . "6d98b6da60f4") (:keywords "colemak" "evil") (:authors ("Bryan Allred" . "bryan@revolvingcow.com")) (:maintainers ("Bryan Allred" . "bryan@revolvingcow.com")) (:maintainer "Bryan Allred" . "bryan@revolvingcow.com"))]) + (evil-collection . [(20251226 804) ((emacs (26 3)) (evil (1 2 13)) (annalist (1 0))) "A set of keybindings for Evil mode" tar ((:url . "https://github.com/emacs-evil/evil-collection") (:commit . "163792a823bcdb2dae7ac1bba4018adfac35dca2") (:revdesc . "163792a823bc") (:keywords "evil" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (evil-commentary . [(20230610 1006) ((evil (1 0 0))) "Comment stuff out. A port of vim-commentary" tar ((:url . "http://github.com/linktohack/evil-commentary") (:commit . "c5945f28ce47644c828aac1f5f6ec335478d17fb") (:revdesc . "c5945f28ce47") (:keywords "evil" "comment" "commentary" "evil-commentary") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainers ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com"))]) + (evil-dvorak . [(20160416 1841) ((evil (1 0 8))) "Evil keybindings for that work with dvorak mode" tar ((:url . "https://github.com/jbranso/evil-dvorak") (:commit . "e7b80077d6f332452049eb3d7ea51f6c8fbf5947") (:revdesc . "e7b80077d6f3") (: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 ((:url . "https://github.com/pythonnut/evil-easymotion") (:commit . "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9") (:revdesc . "f96c2ed38ddc") (:keywords "convenience" "evil") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com"))]) + (evil-embrace . [(20230820 445) ((emacs (24 4)) (embrace (0 1 0)) (evil-surround (0))) "Evil integration of embrace.el" tar ((:url . "https://github.com/cute-jumper/evil-embrace.el") (:commit . "3081d37811b6a3dfaaf01d578c7ab7a746c6064d") (:revdesc . "3081d37811b6") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (evil-escape . [(20241212 1318) ((emacs (26)) (evil (1 14 0)) (cl-lib (0 5))) "Escape from anything with a customizable key sequence" tar ((:url . "https://github.com/emacsorphanage/evil-escape") (:commit . "aebd1a78a6bd33e5164e7552096b3fe1172d3012") (:revdesc . "aebd1a78a6bd") (:keywords "convenience" "editing" "evil") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com"))]) + (evil-ex-fasd . [(20180903 612) ((emacs (24 4)) (evil (1 1 0)) (fasd (0))) "Using fasd right from evil-ex" tar ((:url . "https://github.com/yqrashawn/evil-ex-fasd") (:commit . "ed8fbbe23a8a268d9dcbf1a6132e928ba2c655c5") (:revdesc . "ed8fbbe23a8a") (:keywords "tools" "fasd" "evil" "navigation") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainers ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com"))]) + (evil-ex-shell-command . [(20181226 226) ((emacs (24 4)) (evil (1 1 0))) "Invoke shell-command right from evil-ex" tar ((:url . "https://github.com/yqrashawn/evil-ex-shell-command") (:commit . "a6ca6d27c07f6a0807abfb5b8f8865f1d17f54aa") (:revdesc . "a6ca6d27c07f") (:keywords "tools" "shell-command" "evil") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainers ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com"))]) + (evil-exchange . [(20200118 252) ((evil (1 2 8)) (cl-lib (0 3))) "Exchange text more easily within Evil" tar ((:url . "http://github.com/Dewdrops/evil-exchange") (:commit . "3030e21ee16a42dfce7f7cf86147b778b3f5d8c1") (:revdesc . "3030e21ee16a") (:keywords "evil" "plugin") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainers ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com"))]) + (evil-expat . [(20241120 1350) ((emacs (24 3)) (evil (1 0 0))) "Evil ex commands" tar ((:url . "http://github.com/edkolev/evil-expat") (:commit . "23610598a9f1450f2deafc47726d5b7ce61e8695") (:revdesc . "23610598a9f1") (:keywords "emulations" "evil" "vim") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainers ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com"))]) + (evil-extra-operator . [(20210225 1239) ((evil (1 0 7))) "Evil operator for evaluating codes, taking notes, searching via google, etc" tar ((:url . "http://github.com/Dewdrops/evil-extra-operator") (:commit . "49c2dae224705f05dcfa03868b9fbbb72f2b5a8d") (:revdesc . "49c2dae22470") (:keywords "evil" "plugin") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainers ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com"))]) + (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 ((:url . "https://github.com/cute-jumper/evil-find-char-pinyin") (:commit . "04e277946d658f1a73c68dcbbadea9c21097a31c") (:revdesc . "04e277946d65") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (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 ((:url . "https://github.com/Andrew-William-Smith/evil-fringe-mark") (:commit . "a1689fddb7ee79aaa720a77aada1208b8afd5c20") (:revdesc . "a1689fddb7ee") (:authors ("Andrew Smith" . "andy.bill.smith@gmail.com")) (:maintainers ("Andrew Smith" . "andy.bill.smith@gmail.com")) (:maintainer "Andrew Smith" . "andy.bill.smith@gmail.com"))]) + (evil-god-state . [(20141117 255) ((evil (1 0 8)) (god-mode (2 12 0))) "Use god-mode keybindings in evil-mode" tar ((:url . "https://github.com/gridaphobe/evil-god-state") (:commit . "3d44197dc0a1fb40e7b7ff8717f8a8c339ce1d40") (:revdesc . "3d44197dc0a1") (:keywords "evil" "leader" "god-mode"))]) + (evil-god-toggle . [(20251031 2050) ((emacs (28 1)) (evil (1 0 8)) (god-mode (2 12 0))) "Toggle Evil and God Mode" tar ((:url . "https://github.com/jam1015/evil-god-toggle") (:commit . "5f61e718133c86db3ddc0532cc0e1d4f80b967cb") (:revdesc . "5f61e718133c") (:keywords "convenience" "emulation" "evil" "god-mode") (:authors ("Jordan Mandel" . "jordan.mandel@live.com")) (:maintainers ("Jordan Mandel" . "jordan.mandel@live.com")) (:maintainer "Jordan Mandel" . "jordan.mandel@live.com"))]) + (evil-goggles . [(20231021 738) ((emacs (24 4)) (evil (1 0 0))) "Add a visual hint to evil operations" tar ((:url . "http://github.com/edkolev/evil-goggles") (:commit . "34ca276a85f615d2b45e714c9f8b5875bcb676f3") (:revdesc . "34ca276a85f6") (:keywords "emulations" "evil" "vim" "visual") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainers ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com"))]) + (evil-iedit-state . [(20220219 1432) ((evil (1 0 9)) (iedit (0 9 9 9))) "Evil states to interface iedit mode" tar ((:url . "https://github.com/syl20bnr/evil-iedit-state") (:commit . "44c64c71692e5b2f608ad3e3c537ec0a0e0ea0f8") (:revdesc . "44c64c71692e") (:keywords "convenience" "editing" "evil" "iedit" "mnemonic") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com"))]) + (evil-indent-plus . [(20230927 1513) ((evil (0)) (cl-lib (0 5))) "Evil textobjects based on indentation" tar ((:url . "http://github.com/TheBB/evil-indent-plus") (:commit . "f392696e4813f1d3a92c7eeed333248914ba6dae") (:revdesc . "f392696e4813") (:keywords "convenience" "evil") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainers ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com"))]) + (evil-indent-textobject . [(20130831 2219) ((evil (0))) "Evil textobjects based on indentation" tar ((:url . "http://github.com/cofi/evil-indent-textobject") (:commit . "70a1154a531b7cfdbb9a31d6922482791e20a3a7") (:revdesc . "70a1154a531b") (:keywords "convenience" "evil") (:authors ("Michael Markert" . "markert.michael@gmail.com")) (:maintainers ("Michael Markert" . "markert.michael@gmail.com")) (:maintainer "Michael Markert" . "markert.michael@gmail.com"))]) + (evil-keypad . [(20250731 552) ((emacs (30 1)) (evil (1 0 0))) "Modal command dispatch for evil-mode" tar ((:url . "https://github.com/achyudh/evil-keypad") (:commit . "f384b88180154f86bf70adf5f018faed6c68a509") (:revdesc . "f384b8818015") (:keywords "convenience" "emulation") (:authors ("Achyudh Ram" . "mail@achyudh.me")) (:maintainers ("Achyudh Ram" . "mail@achyudh.me")) (:maintainer "Achyudh Ram" . "mail@achyudh.me"))]) + (evil-leader . [(20140606 1243) ((evil (0))) "Let there be " tar ((:url . "http://github.com/cofi/evil-leader") (:commit . "39f7014bcf8b36463e0c7512c638bda4bac6c2cf") (:revdesc . "39f7014bcf8b") (:keywords "evil" "vim-emulation" "leader") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainers ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com"))]) + (evil-ledger . [(20180802 1612) ((emacs (24 4)) (evil (1 2 12)) (ledger-mode (0))) "Make `ledger-mode' more `evil'" tar ((:url . "https://github.com/atheriel/evil-ledger") (:commit . "7a9f9f5d39c42fffdba8004f8982642351f2b233") (:revdesc . "7a9f9f5d39c4") (:keywords "convenience" "evil" "languages" "ledger" "vim-emulation") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainers ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com"))]) + (evil-lion . [(20241120 1351) ((emacs (24 3)) (evil (1 0 0))) "Evil align operator, port of vim-lion" tar ((:url . "http://github.com/edkolev/evil-lion") (:commit . "5a0bca151466960e090d1803c4c5ded88875f90a") (:revdesc . "5a0bca151466") (:keywords "emulations" "evil" "vim") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainers ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com"))]) + (evil-lisp-state . [(20160404 248) ((evil (1 0 9)) (bind-map (0)) (smartparens (1 6 1))) "An evil state to edit Lisp code" tar ((:url . "https://github.com/syl20bnr/evil-lisp-state") (:commit . "3c65fecd9917a41eaf6460f22187e2323821f3ce") (:revdesc . "3c65fecd9917") (:keywords "convenience" "editing" "evil" "smartparens" "lisp" "mnemonic") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com"))]) + (evil-lispops . [(20240428 1356) ((emacs (26 1)) (evil (1 2 10))) "Operations for editing lisp evilly" tar ((:url . "https://github.com/precompute/evil-lispops") (:commit . "372b52df1a45fcea6c9461e7909cfdbb1db822a9") (:revdesc . "372b52df1a45") (:authors ("precompute" . "git@precompute.net")) (:maintainers ("precompute" . "git@precompute.net")) (:maintainer "precompute" . "git@precompute.net"))]) + (evil-lispy . [(20190502 739) ((lispy (0 26 0)) (evil (1 2 12)) (hydra (0 13 5))) "Precision Lisp editing with Evil and Lispy" tar ((:url . "https://github.com/sp3ctum/evil-lispy") (:commit . "ed317f7fccbdbeea8aa04a91b1b1f48a0e2ddc4e") (:revdesc . "ed317f7fccbd") (:keywords "lisp") (:authors ("Brandon Carrell" . "brandoncarrell@gmail.com") ("Mika Vilpas" . "mika.vilpas@gmail.com")) (:maintainers ("Brandon Carrell" . "brandoncarrell@gmail.com") ("Mika Vilpas" . "mika.vilpas@gmail.com")) (:maintainer "Brandon Carrell" . "brandoncarrell@gmail.com"))]) + (evil-mark-replace . [(20250422 242) ((evil (1 14 0))) "Replace the thing in marked area" tar ((:url . "http://github.com/redguardtoo/evil-mark-replace") (:commit . "90ee84748582be05fa8f9a02872321a08b455282") (:revdesc . "90ee84748582") (:keywords "convenience") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (evil-matchit . [(20251212 1256) ((emacs (27 1))) "Vim matchit ported to Evil" tar ((:url . "http://github.com/redguardtoo/evil-matchit") (:commit . "eb2b0c776c9d1cf3199c24473499ce4adfa44178") (:revdesc . "eb2b0c776c9d") (:keywords "matchit" "vim" "evil") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (evil-mc . [(20241025 2045) ((emacs (24 3)) (evil (1 2 14)) (cl-lib (0 5))) "Multiple cursors for evil-mode" tar ((:url . "https://github.com/gabesoft/evil-mc") (:commit . "7e363dd6b0a39751e13eb76f2e9b7b13c7054a43") (:revdesc . "7e363dd6b0a3") (:keywords "evil" "editing" "multiple-cursors" "vim" "evil-multiple-cursors" "evil-mc" "evil-mc") (:authors ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainers ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainer "Gabriel Adomnicai" . "gabesoft@gmail.com"))]) + (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 ((:url . "https://github.com/gabesoft/evil-mc-extras") (:commit . "ba3252ae129c3b79aeb70ec3d276cbda32b00421") (:revdesc . "ba3252ae129c") (:keywords "evil" "editing" "multiple-cursors" "vim" "evil-multiple-cursors" "evil-mc" "evil-mc-extras") (:authors ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainers ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainer "Gabriel Adomnicai" . "gabesoft@gmail.com"))]) + (evil-mu4e . [(20180613 1039) ((emacs (24 4)) (evil (1 2 10))) "Evil-based key bindings for mu4e" tar ((:url . "https://github.com/JorisE/evil-mu4e") (:commit . "f4b387ccbd2c49f3bbb5401e93bfcc050ca128ef") (:revdesc . "f4b387ccbd2c") (:authors ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainers ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainer "Joris Engbers" . "info@jorisengbers.nl"))]) + (evil-multiedit . [(20211121 1650) ((emacs (25 1)) (evil (1 14 0)) (iedit (0 9 9)) (cl-lib (0 5))) "Multiple cursors for evil-mode" tar ((:url . "https://github.com/hlissner/evil-multiedit") (:commit . "23b53bc8743fb82a8854ba907b1d277374c93a79") (:revdesc . "23b53bc8743f") (:keywords "multiple cursors" "editing" "iedit") (:authors ("Henrik Lissner" . "http://github/hlissner")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io"))]) + (evil-neo . [(20240721 1241) ((evil (1 0 0))) "Minor mode for using the Neo keyboard layout with Evil" tar ((:url . "https://git.sr.ht/~p-conrad/evil-neo") (:commit . "18f115a0ddc12a0930f0eb2f9f119b190c71017e") (:revdesc . "18f115a0ddc1") (:keywords "convenience" "emulations" "neo" "evil" "vim" "keymap") (:authors ("Peter Conrad" . "p.conrad@proton.me")) (:maintainers ("Peter Conrad" . "p.conrad@proton.me")) (:maintainer "Peter Conrad" . "p.conrad@proton.me"))]) + (evil-nerd-commenter . [(20230625 254) ((emacs (26 1))) "Comment/uncomment lines efficiently. Like Nerd Commenter in Vim" tar ((:url . "http://github.com/redguardtoo/evil-nerd-commenter") (:commit . "3b197a2b559b06a7cf39978704b196f53dac802a") (:revdesc . "3b197a2b559b") (:keywords "convenience" "evil") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (evil-nl-break-undo . [(20240921 953) ((evil (0))) "Break evil's undo sequence on CR" tar ((:url . "https://github.com/VanLaser/evil-nl-break-undo") (:commit . "fabd063c097f1b23112a29936dc5be5214153a0d") (:revdesc . "fabd063c097f") (:authors ("VanLaser" . "Gabriel.Lazar@com.utcluj.ro")) (:maintainers ("VanLaser" . "Gabriel.Lazar@com.utcluj.ro")) (:maintainer "VanLaser" . "Gabriel.Lazar@com.utcluj.ro"))]) + (evil-numbers . [(20251216 54) ((emacs (24 1)) (evil (1 2 0))) "Increment/decrement numbers like in VIM" tar ((:url . "http://github.com/juliapath/evil-numbers") (:commit . "5362f19b78409b3220756cb2bf960a90d1196ee6") (:revdesc . "5362f19b7840") (:keywords "convenience" "tools") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainers ("Julia Path" . "julia@jpath.de")) (:maintainer "Julia Path" . "julia@jpath.de"))]) + (evil-opener . [(20161207 1810) ((evil (1 2 12)) (opener (0 2 2))) "Opening urls as buffers in evil" tar ((:url . "https://github.com/0robustus1/opener.el") (:commit . "c384f67278046fdcd220275fdd212ab85672cbeb") (:revdesc . "c384f6727804") (:keywords "url" "http" "files") (:authors ("Tim Reddehase" . "tr@rightsrestricted.com")) (:maintainers ("Tim Reddehase" . "tr@rightsrestricted.com")) (:maintainer "Tim Reddehase" . "tr@rightsrestricted.com"))]) + (evil-org . [(20221001 2335) ((emacs (24 4)) (evil (1 0))) "Evil keybindings for org-mode" tar ((:url . "https://github.com/Somelauw/evil-org-mode.git") (:commit . "b1f309726b1326e1a103742524ec331789f2bf94") (:revdesc . "b1f309726b13") (:keywords "evil" "vim-emulation" "org-mode" "key-bindings" "presets"))]) + (evil-owl . [(20210416 1700) ((emacs (25 1)) (evil (1 2 13))) "Preview evil registers and marks before using them" tar ((:url . "https://github.com/mamapanda/evil-owl") (:commit . "a41a6d28e26052b25f3d21da37ccf1d8fde1e6aa") (:revdesc . "a41a6d28e260") (:keywords "emulations" "evil" "visual") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainers ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com"))]) + (evil-paredit . [(20150413 2048) ((evil (1 0 9)) (paredit (25 -2))) "Paredit support for evil keybindings" tar ((:url . "https://github.com/roman/evil-paredit") (:commit . "e058fbdcf9dbf7ad6cc77f0172d7517ef233d55f") (:revdesc . "e058fbdcf9db") (:keywords "paredit" "evil") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com"))]) + (evil-pinyin . [(20231016 1558) ((emacs (25)) (names (0 5)) (evil (1))) "Evil search Chinese characters by pinyin" tar ((:url . "https://github.com/laishulu/evil-pinyin") (:commit . "0fae5ad8761417f027b33230382a50f826ad3bfb") (:revdesc . "0fae5ad87614") (:keywords "extensions"))]) + (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 ((:url . "https://bitbucket.org/FelipeLema/evil-python-movement.el/") (:commit . "9936b3b7f8d96415d517c1f3604637889484a637") (:revdesc . "9936b3b7f8d9") (:authors ("Felipe Lema" . "felipelemaenmortemalepuntoorg")) (:maintainers ("Felipe Lema" . "felipelemaenmortemalepuntoorg")) (:maintainer "Felipe Lema" . "felipelemaenmortemalepuntoorg"))]) + (evil-quickscope . [(20160202 1924) ((evil (0))) "Highlight unique characters in words for f,F,t,T navigation" tar ((:url . "http://github.com/blorbx/evil-quickscope") (:commit . "37a20e4c56c6058abf186ad4013c155e695e876f") (:revdesc . "37a20e4c56c6") (:keywords "faces" "emulation" "vim" "evil") (:authors ("Michael Chen" . "blorbx@gmail.com")) (:maintainers ("Michael Chen" . "blorbx@gmail.com")) (:maintainer "Michael Chen" . "blorbx@gmail.com"))]) + (evil-rails . [(20190512 1517) ((evil (1 0)) (projectile-rails (1 0))) "Rails support for Evil Mode" tar ((:url . "https://github.com/antono/evil-rails") (:commit . "b0f1c5de6720714febeb76c4b569b71bb891938c") (:revdesc . "b0f1c5de6720") (:keywords "ruby" "rails" "vim" "project" "convenience" "web" "evil" "projectile") (:authors ("Antono Vasiljev" . "antono.vasiljev@gmail.com")) (:maintainers ("Antono Vasiljev" . "antono.vasiljev@gmail.com")) (:maintainer "Antono Vasiljev" . "antono.vasiljev@gmail.com"))]) + (evil-replace-with-char . [(20180324 2206) ((evil (1 2 13)) (emacs (24))) "Replace chars of a text object with a char" tar ((:url . "https://github.com/ninrod/evil-replace-with-char") (:commit . "ed4a12d5bff11163eb03ad2826c52fd30f51a8d3") (:revdesc . "ed4a12d5bff1") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainers ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com"))]) + (evil-replace-with-register . [(20170713 925) ((evil (1 0 8))) "Port of vim plugin ReplaceWithRegister" tar ((:url . "https://github.com/Dewdrops/evil-ReplaceWithRegister") (:commit . "91cc7bf21a94703c441cc9212214075b226b7f67") (:revdesc . "91cc7bf21a94") (:keywords "evil" "plugin") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainers ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com"))]) + (evil-rsi . [(20160221 2104) ((evil (1 0 0))) "Use emacs motion keys in evil, inspired by vim-rsi" tar ((:url . "http://github.com/linktohack/evil-rsi") (:commit . "236bf6ed1e2285698db808463e5f2f69f5f5e7c0") (:revdesc . "236bf6ed1e22") (:keywords "evil" "rsi" "evil-rsi") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainers ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com"))]) + (evil-ruby-text-objects . [(20240411 1139) ((emacs (25 1)) (evil (1 2 0))) "Evil text objects for Ruby code" tar ((:url . "https://github.com/porras/evil-ruby-text-objects") (:commit . "de138b3279817484d1d34ca5b293af09e00a4e1a") (:revdesc . "de138b327981") (:keywords "languages") (:authors ("Sergio Gil" . "sgilperez@gmail.com")) (:maintainers ("Sergio Gil" . "sgilperez@gmail.com")) (:maintainer "Sergio Gil" . "sgilperez@gmail.com"))]) + (evil-search-highlight-persist . [(20170523 334) ((highlight (0))) "Persistent highlights after search" tar ((:url . "https://github.com/naclander/evil-search-highlight-persist") (:commit . "6e04a8c075f5fd62526d222447048faab8bfa187") (:revdesc . "6e04a8c075f5") (:authors ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainers ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainer "Juanjo Alvarez" . "juanjo@juanjoalvarez.net"))]) + (evil-smartparens . [(20171210 1513) ((evil (1 0)) (emacs (24 4)) (smartparens (1 10 1))) "Evil support for smartparens" tar ((:url . "https://www.github.com/expez/evil-smartparens") (:commit . "026d4a3cfce415a4dfae1457f871b385386e61d3") (:revdesc . "026d4a3cfce4") (:keywords "evil" "smartparens") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainers ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com"))]) + (evil-snipe . [(20250505 508) ((emacs (24 4)) (evil (1 2 12)) (cl-lib (0 5))) "Emulate vim-sneak & vim-seek" tar ((:url . "https://github.com/hlissner/evil-snipe") (:commit . "16317d7e54313490a0fe8642ed9a1a72498e7ad2") (:revdesc . "16317d7e5431") (:keywords "emulation" "vim" "evil" "sneak" "seek") (:authors ("Henrik Lissner" . "http://github/hlissner")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io"))]) + (evil-space . [(20151208 1228) ((evil (1 0 0))) "Repeat motion in Evil. Correct the behaviour of what SPC should do" tar ((:url . "http://github.com/linktohack/evil-space") (:commit . "a9c07284d308425deee134c9d88a2d538dd229e6") (:revdesc . "a9c07284d308") (:keywords "space" "repeat" "motion") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainers ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com"))]) + (evil-string-inflection . [(20200524 1402) ((emacs (24)) (evil (1 2 13)) (string-inflection (1 0 6))) "Snake_case -> CamelCase -> etc. for text objects" tar ((:url . "https://github.com/ninrod/evil-string-inflection") (:commit . "d22a90ab807afa7f27f3815b5b5ea47d52d05218") (:revdesc . "d22a90ab807a") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainers ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com"))]) + (evil-surround . [(20240325 852) ((evil (1 2 12))) "Emulate surround.vim from Vim" tar ((:url . "https://github.com/emacs-evil/evil-surround") (:commit . "14dc693ed971053feb9596d4bc1b1de0b0006584") (:revdesc . "14dc693ed971") (:keywords "emulation" "vi" "evil") (:authors ("Tim Harper" . "timcharperatgmaildotcom") ("Vegard ye" . "vegard_oyeathotmaildotcom")) (:maintainers ("Tom Dalziel" . "tom.dalziel@gmail.com")) (:maintainer "Tom Dalziel" . "tom.dalziel@gmail.com"))]) + (evil-swap-keys . [(20191105 1426) ((emacs (24 4))) "Intelligently swap keys on text input with evil" tar ((:url . "https://github.com/wbolster/evil-swap-keys") (:commit . "b5ef105499f998b5667da40da30c073229a213ea") (:revdesc . "b5ef105499f9") (:keywords "convenience" "data" "languages" "tools") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee"))]) + (evil-tabs . [(20160217 1520) ((evil (0 0 0)) (elscreen (0 0 0))) "Integrating Vim-style tabs for Evil mode users" tar ((:url . "https://github.com/krisajenkins/evil-tabs") (:commit . "53d3314a810017b6056ab6796aef671f5ea1c063") (:revdesc . "53d3314a8100") (:keywords "evil" "tab" "tabs" "vim") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com"))]) + (evil-terminal-cursor-changer . [(20231031 852) nil "Change cursor shape and color by evil state in terminal" tar ((:url . "https://github.com/7696122/evil-terminal-cursor-changer") (:commit . "2358f3e27d89128361cf80fcfa092fdfe5b52fd8") (:revdesc . "2358f3e27d89") (:keywords "evil" "terminal" "cursor"))]) + (evil-test-helpers . [(20230820 2246) ((evil (1 15 0))) "Unit test helpers for Evil" tar ((:url . "https://github.com/emacs-evil/evil") (:commit . "4beec94d14fc4180c41314edff997dbb9c422a23") (:revdesc . "4beec94d14fc") (:authors ("Vegard ye" . "vegard_oyeathotmail.com")) (:maintainers ("Vegard ye" . "vegard_oyeathotmail.com")) (:maintainer "Vegard ye" . "vegard_oyeathotmail.com"))]) + (evil-tex . [(20230715 1752) ((emacs (26 1)) (evil (1 0)) (auctex (11 88))) "Useful features for editing LaTeX in evil-mode" tar ((:url . "https://github.com/iyefrat/evil-tex") (:commit . "5dd1e852c8fb9e6efa2b748e89786526483e7619") (:revdesc . "5dd1e852c8fb") (:keywords "tex" "emulation" "vi" "evil" "wp"))]) + (evil-text-object-python . [(20191010 1328) ((emacs (25)) (evil (1 2 14)) (dash (2 16 0))) "Python specific evil text objects" tar ((:url . "https://github.com/wbolster/evil-text-object-python") (:commit . "39d22fc524f0413763f291267eaab7f4e7984318") (:revdesc . "39d22fc524f0") (:keywords "convenience" "languages" "tools") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee"))]) + (evil-textobj-anyblock . [(20170905 1907) ((cl-lib (0 5)) (evil (1 1 0))) "Textobject for the closest user-defined blocks" tar ((:url . "https://github.com/noctuid/evil-textobj-anyblock") (:commit . "ff00980f0634f95bf2ad9956b615a155ea8743be") (:revdesc . "ff00980f0634") (:keywords "evil") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainers ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org"))]) + (evil-textobj-column . [(20170905 1905) ((names (0 5)) (emacs (24)) (evil (0))) "Provides column text objects" tar ((:url . "https://github.com/noctuid/evil-textobj-column") (:commit . "835d7036d0bc9a6e44fc9b7c54ccf2a7c01428cd") (:revdesc . "835d7036d0bc") (:keywords "evil" "column" "text-object") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainers ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org"))]) + (evil-textobj-entire . [(20150422 1254) ((emacs (24)) (evil (1 0 0))) "Text object for entire lines of buffer for evil" tar ((:url . "https://github.com/supermomonga/evil-textobj-entire") (:commit . "5b3a98f3a69edc3a788f539f6ffef4a0ef5e853d") (:revdesc . "5b3a98f3a69e") (:keywords "convenience" "emulations"))]) + (evil-textobj-line . [(20211101 1429) ((evil (1 0 0))) "Line text object for Evil" tar ((:url . "https://github.com/emacsorphanage/evil-textobj-line") (:commit . "9eaf9a5485c2b5c05e16552b34632ca520cd681d") (:revdesc . "9eaf9a5485c2") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (evil-textobj-syntax . [(20231119 1633) ((emacs (24)) (evil (0))) "Provides syntax text objects" tar ((:url . "https://github.com/laishulu/evil-textobj-syntax") (:commit . "64252ded690a2e65b71a1c84aa3acd24e704d02f") (:revdesc . "64252ded690a") (:keywords "evil" "syntax" "highlight" "text-object"))]) + (evil-textobj-tree-sitter . [(20251118 341) ((emacs (25 1))) "Provides evil textobjects using tree-sitter" tar ((:url . "https://github.com/meain/evil-textobj-tree-sitter") (:commit . "d0d088c781b54534b49880819a40575b203dc6c8") (:revdesc . "d0d088c781b5") (:keywords "evil" "tree-sitter" "text-object" "convenience"))]) + (evil-traces . [(20230820 2255) ((emacs (25 1)) (evil (1 2 13))) "Visual hints for `evil-ex'" tar ((:url . "https://github.com/mamapanda/evil-traces") (:commit . "3b4e08c522d1a4c6f458ab5dc21914fd307333a1") (:revdesc . "3b4e08c522d1") (:keywords "emulations" "evil" "visual") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainers ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com"))]) + (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 ((:url . "https://github.com/ethan-leba/tree-edit") (:commit . "9e3635e3fd0449bf259d42ea29c93e46ef623fe7") (:revdesc . "9e3635e3fd04") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainers ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com"))]) + (evil-tutor . [(20150103 653) ((evil (1 0 9))) "Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:url . "https://github.com/syl20bnr/evil-tutor") (:commit . "909273bac88b98a565f1b89bbb13d523b7edce2b") (:revdesc . "909273bac88b") (:keywords "convenience" "editing" "evil") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com"))]) + (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 ((:url . "https://github.com/kenjimyzk/evil-tutor-ja") (:commit . "06b9ad853a15ce6f2c53c2cf379b9ff358369f2d") (:revdesc . "06b9ad853a15") (:keywords "convenience" "editing" "evil" "japanese") (:authors ("Kenji Miyazaki" . "kenjizmyzk@gmail.com")) (:maintainers ("Kenji Miyazaki" . "kenjizmyzk@gmail.com")) (:maintainer "Kenji Miyazaki" . "kenjizmyzk@gmail.com"))]) + (evil-tutor-sc . [(20240326 1239) ((evil (1 0 9)) (evil-tutor (0 1))) "Simplified Chinese tutor for Evil" tar ((:url . "https://github.com/clsty/evil-tutor-sc") (:commit . "9520aae3e10480a942c35ae83f7215086fee9412") (:revdesc . "9520aae3e104") (:keywords "convenience" "editing" "evil" "chinese") (:authors ("clsty" . "celestial.y@outlook.com")) (:maintainers ("clsty" . "celestial.y@outlook.com")) (:maintainer "clsty" . "celestial.y@outlook.com"))]) + (evil-vimish-fold . [(20200122 117) ((emacs (24 4)) (evil (1 0 0)) (vimish-fold (0 2 0))) "Integrate vimish-fold with evil" tar ((:url . "https://github.com/alexmurray/evil-vimish-fold") (:commit . "b6e0e6b91b8cd047e80debef1a536d9d49eef31a") (:revdesc . "b6e0e6b91b8c") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (evil-visual-mark-mode . [(20230202 318) ((evil (1 0 9)) (dash (2 10))) "Display evil marks on buffer" tar ((:url . "https://github.com/roman/evil-visual-mark-mode") (:commit . "2bbaaae56ae53e68a8bcc7bc2cfe830a14843b4d") (:revdesc . "2bbaaae56ae5") (:keywords "evil") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com"))]) + (evil-visual-replace . [(20171016 613) ((evil (1 0 0))) "Search/replace commands for evil visual state, inc. blocks" tar ((:url . "https://github.com/troyp/evil-visual-replace") (:commit . "163fc827a1ffc106475da470c37fb26f4cc9b008") (:revdesc . "163fc827a1ff") (:keywords "evil" "search" "replace" "regexp" "block" "rectangular" "region" "visual"))]) + (evil-visualstar . [(20160223 48) ((evil (0))) "Starts a * or # search from the visual selection" tar ((:url . "https://github.com/bling/evil-visualstar") (:commit . "06c053d8f7381f91c53311b1234872ca96ced752") (:revdesc . "06c053d8f738") (:keywords "evil" "vim" "visualstar"))]) + (evm-mode . [(20220911 1647) nil "Major mode for editing Ethereum EVM bytecode" tar ((:url . "https://github.com/taquangtrung/emacs-evm-mode") (:commit . "422b65cfd04854072bf6b9238c49e3d40577ef98") (:revdesc . "422b65cfd048") (:keywords "languages"))]) + (ewal . [(20200305 230) ((emacs (25 1))) "A pywal-based theme generator" tar ((:url . "https://gitlab.com/jjzmajic/ewal") (:commit . "4ecc355dae9c7d648cd2874e01a15dfa02b9350d") (:revdesc . "4ecc355dae9c") (:keywords "faces"))]) + (ewal-doom-themes . [(20200922 325) ((emacs (25)) (ewal (0 1)) (doom-themes (0 1))) "Dread the colors of darkness" tar ((:url . "https://gitlab.com/jjzmajic/ewal") (:commit . "e2a04f5c97b7d5e087af26e646c0b45a24522e56") (:revdesc . "e2a04f5c97b7") (:keywords "faces"))]) + (ewal-evil-cursors . [(20200301 839) ((emacs (25)) (ewal (0 1))) "`ewal'-colored evil cursor for Emacs and Spacemacs" tar ((:url . "https://gitlab.com/jjzmajic/ewal") (:commit . "732a2f4abb480f9f5a3249af822d8eb1e90324e3") (:revdesc . "732a2f4abb48") (:keywords "faces"))]) + (ewal-spacemacs-themes . [(20230505 609) ((emacs (25)) (ewal (0 1)) (spacemacs-theme (0 1))) "Ride the rainbow spaceship" tar ((:url . "https://gitlab.com/jjzmajic/ewal") (:commit . "0d245edcfcd9cc5766d37b270214fb9da9b4336d") (:revdesc . "0d245edcfcd9") (:keywords "faces"))]) + (ewm . [(20251021 30) ((emacs (26 1)) (eyebrowse (0 7 8))) "Window manager" tar ((:url . "https://github.com/laluxx/ewm") (:commit . "aed05324efc290a1674eceb2018f8e2a7e4480d5") (:revdesc . "aed05324efc2") (:keywords "windows" "convenience"))]) + (ewmctrl . [(20170922 217) nil "Use `wmctrl' to manage desktop windows via EWMH/NetWM" tar ((:url . "https://github.com/flexibeast/ewmctrl") (:commit . "3d0217c4d6cdb5c308b6cb4293574f470d4faacf") (:revdesc . "3d0217c4d6cd") (:keywords "desktop" "windows" "ewmh" "netwm") (:authors ("Alexis" . "flexibeast@gmail.com") ("Adam Plaice" . "plaice.adam@gmail.com")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com"))]) + (eww-lnum . [(20150102 1512) nil "Conkeror-like functionality for eww" tar ((:url . "https://github.com/m00natic/eww-lnum") (:commit . "4b0ecec769919ecb05ca4fb15ec51911ba589929") (:revdesc . "4b0ecec76991") (:keywords "eww" "browse" "conkeror") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainers ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com"))]) + (exato . [(20200524 1319) ((evil (1 2 13)) (emacs (24))) "EXATO: Evil XML/HTML Attributes Text Object" tar ((:url . "https://github.com/ninrod/exato") (:commit . "5e7b5721bf48aa49c6cdb5d41b908ef7d513b2a8") (:revdesc . "5e7b5721bf48") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainers ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com"))]) + (exec-in-buffer . [(20250629 324) ((emacs (24 1))) "Choose programs to execute on buffers in projects" tar ((:url . "https://github.com/arteen1000/exec-in-buffer") (:commit . "57ddaf95d46714ec1382f83ba952480b4cd0b73d") (:revdesc . "57ddaf95d467") (:keywords "tools" "c" "c++" "formatting" "projects") (:authors ("Arteen Abrishami" . "arteen@ucla.edu")) (:maintainers ("Arteen Abrishami" . "arteen@ucla.edu")) (:maintainer "Arteen Abrishami" . "arteen@ucla.edu"))]) + (exec-path-from-shell . [(20251113 1324) ((emacs (24 4))) "Get environment variables such as $PATH from the shell" tar ((:url . "https://github.com/purcell/exec-path-from-shell") (:commit . "7552abf032a383ff761e7d90e6b5cbb4658a728a") (:revdesc . "7552abf032a3") (:keywords "unix" "environment") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (execline . [(20190711 2010) ((emacs (26 1)) (s (1 6 0))) "Major mode for editing execline scripts" tar ((:url . "https://gitlab.com/KAction/emacs-execline") (:commit . "c75dd9b2c54d8e59fc35fd4bd98d8e213948a3f5") (:revdesc . "c75dd9b2c54d") (:keywords "tools" "unix" "languages") (:authors ("Dmitry Bogatov" . "KAction@debian.org")) (:maintainers ("Dmitry Bogatov" . "KAction@debian.org")) (:maintainer "Dmitry Bogatov" . "KAction@debian.org"))]) + (exercism . [(20241019 1120) ((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 ((:url . "https://github.com/anonimitoraf/exercism.el") (:commit . "62c008b0e845c26f2e855969e9f87b405011a3ec") (:revdesc . "62c008b0e845") (:keywords "exercism" "convenience") (:authors ("Rafael Nicdao" . "https://github.com/anonimito")) (:maintainers ("Rafael Nicdao" . "nicdaoraf@gmail.com")) (:maintainer "Rafael Nicdao" . "nicdaoraf@gmail.com"))]) + (exiftool . [(20190520 1106) ((emacs (25))) "Elisp wrapper around ExifTool" tar ((:url . "https://git.systemreboot.net/exiftool.el") (:commit . "e043df1bcef40cd5934a74c210e1e35d5eb0e5a6") (:revdesc . "e043df1bcef4") (:keywords "data") (:authors ("Arun I" . "arunisaac@systemreboot.net")) (:maintainers ("Arun I" . "arunisaac@systemreboot.net")) (:maintainer "Arun I" . "arunisaac@systemreboot.net"))]) + (exotica-theme . [(20180212 2329) ((emacs (24))) "A dark theme with vibrant colors" tar ((:url . "https://github.com/jbharat/exotica-theme") (:commit . "ff3ef4f6fa38c93b99becad977c7810c990a4d2f") (:revdesc . "ff3ef4f6fa38") (:keywords "faces" "theme" "dark" "vibrant colors") (:authors ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainers ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainer "Bharat Joshi" . "jbharat@outlook.com"))]) + (expand-line . [(20151006 207) nil "Expand selection by line" tar ((:url . "https://github.com/victorteokw/expand-line") (:commit . "75a5d0241f35dd0748ab8ecb4ff16891535be372") (:revdesc . "75a5d0241f35") (:authors ("Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Kai Yu" . "yeannylam@gmail.com"))]) + (expand-region . [(20241217 1840) ((emacs (24 4))) "Increase selected region by semantic units" tar ((:url . "https://github.com/magnars/expand-region.el") (:commit . "351279272330cae6cecea941b0033a8dd8bcc4e8") (:revdesc . "351279272330") (:keywords "marking" "region") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (expenses . [(20230903 306) ((emacs (28 1)) (dash (2 19 1)) (ht (2 3))) "Record and view expenses" tar ((:url . "https://github.com/md-arif-shaikh/expenses") (:commit . "1c89ed3969fef7d733a0f52084cfe07d33200104") (:revdesc . "1c89ed3969fe") (:keywords "expense tracking" "convenience") (:authors ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainers ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainer "Md Arif Shaikh" . "arifshaikh.astro@gmail.com"))]) + (express . [(20140508 2041) ((string-utils (0 3 2))) "Alternatives to `message'" tar ((:url . "http://github.com/rolandwalker/express") (:commit . "6c301e8a4b6b58a5fe59ba607865238e38cee8fd") (:revdesc . "6c301e8a4b6b") (:keywords "extensions" "message" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (exsqlaim-mode . [(20170607 1003) ((s (1 10 0))) "Use variables inside sql queries" tar ((:url . "https://github.com/ahmadnazir/exsqlaim-mode") (:commit . "a2e0a62ec8b87193d8eaa695774bfd689324b06c") (:revdesc . "a2e0a62ec8b8") (:authors ("Ahmad Nazir Raja" . "ahmadnazir@gmail.com")) (:maintainers ("Ahmad Nazir Raja" . "ahmadnazir@gmail.com")) (:maintainer "Ahmad Nazir Raja" . "ahmadnazir@gmail.com"))]) + (extempore-mode . [(20220704 2241) ((emacs (24 4))) "Emacs major mode for Extempore source files" tar ((:url . "http://github.com/extemporelang/extempore-emacs-mode") (:commit . "92e0fff482a0a4dc2971c39581c5ea9e84ae5e1c") (:revdesc . "92e0fff482a0") (:keywords "extempore") (:authors ("Ben Swift" . "ben@benswift.me")) (:maintainers ("Ben Swift" . "ben@benswift.me")) (:maintainer "Ben Swift" . "ben@benswift.me"))]) + (extend-dnd . [(20151122 1850) nil "R drag and Drop" tar ((:url . "https://github.com/mlf176f2/extend-dnd") (:commit . "80c966c93b82c9bb5c6225a432557c39144fc602") (:revdesc . "80c966c93b82") (:keywords "extend" "drag and drop"))]) + (external-dict . [(20250104 330) ((emacs (25 1))) "Query external dictionary like goldendict, Bob.app etc" tar ((:url . "https://repo.or.cz/external-dict.el.git") (:commit . "018cc2bad2e8bf29914d39b0119e836fa0f9dc18") (:revdesc . "018cc2bad2e8") (:keywords "wp" "processes"))]) + (extmap . [(20230907 1959) ((emacs (24 4))) "Externally-stored constant mapping for Elisp" tar ((:url . "https://github.com/doublep/extmap") (:commit . "3b0f898057082a1c01584ff2bbaf5fd4d22c1400") (:revdesc . "3b0f89805708") (:keywords "lisp") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com"))]) + (exunit . [(20251101 1233) ((s (1 11 0)) (emacs (24 3)) (f (0 20 0)) (transient (0 3 6)) (project (0 9 8))) "ExUnit test runner" tar ((:url . "http://github.com/ananthakumaran/exunit.el") (:commit . "632298249150f8e6cf83175edcb0a13158deabc2") (:revdesc . "632298249150") (:keywords "processes" "elixir" "exunit") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com"))]) + (exwm-edit . [(20240418 2142) ((emacs (27 1))) "Edit mode for EXWM" tar ((:url . "https://github.com/agzam/exwm-edit") (:commit . "046b8c11f71bfd6c798df770c6b7708af2c187a2") (:revdesc . "046b8c11f71b") (:keywords "convenience"))]) + (exwm-firefox-core . [(20251107 2150) ((emacs (24 4)) (exwm (0 16))) "Firefox hotkeys to functions" tar ((:url . "https://github.com/walseb/exwm-firefox-core") (:commit . "d8e599b7584f5570f3e50e111248d1d857cd5641") (:revdesc . "d8e599b7584f") (:keywords "extensions") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com"))]) + (exwm-firefox-evil . [(20250311 952) ((emacs (24 4)) (exwm (0 16)) (evil (1 0 0)) (exwm-firefox-core (1 0))) "Evil-mode implementation of exwm-firefox-core" tar ((:url . "https://github.com/walseb/exwm-firefox-evil") (:commit . "c87d601de9bad4d3cbf41c69281073b465a66769") (:revdesc . "c87d601de9ba") (:keywords "extensions") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com"))]) + (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 ((:url . "https://gitlab.com/mtekman/exwm-float.el") (:commit . "047c83aa6b54bfb6ca8cac4d3ea18542611cef77") (:revdesc . "047c83aa6b54") (:keywords "outlines"))]) + (exwm-mff . [(20210603 1723) ((emacs (25 1))) "Mouse Follows Focus" tar ((:url . "https://github.com/ieure/exwm-mff") (:commit . "89206f2e3189f589c27c56bd2b6203e906ee7100") (:revdesc . "89206f2e3189") (:keywords "unix") (:authors ("Ian Eure" . "public@lowbar.fyi")) (:maintainers ("Ian Eure" . "public@lowbar.fyi")) (:maintainer "Ian Eure" . "public@lowbar.fyi"))]) + (exwm-modeline . [(20250222 1334) ((emacs (27 1)) (exwm (0 26))) "A modeline segment for EXWM workspaces" tar ((:url . "https://github.com/SqrtMinusOne/exwm-modeline") (:commit . "c933baccb8535a81ebae06a5dc4245b801c47f06") (:revdesc . "c933baccb853") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (exwm-surf . [(20171204 1140) ((emacs (24 4)) (exwm (0 16))) "Interface for Surf (surf.suckless.org) under exwm" tar ((:url . "https://github.com/ecraven/exwm-surf") (:commit . "6c17e2c1597fe4b7b454a1dac23b9127ac951e94") (:revdesc . "6c17e2c1597f") (:keywords "extensions") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net"))]) + (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 ((:url . "https://github.com/tumashu/exwm-x") (:commit . "1e2bbfca872ad76eaa8f1c00d17762bed256881a") (:revdesc . "1e2bbfca872a") (:keywords "window-manager" "exwm") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (eyebrowse . [(20240407 1342) ((dash (2 7 0)) (emacs (24 3 1))) "Easy window config switching" tar ((:url . "https://depp.brause.cc/eyebrowse") (:commit . "473381f4f9e847eb50a40ef2306c027432789754") (:revdesc . "473381f4f9e8") (:keywords "convenience") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (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 ((:url . "https://github.com/FrostyX/eyebrowse-restore") (:commit . "abb3877e12b41740305741deec37ca681b896e82") (:revdesc . "abb3877e12b4") (:keywords "convenience" "eyebrowse" "helm" "persistent") (:authors ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainers ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainer "Jakub Kadlčík" . "frostyx@email.cz"))]) + (eyuml . [(20141028 2227) ((request (0 2 0)) (s (1 8 0))) "Write textual uml diagram from emacs using yuml.me" tar ((:url . "http://github.com/antham/eyuml") (:commit . "2f259c201c6cc63ee608f75cd85c1ae27f9d2532") (:revdesc . "2f259c201c6c") (:keywords "uml") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainers ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com"))]) + (ez-query-replace . [(20210724 2247) ((dash (1 2 0)) (s (1 11 0))) "A smarter context-sensitive query-replace that can be reapplied" tar ((:url . "https://github.com/Wilfred/ez-query-replace") (:commit . "2b68472f4007a73908c3b242e83ac5a7587967ff") (:revdesc . "2b68472f4007") (: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 ((:url . "https://github.com/thblt/eziam-theme-emacs") (:commit . "8223acc0218130ad2493c1476ad3736ee4fdbb8f") (:revdesc . "8223acc02181") (:keywords "faces") (:authors ("Thibault Polge" . "thibault@thb.lt")) (:maintainers ("Thibault Polge" . "thibault@thb.lt")) (:maintainer "Thibault Polge" . "thibault@thb.lt"))]) + (f . [(20241003 1131) ((emacs (24 1)) (s (1 7 0)) (dash (2 2 0))) "Modern API for working with files and directories" tar ((:url . "http://github.com/rejeep/f.el") (:commit . "931b6d0667fe03e7bf1c6c282d6d8d7006143c52") (:revdesc . "931b6d0667fe") (:keywords "files" "directories") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com"))]) + (f3 . [(20180130 1158) ((emacs (24 3)) (helm (2 8 8)) (cl-lib (0 5))) "A helm interface to find" tar ((:url . "https://github.com/cosmicexplorer/f3") (:commit . "000009ce4adf7a57eae80512f29c4ec2a1391ce5") (:revdesc . "000009ce4adf") (:keywords "find" "file" "files" "helm" "fast" "finder"))]) + (fabric . [(20171116 656) nil "Launch Fabric using Emacs" tar ((:url . "https://github.com/nlamirault/fabric.el") (:commit . "df79be341d0b34ed23850f9894136092fa5fea8c") (:revdesc . "df79be341d0b") (:keywords "python" "fabric") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@chmouel.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@chmouel.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@chmouel.com"))]) + (face-explorer . [(20250117 932) nil "Tools for faces and text properties" tar ((:url . "https://github.com/Lindydancer/face-explorer") (:commit . "4dc83bffbaf41c22795556fed63f8dc938efd9b8") (:revdesc . "4dc83bffbaf4") (:keywords "faces"))]) + (faceup . [(20170925 1946) nil "Markup language for faces and font-lock regression testing" tar ((:url . "https://github.com/Lindydancer/faceup") (:commit . "6c92dad56a133e14e7b27831e1bcf9b3a71ff154") (:revdesc . "6c92dad56a13") (:keywords "faces" "languages"))]) + (factlog . [(20130210 140) ((deferred (0 3 1))) "File activity logger" tar ((:url . "https://github.com/tkf/factlog") (:commit . "38f78132ae311faffba98ed5dd18d661af68678e") (:revdesc . "38f78132ae31") (:authors ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainers ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com"))]) + (faff-theme . [(20251120 1400) nil "Light Emacs color theme on cornsilk3 background" tar ((:url . "https://github.com/WJCFerguson/emacs-faff-theme") (:commit . "e8b6b4b5669fb41f0dd4fdcbcb88b5b9ab803f53") (:revdesc . "e8b6b4b5669f") (:keywords "color" "theme") (:authors ("James Ferguson" . "")) (:maintainers ("James Ferguson" . "")) (:maintainer "James Ferguson" . ""))]) + (fakir . [(20140729 1652) ((noflet (0 0 8)) (dash (1 3 2)) (kv (0 0 19))) "Fakeing bits of Emacs" tar ((:url . "http://github.com/nicferrier/emacs-fakir") (:commit . "1fca406ad7de80fece6319ff75d4230b648534b0") (:revdesc . "1fca406ad7de") (:keywords "lisp" "tools") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (fancy-battery . [(20150101 1204) ((emacs (24 1))) "Fancy battery display" tar ((:url . "https://github.com/lunaryorn/fancy-battery.el") (:commit . "bcc2d7960ba207b5b4db96fe40f7d72670fdbb68") (:revdesc . "bcc2d7960ba2") (:keywords "convenience" "tools" "hardware") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com"))]) + (fancy-compilation . [(20251214 1102) ((emacs (26 1))) "Enhanced compilation output" tar ((:url . "https://codeberg.org/ideasman42/emacs-fancy-compilation") (:commit . "502d36e0fb4c4daedc16ea5d732dcbc8285d6fb1") (:revdesc . "502d36e0fb4c") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (fancy-dabbrev . [(20220211 633) ((emacs (25 1)) (popup (0 5 3))) "Like dabbrev-expand with preview and popup menu" tar ((:url . "https://github.com/jrosdahl/fancy-dabbrev") (:commit . "cf4a2f7e3e43e07ab9aa9db16532a21010e9fc8c") (:revdesc . "cf4a2f7e3e43") (:authors ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainers ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainer "Joel Rosdahl" . "joel@rosdahl.net"))]) + (fancy-narrow . [(20171031 16) nil "Narrow-to-region with more eye candy" tar ((:url . "http://github.com/Bruce-Connor/fancy-narrow") (:commit . "9f4a587f6a5a387271fb665e13f59d41fd42504c") (:revdesc . "9f4a587f6a5a") (:keywords "faces" "convenience") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (fancy-urls-menu . [(20241216 2300) ((emacs (29 1))) "Interface for viewing and opening URLs in current buffer" tar ((:url . "https://codeberg.org/kakafarm/emacs-fancy-urls-menu/") (:commit . "88135b9964edd47f849830308e9be17813598432") (:revdesc . "88135b9964ed") (:keywords "convenience") (:maintainers (nil . "yuval.langer@gmail.com")) (:maintainer nil . "yuval.langer@gmail.com"))]) + (fantom-mode . [(20221227 218) ((emacs (24 3))) "A major mode for the Fantom programming language" tar ((:url . "https://github.com/thechampagne/fantom-mode") (:commit . "51cd82d29a7dca7bfd043971ba1d0fd21ed11693") (:revdesc . "51cd82d29a7d") (:keywords "files" "fantom"))]) + (fantom-theme . [(20200328 604) ((emacs (24 1))) "Dark theme based on Phantom Code for VSCode" tar ((:url . "https://github.com/adsva/fantom-emacs-theme") (:commit . "2c1c7fd53086c2ff86ee0961642c3b58e2343c08") (:revdesc . "2c1c7fd53086"))]) + (fanyi . [(20230926 1849) ((emacs (27 1)) (s (1 12 0))) "Not only English-Chinese translator" tar ((:url . "https://github.com/condy0919/fanyi.el") (:commit . "df91f2d69b7dbd9b7ebb8f54085aee74f22ad3f5") (:revdesc . "df91f2d69b7d") (:keywords "convenience" "tools") (:authors ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainers ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainer "Zhiwei Chen" . "condy0919@gmail.com"))]) + (farmhouse-themes . [(20221025 2054) nil "Farmhouse Themes, dark and light versions" tar ((:url . "https://github.com/emacsorphanage/farmhouse-themes") (:commit . "30c763d01611dad88f1a1ff88451431e2629016d") (:revdesc . "30c763d01611") (: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 ((:url . "https://framagit.org/steckerhalter/emacs-fasd") (:commit . "c1d92553f33ebb018135c698db1a6d7f86731a26") (:revdesc . "c1d92553f33e") (:keywords "cli" "bash" "zsh" "autojump"))]) + (fast-scroll . [(20191016 327) ((emacs (25 1)) (cl-lib (0 6 1))) "Some utilities for faster scrolling over large buffers" tar ((:url . "https://github.com/ahungry/fast-scroll") (:commit . "3f6ca0d5556fe9795b74714304564f2295dcfa24") (:revdesc . "3f6ca0d5556f") (:keywords "ahungry" "convenience" "fast" "scroll" "scrolling") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (fastbuild-bff-mode . [(20251215 1553) ((emacs (26 1))) "Major mode for FASTBuild BFF files" tar ((:url . "https://github.com/cyberkm/fastbuild-bff-mode") (:commit . "14f60c94c08c37e45a7d7205867b804dfc059160") (:revdesc . "14f60c94c08c") (:keywords "languages" "tools" "build") (:authors ("Pavel Bibergal" . "cyberkm@gmail.com")) (:maintainers ("Pavel Bibergal" . "cyberkm@gmail.com")) (:maintainer "Pavel Bibergal" . "cyberkm@gmail.com"))]) + (fastdef . [(20160713 1329) ((ivy (0 7 0)) (w3m (0 0))) "Insert terminology from Google top search results" tar ((:url . "http://github.com/redguardtoo/fastdef") (:commit . "0696f41dc150d35ce31fe8d2ea74f4173818bb55") (:revdesc . "0696f41dc150") (:keywords "terminology" "org-mode" "markdown") (:authors ("Chen Bin" . "cheninDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "cheninDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "cheninDOTshATgmailDOTcom"))]) + (fastnav . [(20120211 1457) nil "Fast navigation and editing routines" tar ((:url . "https://github.com/gleber/fastnav.el") (:commit . "1019ba2b61d1a070204099b23da347278a61bc89") (:revdesc . "1019ba2b61d1") (:keywords "nav" "fast" "fastnav" "navigation") (:authors ("Zsolt Terek" . "zsolt@google.com")) (:maintainers ("Zsolt Terek" . "zsolt@google.com")) (:maintainer "Zsolt Terek" . "zsolt@google.com"))]) + (faust-mode . [(20201004 1353) nil "Faust syntax colorizer for Emacs" tar ((:url . "https://github.com/rukano/emacs-faust-mode") (:commit . "2a56cda14b152d5471f21a5d82f23c141dc7134c") (:revdesc . "2a56cda14b15") (:keywords "languages" "faust") (:authors ("rukano" . "rukano@gmail.com")) (:maintainers ("Yassin Philip" . "xaccrocheur@gmail.com")) (:maintainer "Yassin Philip" . "xaccrocheur@gmail.com"))]) + (faustine . [(20171122 1202) ((emacs (24 3)) (faust-mode (0 3))) "Edit, visualize, build and run Faust code" tar ((:url . "https://bitbucket.org/yphil/faustine") (:commit . "07a38963111518f86123802f9d477be0d4689a3f") (:revdesc . "07a389631115") (:keywords "languages" "faust") (:authors ("Yassin Philip" . "xaccrocheur@gmail.com")) (:maintainers ("Yassin Philip" . "xaccrocheur@gmail.com")) (:maintainer "Yassin Philip" . "xaccrocheur@gmail.com"))]) + (fb2-reader . [(20250326 2240) ((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 ((:url . "https://github.com/jumper047/fb2-reader") (:commit . "5244d481ed19fc9c4dff7f6394fd68e400b828a3") (:revdesc . "5244d481ed19") (:keywords "multimedia" "ebook" "fb2") (:authors ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainers ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainer "Dmitriy Pshonko" . "jumper047@gmail.com"))]) + (fcitx . [(20240121 1829) nil "Make fcitx better in Emacs" tar ((:url . "https://github.com/cute-jumper/fcitx.el") (:commit . "b399482ed8db5893db2701df01db4c38cccda495") (:revdesc . "b399482ed8db") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (fcopy . [(20150304 1403) nil "Funny Copy, set past point HERE then search copy text" tar ((:url . "https://github.com/ataka/fcopy") (:commit . "e355f6ec889d8ecbdb096019c2dc660b1cec4941") (:revdesc . "e355f6ec889d") (:keywords "convenience") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainers ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com"))]) + (fd-dired . [(20210723 549) ((emacs (25))) "Find-dired alternative using fd" tar ((:url . "https://github.com/yqrashawn/fd-dired") (:commit . "458464771bb220b6eb87ccfd4c985c436e57dc7e") (:revdesc . "458464771bb2") (:keywords "tools" "fd" "find" "dired") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainers ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com"))]) + (feature-mode . [(20251015 2134) ((emacs (28 1))) "Major mode for editing Gherkin (i.e. Cucumber) user stories" tar ((:url . "https://github.com/freesteph/cucumber.el") (:commit . "8d43c37ddf986af769870da27c31c1911f35b205") (:revdesc . "8d43c37ddf98"))]) + (fedi . [(20250812 645) ((emacs (28 1)) (markdown-mode (2 5))) "Helper functions for fediverse clients" tar ((:url . "https://codeberg.org/martianh/fedi.el") (:commit . "a9df02f835899d0a587d236b1fa4d16e53af9039") (:revdesc . "a9df02f83589") (:authors ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainers ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainer "Marty Hiatt" . "mousebot@disroot.org"))]) + (feebleline . [(20190822 1401) nil "Replace modeline with a slimmer proxy" tar ((:url . "https://github.com/tautologyclub/feebleline") (:commit . "b2f2db25cac77817bf0c49ea2cea6383556faea0") (:revdesc . "b2f2db25cac7") (:authors ("Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com")) (:maintainers ("Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com")) (:maintainer "Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com"))]) + (feed-discovery . [(20200714 1118) ((emacs (25 1)) (dash (2 16 0))) "Discover feed url by RSS/Atom autodiscovery" tar ((:url . "https://github.com/HKey/feed-discovery") (:commit . "3812439c845c184eaf164d3ac8935de135259855") (:revdesc . "3812439c845c") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com"))]) + (feline . [(20230301 1350) ((emacs (28 1))) "A modeline with very little" tar ((:url . "https://opensource.chee.party/chee/feline-mode") (:commit . "8c46b1be9e45a38281aa9ddae79fda3c8e4cb5c5") (:revdesc . "8c46b1be9e45") (:authors ("chee" . "emacs@chee.party")) (:maintainers ("chee" . "emacs@chee.party")) (:maintainer "chee" . "emacs@chee.party"))]) + (fennel-mode . [(20251028 2216) ((emacs (26 1))) "A major-mode for editing Fennel code" tar ((:url . "https://git.sr.ht/~technomancy/fennel-mode") (:commit . "c1bccdec9e8923247c9b1a5ffcf14039d2ddb227") (:revdesc . "c1bccdec9e89") (:keywords "languages" "tools"))]) + (fetch . [(20131201 730) nil "Fetch and unpack resources" tar ((:url . "https://github.com/crshd/fetch.el") (:commit . "3f2793afcbbc32f320e572453166f9354ecc6d06") (:revdesc . "3f2793afcbbc") (:authors ("Christian 'crshd' Brassat" . "christian.brassat@gmail.com")) (:maintainers ("Christian 'crshd' Brassat" . "christian.brassat@gmail.com")) (:maintainer "Christian 'crshd' Brassat" . "christian.brassat@gmail.com"))]) + (ffmpeg-player . [(20250101 1007) ((emacs (24 4)) (s (1 12 0)) (f (0 20 0))) "Play video using ffmpeg" tar ((:url . "https://github.com/jcs-elpa/ffmpeg-player") (:commit . "dfc78152925c62a575bb135f320b74c1b4a71f2c") (:revdesc . "dfc78152925c") (:keywords "multimedia" "video" "ffmpeg" "buffering" "images") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (ffmpeg-utils . [(20230305 709) ((emacs (25 1)) (alert (1 2)) (transient (0 1 0))) "FFmpeg command utilities wrappers" tar ((:url . "https://repo.or.cz/ffmpeg-utils.git") (:commit . "064d61527bc6b6a1d0fb0065f8a7bae3bbd4cefc") (:revdesc . "064d61527bc6") (:keywords "multimedia"))]) + (fic-mode . [(20180603 2035) nil "Show FIXME/TODO/BUG(...) in special face only in comments and strings" tar ((:url . "https://github.com/lewang/fic-mode") (:commit . "a05fc36ed54ba0c6dc22ac216a6a72cf191ca13d") (:revdesc . "a05fc36ed54b"))]) + (fifo-class . [(20160425 558) nil "First in first out abstract class" tar ((:url . "https://github.com/mola-T/fifo-class") (:commit . "8fe4cf690727f4ac7b67f29c55f845df023c3f21") (:revdesc . "8fe4cf690727") (:keywords "lisp") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainers ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz"))]) + (figlet . [(20160218 2237) nil "Annoy people with big, ascii art text" tar ((:url . "https://github.com/jpkotta/figlet") (:commit . "19a38783a90e151faf047ff233a21a729db0cea9") (:revdesc . "19a38783a90e") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainers ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))]) + (file-info . [(20251107 1738) ((emacs (28 1)) (hydra (0 15 0)) (browse-at-remote (0 15 0))) "Show pretty information about current file" tar ((:url . "https://github.com/artawower/file-info.el") (:commit . "5d8c5158a57e0077410bcdb802c344f5e8da4aca") (:revdesc . "5d8c5158a57e") (:authors ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainers ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainer "Artur Yaroshenko" . "artawower@protonmail.com"))]) + (filelock . [(20180524 2215) ((emacs (24)) (cl-lib (0)) (f (0))) "Functions for manipulating file locks" tar ((:url . "https://github.com/DarwinAwardWinner/emacs-filelock") (:commit . "17a5ca6e0dee14d2e7d92c84be91143bca9d9663") (:revdesc . "17a5ca6e0dee") (:keywords "extensions" "files" "tools"))]) + (filetags . [(20190706 804) ((emacs (24 4))) "Package to manage filetags in filename" tar ((:url . "https://github.com/DerBeutlin/filetags.el") (:commit . "71667a819e46eb1f6e30e2fa61321acb7c6ccb3d") (:revdesc . "71667a819e46") (:keywords "convenience" "files"))]) + (filetree . [(20241229 1923) ((dash (2 12 0)) (helm (3 7 0)) (seq (2 23)) (transient (0 4 0))) "File tree view/manipulatation package" tar ((:url . "https://github.com/knpatel401/filetree") (:commit . "dfdddc02a65b7af747f053593a9c9c2db73c45a5") (:revdesc . "dfdddc02a65b") (:authors ("Ketan Patel" . "knpatel401@gmail.com")) (:maintainers ("Ketan Patel" . "knpatel401@gmail.com")) (:maintainer "Ketan Patel" . "knpatel401@gmail.com"))]) + (fill-column-indicator . [(20200806 2239) nil "Graphically indicate the fill column" tar ((:url . "https://github.com/alpaker/fill-column-indicator") (:commit . "c35f9de072c241699b57bcb46da84bed5af29cfe") (:revdesc . "c35f9de072c2") (:keywords "convenience") (:authors ("Alp Aker" . "alp.tekin.aker@gmail.com")) (:maintainers ("Alp Aker" . "alp.tekin.aker@gmail.com")) (:maintainer "Alp Aker" . "alp.tekin.aker@gmail.com"))]) + (fill-function-arguments . [(20240213 2249) ((emacs (24 4))) "Convert function arguments to/from single line" tar ((:url . "https://github.com/davidshepherd7/fill-function-arguments") (:commit . "9def8ced5241b10067ae85c89ae34359c2e4847a") (:revdesc . "9def8ced5241") (:keywords "convenience") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com"))]) + (fill-page . [(20250101 1009) ((emacs (24 4))) "Fill buffer so you don't see empty lines at the end" tar ((:url . "https://github.com/jcs-elpa/fill-page") (:commit . "b72340d478eead21e409a7a380bc2a61bb4d8732") (:revdesc . "b72340d478ee") (:keywords "convenience" "fill" "page" "buffer") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (fillcode . [(20200524 2226) nil "Fill (wrap) function calls and expressions in source code" tar ((:url . "https://snarfed.org/fillcode") (:commit . "4d206982b6aaa493d709c84aea206cabb8b4038c") (:revdesc . "4d206982b6aa") (:authors ("Ryan Barrett" . "fillcode@ryanb.org")) (:maintainers ("Ryan Barrett" . "fillcode@ryanb.org")) (:maintainer "Ryan Barrett" . "fillcode@ryanb.org"))]) + (filldent . [(20220423 2216) ((emacs (24 1))) "Fill or indent" tar ((:url . "https://github.com/duckwork/filldent.el") (:commit . "2f32e0cf5e27c613f962fa41bf3427bbdc04e6c0") (:revdesc . "2f32e0cf5e27") (:authors ("Case Duckworth" . "acdw@acdw.net")) (:maintainers ("Case Duckworth" . "acdw@acdw.net")) (:maintainer "Case Duckworth" . "acdw@acdw.net"))]) + (find-by-pinyin-dired . [(20180210 218) ((pinyinlib (0 1 0))) "Find file by first PinYin character of Chinese Hanzi" tar ((:url . "http://github.com/redguardtoo/find-by-pinyin-dired") (:commit . "3b4781148dddc84a701ad76c0934ed991ecd59d5") (:revdesc . "3b4781148ddd") (:keywords "hanzi" "chinese" "dired" "find" "file" "pinyin") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (find-dupes-dired . [(20210426 835) ((emacs (26 1))) "Find dupes and handle in dired" tar ((:url . "https://github.com/ShuguangSun/find-dupes-dired") (:commit . "af56f75afc240d8121c8944a614a272be811830c") (:revdesc . "af56f75afc24") (:keywords "tools") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (find-file-in-project . [(20250612 234) ((emacs (25 1))) "Find file/directory and review Diff/Patch/Commit efficiently" tar ((:url . "https://github.com/redguardtoo/find-file-in-project") (:commit . "6d6e132f5e9ebcbe5b475df939c556794dd1ce64") (:revdesc . "6d6e132f5e9e") (:keywords "project" "convenience") (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (find-file-in-repository . [(20210301 2202) nil "Quickly find files in a git, mercurial or other repository" tar ((:url . "https://github.com/hoffstaetter/find-file-in-repository") (:commit . "10f5bd919ce35691addc5ce0d281597a46813a79") (:revdesc . "10f5bd919ce3") (:keywords "files" "convenience" "repository" "project" "source control") (:authors ("Samuel Hoffstaetter" . "samuel@hoffstaetter.com")) (:maintainers ("Samuel Hoffstaetter" . "samuel@hoffstaetter.com")) (:maintainer "Samuel Hoffstaetter" . "samuel@hoffstaetter.com"))]) + (find-file-rg . [(20220314 1540) ((emacs (25 1))) "Find file in project using ripgrep" tar ((:url . "https://github.com/muffinmad/emacs-find-file-rg") (:commit . "404b1cc97c2f700d3dc1c66b640f96ed5a268dc3") (:revdesc . "404b1cc97c2f") (:keywords "tools") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com"))]) + (find-temp-file . [(20240512 1635) nil "Open quickly a temporary file" tar ((:url . "https://github.com/thisirs/find-temp-file.git") (:commit . "76414b6ba8660905675ec8969f5db0adb270bb80") (:revdesc . "76414b6ba866") (:keywords "convenience") (:authors ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainers ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainer "Sylvain Rousseau" . "thisirsatgmaildotcom"))]) + (find-things-fast . [(20150519 2226) nil "Find things fast, leveraging the power of git" tar ((:url . "https://github.com/eglaysher/find-things-fast") (:commit . "281dcb5a2e2db1013246dcac5111808352a8ea95") (:revdesc . "281dcb5a2e2d") (:keywords "project" "convenience"))]) + (findr . [(20130127 2032) nil "Breadth-first file-finding facility for (X)Emacs" tar ((:url . "https://github.com/emacsorphanage/findr") (:commit . "1ddbc0464bb05dcda392b62666ad17239a2152d3") (:revdesc . "1ddbc0464bb0") (:keywords "files") (:authors ("David Bakhash" . "cadet@bu.edu")) (:maintainers ("David Bakhash" . "cadet@bu.edu")) (:maintainer "David Bakhash" . "cadet@bu.edu"))]) + (fingers . [(20160817 829) nil "Modal editing with universal text manipulation helpers" tar ((:url . "http://github.com/fgeller/fingers.el") (:commit . "7de351448a6f5ea7aa7a25db6c90d5138f87eb16") (:revdesc . "7de351448a6f") (:keywords "fingers" "modal" "editing" "workman") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainers ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com"))]) + (finito . [(20250907 1936) ((emacs (27 1)) (dash (2 19 1)) (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 ((:url . "https://github.com/LaurenceWarne/finito.el") (:commit . "be1c866c288bb0d92a24f8b5d4b64ea4d70355ef") (:revdesc . "be1c866c288b") (:keywords "outlines"))]) + (fiplr . [(20140724 645) ((grizzl (0 1 0)) (cl-lib (0 1))) "Fuzzy Search for Files in Projects" tar ((:url . "https://github.com/d11wtq/fiplr") (:commit . "bb6b90ba3c558988c195048c4c40140b2ee17530") (:revdesc . "bb6b90ba3c55") (:keywords "convenience" "usability" "project") (:authors ("Chris Corbyn" . "chris@w3style.co.uk")) (:maintainers ("Chris Corbyn" . "chris@w3style.co.uk")) (:maintainer "Chris Corbyn" . "chris@w3style.co.uk"))]) + (fira-code-mode . [(20240228 1728) ((emacs (24 4))) "Minor mode for Fira Code ligatures using prettify-symbols" tar ((:url . "https://github.com/jming422/fira-code-mode") (:commit . "c48f3f16a4b497b9e455966561bbb6638efe4900") (:revdesc . "c48f3f16a4b4") (:keywords "faces" "ligatures" "fonts" "programming-ligatures") (:authors ("Jonathan Ming" . "jming422@gmail.com")) (:maintainers ("Jonathan Ming" . "jming422@gmail.com")) (:maintainer "Jonathan Ming" . "jming422@gmail.com"))]) + (firebase-rules-mode . [(20240520 1326) ((emacs (24 3))) "Editing support for firebase.rules" tar ((:url . "https://github.com/dherbst/firebase-rules-mode") (:commit . "c88cb10251cdfce931e4fe48ce76eaa50cc7e791") (:revdesc . "c88cb10251cd") (:keywords "languages") (:authors ("Darrel Herbst" . "dherbst@gmail.com")) (:maintainers ("Darrel Herbst" . "dherbst@gmail.com")) (:maintainer "Darrel Herbst" . "dherbst@gmail.com"))]) + (firecode-theme . [(20170808 1311) ((emacs (24 0))) "An Emacs 24 theme based on FireCode (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "8b7b03ecdd41e70dab145b98906017e1392eaef4") (:revdesc . "8b7b03ecdd41"))]) + (fireplace . [(20200402 2206) nil "A cozy fireplace for emacs" tar ((:url . "https://github.com/johanvts/emacs-fireplace") (:commit . "f6c23e259349922aae25cf2898ba815a7d8f2527") (:revdesc . "f6c23e259349") (:keywords "games") (:authors ("Johan Sivertsen" . "johanvts@gmail.com")) (:maintainers ("Johan Sivertsen" . "johanvts@gmail.com")) (:maintainer "Johan Sivertsen" . "johanvts@gmail.com"))]) + (firestarter . [(20210508 1626) ((emacs (24 1))) "Execute (shell) commands on save" tar ((:url . "https://depp.brause.cc/firestarter") (:commit . "76070c9074aa363350abe6ad06143e90b3e12ab1") (:revdesc . "76070c9074aa") (:keywords "convenience") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (firrtl-mode . [(20231127 1237) ((emacs (24 3))) "Mode for working with FIRRTL files" tar ((:url . "https://github.com/ibm/firrtl-mode") (:commit . "0c7d971899f93367b78e13d70d64cfb89d80b45c") (:revdesc . "0c7d971899f9") (:keywords "languages" "firrtl") (:authors ("Schuyler Eldridge" . "schuyler.eldridge@ibm.com")) (:maintainers ("Schuyler Eldridge" . "schuyler.eldridge@ibm.com")) (:maintainer "Schuyler Eldridge" . "schuyler.eldridge@ibm.com"))]) + (firstly-search . [(20250904 5) ((emacs (29 1)) (compat (30 1))) "Search with any key: Dired, Package, Buffer menu modes" tar ((:url . "https://codeberg.org/Anoncheg/firstly-search") (:commit . "509cb483e68caf8e6ecd0f171330b91eff430583") (:revdesc . "509cb483e68c") (:keywords "matching" "isearch" "navigation" "dired" "packagemenu") (:authors (nil . "github.com/Anoncheg1,codeberg.org/Anoncheg")) (:maintainers (nil . "github.com/Anoncheg1,codeberg.org/Anoncheg")) (:maintainer nil . "github.com/Anoncheg1,codeberg.org/Anoncheg"))]) + (fish-completion . [(20240518 1403) ((emacs (25 1))) "Fish completion for pcomplete (shell and Eshell)" tar ((:url . "https://gitlab.com/Ambrevar/emacs-fish-completion") (:commit . "1256f137a2039805d4e87f8e6c11a162ed019587") (:revdesc . "1256f137a203") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz"))]) + (fish-mode . [(20240129 1213) ((emacs (24))) "Major mode for fish shell scripts" tar ((:url . "https://github.com/wwwjfy/emacs-fish") (:commit . "2526b1803b58cf145bc70ff6ce2adb3f6c246f89") (:revdesc . "2526b1803b58") (:keywords "fish" "shell") (:authors ("Tony Wang" . "wwwjfy@gmail.com")) (:maintainers ("Tony Wang" . "wwwjfy@gmail.com")) (:maintainer "Tony Wang" . "wwwjfy@gmail.com"))]) + (fit-text-scale . [(20211230 2002) ((emacs (25 1))) "Fit text by scaling" tar ((:url . "https://gitlab.com/marcowahl/fit-text-scale") (:commit . "c53c8ce606380088643463848a9ee3502b0c64f4") (:revdesc . "c53c8ce60638") (:keywords "convenience") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com"))]) + (fix-input . [(20230606 1523) ((emacs (24 4))) "Make input methods play nicely with alternative layouts" tar ((:url . "https://github.com/mrkkrp/fix-input") (:commit . "439c1ce8c0a66ecdee4a4b25a1b96197d926b1c3") (:revdesc . "439c1ce8c0a6") (:keywords "convenience" "input") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (fix-muscle-memory . [(20210702 1755) nil "Simple hacks to fix muscle memory problems" tar ((:url . "https://github.com/jonnay/fix-muscle-memory") (:commit . "b8d4b8025d758762f4459c70c3a7a209ead865ed") (:revdesc . "b8d4b8025d75") (:keywords "spelling" "typing") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainers ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net"))]) + (fix-word . [(20210319 1414) ((emacs (24 1)) (cl-lib (0 5))) "Convenient word transformation" tar ((:url . "https://github.com/mrkkrp/fix-word") (:commit . "80cf4529915c34d2d39b4d3410781a19ef264e9f") (:revdesc . "80cf4529915c") (:keywords "word" "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (fixed-page-mode . [(20230531 929) ((emacs (24 3))) "A fixed page length mode" tar ((:url . "https://gitlab.com/igorwojnicki/fixed-page-mode") (:commit . "608dd1120d35b02a02570f024c585f7569508586") (:revdesc . "608dd1120d35") (:keywords "wp") (:authors ("Igor Wojnicki" . "wojnicki@gmail.com")) (:maintainers ("Igor Wojnicki" . "wojnicki@gmail.com")) (:maintainer "Igor Wojnicki" . "wojnicki@gmail.com"))]) + (fixmee . [(20230415 2027) ((button-lock (1 0 2)) (nav-flash (1 0 0)) (back-button (0 6 0)) (smartrep (0 0 3)) (string-utils (0 3 2)) (tabulated-list (0))) "Quickly navigate to FIXME notices in code" tar ((:url . "http://github.com/rolandwalker/fixmee") (:commit . "54500aaa8ae019034dc170af33f43465f5f03123") (:revdesc . "54500aaa8ae0") (:keywords "navigation" "convenience") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (fj . [(20251030 1345) ((emacs (29 1)) (fedi (0 2)) (tp (0 5)) (transient (0 9 3)) (magit (4 3 8))) "Client for Forgejo instances" tar ((:url . "https://codeberg.org/martianh/fj.el") (:commit . "79a1ef1006f6f8da6bbdcaf05ae8888a79f6887e") (:revdesc . "79a1ef1006f6") (:keywords "git" "convenience") (:authors ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainers ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainer "Marty Hiatt" . "mousebot@disroot.org"))]) + (flame . [(20180303 2016) ((emacs (24))) "Automatic generation of flamage, as if we needed more" tar ((:url . "https://github.com/mschuldt/flame") (:commit . "2cfb860a483197e92a4c20d7b9b055d586e76fe0") (:revdesc . "2cfb860a4831") (:keywords "games") (:authors ("Ian G. Batten" . "batten@uk.ac.bham.multics") ("Noah Friedman" . "friedman@splode.com")) (:maintainers ("Noah Friedman" . "friedman@splode.com")) (:maintainer "Noah Friedman" . "friedman@splode.com"))]) + (flames-of-freedom . [(20191202 1637) ((emacs (25 1))) "The flames of freedom" tar ((:url . "https://github.com/wiz21b/FlamesOfFreedom") (:commit . "5e47ff27cfa2f7c06081be2ffefe91a731efd012") (:revdesc . "5e47ff27cfa2") (:keywords "multimedia") (:authors ("Stéphane Champailler" . "schampailler@skynet.be")) (:maintainers ("Stéphane Champailler" . "schampailler@skynet.be")) (:maintainer "Stéphane Champailler" . "schampailler@skynet.be"))]) + (flappymacs . [(20171023 1004) nil "Flappybird clone for emacs" tar ((:url . "https://github.com/taksatou/flappymacs") (:commit . "fac0011983251d5c44f4ed1eacac03f5de3caac4") (:revdesc . "fac001198325") (:keywords "games"))]) + (flash-region . [(20130923 1817) nil "Flash a region" tar ((:url . "https://github.com/Fuco1/flash-region") (:commit . "261b3597b23cdd40e5c14262a5687bcc6c1d0901") (:revdesc . "261b3597b23c") (:keywords "utility") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (flatbuffers-mode . [(20210710 1004) ((emacs (24 3))) "Major mode for editing flatbuffers" tar ((:url . "https://github.com/Asalle/flatbuffers-mode") (:commit . "8e7783db45a64c9456130fd0c108ac12d45a7789") (:revdesc . "8e7783db45a6") (:keywords "flatbuffers" "languages") (:authors ("Asal Mirzaieva" . "asalle.kim@gmail.com")) (:maintainers ("Asal Mirzaieva" . "asalle.kim@gmail.com")) (:maintainer "Asal Mirzaieva" . "asalle.kim@gmail.com"))]) + (flatfluc-theme . [(20230721 538) ((emacs (26 1))) "Custom merge of flucui and flatui themes" tar ((:url . "https://github.com/seblemaguer/flatfluc-theme") (:commit . "9c9ae6f34aa8fca537cdd8a899b337ba8302fb9d") (:revdesc . "9c9ae6f34aa8") (:keywords "lisp") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainers ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie"))]) + (flatland-black-theme . [(20170808 1312) ((emacs (24 0))) "An Emacs 24 theme based on Flatland Black (tmTheme)" tar ((:url . "https://github.com/emacsfodder/flatland-black-theme") (:commit . "348c5d5fe615e6ea13cadc17f046e506e789ce07") (:revdesc . "348c5d5fe615"))]) + (flatland-theme . [(20171113 1521) nil "A simple theme for Emacs based on the Flatland theme for Sublime Text" tar ((:url . "http://github.com/gregchapple/flatland-emacs") (:commit . "a98a6f19ad4dff0fa3fad1ea487b7d0ef634a19a") (:revdesc . "a98a6f19ad4d") (:authors ("Greg Chapple" . "info@gregchapple.com")) (:maintainers ("Greg Chapple" . "info@gregchapple.com")) (:maintainer "Greg Chapple" . "info@gregchapple.com"))]) + (flatui-dark-theme . [(20170513 1422) ((emacs (24))) "Dark color theme with colors from https://flatuicolors.com/" tar ((:url . "https://github.com/theasp/flatui-dark-theme") (:commit . "5b959a9f743f891e4660b1b432086417947872ea") (:revdesc . "5b959a9f743f") (:keywords "color" "theme" "dark" "flatui" "faces") (:authors ("Andrew Phillips" . "theasp@gmail.com")) (:maintainers ("Andrew Phillips" . "theasp@gmail.com")) (:maintainer "Andrew Phillips" . "theasp@gmail.com"))]) + (flatui-theme . [(20160619 127) nil "A color theme for Emacs based on flatuicolors.com" tar ((:url . "https://github.com/john2x/flatui-theme.el") (:commit . "9c15db5526c15c8dba55023f5698372b19c2a780") (:revdesc . "9c15db5526c1") (:authors ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainers ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainer "John Louis Del Rosario" . "john2x@gmail.com"))]) + (fleetish-theme . [(20230407 1438) ((emacs (24))) "A take on the JetBrains Fleet theme" tar ((:url . "https://github.com/nylar/fleetish-emacs-theme") (:commit . "482513562b6691c7f3440b62a31033d22378ed96") (:revdesc . "482513562b66") (:authors ("Scott Raine" . "scott@raine.sh")) (:maintainers ("Scott Raine" . "scott@raine.sh")) (:maintainer "Scott Raine" . "scott@raine.sh"))]) + (flex-autopair . [(20120809 1218) nil "Automatically insert pair braces and quotes, insertion conditions & actions are highly customizable" tar ((:url . "https://github.com/uk-ar/flex-autopair.el") (:commit . "55d128749cc070551a1624a4508d1c4f6d76f7cf") (:revdesc . "55d128749cc0") (:keywords "keyboard" "input") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainers ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com"))]) + (flex-compile . [(20251218 243) ((emacs (26 1)) (dash (2 17 0)) (buffer-manage (1 1))) "Run, evaluate and compile across many languages" tar ((:url . "https://github.com/plandes/flex-compile") (:commit . "f15d23afabd03c39583b1a87dd847a91cb7bfe34") (:revdesc . "f15d23afabd0") (:keywords "compilation" "integration" "processes"))]) + (flex-isearch . [(20170308 2010) nil "Flex matching (like ido) in isearch" tar ((:url . "https://bitbucket.org/jpkotta/flex-isearch") (:commit . "b1f7e04de762282c276343cc2709af9ff4abc9d2") (:revdesc . "b1f7e04de762") (:keywords "convenience" "search") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainers ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))]) + (flexoki-themes . [(20250228 1934) ((emacs (27 1))) "An inky color scheme for prose and code" tar ((:url . "https://github.com/crmsnbleyd/flexoki-emacs-theme") (:commit . "4ca5d80bc4f33b5ace8950f0c00069539835fab4") (:revdesc . "4ca5d80bc4f3") (:keywords "faces" "theme") (:authors ("Andrew Jose" . "mail@drewsh.com")) (:maintainers ("Andrew Jose" . "mail@drewsh.com")) (:maintainer "Andrew Jose" . "mail@drewsh.com"))]) + (flim . [(20251102 2052) ((emacs (24 5)) (apel (0)) (oauth2 (0 17))) "Basic message representation and encoding features" tar ((:url . "https://github.com/emacsmirror/flim") (:commit . "b7265bae4b11a1434f5c0acf78ba13580bf00cfc") (:revdesc . "b7265bae4b11") (:keywords "mime" "multimedia" "mail" "news"))]) + (flimenu . [(20200810 1510) ((emacs (24 4))) "Flatten imenu automatically" tar ((:url . "https://github.com/IvanMalison/flimenu") (:commit . "4c0ff37cf3bd6c836bd136b5f6c450560a6c92b9") (:revdesc . "4c0ff37cf3bd") (:keywords "imenu" "browse" "structure" "hook" "mode" "matching" "tools" "convenience" "files") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (fliptext . [(20171124 2056) nil "Input method for flipping characters upside down" tar ((:url . "https://github.com/andre-r/fliptext.el") (:commit . "fd821f645ffebae6ae3894afa7ba7fc06f91afc6") (:revdesc . "fd821f645ffe") (:keywords "games" "i18n") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainers ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de"))]) + (floobits . [(20211018 550) ((json (1 2)) (highlight (0))) "Floobits plugin for real-time collaborative editing" tar ((:url . "http://github.com/Floobits/floobits-emacs") (:commit . "93b3317fb6c842efe165e54c8a32bf51d436837d") (:revdesc . "93b3317fb6c8") (:keywords "comm" "tools"))]) + (flow-js2-mode . [(20191213 1004) ((flow-minor-mode (0)) (js2-mode (0)) (emacs (25 1))) "Support for flow annotations in js2-mode" tar ((:url . "https://github.com/Fuco1/flow-js2-mode") (:commit . "7520bdda70287e8d57b3f41033b1e0ca59a3be95") (:revdesc . "7520bdda7028") (:keywords "languages" "extensions") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (flow-minor-mode . [(20200905 1730) ((emacs (25 1))) "Flow type mode based on web-mode" tar ((:url . "https://github.com/an-sh/flow-minor-mode") (:commit . "804217a15a28f6918fba93c91d495ed7d50b0495") (:revdesc . "804217a15a28"))]) + (flower . [(20220416 1744) ((emacs (24 4)) (clomacs (0 0 4))) "Emacs task tracker client" tar ((:url . "https://github.com/FlowerAutomation/flower") (:commit . "047846409867b2dd0ba4e2047a414b498680cd9c") (:revdesc . "047846409867") (:keywords "hypermedia" "outlines" "tools" "vc") (:authors ("Sergey Sobko" . "flower@tpg.am")) (:maintainers ("Sergey Sobko" . "flower@tpg.am")) (:maintainer "Sergey Sobko" . "flower@tpg.am"))]) + (flucui-themes . [(20200815 2103) ((emacs (24))) "Custom theme inspired by the Flat UI palette" tar ((:url . "https://github.com/MetroWind/flucui-theme") (:commit . "6591b5093e6e8f0e720e3995a16a91835b2e7a48") (:revdesc . "6591b5093e6e") (:keywords "lisp") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainers ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com"))]) + (flutter . [(20240823 1231) ((emacs (26 1))) "Tools for working with Flutter SDK" tar ((:url . "https://github.com/amake/flutter.el") (:commit . "e71235d400787d977da7ed792709437899c2a03c") (:revdesc . "e71235d40078") (:keywords "languages"))]) + (flutter-l10n-flycheck . [(20240823 1231) ((emacs (26 1)) (flycheck (30)) (flutter (0 1 0))) "Flycheck checker for intl_translation" tar ((:url . "https://github.com/amake/flutter.el") (:commit . "e71235d400787d977da7ed792709437899c2a03c") (:revdesc . "e71235d40078") (:keywords "languages"))]) + (fluxus-mode . [(20210715 58) ((osc (0 1)) (emacs (24 4))) "Major mode for interfacing with Fluxus" tar ((:url . "https://github.com/defaultxr/fluxus-mode") (:commit . "a14578640c578a4fd09cb7e25da1e87d637719ae") (:revdesc . "a14578640c57") (:keywords "languages") (:authors ("modula t." . "defaultxr@gmail.com")) (:maintainers ("modula t." . "defaultxr@gmail.com")) (:maintainer "modula t." . "defaultxr@gmail.com"))]) + (flx . [(20240205 356) ((cl-lib (0 3))) "Fuzzy matching with good sorting" tar ((:url . "https://github.com/lewang/flx") (:commit . "4b1346eb9a8a76ee9c9dede69738c63ad97ac5b6") (:revdesc . "4b1346eb9a8a"))]) + (flx-ido . [(20240205 356) ((flx (0 1)) (cl-lib (0 3))) "Flx integration for ido" tar ((:url . "https://github.com/lewang/flx") (:commit . "4b1346eb9a8a76ee9c9dede69738c63ad97ac5b6") (:revdesc . "4b1346eb9a8a"))]) + (flx-isearch . [(20191119 515) ((emacs (24)) (flx (20140821)) (cl-lib (0 5))) "Fuzzy incremental searching for emacs" tar ((:url . "https://github.com/pythonnut/flx-isearch") (:commit . "a44097fb8f539a193c2f09a37ea52a68f2c51839") (:revdesc . "a44097fb8f53") (:keywords "convenience" "search" "flx") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com"))]) + (flycheck . [(20251128 1706) ((emacs (27 1)) (seq (2 24))) "On-the-fly syntax checking" tar ((:url . "https://www.flycheck.org") (:commit . "62570fafbedb8fa3f7d75a50a9364feca3b294ef") (:revdesc . "62570fafbedb") (:keywords "convenience" "languages" "tools") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Clément Pit-Claudel" . "clement.pitclaudel@live.com") ("fmdkdd" . "fmdkdd@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com"))]) + (flycheck-actionlint . [(20230802 913) ((emacs (26)) (flycheck (32))) "Flycheck integration for actionlint" tar ((:url . "https://github.com/tirimia/flycheck-actionlint") (:commit . "f3baf396b534f8b874d3ae885cc1dd53b5098dff") (:revdesc . "f3baf396b534") (:keywords "convenience" "github" "linter" "flycheck"))]) + (flycheck-ameba . [(20191226 1011) ((emacs (24 4)) (flycheck (30))) "Add support for Ameba to Flycheck" tar ((:url . "https://github.com/crystal-ameba/ameba.el") (:commit . "b129dbd8e4c43077521d1c77cc94bb3d52d5ee6d") (:revdesc . "b129dbd8e4c4") (:keywords "tools" "crystal" "ameba"))]) + (flycheck-apertium . [(20181211 1038) ((flycheck (0 25))) "Apertium checkers in flycheck" tar ((:url . "http://wiki.apertium.org/wiki/Emacs") (:commit . "22b60a17836477ac1edd15dc85b14f88ca871ba9") (:revdesc . "22b60a178364") (:keywords "convenience" "tools" "xml") (:authors ("Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st"))]) + (flycheck-aspell . [(20250118 2052) ((flycheck (28 0)) (emacs (25 1))) "Aspell checker for flycheck" tar ((:url . "https://github.com/leotaku/flycheck-aspell") (:commit . "0d9291fd3422de0eedbac387e8c1eb037904f808") (:revdesc . "0d9291fd3422") (:keywords "wp" "flycheck" "spell" "aspell") (:authors ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainers ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainer "Leo Gaskin" . "leo.gaskin@le0.gs"))]) + (flycheck-ats2 . [(20170225 1636) ((emacs (24 1)) (flycheck (0 22))) "Flycheck: ATS2 support" tar ((:url . "http://github.com/drvink/flycheck-ats2") (:commit . "9f77add8408462af35bdddf87e37a661880255e3") (:revdesc . "9f77add84084") (:keywords "convenience" "tools" "languages") (:authors ("Mark Laws" . "mdl@60hz.org")) (:maintainers ("Mark Laws" . "mdl@60hz.org")) (:maintainer "Mark Laws" . "mdl@60hz.org"))]) + (flycheck-bashate . [(20200625 642) ((flycheck (0 24)) (emacs (24 4))) "Integrate bashate with flycheck" tar ((:url . "https://github.com/alexmurray/flycheck-bashate") (:commit . "69e53e84f712bafffd785d84d9304598c2df5615") (:revdesc . "69e53e84f712") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (flycheck-buf-lint . [(20250408 1011) ((emacs (26 1)) (flycheck (0 22)) (s (1 12 0))) "Flycheck checker for protobuf with buf.build" tar ((:url . "https://github.com/shuxiao9058/flycheck-buf-lint") (:commit . "0cf5eec5cf647e3156bc13be67927fa37c167902") (:revdesc . "0cf5eec5cf64") (:keywords "convenience" "tools" "buf" "protobuf") (:authors ("Aaron Ji" . "shuxiao9058@gmail.com")) (:maintainers ("Aaron Ji" . "shuxiao9058@gmail.com")) (:maintainer "Aaron Ji" . "shuxiao9058@gmail.com"))]) + (flycheck-cask . [(20240205 1721) ((emacs (24 3)) (flycheck (0 14)) (dash (2 4 0))) "Cask support in Flycheck" tar ((:url . "https://github.com/flycheck/flycheck-cask") (:commit . "0eeec5197e9d31bfcfc39380b262d65259a87d91") (:revdesc . "0eeec5197e9d") (:keywords "tools" "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com"))]) + (flycheck-cfn . [(20240512 2341) ((emacs (27 0)) (flycheck (31))) "Flycheck backend for AWS cloudformation" tar ((:url . "https://gitlab.com/worr/cfn-mode") (:commit . "b26a95a219aa700256b22fd026cace57bce1701b") (:revdesc . "b26a95a219aa") (:keywords "convenience") (:authors ("William Orr" . "will@worrbase.com")) (:maintainers ("William Orr" . "will@worrbase.com")) (:maintainer "William Orr" . "will@worrbase.com"))]) + (flycheck-checkbashisms . [(20230313 1418) ((emacs (24)) (flycheck (0 25))) "Checkbashisms checker for flycheck" tar ((:url . "https://github.com/cuonglm/flycheck-checkbashisms") (:commit . "ca8f11679c77d6702f34e773bdde185ceb47a05d") (:revdesc . "ca8f11679c77") (:keywords "convenience" "tools" "sh" "unix") (:authors ("Cuong Le" . "cuong.manhle.vn@gmail.com")) (:maintainers ("Cuong Le" . "cuong.manhle.vn@gmail.com")) (:maintainer "Cuong Le" . "cuong.manhle.vn@gmail.com"))]) + (flycheck-checkpatch . [(20240810 1951) ((emacs (25)) (flycheck (30))) "Flycheck support for checkpatch.pl tool" tar ((:url . "https://github.com/zpp0/flycheck-checkpatch") (:commit . "61710dff2828ff119968161e7118fce2a4a0b67f") (:revdesc . "61710dff2828") (:authors ("Alexander Yarygin" . "yarygin.alexander@gmail.com")) (:maintainers ("Alexander Yarygin" . "yarygin.alexander@gmail.com")) (:maintainer "Alexander Yarygin" . "yarygin.alexander@gmail.com"))]) + (flycheck-clang-analyzer . [(20211214 648) ((flycheck (0 24)) (emacs (24 4))) "Integrate Clang Analyzer with flycheck" tar ((:url . "https://github.com/alexmurray/flycheck-clang-analyzer") (:commit . "646d9f3a80046ab231a07526778695d5decad92d") (:revdesc . "646d9f3a8004") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (flycheck-clang-tidy . [(20201115 1232) ((flycheck (0 30))) "Flycheck syntax checker using clang-tidy" tar ((:url . "https://github.com/ch1bo/flycheck-clang-tidy") (:commit . "3bd947fb0dcc1e97617eab7be9e1b6e57db5e091") (:revdesc . "3bd947fb0dcc") (:keywords "convenience" "languages" "tools") (:authors ("Sebastian Nagel" . "sebastian.nagel@ncoding.at")) (:maintainers ("tastytea" . "tastytea@tastytea.de")) (:maintainer "tastytea" . "tastytea@tastytea.de"))]) + (flycheck-clangcheck . [(20150712 710) ((cl-lib (0 5)) (seq (1 7)) (flycheck (0 17))) "A Flycheck checker difinition for ClangCheck" tar ((:url . "https://github.com/kumar8600/flycheck-clangcheck") (:commit . "24a9424c484420073a24443a829fd5779752362b") (:revdesc . "24a9424c4844") (:authors ("kumar8600" . "kumar8600@gmail.com")) (:maintainers ("kumar8600" . "kumar8600@gmail.com")) (:maintainer "kumar8600" . "kumar8600@gmail.com"))]) + (flycheck-clj-kondo . [(20240218 2215) ((emacs (26 1)) (flycheck (34))) "Add clj-kondo linter to flycheck" tar ((:url . "https://github.com/borkdude/flycheck-clj-kondo") (:commit . "e38c67ba9db1ea1cbe1b61ab39b506c05efdcdbf") (:revdesc . "e38c67ba9db1") (:authors ("Michiel Borkent" . "michielborkent@gmail.com")) (:maintainers ("Michiel Borkent" . "michielborkent@gmail.com")) (:maintainer "Michiel Borkent" . "michielborkent@gmail.com"))]) + (flycheck-clojure . [(20191215 2227) ((cider (0 22 0)) (flycheck (32 -4)) (let-alist (1 0 1)) (emacs (25))) "Flycheck: Clojure support" tar ((:url . "https://github.com/clojure-emacs/squiggly-clojure") (:commit . "bc85f9dfe1bcfa66a98d2ca5da955e7eab4ae00d") (:revdesc . "bc85f9dfe1bc") (:authors ("Peter Fraenkel" . "pnf@podsnap.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Peter Fraenkel" . "pnf@podsnap.com")) (:maintainer "Peter Fraenkel" . "pnf@podsnap.com"))]) + (flycheck-clolyze . [(20190422 2134) ((flycheck (0 25)) (emacs (24))) "Add Clolyze to to flycheck" tar ((:url . "https://github.com/DLaps/flycheck-clolyze") (:commit . "9a3300eac22a7ff96accf37fa2d761c13cc38020") (:revdesc . "9a3300eac22a") (:authors ("Daniel Laps" . "daniel.laps@hhu.de")) (:maintainers ("Daniel Laps" . "daniel.laps@hhu.de")) (:maintainer "Daniel Laps" . "daniel.laps@hhu.de"))]) + (flycheck-color-mode-line . [(20230106 1829) ((flycheck (0 15)) (emacs (24 3))) "Change mode line color with Flycheck status" tar ((:url . "https://github.com/flycheck/flycheck-color-mode-line") (:commit . "df9be4c5bf26c4dc5ddaeed8179c4d66bdaa91f5") (:revdesc . "df9be4c5bf26") (:keywords "convenience" "language" "tools") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com"))]) + (flycheck-coverity . [(20170704 59) ((flycheck (0 24)) (dash (2 12 0)) (emacs (24 4))) "Integrate Coverity with flycheck" tar ((:url . "https://github.com/alexmurray/flycheck-coverity") (:commit . "cb211e3dd50413a5042eb20175be518214591c9d") (:revdesc . "cb211e3dd504") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (flycheck-credo . [(20240105 1655) ((flycheck (29))) "Flycheck checker for elixir credo" tar ((:url . "https://github.com/aaronjensen/flycheck-credo") (:commit . "e285bd042a535d0f13e0b4c5226df404cdda4033") (:revdesc . "e285bd042a53") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com"))]) + (flycheck-crystal . [(20200805 2344) ((flycheck (30))) "Add support for Crystal to Flycheck" tar ((:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode") (:commit . "f9e4db16ff9fdc6a296363aa35d19cfb4926e472") (:revdesc . "f9e4db16ff9f") (:keywords "tools" "crystal"))]) + (flycheck-css-colorguard . [(20161031 1122) ((flycheck (0 22)) (emacs (24))) "Detect similar colors in CSS" tar ((:url . "https://github.com/Simplify/flycheck-css-colorguard/") (:commit . "ae94fa0396acd99f9ec36d9572459df793f37fe8") (:revdesc . "ae94fa0396ac") (:keywords "flycheck" "css" "colorguard") (:authors ("Saša Jovanić" . "info@simplify.ba")) (:maintainers ("Saša Jovanić" . "info@simplify.ba")) (:maintainer "Saša Jovanić" . "info@simplify.ba"))]) + (flycheck-cstyle . [(20160905 2341) ((flycheck (0 24)) (emacs (24 4))) "Integrate cstyle with flycheck" tar ((:url . "https://github.com/alexmurray/flycheck-cstyle") (:commit . "002699f83253ea8e1a509a9ab6d0fce1a1650f73") (:revdesc . "002699f83253") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (flycheck-cython . [(20170724 958) ((flycheck (0 25))) "Support Cython in flycheck" tar ((:url . "https://github.com/lbolla/emacs-flycheck-cython") (:commit . "ecc4454d35ab5317ab66a04406f36f0c1dbc0b76") (:revdesc . "ecc4454d35ab") (: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 ((:url . "https://github.com/tom-tan/flycheck-d-unittest/") (:commit . "3e614f23cb4a5566fd7988dbcaaf254af81c7718") (:revdesc . "3e614f23cb4a") (:keywords "flycheck" "d") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com"))]) + (flycheck-dedukti . [(20171103 1212) ((flycheck (0 19)) (dedukti-mode (0 1))) "Flycheck integration of Dedukti" tar ((:url . "https://github.com/rafoo/flycheck-dedukti") (:commit . "3dbff5646355f39d57a3ec514f560a6b0082a1cd") (:revdesc . "3dbff5646355") (:keywords "convenience" "languages" "tools" "flycheck" "dedukti"))]) + (flycheck-deno . [(20250226 2238) ((emacs (27 1)) (flycheck (0 14))) "Flycheck for deno-lint" tar ((:url . "https://github.com/flycheck/flycheck-deno") (:commit . "d59b0cceb81b776a7143d7e25e06f7c3e71aa56f") (:revdesc . "d59b0cceb81b") (:keywords "lisp" "deno") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (flycheck-dialyxir . [(20170515 1525) ((flycheck (29))) "Flycheck checker for elixir dialyxir" tar ((:url . "https://github.com/aaronjensen/flycheck-dialyxir") (:commit . "adfb73374cb2bee75724822972f405f2ec371199") (:revdesc . "adfb73374cb2") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com"))]) + (flycheck-dialyzer . [(20160326 1430) ((flycheck (0 18))) "Support dialyzer in flycheck" tar ((:url . "https://github.com/lbolla/emacs-flycheck-dialyzer") (:commit . "a5df0db95ac69f397b5f85d325a6d88cf8974f64") (:revdesc . "a5df0db95ac6") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainers ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) + (flycheck-dmd-dub . [(20250304 1432) ((flycheck (0 24)) (f (0 18 2))) "Sets flycheck-dmd-include-paths from dub package information" tar ((:url . "http://github.com/atilaneves/flycheck-dmd-dub") (:commit . "c1bf54b7eca8951a38ce9f6ae12e07a011f03eb5") (:revdesc . "c1bf54b7eca8") (:keywords "languages") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainers ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com"))]) + (flycheck-dogma . [(20170125 721) ((flycheck (29))) "Flycheck checker for elixir dogma" tar ((:url . "https://github.com/aaronjensen/flycheck-dogma") (:commit . "7e14207a7da67dc5524a8949cb37a3d11de1db6e") (:revdesc . "7e14207a7da6") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com"))]) + (flycheck-drstring . [(20200210 1903) ((emacs (25 1)) (flycheck (0 25)) (swift-mode (8 0))) "Doc linting for Swift using DrString" tar ((:url . "https://github.com/danielmartin/flycheck-drstring") (:commit . "d8d5a560e792a6657ef5ac69934c74f1ed51372d") (:revdesc . "d8d5a560e792") (:keywords "tools" "flycheck") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainers ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es"))]) + (flycheck-dtrace . [(20180903 1630) ((emacs (25 1)) (flycheck (0 22))) "Flycheck: DTrace support" tar ((:url . "https://github.com/juergenhoetzel/flycheck-dtrace") (:commit . "951fab3a15c11d92b9fac1ea4791a80dfe034a00") (:revdesc . "951fab3a15c1") (:keywords "languages" "convenience" "tools") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info"))]) + (flycheck-eask . [(20250226 939) ((emacs (27 1)) (flycheck (0 14))) "Eask support in Flycheck" tar ((:url . "https://github.com/flycheck/flycheck-eask") (:commit . "8a7f847466935b5937e93f5ccbd4711812d962a3") (:revdesc . "8a7f84746693") (:keywords "lisp" "eask") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (flycheck-eglot . [(20251218 443) ((emacs (28 1)) (eglot (1 9)) (flycheck (32))) "Flycheck support for eglot" tar ((:url . "https://github.com/flycheck/flycheck-eglot") (:commit . "8ed9ca960ebdf500dd56a5335f9090e3cbfcd6b2") (:revdesc . "8ed9ca960ebd") (:keywords "convenience" "language" "tools") (:authors ("Sergey Firsov" . "intramurz@gmail.com")) (:maintainers ("Sergey Firsov" . "intramurz@gmail.com")) (:maintainer "Sergey Firsov" . "intramurz@gmail.com"))]) + (flycheck-eldev . [(20251025 1350) ((flycheck (32)) (dash (2 17)) (emacs (24 4))) "Eldev support in Flycheck" tar ((:url . "https://github.com/flycheck/flycheck-eldev") (:commit . "ad9e367c0caf75195e7443b666adcddf98576724") (:revdesc . "ad9e367c0caf") (:keywords "tools" "convenience") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com"))]) + (flycheck-elixir . [(20210413 612) ((flycheck (0 25))) "Support Elixir in flycheck" tar ((:url . "https://github.com/lbolla/emacs-flycheck-elixir") (:commit . "b57a77a21d6cf9621b3387831cba34135c4fa35d") (:revdesc . "b57a77a21d6c") (: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 ((:url . "https://github.com/bsermons/flycheck-elm") (:commit . "debd0af563cb6c2944367a691c7fa3021d9378c1") (:revdesc . "debd0af563cb"))]) + (flycheck-elsa . [(20230217 1640) ((emacs (25)) (flycheck (0 14)) (seq (2 0))) "Flycheck for Elsa" tar ((:url . "https://github.com/emacs-elsa/flycheck-elsa") (:commit . "d60db9544d0c4213f2478bcea0fd0e668e31cf34") (:revdesc . "d60db9544d0c") (:keywords "convenience") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (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 ((:url . "https://github.com/falcosecurity/flycheck-falco-rules") (:commit . "4bdc576abb13569354281badeaafe4abeee7fb3d") (:revdesc . "4bdc576abb13") (:keywords "tools" "convenience"))]) + (flycheck-flawfinder . [(20211214 647) ((flycheck (0 24)) (emacs (24 4))) "Integrate flawfinder with flycheck" tar ((:url . "https://github.com/alexmurray/flycheck-flawfinder") (:commit . "85701b849ea1ed8438ed4b7ae236e99d0f5528c7") (:revdesc . "85701b849ea1") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (flycheck-flow . [(20190304 1459) ((flycheck (0 18)) (json (1 4))) "Support Flow in flycheck" tar ((:url . "https://github.com/lbolla/emacs-flycheck-flow") (:commit . "9e8e52cfc98af6a23fd906f9cb5d5d470d8cf82d") (:revdesc . "9e8e52cfc98a") (: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 ((:url . "https://github.com/scturtle/flycheck-ghcmod") (:commit . "6bb7b7d879f05bbae54e99eb04806c877adf3ccc") (:revdesc . "6bb7b7d879f0") (:keywords "convenience" "languages" "tools") (:authors ("Shen Chao" . "scturtle@gmail.com")) (:maintainers ("Shen Chao" . "scturtle@gmail.com")) (:maintainer "Shen Chao" . "scturtle@gmail.com"))]) + (flycheck-golangci-lint . [(20251203 2053) ((emacs (24)) (flycheck (0 22))) "Flycheck checker for golangci-lint" tar ((:url . "https://github.com/weijiangan/flycheck-golangci-lint") (:commit . "f7e36e19d6af39d098b94a2e7524dbd7b585ce67") (:revdesc . "f7e36e19d6af") (:keywords "convenience" "tools" "go") (:authors ("Wei Jian Gan" . "weijiangan@outlook.com")) (:maintainers ("Wei Jian Gan" . "weijiangan@outlook.com")) (:maintainer "Wei Jian Gan" . "weijiangan@outlook.com"))]) + (flycheck-gometalinter . [(20180424 941) ((emacs (24)) (flycheck (0 22))) "Flycheck checker for gometalinter" tar ((:url . "https://github.com/favadi/flycheck-gometalinter") (:commit . "422f6e4b77b27fd7370f0c88437ac5072c9d3413") (:revdesc . "422f6e4b77b2") (:keywords "convenience" "tools" "go") (:authors ("Diep Pham" . "me@favadi.com")) (:maintainers ("Diep Pham" . "me@favadi.com")) (:maintainer "Diep Pham" . "me@favadi.com"))]) + (flycheck-google-cpplint . [(20250226 2239) ((emacs (27 1)) (flycheck (0 20 -4 1))) "Help to comply with the Google C++ Style Guide" tar ((:url . "https://github.com/flycheck/flycheck-google-cpplint/") (:commit . "bba4b07ef39fe2c1d404584c0a561e4e0c5dc90d") (:revdesc . "bba4b07ef39f") (:keywords "flycheck" "c" "c++") (:authors ("Akiha Senda" . "senda.akiha@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (flycheck-gradle . [(20190315 234) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Gradle" tar ((:url . "https://github.com/jojojames/flycheck-gradle") (:commit . "1ca08bbc343362a923cbdc2010f66e41655e92ab") (:revdesc . "1ca08bbc3433") (:keywords "languages" "gradle") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (flycheck-grammalecte . [(20251001 2010) ((emacs (29 1)) (flycheck (32))) "Integrate Grammalecte with Flycheck" tar ((:url . "https://git.umaneti.net/flycheck-grammalecte/") (:commit . "4b50d794a88d31c43023bed78f1815673f0c8890") (:revdesc . "4b50d794a88d") (:keywords "i18n" "text") (:authors ("Guilhem Doulcier" . "guilhem.doulcier@espci.fr") ("tienne Pflieger" . "etienne@pflieger.bzh")))]) + (flycheck-grammarly . [(20250226 2244) ((emacs (27 1)) (flycheck (0 14)) (grammarly (0 3 0)) (s (1 12 0))) "Grammarly support for Flycheck" tar ((:url . "https://github.com/emacs-grammarly/flycheck-grammarly") (:commit . "34ee0901e1de05b0c60208293c8beb9a4587e5c7") (:revdesc . "34ee0901e1de") (:keywords "convenience" "grammar" "check") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (flycheck-guile . [(20230405 1154) ((emacs (25 1)) (flycheck (0 22)) (geiser (0 20))) "A Flycheck checker for GNU Guile" tar ((:url . "https://notabug.org/flatwhatson/flycheck-guile") (:commit . "dd7bbdc48fd21cf8d270c913c56cd580f8ec3d03") (:revdesc . "dd7bbdc48fd2") (:authors ("Ricardo Wurmus" . "rekado@elephly.net")) (:maintainers ("Andrew Whatson" . "whatson@tailcall.au")) (:maintainer "Andrew Whatson" . "whatson@tailcall.au"))]) + (flycheck-haskell . [(20241119 1046) ((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 ((:url . "https://github.com/flycheck/flycheck-haskell") (:commit . "0977232112d02b9515e272ab85fe0eb9e07bbc50") (:revdesc . "0977232112d0") (:keywords "tools" "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com"))]) + (flycheck-hdevtools . [(20160926 702) ((flycheck (0 21 -4 1)) (dash (2 0))) "A flycheck checker for Haskell using hdevtools" tar ((:url . "https://github.com/flycheck/flycheck-hdevtools") (:commit . "53829f0c57800615718cfce27ffa16d8ba286cee") (:revdesc . "53829f0c5780") (:keywords "convenience" "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flycheck-hl-todo . [(20230807 1500) ((emacs (25 1)) (hl-todo (1 9 0)) (flycheck (0 14))) "Display hl-todo keywords in flycheck" tar ((:url . "https://github.com/alvarogonzalezsotillo/flycheck-hl-todo") (:commit . "16b66ea07e9d31950093ef0ff97d42b8e7ebf10f") (:revdesc . "16b66ea07e9d") (:keywords "convenience") (:authors ("lvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainers ("lvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "lvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com"))]) + (flycheck-hledger . [(20241029 1710) ((emacs (27 1)) (flycheck (31))) "Flycheck module to check hledger journals" tar ((:url . "https://github.com/DamienCassou/flycheck-hledger/") (:commit . "66e12fce7d4875327bce06b2fc33043924c710ed") (:revdesc . "66e12fce7d48") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (flycheck-indent . [(20200129 2046) ((emacs (25 1)) (indent-lint (1 0 0)) (flycheck (31))) "Indent-lint frontend for flycheck" tar ((:url . "https://github.com/conao3/indent-lint.el") (:commit . "23ef4bab5509e2e7fb1f4a194895a9510fa7c797") (:revdesc . "23ef4bab5509") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (flycheck-indicator . [(20200331 1142) ((flycheck (0 15))) "A fancy mode line indicator for `flycheck-mode'" tar ((:url . "https://github.com/gexplorer/flycheck-indicator") (:commit . "e00d9a20cbc21d6814c27cc9206296da394478e8") (:revdesc . "e00d9a20cbc2") (:keywords "convenience" "language" "tools") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainers ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com"))]) + (flycheck-ini-pyinilint . [(20190312 1931) ((flycheck (31))) "Flycheck integration for PyINILint" tar ((:url . "https://gitlab.com/danieljrmay/flycheck-ini-pyinilint") (:commit . "54744a78d06373404933fedc3ca836916e83de51") (:revdesc . "54744a78d063") (:keywords "convenience" "files" "tools") (:authors ("Daniel J. R. May" . "daniel.may@danieljrmay.com")) (:maintainers ("Daniel J. R. May" . "daniel.may@danieljrmay.com")) (:maintainer "Daniel J. R. May" . "daniel.may@danieljrmay.com"))]) + (flycheck-inline . [(20250724 650) ((emacs (25 1)) (flycheck (32))) "Display Flycheck errors inline" tar ((:url . "https://github.com/flycheck/flycheck-inline") (:commit . "8af846984375c9bf5786cc57f7ce00bc6a6a4555") (:revdesc . "8af846984375") (:keywords "tools" "convenience"))]) + (flycheck-irony . [(20180604 2152) ((emacs (24 1)) (flycheck (0 22)) (irony (0 2 0))) "Flycheck: C/C++ support via Irony" tar ((:url . "https://github.com/Sarcasm/flycheck-irony/") (:commit . "42dbecd4a865cabeb301193bb4d660e26ae3befe") (:revdesc . "42dbecd4a865") (:keywords "convenience" "tools" "c") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainers ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu"))]) + (flycheck-jest . [(20220530 1418) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Jest" tar ((:url . "https://github.com/jojojames/flycheck-jest") (:commit . "8181c5d2e1318c6ddcff21c6f3f6d76413545645") (:revdesc . "8181c5d2e131") (:keywords "languages" "jest") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (flycheck-joker . [(20200412 2346) ((flycheck (0 18))) "Add Clojure syntax checker (via Joker) to flycheck" tar ((:url . "https://github.com/candid82/flycheck-joker") (:commit . "93576295fef7a749bf779eeece5edd85e21868e2") (:revdesc . "93576295fef7") (:authors ("Roman Bataev" . "roman.bataev@gmail.com")) (:maintainers ("Roman Bataev" . "roman.bataev@gmail.com")) (:maintainer "Roman Bataev" . "roman.bataev@gmail.com"))]) + (flycheck-julia . [(20170729 2141) ((emacs (24)) (flycheck (0 22))) "Julia support for Flycheck" tar ((:url . "https://github.com/gdkrmr/flycheck-julia") (:commit . "213b60a5a9a1cb7887260e1d159b5bb27167cbb6") (:revdesc . "213b60a5a9a1") (:keywords "convenience" "tools" "languages") (:authors ("Guido Kraemer" . "guido.kraemer@gmx.de")) (:maintainers ("Guido Kraemer" . "guido.kraemer@gmx.de")) (:maintainer "Guido Kraemer" . "guido.kraemer@gmx.de"))]) + (flycheck-keg . [(20200726 218) ((emacs (24 3)) (keg (0 1)) (flycheck (0 1))) "Flycheck for Keg projects" tar ((:url . "https://github.com/conao3/keg.el") (:commit . "926de8f43842380e7150d99971eb73ff84cb59cb") (:revdesc . "926de8f43842") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (flycheck-kotlin . [(20230111 1907) ((flycheck (0 20))) "Support kotlin in flycheck" tar ((:url . "https://github.com/whirm/flycheck-kotlin") (:commit . "a2a6abb9a7f85c6fb15ce327459ec3c8ff780188") (:revdesc . "a2a6abb9a7f8") (:authors ("Elric Milon" . "whirm_REMOVETHIS__@gmx.com")) (:maintainers ("Elric Milon" . "whirm_REMOVETHIS__@gmx.com")) (:maintainer "Elric Milon" . "whirm_REMOVETHIS__@gmx.com"))]) + (flycheck-languagetool . [(20250407 21) ((emacs (27 1)) (flycheck (0 14))) "Flycheck support for LanguageTool" tar ((:url . "https://github.com/emacs-languagetool/flycheck-languagetool") (:commit . "e44bd8bf7ec481bf8911435544becc4bef74e9e8") (:revdesc . "e44bd8bf7ec4") (:keywords "convenience" "grammar" "check") (:authors ("Jen-Chieh" . "jcs090218@gmail.com") ("Peter Oliver" . "git@mavit.org.uk")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com") ("Peter Oliver" . "git@mavit.org.uk")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (flycheck-ledger . [(20200304 2204) ((emacs (24 1)) (flycheck (0 15))) "Flycheck integration for ledger files" tar ((:url . "https://github.com/purcell/flycheck-ledger") (:commit . "628e25ba66604946085571652a94a54f4d1ad96f") (:revdesc . "628e25ba6660") (:keywords "convenience" "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flycheck-lilypond . [(20211006 2102) ((emacs (24 3)) (flycheck (0 22))) "LilyPond support in Flycheck" tar ((:url . "https://github.com/hinrik/flycheck-lilypond") (:commit . "78f8c16cd67f9f6d3f1806e1fd403222723ba400") (:revdesc . "78f8c16cd67f") (:keywords "tools" "convenience") (: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"))]) + (flycheck-liquidhs . [(20170412 2326) ((flycheck (0 15))) "A flycheck checker for Haskell using liquid (i.e. liquidhaskell)" tar ((:url . "https://github.com/ucsd-progsys/liquidhaskell/flycheck-liquid.el") (:commit . "c27252ac24d77f4b6eec76a4ba9cd61761a3fba9") (:revdesc . "c27252ac24d7") (:keywords "convenience" "languages" "tools") (:authors ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainers ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainer "Ranjit Jhala" . "jhala@cs.ucsd.edu"))]) + (flycheck-mercury . [(20181118 1952) ((flycheck (0 22)) (s (1 9 0)) (dash (2 4 0))) "Mercury support in Flycheck" tar ((:url . "https://github.com/flycheck/flycheck-mercury") (:commit . "b6807a8db70981e21a91a93324c31e49de85c89f") (:revdesc . "b6807a8db709") (:keywords "convenience" "languages" "tools") (:authors ("Matthias Güdemann" . "matthias.gudemann@gmail.com")) (:maintainers ("Matthias Güdemann" . "matthias.gudemann@gmail.com")) (:maintainer "Matthias Güdemann" . "matthias.gudemann@gmail.com"))]) + (flycheck-mmark . [(20190713 1323) ((emacs (24 4)) (flycheck (0 29))) "Flycheck checker for the MMark markdown processor" tar ((:url . "https://github.com/mmark-md/flycheck-mmark") (:commit . "c796a2f18884bfc2afeec1fb2060da0f4044ddee") (:revdesc . "c796a2f18884") (:keywords "convenience" "text") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (flycheck-mypy . [(20200113 1336) ((flycheck (0 18))) "Support mypy in flycheck" tar ((:url . "https://github.com/lbolla/emacs-flycheck-mypy") (:commit . "12a77ee8ee3f6e774365f63be3cd5aede6462dd5") (:revdesc . "12a77ee8ee3f") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainers ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) + (flycheck-nim . [(20190927 1514) ((dash (2 4 0)) (flycheck (0 20))) "Defines a flycheck syntax checker for nim" tar ((:url . "https://github.com/ALSchwalm/flycheck-nim") (:commit . "ddfade51001571c2399f78bcc509e0aa8eb752a4") (:revdesc . "ddfade510015") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainers ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com"))]) + (flycheck-nimsuggest . [(20171027 2208) ((flycheck (0 23)) (emacs (24 3))) "Flycheck backend for Nim using nimsuggest" tar ((:url . "https://github.com/yuutayamada/flycheck-nimsuggest") (:commit . "dc9a5de1cb3ee05db5794d824610959a1f603bc9") (:revdesc . "dc9a5de1cb3e") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (flycheck-objc-clang . [(20210911 1023) ((emacs (24 4)) (flycheck (26))) "Flycheck: Objective-C support using Clang" tar ((:url . "https://github.com/GyazSquare/flycheck-objc-clang") (:commit . "5a441a31e58de17da94f933277150be39198d98c") (:revdesc . "5a441a31e58d") (:keywords "convenience" "languages" "tools") (:authors ("Goichi Hirakawa" . "gooichi@gyazsquare.com")) (:maintainers ("Goichi Hirakawa" . "gooichi@gyazsquare.com")) (:maintainer "Goichi Hirakawa" . "gooichi@gyazsquare.com"))]) + (flycheck-ocaml . [(20220730 542) ((emacs (24 3)) (flycheck (32)) (merlin (3 0 1)) (let-alist (1 0 3))) "Flycheck: OCaml support" tar ((:url . "https://github.com/flycheck/flycheck-ocaml") (:commit . "7d7b969cba6ff75fd0e5694aa0ffd6be05beb390") (:revdesc . "7d7b969cba6f") (:keywords "convenience" "tools" "languages" "ocaml") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (flycheck-package . [(20210509 2325) ((emacs (24 1)) (flycheck (0 22)) (package-lint (0 2))) "A Flycheck checker for elisp package authors" tar ((:url . "https://github.com/purcell/flycheck-package") (:commit . "ecd03f83790611888d693c684d719e033f69cb40") (:revdesc . "ecd03f837906") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flycheck-pact . [(20180920 2052) ((emacs (24 3)) (flycheck (0 25)) (pact-mode (0 0 4))) "Flycheck support for pact-mode" tar ((:url . "http://github.com/kadena-io/flycheck-pact") (:commit . "0e10045064ef89ec8b6f5a473073d47b976a2ca3") (:revdesc . "0e10045064ef") (:keywords "pact" "lisp" "languages" "blockchain" "smartcontracts" "tools" "linting") (:maintainers ("Stuart Popejoy" . "stuart@kadena.io")) (:maintainer "Stuart Popejoy" . "stuart@kadena.io"))]) + (flycheck-pest . [(20200710 2327) ((emacs (26 3)) (flycheck (31)) (pest-mode (0 1))) "Flycheck integration for Pest -" tar ((:url . "https://github.com/ksqsf/pest-mode") (:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:revdesc . "43447a2c70f9") (:keywords "convenience" "flycheck") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (flycheck-php-noverify . [(20211005 401) ((flycheck (0 22))) "Flycheck checker for PHP Noverify linter" tar ((:url . "https://github.com/Junker/flycheck-php-noverify") (:commit . "3aa3035c637eb0476f05bd0fbc66c058aa67ffb7") (:revdesc . "3aa3035c637e"))]) + (flycheck-phpstan . [(20250930 1139) ((emacs (25 1)) (flycheck (26)) (phpstan (0 9 0))) "Flycheck integration for PHPStan" tar ((:url . "https://github.com/emacs-php/phpstan.el") (:commit . "07ef7531f2ec73b90a965ac865cca8c96086f9de") (:revdesc . "07ef7531f2ec") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (flycheck-pkg-config . [(20230119 1721) ((dash (2 8 0)) (s (1 9 0)) (flycheck (29))) "Configure flycheck using pkg-config" tar ((:url . "https://github.com/Wilfred/flycheck-pkg-config") (:commit . "c4e4028f6621187365b7362566ac2786206765a1") (:revdesc . "c4e4028f6621") (:keywords "flycheck") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (flycheck-plantuml . [(20171018 111) ((flycheck (0 24)) (emacs (24 4)) (plantuml-mode (1 2 2))) "Integrate plantuml with flycheck" tar ((:url . "https://github.com/alexmurray/flycheck-plantuml") (:commit . "183be89e1dbba0b38237dd198dff600e0790309d") (:revdesc . "183be89e1dbb") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (flycheck-pony . [(20210118 1327) ((flycheck (0 25 1))) "Pony support in Flycheck" tar ((:url . "https://github.com/seantallen/flycheck-pony") (:commit . "22787cf8223ca9ec309e30a42c20a8e706d8bfbe") (:revdesc . "22787cf8223c") (:keywords "tools" "convenience"))]) + (flycheck-popup-tip . [(20170812 2351) ((flycheck (0 22)) (popup (0 5)) (emacs (24))) "Display Flycheck error messages using popup.el" tar ((:url . "https://github.com/flycheck/flycheck-popup-tip/") (:commit . "ef86aad907f27ca076859d8d9416f4f7727619c6") (:revdesc . "ef86aad907f2") (:keywords "convenience" "tools" "flycheck" "tooltip") (:authors ("Saša Jovanić" . "sasa@simplify.ba")) (:maintainers ("Saša Jovanić" . "sasa@simplify.ba")) (:maintainer "Saša Jovanić" . "sasa@simplify.ba"))]) + (flycheck-pos-tip . [(20200516 1600) ((emacs (24 1)) (flycheck (0 22)) (pos-tip (0 4 6))) "Display Flycheck errors in GUI tooltips" tar ((:url . "https://github.com/flycheck/flycheck-pos-tip") (:commit . "dc57beac0e59669926ad720c7af38b27c3a30467") (:revdesc . "dc57beac0e59") (:keywords "tools" "convenience") (:authors ("Akiha Senda" . "senda.akiha@gmail.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com"))]) + (flycheck-posframe . [(20220715 133) ((flycheck (0 24)) (emacs (26)) (posframe (0 7 0))) "Show flycheck error messages using posframe.el" tar ((:url . "https://github.com/alexmurray/flycheck-posframe") (:commit . "19896b922c76a0f460bf3fe8d8ebc2f9ac9028d8") (:revdesc . "19896b922c76") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (flycheck-projectile . [(20201031 1952) ((emacs (25 1)) (flycheck (31)) (projectile (2 2))) "Project-wide errors" tar ((:url . "https://github.com/nbfalcon/flycheck-projectile") (:commit . "ce6e9e8793a55dace13d5fa13badab2dca3b5ddb") (:revdesc . "ce6e9e8793a5") (:authors ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainers ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainer "Nikita Bloshchanevich" . "nikblos@outlook.com"))]) + (flycheck-prospector . [(20180524 450) ((flycheck (0 22))) "Support prospector in flycheck" tar ((:url . "https://github.com/chocoelho/flycheck-prospector") (:commit . "d5b81adb5c8261b935baf0a614dd4b776280392e") (:revdesc . "d5b81adb5c82") (:authors ("Carlos Coelho" . "carlospecter@gmail.com")) (:maintainers ("Carlos Coelho" . "carlospecter@gmail.com")) (:maintainer "Carlos Coelho" . "carlospecter@gmail.com"))]) + (flycheck-psalm . [(20211002 1555) ((emacs (24 3)) (flycheck (26)) (psalm (0 6 0))) "Flycheck integration for Psalm" tar ((:url . "https://github.com/emacs-php/psalm.el") (:commit . "28d546a79cb865a78b94cd7e929d66d720505faa") (:revdesc . "28d546a79cb8") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (flycheck-pycheckers . [(20240817 2) ((flycheck (0 18))) "Multiple syntax checker for Python, using Flycheck" tar ((:url . "https://github.com/msherry/flycheck-pycheckers") (:commit . "1bd9b7a7d4009a81ebd34515a72a3a94c313ad76") (:revdesc . "1bd9b7a7d400") (:keywords "convenience" "tools" "languages"))]) + (flycheck-pyflakes . [(20240124 101) ((flycheck (0 18))) "Support pyflakes in flycheck" tar ((:url . "https://github.com/Wilfred/flycheck-pyflakes") (:commit . "60db5908747faf3831f055eddc6d3b5deafa7384") (:revdesc . "60db5908747f") (: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 ((:url . "https://github.com/linnik/flycheck-pyre") (:commit . "0560122caae207d99d8af1ac2b4e5d6f6a1ce444") (:revdesc . "0560122caae2") (:authors ("Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com")) (:maintainers ("Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com")) (:maintainer "Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com"))]) + (flycheck-raku . [(20220420 732) ((emacs (26 3)) (flycheck (0 22))) "Raku support in Flycheck" tar ((:url . "https://github.com/Raku/flycheck-raku") (:commit . "4da1970a75396aff1957b07f7579c1de6b817e6b") (:revdesc . "4da1970a7539") (:keywords "tools" "convenience") (: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") ("Johnathon Weare" . "jrweare@gmail.com") ("Siavash Askari Nasr" . "siavash.askari.nasr@gmail.com")) (:maintainer "Hinrik rn Sigurðsson" . "hinrik.sig@gmail.com"))]) + (flycheck-relint . [(20240910 1036) ((emacs (26 1)) (flycheck (0 22)) (relint (2 0))) "A Flycheck checker for elisp regular expressions" tar ((:url . "https://github.com/purcell/flycheck-relint") (:commit . "88da7151b1781ec950eb9ec0b2ad32b90dae7427") (:revdesc . "88da7151b178") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flycheck-rtags . [(20191222 920) ((emacs (24)) (flycheck (0 23)) (rtags (2 10))) "RTags Flycheck integration" tar ((:url . "https://github.com/Andersbakken/rtags") (:commit . "595055b5316a7c92ba1d638f324f98842a0f41a5") (:revdesc . "595055b5316a") (:authors ("Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com")) (:maintainers ("Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com")) (:maintainer "Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com"))]) + (flycheck-rust . [(20250226 2240) ((emacs (27 1)) (flycheck (28)) (dash (2 13 0)) (seq (2 3)) (let-alist (1 0 4))) "Flycheck: Rust additions and Cargo support" tar ((:url . "https://github.com/flycheck/flycheck-rust") (:commit . "2b544bab19b987bfb41d5d88801b89e29bdf69c7") (:revdesc . "2b544bab19b9") (:keywords "tools" "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com"))]) + (flycheck-stan . [(20211129 2051) ((emacs (25 1)) (flycheck (0 16 0)) (stan-mode (10 3 0))) "Add Stan support for Flycheck" tar ((:url . "https://github.com/stan-dev/stan-mode/tree/master/flycheck-stan") (:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:revdesc . "150bbbe5fd3a") (:keywords "c" "languages") (: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"))]) + (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 ((:url . "https://github.com/liblit/flycheck-status-emoji") (:commit . "4bd113ab42dec9544b66e0a27ed9008ce8148433") (:revdesc . "4bd113ab42de") (:keywords "convenience" "languages" "tools") (:authors ("Ben Liblit" . "liblit@acm.org")) (:maintainers ("Ben Liblit" . "liblit@acm.org")) (:maintainer "Ben Liblit" . "liblit@acm.org"))]) + (flycheck-swift . [(20170129 549) ((emacs (24 4)) (flycheck (0 25))) "Flycheck extension for Apple's Swift" tar ((:url . "https://github.com/swift-emacs/flycheck-swift") (:commit . "c6c416a1b7a7d346e5c040e4e4065abc68d3a844") (:revdesc . "c6c416a1b7a7") (:keywords "languages" "swift"))]) + (flycheck-swift3 . [(20221227 1307) ((emacs (25 1)) (flycheck (26))) "Flycheck: Swift support for Apple swift-mode" tar ((:url . "https://github.com/GyazSquare/flycheck-swift3") (:commit . "14cb83c71a03bb7ae0952ee1707783219fda980e") (:revdesc . "14cb83c71a03") (:keywords "convenience" "languages" "tools") (:authors ("Goichi Hirakawa" . "gooichi@gyazsquare.com")) (:maintainers ("Goichi Hirakawa" . "gooichi@gyazsquare.com")) (:maintainer "Goichi Hirakawa" . "gooichi@gyazsquare.com"))]) + (flycheck-swiftlint . [(20180830 340) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Swiftlint" tar ((:url . "https://github.com/jojojames/flycheck-swiftlint") (:commit . "65101873c4c9f8e7eac9471188b161eeddda1555") (:revdesc . "65101873c4c9") (:keywords "languages" "swiftlint" "swift" "emacs") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (flycheck-swiftx . [(20200814 845) ((emacs (26 1)) (flycheck (26)) (xcode-project (1 0))) "Flycheck: Swift backend" tar ((:url . "https://github.com/nhojb/flycheck-swiftx") (:commit . "4d0c8ca0540b06fb947a83f1a38a6003a5abe0d4") (:revdesc . "4d0c8ca0540b") (:keywords "convenience" "languages" "tools") (:authors ("John Buckley" . "john@olivetoast.com")) (:maintainers ("John Buckley" . "john@olivetoast.com")) (:maintainer "John Buckley" . "john@olivetoast.com"))]) + (flycheck-tcl . [(20180327 1259) ((emacs (24 4)) (flycheck (0 22))) "A flycheck checker for Tcl using tclchecker" tar ((:url . "https://github.com/nwidger/flycheck-tcl") (:commit . "7ca23f4673e178b9f5dcc8a82b86cf05b15d7236") (:revdesc . "7ca23f4673e1") (:authors ("Niels Widger" . "niels.widger@gmail.com")) (:maintainers ("Niels Widger" . "niels.widger@gmail.com")) (:maintainer "Niels Widger" . "niels.widger@gmail.com"))]) + (flycheck-tip . [(20171020 1048) ((flycheck (29)) (emacs (24 1)) (popup (0 5 0))) "Show flycheck/flymake errors by tooltip" tar ((:url . "https://github.com/yuutayamada/flycheck-tip") (:commit . "a8ea6c905e8ad2d0684a17f7e78ba11e8598e85d") (:revdesc . "a8ea6c905e8a") (:keywords "flycheck") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (flycheck-title . [(20210321 558) ((flycheck (30)) (emacs (24))) "Show flycheck errors in the frame title" tar ((:url . "https://github.com/Wilfred/flycheck-title") (:commit . "74e4375f372f7b9ce0fdfa34dc74a048376679ae") (:revdesc . "74e4375f372f") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (flycheck-vale . [(20220929 608) ((emacs (24 4)) (flycheck (0 22)) (let-alist (1 0 4))) "Flycheck integration for vale" tar ((:url . "https://github.com/abingham/flycheck-vale") (:commit . "7c7ebc3de058a321cb76348a01f45f02dc55d2f0") (:revdesc . "7c7ebc3de058") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (flycheck-vdm . [(20190304 839) ((emacs (24)) (flycheck (32 -4)) (vdm-mode (0 0 4))) "Syntax checking for vdm-mode" tar ((:url . "https://github.com/peterwvj/vdm-mode") (:commit . "103993147b24325ef68099d087dce9ac501f02f9") (:revdesc . "103993147b24") (:keywords "languages") (: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"))]) + (flycheck-xcode . [(20180122 651) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Apple's Xcode" tar ((:url . "https://github.com/jojojames/flycheck-xcode") (:commit . "6147ab777e2c08e4f5ffdbd85d3013ca700fa835") (:revdesc . "6147ab777e2c") (:keywords "languages" "xcode") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (flycheck-yamllint . [(20170326 1309) ((flycheck (30))) "Flycheck integration for YAMLLint" tar ((:url . "https://github.com/krzysztof-magosa/flycheck-yamllint") (:commit . "aa211b1243168a4f752888c0014c5b9d2da178b1") (:revdesc . "aa211b124316") (:keywords "convenience" "languages" "tools") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainers ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl"))]) + (flycheck-yang . [(20180312 1831) ((yang-mode (0 9 4)) (flycheck (0 18))) "YANG flycheck checker" tar ((:url . "https://github.com/andaru/flycheck-yang") (:commit . "47881fc42ef0163c47064b72b5d6dbef4f83d778") (:revdesc . "47881fc42ef0") (:authors ("Andrew Fort" . "(@andaru)")) (:maintainers ("Andrew Fort" . "(@andaru)")) (:maintainer "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 ((:url . "https://github.com/abingham/emacs-ycmd") (:commit . "ef87d020d3314efbac2e8925c115d0ac5c128c2a") (:revdesc . "ef87d020d331") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (flymake-actionlint . [(20240826 1658) ((emacs (24 1)) (flymake-easy (0 0 0))) "A Flymake handler for actionlint" tar ((:url . "https://github.com/ROCKTAKEY/flymake-actionlint") (:commit . "c502456fd445794f166d537eccd7b113d2c6fc64") (:revdesc . "c502456fd445") (:keywords "convenience") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (flymake-ansible-lint . [(20251019 1945) ((emacs (27 1))) "A Flymake backend for ansible-lint" tar ((:url . "https://github.com/jamescherti/flymake-ansible-lint.el") (:commit . "c5375aea83586e1ae97e6c2fa74ea61cf44d98f4") (:revdesc . "c5375aea8358") (:keywords "tools"))]) + (flymake-aspell . [(20250118 2052) ((emacs (26 1))) "Aspell checker for flymake" tar ((:url . "https://github.com/leotaku/flycheck-aspell") (:commit . "0d9291fd3422de0eedbac387e8c1eb037904f808") (:revdesc . "0d9291fd3422") (:keywords "wp" "flymake" "spell" "aspell") (:authors ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainers ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainer "Leo Gaskin" . "leo.gaskin@le0.gs"))]) + (flymake-bashate . [(20250416 1624) ((flymake-quickdef (1 0 0)) (emacs (27 1))) "A Flymake backend for bashate, a Bash scripts style checker" tar ((:url . "https://github.com/jamescherti/flymake-bashate.el") (:commit . "c599d3c15c6f174a54c1f3d0081311758e682089") (:revdesc . "c599d3c15c6f") (:keywords "tools"))]) + (flymake-biome . [(20241007 1626) ((emacs (27 1))) "A flymake plugin for Javascript files using biome" tar ((:url . "https://github.com/erickgnavar/flymake-biome") (:commit . "03fa55d23fdc80fb4bc963cd144da460e7da0220") (:revdesc . "03fa55d23fdc") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io"))]) + (flymake-clippy . [(20231102 1616) ((emacs (26 1))) "Flymake backend for Clippy" tar ((:url . "https://sr.ht/~mgmarlow/flymake-clippy/") (:commit . "62c670c19e575a0d7dd723cbd195c18de60bb494") (:revdesc . "62c670c19e57") (:keywords "tools") (:authors ("Graham Marlow" . "info@mgmarlow.com")) (:maintainers ("Graham Marlow" . "info@mgmarlow.com")) (:maintainer "Graham Marlow" . "info@mgmarlow.com"))]) + (flymake-coffee . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for coffee script" tar ((:url . "https://github.com/purcell/flymake-coffee") (:commit . "dee295acf30820ed15fe0de17137d50bc27fc80c") (:revdesc . "dee295acf308") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-collection . [(20250831 1353) ((emacs (28 1)) (let-alist (1 0)) (flymake (1 2 1))) "Collection of checkers for flymake, bringing flymake to the level of flycheck" tar ((:url . "https://github.com/mohkale/flymake-collection") (:commit . "909d98d9ec70c2baa5467634ec37181a058f2548") (:revdesc . "909d98d9ec70") (:keywords "language" "tools") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe"))]) + (flymake-cspell . [(20240304 1349) ((emacs (26 1))) "A Flymake backend for CSpell" tar ((:url . "https://github.com/fritzgrabo/flymake-cspell") (:commit . "a573c07142cd0142c4cc1affd57f96b4d5c229b3") (:revdesc . "a573c07142cd") (:keywords "wp") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (flymake-css . [(20170723 146) ((flymake-easy (0 1))) "Flymake support for css using csslint" tar ((:url . "https://github.com/purcell/flymake-css") (:commit . "de090163ba289910ceeb61b13368ce42d0f2dfd8") (:revdesc . "de090163ba28") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-cursor . [(20220506 1458) ((flymake (0 3))) "Show flymake messages in the minibuffer after delay" tar ((:url . "https://github.com/flymake/emacs-flymake-cursor") (:commit . "95806594cacddbbc0c3aa2351a6a7cf28e73a8bf") (:revdesc . "95806594cacd") (:keywords "languages" "mode" "flymake") (:authors ("Dino Chiesa" . "dpchiesa@hotmail.com") ("Sam Graham" . "libflymake-emacsBLAHBLAHillusori.co.uk")) (:maintainers ("Sam Graham" . "libflymake-emacsBLAHBLAHillusori.co.uk") ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Sam Graham" . "libflymake-emacsBLAHBLAHillusori.co.uk"))]) + (flymake-diagnostic-at-point . [(20180815 1004) ((emacs (26 1)) (popup (0 5 3))) "Display flymake diagnostics at point" tar ((:url . "https://github.com/meqif/flymake-diagnostic-at-point") (:commit . "379616b1c6f5ebeaf08fbe54ae765008a78b3be7") (:revdesc . "379616b1c6f5") (:keywords "convenience" "languages" "tools") (:authors ("Ricardo Martins" . "ricardo@scarybox.net")) (:maintainers ("Ricardo Martins" . "ricardo@scarybox.net")) (:maintainer "Ricardo Martins" . "ricardo@scarybox.net"))]) + (flymake-eask . [(20250101 1000) ((emacs (26 1)) (flymake-easy (0 1))) "Eask support in Flymake" tar ((:url . "https://github.com/flymake/flymake-eask") (:commit . "96fd80e6ff2c34a5898906388cfb6462f9bec7f1") (:revdesc . "96fd80e6ff2c") (:keywords "lisp" "eask") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (flymake-easy . [(20240624 1702) nil "Helpers for easily building flymake checkers" tar ((:url . "https://github.com/purcell/flymake-easy") (:commit . "1986500f75ea06f006ab1734abcce441117d385d") (:revdesc . "1986500f75ea") (:keywords "convenience" "internal") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-eldev . [(20240419 2023) ((dash (2 17)) (emacs (28 1))) "Eldev support in Flymake" tar ((:url . "https://github.com/emacs-eldev/flymake-eldev") (:commit . "d8f4d9da115002afd3785b777cd59a49d170e04a") (:revdesc . "d8f4d9da1150") (:keywords "tools" "convenience") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com"))]) + (flymake-elisp-config . [(20250621 1609) ((emacs (28 1))) "Setup load-path for flymake on Emacs Lisp mode" tar ((:url . "https://github.com/ROCKTAKEY/flymake-elisp-config") (:commit . "1f9100e855aff8877c1af111fcdde6968038b4d2") (:revdesc . "1f9100e855af") (:keywords "lisp") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (flymake-elixir . [(20130810 1417) nil "A flymake handler for elixir-mode .ex files" tar ((:url . "https://github.com/syl20bnr/flymake-elixir") (:commit . "3810566cffe35d04cc3f01e27fe397d68d52f802") (:revdesc . "3810566cffe3") (:authors ("Sylvain Benner" . "syl20bnr@gmail.com")) (:maintainers ("Sylvain Benner" . "syl20bnr@gmail.com")) (:maintainer "Sylvain Benner" . "syl20bnr@gmail.com"))]) + (flymake-eslint . [(20250319 1221) ((emacs (26 1))) "A Flymake backend for Javascript using eslint" tar ((:url . "https://github.com/orzechowskid/flymake-eslint") (:commit . "69aa89346e663a57579848936a18d795655a485b") (:revdesc . "69aa89346e66") (:keywords "languages" "tools"))]) + (flymake-fennel . [(20231118 1858) ((emacs (26 1))) "Flymake backend for Fennel" tar ((:url . "https://git.sr.ht/~mgmarlow/flymake-fennel") (:commit . "f62be1505152d0adec0aa7927e674db8cef58b28") (:revdesc . "f62be1505152") (:keywords "tools") (:authors ("Graham Marlow" . "info@mgmarlow.com")) (:maintainers ("Graham Marlow" . "info@mgmarlow.com")) (:maintainer "Graham Marlow" . "info@mgmarlow.com"))]) + (flymake-flycheck . [(20250812 1141) ((flycheck (31)) (emacs (27 1))) "Use flycheck checkers as flymake backends" tar ((:url . "https://github.com/purcell/flymake-flycheck") (:commit . "79092d7e53277d7fe961f73b69e2d174ea3c6210") (:revdesc . "79092d7e5327") (:keywords "convenience" "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-gjshint . [(20130327 1232) nil "A flymake handler for javascript using both jshint and gjslint" tar ((:url . "https://github.com/yasuyk/flymake-gjshint-el") (:commit . "71495ee5303de18293decd57ab9f9abdbaabfa05") (:revdesc . "71495ee5303d") (:keywords "flymake" "javascript" "jshint" "gjslint") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))]) + (flymake-go . [(20150714 733) nil "A flymake handler for go-mode files" tar ((:url . "https://github.com/robert-zaremba/flymake-go") (:commit . "ae83761aa908c1a50ff34af04f00dcc46bca2ce9") (:revdesc . "ae83761aa908") (:keywords "go" "flymake") (:authors ("Michael Fellinger" . "michael@iron.io") ("Robert Zaremba" . "robert.marek.zaremba@wp.eu")) (:maintainers ("Michael Fellinger" . "michael@iron.io") ("Robert Zaremba" . "robert.marek.zaremba@wp.eu")) (:maintainer "Michael Fellinger" . "michael@iron.io"))]) + (flymake-go-staticcheck . [(20220804 1907) ((emacs (26 1))) "Go staticcheck linter for flymake" tar ((:url . "https://github.com/s-kostyaev/flymake-go-staticcheck") (:commit . "9098f7e07ea6513667dc6af6d9ad2fa854464d20") (:revdesc . "9098f7e07ea6") (:keywords "languages" "tools") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru"))]) + (flymake-golangci . [(20191028 1927) ((flymake-easy (0 1)) (emacs (24))) "A flymake handler for go-mode files using Golang CI lint" tar ((:url . "https://gitlab.com/shackra/flymake-golangci") (:commit . "dfc31a1a6ae3f087b49fe6f5f21b3866780aa91c") (:revdesc . "dfc31a1a6ae3") (: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"))]) + (flymake-gradle . [(20190315 233) ((emacs (26 1))) "Flymake extension for Gradle" tar ((:url . "https://github.com/jojojames/flymake-gradle") (:commit . "dbedd29b78d4828ef57d4de20867be5df3eaab99") (:revdesc . "dbedd29b78d4") (:keywords "languages" "gradle") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (flymake-grammarly . [(20250101 849) ((emacs (26 1)) (grammarly (0 3 0)) (s (1 12 0))) "Flymake support for Grammarly" tar ((:url . "https://github.com/emacs-grammarly/flymake-grammarly") (:commit . "da1e8030e0148d098bf2cb66ac5402beb1d10825") (:revdesc . "da1e8030e014") (:keywords "convenience" "grammar" "check") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (flymake-hadolint . [(20220328 823) ((emacs (26 1))) "Flymake backend for hadolint, a Dockerfile linter" tar ((:url . "https://github.com/buzztaiki/flymake-hadolint") (:commit . "82a6df7f6cc95e1ab95c5d28f2edcd8c1d4c7382") (:revdesc . "82a6df7f6cc9") (:keywords "convenience" "processes" "docker" "flymake") (:authors ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainer "Taiki Sugawara" . "buzz.taiki@gmail.com"))]) + (flymake-haml . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for haml files" tar ((:url . "https://github.com/purcell/flymake-haml") (:commit . "22a81e8484734552d461e7ae7305664dc244447e") (:revdesc . "22a81e848473") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-haskell-multi . [(20170723 146) ((flymake-easy (0 1))) "Syntax-check haskell-mode using both ghc and hlint" tar ((:url . "https://github.com/purcell/flymake-haskell-multi") (:commit . "b564a94312259885b1380272eb867bf52a164020") (:revdesc . "b564a9431225") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-hledger . [(20241226 1937) ((emacs (28 2))) "Flymake module to check hledger journals" tar ((:url . "https://github.com/DamienCassou/flymake-hledger") (:commit . "3dd9d58ccd8e4c22c14553ebfac0ca1be3efebc5") (:revdesc . "3dd9d58ccd8e") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (flymake-hlint . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for haskell-mode files using hlint" tar ((:url . "https://github.com/purcell/flymake-hlint") (:commit . "f910736b26784efc9a2fa29503f45c1f1dd0aa38") (:revdesc . "f910736b2678") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-joker . [(20200315 1429) ((emacs (26 1)) (flymake-quickdef (0 1 1))) "Add Clojure syntax checker (via Joker) to flymake" tar ((:url . "https://github.com/beetleman/flymake-joker") (:commit . "fc132beedac9e6f415b72e578e77318fd13af9ee") (:revdesc . "fc132beedac9") (:authors ("Mateusz Probachta" . "mateusz.probachta@gmail.com")) (:maintainers ("Mateusz Probachta" . "mateusz.probachta@gmail.com")) (:maintainer "Mateusz Probachta" . "mateusz.probachta@gmail.com"))]) + (flymake-jshint . [(20140319 2200) ((flymake-easy (0 8))) "Making flymake work with JSHint" tar ((:url . "https://github.com/Wilfred/flymake-jshint.el") (:commit . "79dd554c227883c487db38ac111306c8d5382c95") (:revdesc . "79dd554c2278") (:keywords "flymake" "jshint" "javascript") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (flymake-jslint . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for javascript using jslint" tar ((:url . "https://github.com/purcell/flymake-jslint") (:commit . "8edb82be605542b0ef62d38d818adcdde335eecb") (:revdesc . "8edb82be6055") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-json . [(20180511 911) ((flymake-easy (0 1))) "A flymake handler for json using jsonlint" tar ((:url . "https://github.com/purcell/flymake-json") (:commit . "ae58795f948402e987cda4c15f10354f8ec2d0fd") (:revdesc . "ae58795f9484") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-kondor . [(20211026 501) ((emacs (26 1))) "Linter with clj-kondo" tar ((:url . "https://github.com/turbo-cafe/flymake-kondor") (:commit . "784e57f36812a37e323409b90b935ef3c6920a22") (:revdesc . "784e57f36812"))]) + (flymake-ktlint . [(20180831 346) ((emacs (26 1))) "Flymake extension for Ktlint" tar ((:url . "https://github.com/jojojames/flymake-ktlint") (:commit . "bea8bf350802c06756efd4e6dfba65f31dc41d78") (:revdesc . "bea8bf350802") (:keywords "languages" "ktlint") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (flymake-languagetool . [(20251107 2140) ((emacs (27 1)) (compat (29 1 4 4))) "Flymake support for LanguageTool" tar ((:url . "https://github.com/emacs-languagetool/flymake-languagetool") (:commit . "a697dccf2d537e7efd92fd80e6b480bacbd1b821") (:revdesc . "a697dccf2d53") (:keywords "convenience" "grammar" "check"))]) + (flymake-less . [(20151111 738) ((less-css-mode (0 15)) (flymake-easy (0 1))) "Flymake handler for LESS stylesheets (lesscss.org)" tar ((:url . "https://github.com/purcell/flymake-less") (:commit . "32d3c28a9a5c52b82d1741ff9d715013b6498421") (:revdesc . "32d3c28a9a5c") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-lua . [(20170129 154) nil "Flymake for Lua" tar ((:url . "https://github.com/sroccaserra/flymake-lua") (:commit . "dcc32b62a285215898ae774ba63dbda0656f6f53") (:revdesc . "dcc32b62a285") (:keywords "lua") (:authors ("Sébastien Roccaserra (format \"s\" \"roccaserra\" \"yahoo\" \"com\"" . "\"<%s%s@%s.%s>\" ")) (:maintainers ("Sébastien Roccaserra (format \"s\" \"roccaserra\" \"yahoo\" \"com\"" . "\"<%s%s@%s.%s>\" ")) (:maintainer "Sébastien Roccaserra (format \"s\" \"roccaserra\" \"yahoo\" \"com\"" . "\"<%s%s@%s.%s>\" "))]) + (flymake-margin . [(20240612 306) ((emacs (29 1))) "Sets flymake to work with margin instead of fringes" tar ((:url . "https://github.com/LionyxML/flymake-margin") (:commit . "4e36634789d64c33a9fc0dc5bc2eb4a21c391d96") (:revdesc . "4e36634789d6") (:keywords "languages" "maint" "tools"))]) + (flymake-markdownlint . [(20220320 1208) ((emacs (27 1))) "Markdown linter with markdownlint" tar ((:url . "https://github.com/shaohme/flymake-markdownlint") (:commit . "59e3520668d9394c573e07b7980a2d48d9f6086c") (:revdesc . "59e3520668d9") (: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"))]) + (flymake-nasm . [(20210310 1540) ((flymake-quickdef (1 0 0)) (emacs (26 1))) "A flymake handler for asm-mode files using nasm" tar ((:url . "http://github.com/juergenhoetzel/flymake-nasm") (:commit . "27e58d7f3a48ca6fc12238fe6c888a3fdffc3f75") (:revdesc . "27e58d7f3a48") (:keywords "tools" "languages") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")))]) + (flymake-perlcritic . [(20250615 802) ((flymake (1 2))) "Flymake handler for Perl to invoke Perl::Critic" tar ((:url . "https://github.com/illusori/emacs-flymake-perlcritic") (:commit . "311743e97d2f705e76755697eea9ff451a39dd64") (:revdesc . "311743e97d2f") (:authors ("Sam Graham" . "libflymake-perlcritic-emacsBLAHBLAHillusori.co.uk") ("gemmaro" . "gemmaro.dev@gmail.com")) (:maintainers ("Sam Graham" . "libflymake-perlcritic-emacsBLAHBLAHillusori.co.uk")) (:maintainer "Sam Graham" . "libflymake-perlcritic-emacsBLAHBLAHillusori.co.uk"))]) + (flymake-pest . [(20200710 2327) ((emacs (26 3)) (pest-mode (0 1))) "A flymake handler for Pest files" tar ((:url . "https://github.com/ksqsf/pest-mode") (:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:revdesc . "43447a2c70f9") (:keywords "languages" "flymake") (:authors ("ksqsf" . "i@ksqsf.moe") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("ksqsf" . "i@ksqsf.moe") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "ksqsf" . "i@ksqsf.moe"))]) + (flymake-php . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for php-mode files" tar ((:url . "https://github.com/purcell/flymake-php") (:commit . "c045d01e002ba5e09b05f40e25bf5068d02126bc") (:revdesc . "c045d01e002b") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-phpcs . [(20210213 732) ((flymake-easy (0 9))) "Making flymake work with PHP CodeSniffer" tar ((:url . "https://github.com/senda-akiha/flymake-phpcs/") (:commit . "f947ba3066c1fa903d2ec69d67bf84413f51eb3f") (:revdesc . "f947ba3066c1") (:keywords "flymake" "phpcs" "php"))]) + (flymake-phpstan . [(20250930 1139) ((emacs (26 1)) (phpstan (0 9 0))) "Flymake backend for PHP using PHPStan" tar ((:url . "https://github.com/emacs-php/phpstan.el") (:commit . "07ef7531f2ec73b90a965ac865cca8c96086f9de") (:revdesc . "07ef7531f2ec") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (flymake-puppet . [(20170801 554) ((flymake-easy (0 9))) "Flymake handler using puppet-lint" tar ((:url . "https://github.com/benprew/flymake-puppet") (:commit . "9579e5c736cb890195464fabf51df113313de88d") (:revdesc . "9579e5c736cb"))]) + (flymake-python-pyflakes . [(20170723 146) ((flymake-easy (0 8))) "A flymake handler for python-mode files using pyflakes (or flake8)" tar ((:url . "https://github.com/purcell/flymake-python-pyflakes") (:commit . "1d65c26bf65a5dcbd29fcd967e2feb90e1e7a33d") (:revdesc . "1d65c26bf65a") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-quickdef . [(20200308 2342) ((emacs (26 1))) "Quickly define a new Flymake backend" tar ((:url . "https://github.com/karlotness/flymake-quickdef") (:commit . "150c5839768a3d32f988f9dc08052978a68f2ad7") (:revdesc . "150c5839768a") (:keywords "languages" "tools" "convenience" "lisp"))]) + (flymake-racket . [(20210105 606) ((emacs (26 1))) "Flymake extension for Racket" tar ((:url . "https://github.com/jojojames/flymake-racket") (:commit . "3d3e5f2a9ab696670f9e52baa4dde7b84b7542df") (:revdesc . "3d3e5f2a9ab6") (:keywords "languages" "racket" "scheme") (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (flymake-rakudo . [(20220424 637) ((emacs (28 1)) (flymake-collection (2 0 0)) (let-alist (1 0))) "Flymake syntax checker for Rakudo" tar ((:url . "https://github.com/Raku/flymake-rakudo") (:commit . "f8e3d03a7207876cd891174702efd572d74f2e49") (:revdesc . "f8e3d03a7207") (:keywords "language" "tools" "convenience") (:authors ("Siavash Askari Nasr" . "ciavash@proton.me")) (:maintainers ("Siavash Askari Nasr" . "ciavash@proton.me")) (:maintainer "Siavash Askari Nasr" . "ciavash@proton.me"))]) + (flymake-relint . [(20250123 2108) ((emacs (26 1)) (relint (1 23))) "A relint Flymake backend" tar ((:url . "https://github.com/eki3z/flymake-relint") (:commit . "7fd3dabe4fdc258aaf18abbe70e46f49f2fe6b69") (:revdesc . "7fd3dabe4fdc") (:keywords "lisp") (:authors ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz95@gmail.com"))]) + (flymake-ruby . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for ruby-mode files" tar ((:url . "https://github.com/purcell/flymake-ruby") (:commit . "6c320c6fb686c5223bf975cc35178ad6b195e073") (:revdesc . "6c320c6fb686") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-ruff . [(20251221 2344) ((emacs (26 1)) (project (0 3 0))) "A flymake plugin for python files using ruff" tar ((:url . "https://github.com/erickgnavar/flymake-ruff") (:commit . "8f1602fa4ddf0abd3dfb8051cbd0259fc351d015") (:revdesc . "8f1602fa4ddf") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io"))]) + (flymake-sass . [(20170723 146) ((flymake-easy (0 1))) "Flymake handler for sass and scss files" tar ((:url . "https://github.com/purcell/flymake-sass") (:commit . "2de28148e92deb93bff3d55fe14e7c67ac476056") (:revdesc . "2de28148e92d") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-shell . [(20170723 146) ((flymake-easy (0 1))) "A flymake syntax-checker for shell scripts" tar ((:url . "https://github.com/purcell/flymake-shell") (:commit . "a16cf453056b9849cc7c912bb127fb0b08fc6dab") (:revdesc . "a16cf453056b") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (flymake-shellcheck . [(20220308 2218) ((emacs (26))) "A bash/sh Flymake backend powered by ShellCheck" tar ((:url . "https://github.com/federicotdn/flymake-shellcheck") (:commit . "1ad9acb599e6be6aac57280b7c918b0e4a0f07de") (:revdesc . "1ad9acb599e6") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainers ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com"))]) + (flymake-solidity . [(20170805 644) ((flymake-easy (0 10))) "A flymake handler for solidity using solc" tar ((:url . "https://github.com/kootenvp/flymake-solidity") (:commit . "48bfe9525f764d8a68cc0270905dbf45bfd00bb8") (:revdesc . "48bfe9525f76") (:authors ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainers ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainer "Pascal van Kooten" . "kootenpv@gmail.com"))]) + (flymake-sqlfluff . [(20240611 1257) ((emacs (27 1))) "A flymake plugin for SQL files using sqlfluff" tar ((:url . "https://github.com/erickgnavar/flymake-sqlfluff") (:commit . "0a836d7a919723ae5897fce01c3c7d651a30e8c6") (:revdesc . "0a836d7a9197") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io"))]) + (flymake-swi-prolog . [(20220404 950) ((emacs (26 1))) "A Flymake backend for SWI-Prolog" tar ((:url . "https://git.sr.ht/~eshel/flymake-swi-prolog") (:commit . "ae0e4b706a40b71c007ed6cb0ec5425d49bea4c3") (:revdesc . "ae0e4b706a40") (:keywords "languages"))]) + (flymake-vala . [(20150326 531) ((flymake-easy (0 1))) "A flymake handler for vala-mode files" tar ((:url . "https://github.com/daniellawrence/flymake-vala") (:commit . "c3674f461fc84fb0300cd3a562fb903a59782745") (:revdesc . "c3674f461fc8") (:keywords "convenience" "vala") (:authors ("Daniel Lawrence" . "dannyla@linux.com")) (:maintainers ("Daniel Lawrence" . "dannyla@linux.com")) (:maintainer "Daniel Lawrence" . "dannyla@linux.com"))]) + (flymake-vnu . [(20230310 440) ((emacs (26 1))) "Flymake extension for the v.Nu HTML validator" tar ((:url . "https://github.com/theneosloth/flymake-vnu") (:commit . "e9c6038f69ad1523e603026155d9acd5fc3d5aac") (:revdesc . "e9c6038f69ad") (:keywords "languages") (:maintainers ("Stefan Kuznetsov" . "skuznetsov@posteo.net")) (:maintainer "Stefan Kuznetsov" . "skuznetsov@posteo.net"))]) + (flymake-x . [(20251208 1843) ((emacs (28 1)) (flymake (1 0))) "Simple flymake checker definitions" tar ((:url . "https://github.com/mkcms/flymake-x") (:commit . "0f50d49dff71a16a50e53619578a6c64fd6d6be1") (:revdesc . "0f50d49dff71") (:keywords "languages" "tools") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com"))]) + (flymake-yaml . [(20130423 1548) ((flymake-easy (0 1))) "A flymake handler for YAML" tar ((:url . "https://github.com/yasuyk/flymake-yaml") (:commit . "0dd11eed29fe4054ff5b4e06e2c39b4d925d6aae") (:revdesc . "0dd11eed29fe") (:keywords "yaml") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))]) + (flymake-yamllint . [(20230226 1024) ((emacs (26 1))) "YAML linter with yamllint" tar ((:url . "https://github.com/shaohme/flymake-yamllint") (:commit . "020d2a33568c8069801db9dd6992b8961a58de8d") (:revdesc . "020d2a33568c") (: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"))]) + (flymd . [(20160617 1214) ((cl-lib (0 5))) "On the fly markdown preview" tar ((:url . "https://github.com/mola-T/flymd") (:commit . "84d5a68bcfed4a295952c33ffcd11e880978d9d7") (:revdesc . "84d5a68bcfed") (:keywords "markdown" "convenience") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainers ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz"))]) + (flyover . [(20251208 647) ((emacs (27 1)) (flymake (1 0))) "Display Flycheck and Flymake errors with overlays" tar ((:url . "https://github.com/konrad1977/flyover") (:commit . "0446b4289bd7a3f169f2ab8eb6f6fa0365322bab") (:revdesc . "0446b4289bd7") (:keywords "convenience" "tools" "flycheck" "flymake") (:authors ("Mikael Konradsson" . "mikael.konradsson@outlook.com")) (:maintainers ("Mikael Konradsson" . "mikael.konradsson@outlook.com")) (:maintainer "Mikael Konradsson" . "mikael.konradsson@outlook.com"))]) + (flyparens . [(20140723 1846) nil "Check for unbalanced parens on the fly" tar ((:url . "https://github.com/jiyoo/flyparens") (:commit . "af9b8cfd647d0e5f97684d613dc2eea7cfc19398") (:revdesc . "af9b8cfd647d") (:keywords "faces" "convenience" "lisp" "matching" "parentheses" "parens"))]) + (flyspell-correct . [(20220520 630) ((emacs (24))) "Correcting words with flyspell via custom interface" tar ((:url . "https://github.com/d12frosted/flyspell-correct") (:commit . "7d7b6b01188bd28e20a13736ac9f36c3367bd16e") (:revdesc . "7d7b6b01188b") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainers ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io"))]) + (flyspell-correct-avy-menu . [(20220520 630) ((flyspell-correct (0 6 1)) (avy-menu (0 1 1)) (emacs (24))) "Correcting words with flyspell via avy-menu interface" tar ((:url . "https://github.com/d12frosted/flyspell-correct") (:commit . "7d7b6b01188bd28e20a13736ac9f36c3367bd16e") (:revdesc . "7d7b6b01188b") (:authors ("Boris Buliga" . "boris@d12frosted.io") ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainers ("Boris Buliga" . "boris@d12frosted.io") ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Boris Buliga" . "boris@d12frosted.io"))]) + (flyspell-correct-helm . [(20220520 630) ((flyspell-correct (0 6 1)) (helm (1 9 0)) (emacs (24))) "Correcting words with flyspell via helm interface" tar ((:url . "https://github.com/d12frosted/flyspell-correct") (:commit . "7d7b6b01188bd28e20a13736ac9f36c3367bd16e") (:revdesc . "7d7b6b01188b") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainers ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io"))]) + (flyspell-correct-ivy . [(20220520 630) ((flyspell-correct (0 6 1)) (ivy (0 8 0)) (emacs (24 4))) "Correcting words with flyspell via ivy interface" tar ((:url . "https://github.com/d12frosted/flyspell-correct") (:commit . "7d7b6b01188bd28e20a13736ac9f36c3367bd16e") (:revdesc . "7d7b6b01188b") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainers ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io"))]) + (flyspell-correct-popup . [(20220520 630) ((flyspell-correct (0 6 1)) (popup (0 5 3)) (emacs (24))) "Correcting words with flyspell via popup interface" tar ((:url . "https://github.com/d12frosted/flyspell-correct") (:commit . "7d7b6b01188bd28e20a13736ac9f36c3367bd16e") (:revdesc . "7d7b6b01188b") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainers ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io"))]) + (flyspell-lazy . [(20210308 1253) nil "Improve flyspell responsiveness using idle timers" tar ((:url . "http://github.com/rolandwalker/flyspell-lazy") (:commit . "0fc5996bcee20b46cbd227ae948d343c3bef7339") (:revdesc . "0fc5996bcee2") (:keywords "spelling") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (flyspell-popup . [(20170529 815) ((popup (0 5 0))) "Correcting words with Flyspell in popup menus" tar ((:url . "https://github.com/xuchunyang/flyspell-popup") (:commit . "29311849bfd253b9b689bf331860b4c4d3bd4dde") (:revdesc . "29311849bfd2") (:keywords "convenience") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (fm-bookmarks . [(20170104 1716) ((emacs (24 3)) (cl-lib (0 5))) "Use file manager bookmarks (eg Dolphin, Nautilus, PCManFM) in Dired" tar ((:url . "http://github.com/kuanyui/fm-bookmarks.el") (:commit . "11dacfd16a926bfecba96a94c6b13e162c7717f7") (:revdesc . "11dacfd16a92") (:keywords "files" "convenience") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainers ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com"))]) + (fmo-mode . [(20240306 1442) ((emacs (29 1)) (difflib (0 3 7)) (format-all (0 5 0))) "Format only changed lines" tar ((:url . "https://github.com/xeechou/fmo-mode.el") (:commit . "eb63a36ee8ca0ec985e6fd043db974e6f9b38c83") (:revdesc . "eb63a36ee8ca") (:keywords "languages" "util") (:authors ("Xichen Zhou" . "sichem.zh@gmail.com")) (:maintainers ("Xichen Zhou" . "sichem.zh@gmail.com")) (:maintainer "Xichen Zhou" . "sichem.zh@gmail.com"))]) + (fn . [(20210304 1812) ((emacs (24)) (cl-lib (0 5)) (dash (2 18 0))) "Concise anonymous functions for Emacs Lisp" tar ((:url . "https://github.com/troyp/fn.el") (:commit . "98e3fe1b4785e162d9aca978a2db106baa79260f") (:revdesc . "98e3fe1b4785") (:keywords "functional"))]) + (focus . [(20241029 1506) ((emacs (24 3)) (cl-lib (0 5))) "Dim the font color of text in surrounding sections" tar ((:url . "http://github.com/larstvei/Focus") (:commit . "29b412b209c3542a7932c201f0166e48c9fd7fee") (:revdesc . "29b412b209c3") (:authors ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainers ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainer "Lars Tveito" . "larstvei@ifi.uio.no"))]) + (focus-autosave-mode . [(20160519 2116) ((emacs (24 4))) "Automatically save files in focus-out-hook" tar ((:url . "https://github.com/vifon/focus-autosave-mode.el") (:commit . "e89ed22aa4dfc76e1b844b202aedd468ad58814a") (:revdesc . "e89ed22aa4df") (:keywords "convenience" "files" "frames" "mouse") (:authors ("Wojciech Siewierski" . "wojciech.siewierski@onet.pl")) (:maintainers ("Wojciech Siewierski" . "wojciech.siewierski@onet.pl")) (:maintainer "Wojciech Siewierski" . "wojciech.siewierski@onet.pl"))]) + (foggy-night-theme . [(20190123 1614) ((emacs (24))) "Dark low contrast theme with soft and muted colors" tar ((:url . "https://github.com/mswift42/foggy-night-theme") (:commit . "14894e06ee5c6e14db36f2cb07387ee971c1736f") (:revdesc . "14894e06ee5c"))]) + (fold-dwim . [(20140208 1637) nil "Unified user interface for Emacs folding modes" tar ((:url . "http://www.dur.ac.uk/p.j.heslin/Software/Emacs") (:commit . "c46f4bb2ce91b4e307136320e72c28dd50b6cd8b") (:revdesc . "c46f4bb2ce91") (: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"))]) + (fold-dwim-org . [(20131203 1351) ((fold-dwim (1 2))) "Fold DWIM bound to org key-strokes" tar ((:url . "https://github.com/mlf176f2/fold-dwim-org") (:commit . "c09bb2b46d65afbd1d0febc6fded7495be7a3037") (:revdesc . "c09bb2b46d65") (:keywords "folding" "emacs" "org-mode"))]) + (fold-this . [(20191107 1816) nil "Just fold this region please" tar ((:url . "https://github.com/magnars/fold-this.el") (:commit . "c3912c738cf0515f65162479c55999e2992afce5") (:revdesc . "c3912c738cf0") (:keywords "convenience") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (folding . [(20250120 1132) nil "A folding-editor-like minor mode" tar ((:url . "https://github.com/jaalto/project-emacs--folding-mode") (:commit . "443b826c76a4938fc0961298ff0e6c924c723ed7") (:revdesc . "443b826c76a4") (:keywords "tools") (:maintainers ("Jari Aalto" . "jariaaltoATcantedtnet")) (:maintainer "Jari Aalto" . "jariaaltoATcantedtnet"))]) + (font-lock-profiler . [(20250104 2246) ((emacs (24 3))) "Coverage and timing tool for font-lock" tar ((:url . "https://github.com/Lindydancer/font-lock-profiler") (:commit . "6f19fda11de06f5f6c5b3732f056df762d685fcc") (:revdesc . "6f19fda11de0") (:keywords "faces" "tools"))]) + (font-lock-studio . [(20250309 1523) ((emacs (24 3))) "Debugger for Font Lock keywords" tar ((:url . "https://github.com/Lindydancer/font-lock-studio") (:commit . "12d542b939610367d99051655c76fd2b970fd0e4") (:revdesc . "12d542b93961") (:keywords "faces" "tools"))]) + (font-utils . [(20210405 1149) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Utility functions for working with fonts" tar ((:url . "http://github.com/rolandwalker/font-utils") (:commit . "abc572eb0dc30a26584c0058c3fe6c7273a10003") (:revdesc . "abc572eb0dc3") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (fontawesome . [(20240925 814) ((emacs (24 4))) "Fontawesome utility" tar ((:url . "https://github.com/emacsorphanage/fontawesome") (:commit . "d81096e5e8fa7e386a6bbfe02a50f0f7d6a5dca6") (:revdesc . "d81096e5e8fa") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (fontify-face . [(20251111 1121) ((emacs (25 1))) "Fontify symbols representing faces with that face" tar ((:url . "https://github.com/Fuco1/fontify-face") (:commit . "b975c764b6e9e070c7673317146b4d345ec83ef8") (:revdesc . "b975c764b6e9") (:keywords "faces") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (fontsloth . [(20250707 829) ((async (1 9 7)) (f (0 20 0)) (logito (0 1)) (pcache (0 5)) (stream (2 2 5)) (emacs (28 1))) "Elisp otf/ttf font loader/renderer" tar ((:url . "https://github.com/jollm/fontsloth") (:commit . "0835098743e060b2f2191f53d181257d6444dce4") (:revdesc . "0835098743e0") (:keywords "data" "font" "rasterization" "ttf" "otf") (:authors ("Jo Gay" . "jo.gay@mailfence.com")) (:maintainers ("Jo Gay" . "jo.gay@mailfence.com")) (:maintainer "Jo Gay" . "jo.gay@mailfence.com"))]) + (for . [(20230828 832) ((emacs (28 1))) "Iteration and sequence" tar ((:url . "https://github.com/usaoc/elisp-for") (:commit . "c0e9046d363a86a88fdcf73eacc09839aae4dd5a") (:revdesc . "c0e9046d363a") (:keywords "extensions") (:authors ("Wing Hei Chan" . "whmunkchan@outlook.com")) (:maintainers ("Wing Hei Chan" . "whmunkchan@outlook.com")) (:maintainer "Wing Hei Chan" . "whmunkchan@outlook.com"))]) + (forecast . [(20191004 1850) ((emacs (24 4))) "Weather forecasts" tar ((:url . "https://dev.gkayaalp.com/elisp/index.html#forecast-el") (:commit . "5f3e67448cc98fe2875115163849acae4d9e8526") (:revdesc . "5f3e67448cc9") (:keywords "weather" "forecast") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainers ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com"))]) + (foreign-regexp . [(20200325 50) nil "Search and replace by foreign regexp" tar ((:url . "https://github.com/k-talo/foreign-regexp.el") (:commit . "e2dd47f2160cadc194eb156e7c76c3c869e6706e") (:revdesc . "e2dd47f2160c") (:keywords "convenience" "emulations" "matching" "tools" "unix" "wp") (:authors ("K-talo Miyazaki" . "KeitarodotMiyazakiatgmaildotcom")) (:maintainers ("K-talo Miyazaki" . "KeitarodotMiyazakiatgmaildotcom")) (:maintainer "K-talo Miyazaki" . "KeitarodotMiyazakiatgmaildotcom"))]) + (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 ((:url . "http://github.com/zweifisch/foreman-mode") (:commit . "22b3bb13134b617870ed1e888af739f4818be929") (:revdesc . "22b3bb13134b") (:keywords "foreman") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com"))]) + (forest-blue-theme . [(20160627 842) ((emacs (24))) "Emacs theme with a dark background" tar ((:url . "https://github.com/olkinn/forest-blue-emacs") (:commit . "58096ce1a25615d2bae806c3775bae3e2775019d") (:revdesc . "58096ce1a256"))]) + (forge . [(20251201 1658) ((emacs (29 1)) (compat (30 1)) (closql (2 3)) (cond-let (0 2)) (emacsql (4 3)) (ghub (5 0)) (llama (1 0)) (magit (4 4)) (markdown-mode (2 7)) (seq (2 24)) (transient (0 10)) (yaml (1 2))) "Access Git forges from Magit" tar ((:url . "https://github.com/magit/forge") (:commit . "325dbcd6fff652e28787950bada2484241dd3365") (:revdesc . "325dbcd6fff6") (:keywords "git" "tools" "vc") (:authors ("Jonas Bernoulli" . "emacs.forge@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.forge@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.forge@jonas.bernoulli.dev"))]) + (forge-llm . [(20250731 117) ((emacs (25 1)) (forge (0 3 0)) (llm (0 16 1))) "LLM integration for generating PR descriptions in Forge" tar ((:url . "https://gitlab.com/rogs/forge-llm") (:commit . "ebd59266fd68bfd55a8115efc65817ba3e31c235") (:revdesc . "ebd59266fd68") (:keywords "convenience" "forge" "git" "llm" "github" "gitlab" "pull-request") (:authors ("Roger Gonzalez" . "roger@rogs.me")) (:maintainers ("Roger Gonzalez" . "roger@rogs.me")) (:maintainer "Roger Gonzalez" . "roger@rogs.me"))]) + (form-feed . [(20250426 2028) ((emacs (25 1))) "Display ^L glyphs as horizontal lines" tar ((:url . "https://depp.brause.cc/form-feed") (:commit . "6258fe6390a7bf264a6f02813502bf83a645d872") (:revdesc . "6258fe6390a7") (:keywords "faces") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (form-feed-st . [(20231002 2211) ((emacs (25 1))) "Display ^L glyphs as full-width horizontal lines" tar ((:url . "https://github.com/leodag/form-feed-st") (:commit . "f91c8daf35b7588e0aa24c8716c8cfd8ff0067c8") (:revdesc . "f91c8daf35b7") (:keywords "faces"))]) + (format-all . [(20241126 829) ((emacs (24 4)) (inheritenv (0 1)) (language-id (0 20))) "Auto-format C, C++, JS, Python, Ruby and 50 other languages" tar ((:url . "https://github.com/lassik/emacs-format-all-the-code") (:commit . "fd9c013f5f8094fef99ddabde07d9041737b8454") (:revdesc . "fd9c013f5f80") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (format-sql . [(20150422 1333) nil "Use format-sql to make your SQL readable in directly Emacs" tar ((:url . "https://github.com/paetzke/format-sql.el") (:commit . "97f475c245cd6c81a72a265678e2087cee66ac7b") (:revdesc . "97f475c245cd") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainers ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm"))]) + (format-table . [(20181223 1616) ((emacs (25)) (dash (2 14 1))) "Parse and reformat tabular data" tar ((:url . "https://github.com/functionreturnfunction/format-table") (:commit . "dfcae3a867e574577fc09a43b045889ff155b58f") (:revdesc . "dfcae3a867e5") (:keywords "data") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainers ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com"))]) + (forth-mode . [(20251027 730) ((cl-lib (0 2))) "Programming language mode for Forth" tar ((:url . "http://github.com/larsbrinkhoff/forth-mode") (:commit . "8f526ed38b52404c0ce55df6df5c8cbbc8f1de69") (:revdesc . "8f526ed38b52") (:keywords "languages" "forth") (:authors ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainers ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainer "Lars Brinkhoff" . "lars@nocrew.org"))]) + (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 ((:url . "https://github.com/rosenbrockc/fortpy-el") (:commit . "c614517e9396ef7a78be3b8786fbf303879cf43b") (:revdesc . "c614517e9396") (:authors ("Conrad Rosenbrock" . "rosenbrockcatgmail.com")) (:maintainers ("Conrad Rosenbrock" . "rosenbrockcatgmail.com")) (:maintainer "Conrad Rosenbrock" . "rosenbrockcatgmail.com"))]) + (fortune-cookie . [(20181223 842) nil "Print a fortune in your scratch buffer" tar ((:url . "https://github.com/andschwa/fortune-cookie") (:commit . "6c1c08f5be83822c0b762872ab25e3dbee96f333") (:revdesc . "6c1c08f5be83") (:keywords "fortune" "cowsay" "scratch" "startup") (:authors ("Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com")) (:maintainers ("Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com")) (:maintainer "Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com"))]) + (fountain-mode . [(20241106 219) ((emacs (24 4)) (seq (2 20))) "Major mode for screenwriting in Fountain markup" tar ((:url . "https://www.fountain-mode.org") (:commit . "74ddc5a783e8204beeda3343ea6725a3c198f4bc") (:revdesc . "74ddc5a783e8") (:keywords "wp" "text") (:authors ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainers ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainer "Paul W. Rankin" . "rnkn@rnkn.xyz"))]) + (fpga . [(20251119 2304) ((emacs (29 1))) "FPGA & ASIC Utils" tar ((:url . "https://github.com/gmlarumbe/fpga") (:commit . "48ec1572ab3c96cbc20d0c542cfe56124e05d48b") (:revdesc . "48ec1572ab3c") (:keywords "tools") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com"))]) + (fraktur-mode . [(20160815 227) ((cl-lib (0 5))) "Easily insert Unicode mathematical Fraktur characters" tar ((:url . "https://github.com/grettke/fraktur-mode") (:commit . "514baf5546aed12a0d9fa0fe66e87cdcc7843b08") (:revdesc . "514baf5546ae") (:keywords "unicode" "fraktur" "math" "mathematical") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainers (nil . "gcr@wisdomandwonder.com")) (:maintainer nil . "gcr@wisdomandwonder.com"))]) + (frame-local . [(20180330 940) ((emacs (25 1))) "Variables local to a frame" tar ((:url . "https://github.com/sebastiencs/frame-local") (:commit . "51c0889602626e2dcc6f1c1a812b058bc96df03c") (:revdesc . "51c088960262") (:keywords "frames" "tools" "local" "lisp") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainers ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is"))]) + (frame-mode . [(20230823 1850) ((s (1 9 0)) (emacs (24 4))) "Use frames instead of windows" tar ((:url . "https://github.com/IvanMalison/frame-mode") (:commit . "ab5e568a7c7259d31c252c263458bd76490241d0") (:revdesc . "ab5e568a7c72") (:keywords "frames") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (frame-purpose . [(20211011 1518) ((emacs (25 1)) (dash (2 18))) "Purpose-specific frames" tar ((:url . "http://github.com/alphapapa/frame-purpose.el") (:commit . "7d498147445cc0afb87b922a8225d2e163e5ed5a") (:revdesc . "7d498147445c") (:keywords "buffers" "convenience" "frames") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (frame-tag . [(20170111 6) ((cl-lib (0 5))) "Minor mode that assigns a unique number to each frame for easy switching" tar ((:url . "http://github.com/liangzan/frame-tag.el") (:commit . "73d6163568c7d32952175e663318b872f995a4e5") (:revdesc . "73d6163568c7") (:keywords "frame" "movement") (:authors ("Wong Liang Zan" . "zan@liangzan.net")) (:maintainers ("Wong Liang Zan" . "zan@liangzan.net")) (:maintainer "Wong Liang Zan" . "zan@liangzan.net"))]) + (frames-only-mode . [(20241201 1533) ((emacs (26 3)) (dash (2 13 0)) (s (1 11 0))) "Use frames instead of Emacs windows" tar ((:url . "https://github.com/davidshepherd7/frames-only-mode") (:commit . "9c82e779d89ead844ebd0e1a008af413e4cfc185") (:revdesc . "9c82e779d89e") (:keywords "frames" "windows") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com"))]) + (frameshot . [(20251101 2212) ((emacs (26 1)) (compat (30 1))) "Take screenshots of a frame" tar ((:url . "https://github.com/tarsius/frameshot") (:commit . "89ca25879b4c55da049f771870926a27bbfb1066") (:revdesc . "89ca25879b4c") (:keywords "multimedia") (:authors ("Jonas Bernoulli" . "emacs.frameshot@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.frameshot@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.frameshot@jonas.bernoulli.dev"))]) + (framesize . [(20131017 2132) ((key-chord (0 5 20080915))) "Change the size of frames in Emacs" tar ((:url . "http://github.com/nicferrier/emacs-framesize") (:commit . "f2dbf5d2513b2bc45f2085370a55c1754b6025da") (:revdesc . "f2dbf5d2513b") (:keywords "frames") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (frecency . [(20240111 628) ((emacs (25 1)) (a (0 1)) (dash (2 13 0))) "Library for sorting items by frequency and recency of access" tar ((:url . "http://github.com/alphapapa/frecency.el") (:commit . "4293bf4c8d571b0914e16a5aa05a6d657fdff551") (:revdesc . "4293bf4c8d57") (:keywords "extensions") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (frecentf . [(20231125 201) ((emacs (26 1)) (frecency (0 1 -1)) (persist (0 4)) (async (1 9 4))) "Pervasive recentf using frecency" tar ((:url . "https://launchpad.net/frecentf.el") (:commit . "ef788b2af412311fbc6f52d639810746e5c0fa93") (:revdesc . "ef788b2af412") (:keywords "files" "maint") (:authors ("Felipe Lema" . "felipel@mortemale.org")) (:maintainers ("Felipe Lema" . "felipel@mortemale.org")) (:maintainer "Felipe Lema" . "felipel@mortemale.org"))]) + (free-keys . [(20250512 1527) ((cl-lib (0 3))) "Show free keybindings for modkeys or prefixes" tar ((:url . "https://github.com/Fuco1/free-keys") (:commit . "bed8e9c356c889cd98dd7a4a63c69d6c4960cf82") (:revdesc . "bed8e9c356c8") (:keywords "convenience") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (freeradius-mode . [(20190401 1743) ((emacs (24 4))) "Major mode for FreeRadius server config files" tar ((:url . "https://github.com/VersBinarii/freeradius-mode") (:commit . "cf8bf0359cf6c77848facbd24b764b3e111b4c2d") (:revdesc . "cf8bf0359cf6"))]) + (fretboard . [(20250420 326) ((emacs (27 1)) (s (1 13 0)) (dash (2 19 0))) "Visualize guitar scales and chord shapes on a fretboard" tar ((:url . "https://github.com/skyefreeman/fretboard.el") (:commit . "064aeb7553c9bef86cf3de8d3c124809f1b3b381") (:revdesc . "064aeb7553c9") (:keywords "music" "guitar" "tools"))]) + (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 ((:url . "https://github.com/p3r7/friendly-shell") (:commit . "5cafa3f6313ce04a47c8996ea1ac6b617d155d46") (:revdesc . "5cafa3f6313c") (:keywords "processes" "terminals"))]) + (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 ((:url . "https://github.com/p3r7/friendly-shell") (:commit . "5cafa3f6313ce04a47c8996ea1ac6b617d155d46") (:revdesc . "5cafa3f6313c") (:keywords "processes" "terminals"))]) + (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 ((:url . "https://github.com/p3r7/friendly-shell") (:commit . "5cafa3f6313ce04a47c8996ea1ac6b617d155d46") (:revdesc . "5cafa3f6313c") (:keywords "processes" "terminals"))]) + (friendly-tramp-path . [(20200502 1032) ((cl-lib (0 6 1))) "Human-friendly TRAMP path construction" tar ((:url . "https://github.com/p3r7/prf-tramp") (:commit . "be572b8953b9e5a3a35c30bb64c2936d3e9802ba") (:revdesc . "be572b8953b9"))]) + (frimacs . [(20250809 723) ((emacs (26 1))) "An environment for the FriCAS computer algebra system" tar ((:url . "https://github.com/pdo/frimacs") (:commit . "8f94c8389c559dee33ae271d97e4efa2fffbc47c") (:revdesc . "8f94c8389c55") (:keywords "fricas" "computer algebra" "extensions" "tools") (:authors ("Paul Onions" . "paul.onions@acm.org")) (:maintainers ("Paul Onions" . "paul.onions@acm.org")) (:maintainer "Paul Onions" . "paul.onions@acm.org"))]) + (fringe-current-line . [(20140111 411) nil "Show current line on the fringe" tar ((:url . "http://github.com/kyanagi/fringe-current-line/raw/master/fringe-current-line.el") (:commit . "0ef000bac76abae30601222e6f06c7d133ab4942") (:revdesc . "0ef000bac76a") (:authors ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainers ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainer "Kouhei Yanagita" . "yanagi@shakenbu.org"))]) + (fringe-helper . [(20140620 2109) nil "Helper functions for fringe bitmaps" tar ((:url . "http://nschum.de/src/emacs/fringe-helper/") (:commit . "9bc3d3e82c9cc3937aa090248dc4dd2e289fc55c") (:revdesc . "9bc3d3e82c9c") (:keywords "lisp") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainer "Nikolaj Schumacher" . "bugs*nschumde"))]) + (frog-jump-buffer . [(20221114 141) ((emacs (24)) (avy (0 4 0)) (dash (2 4 0)) (frog-menu (0 2 8))) "The fastest buffer-jumping Emacs lisp package around" tar ((:url . "https://github.com/waymondo/frog-jump-buffer") (:commit . "ab830cb7a5af9429866ba88fb37589a0366d8bf2") (:revdesc . "ab830cb7a5af") (:keywords "convenience" "tools"))]) + (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 ((:url . "https://github.com/thefrontside/frontmacs") (:commit . "18816534a977fbd28848389b58c22b6538cfdeec") (:revdesc . "18816534a977") (:keywords "files" "tools") (:authors ("Frontside Engineering" . "engineering@frontside.com")) (:maintainers ("Frontside Engineering" . "engineering@frontside.com")) (:maintainer "Frontside Engineering" . "engineering@frontside.com"))]) + (fsbot-data-browser . [(20220830 230) nil "Browse the fsbot database using tabulated-list-mode" tar ((:url . "http://github.com/benaiah/fsbot-data-browser") (:commit . "27455860fec01ca47bf98b85f093cc24b9852bef") (:revdesc . "27455860fec0") (:keywords "fsbot" "irc" "tabulated-list-mode"))]) + (fsharp-mode . [(20250630 1818) ((emacs (25))) "Support for the F# programming language" tar ((:url . "https://github.com/fsharp/emacs-fsharp-mode") (:commit . "9b2405bb8367661fde1b55a6b8a5793bb324282d") (:revdesc . "9b2405bb8367") (:keywords "languages") (:authors ("2010-2011 Laurent Le Brun" . "laurent@le-brun.eu") ("2012-2014 Robin Neatherway" . "robin.neatherway@gmail.com")))]) + (fsrs . [(20251119 1629) ((emacs (25 1))) "Free Spaced Repetition Scheduler" tar ((:url . "https://github.com/open-spaced-repetition/lisp-fsrs") (:commit . "3260544388b9239dc3710eb16ff202a279391260") (:revdesc . "3260544388b9") (:keywords "tools"))]) + (fstar-mode . [(20250402 820) ((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 ((:url . "https://github.com/FStarLang/fstar-mode.el") (:commit . "3bbfe93abd077103e9e4417d076d4f4d21e9acab") (:revdesc . "3bbfe93abd07") (:keywords "convenience" "languages") (: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"))]) + (fuel . [(20241006 231) ((cl-lib (0 2)) (emacs (24 2))) "Major mode for the Factor programming language" tar ((:url . "https://github.com/factor/fuel") (:commit . "6d0e98494f89d8b7dcfcae4cf83775562bf44ea9") (:revdesc . "6d0e98494f89") (:keywords "languages" "fuel" "factor") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainers ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org"))]) + (fuff . [(20170202 1503) ((seq (2 3))) "Find files with findutils, recursively" tar ((:url . "https://github.com/joelmo/fuff") (:commit . "278e849913df87bd8756c59382282d87474802c3") (:revdesc . "278e849913df") (:keywords "files" "project" "convenience"))]) + (full-ack . [(20140223 1732) nil "A front-end for ack" tar ((:url . "http://nschum.de/src/emacs/full-ack/") (:commit . "8345753e9569dabf6426a837f29387557e32f2af") (:revdesc . "8345753e9569") (:keywords "tools" "matching") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainer "Nikolaj Schumacher" . "bugs*nschumde"))]) + (fullframe . [(20210226 1057) ((cl-lib (0 5))) "Generalized automatic execution in a single frame" tar ((:url . "https://git.sr.ht/~tomterl/fullframe") (:commit . "886b831c001b44ec95aec4ff36e8bc1b3003c786") (:revdesc . "886b831c001b") (:keywords "fullscreen") (:authors ("Tom Regner" . "tom@goochesa.de")) (:maintainers ("Tom Regner" . "tom@goochesa.de")) (:maintainer "Tom Regner" . "tom@goochesa.de"))]) + (function-args . [(20220516 1226) ((ivy (0 9 1))) "C++ completion for GNU Emacs" tar ((:url . "https://github.com/abo-abo/function-args") (:commit . "beba049751fed78666c87bd146a6f1cf149bb819") (:revdesc . "beba049751fe") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (fuo . [(20190812 927) ((emacs (24 4))) "Feeluown client" tar ((:url . "http://github.com/cosven/emacs-fuo") (:commit . "0e4122f94a336a50c02bc96652d25ac3d74bedeb") (:revdesc . "0e4122f94a33") (:keywords "feeluown" "multimedia" "unix") (:authors ("cosven" . "yinshaowen241@gmail.com")) (:maintainers ("cosven" . "yinshaowen241@gmail.com")) (:maintainer "cosven" . "yinshaowen241@gmail.com"))]) + (furl . [(20150509 316) nil "Friendly URL retrieval" tar ((:url . "https://github.com/nex3/furl-el") (:commit . "014438271e0ef27333dfcd599cb247f12a20d870") (:revdesc . "014438271e0e") (:authors ("Natalie Weizenbaum" . "nweiz@google.com")) (:maintainers ("Natalie Weizenbaum" . "nweiz@google.com")) (:maintainer "Natalie Weizenbaum" . "nweiz@google.com"))]) + (fussy . [(20250820 104) ((emacs (28 2)) (flx (0 5)) (compat (30 0 0 0))) "Fuzzy completion style using `flx'" tar ((:url . "https://github.com/jojojames/fussy") (:commit . "163ded34be3e9230702201d0abe1e7b85e815c2d") (:revdesc . "163ded34be3e") (:keywords "matching") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (futhark-mode . [(20250311 1518) ((emacs (24 3)) (cl-lib (0 5)) (reformatter (0 4))) "Major mode for editing Futhark source files" tar ((:url . "https://github.com/diku-dk/futhark-mode") (:commit . "ac363a47f6b24b9af5b817fb7bd94c16ebd46c3d") (:revdesc . "ac363a47f6b2") (:keywords "languages"))]) + (fuz . [(20200104 524) ((emacs (25 1))) "Fast and precise fuzzy scoring/matching utils" tar ((:url . "https://github.com/cireu/fuz.el") (:commit . "0b6b64cebde5675be3a28520ee16234db48d3b8b") (:revdesc . "0b6b64cebde5") (:keywords "lisp") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainers ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com"))]) + (fuzzy . [(20250101 843) ((emacs (24 3))) "Fuzzy Matching" tar ((:url . "https://github.com/auto-complete/fuzzy-el") (:commit . "09ef98ecdea03497ae309fd0ed740190e9a3492e") (:revdesc . "09ef98ecdea0") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))]) + (fuzzy-clock . [(20251109 17) ((emacs (26 1))) "Display time in a human-friendly, approximate way" tar ((:url . "https://github.com/trevoke/fuzzy-clock.el") (:commit . "6b1a33296d856aeee0b29cdf65a9e614054ef94a") (:revdesc . "6b1a33296d85") (:keywords "calendar" "time"))]) + (fuzzy-finder . [(20250318 632) ((emacs (24 4))) "Fuzzy Finder App Integration" tar ((:url . "https://github.com/10sr/fuzzy-finder-el") (:commit . "097072165c0ee4a2200229f39851bd85ca0ea92c") (:revdesc . "097072165c0e") (:keywords "matching") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainers ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com"))]) + (fvwm-mode . [(20230214 2149) nil "A major mode for editing Fvwm configuration files" tar ((:url . "https://github.com/theBlackDragon/fvwm-mode") (:commit . "574c0370f6199c9a1492923bf0d35fdd26738d24") (:revdesc . "574c0370f619") (:keywords "files") (:authors ("Bert Geens" . "bert@lair.be")) (:maintainers ("Bert Geens" . "bert@lair.be")) (:maintainer "Bert Geens" . "bert@lair.be"))]) + (fwb-cmds . [(20251101 2015) ((emacs (26 1)) (compat (30 1))) "Misc frame, window and buffer commands" tar ((:url . "https://github.com/tarsius/fwb-cmds") (:commit . "2c36c716a5cf86e790ad1acbd2a062230c78eec2") (:revdesc . "2c36c716a5cf") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "emacs.fwb-cmds@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.fwb-cmds@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.fwb-cmds@jonas.bernoulli.dev"))]) + (fxrd-mode . [(20250705 116) ((s (1 2))) "Major mode for editing fixed field width files" tar ((:url . "https://github.com/msherry/fxrd-mode") (:commit . "7f755e1ff4a6451bc97fcefef8e96f563311fb1a") (:revdesc . "7f755e1ff4a6") (:keywords "convenience") (:authors ("Marc Sherry" . "(msherry@gmail.com)")) (:maintainers ("Marc Sherry" . "(msherry@gmail.com)")) (:maintainer "Marc Sherry" . "(msherry@gmail.com)"))]) + (fyure . [(20130216 1314) nil "An interface to fix Japanese hyoki-yure" tar ((:url . "https://github.com/mooz/fyure") (:commit . "b6977f1eb148e8b63259f7233b55bb050e44d9b8") (:revdesc . "b6977f1eb148") (:keywords "languages") (:authors ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainers ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainer "Masafumi Oyamada" . "stillpedant@gmail.com"))]) + (fzf . [(20240822 201) ((emacs (24 4))) "A front-end for fzf" tar ((:url . "https://github.com/bling/fzf.el") (:commit . "641aef33c88df3733f13d559bcb2acc548a4a0c3") (:revdesc . "641aef33c88d") (:keywords "fzf" "fuzzy" "search"))]) + (gameoflife . [(20250102 900) nil "Screensaver running Conway's Game of Life" tar ((:url . "https://github.com/Lindydancer/gameoflife") (:commit . "5f4ac265928bfd88765d057b44cebcef71a7aaf6") (:revdesc . "5f4ac265928b") (:keywords "games"))]) + (gams-ac . [(20180423 926) ((emacs (24)) (auto-complete (1 0)) (gams-mode (4 0))) "Auto-complete source file for GAMS mode" tar ((:url . "https://github.com/ShiroTakeda/gams-ac") (:commit . "66d04ff36033f54205c19bc1d893e926d4dbf02e") (:revdesc . "66d04ff36033") (:keywords "languages" "tools" "gams-mode" "auto-complete"))]) + (gams-mode . [(20251124 1517) ((emacs (25 1))) "Major mode for General Algebraic Modeling System (GAMS)" tar ((:url . "https://github.com/ShiroTakeda/gams-mode") (:commit . "dfab98a2ef847bae4bc3ae3abdf638355efd73db") (:revdesc . "dfab98a2ef84") (:keywords "languages" "tools" "gams"))]) + (gandalf-theme . [(20130809 947) nil "Gandalf color theme" tar ((:url . "https://github.com/ptrv/gandalf-theme-emacs") (:commit . "4e472fc851431458537d458d09c1f5895e338536") (:revdesc . "4e472fc85143") (:keywords "color" "theme") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainers ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))]) + (gap-mode . [(20240430 210) nil "Major mode for editing files in the GAP programming language" tar ((:url . "https://gitlab.com/gvol/gap-mode") (:commit . "09b4082b6e28141537696bb832c8ecc975ec57d8") (:revdesc . "09b4082b6e28") (:keywords "gap") (:authors ("Michael Smith" . "smith@pell.anu.edu.au") ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainers ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com"))]) + (gather . [(20141230 1338) nil "Gather string in buffer" tar ((:url . "https://github.com/mhayashi1120/Emacs-gather/raw/master/gather.el") (:commit . "8909c886d72a682710bb79ccfcfe4df54a399b7e") (:revdesc . "8909c886d72a") (:keywords "matching" "convenience" "tools") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (gcmh . [(20201116 2251) ((emacs (24))) "The Garbage Collector Magic Hack" tar ((:url . "https://gitlab.com/koral/gcmh") (:commit . "0089f9c3a6d4e9a310d0791cf6fa8f35642ecfd9") (:revdesc . "0089f9c3a6d4") (:keywords "internal") (:authors ("Andrea Corallo" . "akrl@sdf.org")) (:maintainers (nil . "akrl@sdf.org")) (:maintainer nil . "akrl@sdf.org"))]) + (gcode-mode . [(20230823 2141) ((emacs (24 4))) "Simple G-Code major mode" tar ((:url . "https://gitlab.com/wavexx/gcode-mode.el") (:commit . "4b54553a698d81e52dde14037df94774c7f30b95") (:revdesc . "4b54553a698d") (:keywords "gcode" "languages" "highlight" "syntax") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (gdb-x . [(20251107 1256) ((emacs (29 1))) "Improve GDB-MI user interface" tar ((:url . "https://codeberg.org/pastor/gdb-x") (:commit . "7e03680f7b5a001341d1892daa69bc32fcf75113") (:revdesc . "7e03680f7b5a") (:keywords "extensions") (:authors ("Sergio Pastor Pérez" . "sergio.pastorperez@outlook.es")) (:maintainers ("Sergio Pastor Pérez" . "sergio.pastorperez@outlook.es")) (:maintainer "Sergio Pastor Pérez" . "sergio.pastorperez@outlook.es"))]) + (gdscript-mode . [(20251104 1437) ((emacs (26 3))) "Major mode for Godot's GDScript language" tar ((:url . "https://github.com/godotengine/emacs-gdscript-mode/") (:commit . "e94dfd9dc7a50261b2c41ae3daa05043331a54a8") (:revdesc . "e94dfd9dc7a5") (:keywords "languages") (:authors ("Nathan Lovato" . "nathan@gdquest.com") ("Fabián E. Gallina" . "fgallina@gnu.org")) (:maintainers (nil . "nathan@gdquest.com")) (:maintainer nil . "nathan@gdquest.com"))]) + (gdshader-mode . [(20251123 1852) ((emacs (24 3)) (glsl-mode (2 4))) "Major mode for Godot gdshader files" tar ((:url . "https://github.com/bbbscarter/gdshader-mode") (:commit . "8e9efda9393d44be96009f37ff7201df3d36f05f") (:revdesc . "8e9efda9393d") (:keywords "languages" "opengl" "gpu" "godot") (:authors ("Simon Carter" . "bbbscarter@gmail.com")) (:maintainers ("Simon Carter" . "bbbscarter@gmail.com")) (:maintainer "Simon Carter" . "bbbscarter@gmail.com"))]) + (geben . [(20220827 105) ((emacs (24 3)) (cl-lib (0 5))) "DBGp protocol frontend, a script debugger" tar ((:url . "https://github.com/ahungry/geben") (:commit . "8df1ed2c8ff13b0ca4ef241c95c46f60a5a4fe3c") (:revdesc . "8df1ed2c8ff1") (:keywords "c" "comm" "tools") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (geben-helm-projectile . [(20170524 334) ((emacs (24)) (geben (0 26)) (helm-projectile (0 13 0))) "Integrate helm-projectile with geben" tar ((:url . "https://github.com/ahungry/geben-helm-projectile") (:commit . "31ce0faca5dcc71924884f03fd5a7a25d00ccd9b") (:revdesc . "31ce0faca5dc") (:keywords "ahungry" "emacs" "geben" "helm" "projectile" "debug") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (geeknote . [(20220213 612) ((emacs (24))) "Use Evernote in Emacs through geeknote" tar ((:url . "http://github.com/avendael/emacs-geeknote") (:commit . "ce2738aebeeda35f9d31027e9b7bad0813b975c3") (:revdesc . "ce2738aebeed") (:keywords "evernote" "geeknote" "note" "emacs-evernote" "evernote-mode"))]) + (geiser . [(20251220 2301) ((emacs (27 1)) (project (0 8 1))) "GNU Emacs and Scheme talk to each other" tar ((:url . "https://gitlab.com/emacs-geiser/") (:commit . "8842104d1521a00c182ce78e9d50d394e9ba86f5") (:revdesc . "8842104d1521") (:keywords "languages" "scheme" "geiser") (:authors ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")) (:maintainers ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")) (:maintainer "Jose Antonio Ortega Ruiz" . "(jao@gnu.org)"))]) + (geiser-chez . [(20230707 1334) ((emacs (26 1)) (geiser (0 19))) "Chez and Geiser talk to each other" tar ((:url . "https://gitlab.com/emacs-geiser/chez") (:commit . "605a81ff7b2d2b275a3ec68e3ce7e5b50f85014d") (:revdesc . "605a81ff7b2d") (:keywords "languages" "chez" "scheme" "geiser") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org"))]) + (geiser-chibi . [(20240521 2252) ((emacs (24 4)) (geiser (0 18))) "Chibi Scheme's implementation of the geiser protocols" tar ((:url . "https://gitlab.com/emacs-geiser/chibi") (:commit . "2502fed1349c2703eea528b74bcc980ad6bceab8") (:revdesc . "2502fed1349c") (:keywords "languages" "chibi" "scheme" "geiser") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org"))]) + (geiser-chicken . [(20250803 1721) ((emacs (24 4)) (geiser (0 19))) "Chicken's implementation of the geiser protocols" tar ((:url . "https://gitlab.com/emacs-geiser/chicken") (:commit . "8342bad8ce1c79fee3563cd95ee27a8b062f6a9e") (:revdesc . "8342bad8ce1c") (:keywords "languages" "chicken" "scheme" "geiser"))]) + (geiser-gambit . [(20220208 1356) ((emacs (26 1)) (geiser (0 18))) "Gambit's implementation of the geiser protocols" tar ((:url . "https://gitlab.com/emacs-geiser/gambit") (:commit . "381d74ca5059b44fe3d8b5daf42214019c6d1a88") (:revdesc . "381d74ca5059") (:keywords "languages" "gambit" "scheme" "geiser") (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org"))]) + (geiser-gauche . [(20251213 1148) ((emacs (26 1)) (geiser (0 11 2))) "Gauche scheme support for Geiser" tar ((:url . "https://gitlab.com/emacs-geiser/gauche") (:commit . "adbd3c8d9031955c5941af459ea0e2bd60b7c925") (:revdesc . "adbd3c8d9031") (:keywords "languages" "gauche" "scheme" "geiser") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainers ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com"))]) + (geiser-guile . [(20240920 35) ((emacs (26 1)) (transient (0 3)) (geiser (0 28 1))) "Guile and Geiser talk to each other" tar ((:url . "https://gitlab.com/emacs-geiser/guile") (:commit . "a0f111f8dedd31c593c4ed12c0b99745f3c1340f") (:revdesc . "a0f111f8dedd") (:keywords "languages" "guile" "scheme" "geiser") (:authors ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")) (:maintainers ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")) (:maintainer "Jose Antonio Ortega Ruiz" . "(jao@gnu.org)"))]) + (geiser-kawa . [(20210920 1607) ((emacs (26 1)) (geiser (0 16))) "Kawa scheme support for Geiser" tar ((:url . "https://gitlab.com/emacs-geiser/kawa") (:commit . "5896b19642923f74f718eb68d447560b2d26d797") (:revdesc . "5896b1964292") (:keywords "languages" "kawa" "scheme" "geiser") (:authors ("spellcard199" . "spellcard199@protonmail.com")) (:maintainers ("spellcard199" . "spellcard199@protonmail.com")) (:maintainer "spellcard199" . "spellcard199@protonmail.com"))]) + (geiser-mit . [(20240909 1145) ((emacs (24 4)) (geiser (0 18))) "MIT/GNU Scheme's implementation of the geiser protocols" tar ((:url . "https://gitlab.com/emacs-geiser/mit") (:commit . "ddd2ba733e8274d40a26b5d6d2ee11f1bac8abe6") (:revdesc . "ddd2ba733e82") (:keywords "languages" "mit" "scheme" "geiser") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org"))]) + (geiser-overlay . [(20240920 816) ((emacs (24 4)) (geiser (0 31))) "Overlay Scheme evaluation results" tar ((:url . "https://github.com/port19x/geiser-overlay") (:commit . "dd02acf804d6d3c0ac4f86ed580316b19a7f5d5c") (:revdesc . "dd02acf804d6") (:keywords "lisp" "scheme") (:authors ("port19" . "port19@port19.xyz")) (:maintainers ("port19" . "port19@port19.xyz")) (:maintainer "port19" . "port19@port19.xyz"))]) + (geiser-racket . [(20210421 125) ((emacs (26 1)) (geiser (0 16))) "Support for Racket in Geiser" tar ((:url . "https://gitlab.com/emacs-geiser/racket") (:commit . "22e56ce80389544d3872cf4beb4008fb514b2218") (:revdesc . "22e56ce80389") (:keywords "languages" "racket" "scheme" "geiser") (:authors ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")) (:maintainers ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")) (:maintainer "Jose Antonio Ortega Ruiz" . "(jao@gnu.org)"))]) + (geiser-stklos . [(20231004 2013) ((emacs (24 4)) (geiser (0 16))) "STklos Scheme implementation of the geiser protocols" tar ((:url . "https://gitlab.com/emacs-geiser/stklos") (:commit . "c634fc2049f1616b772f5e9cb78c6171dcc4c34d") (:revdesc . "c634fc2049f1") (:keywords "languages" "stklos" "scheme" "geiser") (:authors ("Jeronimo Pellegrini" . "(j_p@aleph0.info)")) (:maintainers ("Jeronimo Pellegrini" . "(j_p@aleph0.info)")) (:maintainer "Jeronimo Pellegrini" . "(j_p@aleph0.info)"))]) + (gemini-mode . [(20221127 1619) ((emacs (24 4))) "A simple highlighting package for text/gemini" tar ((:url . "https://git.carcosa.net/jmcbray/gemini.el") (:commit . "a7dd7c6ea4e036d0d5ecc4a5d284874c400f10ba") (:revdesc . "a7dd7c6ea4e0") (:keywords "languages") (:authors ("Jason McBrayer" . "jmcbray@carcosa.net") ("tastytea" . "tastytea@tastytea.de") ("tienne Deparis" . "etienne@depar.is")) (:maintainers ("Jason McBrayer" . "jmcbray@carcosa.net") ("tastytea" . "tastytea@tastytea.de") ("tienne Deparis" . "etienne@depar.is")) (:maintainer "Jason McBrayer" . "jmcbray@carcosa.net"))]) + (gemini-write . [(20211114 1032) ((emacs (26)) (elpher (2 8 0)) (gemini-mode (1 0 0))) "Elpher for Titan" tar ((:url . "https://alexschroeder.ch/cgit/gemini-write") (:commit . "2a7d07d0ce4c5b8750f3ff1182ad94ee616734c8") (:revdesc . "2a7d07d0ce4c") (:keywords "comm" "gemini") (:authors ("Alex Schroeder" . "alex@gnu.org")) (:maintainers ("Alex Schroeder" . "alex@gnu.org")) (:maintainer "Alex Schroeder" . "alex@gnu.org"))]) + (gemtext-mode . [(20241129 820) ((emacs (29 1))) "Major mode for Gemtext-formatted text" tar ((:url . "https://sr.ht/~arjca/gemtext-mode.el/") (:commit . "9e6a7373759afbb8b05e322a3c7b52fc9255c16c") (:revdesc . "9e6a7373759a") (:keywords "languages" "gemtext" "gemini") (:authors ("Antoine Aubé" . "courriel@arjca.fr")) (:maintainers ("Antoine Aubé" . "courriel@arjca.fr")) (:maintainer "Antoine Aubé" . "courriel@arjca.fr"))]) + (general . [(20250612 2309) ((emacs (24 4)) (cl-lib (0 5))) "Convenience wrappers for keybindings" tar ((:url . "https://github.com/noctuid/general.el") (:commit . "a48768f85a655fe77b5f45c2880b420da1b1b9c3") (:revdesc . "a48768f85a65") (:keywords "vim" "evil" "leader" "keybindings" "keys") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net"))]) + (genexpr-mode . [(20240930 1335) ((emacs (27 1))) "Major mode for editing GenExpr files" tar ((:url . "https://github.com/larme/genexpr-mode") (:commit . "27d9d4d32aef1799698ddbf75e92cb71d0ce99bf") (:revdesc . "27d9d4d32aef") (:keywords "languages" "dsp") (:authors ("Zhao Shenyang" . "dev@zsy.im")) (:maintainers ("Zhao Shenyang" . "dev@zsy.im")) (:maintainer "Zhao Shenyang" . "dev@zsy.im"))]) + (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 ((:url . "https://github.com/aki2o/emacs-genrnc") (:commit . "da75b1966a73ad215ec2ced4522c25f4d0bf1f9a") (:revdesc . "da75b1966a73") (:keywords "xml") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (geoip . [(20200310 911) ((emacs (25 1))) "Find out where an IP address is located via GeoIP2" tar ((:url . "https://github.com/xuchunyang/geoip.el") (:commit . "b4952890993642c7055f4bbbf05b0384740f8f51") (:revdesc . "b49528909936") (:keywords "tools"))]) + (geolocation . [(20200317 1559) ((request-deferred (0 3 2)) (deferred (0 5 1)) (emacs (25 1))) "Get your location on Earth" tar ((:url . "https://github.com/gonewest818/geolocation.el") (:commit . "08e3569024659f6f04cb269ad213d144fd8e2a95") (:revdesc . "08e356902465") (:keywords "hardware") (:authors ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (german-holidays . [(20181213 644) nil "German holidays for Emacs calendar" tar ((:url . "https://github.com/rudolfochrist/german-holidays") (:commit . "a8462dffccaf2b665f2032e646b5370e993a386a") (:revdesc . "a8462dffccaf") (:authors ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainers ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainer "Sebastian Christ" . "rudolfo.christ@gmail.com"))]) + (germanium . [(20220716 1500) ((emacs (26 1))) "Generate image from source code using germanium" tar ((:url . "https://github.com/matsuyoshi30/germanium-el") (:commit . "7292aa6870cf8b0acb34a8750da32b44d83cd65c") (:revdesc . "7292aa6870cf") (:keywords "convenience"))]) + (gerrit . [(20251105 2119) ((emacs (28 2)) (magit (2 13 1)) (s (1 12 0)) (dash (0 2 15))) "Gerrit client" tar ((:url . "https://github.com/twmr/gerrit.el") (:commit . "e89b21d2f464ead98a60d8ecc79c359be886b232") (:revdesc . "e89b21d2f464") (:keywords "extensions") (:authors ("Thomas Wimmer" . "thomaswimmer@posteo.com")) (:maintainers ("Thomas Wimmer" . "thomaswimmer@posteo.com")) (:maintainer "Thomas Wimmer" . "thomaswimmer@posteo.com"))]) + (gf . [(20181028 1542) ((s (1 0)) (ht (2 0))) "Major mode for editing GF code" tar ((:url . "https://github.com/GrammaticalFramework/gf-emacs-mode") (:commit . "49fa46db67634530499be969ffd3c436a22d4404") (:revdesc . "49fa46db6763") (:keywords "languages") (:authors ("Johan Bockgård" . "bojohan+mail@dd.chalmers.se")) (:maintainers ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com"))]) + (ggo-mode . [(20210310 1345) nil "Gengetopt major mode" tar ((:url . "https://github.com/mkjunker/ggo-mode") (:commit . "6a7617b5af3d13029e4d680a375e8107c40d0fac") (:revdesc . "6a7617b5af3d") (:keywords "extensions" "convenience" "local") (:authors ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainers ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainer "Matthew K. Junker" . "junker@alum.mit.edu"))]) + (ggtags . [(20230602 133) ((emacs (25))) "Emacs frontend to GNU Global source code tagging system" tar ((:url . "https://github.com/leoliu/ggtags") (:commit . "4e3630c30fb836872b5d8f2ae3e5d5ae003365d8") (:revdesc . "4e3630c30fb8") (:keywords "tools" "convenience") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainers ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com"))]) + (gh . [(20230825 1217) ((emacs (25 1)) (pcache (0 4 2)) (logito (0 1)) (marshal (0 9 0)) (cl-lib (0 3))) "A GitHub library for Emacs" tar ((:url . "https://github.com/sigma/gh.el") (:commit . "b5a8d8209340d49ad82dab22d23dae0434499fdf") (:revdesc . "b5a8d8209340") (:authors ("Yann Hodique" . "yhodique@gmail.com")) (:maintainers ("Yann Hodique" . "yhodique@gmail.com")) (:maintainer "Yann Hodique" . "yhodique@gmail.com"))]) + (gh-md . [(20220316 1432) ((emacs (24 3))) "Render markdown using the Github api" tar ((:url . "https://github.com/emacs-pe/gh-md.el") (:commit . "e721fd5e41e682f47f2dd4ce26ef2ba28c7fa0b5") (:revdesc . "e721fd5e41e6") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (gh-notify . [(20251209 1735) ((emacs (29 1)) (magit (3 3 0)) (forge (0 4 0))) "A veneer for Magit/Forge GitHub notifications" tar ((:url . "https://github.com/anticomputer/gh-notify") (:commit . "d606d1390778cb104c28dbc5220e685293e1e687") (:revdesc . "d606d1390778") (:keywords "comm") (:authors ("Bas Alberts" . "bas@anti.computer") ("xristos" . "xristos@sdf.org")) (:maintainers ("Bas Alberts" . "bas@anti.computer")) (:maintainer "Bas Alberts" . "bas@anti.computer"))]) + (ghc-imported-from . [(20141124 1932) ((emacs (24 1))) "Haskell documentation lookup with ghc-imported-from" tar ((:url . "https://github.com/david-christiansen/ghc-imported-from-el") (:commit . "fcff08628a19f5d26151564659218cc677779b79") (:revdesc . "fcff08628a19") (:keywords "languages") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))]) + (ghci-completion . [(20151125 1257) ((emacs (24 1)) (cl-lib (0 5))) "Completion for GHCi commands in inferior-haskell buffers" tar ((:url . "https://github.com/manzyuk/ghci-completion") (:commit . "c47e23d585d2a3c7b13aac163693fdc4f2bb90e5") (:revdesc . "c47e23d585d2") (:keywords "convenience") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainers ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com"))]) + (gherkin-mode . [(20171224 1353) nil "An emacs major mode for editing gherkin files" tar ((:url . "https://github.com/candera/gherkin-mode") (:commit . "0313492e7da152f0aa73ddf96c0287ded8f51253") (:revdesc . "0313492e7da1") (:keywords "languages"))]) + (ghost-blog . [(20171023 742) ((markdown-mode (1 0))) "A package to manage Ghost blog" tar ((:url . "https://github.com/javaguirre/ghost-blog") (:commit . "71b358643cc9a2db1bf752281ff94aba9b59e4cc") (:revdesc . "71b358643cc9") (:keywords "ghost" "blog") (:authors ("Javier Aguirre" . "hello@javaguirre.net")) (:maintainers ("Javier Aguirre" . "hello@javaguirre.net")) (:maintainer "Javier Aguirre" . "hello@javaguirre.net"))]) + (ghq . [(20230510 332) ((emacs (26 1)) (dash (2 18 0)) (s (1 7 0))) "Ghq interface for emacs" tar ((:url . "https://github.com/lafrenierejm/emacs-ghq") (:commit . "eb197c14e53ac57a136ea8d34eec7528487c3301") (:revdesc . "eb197c14e53a") (:keywords "convenience") (:authors ("Roman Coedo" . "romancoedo@gmail.com")) (:maintainers ("Joseph LaFreniere" . "joseph@lafreniere.xyz")) (:maintainer "Joseph LaFreniere" . "joseph@lafreniere.xyz"))]) + (ghub . [(20251130 1842) ((emacs (29 1)) (compat (30 1)) (cond-let (0 2)) (llama (1 0)) (treepy (0 1 2))) "Client libraries for Git forge APIs" tar ((:url . "https://github.com/magit/ghub") (:commit . "9f416605d560ed2a6b62a87d1f624549901b1102") (:revdesc . "9f416605d560") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev"))]) + (ghub+ . [(20191229 1748) ((emacs (25)) (ghub (2 0)) (apiwrap (0 5))) "A thick GitHub API client built on ghub" tar ((:url . "https://github.com/vermiculus/ghub-plus") (:commit . "b1adef2402d7599911d4dd447a987a0cea04e6fe") (:revdesc . "b1adef2402d7") (:keywords "extensions" "multimedia" "tools") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com"))]) + (gif-screencast . [(20230728 1144) ((emacs (25 1))) "One-frame-per-action GIF recording" tar ((:url . "https://gitlab.com/ambrevar/emacs-gif-screencast") (:commit . "6798656d3d3107d16e30cc26bc3928b00e50c1ca") (:revdesc . "6798656d3d31") (:keywords "multimedia" "screencast") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz"))]) + (gift-mode . [(20210528 1459) nil "Major mode for editing GIFT format quizzes" tar ((:url . "https://github.com/csrhodes/gift-mode") (:commit . "c93354e8fe1173b22f398f17b127875807f15b87") (:revdesc . "c93354e8fe11") (:authors ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainers ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainer "Christophe Rhodes" . "christophe@rhodes.io"))]) + (gildas-mode . [(20181022 649) ((polymode (0 1 5)) (emacs (25))) "Major mode for Gildas" tar ((:url . "https://github.com/smaret/gildas-mode") (:commit . "d0c9e997e2aa0bcd9b8b7db082d69100448cb1b2") (:revdesc . "d0c9e997e2aa") (:keywords "languages" "gildas") (:authors ("Sébastien Maret" . "sebastien.maret@icloud.com")) (:maintainers ("Sébastien Maret" . "sebastien.maret@icloud.com")) (:maintainer "Sébastien Maret" . "sebastien.maret@icloud.com"))]) + (girly-notebook-theme . [(20240513 1344) ((emacs (26 1))) "A light theme with vivid colours and cursive text" tar ((:url . "https://github.com/melissaboiko/girly-notebook-theme") (:commit . "e27603d5afb2b60714b8acef61f3477d11c34e00") (:revdesc . "e27603d5afb2") (:authors ("elilla&" . "elilla@transmom.love")) (:maintainers ("elilla&" . "elilla@transmom.love")) (:maintainer "elilla&" . "elilla@transmom.love"))]) + (gist . [(20171128 406) ((emacs (24 1)) (gh (0 10 0))) "Emacs integration for gist.github.com" tar ((:url . "https://github.com/defunkt/gist.el") (:commit . "b2712a61d04af98a05cc2556d85479803b6626be") (:revdesc . "b2712a61d04a") (:keywords "tools") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))]) + (git . [(20140128 1041) ((s (1 7 0)) (dash (2 2 0)) (f (0 10 0))) "An Elisp API for programmatically using Git" tar ((:url . "http://github.com/rejeep/git.el") (:commit . "8b7f1477ef367b5b7de452589dd9a8ab30150d0a") (:revdesc . "8b7f1477ef36") (:keywords "git") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (git-annex . [(20250626 2344) nil "Mode for easy editing of git-annex'd files" tar ((:url . "https://github.com/jwiegley/git-annex-el") (:commit . "7f12f0acb2548e22946c17b3cdd58a3376434294") (:revdesc . "7f12f0acb254") (:keywords "files" "data" "git" "annex") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com"))]) + (git-assembler-mode . [(20230611 1425) ((emacs (24 4))) "Git-assembler major mode" tar ((:url . "https://gitlab.com/wavexx/git-assembler-mode.el") (:commit . "391f507269f4f243d81ebdc1f5d43388dc54bc2f") (:revdesc . "391f507269f4") (:keywords "git" "git-assembler" "languages" "highlight" "syntax") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (git-attr . [(20180925 2003) ((emacs (24 3))) "Git attributes of buffer file" tar ((:url . "https://github.com/arnested/emacs-git-attr") (:commit . "3e43a0cf616b00a4bbd3c6b49fd2397f3103796f") (:revdesc . "3e43a0cf616b") (:keywords "vc") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainers ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk"))]) + (git-auto-commit-mode . [(20200828 653) nil "Emacs Minor mode to automatically commit and push" tar ((:url . "https://github.com/ryuslash/git-auto-commit-mode") (:commit . "df07899acdb3f9c114b72fdab77107c924b3172c") (:revdesc . "df07899acdb3") (:keywords "vc") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org"))]) + (git-backup . [(20191209 2144) ((emacs (24 3)) (s (1 8 0))) "Backup each file change using git" tar ((:url . "http://github.com/antham/git-backup") (:commit . "e28d7af2d1c58fa5b8068223eb83a73f044e6a6c") (:revdesc . "e28d7af2d1c5") (:keywords "backup" "files" "tools" "git") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainers ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com"))]) + (git-backup-ivy . [(20231030 2155) ((ivy (0 12 0)) (git-backup (0 0 1)) (emacs (25 1))) "An ivy interface to git-backup" tar ((:url . "https://github.com/walseb/git-backup-ivy") (:commit . "8c825ac2fef586e2792e980003e5ae0deb908bbc") (:revdesc . "8c825ac2fef5") (:keywords "backup" "convenience" "files" "tools" "vc") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainers ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com"))]) + (git-blamed . [(20161028 1926) nil "Minor mode for incremental blame for Git" tar ((:url . "https://github.com/tsgates/git-emacs") (:commit . "cef196abf398e2dd11f775d1e6cd8690567408aa") (:revdesc . "cef196abf398") (:keywords "git" "version control" "release management"))]) + (git-bug . [(20251001 25) ((emacs (29 1))) "Conveniences for local-first issues with git-bug" tar ((:url . "http://www.github.com/WillForan/emacs-git-bug") (:commit . "b29eba066f61e3ee3a0c751f4d9958e3be19d56d") (:revdesc . "b29eba066f61") (:keywords "tools" "vc" "processes") (:authors ("Will Foran" . "willforan+emacs@gmail.com")) (:maintainers ("Will Foran" . "willforan+emacs@gmail.com")) (:maintainer "Will Foran" . "willforan+emacs@gmail.com"))]) + (git-cliff . [(20250216 2216) ((emacs (29 1)) (transient (0 6 0)) (llama (0 6 0))) "Generate and update changelog using git-cliff" tar ((:url . "https://github.com/eki3z/git-cliff.el") (:commit . "e33246132ecf5bc5b7ef4156921deb6558f95289") (:revdesc . "e33246132ecf") (:keywords "tools") (:authors ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz95@gmail.com"))]) + (git-command . [(20191028 333) ((term-run (0 1 4)) (with-editor (2 3 1))) "A Git Command-Line interface" tar ((:url . "https://github.com/10sr/git-command-el") (:commit . "a773d40da39dfb1c6ecf2b0758aa370ddea8f06d") (:revdesc . "a773d40da39d") (:keywords "utility" "git") (:authors ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainers ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainer "10sr" . "8slashes+el[at]gmail[dot]com"))]) + (git-commit-insert-issue . [(20230512 1416) ((emacs (25)) (projectile (0)) (s (0)) (ghub (0)) (bitbucket (0))) "Get issues list when typing \"Fixes #\"" tar ((:url . "https://gitlab.com/emacs-stuff/git-commit-insert-issue/") (:commit . "df7ce0549d1db7bab27d401a351ea0d187c4a673") (:revdesc . "df7ce0549d1d") (:keywords "tools" "vc" "github" "gitlab" "bitbucket" "commit" "issues"))]) + (git-commit-ts-mode . [(20241003 612) ((emacs (29 1))) "Tree-sitter support for Git commit messages" tar ((:url . "https://github.com/danilshvalov/git-commit-ts-mode") (:commit . "6eb42a3c08c5c6a1a610d433b93590b88a71f63e") (:revdesc . "6eb42a3c08c5") (:keywords "tree-sitter" "git" "faces") (:authors ("Daniil Shvalov" . "daniil.shvalov@gmail.com")) (:maintainers ("Daniil Shvalov" . "daniil.shvalov@gmail.com")) (:maintainer "Daniil Shvalov" . "daniil.shvalov@gmail.com"))]) + (git-dwim . [(20170126 1214) nil "Context-aware git commands such as branch handling" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/git-dwim.el") (:commit . "485c732130686c2f28a026e385366006435394b9") (:revdesc . "485c73213068") (:keywords "git" "tools" "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (git-grep . [(20200920 1751) ((projectile (0 10 0))) "Search tools using git grep" tar ((:url . "https://github.com/tychoish/git-grep.el") (:commit . "12ff6045e9b6aa42f98abd4ddc44d670268a0849") (:revdesc . "12ff6045e9b6") (:keywords "matching" "files" "grep" "search" "using" "git-grep") (:maintainers ("tychoish" . "garen@tychoish.com")) (:maintainer "tychoish" . "garen@tychoish.com"))]) + (git-grep-transient . [(20240521 648) ((emacs (27 1)) (magit (3 3 0)) (transient (0 6 0)) (symbol-overlay (4 2))) "Search for text using git grep command" tar ((:url . "https://github.com/adelplanque/git-grep-transient") (:commit . "c9eb6d76e6b0600d2f90d009fdc28a171f69dd80") (:revdesc . "c9eb6d76e6b0") (:keywords "git" "tools" "vc") (:authors ("Alain Delplanque" . "alaindelplanque@mailoo.org")) (:maintainers ("Alain Delplanque" . "alaindelplanque@mailoo.org")) (:maintainer "Alain Delplanque" . "alaindelplanque@mailoo.org"))]) + (git-gutter . [(20241212 1415) ((emacs (25 1))) "Port of Sublime Text plugin GitGutter" tar ((:url . "https://github.com/emacsorphanage/git-gutter") (:commit . "3bdead17db7b84270c00e5a6b5ad02fa87ddd52e") (:revdesc . "3bdead17db7b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com") ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (git-gutter-fringe . [(20211003 2228) ((git-gutter (0 88)) (fringe-helper (0 1 1)) (cl-lib (0 5)) (emacs (24))) "Fringe version of git-gutter.el" tar ((:url . "https://github.com/emacsorphanage/git-gutter-fringe") (:commit . "648cb5b57faec55711803cdc9434e55a733c3eba") (:revdesc . "648cb5b57fae") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (git-identity . [(20220721 912) ((emacs (25 1)) (dash (2 10)) (hydra (0 14)) (f (0 20))) "Identity management for (ma)git" tar ((:url . "https://github.com/akirak/git-identity.el") (:commit . "f920916a92fad0c551cd0739e48fc09d8709bd8d") (:revdesc . "f920916a92fa") (:keywords "git" "vc" "convenience") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (git-io . [(20230322 1038) ((emacs (24 4))) "Integration for git.io URL shortening in buffer" tar ((:url . "https://github.com/tejasbubane/emacs-git-io") (:commit . "fb25f9432e6454edd621a7512ee7abc6220151a5") (:revdesc . "fb25f9432e64") (:keywords "convenience" "files") (:authors ("Tejas Bubane" . "tejasbubane@gmail.com")) (:maintainers ("Tejas Bubane" . "tejasbubane@gmail.com")) (:maintainer "Tejas Bubane" . "tejasbubane@gmail.com"))]) + (git-lens . [(20220922 710) ((emacs (24 4))) "Show new, deleted or modified files in branch" tar ((:url . "https://github.com/pidu/git-lens") (:commit . "347832fbdb75a0930aa3eef628ec0069a335f3b7") (:revdesc . "347832fbdb75") (:keywords "vc" "convenience") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainers ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se"))]) + (git-link . [(20251116 105) ((emacs (24 3))) "Get the GitHub/Bitbucket/GitLab URL for a buffer location" tar ((:url . "http://github.com/sshaw/git-link") (:commit . "12caebc0982d3401a0b74ccddc2d5a651122de8a") (:revdesc . "12caebc0982d") (:keywords "git" "vc" "github" "bitbucket" "gitlab" "sourcehut" "aws" "azure" "convenience") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com"))]) + (git-messenger . [(20201202 1637) ((emacs (24 3)) (popup (0 5 3))) "Popup last commit of current line" tar ((:url . "https://github.com/emacsorphanage/git-messenger") (:commit . "fb9a049ac3b5fba7369ef1f027b97881f1e377ec") (:revdesc . "fb9a049ac3b5") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")))]) + (git-modes . [(20251101 2017) ((emacs (26 1)) (compat (30 1))) "Major modes for editing Git configuration files" tar ((:url . "https://github.com/magit/git-modes") (:commit . "dfc450d79498b7997b1155ac76629ab01f7ef355") (:revdesc . "dfc450d79498") (:keywords "convenience" "vc" "git") (:authors ("Sebastian Wiesner" . "lunaryorn@gmail.com") ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net") ("Jonas Bernoulli" . "emacs.git-modes@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.git-modes@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.git-modes@jonas.bernoulli.dev"))]) + (git-msg-prefix . [(20191031 1304) ((emacs (24)) (s (1 10 0)) (dash (2 9 0))) "Insert commit message prefix (issue number)" tar ((:url . "http://github.com/kidd/git-msg-prefix.el") (:commit . "43f6b31c1090371260a2f15b2117a7666920bee7") (:revdesc . "43f6b31c1090") (:keywords "vc" "tools") (:authors ("Raimon Grau" . "raimonster@gmail.com")) (:maintainers ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com"))]) + (git-ps1-mode . [(20200113 704) nil "Global minor-mode to print __git_ps1 in mode-line" tar ((:url . "https://github.com/10sr/git-ps1-mode-el") (:commit . "6762a309bd593d26258dfbf43e7bc21254a70fbf") (:revdesc . "6762a309bd59") (:keywords "utility" "mode-line" "git") (:authors ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainers ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainer "10sr" . "8slashes+el[at]gmail[dot]com"))]) + (git-time-metric . [(20181116 2011) nil "Provide function to record time with gtm ( git time metric )" tar ((:url . "https://github.com/c301/gtm-emacs-plugin") (:commit . "287108ed1d6885dc795eb3bad4476aa08c626186") (:revdesc . "287108ed1d68") (:keywords "tools" "gtm" "productivity" "time") (:authors ("Anton Sivolapov" . "anton.sivolapov@gmail.com")) (:maintainers ("Anton Sivolapov" . "anton.sivolapov@gmail.com")) (:maintainer "Anton Sivolapov" . "anton.sivolapov@gmail.com"))]) + (git-timemachine . [(20250128 940) ((emacs (24 3)) (transient (0 1 0))) "Walk through git revisions of a file" tar ((:url . "https://codeberg.org/pidu/git-timemachine") (:commit . "d1346a76122595aeeb7ebb292765841c6cfd417b") (:revdesc . "d1346a761225") (:keywords "vc") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainers ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se"))]) + (git-walktree . [(20191101 302) ((emacs (26 1)) (git (0 1 1)) (cl-lib (0 5))) "Browse Git tree and blob objects" tar ((:url . "https://github.com/10sr/git-walktree-el") (:commit . "a1a5490b89d193724ec637818baf2d8edf97c638") (:revdesc . "a1a5490b89d1") (:keywords "vc" "utility" "git") (:authors ("10sr" . "8.slashes[at]gmail[dot]com")) (:maintainers ("10sr" . "8.slashes[at]gmail[dot]com")) (:maintainer "10sr" . "8.slashes[at]gmail[dot]com"))]) + (git-wip-timemachine . [(20150408 1006) ((s (1 9 0))) "Walk through git-wip revisions of a file" tar ((:url . "https://github.com/itsjeyd/git-wip-timemachine") (:commit . "1ce257e6c25117b01f1b899aca21e07eae084d40") (:revdesc . "1ce257e6c251") (:keywords "git") (:authors ("Tim Krones" . "t.krones@gmx.net")) (:maintainers ("Tim Krones" . "t.krones@gmx.net")) (:maintainer "Tim Krones" . "t.krones@gmx.net"))]) + (gitconfig . [(20130718 935) nil "Emacs lisp interface to work with git-config variables" tar ((:url . "https://github.com/tonini/gitconfig.el") (:commit . "6c313a39e20702ddcebc12d146f69db1ce668901") (:revdesc . "6c313a39e207") (:keywords "git" "gitconfig" "git-config"))]) + (github-browse-file . [(20160205 1427) ((cl-lib (0 5))) "View the file you're editing on GitHub" tar ((:url . "https://github.com/osener/github-browse-file") (:commit . "177667b8dac640f3dabacc4395e09451c5e88c53") (:revdesc . "177667b8dac6") (:keywords "convenience" "vc" "git" "github") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainers ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com"))]) + (github-clone . [(20210108 1920) ((gh (1 0 1)) (magit (3 0 0)) (emacs (25 1))) "Fork and clone github repos" tar ((:url . "https://github.com/dgtized/github-clone.el") (:commit . "7b2ce0109f5aac0b65f3e6a5ba761e18bd86f093") (:revdesc . "7b2ce0109f5a") (:keywords "vc" "tools") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainers ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com"))]) + (github-dark-vscode-theme . [(20240716 523) ((emacs (25 1))) "The GitHub Dark Theme from Visual Studio Code" tar ((:url . "https://github.com/justintime50/github-dark-vscode-emacs-theme") (:commit . "00cac57857732999681e14d0c04fd8b8dbf3ef2d") (:revdesc . "00cac5785773") (:keywords "faces"))]) + (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 ((:url . "https://github.com/10sr/github-elpa") (:commit . "c818883d9dc8d34eaee03691574e0408f18db28a") (:revdesc . "c818883d9dc8") (:authors ("10sr" . "8slashes+el@gmail.com")) (:maintainers ("10sr" . "8slashes+el@gmail.com")) (:maintainer "10sr" . "8slashes+el@gmail.com"))]) + (github-explorer . [(20220305 1450) ((emacs (25)) (graphql (0))) "Explore a GitHub repository on the fly" tar ((:url . "https://github.com/TxGVNN/github-explorer") (:commit . "49e5c350169b556deaabdcb67e9440bd4d5b4f8b") (:revdesc . "49e5c350169b") (:keywords "comm") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com"))]) + (github-linguist . [(20241014 601) ((emacs (28 1)) (project (0 8)) (async (1 9)) (map (3))) "Run GitHub Linguist on projects to collect information" tar ((:url . "https://github.com/akirak/github-linguist.el") (:commit . "442bc84dcdd3fe756f228b52fd027842f419e52b") (:revdesc . "442bc84dcdd3") (:keywords "processes") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (github-notifier . [(20180421 316) ((emacs (24))) "Displays your GitHub notifications unread count in mode-line" tar ((:url . "https://github.com/xuchunyang/github-notifier.el") (:commit . "274f3812926ea371346f639fcee98066f6e8c96f") (:revdesc . "274f3812926e") (:keywords "github" "mode-line") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (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 ((:url . "https://github.com/jakoblind/github-pullrequest") (:commit . "471816e09d1e140a0975911fe020c6c659f71209") (:revdesc . "471816e09d1e") (:keywords "tools") (:authors ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainers ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainer "Jakob Lind" . "karl.jakob.lind@gmail.com"))]) + (github-review . [(20211029 243) ((emacs (25 1)) (s (1 12 0)) (ghub (2 0)) (dash (2 11 0)) (deferred (0 5 1)) (a (0 1 1))) "GitHub based code review" tar ((:url . "https://github.com/charignon/github-review") (:commit . "725fbc7b385228f53a7ddc46a92c1276bab4aea8") (:revdesc . "725fbc7b3852") (:keywords "git" "tools" "vc" "github") (:authors ("Laurent Charignon" . "l.charignon@gmail.com")) (:maintainers ("Laurent Charignon" . "l.charignon@gmail.com")) (:maintainer "Laurent Charignon" . "l.charignon@gmail.com"))]) + (github-search . [(20190624 436) ((magit (0 8 1)) (gh (1 0 0))) "Clone repositories by searching github" tar ((:url . "https://github.com/IvanMalison/github-search") (:commit . "b73efaf19491010522b09db35bb0f1bad1620e63") (:revdesc . "b73efaf19491") (:keywords "github" "search" "clone" "api" "gh" "magit" "vc" "tools") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (github-stars . [(20190517 1319) ((emacs (25 1)) (ghub (2 0 0))) "Browse your Github Stars" tar ((:url . "https://github.com/xuchunyang/github-stars.el") (:commit . "bb79c80574cfff865342b6e262f2c9762edb4c15") (:revdesc . "bb79c80574cf") (:keywords "tools") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (github-topics . [(20250416 2102) ((emacs (29 4)) (ts (0 3))) "Lookup PRs matching a query" tar ((:url . "https://github.com/agzam/github-topics") (:commit . "296cb525c5387e5242b89950d2d84d258ff82fd2") (:revdesc . "296cb525c538") (:keywords "vc" "matching" "tools") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com"))]) + (gitignore-snippets . [(20201118 1551) ((emacs (26)) (yasnippet (0 8 0))) "Gitignore.io templates for Yasnippet" tar ((:url . "https://github.com/sei40kr/gitignore-snippets") (:commit . "f91b3397526fe09d2e4a1f507a73b06bc7542cf7") (:revdesc . "f91b3397526f") (:keywords "tools") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainers ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com"))]) + (gitignore-templates . [(20210814 144) ((emacs (24 3))) "Create .gitignore using GitHub or gitignore.io API" tar ((:url . "https://github.com/xuchunyang/gitignore-templates.el") (:commit . "d28cd1cec00242b688861648d36d086818b06099") (:revdesc . "d28cd1cec002") (:keywords "tools"))]) + (gitlab . [(20180312 1647) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client for Gitlab" tar ((:url . "https://github.com/nlamirault/emacs-gitlab") (:commit . "68318aca3206d50701039c9aae39734ca29a49f9") (:revdesc . "68318aca3206") (:keywords "gitlab") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (gitlab-ci-mode . [(20191022 2017) ((emacs (25 1)) (yaml-mode (0 0 12))) "Mode for editing GitLab CI files" tar ((:url . "https://gitlab.com/joewreschnig/gitlab-ci-mode/") (:commit . "c861dc5fa17d380d5c3aca99dc3bbec5eee623bc") (:revdesc . "c861dc5fa17d") (:keywords "tools" "vc"))]) + (gitlab-ci-mode-flycheck . [(20190323 1829) ((emacs (25)) (flycheck (31)) (gitlab-ci-mode (1))) "Flycheck support for ‘gitlab-ci-mode’" tar ((:url . "https://gitlab.com/joewreschnig/gitlab-ci-mode-flycheck/") (:commit . "eba81cfb7224fd1fa4e4da90d11729cc7ea12f72") (:revdesc . "eba81cfb7224") (:keywords "tools" "vc" "convenience"))]) + (gitlab-pipeline . [(20251213 1504) ((emacs (25 1)) (ghub (3 3 0))) "Get infomation about Gitlab pipelines" tar ((:url . "https://github.com/TxGVNN/gitlab-pipeline") (:commit . "0e35528cffa04e6d3621066c7406b2c1260a56ce") (:revdesc . "0e35528cffa0") (:keywords "comm" "tools" "git") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com"))]) + (gitlab-snip-helm . [(20200427 2014) ((emacs (25)) (dash (2 12 0)) (helm (3 2))) "Gitlab snippets api helm package" tar ((:url . "https://gitlab.com/sasanidas/gitlab-snip-helm") (:commit . "5fe0a66642da6f4e7ba9e1e3a96572c7f1876e37") (:revdesc . "5fe0a66642da") (:keywords "tools" "files" "convenience") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainers ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net"))]) + (gitolite-clone . [(20160609 2355) ((dash (2 10 0)) (s (1 9 0)) (pcache (0 3 1)) (emacs (24))) "Clone gitolite repositories from a completing list" tar ((:url . "https://github.com/IvanMalison/gitolite-clone") (:commit . "d8a4c2875c984e51137c980b5773f42703602721") (:revdesc . "d8a4c2875c98") (:keywords "gitolite" "clone" "git") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (gitpatch . [(20170722 410) ((emacs (24 3))) "Git-format patch toolkit" tar ((:url . "https://github.com/tumashu/gitpatch") (:commit . "577d5adf65c8133caa325c10e89e1e2fc323c907") (:revdesc . "577d5adf65c8") (:keywords "convenience") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (gitstatus . [(20221113 1951) ((emacs (25 1))) "Common front-end for `gitstatusd'" tar ((:url . "https://github.com/igorepst/gitstatus-el") (:commit . "c3e30341d0add9728010e566b9eb031c76414b47") (:revdesc . "c3e30341d0ad") (:keywords "tools" "processes") (:authors ("Igor Epstein" . "igorepst@gmail.com")) (:maintainers ("Igor Epstein" . "igorepst@gmail.com")) (:maintainer "Igor Epstein" . "igorepst@gmail.com"))]) + (gitter . [(20220316 138) ((emacs (24 4)) (let-alist (1 0 4))) "An Emacs Gitter client" tar ((:url . "https://github.com/xuchunyang/gitter.el") (:commit . "49327c91eb50cfea633af8fd32b0643691d75cb7") (:revdesc . "49327c91eb50") (:keywords "gitter" "chat" "client" "internet") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (gkroam . [(20251114 648) ((emacs (26 3)) (db (0 0 6)) (company (0 9 10))) "A lightweight org-mode Roam Research replica" tar ((:url . "https://github.com/Kinneyzhang/gkroam") (:commit . "b2b580731ce5c92d6682cfbd17361129a5cea4ca") (:revdesc . "b2b580731ce5") (:keywords "org" "convenience") (:authors ("Kinney Zhang" . "kinneyzhang666@gmail.com")) (:maintainers ("Kinney Zhang" . "kinneyzhang666@gmail.com")) (:maintainer "Kinney Zhang" . "kinneyzhang666@gmail.com"))]) + (gl-conf-mode . [(20170714 1310) ((emacs (24 3))) "Mode for editing gitolite config files" tar ((:url . "https://github.com/llloret/gitolite-emacs") (:commit . "9136a9b737e0a5b6471a91571d104c487c43f35b") (:revdesc . "9136a9b737e0") (:keywords "git" "gitolite" "languages"))]) + (glab . [(20250620 1333) ((ghub (4))) "Client library for the Gitlab API" tar ((:url . "https://github.com/emacsattic/glab") (:commit . "655c0cd042b8e4abe6d314846f4c55b146f9fdee") (:revdesc . "655c0cd042b8") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev"))]) + (glass-tty-theme . [(20240909 1259) ((emacs (24 1))) "Reverse video-like theme for the Glass TTY VT220 font" tar ((:url . "https://github.com/irtnog/glass-tty-theme") (:commit . "59126e888d9a237c6a0461e3712665d543f1320d") (:revdesc . "59126e888d9a") (:authors ("Matthew X. Economou" . "xenophon+glass-tty-theme@irtnog.org")) (:maintainers ("Matthew X. Economou" . "xenophon+glass-tty-theme@irtnog.org")) (:maintainer "Matthew X. Economou" . "xenophon+glass-tty-theme@irtnog.org"))]) + (gleam-ts-mode . [(20251106 221) ((emacs (29 1))) "Major mode for Gleam" tar ((:url . "https://github.com/gleam-lang/gleam-mode") (:commit . "91cf073c5fb889c091b1797f44cc52419b7c9ae2") (:revdesc . "91cf073c5fb8") (:keywords "languages" "gleam"))]) + (global-tags . [(20211120 347) ((emacs (26 1)) (async (1 9 4)) (project (0 5 2)) (ht (2 3))) "Elisp API and editor integration for GNU global" tar ((:url . "https://launchpad.net/global-tags.el") (:commit . "aaa37da4c538f35a90149ef4ad3d8b0922af54ab") (:revdesc . "aaa37da4c538") (:keywords "convenience" "matching" "tools") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainers ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org"))]) + (glsl-mode . [(20250324 1304) ((emacs (26 1))) "Major mode for Open GLSL shader files" tar ((:url . "https://github.com/jimhourihan/glsl-mode") (:commit . "86e6bb6cf28d1053366039683a4498401bab9c47") (:revdesc . "86e6bb6cf28d") (:keywords "languages" "opengl" "gpu" "spir-v" "vulkan"))]) + (glue . [(20230112 2159) ((emacs (24 1))) "Emacs - Common Lisp interop using SLIME or SLY" tar ((:url . "https://git.sr.ht/~hajovonta/glue/") (:commit . "dcdf8a69db87acea4fa61d4b4b9b1265c7e025db") (:revdesc . "dcdf8a69db87") (:keywords "lisp" "emacs" "common" "lisp" "cl") (:authors ("Gabor Poczkodi" . "hajovonta@gmail.com")) (:maintainers ("Gabor Poczkodi" . "hajovonta@gmail.com")) (:maintainer "Gabor Poczkodi" . "hajovonta@gmail.com"))]) + (gmail-message-mode . [(20160627 1847) ((ham-mode (1 0))) "A major-mode for editing gmail messages using markdown syntax" tar ((:url . "http://github.com/Bruce-Connor/gmail-message-mode") (:commit . "ec36672a9dc93c09ebe2f77597b498d11883d008") (:revdesc . "ec36672a9dc9") (:keywords "mail" "convenience" "emulation") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (gmail2bbdb . [(20170423 1144) nil "Import email and name into bbdb from vcard" tar ((:url . "http://github.com/redguardtoo/gmail2bbdb") (:commit . "a84fa385cfaec7fc5f1518c368e52722da139f99") (:revdesc . "a84fa385cfae") (:keywords "vcard" "bbdb" "email" "contact" "gmail") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (gmpl-mode . [(20220121 631) ((emacs (24))) "Major mode for editing GMPL(MathProg) files" tar ((:url . "https://github.com/cute-jumper/gmpl-mode") (:commit . "97b103eea8b18f7e27b0f0be6cb4809a4156c032") (:revdesc . "97b103eea8b1") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (gmsh-mode . [(20240223 558) ((emacs (26 1))) "Highlight GMSH mesh generator script syntax" tar ((:url . "https://gitlab.com/matsievskiysv/gmsh-mode") (:commit . "324d09e6ef51ff9473cbfaf560979ed313df416b") (:revdesc . "324d09e6ef51") (:keywords "languages"))]) + (gn-mode . [(20190428 1812) ((emacs (24)) (cl-lib (0 5))) "Major mode for editing GN (generate ninja) files" tar ((:url . "http://github.com/lashtear/gn-mode") (:commit . "fcf8e1e500d953364e97e7ebc5708a2c00fa3cd2") (:revdesc . "fcf8e1e500d9") (:keywords "data") (:authors ("Emily Backes" . "lucca@accela.net")) (:maintainers ("Emily Backes" . "lucca@accela.net")) (:maintainer "Emily Backes" . "lucca@accela.net"))]) + (gnome-calendar . [(20161110 1256) nil "Integration with the GNOME Shell calendar" tar ((:url . "https://github.com/NicolasPetton/gnome-calendar.el") (:commit . "668591bec95c23934c5e1ef100cec4824e7cb25d") (:revdesc . "668591bec95c") (:keywords "gnome" "calendar") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (gnome-screencast . [(20210125 2001) ((emacs (25))) "Use Gnome screen recording functionality using elisp" tar ((:url . "https://github.com/juergenhoetzel/emacs-gnome-screencast") (:commit . "1f4ef60fe9d452320dc02f89e289bac04ef2ad1c") (:revdesc . "1f4ef60fe9d4") (:keywords "tools" "multimedia") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info"))]) + (gnomenm . [(20150316 1918) ((s (1 9 0)) (dash (2 3 0)) (kv (0 0 19))) "Emacs interface to Gnome nmcli command" tar ((:url . "http://github.com/nicferrier/emacs-nm") (:commit . "9065cda44ffc9e06239b8189a0154d31314c3b4d") (:revdesc . "9065cda44ffc") (:keywords "processes" "hardware") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (gnosis . [(20251108 939) ((emacs (27 2)) (emacsql (4 1 0)) (compat (29 1 4 2)) (transient (0 7 2)) (org-gnosis (0 0 9))) "Spaced Repetition System" tar ((:url . "https://thanosapollo.org/projects/gnosis") (:commit . "43b8ba93a7173543d16e08ebc30ce8ed3f793b7f") (:revdesc . "43b8ba93a717") (:keywords "extensions") (:authors ("Thanos Apollo" . "public@thanosapollo.org")) (:maintainers ("Thanos Apollo" . "public@thanosapollo.org")) (:maintainer "Thanos Apollo" . "public@thanosapollo.org"))]) + (gntp . [(20141025 250) nil "Growl Notification Protocol for Emacs" tar ((:url . "https://github.com/tekai/gntp.el") (:commit . "767571135e2c0985944017dc59b0be79af222ef5") (:revdesc . "767571135e2c") (: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 ((:url . "http://www.gnu.org/software/apl/") (:commit . "c8695b0d55b5167263a843252ffd21a589018427") (:revdesc . "c8695b0d55b5") (:keywords "languages") (:authors ("Elias Mårtenson" . "lokedhs@gmail.com")) (:maintainers ("Elias Mårtenson" . "lokedhs@gmail.com")) (:maintainer "Elias Mårtenson" . "lokedhs@gmail.com"))]) + (gnu-indent . [(20221127 2112) ((emacs (25 1))) "Indent your code with GNU Indent" tar ((:url . "https://codeberg.org/akib/emacs-gnu-indent") (:commit . "f31dbe60478b6270bb57b6b05998df8eec56f801") (:revdesc . "f31dbe60478b") (:keywords "tools" "c") (:authors ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainers ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainer "Akib Azmain Turja" . "akib@disroot.org"))]) + (gnuplot . [(20250724 1531) ((emacs (28 1)) (compat (30))) "Major-mode and interactive frontend for gnuplot" tar ((:url . "https://github.com/emacs-gnuplot/gnuplot") (:commit . "43e9674b869475b1c2a32f045c167673eb2faae0") (:revdesc . "43e9674b8694") (:keywords "data" "gnuplot" "plotting") (:maintainers ("Maxime Tréca" . "maxime@gmail.com") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Maxime Tréca" . "maxime@gmail.com"))]) + (gnuplot-mode . [(20171013 1616) nil "Major mode for editing gnuplot scripts" tar ((:url . "https://github.com/mkmcc/gnuplot-mode") (:commit . "601f6392986f0cba332c87678d31ae0d0a496ce7") (:revdesc . "601f6392986f") (:keywords "gnuplot" "plotting"))]) + (gnus-alias . [(20230818 1830) nil "An alternative to gnus-posting-styles" tar ((:url . "https://github.com/hexmode/gnus-alias") (:commit . "cf1783a9294bc2f72bfafcaea288c159c4e3dee5") (:revdesc . "cf1783a9294b") (:keywords "personality" "identity" "news" "mail" "gnus") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainers ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org"))]) + (gnus-desktop-notify . [(20250616 816) ((gnus (1 0))) "Gnus Desktop Notification global minor mode" tar ((:url . "http://www.thregr.org/~wavexx/software/gnus-desktop-notify.el/") (:commit . "344777f35a65f0cf76bf29ea97c6f4b6880aed4a") (:revdesc . "344777f35a65") (:authors ("Yuri D'Elia" . "wavexxATthregr.org")) (:maintainers ("Yuri D'Elia" . "wavexxATthregr.org")) (:maintainer "Yuri D'Elia" . "wavexxATthregr.org"))]) + (gnus-notes . [(20221206 616) ((emacs (27 1)) (bbdb (3 1)) (helm (3 1)) (hydra (0 13 0)) (org (8 3)) (s (0 0)) (lv (0 0)) (async (1 9 1))) "Keep handy notes of read Gnus articles with helm and org" tar ((:url . "https://github.com/deusmax/gnus-notes") (:commit . "9996b382c5c7b4f944a716baac69b556ef181462") (:revdesc . "9996b382c5c7") (:keywords "convenience" "mail" "bbdb" "gnus" "helm" "org" "hydra") (:authors ("Deus Max" . "deusmax@gmx.com")) (:maintainers ("Deus Max" . "deusmax@gmx.com")) (:maintainer "Deus Max" . "deusmax@gmx.com"))]) + (gnus-recent . [(20241218 1308) ((emacs (25 3 2))) "Article breadcrumbs for Gnus" tar ((:url . "https://github.com/unhammer/gnus-recent") (:commit . "9cd9797c2aa54be4ca03b5ca0c50b64c4dc1d34e") (:revdesc . "9cd9797c2aa5") (:keywords "convenience" "mail") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (gnus-select-account . [(20170722 511) nil "Select an account before writing a mail in gnus" tar ((:url . "https://github.com/tumashu/gnus-select-account") (:commit . "ddc8c135eeaf90f5b6692a033af2badae36e68ce") (:revdesc . "ddc8c135eeaf") (:keywords "convenience") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (gnus-summary-ext . [(20180113 1316) nil "Extra limit and process mark commands for the gnus summary buffer" tar ((:url . "https://github.com/vapniks/gnus-summary-ext") (:commit . "025fd853fe9280ae696a89ec2c2cac9befd010aa") (:revdesc . "025fd853fe92") (:keywords "comm") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (gnus-summary-repo . [(20190617 1419) ((emacs (25))) "Import and export files between IMAP and local by using GNUS" tar ((:url . "https://github.com/TxGVNN/gnus-summary-repo") (:commit . "3968667bfded60fbbf33f2fba3170e2b6501ec43") (:revdesc . "3968667bfded") (:keywords "gnus" "repository") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com"))]) + (gnus-x-gm-raw . [(20140610 2156) ((log4e (0 2 0)) (yaxception (0 1))) "Search mail of Gmail using X-GM-RAW as web interface" tar ((:url . "https://github.com/aki2o/gnus-x-gm-raw") (:commit . "978bdfcecc8844465b71641c2e909fcdc66b22be") (:revdesc . "978bdfcecc88") (:keywords "gnus") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (go . [(20220414 1956) ((emacs (24))) "Play GO, translate and transfer between GO back ends" tar ((:url . "http://eschulte.github.io/el-go/") (:commit . "79690579496b0df85a1c94199aca968371b58b3c") (:revdesc . "79690579496b") (:keywords "game" "go" "sgf") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainers ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com"))]) + (go-add-tags . [(20211122 1812) ((emacs (24 3)) (s (1 11 0))) "Add field tags for struct fields" tar ((:url . "https://github.com/syohex/emacs-go-add-tags") (:commit . "93ecde9f82bc960493eaf6921d46a5adc3699ffc") (:revdesc . "93ecde9f82bc") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (go-autocomplete . [(20170626 1023) ((auto-complete (1 4 0))) "Auto-complete-mode backend for go-mode" tar ((:url . "https://github.com/emacsattic/go-autocomplete") (:commit . "5327738ec1be51061a3f31010c89bdd4924ca496") (:revdesc . "5327738ec1be") (:keywords "languages") (:authors ("Mikhail Kuryshev" . "tensai@cirno.in")) (:maintainers ("Mikhail Kuryshev" . "tensai@cirno.in")) (:maintainer "Mikhail Kuryshev" . "tensai@cirno.in"))]) + (go-complete . [(20190409 516) ((go-mode (0)) (cl-lib (0 5))) "Native code completion for Go" tar ((:url . "https://github.com/vibhavp/go-complete") (:commit . "056294014f37a1004958ec17ebd6748deed63502") (:revdesc . "056294014f37") (:keywords "go" "golang" "completion") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainers ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com"))]) + (go-direx . [(20150316 143) ((direx (1 0 0)) (cl-lib (0 5))) "Tree style source code viewer for Go language" tar ((:url . "https://github.com/syohex/emacs-go-direx") (:commit . "aecb9fef4d56d04d230d37c75c260c8392b5ad9f") (:revdesc . "aecb9fef4d56") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (go-dlv . [(20220126 1436) ((go-mode (1 3 1))) "Go Delve - Debug Go programs interactively with the GUD" tar ((:url . "https://github.com/benma/go-dlv.el/") (:commit . "0a296bc3b7b4dcf0c140a78c5ca3e1a8c6b7ea1a") (:revdesc . "0a296bc3b7b4") (:keywords "go" "debug" "debugger" "delve" "interactive" "gud") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainers ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com"))]) + (go-eldoc . [(20170305 1427) ((emacs (24 3)) (go-mode (1 0 0))) "Eldoc for go-mode" tar ((:url . "https://github.com/syohex/emacs-go-eldoc") (:commit . "cbbd2ea1e94a36004432a9ac61414cb5a95a39bd") (:revdesc . "cbbd2ea1e94a") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (go-errcheck . [(20160723 43) nil "Errcheck integration for go-mode" tar ((:url . "https://github.com/dominikh/go-errcheck.el") (:commit . "9db21eccecedc2490793f176246094167164af31") (:revdesc . "9db21ecceced") (:authors ("Dominik Honnef" . "dominikh@fork-bomb.org")) (:maintainers ("Dominik Honnef" . "dominikh@fork-bomb.org")) (:maintainer "Dominik Honnef" . "dominikh@fork-bomb.org"))]) + (go-expr-completion . [(20200817 1750) ((emacs (24 1))) "Complement the return values for Go" tar ((:url . "https://github.com/fujimisakari/emacs-go-expr-completion") (:commit . "66bba78f52a732b978848e3a4c99fa2afeb6c25f") (:revdesc . "66bba78f52a7") (:authors ("Ryo Fujimoto" . "fujimisakri@gmail.com")) (:maintainers ("Ryo Fujimoto" . "fujimisakri@gmail.com")) (:maintainer "Ryo Fujimoto" . "fujimisakri@gmail.com"))]) + (go-fill-struct . [(20230308 1034) ((emacs (24))) "Fill struct for golang" tar ((:url . "https://github.com/s-kostyaev/go-fill-struct") (:commit . "9e2e4be5af716ecadba809e73ddc95d4c772b2d9") (:revdesc . "9e2e4be5af71") (:keywords "tools") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru"))]) + (go-gen-test . [(20230616 2053) ((emacs (24 4))) "Generate tests for go code with gotests" tar ((:url . "https://github.com/s-kostyaev/go-gen-test") (:commit . "af00a9abbaba2068502327ecdef574fd894a884b") (:revdesc . "af00a9abbaba") (:keywords "languages") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru"))]) + (go-gopath . [(20160705 1034) ((cl-lib (0 5))) "Will guess GOPATH using gb and projectile" tar ((:url . "http://github.com/iced/go-gopath/") (:commit . "5172fc53f21edbf9347d5ee7d1d745da1ec88a15") (:revdesc . "5172fc53f21e") (:authors ("Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com")) (:maintainers ("Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com")) (:maintainer "Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com"))]) + (go-guru . [(20240210 10) ((go-mode (1 3 1)) (cl-lib (0 5))) "Integration of the Go 'guru' analysis tool into Emacs" tar ((:url . "https://github.com/dominikh/go-mode.el") (:commit . "6f4ff9ef874d151ed8d297a80f1bf27db5d9dbf0") (:revdesc . "6f4ff9ef874d") (:keywords "tools"))]) + (go-imenu . [(20181029 1029) ((emacs (24 3))) "Enhance imenu for go language" tar ((:url . "https://github.com/brantou/go-imenu.el") (:commit . "00bb69c1c71453f43ab2d6622a74e3c8e6b454b9") (:revdesc . "00bb69c1c714") (:keywords "tools") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com"))]) + (go-impl . [(20210621 743) ((emacs (24 3)) (go-mode (1 3 0))) "Impl integration for go-mode" tar ((:url . "https://github.com/syohex/emacs-go-impl") (:commit . "1eebba6ccd02d11a5a82ad4540a8d562797bc3b3") (:revdesc . "1eebba6ccd02") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (go-imports . [(20190715 1647) nil "Insert go import statement given package name" tar ((:url . "https://github.com/yasushi-saito/go-imports") (:commit . "55681e815da93b6f927213c4aa352ae33db97c37") (:revdesc . "55681e815da9") (:keywords "tools" "go" "import"))]) + (go-mode . [(20250311 156) ((emacs (26 1))) "Major mode for the Go programming language" tar ((:url . "https://github.com/dominikh/go-mode.el") (:commit . "58b0c3dfc87f5ae4137ea498dc0e03adc9eeb751") (:revdesc . "58b0c3dfc87f") (:keywords "languages" "go"))]) + (go-noisegate . [(20200502 703) ((emacs (24 4))) "Run Golang tests with Noise Gate" tar ((:url . "https://github.com/go-noisegate/go-noisegate.el") (:commit . "825d1fb05ec329f938c4c5bed23592f54d326f80") (:revdesc . "825d1fb05ec3") (:keywords "languages" "go" "test"))]) + (go-playground . [(20250107 2014) ((emacs (24 4)) (go-mode (1 4 0)) (gotest (0 13 0))) "Local Golang playground for short snippets" tar ((:url . "https://github.com/grafov/go-playground") (:commit . "e4b9a82a11bc1a368eb517185813904c76d05336") (:revdesc . "e4b9a82a11bc") (:keywords "tools" "golang") (:authors ("Alexander I.Grafov" . "grafov@inet.name")) (:maintainers ("Alexander I.Grafov" . "grafov@inet.name")) (:maintainer "Alexander I.Grafov" . "grafov@inet.name"))]) + (go-playground-cli . [(20160503 914) ((emacs (24)) (request (0 2 0)) (deferred (0 3 2)) (names (20151201 404)) (s (1 10 0)) (f (0 17 2)) (let-alist (1 0 4)) (cl-lib (0 5))) "Go Playground client tool" tar ((:url . "https://github.com/kosh04/go-playground-cli") (:commit . "60beebd98e3930641d41cee0189c579626f223bc") (:revdesc . "60beebd98e39") (:authors ("KOBAYASHI Shigeru" . "shigeru.kb@gmail.com")) (:maintainers ("KOBAYASHI Shigeru" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru" . "shigeru.kb@gmail.com"))]) + (go-projectile . [(20200609 131) ((projectile (0 10 0)) (go-mode (0)) (go-eldoc (0 16)) (go-rename (0)) (go-guru (0)) (dash (2 17 0))) "Go add-ons for Projectile" tar ((:url . "https://github.com/dougm/go-projectile") (:commit . "ad4ca3b5695a0e31e95e3cc4ccab498f87d68303") (:revdesc . "ad4ca3b5695a") (:keywords "project" "convenience") (:authors ("Doug MacEachern" . "dougm@vmware.com")) (:maintainers ("Doug MacEachern" . "dougm@vmware.com")) (:maintainer "Doug MacEachern" . "dougm@vmware.com"))]) + (go-rename . [(20220114 2239) ((go-mode (1 3 1))) "Integration of the 'gorename' tool into Emacs" tar ((:url . "https://github.com/dominikh/go-mode.el") (:commit . "3273fcece5d9ab7edd4f15b2d6bce61f4e5a0666") (:revdesc . "3273fcece5d9") (:keywords "tools"))]) + (go-scratch . [(20150810 440) ((go-mode (1 3 1)) (emacs (24))) "*scratch* buffer for Go" tar ((:url . "https://github.com/shosti/go-scratch.el") (:commit . "3f68cbcce04f59eb8e83af109164731ec0454be0") (:revdesc . "3f68cbcce04f") (:keywords "languages" "go") (:authors ("Emanuel Evans" . "mail@emanuel.industries")) (:maintainers ("Emanuel Evans" . "mail@emanuel.industries")) (:maintainer "Emanuel Evans" . "mail@emanuel.industries"))]) + (go-snippets . [(20180113 611) ((yasnippet (0 8 0))) "Yasnippets for go" tar ((:url . "https://github.com/toumorokoshi/go-snippets") (:commit . "d437df148879566ffe7f2e503a3cf2602aa9fb28") (:revdesc . "d437df148879") (:keywords "snippets"))]) + (go-stacktracer . [(20150430 2142) nil "Parse Go stack traces" tar ((:url . "https://github.com/samertm/go-stacktracer.el") (:commit . "a2ac6d801b389f80ca4e2fcc1ab44513a9e55976") (:revdesc . "a2ac6d801b38") (:keywords "tools") (:authors ("Samer Masterson" . "samer@samertm.com")) (:maintainers ("Samer Masterson" . "samer@samertm.com")) (:maintainer "Samer Masterson" . "samer@samertm.com"))]) + (go-tag . [(20230111 651) ((emacs (24 0)) (go-mode (1 5 0))) "Edit Golang struct field tag" tar ((:url . "https://github.com/brantou/emacs-go-tag") (:commit . "33f2059551d5298ca228d90f525b99d1a8d70364") (:revdesc . "33f2059551d5") (:keywords "tools") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com"))]) + (gobgen . [(20161020 1523) ((emacs (24 4))) "Generate GObject descendants using a detailed form" tar ((:url . "https://github.com/gergelypolonkai/gobgen.el") (:commit . "ed2c2b0d217deae293096f3cf14aa492791ddd4f") (:revdesc . "ed2c2b0d217d") (:keywords "gobject" "glib" "gtk" "helper" "utilities") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainers ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu"))]) + (god-mode . [(20250820 259) ((emacs (26 3))) "Minor mode for God-like command entering" tar ((:url . "https://github.com/emacsorphanage/god-mode") (:commit . "e6eef24dbf739d819a6651e854ec732ac3f386e6") (:revdesc . "e6eef24dbf73") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainers ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com"))]) + (godoctor . [(20180710 2152) nil "Frontend for godoctor" tar ((:url . "https://github.com/microamp/godoctor.el") (:commit . "4b45ff3d0572f0e84056e4c3ba91fcc178199859") (:revdesc . "4b45ff3d0572") (:keywords "go" "golang" "refactoring") (:authors ("Sangho Na" . "microamp@protonmail.com")) (:maintainers ("Sangho Na" . "microamp@protonmail.com")) (:maintainer "Sangho Na" . "microamp@protonmail.com"))]) + (gofmt-tag . [(20240111 2031) ((emacs (27))) "Format and align go struct tags" tar ((:url . "https://github.com/m1ndo/gofmt-tag") (:commit . "b7cc315ac45342fc9c17dde779cc9c37aa309841") (:revdesc . "b7cc315ac453") (:keywords "tools" "wp" "matching") (:authors ("ybenel" . "http://github/m1ndo")) (:maintainers ("ybenel" . "root@ybenel.cf")) (:maintainer "ybenel" . "root@ybenel.cf"))]) + (goggles . [(20250921 1713) ((emacs (29 1))) "Pulse modified regions" tar ((:url . "https://github.com/minad/goggles") (:commit . "6f87a700137c838568966bc8099dc15786897c32") (:revdesc . "6f87a700137c") (:keywords "convenience" "text") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (gogs . [(20250620 1333) ((ghub (4))) "Client library for the Gogs API" tar ((:url . "https://github.com/emacsattic/gogs") (:commit . "87f47b3b3d7a336c2a41fcf65b30fc48e497d53e") (:revdesc . "87f47b3b3d7a") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev"))]) + (gold-mode . [(20140607 206) ((sws-mode (0))) "Major mode for editing .gold files" tar ((:url . "https://github.com/yuutayamada/gold-mode-el") (:commit . "6d3aa59602b1b835495271c8c9741ac344c2eab1") (:revdesc . "6d3aa59602b1") (:keywords "golang" "template" "gold") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (golden-ratio . [(20230912 1825) nil "Automatic resizing of Emacs windows to the golden ratio" tar ((:url . "https://github.com/roman/golden-ratio.el") (:commit . "375c9f287dfad68829582c1e0a67d0c18119dab9") (:revdesc . "375c9f287dfa") (:keywords "window" "resizing") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainers ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com"))]) + (golden-ratio-scroll-screen . [(20250412 358) nil "Scroll half screen down or up, and highlight current line" tar ((:url . "https://github.com/jixiuf/golden-ratio-scroll-screen") (:commit . "60eb00ed7e51c0875a38cff25c9a87fe79296484") (:revdesc . "60eb00ed7e51") (:keywords "scroll" "screen" "highlight") (:authors (nil . "jixiufatgmaildotcom")) (:maintainers (nil . "jixiufatgmaildotcom")) (:maintainer nil . "jixiufatgmaildotcom"))]) + (golint . [(20180221 2015) nil "Lint for the Go source code" tar ((:url . "https://github.com/golang/lint") (:commit . "0562613f16a6ec439a4a68e817e69e0f7c405c87") (:revdesc . "0562613f16a6"))]) + (gom-mode . [(20131008 253) nil "Major mode for Gomfile" tar ((:url . "https://github.com/syohex/emacs-gom-mode") (:commit . "972e33df1d38ff323bc97de87477305826013701") (:revdesc . "972e33df1d38") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (gomacro-mode . [(20200326 1103) ((emacs (24 4)) (go-mode (1 5 0))) "Gomacro mode and Go REPL integration" tar ((:url . "https://github.com/storvik/gomacro-mode") (:commit . "66b77efebb9654aa60383a1014f716f8cd74e3fc") (:revdesc . "66b77efebb96") (:keywords "gomacro" "repl" "languages" "tools" "processes"))]) + (good-scroll . [(20211101 942) ((emacs (27 1))) "Good pixel line scrolling" tar ((:url . "https://github.com/io12/good-scroll.el") (:commit . "a7ffd5c0e5935cebd545a0570f64949077f71ee3") (:revdesc . "a7ffd5c0e593") (:authors ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainers ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainer "Benjamin Levy" . "blevy@protonmail.com"))]) + (google . [(20140416 1748) nil "Emacs interface to the Google API" tar ((:url . "https://github.com/hober/google-el") (:commit . "3b3189a8b201c8d36fed6e61496274e530dd40bd") (:revdesc . "3b3189a8b201") (:keywords "comm" "processes" "tools") (:authors ("Edward O'Connor" . "ted@oconnor.cx")) (:maintainers ("Edward O'Connor" . "ted@oconnor.cx")) (:maintainer "Edward O'Connor" . "ted@oconnor.cx"))]) + (google-c-style . [(20220210 1659) nil "Google's C/C++ style for c-mode" tar ((:url . "https://github.com/google/styleguide") (:commit . "af78b49ac4fef8083094d5105f72528ee7d09073") (:revdesc . "af78b49ac4fe") (:keywords "c" "tools"))]) + (google-contacts . [(20201012 1056) ((oauth2 (0 10)) (cl-lib (0 5))) "Support for Google Contacts in Emacs" tar ((:url . "https://github.com/jd/google-contacts.el") (:commit . "8923c238fe0906184d2254b33ba72792ed12cd47") (:revdesc . "8923c238fe09") (:keywords "comm") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainers ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info"))]) + (google-maps . [(20181121 1532) ((emacs (24 3))) "Access Google Maps from Emacs" tar ((:url . "https://julien.danjou.info/projects/emacs-packages#google-maps") (:commit . "2eb16ff609f5a9f8d02c15238a111fbb7db6c146") (:revdesc . "2eb16ff609f5") (:keywords "comm") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainers ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info"))]) + (google-this . [(20250407 1500) ((emacs (24 1))) "A set of functions and bindings to google under point" tar ((:url . "http://github.com/Malabarba/emacs-google-this") (:commit . "abdcb565503844e2146de42ab5ba898e90a2bb09") (:revdesc . "abdcb5655038") (:keywords "convenience" "hypermedia") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (google-translate . [(20250115 609) ((emacs (24 3)) (popup (0 5 8))) "Emacs interface to Google Translate" tar ((:url . "https://github.com/atykhonov/google-translate") (:commit . "e84599df7c70870b33dd6c902b527d7f78310815") (:revdesc . "e84599df7c70") (:keywords "convenience") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainers ("Andrey Tykhonov" . "atykhonov@gmail.com")) (:maintainer "Andrey Tykhonov" . "atykhonov@gmail.com"))]) + (goose-theme . [(20160828 1245) ((emacs (24 1))) "A gray color theme" tar ((:url . "https://github.com/thwg/goose-theme") (:commit . "acd017b50ab25a75fd1331eb3de66467e2042e9c") (:revdesc . "acd017b50ab2") (:authors ("Stephen Whipple" . "shw@wicdmedia.org")) (:maintainers ("Stephen Whipple" . "shw@wicdmedia.org")) (:maintainer "Stephen Whipple" . "shw@wicdmedia.org"))]) + (gore-mode . [(20151123 1927) ((go-mode (1 0 0))) "Simple mode for gore, a command-line evaluator for golang" tar ((:url . "https://github.com/sergey-pashaev/gore-mode") (:commit . "94d7f3e99104e06167967c98fdc201049c433c2d") (:revdesc . "94d7f3e99104") (:keywords "go" "repl") (:authors ("Sergey Pashaev" . "sergey.pashaev@gmail.com")) (:maintainers ("Sergey Pashaev" . "sergey.pashaev@gmail.com")) (:maintainer "Sergey Pashaev" . "sergey.pashaev@gmail.com"))]) + (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 ((:url . "http://www.github.com/manute/gorepl-mode") (:commit . "bbd27f6a0a77f484e2a3f082d70dc69da63ae52a") (:revdesc . "bbd27f6a0a77") (:keywords "languages" "go" "golang" "gorepl") (:authors ("Manuel Alonso" . "manuteali@gmail.com")) (:maintainers ("Manuel Alonso" . "manuteali@gmail.com")) (:maintainer "Manuel Alonso" . "manuteali@gmail.com"))]) + (gotest . [(20230221 945) ((emacs (24 3)) (s (1 11 0)) (f (0 19 0))) "Launch GO unit tests" tar ((:url . "https://github.com/nlamirault/gotest.el") (:commit . "490189e68d743a851bfb42d0017428a7550e8615") (:revdesc . "490189e68d74") (:keywords "languages" "go" "tests") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (gotest-ts . [(20250923 702) ((emacs (29 1)) (gotest (0 16 0))) "Go test runner with tree-sitter support" tar ((:url . "https://github.com/chmouel/gotest-ts.el") (:commit . "edbc8dcd14fa037cd91e08896027fcd6331aca7c") (:revdesc . "edbc8dcd14fa") (:keywords "languages" "go" "tests" "tree-sitter"))]) + (gotham-theme . [(20220107 1730) ((emacs (24 1))) "A very dark Emacs color theme" tar ((:url . "https://depp.brause.cc/gotham-theme") (:commit . "4b8214df0851bb69b44c3e864568b7e0030a95d2") (:revdesc . "4b8214df0851") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (goto-char-preview . [(20250101 908) ((emacs (24 3))) "Preview character when executing `goto-char` command" tar ((:url . "https://github.com/emacs-vs/goto-char-preview") (:commit . "806baf183ca6f6c88aea7f79752e48c4f2f86c89") (:revdesc . "806baf183ca6") (:keywords "convenience" "character" "navigation") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (goto-chg . [(20240407 1110) ((emacs (24 1))) "Go to last change" tar ((:url . "https://github.com/emacs-evil/goto-chg") (:commit . "72f556524b88e9d30dc7fc5b0dc32078c166fda7") (:revdesc . "72f556524b88") (:keywords "convenience" "matching") (:authors ("David Andersson" . "l.david.anderssonsverige.nu")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (goto-last-change . [(20150109 1823) nil "Move point through buffer-undo-list positions" tar ((:url . "https://github.com/camdez/goto-last-change.el") (:commit . "58b0928bc255b47aad318cd183a5dce8f62199cc") (:revdesc . "58b0928bc255") (:keywords "convenience") (:authors ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainers ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainer "Kevin Rodgers" . "ihs_4664@yahoo.com"))]) + (goto-last-point . [(20230406 1822) ((emacs (24 3))) "Record and jump to the last point in the buffer" tar ((:url . "https://github.com/manuel-uberti/goto-last-point") (:commit . "2ad8ff095bc34b433803c824ec4f500ff51cd1b2") (:revdesc . "2ad8ff095bc3") (:keywords "convenience") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainers ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org"))]) + (goto-line-preview . [(20250101 908) ((emacs (25))) "Preview line when executing `goto-line` command" tar ((:url . "https://github.com/emacs-vs/goto-line-preview") (:commit . "fa34955bcd1166421757216013945bc9ed520dc5") (:revdesc . "fa34955bcd11") (:keywords "convenience" "line" "navigation") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (govc . [(20250702 120) ((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 ((:url . "https://github.com/vmware/govmomi/tree/main/govc/emacs") (:commit . "bedcaadc5399abbaaaebac504718a1b043cd354d") (:revdesc . "bedcaadc5399") (:keywords "convenience"))]) + (govet . [(20170808 1724) nil "Linter/problem finder for the Go source code" tar ((:url . "https://godoc.org/golang.org/x/tools/cmd/vet") (:commit . "1b8c044aa856f4b62a682bc57494af19d22a6053") (:revdesc . "1b8c044aa856"))]) + (gpastel . [(20231030 713) ((emacs (25 1))) "Integrates GPaste with the kill-ring" tar ((:url . "https://github.com/DamienCassou/gpastel") (:commit . "d35505abb1e38ddda61440b033ebd4decac7a25c") (:revdesc . "d35505abb1e3") (:keywords "tools") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (gpr-ts-mode . [(20250111 1503) ((emacs (29 1))) "Major mode for GNAT project files using Tree-Sitter" tar ((:url . "https://github.com/brownts/gpr-ts-mode") (:commit . "b8aeca2c8fd5ed370dad0676da8f380627c916d5") (:revdesc . "b8aeca2c8fd5") (:keywords "gpr" "gnat" "ada" "languages" "tree-sitter") (:authors ("Troy Brown" . "brownts@troybrown.dev")) (:maintainers ("Troy Brown" . "brownts@troybrown.dev")) (:maintainer "Troy Brown" . "brownts@troybrown.dev"))]) + (gpr-yasnippets . [(20230516 627) ((emacs (24 4)) (yasnippet (0 14 0))) "Yasnippets for GNAT project files" tar ((:url . "https://github.com/brownts/gpr-yasnippets") (:commit . "d66ea90e8e45f6d0c3bd62185967c26190117296") (:revdesc . "d66ea90e8e45") (:keywords "gpr" "gnat" "languages" "snippets") (:authors ("Troy Brown" . "brownts@troybrown.dev")) (:maintainers ("Troy Brown" . "brownts@troybrown.dev")) (:maintainer "Troy Brown" . "brownts@troybrown.dev"))]) + (gpt . [(20251214 540) ((emacs (25 1))) "Run instruction-following language models" tar ((:url . "https://github.com/stuhlmueller/gpt.el") (:commit . "f2686a12e6703b970f569ad33762166a396bf2a2") (:revdesc . "f2686a12e670") (:keywords "openai" "anthropic" "claude" "language" "copilot" "convenience" "tools") (:authors ("Andreas Stuhlmueller" . "emacs@stuhlmueller.org")) (:maintainers ("Andreas Stuhlmueller" . "emacs@stuhlmueller.org")) (:maintainer "Andreas Stuhlmueller" . "emacs@stuhlmueller.org"))]) + (gpt-commit . [(20230716 331) ((emacs (27 1)) (magit (2 90)) (request (0 3 2))) "Commit messages with GPT in Emacs" tar ((:url . "https://github.com/ywkim/gpt-commit") (:commit . "8a8883be2051eed499c5bc3035a75ff56d64d5ff") (:revdesc . "8a8883be2051") (:authors ("Youngwook Kim" . "youngwook.kim@gmail.com")) (:maintainers ("Youngwook Kim" . "youngwook.kim@gmail.com")) (:maintainer "Youngwook Kim" . "youngwook.kim@gmail.com"))]) + (gptai . [(20250220 1735) ((emacs (24 1))) "Integrate with the OpenAI API" tar ((:url . "https://github.com/antonhibl/gptai") (:commit . "446b3a3f8a4f2412c969189a1f64aed099582094") (:revdesc . "446b3a3f8a4f") (:keywords "comm" "convenience") (:authors ("Anton Hibl" . "antonhibl11@gmail.com")) (:maintainers ("Anton Hibl" . "antonhibl11@gmail.com")) (:maintainer "Anton Hibl" . "antonhibl11@gmail.com"))]) + (gptel . [(20251223 351) ((emacs (27 1)) (transient (0 7 4)) (compat (30 1 0 0))) "Interact with ChatGPT or other LLMs" tar ((:url . "https://github.com/karthink/gptel") (:commit . "b0976fad53e292b9353a63052c3f216558dff3f8") (:revdesc . "b0976fad53e2") (:keywords "convenience" "tools") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com"))]) + (gptel-agent . [(20251210 453) ((emacs (29 1)) (compat (30 1 0 0)) (gptel (0 9 9)) (yaml (1 2 0)) (orderless (1 1))) "Agentic LLM use for gptel" tar ((:url . "https://github.com/karthink/gptel-agent") (:commit . "99a8b940271fbe68cdfb7c2329d090dc4ef04b99") (:revdesc . "99a8b940271f") (:keywords "comm"))]) + (gptel-aibo . [(20250709 851) ((emacs (27 1)) (gptel (0 9 7))) "An AI Writing Assistant" tar ((:url . "https://github.com/dolmens/gptel-aibo") (:commit . "f55b5170b9dfc3023110ec8cad66e6f352ea9d8a") (:revdesc . "f55b5170b9df") (:keywords "emacs" "tools" "editing" "gptel" "ai" "assistant" "code-completion" "productivity") (:authors ("Sun Yi Ming" . "dolmens@gmail.com")) (:maintainers ("Sun Yi Ming" . "dolmens@gmail.com")) (:maintainer "Sun Yi Ming" . "dolmens@gmail.com"))]) + (gptel-commit . [(20250726 1448) ((emacs (27 1)) (gptel (0 9 8))) "Generate commit message with gptel" tar ((:url . "https://github.com/lakkiy/gptel-commit") (:commit . "2b1063a01ab894ae5661bfffeb97331ad0cf2e3b") (:revdesc . "2b1063a01ab8") (:keywords "vc" "convenience") (:authors ("Liu Bo" . "liubolovelife@gmail.com")) (:maintainers ("Liu Bo" . "liubolovelife@gmail.com")) (:maintainer "Liu Bo" . "liubolovelife@gmail.com"))]) + (gptel-fn-complete . [(20250317 1805) ((emacs (29 1)) (gptel (0 9 8))) "Complete the function at point using gptel" tar ((:url . "https://github.com/mwolson/gptel-fn-complete") (:commit . "6970dfa5c123f420ab06b99be012a222e792b019") (:revdesc . "6970dfa5c123") (:keywords "hypermedia" "convenience" "tools") (:authors ("Michael Olson" . "mwolson@gnu.org")) (:maintainers ("Michael Olson" . "mwolson@gnu.org")) (:maintainer "Michael Olson" . "mwolson@gnu.org"))]) + (gptel-forge-prs . [(20251216 923) ((emacs (28 1)) (magit (4 0)) (forge (0 3)) (gptel (0 9))) "Generate PR descriptions for forge using gptel" tar ((:url . "https://github.com/ArthurHeymans/gptel-forge-prs") (:commit . "6aa4183a1eba89172e40c518c0c22c4b772fc393") (:revdesc . "6aa4183a1eba") (:keywords "forge" "vc" "convenience" "llm" "pull-request"))]) + (gptel-magit . [(20250520 833) ((emacs (28 1)) (magit (4 0)) (gptel (0 9 8))) "Generate commit messages for magit using gptel" tar ((:url . "https://github.com/ragnard/gptel-magit") (:commit . "f27c01821b67ed99ddf705c2b995f78b71394d8b") (:revdesc . "f27c01821b67") (:keywords "vc" "convenience") (:authors ("Ragnar Dahlén" . "r.dahlen@gmail.com")) (:maintainers ("Ragnar Dahlén" . "r.dahlen@gmail.com")) (:maintainer "Ragnar Dahlén" . "r.dahlen@gmail.com"))]) + (gpx . [(20251208 2014) ((emacs (27 1))) "Major mode for GPX files" tar ((:url . "https://github.com/mkcms/gpx-mode") (:commit . "f9a34cf11a41b991ae93cce34a0b6fc3b2050f4a") (:revdesc . "f9a34cf11a41") (:keywords "data" "tools") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com"))]) + (grab-mac-link . [(20210511 1303) ((emacs (24))) "Grab link from Mac Apps and insert it into Emacs" tar ((:url . "https://github.com/xuchunyang/grab-mac-link.el") (:commit . "5fdb03bf57bc4a530374b896e0f8b5139dc794e3") (:revdesc . "5fdb03bf57bc") (:keywords "mac" "hyperlink"))]) + (grab-x-link . [(20241223 1442) ((emacs (24)) (cl-lib (0 5))) "Grab links from X11 apps and insert into Emacs" tar ((:url . "https://github.com/xuchunyang/grab-x-link") (:commit . "4aecb0f360320e0a58b4b142d247b1e628612574") (:revdesc . "4aecb0f36032") (:keywords "hyperlink") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (gradle-mode . [(20150313 1905) ((s (1 8 0))) "Gradle integration with Emacs' compile" tar ((:url . "http://github.com/jacobono/emacs-gradle-mode") (:commit . "579de06674551919cddac9cfe42129f4fb0155c9") (:revdesc . "579de0667455") (:keywords "gradle") (:authors ("Daniel Mijares" . "daniel.j.mijares@gmail.com")) (:maintainers ("Daniel Mijares" . "daniel.j.mijares@gmail.com")) (:maintainer "Daniel Mijares" . "daniel.j.mijares@gmail.com"))]) + (grails . [(20221110 929) ((emacs (24))) "Minor mode for Grails projects" tar ((:url . "https://github.com/lifeisfoo/emacs-grails") (:commit . "3019f86e555ee94388795a0475cfa213e3897bbb") (:revdesc . "3019f86e555e"))]) + (grails-mode . [(20220407 1954) nil "Minor-mode that adds some Grails project management to a grails project" tar ((:url . "http://blog.wolfman.com") (:commit . "29210e5a969c02169b68e04f2e28e3bf2fc13363") (:revdesc . "29210e5a969c") (:keywords "languages") (:authors ("Jim Morris" . "morris@wolfman.com")) (:maintainers ("Russel Winder" . "russel@winder.org.uk")) (:maintainer "Russel Winder" . "russel@winder.org.uk"))]) + (grammarly . [(20250101 849) ((emacs (26 1)) (s (1 12 0)) (request (0 3 0)) (websocket (1 6))) "Grammarly API interface" tar ((:url . "https://github.com/emacs-grammarly/grammarly") (:commit . "c67f8d49bf89fb176e4a125b8fc4be4a41446a95") (:revdesc . "c67f8d49bf89") (:keywords "convenience" "grammar" "api" "interface" "english") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (grandshell-theme . [(20180606 517) nil "Dark color theme for Emacs > 24 with intensive colors" tar ((:url . "https://framagit.org/steckerhalter/grandshell-theme") (:commit . "0ed8e4273607dd4fcaa742b4097259233b09eda6") (:revdesc . "0ed8e4273607") (:keywords "color" "theme" "grand" "shell" "faces"))]) + (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 ((:url . "https://github.com/rdallasgray/graphene") (:commit . "cc8477fcfb7771ea4e5bbaf3c01f9e679234c1c1") (:revdesc . "cc8477fcfb77") (:keywords "defaults") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainers ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com"))]) + (graphene-meta-theme . [(20180615 1335) nil "Integrated theming for common packages" tar ((:url . "https://github.com/rdallasgray/graphene") (:commit . "a4deb38957ee2aeb861d5601b304bf28d9f867ec") (:revdesc . "a4deb38957ee") (:keywords "defaults") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainers ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com"))]) + (graphql . [(20221128 1106) ((emacs (25))) "GraphQL utilities" tar ((:url . "https://github.com/vermiculus/graphql.el") (:commit . "b57b5ca5d2d0837e1fb4a4f30c051d5f3e643f0f") (:revdesc . "b57b5ca5d2d0") (:keywords "hypermedia" "tools" "lisp") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com"))]) + (graphql-doc . [(20240716 38) ((emacs (26 1)) (request (0 3 2)) (promise (1 1))) "GraphQL Documentation Explorer" tar ((:url . "https://github.com/ifitzpatrick/graphql-doc.el") (:commit . "17755a2466a1acef68eac664093fcd13cd51494a") (:revdesc . "17755a2466a1"))]) + (graphql-mode . [(20251213 1110) ((emacs (25 1))) "Major mode for editing GraphQL schemas" tar ((:url . "https://github.com/davazp/graphql-mode") (:commit . "ccec811d0f1cb13e63e330234e408d56ba0f4d8e") (:revdesc . "ccec811d0f1c") (:keywords "languages") (:authors ("David Vazquez Pua" . "davazp@gmail.com")) (:maintainers ("David Vazquez Pua" . "davazp@gmail.com")) (:maintainer "David Vazquez Pua" . "davazp@gmail.com"))]) + (graphql-ts-mode . [(20240105 1236) ((emacs (29 1))) "Tree-sitter support for GraphQL" tar ((:url . "https://sr.ht/~joram/graphql-ts-mode/") (:commit . "e933f235408ea195762700fd07c2d828e8f09aac") (:revdesc . "e933f235408e") (:keywords "languages" "graphql" "tree-sitter") (:authors ("Joram Schrijver" . "i@joram.io")) (:maintainers ("Joram Schrijver" . "i@joram.io")) (:maintainer "Joram Schrijver" . "i@joram.io"))]) + (graphviz-dot-mode . [(20250925 1226) ((emacs (25 0))) "Mode for the dot-language used by graphviz (att)" tar ((:url . "https://ppareit.github.io/graphviz-dot-mode/") (:commit . "516c151b845a3eb2da73eb4ee648ad99172087ac") (:revdesc . "516c151b845a") (:keywords "mode" "dot" "dot-language" "dotlanguage" "graphviz" "graphs" "att") (:maintainers ("Pieter Pareit" . "pieter.pareit@gmail.com")) (:maintainer "Pieter Pareit" . "pieter.pareit@gmail.com"))]) + (grapnel . [(20131001 1534) nil "HTTP request lib with flexible callback dispatch" tar ((:url . "http://www.github.com/leathekd/grapnel") (:commit . "7387234eb3f0285a490fddb1e06a4bf029719fb7") (:revdesc . "7387234eb3f0") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainers ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com"))]) + (grass-mode . [(20170503 1500) ((cl-lib (0 2)) (dash (2 8 0))) "Provides Emacs modes for interacting with the GRASS GIS program" tar ((:url . "https://github.com/plantarum/grass-mode") (:commit . "f17e330dfde6a1b81a9b33d019fc0dff890f482d") (:revdesc . "f17e330dfde6") (:keywords "grass" "gis") (:authors ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainers ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainer "Tyler Smith" . "tyler@plantarum.ca"))]) + (grayscale-theme . [(20171005 802) nil "A simple grayscale theme" tar ((:url . "https://github.com/belak/emacs-grayscale-theme") (:commit . "917d63c0effc8459502a41e0cad5822d2b200499") (:revdesc . "917d63c0effc") (:keywords "lisp") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainers ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io"))]) + (greader . [(20251125 859) ((emacs (26 1)) (seq (2 24)) (compat (29 1 4 5))) "Gnamù reader, send buffer contents to a speech engine" tar ((:url . "https://gitlab.com/michelangelo-rodriguez/greader") (:commit . "b25974aeae49f11b91bb78d94ab51913fdfcdc05") (:revdesc . "b25974aeae49") (:keywords "tools" "accessibility") (:authors ("Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com")) (:maintainers ("Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com")) (:maintainer "Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com"))]) + (greek-polytonic . [(20190303 1358) ((emacs (24))) "Quail package for inputting polytonic Greek" tar ((:url . "https://github.com/jhanschoo/greek-polytonic") (:commit . "114cba0f57cc077871693c799b807df2292341ec") (:revdesc . "114cba0f57cc") (:keywords "i18n" "multilingual" "input method" "greek") (:authors ("Johannes Choo" . "jhanschoo@gmail.com")) (:maintainers ("Johannes Choo" . "jhanschoo@gmail.com")) (:maintainer "Johannes Choo" . "jhanschoo@gmail.com"))]) + (green-is-the-new-black-theme . [(20230828 2225) nil "A cool and minimalist green blackened theme engine" tar ((:url . "https://github.com/fredcamps/green-is-the-new-black-emacs") (:commit . "ad6f349e7e3a626f790af994424d3f015ac0d3ee") (:revdesc . "ad6f349e7e3a") (:keywords "faces" "themes") (:authors ("Fred Campos" . "fred.tecnologia@gmail.com")) (:maintainers ("Fred Campos" . "fred.tecnologia@gmail.com")) (:maintainer "Fred Campos" . "fred.tecnologia@gmail.com"))]) + (green-phosphor-theme . [(20150515 1447) nil "A light color theme with muted, autumnal colors" tar ((:url . "http://github.com/aalpern/emacs-color-theme-green-phosphor") (:commit . "5549781559ff5daa85c1d6c635c94524c1c5f644") (:revdesc . "5549781559ff") (:keywords "color" "theme") (:authors ("Adam Alpern" . "adam.alpern@gmail.com")) (:maintainers ("Adam Alpern" . "adam.alpern@gmail.com")) (:maintainer "Adam Alpern" . "adam.alpern@gmail.com"))]) + (green-screen-theme . [(20180816 1502) nil "A nice color theme for those who miss green CRTs" tar ((:url . "https://github.com/rbanffy/green-screen-emacs") (:commit . "774e8f6c033786406267f71ec07319d906a30b75") (:revdesc . "774e8f6c0337") (:keywords "faces" "theme") (:authors ("Ricardo Banffy" . "rbanffy@gmail.com")) (:maintainers ("Ricardo Banffy" . "rbanffy@gmail.com")) (:maintainer "Ricardo Banffy" . "rbanffy@gmail.com"))]) + (greger . [(20250704 1635) ((emacs (29 1))) "Agentic coding environment with tool use, using Claude" tar ((:url . "https://github.com/andreasjansson/greger.el") (:commit . "b9591c30193cc764b23f1741fbb43159f85e945b") (:revdesc . "b9591c30193c") (:keywords "agent" "agentic" "ai" "chat" "language-models" "tools") (:authors ("Andreas Jansson" . "andreas@jansson.me.uk")) (:maintainers ("Andreas Jansson" . "andreas@jansson.me.uk")) (:maintainer "Andreas Jansson" . "andreas@jansson.me.uk"))]) + (gregorio-mode . [(20170705 1451) nil "Gregorio Mode for .gabc files" tar ((:url . "https://jsrjenkins.github.io/gregorio-mode/") (:commit . "2b45f91246286abc449cb71f28583403181051c2") (:revdesc . "2b45f9124628") (:keywords "gregorio" "chant") (:authors ("Fr. John Jenkins" . "jenkins@sspx.ng")) (:maintainers ("Fr. John Jenkins" . "jenkins@sspx.ng")) (:maintainer "Fr. John Jenkins" . "jenkins@sspx.ng"))]) + (grep-a-lot . [(20210618 1420) nil "Manages multiple search results buffers for grep.el" tar ((:url . "https://github.com/ZungBang/emacs-grep-a-lot") (:commit . "223819dbea049bdeb5f97f9849fce139a5f16a75") (:revdesc . "223819dbea04") (:keywords "tools" "convenience" "search") (:authors ("Avi Rozen" . "avi.rozen@gmail.com")) (:maintainers ("Avi Rozen" . "avi.rozen@gmail.com")) (:maintainer "Avi Rozen" . "avi.rozen@gmail.com"))]) + (grey-paper-theme . [(20230415 1115) ((emacs (24 1))) "A greyscale theme with look-n-feel of an eink display" tar ((:url . "https://github.com/gugod/grey-paper-theme") (:commit . "4e5b8a31f586e2aa5c5d9bd939f0f518d919522e") (:revdesc . "4e5b8a31f586") (:keywords "faces") (:authors ("Kang-min Liu" . "gugod@gugod.org")) (:maintainers ("Kang-min Liu" . "gugod@gugod.org")) (:maintainer "Kang-min Liu" . "gugod@gugod.org"))]) + (greymatters-theme . [(20150621 1123) ((emacs (24))) "Emacs 24 theme with a light background" tar ((:url . "https://github.com/mswift42/greymatters-theme") (:commit . "a7220a8c6cf18ccae2b76946b6f01188a7c9d5d1") (:revdesc . "a7220a8c6cf1"))]) + (grip-mode . [(20250731 213) ((emacs (24 4))) "Instant GitHub-flavored Markdown/Org preview using grip" tar ((:url . "https://github.com/seagle0128/grip-mode") (:commit . "c965a344ab950c6b4ef788c7b9e8792a95a139d1") (:revdesc . "c965a344ab95") (:keywords "convenience" "markdown" "preview") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com"))]) + (grizzl . [(20160818 737) ((cl-lib (0 5)) (emacs (24 3))) "Fast fuzzy search index for Emacs" tar ((:url . "https://github.com/grizzl/grizzl") (:commit . "d554d93afa8519ee3a41340ec8aa6b4555065446") (:revdesc . "d554d93afa85") (:keywords "convenience" "usability") (:authors ("Chris Corbyn" . "chris@w3style.co.uk")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com"))]) + (groovy-imports . [(20210505 1807) ((emacs (24 4)) (s (1 10 0)) (pcache (0 3 2))) "Code for dealing with Groovy imports" tar ((:url . "http://www.github.com/mbezjak/emacs-groovy-imports") (:commit . "a60c3202973e3185091db623d960f71840a22205") (:revdesc . "a60c3202973e") (:keywords "groovy"))]) + (groovy-mode . [(20230318 533) ((s (1 12 0)) (emacs (24 3)) (dash (2 13 0))) "Major mode for Groovy source files" tar ((:url . "https://github.com/Groovy-Emacs-Modes/groovy-emacs-modes") (:commit . "7b8520b2e2d3ab1d62b35c426e17ac25ed0120bb") (:revdesc . "7b8520b2e2d3") (:keywords "languages") (: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"))]) + (gruber-darker-theme . [(20231026 2031) nil "Gruber Darker color theme for Emacs 24" tar ((:url . "http://github.com/rexim/gruber-darker-theme") (:commit . "2e9f99c41fe8ef0557e9ea0f3b94ef50c68b5557") (:revdesc . "2e9f99c41fe8") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com"))]) + (grugru . [(20231202 250) ((emacs (24 4))) "Rotate text at point" tar ((:url . "https://github.com/ROCKTAKEY/grugru") (:commit . "3f1bc431f4dc919a7b04e519f1c8add9fb2949f3") (:revdesc . "3f1bc431f4dc") (:keywords "convenience" "abbrev" "tools") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (grunt . [(20160316 1528) ((dash (2 9 0)) (ansi-color (3 4 2)) (emacs (24 3))) "Some glue to stick Emacs and Gruntfiles together" tar ((:url . "https://github.com/gempesaw/grunt.el") (:commit . "4c269e2738658643ec2ed9ef61a2a3d71b08d304") (:revdesc . "4c269e273865") (:keywords "convenience" "grunt") (:authors ("Daniel Gempesaw" . "dgempesaw@sharecare.com")) (:maintainers ("Daniel Gempesaw" . "dgempesaw@sharecare.com")) (:maintainer "Daniel Gempesaw" . "dgempesaw@sharecare.com"))]) + (gruvbox-theme . [(20250117 222) ((autothemer (0 2))) "A retro-groove colour theme for Emacs" tar ((:url . "https://github.com/greduan/emacs-theme-gruvbox") (:commit . "6cbf80b6cde3c2390502dc94a911ab7378495249") (:revdesc . "6cbf80b6cde3") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (gs-mode . [(20151202 1006) nil "Major mode for editing GrADS script files" tar ((:url . "https://github.com/yyr/emacs-grads") (:commit . "1a13051db21b999c7682a015b33a03096ff9d891") (:revdesc . "1a13051db21b") (:keywords "grads" "script" "major-mode") (:authors ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainers ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainer "Joe Wielgosz" . "joew@cola.iges.org"))]) + (gscholar-bibtex . [(20190130 555) nil "Retrieve BibTeX from Google Scholar and other online sources(ACM, IEEE, DBLP)" tar ((:url . "https://github.com/cute-jumper/gscholar-bibtex") (:commit . "3b651e3de116860eb1f1aef9b547a561784871fe") (:revdesc . "3b651e3de116") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (gsettings . [(20210407 2045) ((emacs (24 3)) (dash (2 16 0)) (gvariant (1 0 0)) (s (1 12 0))) "GSettings (Gnome) helpers" tar ((:url . "https://github.com/wbolster/emacs-gsettings") (:commit . "9f9fb1fe946bbba46307c26355f355225ea7262a") (:revdesc . "9f9fb1fe946b") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (gsnip . [(20220206 1526) ((emacs (26)) (aio (1 0)) (log4e (0 3 3))) "A gitlab snippet client" tar ((:url . "https://github.com/kaiwk/gitlab-snippet") (:commit . "4d473b726b3f3b6bb7d1b5f66a9d368588ce0f86") (:revdesc . "4d473b726b3f") (:keywords "extensions" "tools") (:authors ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainers ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainer "Wang Kai" . "kaiwkx@gmail.com"))]) + (gt . [(20250727 230) ((emacs (28 1)) (pdd (0 2 3))) "Translation framework, configurable and scalable" tar ((:url . "https://github.com/lorniu/gt.el") (:commit . "f9febd8583ea482f72139e02f440f3972502f5a2") (:revdesc . "f9febd8583ea") (:keywords "convenience") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com"))]) + (gtasks . [(20251028 336) ((emacs (27 1))) "Google Tasks API (sync)" tar ((:url . "https://github.com/thndrbrrr/gtasks") (:commit . "574205a511b5788e3711f86a438573a62a08c472") (:revdesc . "574205a511b5") (:keywords "convenience" "tools" "google" "tasks" "api") (:authors (nil . "thndrbrrr@gmail.com")) (:maintainers (nil . "thndrbrrr@gmail.com")) (:maintainer nil . "thndrbrrr@gmail.com"))]) + (gtea . [(20250620 1334) ((ghub (4))) "Client library for the Gitea API" tar ((:url . "https://github.com/emacsattic/gtea") (:commit . "942988625b6ff01c958a16899ad7f7113e4b324b") (:revdesc . "942988625b6f") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.ghub@jonas.bernoulli.dev"))]) + (gtk-pomodoro-indicator . [(20191007 1500) nil "A pomodoro indicator for the GTK tray" tar ((:url . "https://github.com/abo-abo/gtk-pomodoro-indicator") (:commit . "cb026a595de8a9244b16e06876f10c60dce18676") (:revdesc . "cb026a595de8") (:keywords "convenience" "pomodoro") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (gtk-variant . [(20200416 2136) ((emacs (25 1))) "Set the GTK theme variant (titlebar color)" tar ((:url . "https://github.com/bepvte/gtk-variant.el") (:commit . "a60af277fbb52306c17663074cf9954dd6cea024") (:revdesc . "a60af277fbb5") (:keywords "frames" "gtk" "titlebar"))]) + (guake . [(20221029 1811) ((emacs (27 1))) "Interact with Guake via DBus" tar ((:url . "https://github.com/juergenhoetzel/emacs-guake") (:commit . "2753ce833b95bd1f042ac0e4b7adfe34975a88ed") (:revdesc . "2753ce833b95") (:keywords "convenience") (:authors ("Jürgen Hötzel" . "juergen.hoetzel@hr.de")) (:maintainers ("Jürgen Hötzel" . "juergen.hoetzel@hr.de")) (:maintainer "Jürgen Hötzel" . "juergen.hoetzel@hr.de"))]) + (guess-language . [(20240528 1319) ((cl-lib (0 5)) (emacs (24))) "Robust automatic language detection" tar ((:url . "https://github.com/tmalsburg/guess-language.el") (:commit . "a17203d26135b970e4d7c5d101955d41303a758f") (:revdesc . "a17203d26135") (:keywords "wp") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de"))]) + (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 ((:url . "https://github.com/kai2nenobu/guide-key") (:commit . "9236d287a7272e307fb941237390a96037c8c0a2") (:revdesc . "9236d287a727") (:keywords "help" "convenience") (:authors ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainers ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainer "Tsunenobu Kai" . "kai2nenobu@gmail.com"))]) + (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 ((:url . "https://github.com/aki2o/guide-key-tip") (:commit . "02c5d4b0b65f3e91be5a47f0ff1ae5e86e00c64e") (:revdesc . "02c5d4b0b65f") (:keywords "help" "convenience" "tooltip") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (guix . [(20250914 1923) ((emacs (24 3)) (dash (2 11 0)) (geiser (0 8)) (bui (1 2 0)) (transient (0 3 0)) (edit-indirect (0 1 4))) "Interface for GNU Guix" tar ((:url . "https://emacs-guix.gitlab.io/website/") (:commit . "324987fb4a3e67c6f0f565b6605b8fce559f60ee") (:revdesc . "324987fb4a3e") (:keywords "tools") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (gulp-task-runner . [(20170718 2041) nil "Gulp task runner" tar ((:url . "https://github.com/NicolasPetton/gulp-task-runner") (:commit . "877990e956b1d71e2d9c7c3e5a129ad199b9debb") (:revdesc . "877990e956b1") (:keywords "convenience" "javascript") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (gumshoe . [(20240902 2137) ((emacs (25 1))) "Scoped spatial and temporal POINT movement tracking" tar ((:url . "https://github.com/Overdr0ne/gumshoe") (:commit . "f84bec6057506ec3f145cd3e06b320f1e40efcdf") (:revdesc . "f84bec605750") (:keywords "tools"))]) + (guru-mode . [(20211025 1157) nil "Become an Emacs guru" tar ((:url . "https://github.com/bbatsov/guru-mode") (:commit . "a3370e547eab260d24774cd50ccbe865373c8631") (:revdesc . "a3370e547eab") (:keywords "convenience") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (gvariant . [(20210507 1310) ((emacs (24)) (parsec (0 1 4))) "GVariant (GLib) helpers" tar ((:url . "https://github.com/wbolster/emacs-gvariant") (:commit . "f2e87076845800cbaaeed67f175ad4e4a9c01e37") (:revdesc . "f2e870768458") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (gvpr-mode . [(20250604 1329) nil "A major mode offering basic syntax coloring for gvpr scripts" tar ((:url . "https://raw.github.com/rodw/gvpr-lib/master/extra/gvpr-mode.el") (:commit . "db3aac0b51d8f624d94f8b022503b645ae97d926") (:revdesc . "db3aac0b51d8") (:keywords "graphviz" "gv" "dot" "gvpr" "graph") (:authors ("Rod Waldhoff" . "r.waldhoff@gmail.com")) (:maintainers ("Rod Waldhoff" . "r.waldhoff@gmail.com")) (:maintainer "Rod Waldhoff" . "r.waldhoff@gmail.com"))]) + (gxref . [(20170411 1753) ((emacs (25))) "Xref backend using GNU Global" tar ((:url . "https://github.com/dedi/gxref") (:commit . "380b02c3c3c2586c828456716eef6a6392bb043b") (:revdesc . "380b02c3c3c2") (:keywords "xref" "global" "tools"))]) + (h5dump-mode . [(20221128 1935) ((emacs (25 1))) "Major mode for navigating h5dump output" tar ((:url . "https://github.com/berquist/h5dump-mode") (:commit . "3c9e4608112da91db76bf316417023bed0422ef3") (:revdesc . "3c9e4608112d") (:keywords "languages" "hdf5"))]) + (habamax-theme . [(20181001 850) ((emacs (24))) "Boring white background color that gets the job done" tar ((:url . "https://github.com/habamax/habamax-theme") (:commit . "6e86a1b23b6e2aaf40d4374b5673da00a28be447") (:revdesc . "6e86a1b23b6e") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com"))]) + (habitica . [(20250715 1113) ((org (8 3 5)) (emacs (24 3))) "Interface for habitica.com" tar ((:url . "https://github.com/abrochard/emacs-habitica") (:commit . "de82cd5a1283ae4035602a86b2c92dd23d467ccf") (:revdesc . "de82cd5a1283") (:keywords "habitica" "todo"))]) + (hack-mode . [(20251212 2139) ((emacs (25 1)) (s (1 11 0))) "Major mode for the Hack programming language" tar ((:url . "https://github.com/hhvm/hack-mode") (:commit . "86a981bd7bc9929750abc7cea368d58c6ebb86fa") (:revdesc . "86a981bd7bc9") (:authors ("John Allen" . "jallen@fb.com") ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("John Allen" . "jallen@fb.com") ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "John Allen" . "jallen@fb.com"))]) + (hacker-typer . [(20170206 1520) ((emacs (24))) "Pretend to write code like a pro" tar ((:url . "http://github.com/therockmandolinist/emacs-hacker-typer") (:commit . "d5a23714a4ccc5071580622f278597d5973f40bd") (:revdesc . "d5a23714a4cc") (:keywords "hacker" "typer" "multimedia" "games") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainers ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com"))]) + (hackernews . [(20250314 1759) nil "Hacker News Client for Emacs" tar ((:url . "https://github.com/clarete/hackernews.el") (:commit . "1d3ba5faf47a3907e270ed5aa4099f73dadfdf6c") (:revdesc . "1d3ba5faf47a") (:keywords "comm" "hypermedia" "news") (:authors ("Lincoln de Sousa" . "lincoln@clarete.li")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net"))]) + (haki-theme . [(20250119 823) ((emacs (27 1))) "An elegant, high-contrast dark theme in modern sense" tar ((:url . "https://github.com/idlip/haki") (:commit . "38ab81334e11dd11c797aa724149b7cb1fa8eafa") (:revdesc . "38ab81334e11") (:keywords "faces" "theme" "accessibility"))]) + (hal-mode . [(20160704 1746) nil "Major mode for editing HAL files" tar ((:url . "https://github.com/strahlex/hal-mode/") (:commit . "cd2f66f219ee520198d4586fb6b169cef7ad3f21") (:revdesc . "cd2f66f219ee") (:keywords "language"))]) + (halloweenie-theme . [(20231011 1252) ((emacs (27 1)) (autothemer (0 2))) "Dark and spooky Halloween color theme" tar ((:url . "https://cicadas.surf/cgit/halloweenie-theme.git") (:commit . "db39ff0516e071aa890585c39fe411ea355e8b06") (:revdesc . "db39ff0516e0") (:keywords "faces" "theme" "halloween" "pumpkin") (:authors ("Colin Okay" . "colin@cicadas.surf")) (:maintainers ("Colin Okay" . "colin@cicadas.surf")) (:maintainer "Colin Okay" . "colin@cicadas.surf"))]) + (ham-mode . [(20150811 1306) ((html-to-markdown (1 2)) (markdown-mode (2 0))) "Html As Markdown. Transparently edit an html file using markdown" tar ((:url . "http://github.com/Bruce-Connor/ham-mode") (:commit . "3a141986a21c2aa6eefb428983352abb8b7907d2") (:revdesc . "3a141986a21c") (:keywords "convenience" "emulation" "wp") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (hamburg-theme . [(20160123 740) ((emacs (24))) "Color Theme with a dark blue background" tar ((:url . "https://github.com/mswift42/hamburg-theme") (:commit . "a05bf090e0c57c34cc59e301f95d9961280db244") (:revdesc . "a05bf090e0c5"))]) + (hamburger-menu . [(20220509 1341) ((emacs (28 1))) "Mode line hamburger menu" tar ((:url . "https://gitlab.com/iain/hamburger-menu-mode") (:commit . "06bc9d6872007a31226d7410d497a0acd98b272b") (:revdesc . "06bc9d687200") (:keywords "hamburger" "menu"))]) + (haml-mode . [(20250714 1441) ((emacs (24 1)) (cl-lib (0 5))) "Major mode for editing Haml files" tar ((:url . "https://github.com/nex3/haml-mode") (:commit . "3bb4a96535eb5c81dbe6a43bfa8d67a778d449c0") (:revdesc . "3bb4a96535eb") (:keywords "markup" "languages" "html"))]) + (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 for popular JavaScript libraries" tar ((:url . "http://github.com/rejeep/html-script-src") (:commit . "ed5e686ab604c81222c7e50b27c5d874c5687db7") (:revdesc . "ed5e686ab604") (:keywords "tools" "convenience") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (html-to-hiccup . [(20230727 1013) ((emacs (25 1)) (s (1 10 0))) "Convert HTML to Hiccup syntax" tar ((:url . "https://github.com/plexus/html-to-hiccup") (:commit . "6879354b8f33ca0c35cf0929581d419cd0ec9ea1") (:revdesc . "6879354b8f33") (:keywords "html" "hiccup" "clojure" "convenience" "tools") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net"))]) + (html-to-markdown . [(20151105 840) ((cl-lib (0 5))) "HTML to Markdown converter written in Emacs-lisp" tar ((:url . "http://github.com/Bruce-Connor/html-to-markdown") (:commit . "60c5498c801be186478cf7c05be05b4430c4a144") (:revdesc . "60c5498c801b") (:keywords "tools" "wp" "languages") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (html2org . [(20170418 501) ((emacs (24 4))) "Convert html to org format text" tar ((:url . "http://github.com/lujun9972/html2org.el") (:commit . "6904aed40259ad8afccff079ebd8a07bff319ebc") (:revdesc . "6904aed40259") (:keywords "convenience" "html" "org") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (htmlize . [(20250724 1703) ((emacs (26 1))) "Convert buffer text and decorations to HTML" tar ((:url . "https://github.com/emacsorphanage/htmlize") (:commit . "c9a8196a59973fabb3763b28069af9a4822a5260") (:revdesc . "c9a8196a5997") (:keywords "hypermedia" "extensions") (:authors ("Hrvoje Niksic" . "hniksic@gmail.com")) (:maintainers ("Hrvoje Niksic" . "hniksic@gmail.com")) (:maintainer "Hrvoje Niksic" . "hniksic@gmail.com"))]) + (htmltagwrap . [(20250101 907) ((emacs (24 4))) "Wraps a chunk of HTML code in tags" tar ((:url . "https://github.com/emacs-vs/htmltagwrap") (:commit . "66dd54079110b4b6d91bb81acf8a31649e3cb29f") (:revdesc . "66dd54079110") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (http . [(20201010 920) ((emacs (24 4)) (request (0 2 0)) (edit-indirect (0 1 4))) "Yet another HTTP client" tar ((:url . "https://github.com/emacs-pe/http.el") (:commit . "5fdceed1fbf36e274e578e349a53ce922c574774") (:revdesc . "5fdceed1fbf3") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (http-post-simple . [(20170715 940) nil "HTTP POST requests using the url library" tar ((:url . "https://github.com/emacsorphanage/http-post-simple") (:commit . "f53697fca278c741051aeb668b00466b5e0fd3fe") (:revdesc . "f53697fca278") (:keywords "comm" "data" "processes" "hypermedia"))]) + (http-twiddle . [(20221203 1351) nil "Send & twiddle & resend HTTP requests" tar ((:url . "https://github.com/hassy/http-twiddle/blob/master/http-twiddle.el") (:commit . "c07e8620183ec710623db35e26dd839b84c56007") (:revdesc . "c07e8620183e") (:keywords "http" "rest" "soap") (:authors ("Luke Gorrie" . "luke@synap.se")) (:maintainers ("Hasan Veldstra" . "h@vidiowiki.com")) (:maintainer "Hasan Veldstra" . "h@vidiowiki.com"))]) + (httpcode . [(20121002 345) nil "Explains the meaning of an HTTP status code" tar ((:url . "http://github.com/rspivak/httpcode.el") (:commit . "a45e735082b09477cd704a99294d336cdbeb12ba") (:revdesc . "a45e735082b0") (:authors ("Ruslan Spivak" . "ruslan.spivak@gmail.com")) (:maintainers ("Ruslan Spivak" . "ruslan.spivak@gmail.com")) (:maintainer "Ruslan Spivak" . "ruslan.spivak@gmail.com"))]) + (httprepl . [(20141101 1734) ((s (1 9 0)) (dash (2 5 0)) (emacs (24))) "An HTTP REPL" tar ((:url . "https://github.com/gregsexton/httprepl.el") (:commit . "cfa3693267a8ed1c96a86a126823f37dbfe077d8") (:revdesc . "cfa3693267a8") (:keywords "http" "repl") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainers ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com"))]) + (huecycle . [(20241129 1717) ((emacs (27 1))) "Idle color animation" tar ((:url . "https://github.com/pnor/huecycle") (:commit . "60eed50ffe83e2e139c8a675ff8e53cf94c8a1ee") (:revdesc . "60eed50ffe83") (:keywords "faces") (:authors ("Phillip O'Reggio" . "https://github.com/pnor")))]) + (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 ((:url . "https://github.com/rkaercher/hugsql-ghosts") (:commit . "f9ab314b6a10140041233e65a23e924dcab9a7a3") (:revdesc . "f9ab314b6a10") (:authors ("Roland Kaercher" . "roland.kaercher@gmail.com")) (:maintainers ("Roland Kaercher" . "roland.kaercher@gmail.com")) (:maintainer "Roland Kaercher" . "roland.kaercher@gmail.com"))]) + (humanoid-themes . [(20251106 1956) ((emacs (27 1))) "Color themes with a dark and light variant" tar ((:url . "https://github.com/humanoid-colors/emacs-humanoid-themes") (:commit . "4adf696a5d9968f6328f488a1f606558cfc8f940") (:revdesc . "4adf696a5d99") (:keywords "faces" "color" "theme"))]) + (hungarian-holidays . [(20161020 1138) nil "Adds a list of Hungarian public holidays to Emacs calendar" tar ((:url . "https://github.com/gergelypolonkai/hungarian-holidays") (:commit . "653108769279499d84a79267c90e640d98823872") (:revdesc . "653108769279") (:keywords "calendar") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainers ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu"))]) + (hungry-delete . [(20210409 1643) nil "Hungry delete minor mode" tar ((:url . "http://github.com/nflath/hungry-delete") (:commit . "d919e555e5c13a2edf4570f3ceec84f0ade71657") (:revdesc . "d919e555e5c1") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainers ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com"))]) + (hush . [(20231008 2125) ((emacs (27 1))) "Pluggable secret manager (auth-source alternative)" tar ((:url . "https://github.com/tirimia/hush") (:commit . "51c7960820de0576bbf0c3c286cb1264854d20aa") (:revdesc . "51c7960820de") (:keywords "extensions" "lisp" "local" "tools"))]) + (hy-mode . [(20211016 2011) ((dash (2 18 0)) (s (1 11 0)) (emacs (24))) "Major mode for Hylang" tar ((:url . "http://github.com/hylang/hy-mode") (:commit . "df814865a1faa8414dacdbb35b2a9029995312ec") (:revdesc . "df814865a1fa") (:keywords "languages" "lisp" "python"))]) + (hyai . [(20170301 1447) ((cl-lib (0 5)) (emacs (24))) "Haskell Yet Another Indentation" tar ((:url . "https://github.com/iquiw/hyai") (:commit . "e9a7e945fed12d8e664e898cf8b434b0376d5d80") (:revdesc . "e9a7e945fed1") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com"))]) + (hybrid-reverse-theme . [(20220921 1345) ((emacs (24 1))) "Emacs theme with material color scheme" tar ((:url . "https://github.com/riyyi/emacs-hybrid-reverse") (:commit . "5c60e7428d3c135c5f027d09f4474ed776f80d8d") (:revdesc . "5c60e7428d3c") (:keywords "faces" "theme"))]) + (hydandata-light-theme . [(20190809 1925) nil "A light color theme that is easy on your eyes" tar ((:url . "https://github.com/chkhd/hydandata-light-theme") (:commit . "812ffa4bee3163098ef66ee4506feed45018be4e") (:revdesc . "812ffa4bee31") (:keywords "color-theme" "theme") (:authors ("David Chkhikvadze" . "david@chkhd.net")) (:maintainers ("David Chkhikvadze" . "david@chkhd.net")) (:maintainer "David Chkhikvadze" . "david@chkhd.net"))]) + (hyde . [(20160508 308) nil "Major mode to help create and manage Jekyll blogs" tar ((:url . "https://github.com/nibrahim/Hyde") (:commit . "a8cd6ed00ecd8d7de0ded2f4867015b412b15b76") (:revdesc . "a8cd6ed00ecd"))]) + (hydra . [(20250316 1254) ((cl-lib (0 5)) (lv (0))) "Make bindings that stick around" tar ((:url . "https://github.com/abo-abo/hydra") (:commit . "59a2a45a35027948476d1d7751b0f0215b1e61aa") (:revdesc . "59a2a45a3502") (:keywords "bindings") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (hyperbole . [(20251225 1030) ((emacs (28))) "GNU Hyperbole: The Everyday Hypertextual Information Manager" tar ((:url . "http://www.gnu.org/software/hyperbole") (:commit . "232f614cd6b072330da9580597b89a6f363ba9b0") (:revdesc . "232f614cd6b0") (:keywords "comm" "convenience" "files" "frames" "hypermedia" "languages" "mail" "matching" "mouse" "multimedia" "outlines" "tools" "wp") (:authors ("Robert Weiner" . "rsw@gnu.org")) (:maintainers ("Robert Weiner" . "rsw@gnu.org")) (:maintainer "Robert Weiner" . "rsw@gnu.org"))]) + (hyperdrive . [(20251120 1454) ((emacs (28 1)) (map (3 0)) (compat (30 0 0 0)) (org (9 7 6)) (plz (0 9 1)) (persist (0 8)) (taxy-magit-section (0 14)) (transient (0 8 0))) "P2P filesystem" tar ((:url . "https://git.sr.ht/~ushin/hyperdrive.el") (:commit . "cb4974672b4271004ddd5eea1962216752b730ab") (:revdesc . "cb4974672b42") (:authors ("Joseph Turner" . "joseph@ushin.org")) (:maintainers ("Joseph Turner" . "~ushin/ushin@lists.sr.ht")) (:maintainer "Joseph Turner" . "~ushin/ushin@lists.sr.ht"))]) + (hyperdrive-org-transclusion . [(20241028 427) ((emacs (28 1)) (hyperdrive (0 4 2)) (org-transclusion (1 4 0))) "Tranclude hyperdrive content" tar ((:url . "https://git.sr.ht/~ushin/hyperdrive-org-transclusion") (:commit . "252e2df3fe7a07a122a365a637c47a43b26e179c") (:revdesc . "252e2df3fe7a") (:authors ("Joseph Turner" . "joseph@ushin.org")) (:maintainers ("Joseph Turner" . "~ushin/ushin@lists.sr.ht")) (:maintainer "Joseph Turner" . "~ushin/ushin@lists.sr.ht"))]) + (hyperkitty . [(20220226 1951) ((request (0 3 2)) (emacs (25 1))) "Emacs interface for Hyperkitty archives" tar ((:url . "https://github.com/maxking/hyperkitty.el") (:commit . "2c1d22ff017d096c359aa151e6a29f7214a58118") (:revdesc . "2c1d22ff017d") (:keywords "mail" "hyperkitty" "mailman") (:authors ("Abhilash Raj" . "maxking@asynchronous.in")) (:maintainers ("Abhilash Raj" . "maxking@asynchronous.in")) (:maintainer "Abhilash Raj" . "maxking@asynchronous.in"))]) + (hyperlist-mode . [(20230119 28) ((emacs (24))) "A major-mode for viewing Hyperlists" tar ((:url . "https://github.com/vifon/hyperlist-mode") (:commit . "480dbf33ca72e7b5fade952aaf0d5a5eb43acb1d") (:revdesc . "480dbf33ca72") (:keywords "outlines"))]) + (hyperspace . [(20230518 442) ((emacs (25)) (s (1 12 0))) "Get there from here" tar ((:url . "https://github.com/ieure/hyperspace-el") (:commit . "f574d07fd8715e806ba4f0487b73c699963baed3") (:revdesc . "f574d07fd871") (:keywords "tools" "convenience") (:authors ("Ian Eure" . "ian@retrospec.tv")) (:maintainers ("Ian Eure" . "ian@retrospec.tv")) (:maintainer "Ian Eure" . "ian@retrospec.tv"))]) + (hyperstitional-themes . [(20251223 1053) ((emacs (24 1))) "Weird themes with incremental palettes" tar ((:url . "https://github.com/precompute/hyperstitional-themes") (:commit . "37218686986a84af54df821d110cd0c13bc09349") (:revdesc . "37218686986a") (:authors ("precompute" . "git@precompute.net")) (:maintainers ("precompute" . "git@precompute.net")) (:maintainer "precompute" . "git@precompute.net"))]) + (hyprlang-ts-mode . [(20241225 914) ((emacs (29 1))) "Major mode for editing hyprland configuration files" tar ((:url . "https://github.com/Nathan-Melaku/hyprlang-ts-mode") (:commit . "458636c6a4505ea1eb16321be124ced234469e3f") (:revdesc . "458636c6a450") (:keywords "hyprland" "hyprlang" "languages" "tree-sitter") (:authors ("Nathan Melaku" . "nathan@natefu.xyz")) (:maintainers ("Nathan Melaku" . "nathan@natefu.xyz")) (:maintainer "Nathan Melaku" . "nathan@natefu.xyz"))]) + (i-ching . [(20241113 1642) ((emacs (25 1)) (request (0 3))) "The Book of Changes" tar ((:url . "https://github.com/zzkt/i-ching") (:commit . "e4339cb64a97e0d04a4cb8e7183aeec4e4ae6a29") (:revdesc . "e4339cb64a97") (:keywords "games" "divination" "stochastism" "cleromancy" "change") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am"))]) + (i2b2-mode . [(20140710 104) nil "Highlights corresponding PHI data in the text portion of an i2b2 XML Document" tar ((:url . "https://github.com/danlamanna/i2b2-mode") (:commit . "db10efcfc8bed369a516bbf7526ede41f98cb95a") (:revdesc . "db10efcfc8be") (:keywords "xml" "phi" "i2b2" "deidi2b2") (:authors ("Dan LaManna" . "dan.lamanna@gmail.com")) (:maintainers ("Dan LaManna" . "dan.lamanna@gmail.com")) (:maintainer "Dan LaManna" . "dan.lamanna@gmail.com"))]) + (i3bar . [(20250913 1829) ((emacs (28 1))) "Display status from an i3status command in the tab bar" tar ((:url . "https://github.com/Stebalien/i3bar.el") (:commit . "75a81e8100884f679378db52a660b3963f2dbede") (:revdesc . "75a81e810088") (:keywords "unix") (:authors ("Steven Allen" . "steven@stebalien.com")) (:maintainers ("Steven Allen" . "steven@stebalien.com")) (:maintainer "Steven Allen" . "steven@stebalien.com"))]) + (i3wm . [(20170822 1438) nil "I3wm integration library" tar ((:url . "https://git.flintfam.org/swf-projects/emacs-i3") (:commit . "71391dc61063fee77ad174f3b2ca25c60b41009e") (:revdesc . "71391dc61063") (:keywords "convenience" "extensions") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (i3wm-config-mode . [(20220913 1121) ((emacs (24 1))) "Better syntax highlighting for i3wm's config file" tar ((:url . "https://github.com/Alexander-Miller/i3wm-Config-Mode") (:commit . "188e3978807ec39eba3cb69d973c0062af324215") (:revdesc . "188e3978807e") (:keywords "faces" "languages" "i3wm" "font-lock") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (ialign . [(20251102 1056) ((emacs (25 1))) "Interactive align-regexp" tar ((:url . "https://github.com/mkcms/ialign") (:commit . "2a7472bdb782f5af021bfbdc4c32424d54c005dd") (:revdesc . "2a7472bdb782") (:keywords "tools" "editing" "align" "interactive") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com"))]) + (iasm-mode . [(20171023 1422) nil "Interactive assembly major mode" tar ((:url . "https://github.com/RAttab/iasm-mode") (:commit . "abbec7f308f9ce97beeb57e459fff35f559b4c18") (:revdesc . "abbec7f308f9") (:keywords ":" "tools") (:authors ("Rémi Attab" . "remi.attab@gmail.com")) (:maintainers ("Rémi Attab" . "remi.attab@gmail.com")) (:maintainer "Rémi Attab" . "remi.attab@gmail.com"))]) + (ibrowse . [(20230926 2056) ((emacs (27 1))) "Interact with your browser" tar ((:url . "https://git.sr.ht/~ngraves/ibrowse.el") (:commit . "addfec54f2c33d505d10bb5f17c084876db5baed") (:revdesc . "addfec54f2c3") (:keywords "comm" "data" "files" "tools") (:authors ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainers ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainer "Nicolas Graves" . "ngraves@ngraves.fr"))]) + (ibuffer-git . [(20110508 731) nil "Show git status in ibuffer column" tar ((:url . "https://github.com/jrockway/ibuffer-git") (:commit . "d326319c05ddb8280885b31f9094040c1b365876") (:revdesc . "d326319c05dd") (:keywords "convenience") (:authors ("Jonathan Rockway" . "jon@jrock.us")) (:maintainers ("Jonathan Rockway" . "jon@jrock.us")) (:maintainer "Jonathan Rockway" . "jon@jrock.us"))]) + (ibuffer-project . [(20220321 1312) ((emacs (25 1))) "Group ibuffer's list by project or any function" tar ((:url . "https://github.com/muffinmad/emacs-ibuffer-project") (:commit . "bfc0ec1f27b02b8ab816dcfd9073e5d78dae1aed") (:revdesc . "bfc0ec1f27b0") (:keywords "tools") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com"))]) + (ibuffer-projectile . [(20230817 610) ((projectile (0 11 0)) (emacs (25 1)) (seq (2))) "Group ibuffer's list by projectile root" tar ((:url . "https://github.com/purcell/ibuffer-projectile") (:commit . "710ecac1578273bf31debe52870f5844472e3428") (:revdesc . "710ecac15782") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (ibuffer-rcirc . [(20150215 2118) ((cl-lib (0 2))) "Ibuffer integration for rcirc" tar ((:url . "https://github.com/fgallina/ibuffer-rcirc") (:commit . "8a4409b1c679d65c819dee4085faf929840e79f8") (:revdesc . "8a4409b1c679") (:keywords "buffer" "convenience" "comm") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainers ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org"))]) + (ibuffer-sidebar . [(20210508 836) ((emacs (25 1))) "Sidebar for `ibuffer'" tar ((:url . "https://github.com/jojojames/ibuffer-sidebar") (:commit . "fb685e1e43db979e25713081d8ae4073453bbd5e") (:revdesc . "fb685e1e43db") (:keywords "ibuffer" "files" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (ibuffer-tramp . [(20180127 2122) nil "Group ibuffer's list by TRAMP connection" tar ((:url . "http://github.com/svend/ibuffer-tramp") (:commit . "bcad0bda3a67f55d1be936bf8fa9ef735fe1e3f3") (:revdesc . "bcad0bda3a67") (:keywords "convenience") (:authors ("Svend Sorensen" . "svend@ciffer.net")) (:maintainers ("Svend Sorensen" . "svend@ciffer.net")) (:maintainer "Svend Sorensen" . "svend@ciffer.net"))]) + (ibuffer-vc . [(20241106 1518) ((emacs (25 1)) (seq (2))) "Group ibuffer's list by VC project, or show VC status" tar ((:url . "https://github.com/purcell/ibuffer-vc") (:commit . "890c692da9348ef071a4b27940082a4dad05b27c") (:revdesc . "890c692da934") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (ical-form . [(20251106 746) ((emacs (29 1))) "A widget form for editing ical events" tar ((:url . "https://github.com/haji-ali/maccalfw") (:commit . "fce42746bdaa1f5770282dfc4ec85241c2f5bdd7") (:revdesc . "fce42746bdaa") (:keywords "calendar") (:authors ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainers ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.aliatgmail.com"))]) + (iceberg-theme . [(20220622 1) ((emacs (26 1)) (solarized-theme (1 3))) "Well-designed, eye-friendly, dark blue color scheme" tar ((:url . "https://github.com/conao3/iceberg-theme.el") (:commit . "c9fdf9a8f5ff417c206730a84731f64a95483935") (:revdesc . "c9fdf9a8f5ff") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (icl-mode . [(20241030 1743) ((emacs (25 2))) "Support for IEEE 1687 ICL/PDL" tar ((:url . "https://github.com/CeleritasCelery/icl-mode") (:commit . "9cc7fbb7f290fd8c63795765cf309e8a57a49b14") (:revdesc . "9cc7fbb7f290") (:authors ("Troy Hinckley" . "troy.hinckley@dabrev.com")) (:maintainers ("Troy Hinckley" . "troy.hinckley@dabrev.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@dabrev.com"))]) + (icomplete-vertical . [(20220418 2119) ((emacs (26 1))) "Display icomplete candidates vertically" tar ((:url . "https://github.com/oantolin/icomplete-vertical") (:commit . "f5775d535630199703c936380d210d38249b342c") (:revdesc . "f5775d535630") (:keywords "convenience" "completion") (: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"))]) + (icsql . [(20231021 1949) ((emacs (26)) (choice-program (0 13)) (buffer-manage (0 12))) "Interactive iSQL iteraface to ciSQL" tar ((:url . "https://github.com/plandes/icsql") (:commit . "24c013486fd56386946eadc9a2f653e9f0d3f4de") (:revdesc . "24c013486fd5") (:keywords "isql" "sql" "rdbms" "data"))]) + (id-manager . [(20170320 1246) nil "Id-password management" tar ((:url . "https://github.com/kiwanami/emacs-id-manager") (:commit . "14ebc35db298aac4dedc8aa188bc46bacab81f3b") (:revdesc . "14ebc35db298") (:keywords "password" "convenience") (:authors ("SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net"))]) + (idea-darkula-theme . [(20230617 2005) ((emacs (24 1))) "Color theme based on IntelliJ IDEA Darkula color theme" tar ((:url . "http://github.com/fourier/idea-darkula-theme") (:commit . "2ba08b6b7c0f75d460d81e1f02114a6449bb1868") (:revdesc . "2ba08b6b7c0f") (:keywords "themes") (:authors ("Alexey Veretennikov" . "alexeydotveretennikovatgmaildotcom")) (:maintainers ("Alexey Veretennikov" . "alexeydotveretennikovatgmaildotcom")) (:maintainer "Alexey Veretennikov" . "alexeydotveretennikovatgmaildotcom"))]) + (identica-mode . [(20130204 2253) nil "Major mode API client for status.net open microblogging" tar ((:url . "http://blog.gabrielsaldana.org/identica-mode-for-emacs/") (:commit . "cf9183ee11ac922e85c7c908f04e2d00b03111b3") (:revdesc . "cf9183ee11ac") (:keywords "identica" "web") (:authors ("Gabriel Saldana" . "gsaldana@gmail.com")) (:maintainers ("Gabriel Saldana" . "gsaldana@gmail.com")) (:maintainer "Gabriel Saldana" . "gsaldana@gmail.com"))]) + (idle-highlight-in-visible-buffers-mode . [(20240107 1344) nil "Highlight the word the point is on" tar ((:url . "https://github.com/ignacy/idle-highlight-in-visible-buffers") (:commit . "f1f7ed3148439398adc6c0fe8ecf100d976886e6") (:revdesc . "f1f7ed314843") (:keywords "convenience"))]) + (idle-highlight-mode . [(20251214 614) ((emacs (29 1))) "Highlight the word the point is on" tar ((:url . "https://codeberg.org/ideasman42/emacs-idle-highlight-mode") (:commit . "425f1b247ca5176d47ff1d8b07a6a9293a066f82") (:revdesc . "425f1b247ca5") (:keywords "convenience") (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (idle-org-agenda . [(20190106 1844) nil "Shows your agenda when editor is idle" tar ((:url . "https://github.com/enisozgen/idle-org-agenda") (:commit . "bfdf1b4f4096acdd081b3549d6b838f4ca4f7d0d") (:revdesc . "bfdf1b4f4096") (:keywords "org" "org-mode" "org-agenda" "calendar") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("Enis zgen" . "mail@enisozgen.com")) (:maintainer "Enis zgen" . "mail@enisozgen.com"))]) + (idle-require . [(20090715 2203) nil "Load elisp libraries while Emacs is idle" tar ((:url . "http://nschum.de/src/emacs/idle-require/") (:commit . "33592bb098223b4432d7a35a1d65ab83f47c1ec1") (:revdesc . "33592bb09822") (:keywords "internal") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainer "Nikolaj Schumacher" . "bugs*nschumde"))]) + (ido-at-point . [(20151113 1508) ((emacs (24))) "Ido-style completion-at-point" tar ((:url . "https://github.com/katspaugh/ido-at-point") (:commit . "e5907bbe8a3d148d07698b76bd994dc3076e16ee") (:revdesc . "e5907bbe8a3d") (:keywords "convenience" "abbrev"))]) + (ido-complete-space-or-hyphen . [(20210206 1505) nil "Allow spaces to also match hyphens in ido" tar ((:url . "https://github.com/DarwinAwardWinner/ido-complete-space-or-hyphen") (:commit . "d1244243e042b8d5b6b991db752a17a44ea169bc") (:revdesc . "d1244243e042") (:keywords "ido" "completion" "convenience") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Ian Yang" . "meiany.me")) (:maintainers ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org"))]) + (ido-completing-read+ . [(20240130 30) ((emacs (24 4)) (seq (0 5)) (memoize (1 1))) "A completing-read-function using ido" tar ((:url . "https://github.com/DarwinAwardWinner/ido-completing-read-plus") (:commit . "1609049c0a9b3f674ffff3083adc8f5359746fa9") (:revdesc . "1609049c0a9b") (:keywords "ido" "completion" "convenience") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainers ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org"))]) + (ido-exit-target . [(20170717 1851) ((emacs (24 4))) "Commands and keys for selecting other window and frame targets within ido" tar ((:url . "https://github.com/waymondo/ido-exit-target") (:commit . "e56fc6928649c87ccf39d56d84ab53ebaced1f73") (:revdesc . "e56fc6928649") (:keywords "convenience" "tools" "extensions") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainers ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com"))]) + (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 ((:url . "https://github.com/ROCKTAKEY/ido-flex-with-migemo") (:commit . "aa93aa05947eb6c106bb9523ff3163b8574c4eac") (:revdesc . "aa93aa05947e") (:keywords "matching") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (ido-gnus . [(20140216 1646) ((gnus (5 13))) "Access gnus groups or servers using ido" tar ((:url . "https://github.com/vapniks/ido-gnus") (:commit . "f5fe3f6aa8086f675ba216abace9e3d5f2e3a089") (:revdesc . "f5fe3f6aa808") (:keywords "comm") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (ido-grid-mode . [(20160122 1139) ((emacs (24 4))) "Display ido-prospects in the minibuffer in a grid" tar ((:url . "https://github.com/larkery/ido-grid-mode.el") (:commit . "7cfca3988a6dc3ad18e28abe114218095ff2366f") (:revdesc . "7cfca3988a6d") (:keywords "convenience") (:maintainers ("Tom Hinton" . "t@larkery.com")) (:maintainer "Tom Hinton" . "t@larkery.com"))]) + (ido-hacks . [(20190206 2153) nil "Put more IDO in your IDO" tar ((:url . "https://github.com/scottjad/ido-hacks") (:commit . "d2153a3e8d23436ee07ecae2a106f434361a10c5") (:revdesc . "d2153a3e8d23") (:keywords "convenience") (:maintainers ("Scott Jaderholm" . "jaderholm@gmail.com")) (:maintainer "Scott Jaderholm" . "jaderholm@gmail.com"))]) + (ido-load-library . [(20140611 1600) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Load-library alternative using ido-completing-read" tar ((:url . "http://github.com/rolandwalker/ido-load-library") (:commit . "f439559721c5fecb2572dcaf3e357c5d94a20f4a") (:revdesc . "f439559721c5") (:keywords "maint" "completion") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (ido-migemo . [(20191017 1919) ((migemo (1 9 1))) "Migemo plug-in for Ido" tar ((:url . "https://github.com/myuhe/ido-migemo.el") (:commit . "09a2cc175b500cab7655a25ffc982e78d46ca669") (:revdesc . "09a2cc175b50") (:keywords "files") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (ido-occasional . [(20150214 1248) ((emacs (24 1))) "Use ido where you choose" tar ((:url . "https://github.com/abo-abo/ido-occasional") (:commit . "d405f1795e1e0c63be411ee2825184738d29c33a") (:revdesc . "d405f1795e1e") (:keywords "completion") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (ido-select-window . [(20131220 2047) ((emacs (24 1))) "Select a window using ido and buffer names" tar ((:url . "https://github.com/pjones/ido-select-window") (:commit . "946db3db7a3fec582cc1a0097877f1250303b53a") (:revdesc . "946db3db7a3f") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainers ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com"))]) + (ido-skk . [(20151111 950) ((emacs (24 4)) (ddskk (20150912 1820))) "Ido interface for skk henkan" tar ((:url . "https://github.com/tsukimizake/ido-skk") (:commit . "89a2e62799bff2841ff634517c86084c4ce69246") (:revdesc . "89a2e62799bf") (:keywords "languages") (:authors ("tsukimizake" . "shomasd_at_gmail.com")) (:maintainers ("tsukimizake" . "shomasd_at_gmail.com")) (:maintainer "tsukimizake" . "shomasd_at_gmail.com"))]) + (ido-sort-mtime . [(20171121 859) nil "Sort Ido's file list by modification time" tar ((:url . "https://github.com/pkkm/ido-sort-mtime") (:commit . "f638ff0c922af862f5211779f2311a27fde428eb") (:revdesc . "f638ff0c922a") (:keywords "convenience" "files"))]) + (ido-springboard . [(20170106 755) nil "Temporarily change default-directory for one command" tar ((:url . "https://github.com/jwiegley/springboard") (:commit . "263a8cd4582c81bfc29d7db37d5267e2488b148c") (:revdesc . "263a8cd4582c") (:keywords "ido") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com"))]) + (ido-vertical-mode . [(20250424 1552) ((emacs (24 4))) "Makes ido-mode display vertically" tar ((:url . "https://github.com/creichert/ido-vertical-mode.el") (:commit . "35c521789bb009a7f4b0df30b68d595fdbe056a9") (:revdesc . "35c521789bb0") (:keywords "convenience") (:maintainers ("Christopher Reichert" . "creichert07@gmail.com")) (:maintainer "Christopher Reichert" . "creichert07@gmail.com"))]) + (ido-yes-or-no . [(20161108 2351) ((ido-completing-read+ (0))) "Use Ido to answer yes-or-no questions" tar ((:url . "https://github.com/DarwinAwardWinner/ido-yes-or-no") (:commit . "8953eadaaa7811ebc66d8a9eb7ac43f38913ab59") (:revdesc . "8953eadaaa78") (:keywords "convenience" "completion" "ido"))]) + (idomenu . [(20141123 2120) nil "Imenu tag selection a la ido" tar ((:url . "https://github.com/birkenfeld/idomenu") (:commit . "4b0152d606360c70204fb4c27f68de79ca885386") (:revdesc . "4b0152d60636") (:authors ("Georg Brandl" . "georg@python.org")) (:maintainers ("Georg Brandl" . "georg@python.org")) (:maintainer "Georg Brandl" . "georg@python.org"))]) + (idris-mode . [(20251203 1548) ((emacs (24)) (prop-menu (0 1)) (cl-lib (0 5))) "Major mode for editing Idris code" tar ((:url . "https://github.com/idris-hackers/idris-mode") (:commit . "85928dc4cc2c22010fa91661abd55e6bd3dbacee") (:revdesc . "85928dc4cc2c") (:keywords "languages"))]) + (ids-edit . [(20170818 1502) ((emacs (24 3))) "IDS (Ideographic Description Sequence) editing tool" tar ((:url . "http://github.com/kawabata/ids-edit") (:commit . "8562a6cbfb3f2d44bc6f62ab15081a80f8fee502") (:revdesc . "8562a6cbfb3f") (:keywords "i18n" "wp") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (iedit . [(20251017 410) nil "Edit multiple regions in the same way simultaneously" tar ((:url . "https://github.com/victorhge/iedit") (:commit . "7e513d573c6a5dd2a01aeeb1d8587d74630a2f80") (:revdesc . "7e513d573c6a") (:keywords "occurrence" "region" "simultaneous" "refactoring") (:authors ("Victor Ren" . "victorhge@gmail.com")) (:maintainers ("Victor Ren" . "victorhge@gmail.com")) (:maintainer "Victor Ren" . "victorhge@gmail.com"))]) + (ietf-docs . [(20190420 851) nil "Fetch, Cache and Load IETF documents" tar ((:url . "https://github.com/choppsv1/ietf-docs") (:commit . "ae157549eae5ec78dcbf215c2f48cb662b73abd0") (:revdesc . "ae157549eae5") (:keywords "ietf" "rfc") (:authors ("Christian E. Hopps" . "chopps@gmail.com")) (:maintainers ("Christian E. Hopps" . "chopps@gmail.com")) (:maintainer "Christian E. Hopps" . "chopps@gmail.com"))]) + (iflipb . [(20220612 858) nil "Interactively flip between recently visited buffers" tar ((:url . "https://github.com/jrosdahl/iflipb") (:commit . "9ec1888335107bd314e8f40b3e113d525fed8083") (:revdesc . "9ec188833510") (:authors ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainers ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainer "Joel Rosdahl" . "joel@rosdahl.net"))]) + (igist . [(20251023 848) ((emacs (29 1)) (ghub (4 2 2)) (transient (0 8 5))) "List, create, update and delete GitHub gists" tar ((:url . "https://github.com/KarimAziev/igist") (:commit . "badbc1302e6f83cfebd304c6332b321ca3313f21") (:revdesc . "badbc1302e6f") (:keywords "tools") (:authors ("Karim Aziiev" . "karim.aziiev@gmail.com")) (:maintainers ("Karim Aziiev" . "karim.aziiev@gmail.com")) (:maintainer "Karim Aziiev" . "karim.aziiev@gmail.com"))]) + (ignoramus . [(20220611 1514) ((emacs (24 3))) "Ignore backups, build files, et al" tar ((:url . "http://github.com/rolandwalker/ignoramus") (:commit . "f5e4a66191be12c2fc3cf42a5e0849fcc8518a3f") (:revdesc . "f5e4a66191be") (:keywords "convenience" "tools") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (igv . [(20141210 1227) nil "Control Integrative Genomic Viewer within Emacs" tar ((:commit . "47ac6ceede252f451348a2c696398c0cb5279555") (:revdesc . "47ac6ceede25") (: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 ((:url . "https://github.com/mhayashi1120/Emacs-imagex") (:commit . "6834d0c09bb4df9ecc0d7a559bd7827fed48fffc") (:revdesc . "6834d0c09bb4") (:keywords "multimedia" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (image-archive . [(20150621 132) ((emacs (24)) (cl-lib (0 5))) "Image thumbnails in archive file with non-blocking" tar ((:url . "https://github.com/mhayashi1120/Emacs-image-archive") (:commit . "4cf0edabfd6a4da2ffb920ff1e5009a002fc1e53") (:revdesc . "4cf0edabfd6a") (:keywords "multimedia") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (image-dired+ . [(20150430 544) ((cl-lib (0 3))) "Image-dired extensions" tar ((:url . "https://github.com/mhayashi1120/Emacs-image-diredx") (:commit . "b68094625d963056ad64e0e44af0e2266b2eadc7") (:revdesc . "b68094625d96") (:keywords "extensions" "multimedia") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (imakado . [(20141024 923) nil "Imakado's usefull macros and functions" tar ((:url . "https://github.com/imakado/emacs-imakado") (:commit . "00a1e7eea2cb9e9066343a23927d6c747707902f") (:revdesc . "00a1e7eea2cb") (:keywords "convenience") (:authors ("imakado" . "ken.imakado_at_gmail.com")))]) + (imake . [(20251101 2020) ((emacs (26 1)) (compat (30 1))) "Simple, opinionated make target runner" tar ((:url . "https://github.com/tarsius/imake") (:commit . "6a0bfeddb1565b4215c9228635c5897b487adb26") (:revdesc . "6a0bfeddb156") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "emacs.imake@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.imake@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.imake@jonas.bernoulli.dev"))]) + (imbot . [(20250108 1419) ((emacs (25 1))) "Automatic system input method switcher" tar ((:url . "https://github.com/QiangF/imbot") (:commit . "3d4d5b0e73981a5249bcedfabd6bb188a1283075") (:revdesc . "3d4d5b0e7398") (:keywords "convenience"))]) + (imenu-anywhere . [(20210201 1704) ((cl-lib (0 5)) (emacs (25))) "Ido/ivy/helm imenu across same mode/project/etc buffers" tar ((:url . "https://github.com/vitoshka/imenu-anywhere") (:commit . "06ec33d79e33edf01b9118aead1eabeae8ee08b1") (:revdesc . "06ec33d79e33") (:keywords "ido" "imenu" "tags") (:authors ("Vitalie Spinu" . "spinuvit.list[aaattt]gmail[dot]com")) (:maintainers ("Vitalie Spinu" . "spinuvit.list[aaattt]gmail[dot]com")) (:maintainer "Vitalie Spinu" . "spinuvit.list[aaattt]gmail[dot]com"))]) + (imenu-extra . [(20201229 1035) ((emacs (25 1))) "Add extra items into existing imenu items" tar ((:url . "https://github.com/redguardtoo/imenu-extra") (:commit . "68b0aaaefc18b267e4e383df36a8dfb7448bc83c") (:revdesc . "68b0aaaefc18") (:keywords "convenience") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (imenu-list . [(20210420 1200) ((emacs (24 3))) "Show imenu entries in a separate buffer" tar ((:url . "https://github.com/bmag/imenu-list") (:commit . "76f2335ee6f2f066d87fe4e4729219d70c9bc70d") (:revdesc . "76f2335ee6f2"))]) + (imenus . [(20200730 855) ((cl-lib (0 5))) "Imenu for multiple buffers and without subgroups" tar ((:url . "https://github.com/alezost/imenus.el") (:commit . "90200f5f22377903b405082eabe185447968f3e2") (:revdesc . "90200f5f2237") (:keywords "tools" "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (imgbb . [(20180609 1649) ((emacs (24)) (request (0 3 0))) "Simple image upload client for imgbb.com" tar ((:url . "https://github.com/ecraven/imgbb.el") (:commit . "a524a46263835aa474f908827ebab4e8fa586001") (:revdesc . "a524a4626383") (:keywords "extensions") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net"))]) + (imgur . [(20241201 1257) ((emacs (27 1))) "Imgur client" tar ((:url . "https://github.com/KeyWeeUsr/imgur") (:commit . "9a7f47d6da3f6a7365f8575c0403f05398ad05c5") (:revdesc . "9a7f47d6da3f") (:keywords "convenience" "imgur" "client") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (immaterial-theme . [(20251222 1352) ((emacs (29)) (modus-themes (5 0 0))) "A family of themes loosely based on material colors" tar ((:url . "https://github.com/petergardfjall/emacs-immaterial-theme") (:commit . "c478e875d9949a0b8341fa146ea9a408997623f5") (:revdesc . "c478e875d994") (:keywords "themes"))]) + (immersive-translate . [(20231001 1557) ((emacs (28 2))) "Translate the current buffer immersively" tar ((:url . "https://github.com/Elilif/emacs-immersive-translate") (:commit . "1d00d558363985fa988fc40cd5093bfc6926d83e") (:revdesc . "1d00d5583639") (:keywords "convenience" "help" "translate") (:authors ("Eli Qian" . "eli.q.qian@gmail.com")) (:maintainers ("Eli Qian" . "eli.q.qian@gmail.com")) (:maintainer "Eli Qian" . "eli.q.qian@gmail.com"))]) + (immortal-scratch . [(20160517 2118) nil "Respawn the scratch buffer when it's killed" tar ((:url . "https://github.com/jpkotta/immortal-scratch") (:commit . "faeab0ad6c33c74c0cbd1dfcebffaa0690de40c6") (:revdesc . "faeab0ad6c33") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainers ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))]) + (impatient-mode . [(20230511 1746) ((emacs (24 3)) (simple-httpd (1 5 0)) (htmlize (1 40))) "Serve buffers live over HTTP" tar ((:url . "https://github.com/netguy204/imp.el") (:commit . "a4e4e12852840996b027cb8e9fb2b809c37a0ee3") (:revdesc . "a4e4e1285284") (:authors ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainers ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainer "Brian Taylor" . "el.wubo@gmail.com"))]) + (impatient-showdown . [(20250101 1009) ((emacs (24 3)) (impatient-mode (1 1))) "Preview markdown buffer live over HTTP using showdown" tar ((:url . "https://github.com/jcs-elpa/impatient-showdown") (:commit . "5fa168ec9b74ba1579918eed01fde162d11e209a") (:revdesc . "5fa168ec9b74") (:keywords "convenience" "live" "preview" "markdown" "http" "server" "impatient") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (import-js . [(20220215 1948) ((grizzl (0 1 0)) (emacs (24))) "Import Javascript dependencies" tar ((:url . "http://github.com/Galooshi/emacs-import-js/") (:commit . "d2bbb53f96395415f9f01de4fa88d82c1f59ba63") (:revdesc . "d2bbb53f9639") (:keywords "javascript") (:authors ("Kevin Kehl" . "kevin.kehl@gmail.com")) (:maintainers ("Kevin Kehl" . "kevin.kehl@gmail.com")) (:maintainer "Kevin Kehl" . "kevin.kehl@gmail.com"))]) + (import-popwin . [(20170218 1407) ((emacs (24 3)) (popwin (0 6))) "Popwin buffer near by import statements with popwin" tar ((:url . "https://github.com/syohex/emacs-import-popwin") (:commit . "bb05a9e226f8c63fe7b18a3e92010357049ab5ba") (:revdesc . "bb05a9e226f8") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (importmagic . [(20180520 303) ((f (0 11 0)) (epc (0 1 0)) (emacs (24 3))) "Fix Python imports using importmagic" tar ((:url . "https://github.com/anachronic/importmagic.el") (:commit . "e32ee9f6a5eef937b76eba82fdae8bae85d18088") (:revdesc . "e32ee9f6a5ee") (:keywords "languages" "convenience") (:authors ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainers ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainer "Nicolás Salas V." . "nikosalas@gmail.com"))]) + (impostman . [(20250412 1521) ((emacs (27 1))) "Import Postman collections" tar ((:url . "https://github.com/flashcode/impostman") (:commit . "c1e764b16d32930d157e5bf2d2e6ac4dc3a23b8c") (:revdesc . "c1e764b16d32") (:keywords "tools") (:authors ("Sébastien Helleu" . "flashcode@flashtux.org")) (:maintainers ("Sébastien Helleu" . "flashcode@flashtux.org")) (:maintainer "Sébastien Helleu" . "flashcode@flashtux.org"))]) + (incus-tramp . [(20240917 906) ((emacs (24 4))) "TRAMP integration for Incus containers" tar ((:url . "https://gitlab.com/lckarssen/incus-tramp.git") (:commit . "dfeb8381bcde28209bafb45b03bb8d6795aedb61") (:revdesc . "dfeb8381bcde") (:keywords "incus" "convenience") (:authors ("Lennart C. Karssen" . "lennart@karssen.org")) (:maintainers ("Lennart C. Karssen" . "lennart@karssen.org")) (:maintainer "Lennart C. Karssen" . "lennart@karssen.org"))]) + (indent-control . [(20250602 1131) ((emacs (26 1))) "Management for indentation level" tar ((:url . "https://github.com/jcs-elpa/indent-control") (:commit . "9bcc2d1a35772cd55d2b11536cb21ffcd7eea365") (:revdesc . "9bcc2d1a3577") (:keywords "convenience" "control" "indent" "tab" "generic" "level") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (indent-guide . [(20210115 400) nil "Show vertical lines to guide indentation" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "d388c3387781a370ca13233ff445d03f3c5cf12f") (:revdesc . "d388c3387781"))]) + (indent-info . [(20210111 745) ((emacs (24 3))) "Show indentation information in status bar" tar ((:url . "https://github.com/terlar/indent-info.el") (:commit . "05a787afeb9946714d8b0c724868195a678db49e") (:revdesc . "05a787afeb99") (:keywords "convenience" "tools") (:authors ("Terje Larsen" . "terlar@gmail.com")) (:maintainers ("Terje Larsen" . "terlar@gmail.com")) (:maintainer "Terje Larsen" . "terlar@gmail.com"))]) + (indent-lint . [(20230822 46) ((emacs (25 1)) (async-await (1 0)) (async (1 9 4)) (promise (1 1))) "Async indentation checker" tar ((:url . "https://github.com/conao3/indent-lint.el") (:commit . "aee76faf54a55e0bcb5dc07a667d7f5999299c9b") (:revdesc . "aee76faf54a5") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (indent-tools . [(20210622 1207) ((s (0)) (hydra (0)) (yafolding (0))) "Indent, navigate (and more) by blocks of indentation: yaml, python etc" tar ((:url . "https://gitlab.com/emacs-stuff/indent-tools/") (:commit . "c731f05fa3950e2e8580ec61b88abbc705639830") (:revdesc . "c731f05fa395") (:keywords "indentation" "movements" "navigation" "kill" "fold" "yaml" "python") (:authors ("vindarel" . "vindarel@mailz.org")) (:maintainers ("vindarel" . "vindarel@mailz.org")) (:maintainer "vindarel" . "vindarel@mailz.org"))]) + (indentinator . [(20251103 2132) ((emacs (25 1))) "Automatically indent code" tar ((:url . "https://github.com/xendk/indentinator.el") (:commit . "79ddeb38d9679616b7a843a88b22866f3b3cd9f6") (:revdesc . "79ddeb38d967") (:keywords "convenience") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainers ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk"))]) + (indian-ext . [(20231009 740) ((emacs (24))) "Extension to Indian language utilities" tar ((:url . "https://github.com/paddymcall/indian-ext") (:commit . "80ea22eea203c8eb4c28f59fceb8d276395ecb0f") (:revdesc . "80ea22eea203") (:keywords "i18n" "tools" "wp" "indian" "devanagari" "encoding") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainers ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org"))]) + (indicators . [(20240321 2029) ((dash (2 13 0)) (cl-lib (0 5 0))) "Display the buffer relative location of line in the fringe" tar ((:url . "https://github.com/Fuco1/indicators.el") (:commit . "9b80c4545fc5c50332b2748c30d492517ae583b5") (:revdesc . "9b80c4545fc5") (:keywords "fringe" "frames") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (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 ((:url . "https://github.com/NicolasPetton/indium") (:commit . "8499e156bf7286846c3a2bf8c9e0c4d4f24b224c") (:revdesc . "8499e156bf72") (:keywords "tools" "javascript") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (indy . [(20190807 625) nil "A minor mode and EDSL to manage your mode's indentation rules" tar ((:url . "https://github.com/kwrooijen/indy") (:commit . "abc5bee424780ad2de5520f8fefbf8e120c0d9ed") (:revdesc . "abc5bee42478") (:keywords "convenience" "matching" "tools") (: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"))]) + (inf-clojure . [(20250525 2054) ((emacs (28 1)) (clojure-mode (5 11))) "Basic interaction with a Clojure REPL" tar ((:url . "http://github.com/clojure-emacs/inf-clojure") (:commit . "bdef6110a3d051c08179503207eadc43b1dd4d09") (:revdesc . "bdef6110a3d0") (:keywords "processes" "comint" "clojure") (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (inf-crystal . [(20180119 211) ((emacs (24 3)) (crystal-mode (0 1 0))) "Run a Inferior-Crystal process in a buffer" tar ((:url . "https://github.com/brantou/inf-crystal.el") (:commit . "dd5c85e621976ea09b602182a15396e3b510ec63") (:revdesc . "dd5c85e62197") (:keywords "languages" "crystal") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com"))]) + (inf-elixir . [(20251106 2146) ((emacs (25 1))) "Run an interactive Elixir shell" tar ((:url . "https://github.com/J3RN/inf-elixir") (:commit . "085f1c198a121c569a161f9fa71e6cce1998cd63") (:revdesc . "085f1c198a12") (:keywords "languages" "processes" "tools") (:authors ("Jonathan Arnett" . "j3rn@j3rn.com")) (:maintainers ("Jonathan Arnett" . "j3rn@j3rn.com")) (:maintainer "Jonathan Arnett" . "j3rn@j3rn.com"))]) + (inf-ruby . [(20251224 216) ((emacs (26 1))) "Run a Ruby process in a buffer" tar ((:url . "http://github.com/nonsequitur/inf-ruby") (:commit . "274398a24288a7db430a656b580ffbf889ca02aa") (:revdesc . "274398a24288") (:keywords "languages" "ruby") (:authors ("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"))]) + (inferior-islisp . [(20220924 1040) ((emacs (26 3)) (islisp-mode (0 2))) "Run inferior ISLisp processes" tar ((:url . "https://gitlab.com/sasanidas/islisp-mode") (:commit . "423b84fe4cc6944e36971225b3e19c888e7e4690") (:revdesc . "423b84fe4cc6") (:keywords "islisp" "lisp" "programming") (:maintainers ("Fermin Munoz" . "fmfs@posteo.net")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net"))]) + (inflections . [(20210110 2237) ((cl-lib (0 5)) (emacs (24))) "Convert english words between singular and plural" tar ((:url . "https://github.com/eschulte/jump.el") (:commit . "55caa66a7cc6e0b1a76143fd40eff38416928941") (:revdesc . "55caa66a7cc6") (:keywords "languages" "tools" "wp"))]) + (info-beamer . [(20210427 1033) ((emacs (24 4))) "Utilities for working with info-beamer" tar ((:url . "https://github.com/dakra/info-beamer.el") (:commit . "6b4cc29f1aec72d8e23b2c25a99cdd84e6cdc92b") (:revdesc . "6b4cc29f1aec") (:keywords "tools" "processes" "comm") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainers ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my"))]) + (info-buffer . [(20170112 1422) nil "Display info topics in separate buffers" tar ((:url . "http://www.github.com/llvilanova/info-buffer") (:commit . "d35dad6e766c6e2ddb8dc6acb4ce5b6e10fbcaa7") (:revdesc . "d35dad6e766c") (:keywords "docs" "info") (:authors ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainers ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainer "Lluís Vilanova" . "vilanova@ac.upc.edu"))]) + (info-colors . [(20220927 1640) ((emacs (24)) (cl-lib (0 5))) "Extra colors for Info-mode" tar ((:url . "https://github.com/ubolonton/info-colors") (:commit . "2e237c301ba62f0e0286a27c1abe48c4c8441143") (:revdesc . "2e237c301ba6") (:keywords "faces") (: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"))]) + (info-rename-buffer . [(20200328 1450) ((emacs (24 3))) "Rename Info buffers to match manuals" tar ((:url . "https://github.com/oitofelix/info-rename-buffer") (:commit . "87fb263b18717538fd04878e3358e1e720415db8") (:revdesc . "87fb263b1871") (:keywords "help") (: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"))]) + (inform . [(20200723 500) ((emacs (25 1))) "Symbol links in Info buffers to their help documentation" tar ((:url . "https://github.com/dieter-wilhelm/inform") (:commit . "8ff0a19a9f40cfa8283da8ed73de94c35a327423") (:revdesc . "8ff0a19a9f40") (:keywords "help" "docs" "convenience") (:authors ("H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de")))]) + (inform-mode . [(20250602 2351) ((emacs (29 1))) "Major mode for Inform 6 interactive fiction code" tar ((:url . "https://rrthomas.github.io/inform-mode") (:commit . "e03289d0d056a6e35737612650c7a6060537f726") (:revdesc . "e03289d0d056") (:keywords "languages") (:authors ("Rupert Lane" . "rupert@rupert-lane.org") ("Gareth Rees" . "Gareth.Rees@cl.cam.ac.uk")) (:maintainers ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org"))]) + (inform7 . [(20200430 1539) ((emacs (24 3)) (s (1 12 0))) "Major mode for working with Inform 7 files" tar ((:url . "https://github.com/GuiltyDolphin/inform7-mode") (:commit . "a409bbc6f04264f7f00616a995fa6ecf59d33d0d") (:revdesc . "a409bbc6f042") (:keywords "languages") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainers ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com"))]) + (inherit-local . [(20170409 1649) ((emacs (24 3))) "Inherited buffer-local variables" tar ((:url . "https://github.com/shlevy/inherit-local/tree-master/") (:commit . "b1f4ff9c41f9d64e4adaf5adcc280b82f084cdc7") (:revdesc . "b1f4ff9c41f9"))]) + (inheritenv . [(20241119 1355) ((emacs (24 4))) "Make temp buffers inherit buffer-local environment variables" tar ((:url . "https://github.com/purcell/inheritenv") (:commit . "b9e67cc20c069539698a9ac54d0e6cc11e616c6f") (:revdesc . "b9e67cc20c06") (:keywords "unix") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (inhibit-mouse . [(20251103 1432) ((emacs (24 1))) "Deactivate mouse input (alternative to disable-mouse)" tar ((:url . "https://github.com/jamescherti/inhibit-mouse.el") (:commit . "442202e59d61b0f0c662f9dadfa8fd9ecc31991b") (:revdesc . "442202e59d61") (:keywords "convenience"))]) + (ini . [(20220827 2009) ((emacs (24 4))) "Converting between INI files and association lists" tar ((:url . "https://github.com/EsaLaine/ini.el") (:commit . "d50fe629497d51c6390a56bbded1ad77ce12e5af") (:revdesc . "d50fe629497d"))]) + (ini-mode . [(20250103 1901) ((emacs (24 1))) "Major mode for Windows-style ini files" tar ((:url . "https://github.com/Lindydancer/ini-mode") (:commit . "d99a27548a650b8ad531634419ae55f7b4dbe2fa") (:revdesc . "d99a27548a65") (:keywords "languages" "faces"))]) + (init-dir . [(20240924 150) ((emacs (27 1)) (benchmark-init (1 2))) "Init directory instead of just a single file" tar ((:url . "http://github.com/chaosemer/init-dir") (:commit . "406953deb5f29112ca02850885954f82abb1d334") (:revdesc . "406953deb5f2") (:keywords "extensions" "internal") (:authors ("Jared Finder" . "jared@finder.org")) (:maintainers ("Jared Finder" . "jared@finder.org")) (:maintainer "Jared Finder" . "jared@finder.org"))]) + (init-loader . [(20250313 47) ((cl-lib (0 5))) "Loader for configuration files" tar ((:url . "https://github.com/emacs-jp/init-loader/") (:commit . "1837769c872b6453c7c02490f50a6eb322156c2c") (:revdesc . "1837769c872b") (:authors ("IMAKADO" . "ken.imakado@gmail.com")) (:maintainers ("IMAKADO" . "ken.imakado@gmail.com")) (:maintainer "IMAKADO" . "ken.imakado@gmail.com"))]) + (init-open-recentf . [(20220220 2004) ((emacs (24 4))) "Invoke a command immediately after startup" tar ((:url . "https://github.com/zonuexe/init-open-recentf.el") (:commit . "51463effe54ca9390ec339b9678968f35a40dbfd") (:revdesc . "51463effe54c") (:keywords "files" "recentf" "after-init-hook") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (initsplit . [(20160919 1818) nil "Code to split customizations into different files" tar ((:url . "http://www.gci-net.com/users/j/johnw/emacs.html") (:commit . "c941d436eb2b10b01c76a582c5a2b23fb30751aa") (:revdesc . "c941d436eb2b") (:keywords "lisp") (:authors ("John Wiegley" . "johnw@gnu.org") ("Dave Abrahams" . "dave@boostpro.com")) (:maintainers ("John Wiegley" . "johnw@gnu.org") ("Dave Abrahams" . "dave@boostpro.com")) (:maintainer "John Wiegley" . "johnw@gnu.org"))]) + (ink-mode . [(20201105 2242) ((emacs (26 1))) "Major mode for writing interactive fiction in Ink" tar ((:url . "https://github.com/Kungsgeten/ink-mode") (:commit . "71d215712067729eb92e766a3b2067e7f3254183") (:revdesc . "71d215712067") (:keywords "languages" "wp" "hypermedia"))]) + (inkpot-theme . [(20250303 1039) ((emacs (24 1))) "A port of vim's inkpot theme" tar ((:url . "https://codeberg.org/ideasman42/emacs-inkpot-theme") (:commit . "a10b26fbee33dc8533a6688df51c540683f39134") (:revdesc . "a10b26fbee33") (:authors ("Sarah Iovan" . "sarah@hwaetageek.com") ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Sarah Iovan" . "sarah@hwaetageek.com") ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Sarah Iovan" . "sarah@hwaetageek.com"))]) + (inline-crypt . [(20170824 900) nil "Simple inline encryption via openssl" tar ((:url . "https://github.com/Sodel-the-Vociferous/inline-crypt-el") (:commit . "af4981c613bfd355d5ef34da1995a8384f167fd9") (:revdesc . "af4981c613bf") (:keywords "crypt") (:authors ("Daniel Ralston" . "Wubbulous@gmail.com")) (:maintainers ("Daniel Ralston" . "Wubbulous@gmail.com")) (:maintainer "Daniel Ralston" . "Wubbulous@gmail.com"))]) + (inline-docs . [(20230708 222) ((emacs (24 3))) "Show inline contextual docs" tar ((:url . "https://repo.or.cz/inline-docs.git") (:commit . "08eb99f65406993425ccf9937aad013436a7c6ef") (:revdesc . "08eb99f65406") (:keywords "inline" "docs" "overlay") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com"))]) + (inlineR . [(20191017 1920) nil "Insert Tag for inline image of R graphics" tar ((:url . "https://github.com/myuhe/inlineR.el") (:commit . "bf6450a3540aa3538546d312324c41befd0a4e54") (:revdesc . "bf6450a3540a") (:keywords "convenience" "iimage.el" "cacoo.el") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (inputrc-mode . [(20241109 10) ((emacs (27 1))) "Major mode for readline configuration" tar ((:url . "https://github.com/nverno/inputrc-mode") (:commit . "2ccf09ae19f3cbb2b8c35dcd54ed333d688fffae") (:revdesc . "2ccf09ae19f3") (:keywords "languages" "readline" "config") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (insecure-lock . [(20230426 53) ((emacs (28 1))) "Extensible screen lock framework" tar ((:url . "https://github.com/BlueFlo0d/insecure-lock") (:commit . "33b2cf4ecf80d948cf0942aa8bc1787d44c99941") (:revdesc . "33b2cf4ecf80") (:keywords "unix" "screensaver" "security") (:authors ("Qiantan Hong" . "qhong@alum.mit.edu")) (:maintainers ("Qiantan Hong" . "qhong@alum.mit.edu")) (:maintainer "Qiantan Hong" . "qhong@alum.mit.edu"))]) + (insert-char-preview . [(20201023 2108) ((emacs (24 1))) "Insert Unicode char" tar ((:url . "https://gitlab.com/matsievskiysv/insert-char-preview") (:commit . "8f13262ebcb3f271f1d188584d04ca6d87214111") (:revdesc . "8f13262ebcb3") (:keywords "convenience"))]) + (insert-esv . [(20201201 722) ((emacs (24 3)) (request (0 3 2))) "Insert ESV Bible passages" tar ((:url . "https://github.com/sam030820/insert-esv/") (:commit . "b6b47f1521f221e0c2a215f1f802708e10294422") (:revdesc . "b6b47f1521f2") (:keywords "convenience"))]) + (insert-kaomoji . [(20220215 1204) ((emacs (24 4))) "Easily insert kaomojis" tar ((:url . "https://git.sr.ht/~pkal/insert-kaomoji") (:commit . "974bb7dc02059253e032c501b2c3c0ece448d472") (:revdesc . "974bb7dc0205") (:keywords "wp") (:authors ("Philip Kaludercic" . "philipk@posteo.net")) (:maintainers ("Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")) (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht"))]) + (insert-random . [(20230212 1710) ((emacs (24 5))) "Insert random characters from various character sets" tar ((:url . "https://github.com/lassik/emacs-insert-random") (:commit . "a13827fd68457f939e46f95a662752f6f344107c") (:revdesc . "a13827fd6845") (:keywords "convenience") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (insert-shebang . [(20201203 1648) nil "Insert shebang line automatically" tar ((:url . "https://gitlab.com/psachin/insert-shebang") (:commit . "cc8cea997a8523bce9f303de993af3a73eb0d2e2") (:revdesc . "cc8cea997a85") (:keywords "shebang" "tool" "convenience") (:authors ("Sachin Patil" . "iclcoolster@gmail.com")) (:maintainers ("Sachin Patil" . "iclcoolster@gmail.com")) (:maintainer "Sachin Patil" . "iclcoolster@gmail.com"))]) + (insfactor . [(20141117 2) nil "Client for a Clojure project with insfactor in it" tar ((:url . "http://github.com/duelinmarkers/insfactor.el") (:commit . "7ef5446cebb08a17d4106d2e6f3c053e49e1e829") (:revdesc . "7ef5446cebb0") (:keywords "clojure") (:authors ("John D. Hume" . "duelin.markers@gmail.com")) (:maintainers ("John D. Hume" . "duelin.markers@gmail.com")) (:maintainer "John D. Hume" . "duelin.markers@gmail.com"))]) + (inspire . [(20230514 1030) ((emacs (27 1))) "An interface for inspirehep.net" tar ((:url . "https://github.com/Simon-Lin/inspire.el") (:commit . "825bbd4e19046b0e61aa27a0f88b1daeaaebf1d0") (:revdesc . "825bbd4e1904") (:keywords "extensions" "tex") (:authors ("Simon Lin" . "n.sibetz@gmail.com")) (:maintainers ("Simon Lin" . "n.sibetz@gmail.com")) (:maintainer "Simon Lin" . "n.sibetz@gmail.com"))]) + (insta-pocket . [(20250921 2201) ((emacs (29 1)) (oauth (1 11)) (tablist (1 0))) "Instapaper client" tar ((:url . "https://github.com/thanhvg/emacs-insta-pocket") (:commit . "33a735c3c5060b5e322aa4eb4e24665c01c3ba4b") (:revdesc . "33a735c3c506") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainers ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com"))]) + (instapaper . [(20110419 1355) nil "[No description available]" tar ((:url . "htts://bitbucket.org/jfm/emacs-instapaper") (:commit . "4714ed1b014615f8213e6f93637e4ec1d9d5a37a") (:revdesc . "4714ed1b0146") (:authors ("Jason F. McBrayer" . "jmcbray@carcosa.net")) (:maintainers ("Jason F. McBrayer" . "jmcbray@carcosa.net")) (:maintainer "Jason F. McBrayer" . "jmcbray@carcosa.net"))]) + (intel-hex-mode . [(20180423 31) nil "Mode for Intel Hex files" tar ((:url . "https://github.com/mschuldt/intel-hex-mode") (:commit . "e83c94e1c31a8435a88b3ae395f2bc842ef83217") (:revdesc . "e83c94e1c31a") (:keywords "tools" "hex") (:maintainers ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com"))]) + (intellij-theme . [(20171017 1415) nil "Inspired by IntelliJ's default theme" tar ((:url . "https://github.com/fommil/intellij-theme.el") (:commit . "1bbfff8e6742d18e9b77ed796f44da3b7bd10606") (:revdesc . "1bbfff8e6742") (:keywords "faces") (:authors ("Vladimir Polushin" . "vovapolu@gmail.com")) (:maintainers ("Vladimir Polushin" . "vovapolu@gmail.com")) (:maintainer "Vladimir Polushin" . "vovapolu@gmail.com"))]) + (interaction-log . [(20160305 1301) ((cl-lib (0))) "Exhaustive log of interactions with Emacs" tar ((:url . "https://github.com/michael-heerdegen/interaction-log.el") (:commit . "0f2d773269d1f7b93c9281226719113f5410cbd0") (:revdesc . "0f2d773269d1") (:keywords "convenience") (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainers ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de"))]) + (interval-list . [(20150327 1718) ((dash (2 4 0)) (cl-lib (0 5)) (emacs (24 4))) "Interval list data structure for 1D selections" tar ((:url . "https://github.com/Fuco1/interval-list") (:commit . "38af7ecf0a493ad8f487074938a2a115f3531177") (:revdesc . "38af7ecf0a49") (:keywords "extensions" "data structure") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (interval-tree . [(20130325 1407) ((dash (1 1 0))) "Interval tree data structure for 1D range queries" tar ((:url . "https://github.com/Fuco1/interval-tree") (:commit . "301302f480617091cf3ab6989caac385d52543dc") (:revdesc . "301302f48061") (:keywords "extensions" "data structure") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (inverse-acme-theme . [(20210204 1640) ((autothemer (0 2)) (cl-lib (0 5))) "A theme that looks like an inverse of Acme's color scheme" tar ((:url . "http://github.com/dcjohnson/inverse-acme-theme") (:commit . "79008920ce7923312ada6f95a3ec1f96ce513c0b") (:revdesc . "79008920ce79"))]) + (io-mode . [(20161004 756) nil "Major mode to edit Io language files in Emacs" tar ((:url . "https://github.com/superbobry/io-mode") (:commit . "fd65ae769093defcf554d6d637eba6e6dfc29f56") (:revdesc . "fd65ae769093") (:keywords "languages" "io") (:authors ("Sergei Lebedev" . "superbobry@gmail.com")) (:maintainers ("Sergei Lebedev" . "superbobry@gmail.com")) (:maintainer "Sergei Lebedev" . "superbobry@gmail.com"))]) + (io-mode-inf . [(20140128 1934) nil "Interaction with an Io interpreter" tar ((:url . "https://github.com/slackorama/io-emacs") (:commit . "6dd2bac3fd87484bb7d97e135b06c29d70b444b6") (:revdesc . "6dd2bac3fd87") (:keywords "io" "languages"))]) + (iodine-theme . [(20250521 1145) ((emacs (24))) "A light emacs color theme" tar ((:url . "https://github.com/srdja/iodine-theme") (:commit . "305691881ddf9ba0ad698979f133394bd132f180") (:revdesc . "305691881ddf") (:keywords "themes") (:authors ("Srđan Panić" . "srdja.panic@gmail.com")) (:maintainers ("Srđan Panić" . "srdja.panic@gmail.com")) (:maintainer "Srđan Panić" . "srdja.panic@gmail.com"))]) + (iosevka-theme . [(20250919 2228) ((emacs (28 1))) "Theme using various stylistic sets of Iosevka font" tar ((:url . "https://codeberg.org/mekeor/iosevka-theme") (:commit . "bef8c3ec7979937cfdde3054ce5fed2146bc3f87") (:revdesc . "bef8c3ec7979") (:keywords "faces" "theme") (:authors ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainers ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainer "Mekeor Melire" . "mekeor@posteo.de"))]) + (iota . [(20230918 1028) nil "Replace marker with increasing integers" tar ((:url . "https://git.sr.ht/~mango/iota.el") (:commit . "c065c087567f074bff639eb12fa53018654b8ce2") (:revdesc . "c065c087567f") (:keywords "abbrev" "data" "wp") (:authors ("Thomas Voss" . "mail@thomasvoss.com")) (:maintainers ("Thomas Voss" . "mail@thomasvoss.com")) (:maintainer "Thomas Voss" . "mail@thomasvoss.com"))]) + (ipcalc . [(20210903 958) ((cl-lib (0 5))) "IP subnet calculator" tar ((:url . "http://github.com/dotemacs/ipcalc.el") (:commit . "05fcb5bb8db3ba0c1f9e5f1bfcf0c183828a2426") (:revdesc . "05fcb5bb8db3") (:keywords "networking" "tools") (:authors ("Aleksandar Simic" . "asimic@gmail.com")) (:maintainers ("Aleksandar Simic" . "asimic@gmail.com")) (:maintainer "Aleksandar Simic" . "asimic@gmail.com"))]) + (ipe . [(20241229 54) ((emacs (24 4))) "Insert, Update and Delete PAIRs using overlays" tar ((:url . "https://github.com/BriansEmacs/insert-pair-edit.el") (:commit . "5701e598a0d115a4f0261c82320d180e6be3045e") (:revdesc . "5701e598a0d1") (:keywords "convenience" "tools") (:authors ("Brian Kavanagh" . "brians.emacs@gmail.com")) (:maintainers ("Brian Kavanagh" . "brians.emacs@gmail.com")) (:maintainer "Brian Kavanagh" . "brians.emacs@gmail.com"))]) + (iplayer . [(20240305 1633) nil "Browse and download BBC TV/radio shows" tar ((:url . "https://github.com/csrhodes/iplayer-el") (:commit . "62d3ca74e4f4d4f72f17e9075b06d0ba561ae5df") (:revdesc . "62d3ca74e4f4") (:keywords "multimedia" "bbc") (:authors ("Christophe Rhodes" . "csr21@cantab.net")) (:maintainers ("Christophe Rhodes" . "csr21@cantab.net")) (:maintainer "Christophe Rhodes" . "csr21@cantab.net"))]) + (ipp . [(20251124 718) ((plz (0 9)) (emacs (28 1))) "Implementation of the Internet Printing Protocol" tar ((:url . "https://github.com/emarsden/ipp-el") (:commit . "8210d8a276ff4dfb67e3a2b4594a67be095edd45") (:revdesc . "8210d8a276ff") (:keywords "printing" "hardware") (:authors ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainers ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainer "Eric Marsden" . "eric.marsden@risk-engineering.org"))]) + (ipretty . [(20180606 522) nil "Interactive Emacs Lisp pretty-printing" tar ((:url . "https://framagit.org/steckerhalter/ipretty") (:commit . "042f5cc4e6f81d59115e8335c582bb5c571c2585") (:revdesc . "042f5cc4e6f8") (:keywords "pretty-print" "elisp" "buffer"))]) + (ipython-shell-send . [(20190220 2246) ((emacs (24))) "Send code (including magics) to ipython shell" tar ((:url . "https://github.com/jackkamm/ipython-shell-send-el") (:commit . "0faed86faff02a361f23ce5fc923d0e9b09bb2da") (:revdesc . "0faed86faff0") (:keywords "tools" "processes") (:authors ("Jack Kamm" . "jackkamm@gmail.com")) (:maintainers ("Jack Kamm" . "jackkamm@gmail.com")) (:maintainer "Jack Kamm" . "jackkamm@gmail.com"))]) + (iqa . [(20201113 849) ((emacs (24 3))) "Init file(and directory) Quick Access" tar ((:url . "https://github.com/a13/iqa.el") (:commit . "eed962679783133e1ff6ae63d19efaeae4dadb6b") (:revdesc . "eed962679783"))]) + (ir-black-theme . [(20130303 755) nil "Port of ir-black theme" tar ((:url . "https://github.com/jmdeldin/ir-black-theme.el") (:commit . "ee6078bc67cbc15184e64e0f1fc8542d4079d55f") (:revdesc . "ee6078bc67cb") (:keywords "faces") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainers ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com"))]) + (iregister . [(20150515 2107) nil "Interactive register commands for Emacs" tar ((:url . "https://github.com/atykhonov/iregister.el") (:commit . "6a48c66187289de5f300492be11c83e98410c018") (:revdesc . "6a48c6618728") (:keywords "convenience") (:authors ("Andrey Tykhonov" . "atykhonov@gmail.com")) (:maintainers ("Andrey Tykhonov" . "atykhonov@gmail.com")) (:maintainer "Andrey Tykhonov" . "atykhonov@gmail.com"))]) + (irony . [(20231018 1915) ((cl-lib (0 5)) (json (1 2))) "C/C++ minor mode powered by libclang" tar ((:url . "https://github.com/Sarcasm/irony-mode") (:commit . "40e0ce19eb850bdf1f77225f11713cc816250d95") (:revdesc . "40e0ce19eb85") (:keywords "c" "convenience" "tools") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainers ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu"))]) + (irony-eldoc . [(20200622 2214) ((emacs (24)) (cl-lib (0 5)) (irony (0 1))) "Irony-mode support for eldoc-mode" tar ((:url . "https://github.com/ikirill/irony-eldoc") (:commit . "73e79a89fad982a2ba072f2fcc1b4e41f0aa2978") (:revdesc . "73e79a89fad9") (:keywords "c" "c++" "objc" "convenience" "tools") (:authors ("Kirill Ignatiev" . "github.com/ikirill")) (:maintainers ("Kirill Ignatiev" . "github.com/ikirill")) (:maintainer "Kirill Ignatiev" . "github.com/ikirill"))]) + (iscroll . [(20220612 310) ((emacs (26 0))) "Smooth scrolling over images" tar ((:url . "https://github.com/casouri/iscroll") (:commit . "76aa4e7e72f907e95715351819d9efb6336b8238") (:revdesc . "76aa4e7e72f9") (:keywords "convenience" "image") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainers ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com"))]) + (isearch-dabbrev . [(20141224 622) ((cl-lib (0 5))) "Use dabbrev in isearch" tar ((:url . "https://github.com/Dewdrops/isearch-dabbrev") (:commit . "1efe7abba4923015cbc2462395deaec5446a9cc8") (:revdesc . "1efe7abba492") (:keywords "dabbrev" "isearch") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainers ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com"))]) + (isearch-project . [(20250101 1008) ((emacs (27 1)) (f (0 20 0))) "Incremental search through the whole project" tar ((:url . "https://github.com/jcs-elpa/isearch-project") (:commit . "abd8ee560d1843f9ea01e1a823ddeafe9fbb0b21") (:revdesc . "abd8ee560d18") (:keywords "convenience" "search") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (isearch-symbol-at-point . [(20130728 2221) nil "Use isearch to search for the symbol at point" tar ((:url . "https://github.com/re5et/isearch-symbol-at-point") (:commit . "51a1029bec1ec414885f9edb7e5947603dffdab2") (:revdesc . "51a1029bec1e") (:keywords "isearch"))]) + (isend-mode . [(20210106 1506) nil "Interactively send parts of an Emacs buffer to an interpreter" tar ((:url . "https://github.com/ffevotte/isend-mode.el") (:commit . "ea855f63be7febc15bd08aec6229fab9407734fb") (:revdesc . "ea855f63be7f") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainers ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com"))]) + (isgd . [(20241230 1331) ((emacs (24 1))) "Shorten URLs using the isgd.com shortener service" tar ((:url . "https://github.com/chmouel/isgd.el") (:commit . "2dd030ab451cb9e704d173ee1b2388d92362db3b") (:revdesc . "2dd030ab451c") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainers ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com"))]) + (islisp-mode . [(20220924 1043) ((emacs (26 3))) "Major mode for ISLisp programming" tar ((:url . "https://gitlab.com/sasanidas/islisp-mode") (:commit . "bbf45d02495f9455e91beed01676178dfa5d3561") (:revdesc . "bbf45d02495f") (:keywords "islisp" "lisp" "programming") (:maintainers ("Fermin Munoz" . "fmfs@posteo.net")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net"))]) + (iso-639 . [(20251114 1512) ((emacs (27 1))) "ISO 639" tar ((:url . "https://codeberg.org/tomenzgg/emacs-iso-639") (:commit . "d55dbbea5291dd41de4ccd9662f6dfd610feacb5") (:revdesc . "d55dbbea5291") (:keywords "tools" "multilingual" "language" "iso-639") (:authors ("Jean Libète" . "tomenzgg@mail.mayfirst.org")) (:maintainers ("Jean Libète" . "tomenzgg@mail.mayfirst.org")) (:maintainer "Jean Libète" . "tomenzgg@mail.mayfirst.org"))]) + (isortify . [(20230821 1632) ((emacs (25)) (pythonic (0 1 0))) "(automatically) format python buffers using isort" tar ((:url . "https://github.com/proofit404/isortify") (:commit . "5ee404c5bee2772b4f3ee424df0a5b0aef7e6982") (:revdesc . "5ee404c5bee2") (:keywords "convenience" "isort") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com"))]) + (ispc-mode . [(20201215 852) nil "Syntax coloring for ispc programs" tar ((:url . "https://github.com/Munksgaard/ispc-mode") (:commit . "bedfff2528157d4bb0b75927c459631bebe2b1ce") (:revdesc . "bedfff252815") (:keywords "c" "ispc") (:authors ("Philip Munksgaard" . "philip@munksgaard.me")) (:maintainers ("Philip Munksgaard" . "philip@munksgaard.me")) (:maintainer "Philip Munksgaard" . "philip@munksgaard.me"))]) + (iss-mode . [(20141001 1913) nil "Mode for InnoSetup install scripts" tar ((:url . "https://github.com/rasmus-toftdahl-olesen/iss-mode") (:commit . "3b517aff31529bab33f8d7b562bd17aff0107fd1") (:revdesc . "3b517aff3152") (:authors (nil . "stefan@xsteve.at")) (:maintainers (nil . "stefan@xsteve.at")) (:maintainer nil . "stefan@xsteve.at"))]) + (itail . [(20171112 804) nil "An interactive tail mode" tar ((:url . "https://github.com/re5et/itail") (:commit . "6e43c20da03be3b9c6ece93b7dc3495975ec1888") (:revdesc . "6e43c20da03b") (:keywords "tail"))]) + (itasca . [(20170601 1622) ((emacs (24 3))) "Major modes for Itasca software data files" tar ((:url . "http://github.com/jkfurtney/itasca-emacs/") (:commit . "3d15dd1b70d6db69b0f4758a3e28b8b506cc84ca") (:revdesc . "3d15dd1b70d6") (:keywords "itasca" "flac" "3dec" "udec" "flac3d" "pfc" "pfc2d" "pfc3d" "fish") (:authors ("Jason Furtney" . "jkfurtney@gmail.com")) (:maintainers ("Jason Furtney" . "jkfurtney@gmail.com")) (:maintainer "Jason Furtney" . "jkfurtney@gmail.com"))]) + (iter2 . [(20250209 1516) ((emacs (25 1))) "Reimplementation of Elisp generators" tar ((:url . "https://github.com/doublep/iter2") (:commit . "632232b5ee627bf5d299db0b7714b3b687a0124c") (:revdesc . "632232b5ee62") (:keywords "elisp" "extensions") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com"))]) + (iterator . [(20250504 1720) ((emacs (24)) (cl-lib (0 5))) "A library to create and use elisp iterators objects" tar ((:url . "https://github.com/thierryvolpiatto/iterator") (:commit . "9cbe0d1153ce03d11c75f1d2b010091092b476ea") (:revdesc . "9cbe0d1153ce") (:authors ("Thierry Volpiatto" . "thierrydotvolpiattoatgmaildotcom")) (:maintainers ("Thierry Volpiatto" . "thierrydotvolpiattoatgmaildotcom")) (:maintainer "Thierry Volpiatto" . "thierrydotvolpiattoatgmaildotcom"))]) + (ivariants . [(20170823 224) ((emacs (24 3)) (ivs-edit (1 0))) "Ideographic variants editor and browser" tar ((:url . "http://github.com/kawabata/ivariants") (:commit . "ca0b74d32b5d2d77a45cc6ad6edc00be0ee85284") (:revdesc . "ca0b74d32b5d") (:keywords "i18n" "languages") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (ivs-edit . [(20170818 1441) ((emacs (24 3)) (dash (2 6 0)) (cl-lib (1 0))) "IVS (Ideographic Variation Sequence) editing tool" tar ((:url . "http://github.com/kawabata/ivs-edit") (:commit . "5db39c234aa7393b591168a4fd0a9a4cbbca347d") (:revdesc . "5db39c234aa7") (:keywords "text") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (ivy . [(20251123 1023) ((emacs (24 5))) "Incremental Vertical completYon" tar ((:url . "https://github.com/abo-abo/swiper") (:commit . "ec9421340c88ebe08f05680e22308ed57ed68a3d") (:revdesc . "ec9421340c88") (:keywords "matching") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net"))]) + (ivy-avy . [(20250329 1401) ((emacs (24 5)) (ivy (0 15 1)) (avy (0 5 0))) "Avy integration for Ivy" tar ((:url . "https://github.com/abo-abo/swiper") (:commit . "e33b028ed4b1258a211c87fd5fe801bed25de429") (:revdesc . "e33b028ed4b1") (:keywords "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net"))]) + (ivy-bibtex . [(20210927 1205) ((bibtex-completion (1 0 0)) (ivy (0 13 0)) (cl-lib (0 5))) "A bibliography manager based on Ivy" tar ((:url . "https://github.com/tmalsburg/helm-bibtex") (:commit . "bb47f355b0da8518aa3fb516019120c14c8747c9") (:revdesc . "bb47f355b0da") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de"))]) + (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 ((:url . "https://github.com/wpcarro/ivy-clipmenu.el") (:commit . "7c200cd4732821187084fad23547ee3f58365062") (:revdesc . "7c200cd47328") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainers ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com"))]) + (ivy-clojuredocs . [(20201129 2355) ((edn (1 1 2)) (ivy (0 12 0)) (emacs (24 4))) "Search for help in clojuredocs.org" tar ((:url . "https://github.com/wandersoncferreira/ivy-clojuredocs") (:commit . "8b6de19b3578c72d2b88f898e2290d94c04350f9") (:revdesc . "8b6de19b3578") (:keywords "matching") (:authors ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainers ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainer "Wanderson Ferreira" . "iagwanderson@gmail.com"))]) + (ivy-emms . [(20231112 1621) ((ivy (0 13 0)) (emms (0 0)) (emacs (24 4))) "Ivy interface to emms tracks" tar ((:url . "https://github.com/franburstall/ivy-emms") (:commit . "3b1bda7be64ba5555672b6375c205e0f7d831bc0") (:revdesc . "3b1bda7be64b") (:keywords "multimedia") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainers ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com"))]) + (ivy-emoji . [(20200316 2351) ((emacs (26 1)) (ivy (0 13 0))) "Insert emojis with ivy" tar ((:url . "https://github.com/sbozzolo/ivy-emoji.git") (:commit . "45894a1f8f8c67b142e1dd1113f47d703dea0b59") (:revdesc . "45894a1f8f8c") (:keywords "emoji" "ivy" "convenience") (:authors ("Gabriele Bozzola" . "sbozzolator@gmail.com")) (:maintainers ("Gabriele Bozzola" . "sbozzolator@gmail.com")) (:maintainer "Gabriele Bozzola" . "sbozzolator@gmail.com"))]) + (ivy-erlang-complete . [(20250210 1738) ((async (1 9)) (counsel (0 13 4)) (ivy (0 13 4)) (erlang (19 2)) (emacs (25 1))) "Erlang completion at point using ivy" tar ((:url . "https://github.com/s-kostyaev/ivy-erlang-complete") (:commit . "88bbfab802a58f157c1ff7886324eb4056b451c8") (:revdesc . "88bbfab802a5") (:keywords "languages" "tools") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainers ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru"))]) + (ivy-explorer . [(20190909 1921) ((emacs (25)) (ivy (0 10 0))) "Dynamic file browsing grid using ivy" tar ((:url . "https://github.com/clemera/ivy-explorer") (:commit . "a413966cfbcecacc082d99297fa1abde0c10d3f3") (:revdesc . "a413966cfbce") (:keywords "convenience" "files" "matching") (:authors ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainers ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Clemens Radermacher" . "clemera@posteo.net"))]) + (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 ((:url . "https://github.com/jcs-elpa/ivy-file-preview") (:commit . "c1ea280cffa52710fffb14b2285a9a9474d18fa5") (:revdesc . "c1ea280cffa5") (:keywords "convenience" "file" "ivy" "swiper" "preview" "select" "selection") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (ivy-fuz . [(20191222 946) ((emacs (25 1)) (fuz (1 3 0)) (ivy (0 13 0))) "Integration between fuz and ivy" tar ((:url . "https://github.com/Silex/ivy-fuz.el") (:commit . "f171ac73422a4bae1503d63d804e691482ed35b2") (:revdesc . "f171ac73422a") (:keywords "convenience") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com"))]) + (ivy-gitlab . [(20181228 826) ((s (1 9 0)) (dash (2 9 0)) (ivy (0 8 0)) (gitlab (0 8))) "Ivy interface to Gitlab" tar ((:url . "https://github.com/nlamirault/emacs-gitlab") (:commit . "8c2324c02119500f094c2f92dfaba4c9977ce1ba") (:revdesc . "8c2324c02119") (:keywords "gitlab" "ivy") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (ivy-historian . [(20210714 56) ((emacs (24 4)) (historian (20170111)) (ivy (0 8 0)) (flx (0 6 1))) "Persistently store selected minibuffer candidates" tar ((:url . "https://github.com/PythonNut/historian.el") (:commit . "852cb4e72c0f78c8dbb2c972bdcb4e7b0108ff4c") (:revdesc . "852cb4e72c0f") (:keywords "convenience" "ivy") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com"))]) + (ivy-hoogle . [(20240102 908) ((emacs (28 1)) (async (1 9)) (ivy (0 13 2))) "Search Hoogle using ivy" tar ((:url . "https://github.com/aartamonau/ivy-hoogle") (:commit . "4b080018175b5770fd3571265bc846a4a845cdca") (:revdesc . "4b080018175b") (:keywords "matching" "haskell" "hoogle") (:authors ("Aliaksei Artamonau" . "aliaksiej.artamonau@gmail.com")) (:maintainers ("Aliaksei Artamonau" . "aliaksiej.artamonau@gmail.com")) (:maintainer "Aliaksei Artamonau" . "aliaksiej.artamonau@gmail.com"))]) + (ivy-hydra . [(20250329 1401) ((emacs (24 5)) (ivy (0 15 1)) (hydra (0 14 0))) "Additional key bindings for Ivy" tar ((:url . "https://github.com/abo-abo/swiper") (:commit . "e33b028ed4b1258a211c87fd5fe801bed25de429") (:revdesc . "e33b028ed4b1") (:keywords "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net"))]) + (ivy-lobsters . [(20200818 1406) ((ivy (0 8 0)) (cl-lib (0 5))) "Browse lobste.rs stories with ivy" tar ((:url . "https://github.com/julienXX/ivy-lobsters") (:commit . "3f7f90751d15ebcf91253ef3cda18c0aa7d856ff") (:revdesc . "3f7f90751d15") (:authors ("Julien Blanchard" . "https://github.com/julienXX")) (:maintainers ("Julien Blanchard" . "https://github.com/julienXX")) (:maintainer "Julien Blanchard" . "https://github.com/julienXX"))]) + (ivy-migemo . [(20230121 1934) ((emacs (24 3)) (ivy (0 13 0)) (migemo (1 9 2)) (nadvice (0 3))) "Use migemo on ivy" tar ((:url . "https://github.com/ROCKTAKEY/ivy-migemo") (:commit . "6022b24e72f073a7b5599f2dea611da3a1282378") (:revdesc . "6022b24e72f0") (:keywords "matching") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (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 ((:url . "https://gitlab.petton.fr/mpdel/ivy-mpdel") (:commit . "a42dcc943914c71975c115195d38c739f25e475c") (:revdesc . "a42dcc943914") (:keywords "multimedia") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (ivy-omni-org . [(20200810 1050) ((emacs (25 1)) (ivy (0 13)) (dash (2 12))) "Browse anything in Org mode" tar ((:url . "https://github.com/akirak/ivy-omni-org") (:commit . "b6a27379bc40fd6530a84afc50b3f41cd488e0c9") (:revdesc . "b6a27379bc40") (:keywords "outlines") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (ivy-pass . [(20170812 1955) ((emacs (24)) (ivy (0 8 0)) (password-store (1 6 5))) "Ivy interface for pass" tar ((:url . "https://github.com/ecraven/ivy-pass/") (:commit . "5b523de1151f2109fdd6a8114d0af12eef83d3c5") (:revdesc . "5b523de1151f") (:keywords "pass" "password" "convenience" "data"))]) + (ivy-posframe . [(20241023 258) ((emacs (26 0)) (posframe (1 0 0)) (ivy (0 13 0))) "Using posframe to show Ivy" tar ((:url . "https://github.com/tumashu/ivy-posframe") (:commit . "660c773f559ac37f29ccf626af0103817c8d5e30") (:revdesc . "660c773f559a") (:keywords "abbrev" "convenience" "matching" "ivy") (:authors ("Feng Shu" . "tumashu@163.com") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (ivy-prescient . [(20250816 19) ((emacs (25 1)) (prescient (6 1 0)) (ivy (0 11 0))) "Prescient.el + Ivy" tar ((:url . "https://github.com/raxod502/prescient.el") (:commit . "87e2d2f2ddf24f591a5f70cc90d2afb4537caa18") (:revdesc . "87e2d2f2ddf2") (:keywords "extensions") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes"))]) + (ivy-purpose . [(20160724 1003) ((emacs (24)) (ivy (0 8)) (window-purpose (1 5))) "Ivy Interface for Purpose" tar ((:url . "https://github.com/bmag/ivy-purpose") (:commit . "0495f2f3aed64d7e0028125e76a9a68f8fc4107e") (:revdesc . "0495f2f3aed6"))]) + (ivy-rich . [(20230425 1422) ((emacs (25 1)) (ivy (0 13 0))) "More friendly display transformer for ivy" tar ((:url . "https://github.com/Yevgnen/ivy-rich") (:commit . "aff9b6bd53e0fdcf350ab83c90e64e651b47dba4") (:revdesc . "aff9b6bd53e0") (:keywords "convenience" "ivy") (:authors ("Yevgnen Koh" . "wherejoystarts@gmail.com")) (:maintainers ("Yevgnen Koh" . "wherejoystarts@gmail.com")) (:maintainer "Yevgnen Koh" . "wherejoystarts@gmail.com"))]) + (ivy-rtags . [(20250801 1647) ((ivy (0 7 0)) (rtags (2 10))) "RTags completion back-end for ivy" tar ((:url . "https://github.com/Andersbakken/rtags") (:commit . "dd6b20f7e57a30f32a8ccbb6c22038383dba746b") (:revdesc . "dd6b20f7e57a") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainers ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com"))]) + (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 ((:url . "https://github.com/jcs-elpa/ivy-searcher") (:commit . "1b6f6aed1b371c45b5d8be8aaf6d6e89eba5e0f1") (:revdesc . "1b6f6aed1b37") (:keywords "convenience" "ivy" "interface" "searcher" "search" "replace" "grep" "ag" "rg") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (ivy-spotify . [(20210329 312) ((emacs (26 1)) (espotify (0 1)) (ivy (0 13 1))) "Search spotify with ivy" tar ((:url . "https://codeberg.org/jao/espotify") (:commit . "eefcb49d740570f6c874302d87be33e5b0ec54ff") (:revdesc . "eefcb49d7405") (:keywords "multimedia") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")))]) + (ivy-todo . [(20200323 2005) ((ivy (0 8 0)) (emacs (25))) "Manage org-mode TODOs with ivy" tar ((:url . "https://github.com/Kungsgeten/ivy-todo") (:commit . "d74501cd334b7d709659946c5e02b21cfd5507de") (:revdesc . "d74501cd334b") (:keywords "convenience") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainers ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com"))]) + (ivy-xcdoc . [(20160917 1055) ((ivy (0 8 0)) (emacs (24 4))) "Search Xcode documents with ivy interface" tar ((:url . "https://github.com/hex2010/emacs-ivy-xcdoc") (:commit . "fbf264b0746182567b17fd7409fff8eed3658c71") (:revdesc . "fbf264b07461") (:keywords "ivy" "xcode" "xcdoc") (:authors ("C.T.Chen" . "chenct@7adybird.com")) (:maintainers ("C.T.Chen" . "chenct@7adybird.com")) (:maintainer "C.T.Chen" . "chenct@7adybird.com"))]) + (ivy-xref . [(20211008 1103) ((emacs (25 1)) (ivy (0 10 0))) "Ivy interface for xref results" tar ((:url . "https://github.com/alexmurray/ivy-xref") (:commit . "a82e8e117d2dd62c28b6a3e3d6e4cfb11c0bda38") (:revdesc . "a82e8e117d2d") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (ivy-yasnippet . [(20200704 700) ((emacs (24 1)) (cl-lib (0 6)) (ivy (0 10 0)) (yasnippet (0 12 2)) (dash (2 14 1))) "Preview yasnippets with ivy" tar ((:url . "https://github.com/mkcms/ivy-yasnippet") (:commit . "83402d91b4eba5307f71884a72df8e11cc6a994e") (:revdesc . "83402d91b4eb") (:keywords "convenience") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com"))]) + (ivy-ycmd . [(20180909 1225) ((ycmd (1 3)) (emacs (24)) (ivy (0 10 0)) (dash (2 14 1))) "Ivy interface to ycmd" tar ((:url . "https://github.com/abingham/emacs-ivy-ycmd") (:commit . "25bfee8f676e4ecbb645e4f30b47083410a00c58") (:revdesc . "25bfee8f676e") (:keywords "tools") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (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 ((:url . "https://github.com/squiter/ivy-youtube") (:commit . "e7a7cc860e967500857e5fd85d8e397c6d752ee1") (:revdesc . "e7a7cc860e96") (:keywords "youtube" "multimedia" "mpv" "vlc"))]) + (iwd-manager . [(20251221 1835) ((emacs (26 1)) (promise (1 1))) "Manage IWD via the D-Bus interface" tar ((:url . "https://github.com/sarg/wpa-manager.el") (:commit . "ec2b209e408eef08d19fa135253aa22a0317815a") (:revdesc . "ec2b209e408e") (:authors ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainers ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainer "Sergey Trofimov" . "sarg@sarg.org.ru"))]) + (ix . [(20131027 1657) ((grapnel (0 5 3))) "Emacs client for http://ix.io pastebin" tar ((:url . "http://www.github.com/theanalyst/ix.el") (:commit . "498dac674f4f1910d39087b1457c5da5465a0614") (:revdesc . "498dac674f4f") (:authors ("Abhishek L" . "abhishekl.2006@gmail.com")) (:maintainers ("Abhishek L" . "abhishekl.2006@gmail.com")) (:maintainer "Abhishek L" . "abhishekl.2006@gmail.com"))]) + (j-mode . [(20251003 805) nil "Major mode for editing J programs" tar ((:url . "http://github.com/zellio/j-mode") (:commit . "1365e5a3fe772609685b3787bbd2960331c1a02f") (:revdesc . "1365e5a3fe77") (:keywords "j" "languages"))]) + (jabber . [(20250310 305) ((emacs (27 1)) (fsm (0 2 0)) (srv (0 2))) "A minimal Jabber client" tar ((:url . "https://codeberg.org/emacs-jabber/emacs-jabber") (:commit . "30c023b6b54601594d347956cc2918e7841e5ed4") (:revdesc . "30c023b6b546") (:keywords "comm") (:authors ("Magnus Henoch" . "mange@freemail.hu")) (:maintainers ("wgreenhouse" . "wgreenhouse@tilde.club")) (:maintainer "wgreenhouse" . "wgreenhouse@tilde.club"))]) + (jack . [(20221122 632) ((emacs (28 1))) "HTML generator library" tar ((:url . "https://github.com/tonyaldon/jack") (:commit . "3b4ea97fcc107d0ffd201ea695129af52f390113") (:revdesc . "3b4ea97fcc10") (:keywords "lisp" "html") (:authors ("Tony Aldon" . "tony.aldon.adm@gmail.com")) (:maintainers ("Tony Aldon" . "tony.aldon.adm@gmail.com")) (:maintainer "Tony Aldon" . "tony.aldon.adm@gmail.com"))]) + (jack-connect . [(20220201 1417) nil "Manage jack connections within Emacs" tar ((:commit . "1acaebfe8f37f0194e95c3e812c9515a6f688eee") (:revdesc . "1acaebfe8f37") (: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 ((:url . "https://github.com/nverno/jack-ts-mode") (:commit . "f57f211d96608a90142619a925caeb8808e7c632") (:revdesc . "f57f211d9660") (:keywords "tree-sitter" "languages" "jack" "nand2tetris") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (jade-mode . [(20210908 2121) nil "Major mode for editing .jade files" tar ((:url . "https://github.com/brianc/jade-mode") (:commit . "111460b056838854e470a6383041a99f843b93ee") (:revdesc . "111460b05683") (:keywords "languages"))]) + (jami-bot . [(20240203 1017) ((emacs (27 1))) "An extendable chat bot for the private messenger GNU Jami" tar ((:url . "https://gitlab.com/hperrey/jami-bot") (:commit . "c2ad37e2ada14b5551a83211cc4692b39be4e5fb") (:revdesc . "c2ad37e2ada1") (:keywords "comm" "jami" "messenger" "chat bot" "dbus") (:authors ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainers ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainer "Hanno Perrey" . "hanno@hoowl.se"))]) + (jammer . [(20210508 1633) ((emacs (24 1))) "Punish yourself for using Emacs inefficiently" tar ((:url . "https://depp.brause.cc/jammer") (:commit . "a780e4c2adb2e85a4daadcefd1a2b189d761872f") (:revdesc . "a780e4c2adb2") (:keywords "games") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (janet-mode . [(20210924 44) ((emacs (24 3))) "Defines a major mode for Janet" tar ((:url . "https://github.com/ALSchwalm/janet-mode") (:commit . "9e3254a0249d720d5fa5603f1f8c3ed0612695af") (:revdesc . "9e3254a0249d") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainers ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com"))]) + (japanese-holidays . [(20201229 755) ((emacs (24 1)) (cl-lib (0 3))) "Calendar functions for the Japanese calendar" tar ((:url . "https://github.com/emacs-jp/japanese-holidays") (:commit . "324b6bf2f55ec050bef49e001caedaabaf4fa35d") (:revdesc . "324b6bf2f55e") (:keywords "calendar") (:authors ("Takashi Hattori" . "hattori@sfc.keio.ac.jp") ("Hiroya Murata" . "lapis-lazuli@pop06.odn.ne.jp")) (:maintainers ("Takashi Hattori" . "hattori@sfc.keio.ac.jp") ("Hiroya Murata" . "lapis-lazuli@pop06.odn.ne.jp")) (:maintainer "Takashi Hattori" . "hattori@sfc.keio.ac.jp"))]) + (jape-mode . [(20140903 1506) nil "An Emacs editing mode mode for GATE's JAPE files" tar ((:url . "http://github.com/tanzoniteblack/jape-mode") (:commit . "27dbebc4de93eb887038fda7a11671349efe8dbb") (:revdesc . "27dbebc4de93") (:keywords "languages" "jape" "gate"))]) + (jar-manifest-mode . [(20160501 26) nil "Major mode to edit JAR manifest files" tar ((:url . "http://github.com/omajid/jar-manifest-mode") (:commit . "270dae14c481300f75ed96dad3a5ae42ca928a1d") (:revdesc . "270dae14c481") (:keywords "convenience" "languages") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainers ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com"))]) + (jasminejs-mode . [(20150527 5) nil "A minor mode for manipulating jasmine test files" tar ((:url . "https://github.com/stoltene2/jasminejs-mode") (:commit . "23637d6718423d376eebbdaa4d6d914c7cab26ed") (:revdesc . "23637d671842") (:keywords "javascript" "jasmine") (:authors ("Eric Stolten" . "stoltene2@gmail.com")) (:maintainers ("Eric Stolten" . "stoltene2@gmail.com")) (:maintainer "Eric Stolten" . "stoltene2@gmail.com"))]) + (jastadd-ast-mode . [(20200926 1820) ((emacs (25))) "Major mode for editing JastAdd AST files" tar ((:url . "https://github.com/rudi/jastadd-ast-mode") (:commit . "a98a5eef274d8eedabc7467874edf4338c9a012e") (:revdesc . "a98a5eef274d") (:keywords "languages") (:authors ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainers ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at"))]) + (java-imports . [(20230713 2247) ((emacs (24 4)) (s (1 10 0)) (pcache (0 5 1))) "Code for dealing with Java imports" tar ((:url . "http://www.github.com/dakrone/emacs-java-imports") (:commit . "1489813795ecd061896e265720709040bd90d96f") (:revdesc . "1489813795ec") (:keywords "java" "kotlin") (:authors ("Lee Hinman" . "lee@writequit.org")) (:maintainers ("Lee Hinman" . "lee@writequit.org")) (:maintainer "Lee Hinman" . "lee@writequit.org"))]) + (java-snippets . [(20160627 252) ((yasnippet (0 8 0))) "Yasnippets for Java" tar ((:url . "https://github.com/nekop/yasnippet-java-mode") (:commit . "738523debb1018439bda0ce70e00248154a600ac") (:revdesc . "738523debb10"))]) + (javadoc-lookup . [(20160214 31) ((cl-lib (0 3))) "Javadoc Emacs integration with Maven" tar ((:url . "https://github.com/skeeto/javadoc-lookup") (:commit . "507a2dd443d60b537b8f779c1847e2cd0ccd1382") (:revdesc . "507a2dd443d6") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (javap-mode . [(20120223 2208) nil "Javap major mode" tar ((:url . "http://github.com/hiredman/javap-mode") (:commit . "864c1130e204b2072e1d19cd027b6fce8ebe6629") (:revdesc . "864c1130e204"))]) + (jaword . [(20210306 420) ((tinysegmenter (0 1)) (emacs (25 1))) "Minor-mode for handling Japanese words better" tar ((:url . "http://zk-phi.github.io/") (:commit . "783544a265f91b2e568b52311afb36e3691d5ad3") (:revdesc . "783544a265f9"))]) + (jazz-theme . [(20230814 1916) nil "A warm color theme for Emacs 24+" tar ((:url . "https://github.com/donderom/jazz-theme") (:commit . "b936b392e3ea3b6968530e3d5e5fccb9c454b5f8") (:revdesc . "b936b392e3ea") (:authors ("Roman Parykin" . "donderom@ymail.com")) (:maintainers ("Roman Parykin" . "donderom@ymail.com")) (:maintainer "Roman Parykin" . "donderom@ymail.com"))]) + (jbeam-mode . [(20251123 2213) ((emacs (24 4))) "Major mode for JBeam files" tar ((:url . "https://github.com/webdevred/jbeam-mode") (:commit . "7c16b603cb8e342533d20069603373a63a3ca7ca") (:revdesc . "7c16b603cb8e") (:keywords "languages"))]) + (jbeans-theme . [(20200924 1946) ((emacs (24))) "Jbeans theme for GNU Emacs 24 (deftheme)" tar ((:url . "https://github.com/synic/jbeans-emacs") (:commit . "a63916a928324c42bfbe3016972c2ecff598b1ae") (:revdesc . "a63916a92832") (:authors ("Adam Olsen" . "arolsen@gmail.com")) (:maintainers ("Adam Olsen" . "arolsen@gmail.com")) (:maintainer "Adam Olsen" . "arolsen@gmail.com"))]) + (jdecomp . [(20170224 2200) ((emacs (24 5))) "Interface to Java decompilers" tar ((:url . "https://github.com/xiongtx/jdecomp") (:commit . "692866abc83deedce62be8d6040cf24dda7fb7a8") (:revdesc . "692866abc83d") (:keywords "decompile" "java" "languages" "tools") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainers ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com"))]) + (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 ((:url . "http://github.com/jdee-emacs/jdee") (:commit . "b510a29f1fc1bea218a6230fb219922775687c78") (:revdesc . "b510a29f1fc1") (:keywords "java" "tools") (:authors ("Paul Kinnucan" . "pkinnucan@attbi.com")))]) + (jedi . [(20250602 2107) ((emacs (24)) (jedi-core (0 2 2)) (auto-complete (1 4))) "A Python auto-completion for Emacs" tar ((:url . "https://github.com/tkf/emacs-jedi") (:commit . "0a92f57dcfd76f1daf6d382d1e2eb437784a71e0") (:revdesc . "0a92f57dcfd7") (:authors ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainers ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com"))]) + (jedi-core . [(20250602 2109) ((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 ((:url . "https://github.com/tkf/emacs-jedi") (:commit . "94a031d54c55d22aa36ad557f45c972cb3f5833b") (:revdesc . "94a031d54c55") (:authors ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainers ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com"))]) + (jedi-direx . [(20140310 936) ((jedi (0 1 2)) (direx (0 1 -3))) "Tree style source code viewer for Python buffer" tar ((:url . "https://github.com/tkf/emacs-jedi-direx") (:commit . "7a2e677400717ed12b959cb5988e7b3fb1c12117") (:revdesc . "7a2e67740071") (:authors ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainers ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com"))]) + (jeison . [(20190721 1651) ((emacs (25 1)) (dash (2 16 0))) "A library for declarative JSON parsing" tar ((:url . "http://github.com/SavchenkoValeriy/jeison") (:commit . "775b45657728c91f24f7508dfbc4d81a92b8e053") (:revdesc . "775b45657728") (:keywords "lisp" "json" "data-types"))]) + (jekyll-modes . [(20141117 1314) ((polymode (0 2))) "Major modes (markdown and HTML) for authoring Jekyll content" tar ((:url . "https://github.com/fred-o/jekyll-modes") (:commit . "7cb10b50fd2883e3f7b10fdfd98f19f2f0b2381c") (:revdesc . "7cb10b50fd28") (:keywords "docs") (:authors ("Fredrik Appelberg" . "fredrik@milgrim.local")) (:maintainers ("Fredrik Appelberg" . "fredrik@milgrim.local")) (:maintainer "Fredrik Appelberg" . "fredrik@milgrim.local"))]) + (jemdoc-mode . [(20170704 2027) ((emacs (24 3))) "Major mode for editing jemdoc files" tar ((:url . "https://github.com/drdv/jemdoc-mode") (:commit . "529b4d4681e1198b9892f340fdd6c3f1592a047a") (:revdesc . "529b4d4681e1") (:keywords "convenience" "usability") (:authors ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainers ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainer "Dimitar Dimitrov" . "mail.mitko@gmail.com"))]) + (jenkins . [(20251022 2050) ((dash (2 12)) (emacs (24 3)) (json (1 4))) "Minimalistic Jenkins client for Emacs" tar ((:url . "https://github.com/rmuslimov/jenkins.el") (:commit . "10197d13b491811d4e066003dfc83fedeb21dd90") (:revdesc . "10197d13b491") (:keywords "jenkins" "convenience") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainers ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com"))]) + (jenkins-watch . [(20121004 2326) nil "Watch continuous integration build status" tar ((:url . "https://github.com/ataylor284/jenkins-watch") (:commit . "37b84dfbd98240a57ff798e1ff8bc7dba2913577") (:revdesc . "37b84dfbd982") (:authors ("Andrew Taylor" . "ataylor@redtoad.ca")) (:maintainers ("Andrew Taylor" . "ataylor@redtoad.ca")) (:maintainer "Andrew Taylor" . "ataylor@redtoad.ca"))]) + (jenkinsfile-mode . [(20230525 2006) ((emacs (24)) (groovy-mode (2 0))) "Major mode for editing Jenkins declarative pipeline syntax" tar ((:url . "https://github.com/john2x/jenkinsfile-mode") (:commit . "568865ee419e0592de0dd0717d6769a66d9df111") (:revdesc . "568865ee419e"))]) + (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 ((:url . "https://github.com/emiller88/emacs-jest/") (:commit . "c8145635c54bd7df9711000e889753d267afcdc4") (:revdesc . "c8145635c54b") (:keywords "jest" "javascript" "testing") (:authors ("Edmund Miller" . "edmund.a.miller@gmail.com")) (:maintainers ("Edmund Miller" . "edmund.a.miller@gmail.com")) (:maintainer "Edmund Miller" . "edmund.a.miller@gmail.com"))]) + (jest-test-mode . [(20231209 1754) ((emacs (25 1))) "Minor mode for running Node.js tests using jest" tar ((:url . "https://github.com/rymndhng/jest-test-mode.el") (:commit . "a397507d8bb41e4aa6b97994f1d7512e78d3dee3") (:revdesc . "a397507d8bb4") (:authors ("Raymond Huang" . "rymndhng@gmail.com")) (:maintainers ("Raymond Huang" . "rymndhng@gmail.com")) (:maintainer "Raymond Huang" . "rymndhng@gmail.com"))]) + (jet . [(20240730 1228) ((emacs (27 1)) (transient (0 3 7))) "Emacs integration for jet Clojure tool" tar ((:url . "https://github.com/ericdallo/jet.el") (:commit . "67ded216a0a6af0bb8d6874a7faea538912c0345") (:revdesc . "67ded216a0a6") (:keywords "tools") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainers ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com"))]) + (jetbrains . [(20180301 502) ((emacs (24 3)) (cl-lib (0 5)) (f (0 17))) "JetBrains IDE bridge" tar ((:url . "https://github.com/emacs-php/jetbrains.el") (:commit . "56f71a17d455581c10d48f6dbb31d9e2126227bf") (:revdesc . "56f71a17d455") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (jetbrains-darcula-theme . [(20230223 1901) nil "A complete port of the default JetBrains Darcula theme" tar ((:url . "https://github.com/ianpan870102/jetbrains-darcula-emacs-theme") (:commit . "46f153385e50998826ca13e18056c6a972768cfd") (:revdesc . "46f153385e50"))]) + (jg-quicknav . [(20170809 130) ((s (1 9 0)) (cl-lib (0 5))) "Quickly navigate the file system to find a file" tar ((:url . "https://github.com/jeffgran/jg-quicknav") (:commit . "c8d53e774d63e68a944092c08a026b57da741038") (:revdesc . "c8d53e774d63") (:keywords "navigation") (:authors ("Jeff Gran" . "jeff@jeffgran.com")) (:maintainers ("Jeff Gran" . "jeff@jeffgran.com")) (:maintainer "Jeff Gran" . "jeff@jeffgran.com"))]) + (jinja2-mode . [(20220117 807) nil "A major mode for jinja2" tar ((:url . "https://github.com/paradoxxxzero/jinja2-mode") (:commit . "03e5430a7efe1d163a16beaf3c82c5fd2c2caee1") (:revdesc . "03e5430a7efe"))]) + (jinx . [(20251224 1108) ((emacs (29 1)) (compat (30))) "Enchanted Spell Checker" tar ((:url . "https://github.com/minad/jinx") (:commit . "46aec1bdaad149ddfcc34217d05e69b1b718c4c4") (:revdesc . "46aec1bdaad1") (:keywords "convenience" "text") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (jira . [(20251208 1845) ((emacs (29 1)) (request (0 3 0)) (tablist (1 0)) (transient (0 8 3)) (magit-section (4 2 0))) "Emacs Interface to Jira" tar ((:url . "https://github.com/unmonoqueteclea/jira.el") (:commit . "3b4b5260d6e6c14fe1fc2bcffe64f3a9b9f30245") (:revdesc . "3b4b5260d6e6") (:authors ("Pablo González Carrizo" . "unmonoqueteclea@gmail.com")) (:maintainers ("Pablo González Carrizo" . "unmonoqueteclea@gmail.com")) (:maintainer "Pablo González Carrizo" . "unmonoqueteclea@gmail.com"))]) + (jira-markup-mode . [(20150601 2109) nil "Emacs Major mode for JIRA-markup-formatted text files" tar ((:url . "https://github.com/mnuessler/jira-markup-mode") (:commit . "53bf083fdbece483f1351f32085b424b38c4c1f2") (:revdesc . "53bf083fdbec") (:keywords "jira" "markup") (:authors ("Matthias Nuessler" . "m.nuessler@web.de")) (:maintainers ("Matthias Nuessler" . "m.nuessler@web.de")) (:maintainer "Matthias Nuessler" . "m.nuessler@web.de"))]) + (jiralib2 . [(20200520 2031) ((emacs (25)) (request (0 3)) (dash (2 14 1))) "JIRA REST API bindings to Elisp" tar ((:url . "https://github.com/nyyManni/jiralib2") (:commit . "c21c4e759eff549dbda11099f2f680b78d7f5a01") (:revdesc . "c21c4e759eff") (:keywords "comm" "jira" "rest" "api") (:authors ("Henrik Nyman" . "h@nyymanni.com")) (:maintainers ("Henrik Nyman" . "h@nyymanni.com")) (:maintainer "Henrik Nyman" . "h@nyymanni.com"))]) + (jirascope . [(20240122 2130) ((emacs (25 1))) "A Jira client" tar ((:url . "https://github.com/Duckonaut/jirascope") (:commit . "61acd8d6adbd6b25ebcc5436b4dce6d5c6d2981c") (:revdesc . "61acd8d6adbd") (:keywords "tools") (:authors ("Stanisław Zagórowski" . "duckonaut@gmail.com")) (:maintainers ("Stanisław Zagórowski" . "duckonaut@gmail.com")) (:maintainer "Stanisław Zagórowski" . "duckonaut@gmail.com"))]) + (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 ((:url . "https://github.com/emacs-pe/jist.el") (:commit . "ec4b27eb4051f0084cb3b1e4f19fab9e2db77665") (:revdesc . "ec4b27eb4051") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (jit-lock-stealth-progress . [(20240616 2345) ((emacs (29 1))) "JIT lock stealth mode-line progress" tar ((:url . "https://codeberg.org/ideasman42/emacs-jit-lock-stealth-progress") (:commit . "caf256543cfe5404333f5cf914a478d14b2ec102") (:revdesc . "caf256543cfe") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (jjdescription . [(20251011 159) ((emacs (25 1))) "Major mode for editing Jujutsu description files" tar ((:url . "https://github.com/necaris/jjdescription.el") (:commit . "cd2478f0e2f92cb823110caba22fe0eaafeed07e") (:revdesc . "cd2478f0e2f9") (:authors ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainers ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainer "Rami Chowdhury" . "rami.chowdhury@gmail.com"))]) + (jknav . [(20121006 2025) nil "Automatically enable j/k keys for line-based navigation" tar ((:url . "https://github.com/aculich/jknav.el") (:commit . "861245715c728503dad6573278fdd75c271dbf8b") (:revdesc . "861245715c72") (:keywords "keyboard" "navigation") (:authors ("Aaron Culich" . "aculich@gmail.com")) (:maintainers ("Aaron Culich" . "aculich@gmail.com")) (:maintainer "Aaron Culich" . "aculich@gmail.com"))]) + (jmespath . [(20240115 1310) ((emacs (24 3))) "Query JSON using jmespath" tar ((:url . "https://github.com/unresolvedcold/jmespath") (:commit . "d3a4a4abdd6804d3aef5e0d0c538abd27667b4c3") (:revdesc . "d3a4a4abdd68") (:keywords "json" "data" "languages" "tools") (:authors ("Shubham Kumar" . "unresolved.shubham@gmail.com")) (:maintainers ("Shubham Kumar" . "unresolved.shubham@gmail.com")) (:maintainer "Shubham Kumar" . "unresolved.shubham@gmail.com"))]) + (jmt-mode . [(20240617 1034) ((emacs (27 1))) "JMT Mode" tar ((:url . "http://reluk.ca/project/Java/Emacs/") (:commit . "278db38c30bd556793c9ce0c939045e95dbb6f32") (:revdesc . "278db38c30bd") (:keywords "languages" "c") (:authors ("Michael Allan" . "mike@reluk.ca")) (:maintainers ("Michael Allan" . "mike@reluk.ca")) (:maintainer "Michael Allan" . "mike@reluk.ca"))]) + (jonprl-mode . [(20160819 59) ((emacs (24 3)) (cl-lib (0 5)) (yasnippet (0 8 0))) "A major mode for editing JonPRL files" tar ((:url . "https://github.com/david-christiansen/jonprl-mode") (:commit . "6059bb64891fae45827174e044d6a87ac07172d8") (:revdesc . "6059bb64891f") (:keywords "languages") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))]) + (journalctl-mode . [(20250922 1323) ((emacs (27 1))) "Sample major mode for viewing output journalctl" tar ((:url . "https://github.com/SebastianMeisel/journalctl-mode") (:commit . "c5a6127ad831fa95a8e3b3fa207a011435ae887b") (:revdesc . "c5a6127ad831") (:keywords "unix") (:authors ("Sebastian Meisel" . "sebastian.meisel@gmail.com")) (:maintainers ("Sebastian Meisel" . "sebastian.meisel@gmail.com")) (:maintainer "Sebastian Meisel" . "sebastian.meisel@gmail.com"))]) + (jpop . [(20170410 1250) ((emacs (24)) (dash (2 11 0)) (cl-lib (0 5))) "Lightweight project caching and navigation framework" tar ((:url . "https://github.com/domtronn/jpop.el") (:commit . "7628b03260be96576b34459d45959ee77d8b2110") (:revdesc . "7628b03260be") (:keywords "project" "convenience") (:authors ("Dom Charlesworth" . "dgc336@gmail.com")) (:maintainers ("Dom Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dom Charlesworth" . "dgc336@gmail.com"))]) + (jq-format . [(20190428 1434) ((emacs (24)) (reformatter (0 3))) "Reformat JSON and JSONLines using jq" tar ((:url . "https://github.com/wbolster/emacs-jq-format") (:commit . "47e1c5adb89b37b4d53fe01302d8c675913c20e7") (:revdesc . "47e1c5adb89b") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (jq-mode . [(20250929 1127) ((emacs (25 1))) "Edit jq scripts" tar ((:url . "https://github.com/ljos/jq-mode") (:commit . "39acc77a63555b8556b8163be3d9b142d173c795") (:revdesc . "39acc77a6355") (:authors ("Bjarte Johansen" . "BjartedotJohansenatgmaildotcom")) (:maintainers ("Bjarte Johansen" . "BjartedotJohansenatgmaildotcom")) (:maintainer "Bjarte Johansen" . "BjartedotJohansenatgmaildotcom"))]) + (jq-ts-mode . [(20250223 1411) ((emacs (29 1))) "Tree-sitter support for jq buffers" tar ((:url . "https://github.com/nverno/jq-ts-mode") (:commit . "3ac689c3c38be9117076de0bcc15510e369016c9") (:revdesc . "3ac689c3c38b") (:keywords "jq" "languages" "tree-sitter") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (jquery-doc . [(20150812 758) nil "JQuery api documentation interface for emacs" tar ((:url . "https://github.com/ananthakumaran/jquery-doc.el") (:commit . "24032284919b942ec27707d929bdd8bf48420062") (:revdesc . "24032284919b") (:keywords "docs" "jquery") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com"))]) + (js-auto-beautify . [(20161031 509) ((web-beautify (0 3 1)) (web-mode (14 0 27))) "Auto format you js/jsx file" tar ((:url . "https://github.com/Qquanwei/auto-beautify.el") (:commit . "6bc9fef474197ca1722cb1e9051b270f80cdd7cc") (:revdesc . "6bc9fef47419") (: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 ((:url . "https://github.com/ybiquitous/js-auto-format-mode") (:commit . "29d245b4d126a5fc5153a4d8f17396be4165b4a6") (:revdesc . "29d245b4d126") (:keywords "languages") (:authors ("Masafumi Koba" . "ybiquitous@gmail.com")) (:maintainers ("Masafumi Koba" . "ybiquitous@gmail.com")) (:maintainer "Masafumi Koba" . "ybiquitous@gmail.com"))]) + (js-codemod . [(20190921 941) ((emacs (24 4))) "Run js-codemod on current sentence or selected region" tar ((:url . "https://github.com/torgeir/js-codemod.el") (:commit . "056bdf3e5e0c807b8cf17edb5834179a90fb722b") (:revdesc . "056bdf3e5e0c") (:keywords "js" "codemod" "region") (:authors ("Torgeir Thoresen" . "@torgeir")) (:maintainers ("Torgeir Thoresen" . "@torgeir")) (:maintainer "Torgeir Thoresen" . "@torgeir"))]) + (js-comint . [(20250807 352) ((emacs (28 1))) "JavaScript interpreter in window" tar ((:url . "https://github.com/redguardtoo/js-comint") (:commit . "41015e29c8f51f7a927b453d97e14bc0cd7054de") (:revdesc . "41015e29c8f5") (:keywords "javascript" "node" "inferior-mode" "convenience") (:authors ("Paul Huff" . "paul.huff@gmail.com") ("Stefano Mazzucco" . "MYFIRSTNAME-AT-CURSO-DOT-RE")) (:maintainers ("Chen Bin" . "chenbin.shATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbin.shATgmailDOTcom"))]) + (js-doc . [(20160715 434) nil "Insert JsDoc style comment easily" tar ((:url . "https://github.com/mooz/js-doc") (:commit . "f0606e89d5aa89146f96edb38cf69af0068a9d1e") (:revdesc . "f0606e89d5aa") (:keywords "document" "comment") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainers ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com"))]) + (js-format . [(20170119 102) ((emacs (24 1)) (js2-mode (20101228))) "Format or transform code style using NodeJS server with different javascript formatter" tar ((:url . "http://github.com/futurist/js-format.el") (:commit . "544bda9be72b74ec2d442543ba60cff727d96669") (:revdesc . "544bda9be72b") (:keywords "js" "javascript" "format" "standard" "jsbeautify" "esformatter" "airbnb") (:authors ("James Yang" . "jamesyang999@gmail.com")) (:maintainers ("James Yang" . "jamesyang999@gmail.com")) (:maintainer "James Yang" . "jamesyang999@gmail.com"))]) + (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 ((:url . "https://github.com/jakoblind/js-import") (:commit . "9f8b6bc4f080c7146ce7ee5dd5a6572aeb6f1cc7") (:revdesc . "9f8b6bc4f080") (:keywords "tools") (:authors ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainers ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainer "Jakob Lind" . "karl.jakob.lind@gmail.com"))]) + (js-pkg-mode . [(20251017 936) ((emacs (25 1))) "Minor mode for working with javascript projects" tar ((:url . "https://github.com/ovistoica/js-pkg-mode") (:commit . "4d7248b829b62c7ed8509c13bd959e78466bef77") (:revdesc . "4d7248b829b6") (:keywords "convenience" "project" "javascript" "package-manager") (:authors ("Ovi Stoica" . "ovidiu.stoica1094@gmail.com")) (:maintainers ("Ovi Stoica" . "ovidiu.stoica1094@gmail.com")) (:maintainer "Ovi Stoica" . "ovidiu.stoica1094@gmail.com"))]) + (js-react-redux-yasnippets . [(20200316 1144) ((emacs (24 3)) (yasnippet (0 8 0))) "JavaScript,React,Redux yasnippets" tar ((:url . "https://github.com/sooqua/js-react-redux-yasnippets") (:commit . "9f509043f01fa59bff4daf31b2e95d63f8deab4a") (:revdesc . "9f509043f01f") (:keywords "convenience" "snippets"))]) + (js-ts-defs . [(20251118 504) ((emacs (29 1))) "Find JavaScript variable definitions using tree-sitter" tar ((:url . "https://github.com/jacksonrayhamilton/js-ts-defs") (:commit . "6e6d052855133534c9a175a813f01aea428a6a68") (:revdesc . "6e6d05285513") (:keywords "languages" "javascript" "tree-sitter") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainers ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com"))]) + (js2-closure . [(20170816 1918) ((js2-mode (20150909))) "Google Closure dependency manager" tar ((:url . "http://github.com/jart/js2-closure") (:commit . "74a75f001a8bc2b9c02b9e8b4557f7ee3c5f84fb") (:revdesc . "74a75f001a8b") (:keywords "javascript" "closure") (:authors ("Justine Tunney" . "jart@google.com")) (:maintainers ("Justine Tunney" . "jart@google.com")) (:maintainer "Justine Tunney" . "jart@google.com"))]) + (js2-highlight-vars . [(20170418 1829) ((emacs (24 4)) (js2-mode (20150908))) "Highlight occurrences of the variable under cursor" tar ((:url . "http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode/js2-highlight-vars-mode") (:commit . "e3bb177e50f76b272e8073a94d4f46be6512a163") (:revdesc . "e3bb177e50f7") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainers ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com"))]) + (js2-mode . [(20241205 140) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:url . "https://github.com/mooz/js2-mode/") (:commit . "e0c302872de4d26a9c1614fac8d6b94112b96307") (:revdesc . "e0c302872de4") (:keywords "languages" "javascript") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainers ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com"))]) + (js2-refactor . [(20250210 1811) ((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))) "The beginnings of a JavaScript refactoring library in emacs" tar ((:url . "https://github.com/js-emacs/js2-refactor.el") (:commit . "e1177c728ae52a5e67157fb18ee1409d8e95386a") (:revdesc . "e1177c728ae5") (:keywords "conveniences") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com") ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (js2hl . [(20201119 816) ((emacs (25 1)) (js2-mode (20190219))) "Highlight/rename things using js2-mode parser" tar ((:url . "https://github.com/redguardtoo/js2hl") (:commit . "8a9a53a861d20ce51a382d6caef48ccd978d8212") (:revdesc . "8a9a53a861d2") (:keywords "convenience") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (js3-mode . [(20160515 1550) nil "An improved JavaScript editing mode" tar ((:url . "https://github.com/tamzinblake/js3-mode") (:commit . "7fceb21ec56aac7af4b189bb0c0d0cf620327f5a") (:revdesc . "7fceb21ec56a") (:keywords "javascript" "languages") (:authors ("Thom Blake" . "(webmaster@thomblake.com)")) (:maintainers ("Thom Blake" . "(webmaster@thomblake.com)")) (:maintainer "Thom Blake" . "(webmaster@thomblake.com)"))]) + (jscs . [(20151015 1749) ((emacs (24 1)) (cl-lib (0 5))) "Consistent JavaScript editing using JSCS" tar ((:url . "https://github.com/papaeye/emacs-jscs") (:commit . "9d39d0f2355e69a020bf76242504f3a33e013ccf") (:revdesc . "9d39d0f2355e") (:keywords "languages" "convenience") (:authors ("papaeye" . "papaeye@gmail.com")) (:maintainers ("papaeye" . "papaeye@gmail.com")) (:maintainer "papaeye" . "papaeye@gmail.com"))]) + (jsdoc . [(20241227 1219) ((emacs (29 1)) (dash (2 11 0)) (s (1 12 0))) "Insert JSDoc comments" tar ((:url . "https://github.com/isamert/jsdoc.el") (:commit . "623994bb50d845de487c100f5cd393ce1d792460") (:revdesc . "623994bb50d8") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com"))]) + (jsfmt . [(20180920 1008) nil "Interface to jsfmt command for javascript files" tar ((:url . "https://github.com/brettlangdon/jsfmt.el") (:commit . "ca141a135c7700eaedef92561d334e1fb7dc28a1") (:revdesc . "ca141a135c77") (:authors ("Brett Langdon" . "brett@blangdon.com")) (:maintainers ("Brett Langdon" . "brett@blangdon.com")) (:maintainer "Brett Langdon" . "brett@blangdon.com"))]) + (json-mode . [(20240427 1245) ((json-snatcher (1 0 0)) (emacs (24 4))) "Major mode for editing JSON files" tar ((:url . "https://github.com/joshwnj/json-mode") (:commit . "77125b01c0ddce537085201098bea9b4b8ba6be3") (:revdesc . "77125b01c0dd"))]) + (json-navigator . [(20241031 630) ((emacs (28 1))) "View and navigate JSON structures" tar ((:url . "https://github.com/DamienCassou/json-navigator") (:commit . "8ab49b066bc23de731a29ef07bbafa29999e1852") (:revdesc . "8ab49b066bc2") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (json-par . [(20250720 619) ((emacs (24 4)) (json-mode (1 7 0))) "Minor mode for structural editing of JSON" tar ((:url . "https://github.com/taku0/json-par") (:commit . "38a3f1f11dd2ab6d195a26818966a5a5e1f74448") (:revdesc . "38a3f1f11dd2") (:keywords "abbrev" "convenience" "files") (:authors ("taku0" . "mxxouy6x3m_github@tatapa.org")) (:maintainers ("taku0" . "mxxouy6x3m_github@tatapa.org")) (:maintainer "taku0" . "mxxouy6x3m_github@tatapa.org"))]) + (json-process-client . [(20250330 728) ((emacs (27 1))) "Interact with a TCP process using JSON" tar ((:url . "https://github.com/DamienCassou/json-process-client") (:commit . "6485953fe6eff62938fd08720811c6fdd09d7d22") (:revdesc . "6485953fe6ef") (:authors ("Nicolas Petton" . "nicolas@petton.fr") ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (json-reformat . [(20220905 2342) ((emacs (24 3))) "Reformatting tool for JSON" tar ((:url . "https://github.com/gongo/json-reformat") (:commit . "e9999b1f1fc933c02ff44f4136602b6a45ed59c6") (:revdesc . "e9999b1f1fc9") (:keywords "json") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainers ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com"))]) + (json-rpc . [(20200417 1629) ((emacs (24 1)) (cl-lib (0 5))) "JSON-RPC library" tar ((:url . "https://github.com/skeeto/elisp-json-rpc") (:commit . "81a5a520072e20d18aeab2aac4d66c046b031e56") (:revdesc . "81a5a520072e") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (json-rpc-server . [(20220205 1504) ((emacs (26))) "Server-side JSON-RPC library" tar ((:url . "https://github.com/jcaw/json-rpc-server.el") (:commit . "349e1f4722474bf1f75dbc8eb9d9c59d790b8083") (:revdesc . "349e1f472247") (:keywords "tools" "comm" "json" "rpc"))]) + (json-snatcher . [(20200916 1717) ((emacs (24))) "Grabs the path to JSON values in a JSON file" tar ((:url . "http://github.com/sterlingg/json-snatcher") (:commit . "b28d1c0670636da6db508d03872d96ffddbc10f2") (:revdesc . "b28d1c067063") (:authors ("Sterling Graham" . "sterlingrgraham@gmail.com")) (:maintainers ("Sterling Graham" . "sterlingrgraham@gmail.com")) (:maintainer "Sterling Graham" . "sterlingrgraham@gmail.com"))]) + (json5-ts-mode . [(20250526 1505) ((emacs (29 1))) "Major mode for JSON5" tar ((:url . "https://github.com/dochang/json5-ts-mode") (:commit . "21233ff6386529be26d147d46681119918a9451a") (:revdesc . "21233ff63865") (:keywords "json5" "languages" "tree-sitter") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainers ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com"))]) + (jsonian . [(20250507 1231) ((emacs (27 1))) "A major mode for editing JSON files" tar ((:url . "https://github.com/iwahbe/jsonian") (:commit . "513219ebb3ccdefc915715e4bf2dd6e718fabccd") (:revdesc . "513219ebb3cc"))]) + (jsonl . [(20190623 509) ((emacs (25))) "Utility functions for working with line-delimited JSON" tar ((:url . "https://github.com/ebpa/jsonl.el") (:commit . "3dd0b7bb2b4bce9f9de7367941f0cc78f82049c9") (:revdesc . "3dd0b7bb2b4b") (:keywords "tools") (:authors ("Erik Anderson" . "erik@ebpa.link")) (:maintainers ("Erik Anderson" . "erik@ebpa.link")) (:maintainer "Erik Anderson" . "erik@ebpa.link"))]) + (jsonnet-mode . [(20220121 2109) ((emacs (24)) (dash (2 17 0))) "Major mode for editing jsonnet files" tar ((:url . "https://github.com/mgyucht/jsonnet-mode") (:commit . "cef3d352408599a63655002af655d11757579253") (:revdesc . "cef3d3524085") (:keywords "languages"))]) + (jsonp . [(20250603 2133) ((emacs (28 1))) "Resolve JSON pointers in ELisp objects" tar ((:url . "https://github.com/joshbax189/jsonp-el") (:commit . "3964615915a69f9cc2b1ec3fd8f32825b8380f72") (:revdesc . "3964615915a6") (:keywords "comm" "tools"))]) + (jss . [(20130508 1423) ((emacs (24 1)) (websocket (0)) (js2-mode (0))) "An emacs interface to webkit and mozilla debuggers" tar ((:url . "https://github.com/segv/jss") (:commit . "41749257aecf13c7bd6ed489b5ab3304d06e40bc") (:revdesc . "41749257aecf") (:keywords "languages") (:authors ("Marco Baringer" . "mb@bese.it")) (:maintainers ("Marco Baringer" . "mb@bese.it")) (:maintainer "Marco Baringer" . "mb@bese.it"))]) + (jst . [(20150604 1138) ((s (1 9)) (f (0 17)) (dash (2 10)) (pcache (0 3)) (emacs (24 4))) "JS test mode" tar ((:url . "https://github.com/cheunghy/jst-mode") (:commit . "865ff97449a4cbbcb40d38b4908cf4d7b22a5108") (:revdesc . "865ff97449a4") (:keywords "js" "javascript" "jasmine" "coffee" "coffeescript") (:authors ("Cheung Hoi Yu" . "yeannylam@gmail.com")) (:maintainers ("Cheung Hoi Yu" . "yeannylam@gmail.com")) (:maintainer "Cheung Hoi Yu" . "yeannylam@gmail.com"))]) + (jtags . [(20160211 2029) nil "Enhanced tags functionality for Java development" tar ((:url . "http://jtags.sourceforge.net") (:commit . "f7d29e1635ef7ee4ee2cdb8f1f6ab83e1015c84a") (:revdesc . "f7d29e1635ef") (:keywords "languages" "tools") (: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"))]) + (jtsx . [(20251018 1908) ((emacs (29 1))) "Extends JSX/TSX built-in support" tar ((:url . "https://github.com/llemaitre19/jtsx") (:commit . "61df071a7f4761ddb30c33c8225e78f72e68f7ae") (:revdesc . "61df071a7f47") (:keywords "languages") (: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"))]) + (julia-formatter . [(20250524 2338) ((emacs (27 1)) (session-async (0 0 5))) "Use JuliaFormatter.jl for julia code" tar ((:url . "https://codeberg.org/FelipeLema/julia-formatter.el") (:commit . "a2d86565b1d74a7fa1667468fe17e20aa0dfc0b9") (:revdesc . "a2d86565b1d7") (:keywords "convenience" "tools") (:authors ("Felipe Lema" . "felipe.lema@mortemale.org")) (:maintainers ("Felipe Lema" . "felipe.lema@mortemale.org")) (:maintainer "Felipe Lema" . "felipe.lema@mortemale.org"))]) + (julia-mode . [(20250407 841) ((emacs (26 1))) "Major mode for editing Julia source code" tar ((:url . "https://github.com/JuliaEditorSupport/julia-emacs") (:commit . "7fc071eb2c383d44be6d61ea6cef73b0cc8ef9b7") (:revdesc . "7fc071eb2c38") (:keywords "languages"))]) + (julia-repl . [(20250719 1449) ((emacs (29 1)) (s (1 12))) "A minor mode for a Julia REPL" tar ((:url . "https://github.com/tpapp/julia-repl") (:commit . "681efc14a72ece3390137b01c4ee67f317cd8324") (:revdesc . "681efc14a72e") (:keywords "languages") (:authors ("Tamas Papp" . "tkpapp@gmail.com")) (:maintainers ("Tamas Papp" . "tkpapp@gmail.com")) (:maintainer "Tamas Papp" . "tkpapp@gmail.com"))]) + (julia-shell . [(20161125 1910) ((julia-mode (0 3))) "Major mode for an inferior Julia shell" tar ((:url . "https://github.com/dennisog/julia-shell-mode") (:commit . "583a0b2ca20461ab4356929fd0f2212c22341b69") (:revdesc . "583a0b2ca204") (:authors ("Dennis Ogbe" . "dogbe@purdue.edu")) (:maintainers ("Dennis Ogbe" . "dogbe@purdue.edu")) (:maintainer "Dennis Ogbe" . "dogbe@purdue.edu"))]) + (julia-snail . [(20251211 2305) ((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 ((:url . "https://github.com/gcv/julia-snail") (:commit . "5a7e2d479c5c68b21fdb18c8fc41b9d5e7e487ab") (:revdesc . "5a7e2d479c5c"))]) + (julia-ts-mode . [(20250115 1449) ((emacs (29 1)) (julia-mode (0 4))) "Major mode for Julia source code using tree-sitter" tar ((:url . "https://github.com/ronisbr/julia-ts-mode") (:commit . "d693c6b35d3aed986b2700a3b5f910de12d6c53c") (:revdesc . "d693c6b35d3a") (:keywords "julia" "languages" "tree-sitter"))]) + (julia-vterm . [(20250621 854) ((emacs (25 1)) (vterm (0 0 1))) "A mode for Julia REPL using vterm" tar ((:url . "https://github.com/shg/julia-vterm.el") (:commit . "742255606a7a7712566dd15759cf316d584a4dc7") (:revdesc . "742255606a7a") (:keywords "languages" "julia"))]) + (jumblr . [(20170727 2043) ((s (1 8 0)) (dash (2 2 0))) "An anagram game for emacs" tar ((:url . "https://github.com/mkmcc/jumblr") (:commit . "34533dfb9db8538c005f4eaffafeff7ed193729f") (:revdesc . "34533dfb9db8") (:keywords "anagram" "word game" "games"))]) + (jump . [(20210110 2237) ((findr (0 7)) (inflections (2 4)) (cl-lib (0 5))) "Build functions which contextually jump between files" tar ((:url . "http://github.com/eschulte/jump.el") (:commit . "55caa66a7cc6e0b1a76143fd40eff38416928941") (:revdesc . "55caa66a7cc6") (:keywords "project" "convenience" "navigation"))]) + (jump-char . [(20251205 508) nil "Navigation by char" tar ((:url . "https://github.com/lewang/jump-char") (:commit . "6d7e7b090c4c5af77626f45e64e0677f356fce5b") (:revdesc . "6d7e7b090c4c"))]) + (jump-to-line . [(20130122 1653) nil "Jump to line number at point" tar ((:url . "https://github.com/ongaeshi/jump-to-line") (:commit . "01ef8c3529d85e6c59cc20840acbc4a8e8325bc8") (:revdesc . "01ef8c3529d8") (:keywords "jump" "line" "back" "file" "ruby" "csharp" "python" "perl"))]) + (jump-tree . [(20171014 1551) nil "Treat position history as a tree" tar ((:url . "https://github.com/yangwen0228/jump-tree") (:commit . "282267dc6305889e31d46b405b7ad4dfe5923b66") (:revdesc . "282267dc6305") (:keywords "convenience" "position" "jump" "tree") (:authors ("Wen Yang" . "yangwen0228@foxmail.com")) (:maintainers ("Wen Yang" . "yangwen0228@foxmail.com")) (:maintainer "Wen Yang" . "yangwen0228@foxmail.com"))]) + (jumplist . [(20151120 345) ((cl-lib (0 5))) "Jump like vim jumplist or ex jumplist" tar ((:url . "https://github.com/ganmacs/jumplist") (:commit . "c482d137d95bc5e1bcd790cdbde25b7f729b2502") (:revdesc . "c482d137d95b") (:keywords "jumplist" "vim") (:authors ("ganmacs" . "ganmacs_at_gmail.com")) (:maintainers ("ganmacs" . "ganmacs_at_gmail.com")) (:maintainer "ganmacs" . "ganmacs_at_gmail.com"))]) + (jupyter . [(20251201 1512) ((emacs (27)) (cl-lib (0 5)) (org (9 1 6)) (zmq (0 10 10)) (simple-httpd (1 5 0)) (websocket (1 9))) "Jupyter" tar ((:url . "https://github.com/emacs-jupyter/jupyter") (:commit . "de89cbeca890db51ba84aee956658f89aaa0b642") (:revdesc . "de89cbeca890") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainers ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com"))]) + (jupyter-ascending . [(20250427 2101) ((emacs (29 4))) "Edit Jupyter Notebooks in plain text" tar ((:url . "https://github.com/Duncan-Britt/jupyter-ascending") (:commit . "dda5bb675ca5f1e0d23e9fcb430f49adcafd2d2e") (:revdesc . "dda5bb675ca5") (:keywords "tools" "jupyter" "notebook" "python"))]) + (just-mode . [(20251121 1826) ((emacs (26 1))) "Justfile editing mode" tar ((:url . "https://github.com/leon-barrett/just-mode.el") (:commit . "b6173c7bf4d8d28e0dbd80fa41b9c75626885b4e") (:revdesc . "b6173c7bf4d8") (:keywords "files" "languages" "tools") (:authors ("Leon Barrett" . "(leon@barrettnexus.com)")) (:maintainers ("Leon Barrett" . "(leon@barrettnexus.com)")) (:maintainer "Leon Barrett" . "(leon@barrettnexus.com)"))]) + (just-ts-mode . [(20251121 1841) ((emacs (29 1))) "Justfile editing mode" tar ((:url . "https://github.com/leon-barrett/just-ts-mode.el") (:commit . "9dd136bc809de85fa66a4665312eb0f55b1c8094") (:revdesc . "9dd136bc809d") (:keywords "files" "languages" "tools" "treesitter") (:authors ("Leon Barrett" . "(leon@barrettnexus.com)")) (:maintainers ("Leon Barrett" . "(leon@barrettnexus.com)")) (:maintainer "Leon Barrett" . "(leon@barrettnexus.com)"))]) + (justl . [(20251111 948) ((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 ((:url . "https://github.com/psibi/justl.el") (:commit . "3b11dd8ac7ebeaca5da6c80223254a9f0494b275") (:revdesc . "3b11dd8ac7eb") (:keywords "just" "justfile" "tools" "processes"))]) + (jvm-mode . [(20150422 708) ((dash (2 6 0)) (emacs (24))) "Monitor and manage your JVMs" tar ((:url . "https://github.com/martintrojer/jvm-mode.el") (:commit . "3355dbaf5b0185aadfbad24160399abb32c5bea0") (:revdesc . "3355dbaf5b01") (:keywords "convenience") (:authors ("Martin Trojer" . "martin.trojer@gmail.com")) (:maintainers ("Martin Trojer" . "martin.trojer@gmail.com")) (:maintainer "Martin Trojer" . "martin.trojer@gmail.com"))]) + (jwt . [(20251022 2118) ((emacs (29 1))) "Interact with JSON Web Tokens" tar ((:url . "https://github.com/joshbax189/jwt-el") (:commit . "d6754f8fab6ff4041a7bece1963495e99ad9fe68") (:revdesc . "d6754f8fab6f") (:keywords "tools" "convenience"))]) + (k8s-mode . [(20250408 844) ((emacs (24 3)) (yaml-mode (0 0 10))) "Major mode for Kubernetes configuration file" tar ((:url . "https://github.com/TxGVNN/emacs-k8s-mode") (:commit . "39a189d1e030aa108e90a82fd40f0042b1e69b21") (:revdesc . "39a189d1e030") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com"))]) + (kaesar . [(20230626 2314) ((emacs (24 3)) (kaesar-pbkdf2 (0 9 0))) "AES algorithm encrypt/decrypt" tar ((:url . "https://github.com/mhayashi1120/Emacs-kaesar") (:commit . "740eaea4d2510b78d30cceabf4be2c3daca66cf7") (:revdesc . "740eaea4d251") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (kaesar-file . [(20230614 332) ((emacs (24 3)) (kaesar (0 1 1))) "AES encrypt/decrypt file" tar ((:url . "https://github.com/mhayashi1120/Emacs-kaesar") (:commit . "be615884cbbb9838c5e6655abf7f112a8df03a06") (:revdesc . "be615884cbbb") (:keywords "data" "files") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (kaesar-mode . [(20230626 401) ((emacs (24 3)) (kaesar (0 1 4))) "AES encrypt/decrypt buffer" tar ((:url . "https://github.com/mhayashi1120/Emacs-kaesar") (:commit . "fd833c69ad3ced4a890eb162f4399d79a8ec199c") (:revdesc . "fd833c69ad3c") (:keywords "data" "convenience") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (kaesar-pbkdf2 . [(20230626 2314) ((emacs (25 1))) "PBKDF2 extension for kaesar.el" tar ((:url . "https://github.com/mhayashi1120/Emacs-kaesar") (:commit . "740eaea4d2510b78d30cceabf4be2c3daca66cf7") (:revdesc . "740eaea4d251") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (kagi . [(20240811 2130) ((emacs (29 1)) (markdown-mode (2 6)) (shell-maker (0 46 1))) "Kagi API integration" tar ((:url . "https://codeberg.org/bram85/kagi.el") (:commit . "013749218495e2c1bf2bb203c6b61976963817b5") (:revdesc . "013749218495") (:keywords "terminals" "wp") (:authors ("Bram Schoenmakers" . "me@bramschoenmakers.nl")) (:maintainers ("Bram Schoenmakers" . "me@bramschoenmakers.nl")) (:maintainer "Bram Schoenmakers" . "me@bramschoenmakers.nl"))]) + (kakapo-mode . [(20171004 451) ((cl-lib (0 5))) "TABS (hard or soft) for indentation (leading whitespace), and SPACES for alignment" tar ((:url . "https://github.com/listx/kakapo-mode") (:commit . "67d516138172fd60782df94454b3d0bd247e84f3") (:revdesc . "67d516138172") (:keywords "indentation"))]) + (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 ((:url . "https://github.com/jmorag/kakoune.el") (:commit . "b39c5605e896c55ea246f755c46171bd6d0768a8") (:revdesc . "b39c5605e896") (:authors ("Joseph Morag" . "jm4157@columbia.edu")) (:maintainers ("Joseph Morag" . "jm4157@columbia.edu")) (:maintainer "Joseph Morag" . "jm4157@columbia.edu"))]) + (kaleidoscope . [(20170808 817) ((s (1 11 0))) "Controlling Kaleidoscope-powered devices" tar ((:url . "https://github.com/algernon/kaleidoscope.el") (:commit . "b89a243f6024099192f1bc38d8a54e3e7a654090") (:revdesc . "b89a243f6024"))]) + (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 ((:url . "https://github.com/algernon/kaleidoscope.el") (:commit . "5b88327350c3d6375ef1d43fb31342eaabd88fdc") (:revdesc . "5b88327350c3"))]) + (kana . [(20210531 1427) ((emacs (24 4)) (dash (2 17 0))) "Learn Japanese hiragana and katakana" tar ((:url . "https://github.com/chenyanming/kana") (:commit . "d3d550aad67ef8625b3860598bf3622f5b2a7d32") (:revdesc . "d3d550aad67e") (:keywords "tools") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainers ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com"))]) + (kanagawa-themes . [(20251222 1218) ((emacs (24 3))) "Elegant theme inspired by The Great Wave off Kanagawa" tar ((:url . "https://github.com/Fabiokleis/kanagawa-emacs") (:commit . "1eddb5fe124dbec2a4b65e3e314fa49e41f36122") (:revdesc . "1eddb5fe124d") (:keywords "themes" "faces") (:authors ("Sion Eltnam Sokaris" . "meritamen@sdf.org")) (:maintainers ("Fabio Kleis" . "fabiohkrc@gmail.com") ("Sion Eltnam Sokaris" . "meritamen@sdf.org")) (:maintainer "Fabio Kleis" . "fabiohkrc@gmail.com"))]) + (kanban . [(20250501 957) nil "Parse org-todo headlines to use org-tables as Kanban tables" tar ((:commit . "6bfdc94e4cee0f946fc032a2471898b945e25aea") (:revdesc . "6bfdc94e4cee") (:keywords "outlines" "convenience") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainers ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de"))]) + (kanji-mode . [(20241120 1923) nil "View stroke order for kanji characters at cursor" tar ((:url . "http://github.com/wsgac/kanji-mode ") (:commit . "09719b00d60e22bd31c93b21c0c817eced9d0406") (:revdesc . "09719b00d60e") (:authors ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainers ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainer "Wojciech Gac" . "wojciech.s.gac@gmail.com"))]) + (kaocha-runner . [(20240625 1010) ((emacs (26)) (s (1 4 0)) (cider (0 21 0)) (parseedn (0 1 0))) "A package for running Kaocha tests via CIDER" tar ((:url . "https://github.com/magnars/kaocha-runner.el") (:commit . "98f45ee396802c2225595c9151d4a941f9dcaa9d") (:revdesc . "98f45ee39680") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (kaolin-themes . [(20251007 1241) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:url . "https://github.com/ogdenwebb/emacs-kaolin-themes") (:commit . "a0570401fa08fb6f3843e574d28823a8e079e943") (:revdesc . "a0570401fa08") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainers ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com"))]) + (kaomel . [(20250923 1958) ((emacs (27 1))) "A snappy kaomoji picker" tar ((:url . "https://github.com/gicrisf/kaomel") (:commit . "9476f16a72e61f08f403cb4dbe860e39f1856c7a") (:revdesc . "9476f16a72e6") (:keywords "convenience" "extensions" "faces" "tools") (:authors ("Giovanni Crisalfi" . "giovanni.crisalfi@protonmail.com")) (:maintainers ("Giovanni Crisalfi" . "giovanni.crisalfi@protonmail.com")) (:maintainer "Giovanni Crisalfi" . "giovanni.crisalfi@protonmail.com"))]) + (kaomoji . [(20220721 441) ((emacs (24 3)) (helm-core (3 6 0))) "Input kaomoji superb easily" tar ((:url . "https://github.com/kuanyui/kaomoji.el") (:commit . "fba0018a13eba70c2bffc6153dcfee99937fa3d6") (:revdesc . "fba0018a13eb") (:keywords "tools" "fun") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainers ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com"))]) + (kapacitor . [(20190414 1908) ((emacs (25 1)) (magit (2 13 0)) (magit-popup (2 12 4))) "Main file for kapacitor-mode" tar ((:url . "http://github.com/Manoj321/kapacitor-el") (:commit . "e3300d8b4017a2f66b0d929cb85bcc7ee2612072") (:revdesc . "e3300d8b4017") (:keywords "kapacitor" "emacs" "magit" "tools") (:authors ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainers ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm.321@gmail.com"))]) + (karma . [(20160220 1245) ((pkg-info (0 4)) (emacs (24))) "Karma Test Runner Emacs Integration" tar ((:url . "http://github.com/tonini/karma.el") (:commit . "31d3e7708246183d7ed0686be92bf23140af348c") (:revdesc . "31d3e7708246") (:keywords "language" "javascript" "js" "karma" "testing"))]) + (kconfig-mode . [(20220604 1415) ((emacs (24 3))) "Major mode for editing Kconfig files" tar ((:url . "https://github.com/delaanthonio/kconfig-mode") (:commit . "cd87b71c8c1739d026645ece0bbd20055a7a2d4a") (:revdesc . "cd87b71c8c17") (:keywords "kconfig" "languages" "linux" "kernel") (:authors ("Dela Anthonio" . "dell.anthonio@gmail.com")) (:maintainers ("Dela Anthonio" . "dell.anthonio@gmail.com")) (:maintainer "Dela Anthonio" . "dell.anthonio@gmail.com"))]) + (kconfig-ref . [(20230814 1052) ((emacs (24 4)) (projectile (2 7 0)) (emacsql (0))) "A simple package for looking up kconfig symbol quickly" tar ((:url . "https://github.com/seokbeomkim/kconfig-ref") (:commit . "a3f602032cd3b9a7167505bd8ad0f156ae34c0b8") (:revdesc . "a3f602032cd3") (:keywords "tools" "kconfig" "linux" "kernel") (:authors ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainers ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainer "Jason Kim" . "sukbeom.kim@gmail.com"))]) + (kdeconnect . [(20231029 2250) ((emacs (25 1))) "An interface for KDE Connect" tar ((:url . "https://github.com/carldotac/kdeconnect.el") (:commit . "2548bae3b79df23d3fb765391399410e2b935eb9") (:revdesc . "2548bae3b79d") (:keywords "convenience") (:authors ("Carl Lieberman" . "dev@carl.ac")) (:maintainers ("Carl Lieberman" . "dev@carl.ac")) (:maintainer "Carl Lieberman" . "dev@carl.ac"))]) + (kdl-mode . [(20250620 259) ((emacs (29 1))) "Major mode for editing KDL files" tar ((:url . "https://github.com/taquangtrung/emacs-kdl-mode") (:commit . "0723706e1248bf07b2761f630ad0de2393a76aeb") (:revdesc . "0723706e1248") (:keywords "languages"))]) + (keepass-mode . [(20211030 958) ((emacs (27))) "Mode for KeePass DB" tar ((:url . "https://github.com/ifosch/keepass-mode") (:commit . "f432bb60f9f3bd027025140d723906dcabeefaef") (:revdesc . "f432bb60f9f3") (:keywords "data" "files" "tools") (:authors ("Ignasi Fosch" . "natx@y10k.ws")) (:maintainers ("Ignasi Fosch" . "natx@y10k.ws")) (:maintainer "Ignasi Fosch" . "natx@y10k.ws"))]) + (keg . [(20240713 1007) ((emacs (24 1))) "Modern Elisp package development system" tar ((:url . "https://github.com/conao3/keg.el") (:commit . "e1726f89dab1811a110eebb3f3e4b673742faf05") (:revdesc . "e1726f89dab1") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (keg-mode . [(20220307 829) ((emacs (24 4))) "Major mode for editing Keg files" tar ((:url . "https://github.com/conao3/keg.el") (:commit . "d2ef9cfaee1256849291cfade3d730667f55aaf2") (:revdesc . "d2ef9cfaee12") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (kele . [(20251211 128) ((emacs (29 1)) (async (1 9 7)) (dash (2 19 1)) (f (0 20 0)) (magit-section (4 0 0)) (memoize (0)) (plz (0 8 0)) (yaml (0 5 1))) "Spritzy Kubernetes cluster management" tar ((:url . "https://github.com/jinnovation/kele.el") (:commit . "3303c146905043098197fc8ec1283252447ad321") (:revdesc . "3303c1469050") (:keywords "kubernetes" "tools") (:authors ("Jonathan Jin" . "me@jonathanj.in")) (:maintainers ("Jonathan Jin" . "me@jonathanj.in")) (:maintainer "Jonathan Jin" . "me@jonathanj.in"))]) + (kerl . [(20150424 2005) nil "Emacs integration for kerl" tar ((:url . "http://github.com/correl/kerl.el/") (:commit . "1732ee26213f021bf040919c45ad276aafcaae14") (:revdesc . "1732ee26213f") (:keywords "tools") (:authors ("Correl Roush" . "correl@gmail.com")) (:maintainers ("Correl Roush" . "correl@gmail.com")) (:maintainer "Correl Roush" . "correl@gmail.com"))]) + (key-assist . [(20231208 446) ((emacs (24 3))) "Minibuffer keybinding cheatsheet and launcher" tar ((:url . "https://github.com/Boruch-Baum/emacs-key-assist") (:commit . "87d2378db3d997b6b5a7b2c04281c18378e70bbb") (:revdesc . "87d2378db3d9") (:keywords "abbrev" "convenience" "docs" "help") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainers ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com"))]) + (key-chord . [(20250330 2011) ((emacs (24))) "Map pairs of simultaneously pressed keys to commands" tar ((:url . "https://github.com/LemonBreezes/key-chord") (:commit . "cb646e815c61f253ad9fdfbe058049dda4e2b32b") (:revdesc . "cb646e815c61") (:keywords "keyboard" "chord" "input") (:authors ("David Andersson" . "l.david.anderssonsverige.nu")) (:maintainers ("LemonBreezes" . "look@strawberrytea.xyz")) (:maintainer "LemonBreezes" . "look@strawberrytea.xyz"))]) + (key-combo . [(20230323 829) nil "Map key sequence to commands" tar ((:url . "https://github.com/uk-ar/key-combo") (:commit . "16fb73522d53547ef38f3710aff7c0b01005d576") (:revdesc . "16fb73522d53") (:keywords "keyboard" "input") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainers ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com"))]) + (key-intercept . [(20140211 749) nil "Intercept prefix keys" tar ((:url . "http://github.com/tarao/key-intercept-el") (:commit . "d9a60edb4ce893f2d3d94f242164fdcc62d43cf2") (:revdesc . "d9a60edb4ce8") (:keywords "keyboard") (:authors ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainers ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainer "INA Lintaro" . "tarao.gnnatgmail.com"))]) + (key-leap . [(20160831 1447) ((emacs (24 3))) "Leap between lines by typing keywords" tar ((:url . "https://github.com/MartinRykfors/key-leap") (:commit . "b3f6ef15c8a13870475d5af159fa24b30f97dea0") (:revdesc . "b3f6ef15c8a1") (:keywords "point" "convenience") (:authors ("Martin Rykfors" . "martinrykfors@gmail.com")) (:maintainers ("Martin Rykfors" . "martinrykfors@gmail.com")) (:maintainer "Martin Rykfors" . "martinrykfors@gmail.com"))]) + (key-quiz . [(20200226 2129) ((emacs (26))) "Emacs Keys Quiz" tar ((:url . "https://github.com/federicotdn/key-quiz") (:commit . "1ee67f3f8977d95785e021f7896685de1979137e") (:revdesc . "1ee67f3f8977") (:keywords "games") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainers ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com"))]) + (key-seq . [(20150907 756) ((key-chord (0 6))) "Map pairs of sequentially pressed keys to commands" tar ((:url . "http://github.com/vlevit/key-seq.el") (:commit . "e29b083a6427d061638749194fc249ef69ad2cc0") (:revdesc . "e29b083a6427") (:keywords "convenience" "keyboard" "keybindings") (:authors ("Vyacheslav Levit" . "dev@vlevit.org")) (:maintainers ("Vyacheslav Levit" . "dev@vlevit.org")) (:maintainer "Vyacheslav Levit" . "dev@vlevit.org"))]) + (keycast . [(20251101 2021) ((emacs (28 1)) (compat (30 1))) "Show current command and its binding" tar ((:url . "https://github.com/tarsius/keycast") (:commit . "090ade99c1c03830d45cc763e5733a1ca001c4e5") (:revdesc . "090ade99c1c0") (:keywords "multimedia") (:authors ("Jonas Bernoulli" . "emacs.keycast@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.keycast@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.keycast@jonas.bernoulli.dev"))]) + (keychain-environment . [(20251123 46) nil "Load keychain environment variables" tar ((:url . "https://github.com/tarsius/keychain-environment") (:commit . "d2fa34404fe3a58bd7e708e73b77be43f46eb4cc") (:revdesc . "d2fa34404fe3") (:keywords "gnupg" "pgp" "ssh") (:authors ("Paul Tipper" . "bluefooatgooglemaildotcom")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li"))]) + (keydef . [(20090428 1931) nil "A simpler way to define keys, with kbd syntax" tar ((:url . "https://github.com/emacsorphanage/keydef") (:commit . "dff2be9f58d12d8c6a490ad0c1b2b10b55528dc0") (:revdesc . "dff2be9f58d1") (:keywords "convenience" "lisp" "customization" "keyboard" "keys") (:authors ("Michael John Downes" . "mjd@ams.org")) (:maintainers ("Michael John Downes" . "mjd@ams.org")) (:maintainer "Michael John Downes" . "mjd@ams.org"))]) + (keyfreq . [(20231107 106) ((cl-lib (0 5))) "Track command frequencies" tar ((:url . "https://github.com/dacap/keyfreq") (:commit . "c6955162307f37c2ac631d9daf118781009f8dda") (:revdesc . "c6955162307f"))]) + (keymap-utils . [(20251212 1059) ((emacs (28 1)) (compat (30 1))) "Keymap utilities" tar ((:url . "https://github.com/tarsius/keymap-utils") (:commit . "20e2ebcdf0cb04666c6cf5060cc60078794db704") (:revdesc . "20e2ebcdf0cb") (:keywords "convenience" "extensions") (:authors ("Jonas Bernoulli" . "emacs.keymap-utils@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.keymap-utils@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.keymap-utils@jonas.bernoulli.dev"))]) + (keypress-multi-event . [(20250313 1648) ((emacs (24 3))) "Perform different actions for the same keypress" tar ((:url . "https://www.github.com/Boruch-Baum/emacs-keypress-multi-event") (:commit . "8c31b75f6ef4d81d5625e91a4130e204bfd02dd3") (:revdesc . "8c31b75f6ef4") (:keywords "abbrev" "convenience" "wp" "keyboard") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainers ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com"))]) + (keypression . [(20240111 440) ((emacs (26 3))) "Keystroke visualizer" tar ((:url . "https://github.com/chuntaro/emacs-keypression") (:commit . "e85e3fd9ce216a370be221cf9de1503777ef0088") (:revdesc . "e85e3fd9ce21") (:keywords "key" "screencast" "tools") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainers ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp"))]) + (keyset . [(20150220 530) ((dash (2 8 0)) (cl-lib (0 5))) "A small library for structuring key bindings" tar ((:url . "https://github.com/HKey/keyset") (:commit . "c6b375fbe8035fde593d1d96895eb6e3f111d379") (:revdesc . "c6b375fbe803") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com"))]) + (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 ((:url . "https://github.com/peterpaul/keystore-mode") (:commit . "43bd5926348298d077c7221f37902c990df3f951") (:revdesc . "43bd59263482") (:keywords "tools") (: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"))]) + (keyswap . [(20240717 1440) ((emacs (25 1))) "Swap bindings between key pairs" tar ((:url . "http://github.com/hardenedapple/keyswap.el") (:commit . "d4f9f56a0e6e1365fc7c8ea8d953b8fdffad27fe") (:revdesc . "d4f9f56a0e6e") (:keywords "convenience") (:authors ("Matthew Malcomson" . "hardenedapple@gmail.com")) (:maintainers ("Matthew Malcomson" . "hardenedapple@gmail.com")) (:maintainer "Matthew Malcomson" . "hardenedapple@gmail.com"))]) + (keytar . [(20250101 849) ((emacs (24 4))) "Emacs Lisp interface for node-keytar" tar ((:url . "https://github.com/emacs-grammarly/keytar") (:commit . "5b3501dc95755d85fcf21b00ae0d347446efe73b") (:revdesc . "5b3501dc9575") (:keywords "convenience" "keytar" "password" "credential" "secret" "security") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (keyword-search . [(20180424 1102) nil "Browser keyword search from Emacs" tar ((:url . "https://github.com/juhp/keyword-search") (:commit . "f8475ecaddb8804a9be6bee47678207c86ac8dee") (:revdesc . "f8475ecaddb8") (:keywords "web" "search" "keyword"))]) + (kfg . [(20140909 538) ((f (0 17 1))) "An emacs configuration system" tar ((:url . "https://github.com/abingham/kfg") (:commit . "ffc35b77f227d4c64a1271ec30d31333ffeb0013") (:revdesc . "ffc35b77f227") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (khalel . [(20250910 946) ((emacs (27 1))) "Import, edit and create calendar events through khal" tar ((:url . "https://gitlab.com/hperrey/khalel") (:commit . "f7cdb3246d193a518b3a4ca7381ffb6ed8087fcf") (:revdesc . "f7cdb3246d19") (:keywords "event" "calendar" "ics" "khal") (:authors ("Hanno Perrey" . "http://gitlab.com/hperrey")) (:maintainers ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainer "Hanno Perrey" . "hanno@hoowl.se"))]) + (khardel . [(20231126 1502) ((emacs (27 1)) (yaml-mode (0 0 13))) "Integrate with khard" tar ((:url . "https://github.com/DamienCassou/khardel") (:commit . "205e374b36252183a146a7a8f857bcf95a77edc3") (:revdesc . "205e374b3625") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (khoj . [(20251208 432) ((emacs (27 1)) (transient (0 3 0)) (dash (2 19 1))) "Your Second Brain" tar ((:url . "https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs") (:commit . "f4c519a9d00fcedfc8ab06e4f48307acc7555d39") (:revdesc . "f4c519a9d00f") (:keywords "search" "chat" "ai" "org-mode" "outlines" "markdown" "pdf" "image") (:authors ("Debanjum Singh Solanky" . "debanjum@khoj.dev") ("Saba Imran" . "saba@khoj.dev")) (:maintainers ("Debanjum Singh Solanky" . "debanjum@khoj.dev") ("Saba Imran" . "saba@khoj.dev")) (:maintainer "Debanjum Singh Solanky" . "debanjum@khoj.dev"))]) + (kibit-helper . [(20150508 1533) ((s (0 8)) (emacs (24))) "Conveniently use the Kibit Leiningen plugin from Emacs" tar ((:url . "http://www.github.com/brunchboy/kibit-helper") (:commit . "ec5f154db3bb0c838e86f527353f08644cede926") (:revdesc . "ec5f154db3bb") (:keywords "languages" "clojure" "kibit") (:authors ("James Elliott" . "james@brunchboy.com")) (:maintainers ("James Elliott" . "james@brunchboy.com")) (:maintainer "James Elliott" . "james@brunchboy.com"))]) + (kill-dollar-mode . [(20241217 1947) ((emacs (27 1))) "Remove leading $ from shell-script-like text" tar ((:url . "https://github.com/sandinmyjoints/kill-dollar-mode") (:commit . "e51c076f93605c5a651b549731ccfc85a2564aca") (:revdesc . "e51c076f9360") (:keywords "convenience" "tools"))]) + (kill-file-path . [(20230306 1041) ((emacs (26))) "Copy file name into kill ring" tar ((:url . "https://github.com/chyla/kill-file-path/kill-file-path.el") (:commit . "5dcbce69cbae17665216a32dd20f27de54c62972") (:revdesc . "5dcbce69cbae") (:keywords "files") (:authors ("Adam Chyła" . "adam@chyla.org")) (:maintainers ("Adam Chyła" . "adam@chyla.org")) (:maintainer "Adam Chyła" . "adam@chyla.org"))]) + (kill-or-bury-alive . [(20230606 1503) ((emacs (24 4))) "Precise control over buffer killing" tar ((:url . "https://github.com/mrkkrp/kill-or-bury-alive") (:commit . "16c393db6ad0c7e184af0a24d26b637e23543b1f") (:revdesc . "16c393db6ad0") (:keywords "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (kill-ring-search . [(20140422 1555) nil "Incremental search for the kill ring" tar ((:url . "http://nschum.de/src/emacs/kill-ring-search/") (:commit . "23535b4a01a1cb1574604e36c49614e84e85c883") (:revdesc . "23535b4a01a1") (:keywords "convenience" "matching") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainer "Nikolaj Schumacher" . "bugs*nschumde"))]) + (kirigami . [(20251202 1126) ((emacs (26 3))) "A unified method to fold and unfold text" tar ((:url . "https://github.com/jamescherti/kirigami.el") (:commit . "b23cae12111dd193b968d6e319dff8131e7796b0") (:revdesc . "b23cae12111d") (:keywords "convenience"))]) + (kite . [(20130201 1938) ((json (1 2)) (websocket (0 93 1))) "WebKit inspector front-end" tar ((:url . "https://github.com/jscheid/kite") (:commit . "7ed74d1147a6ddd152d3da65dc30df3517d53144") (:revdesc . "7ed74d1147a6") (:keywords "tools") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainers ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com"))]) + (kite-mini . [(20160508 1106) ((dash (2 11 0)) (websocket (1 5))) "Remotely evaluate JavaScript in the WebKit debugger" tar ((:url . "https://github.com/tungd/kite-mini.el") (:commit . "48734092e735033ad7664a9933acd4556e095f79") (:revdesc . "48734092e735") (:keywords "webkit") (:authors ("Tung Dao" . "me@tungdao.com")) (:maintainers ("Tung Dao" . "me@tungdao.com")) (:maintainer "Tung Dao" . "me@tungdao.com"))]) + (kivy-mode . [(20250528 2123) nil "Emacs major mode for editing Kivy files" tar ((:url . "https://github.com/kivy/kivy") (:commit . "42a3d0a62eaa54890a1e6461ecfc6199ac26a1b0") (:revdesc . "42a3d0a62eaa") (: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 ((:url . "https://repo.or.cz/kiwix.el.git") (:commit . "444f686a7f75db788d54f544b923a3532732eb8b") (:revdesc . "444f686a7f75") (:keywords "kiwix" "wikipedia") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com"))]) + (kixtart-mode . [(20251222 1130) ((emacs (28 1)) (eldoc (1 14 0))) "Major mode for editing KiXtart scripts" tar ((:url . "https://git.sr.ht/~mew/kixtart-mode") (:commit . "a889a37dbe96529b92372170092cc9bbf045fe83") (:revdesc . "a889a37dbe96") (:keywords "languages") (:authors ("Morgan Willcock" . "morgan@ice9.digital")) (:maintainers ("Morgan Willcock" . "morgan@ice9.digital")) (:maintainer "Morgan Willcock" . "morgan@ice9.digital"))]) + (kkp . [(20250608 1431) ((emacs (27 1)) (compat (29 1 3 4))) "Enable support for the Kitty Keyboard Protocol" tar ((:url . "https://github.com/benotn/kkp") (:commit . "1a7b4f395aa4e1e04afc45fe2dbd6a045871803b") (:revdesc . "1a7b4f395aa4") (:keywords "terminals") (:authors ("Benjamin Orthen" . "contact@orthen.net")) (:maintainers ("Benjamin Orthen" . "contact@orthen.net")) (:maintainer "Benjamin Orthen" . "contact@orthen.net"))]) + (klere-theme . [(20250517 452) ((emacs (24))) "A dark theme with lambent color highlights and incremental grays" tar ((:url . "https://github.com/tomenzgg/emacs-klere-theme") (:commit . "377cc33617184e23acde6707beaf8938915fe093") (:revdesc . "377cc3361718") (:authors ("Jean Libète" . "tomenzgg@mail.mayfirst.org")) (:maintainers ("Jean Libète" . "tomenzgg@mail.mayfirst.org")) (:maintainer "Jean Libète" . "tomenzgg@mail.mayfirst.org"))]) + (klondike . [(20250301 2336) ((emacs (28 1))) "Klondike" tar ((:url . "https://codeberg.org/tomenzgg/Emacs-Klondike") (:commit . "891cc54c1d9411f7848a4bba34811370ae19960e") (:revdesc . "891cc54c1d94") (:keywords "games" "cards" "solitaire" "klondike") (:authors ("Jean Libète" . "tomenzgg@mail.mayfirst.org")) (:maintainers ("Jean Libète" . "tomenzgg@mail.mayfirst.org")) (:maintainer "Jean Libète" . "tomenzgg@mail.mayfirst.org"))]) + (kmacro-x . [(20250521 1530) ((emacs (29 1))) "Keyboard macro helpers and extensions" tar ((:url . "https://github.com/vifon/kmacro-x.el") (:commit . "da859b6b8b31c4fdfd3028996a02e5a70d9fff6b") (:revdesc . "da859b6b8b31") (:keywords "convenience"))]) + (know-your-http-well . [(20240726 1649) nil "Look up the meaning of HTTP headers, methods, relations, status codes" tar ((:url . "https://github.com/for-GET/know-your-http-well") (:commit . "2ff1548a6d59f2b59cfbdd2697fcf202625cc248") (:revdesc . "2ff1548a6d59"))]) + (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 ((:url . "http://github.com/spiderbit/kodi-remote.el") (:commit . "f5e932036c16e2b61a63020e006fc601e38d181e") (:revdesc . "f5e932036c16") (:keywords "kodi" "tools" "convinience") (:authors ("Stefan Huchler" . "stefan.huchler@mail.de")) (:maintainers ("Stefan Huchler" . "stefan.huchler@mail.de")) (:maintainer "Stefan Huchler" . "stefan.huchler@mail.de"))]) + (kolon-mode . [(20140122 1134) nil "Syntax highlighting for Text::Xslate's Kolon syntax" tar ((:url . "https://github.com/samvtran/kolon-mode") (:commit . "5af0955e280ae991862189ebecd3937c5fc8fb9f") (:revdesc . "5af0955e280a") (:keywords "xslate" "perl"))]) + (koopa-mode . [(20230905 2243) ((company (0 9 13)) (emacs (27 1))) "A major mode for Microsoft PowerShell" tar ((:url . "https://github.com/sch0lars/koopa-mode") (:commit . "82c81a641e106f270d45427f6d0139aabbd8523c") (:revdesc . "82c81a641e10") (:keywords "powershell" "convenience"))]) + (kooten-theme . [(20161023 905) ((emacs (24 1))) "Dark color theme" tar ((:url . "http://github.com/kootenpv/emacs-kooten-theme") (:commit . "d10197b4dd7af02cd14aeab2573c273a294798c3") (:revdesc . "d10197b4dd7a") (:keywords "themes") (:authors ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainers ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainer "Pascal van Kooten" . "kootenpv@gmail.com"))]) + (korean-holidays . [(20190102 1558) nil "Korean holidays for calendar" tar ((:url . "https://github.com/tttuuu888/korean-holidays") (:commit . "3f90ed86f46f8e5533f23baa40e2513ac497ca2b") (:revdesc . "3f90ed86f46f") (:keywords "calendar") (:authors ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainers ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainer "SeungKi Kim" . "tttuuu888@gmail.com"))]) + (kosmos-theme . [(20170502 1850) ((emacs (24))) "Black and lightgray theme with not so much syntax highlighting" tar ((:url . "https://github.com/habamax/kosmos-theme") (:commit . "616456d2376a75dc31190ad65137d179fbad4336") (:revdesc . "616456d2376a") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com"))]) + (kotlin-mode . [(20230123 1859) ((emacs (24 3))) "Major mode for kotlin" tar ((:url . "https://github.com/Emacs-Kotlin-Mode-Maintainers/kotlin-mode") (:commit . "fddd747e5b4736e8b27a147960f369b86179ddff") (:revdesc . "fddd747e5b47") (:keywords "languages") (:authors ("Shodai Yokoyama" . "(quantumcars@gmail.com)")) (:maintainers ("Shodai Yokoyama" . "(quantumcars@gmail.com)")) (:maintainer "Shodai Yokoyama" . "(quantumcars@gmail.com)"))]) + (kotlin-ts-mode . [(20250617 843) ((emacs (29 1))) "A mode for editing Kotlin files based on tree-sitter" tar ((:url . "https://gitlab.com/bricka/emacs-kotlin-ts-mode") (:commit . "051c9ef534956c235343fb41546623ff87a1695b") (:revdesc . "051c9ef53495") (:authors ("Alex Figl-Brick" . "alex@alexbrick.me")) (:maintainers ("Alex Figl-Brick" . "alex@alexbrick.me")) (:maintainer "Alex Figl-Brick" . "alex@alexbrick.me"))]) + (kpm-list . [(20170924 1352) nil "An emacs buffer list that tries to intelligently group together buffers" tar ((:url . "https://github.com/KMahoney/kpm-list/") (:commit . "e0f5112e5ce8ec1b603f4428fa51681c68bb28f5") (:revdesc . "e0f5112e5ce8"))]) + (kql-mode . [(20250925 1437) ((emacs (26 1))) "Major mode for highlighting KQL" tar ((:url . "https://gitlab.com/aimebertrand/kql-mode") (:commit . "6ea203a6f21332eeab33875908da01607740947d") (:revdesc . "6ea203a6f213") (:keywords "files" "languages" "azure" "entra" "kql" "faces" "syntax" "major-mode"))]) + (kroman . [(20150827 2340) nil "Korean hangul romanization" tar ((:url . "https://github.com/victorteokw/kroman-el") (:commit . "431144a3cd629a2812a668a29ad85182368dc9b0") (:revdesc . "431144a3cd62") (:keywords "korean" "roman") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com"))]) + (ksp-cfg-mode . [(20190414 2348) ((emacs (24)) (cl-lib (0 5))) "Major mode for editing KSP CFG files" tar ((:url . "http://github.com/lashtear/ksp-cfg-mode") (:commit . "faec8bd8456c67276d065eb68c88a30efcef59ef") (:revdesc . "faec8bd8456c") (:keywords "data") (:authors ("Emily Backes" . "lucca@accela.net")) (:maintainers ("Emily Backes" . "lucca@accela.net")) (:maintainer "Emily Backes" . "lucca@accela.net"))]) + (ksp-mode . [(20221220 1136) ((emacs (27 1))) "Major mode for editing ksp files" tar ((:url . "https://github.com/youngker/ksp-mode.el") (:commit . "89b91b8ed6753867e30aa494e5d80325dfe25569") (:revdesc . "89b91b8ed675") (:keywords "ksp" "languages") (:maintainers ("YoungJoo Lee" . "youngker@gmail.com")) (:maintainer "YoungJoo Lee" . "youngker@gmail.com"))]) + (kubectx-mode . [(20240312 2024) ((emacs (24))) "Change kubectl context/namespace and show in mode line" tar ((:url . "https://github.com/terjesannum/emacs-kubectx-mode") (:commit . "b177c0fa9f8471d6199df4598afde1e39e83c504") (:revdesc . "b177c0fa9f84") (:keywords "tools" "kubernetes") (:authors ("Terje Sannum" . "terje@offpiste.org")) (:maintainers ("Terje Sannum" . "terje@offpiste.org")) (:maintainer "Terje Sannum" . "terje@offpiste.org"))]) + (kubedoc . [(20240108 1404) ((emacs (27 1))) "Kubernetes API Documentation" tar ((:url . "https://github.com/r0bobo/kubedoc.el/") (:commit . "aac02b096c98b83b4eaf129e6d767cf7150a6d43") (:revdesc . "aac02b096c98") (:keywords "docs" "help" "k8s" "kubernetes" "tools") (:authors ("Dean Lindqvist Todevski" . "https://github.com/r0bobo")))]) + (kubel . [(20251009 310) ((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 ((:url . "https://github.com/abrochard/kubel") (:commit . "48a2dabac24921c89e95039d1a8e5a52568baa02") (:revdesc . "48a2dabac249") (:keywords "kubernetes" "k8s" "tools" "processes"))]) + (kubel-evil . [(20231224 1343) ((kubel (1 0)) (evil (1 0)) (emacs (25 3))) "Extension for kubel to provide evil keybindings" tar ((:url . "https://github.com/abrochard/kubel") (:commit . "3d2f86fccdf81ab890f5d46dde93f241b718a436") (:revdesc . "3d2f86fccdf8") (:keywords "kubernetes" "k8s" "tools" "processes" "evil" "keybindings"))]) + (kubernetes . [(20250330 1936) ((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 ((:url . "https://github.com/kubernetes-el/kubernetes-el") (:commit . "938ef502414d093de827bf7f11bdb30843878a37") (:revdesc . "938ef502414d") (:keywords "kubernetes") (:authors ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainers ("Chris Barrett" . "chris+emacs@walrus.cool") ("Noorul Islam K M" . "noorul@noorul.com") ("Jonathan Jin" . "me@jonathanj.in")) (:maintainer "Chris Barrett" . "chris+emacs@walrus.cool"))]) + (kubernetes-evil . [(20220625 534) ((kubernetes (0 18 0)) (evil (1 2 12))) "Kubernetes keybindings for evil-mode" tar ((:url . "https://github.com/kubernetes-el/kubernetes-el") (:commit . "b155d64aa72bd1175770db3518a67a347caa36dd") (:revdesc . "b155d64aa72b") (: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 ((:url . "https://github.com/abrochard/kubernetes-helm") (:commit . "f70e2efa6ef869143ccb2f158f4ab7df91dcc58f") (:revdesc . "f70e2efa6ef8") (:keywords "kubernetes" "helm" "k8s" "tools" "processes"))]) + (kubernetes-tramp . [(20181228 922) ((emacs (24)) (cl-lib (0 5))) "TRAMP integration for kubernetes containers" tar ((:url . "https://github.com/gruggiero/kubernetes-tramp") (:commit . "8713571b66940f8f3f496b55baa23cdf1df7a869") (:revdesc . "8713571b6694") (:keywords "kubernetes" "convenience") (:authors ("Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com")) (:maintainers ("Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com")) (:maintainer "Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com"))]) + (kurecolor . [(20221213 124) ((emacs (24 4)) (s (1 12))) "Color editing goodies" tar ((:url . "https://github.com/emacsfodder/kurecolor.el") (:commit . "ac67ceba85839ab1ced96fad605bf023b697263f") (:revdesc . "ac67ceba8583") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (kuronami-theme . [(20240104 2022) ((emacs (24 1))) "A deep blue theme with cool autumnal colors" tar ((:url . "https://github.com/inj0h/kuronami") (:commit . "4d0a9e5f789e5768a0c2ea7dec31f98ea95c7372") (:revdesc . "4d0a9e5f789e") (:authors ("inj0h" . "")) (:maintainers ("inj0h" . "")) (:maintainer "inj0h" . ""))]) + (kv . [(20140108 1534) nil "Key/value data structure functions" tar ((:url . "https://github.com/nicferrier/emacs-kv") (:commit . "721148475bce38a70e0b678ba8aa923652e8900e") (:revdesc . "721148475bce") (:keywords "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (kwin . [(20220120 2125) nil "Communicatewith the KWin window manager" tar ((:url . "http://github.com/reactormonk/kwin-minor-mode") (:commit . "20fac6508e5535a26df783ba05f04d1800b7382c") (:revdesc . "20fac6508e55"))]) + (laas . [(20241212 1314) ((emacs (26 3)) (auctex (11 88)) (aas (1 1))) "A bundle of as-you-type LaTeX snippets" tar ((:url . "https://github.com/tecosaur/LaTeX-auto-activating-snippets") (:commit . "f5fb180ab23b7eb0695ade84c9077aa701f47bbf") (:revdesc . "f5fb180ab23b") (:keywords "tools" "tex") (:maintainers ("Yoav Marco" . "yoavm448@gmail.com")) (:maintainer "Yoav Marco" . "yoavm448@gmail.com"))]) + (lab . [(20251203 1024) ((emacs (27 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 ((:url . "https://github.com/isamert/lab.el") (:commit . "a8e0064950166b0e77ab2038306eff49c058cae0") (:revdesc . "a8e006495016") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com"))]) + (lab-themes . [(20200815 2104) ((emacs (24))) "A custom theme carefully constructed in the LAB space" tar ((:url . "https://github.com/MetroWind/lab-theme") (:commit . "9d7deb9635959d3a50ccb1082eb1207275f4b3e8") (:revdesc . "9d7deb963595") (:keywords "lisp") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainers ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com"))]) + (labburn-theme . [(20221208 1611) nil "A lab color space zenburn theme" tar ((:url . "https://github.com/ksjogo/labburn-theme") (:commit . "bd0de2fdcf285d981f32e3e5ebc56fe3c9b589a5") (:revdesc . "bd0de2fdcf28") (:keywords "theme" "zenburn"))]) + (lacquer . [(20230824 725) ((emacs (25 2))) "Switch theme/font by selecting from a cache" tar ((:url . "https://github.com/zakudriver/lacquer") (:commit . "c8a0fb81f18001b3d510f545ba253ed4f9a50f5b") (:revdesc . "c8a0fb81f180") (:keywords "tools") (:authors ("zakudriver" . "zy.hua1122@gmail.com")) (:maintainers ("zakudriver" . "zy.hua1122@gmail.com")) (:maintainer "zakudriver" . "zy.hua1122@gmail.com"))]) + (laguna-theme . [(20220804 227) nil "An updated blue-green Laguna Theme" tar ((:url . "https://github.com/HenryNewcomer/laguna-theme") (:commit . "680ab8c936cb1c249b5a6a07976bcc83ef217e25") (:revdesc . "680ab8c936cb") (:authors ("Henry Newcomer" . "a.cliche.email@gmail.com")) (:maintainers ("Henry Newcomer" . "a.cliche.email@gmail.com")) (:maintainer "Henry Newcomer" . "a.cliche.email@gmail.com"))]) + (lambdapi-mode . [(20250716 1143) ((emacs (27 1)) (eglot (1 6)) (math-symbol-lists (1 2 1)) (highlight (20190710 1527))) "A major mode for editing Lambdapi source code" tar ((:url . "https://github.com/Deducteam/lambdapi") (:commit . "f73c64dbeebf850ecc3384d64f0dbf93a1ea6acd") (:revdesc . "f73c64dbeebf") (:keywords "languages") (:maintainers ("Deducteam" . "dedukti-dev@inria.fr")) (:maintainer "Deducteam" . "dedukti-dev@inria.fr"))]) + (lammps-mode . [(20250311 47) ((emacs (24 4))) "Basic syntax highlighting for LAMMPS files" tar ((:url . "https://github.com/lammps/lammps/tree/master/tools/emacs") (:commit . "92d262c755c3aedf02bbe19743ba761ccdc7c0c2") (:revdesc . "92d262c755c3") (:keywords "languages" "faces") (:authors ("Aidan Thompson" . "athompsatsandia.gov")) (:maintainers ("Rohit Goswami" . "r95g10atgmail.com")) (:maintainer "Rohit Goswami" . "r95g10atgmail.com"))]) + (lang-refactor-perl . [(20131122 2127) nil "Simple refactorings, primarily for Perl" tar ((:url . "https://github.com/jplindstrom/emacs-lang-refactor-perl") (:commit . "691bd69639de6b7af357e3b7143563ececd9c497") (:revdesc . "691bd69639de") (:keywords "languages" "refactoring" "perl") (:authors ("Johan Lindstrom" . "buzzwordninjanot_this_bit@googlemail.com")) (:maintainers ("Johan Lindstrom" . "buzzwordninjanot_this_bit@googlemail.com")) (:maintainer "Johan Lindstrom" . "buzzwordninjanot_this_bit@googlemail.com"))]) + (langdoc . [(20150218 645) ((cl-lib (0 2))) "Help to define help document mode for various languages" tar ((:url . "https://github.com/tom-tan/langdoc/") (:commit . "2c7223bacb116992d700ecb19a60df5c09c63424") (:revdesc . "2c7223bacb11") (:keywords "convenience" "eldoc") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainers ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com"))]) + (langtool . [(20230222 326) ((emacs (24 3))) "Grammar check utility using LanguageTool" tar ((:url . "https://github.com/mhayashi1120/Emacs-langtool") (:commit . "416abc7d1c1cbb31a9bddad458366215bad0089b") (:revdesc . "416abc7d1c1c") (:keywords "docs") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (langtool-ignore-fonts . [(20210526 2340) ((emacs (25 1)) (langtool (2 2 1))) "Force langtool to ignore certain fonts" tar ((:url . "https://github.com/cjl8zf/langtool-ignore-fonts") (:commit . "a5d04c3840c293f1b11db3c28e7210d0d20f53af") (:revdesc . "a5d04c3840c2") (:authors ("Christopher Lloyd" . "cjl8zf@virginia.edu")) (:maintainers ("Christopher Lloyd" . "cjl8zf@virginia.edu")) (:maintainer "Christopher Lloyd" . "cjl8zf@virginia.edu"))]) + (langtool-popup . [(20230222 401) ((emacs (25 1)) (popup (0 5 9))) "Popup message extension for langtool.el" tar ((:url . "https://github.com/mhayashi1120/Emacs-langtool") (:commit . "d86101eafe9a994eb0425e08e7c1795e9cb0cd42") (:revdesc . "d86101eafe9a") (:keywords "docs") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (language-detection . [(20161123 1813) ((emacs (24)) (cl-lib (0 5))) "Automatic language detection from code snippets" tar ((:url . "https://github.com/andreasjansson/language-detection.el") (:commit . "38f5d294870678efc6ccf94ce6e8175a58f93025") (:revdesc . "38f5d2948706") (:authors ("Andreas Jansson" . "andreas@jansson.me.uk")) (:maintainers ("Andreas Jansson" . "andreas@jansson.me.uk")) (:maintainer "Andreas Jansson" . "andreas@jansson.me.uk"))]) + (language-id . [(20241024 854) ((emacs (24 3))) "Library to work with programming language identifiers" tar ((:url . "https://github.com/lassik/emacs-language-id") (:commit . "dbfbc4903ffb042552b458fac76ee9f67a022036") (:revdesc . "dbfbc4903ffb") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (languagetool . [(20250924 1813) ((emacs (27 1))) "LanguageTool integration for grammar and spell check" tar ((:url . "https://github.com/PillFall/Emacs-LanguageTool.el") (:commit . "fa3c08c369bf53f3311f1f365b54271cf126e4dd") (:revdesc . "fa3c08c369bf") (:keywords "grammar" "text" "docs" "tools" "convenience" "checker") (:authors ("Joar Buitrago" . "jebuitragoc@unal.edu.co")) (:maintainers ("Joar Buitrago" . "jebuitragoc@unal.edu.co")) (:maintainer "Joar Buitrago" . "jebuitragoc@unal.edu.co"))]) + (lark-mode . [(20231221 340) ((emacs (24 3))) "Major mode for editing Lark parser code" tar ((:url . "https://github.com/taquangtrung/lark-mode") (:commit . "0a0724b0f64d433d81f90ba8f86e618f8c33522a") (:revdesc . "0a0724b0f64d") (:keywords "languages"))]) + (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 ((:url . "https://github.com/mihaiolteanu/lastfm.el/") (:commit . "b4b19f0aadc5087febeeb3f59944a89c4cdcf325") (:revdesc . "b4b19f0aadc5") (:keywords "multimedia" "api") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm"))]) + (lastpass . [(20201229 2109) ((emacs (24 4)) (seq (1 9)) (cl-lib (0 5))) "LastPass command wrapper" tar ((:url . "https://github.com/storvik/emacs-lastpass") (:commit . "2366de7824b6c5f8e9ec6811d219dc06794e8630") (:revdesc . "2366de7824b6") (:keywords "extensions" "processes" "lpass" "lastpass"))]) + (latex-change-env . [(20250210 637) ((emacs (27 1)) (auctex (13 1))) "Change in and out of LaTeX environments" tar ((:url . "https://github.com/slotThe/change-env") (:commit . "c39f8fbc6c378e6969bd94a19213f548c88a949c") (:revdesc . "c39f8fbc6c37") (:keywords "convenience" "tex") (:authors ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainers ("Tony Zorman" . "soliditsallgood@mailbox.org")) (:maintainer "Tony Zorman" . "soliditsallgood@mailbox.org"))]) + (latex-extra . [(20240909 2043) ((auctex (11 86 1)) (cl-lib (0 5))) "Adds several useful functionalities to LaTeX-mode" tar ((:url . "http://github.com/Malabarba/latex-extra") (:commit . "81507c1b63eb3898b654818de047544f662c1f73") (:revdesc . "81507c1b63eb") (:keywords "tex") (:authors ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "artur@endlessparentheses.com"))]) + (latex-labeler . [(20240827 2337) ((emacs (28 1))) "Simplify equation labeling in LaTeX" tar ((:url . "https://github.com/X9hRRDys/latex-labeler") (:commit . "6ca15d7dea4f8b2fc0878f6be19438e84061e894") (:revdesc . "6ca15d7dea4f") (:keywords "tools"))]) + (latex-math-preview . [(20211228 641) nil "Preview LaTeX mathematical expressions" tar ((:url . "https://gitlab.com/latex-math-preview/latex-math-preview") (:commit . "1c082179493eed3ce8bc255f87791eb4acb1fbdb") (:revdesc . "1c082179493e") (:keywords "latex" "tex") (:authors ("Takayuki YAMAGUCHI" . "d@ytak.info")) (:maintainers ("Takayuki YAMAGUCHI" . "d@ytak.info")) (:maintainer "Takayuki YAMAGUCHI" . "d@ytak.info"))]) + (latex-pretty-symbols . [(20151112 1044) nil "Display many latex symbols as their unicode counterparts" tar ((:url . "https://bitbucket.org/mortiferus/latex-pretty-symbols.el") (:commit . "83d5888147bb734a94dfd4847a11e975a7d86ba8") (:revdesc . "83d5888147bb") (:keywords "convenience" "display") (:authors ("Erik Parmann" . "eparmann@gmail.com")) (:maintainers ("Erik Parmann" . "eparmann@gmail.com")) (:maintainer "Erik Parmann" . "eparmann@gmail.com"))]) + (latex-preview-pane . [(20181008 1822) nil "Makes LaTeX editing less painful by providing a updatable preview pane" tar ((:url . "http://www.emacswiki.org/emacs/LaTeXPreviewPane") (:commit . "5297668a89996b50b2b62f99cba01cc544dbed2e") (:revdesc . "5297668a8999") (:keywords "latex" "preview") (:authors ("John L. Singleton" . "jsinglet@gmail.com")) (:maintainers ("John L. Singleton" . "jsinglet@gmail.com")) (:maintainer "John L. Singleton" . "jsinglet@gmail.com"))]) + (latex-table-wizard . [(20230903 2104) ((emacs (27 1)) (auctex (12 1)) (transient (0 3 7))) "Magic editing of LaTeX tables" tar ((:url . "https://github.com/enricoflor/latex-table-wizard") (:commit . "b55d215dbef321194dbf10553d4c0d3b244a50f0") (:revdesc . "b55d215dbef3") (:keywords "convenience") (:authors ("Enrico Flor" . "enrico@eflor.net")) (:maintainers ("Enrico Flor" . "enrico@eflor.net")) (:maintainer "Enrico Flor" . "enrico@eflor.net"))]) + (latex-unicode-math-mode . [(20231210 2234) nil "Input method for Unicode math symbols" tar ((:url . "https://github.com/Christoph-D/latex-unicode-math-mode") (:commit . "af6a28c3c7e8652f1e9c124beeccaa81133b1d88") (:revdesc . "af6a28c3c7e8") (:authors ("Christoph Dittmann" . "github@christoph-d.de")) (:maintainers ("Christoph Dittmann" . "github@christoph-d.de")) (:maintainer "Christoph Dittmann" . "github@christoph-d.de"))]) + (latexdiff . [(20190827 1651) ((emacs (24 4))) "Latexdiff integration in Emacs" tar ((:url . "http://github.com/galaunay/latexdiff.el") (:commit . "56d0b240867527d1b43d3ddec14059361929b971") (:revdesc . "56d0b2408675") (:keywords "tex" "vc" "tools" "git" "helm") (:authors ("Launay Gaby" . "gaby.launay@tutanota.com")) (:maintainers ("Launay Gaby" . "gaby.launay@tutanota.com")) (:maintainer "Launay Gaby" . "gaby.launay@tutanota.com"))]) + (latvian-holidays . [(20230326 2030) nil "Latvian holidays for the calendar" tar ((:url . "https://github.com/ashumilov/latvian-holidays") (:commit . "6b82f3bd9682c97f19a65b7d359ce7a02ec9cfec") (:revdesc . "6b82f3bd9682") (:keywords "calendar") (:authors ("Alexander Shumilov" . "alexander.shumilov@me.com")) (:maintainers ("Alexander Shumilov" . "alexander.shumilov@me.com")) (:maintainer "Alexander Shumilov" . "alexander.shumilov@me.com"))]) + (launch . [(20130619 2204) nil "Launch files with OS-standard associated applications" tar ((:url . "https://github.com/sfllaw/emacs-launch") (:commit . "e7c3b573fc05fe4d3d322389079909311542e799") (:revdesc . "e7c3b573fc05") (:keywords "convenience" "processes") (:authors ("Simon Law" . "sfllaw@sfllaw.ca")) (:maintainers ("Simon Law" . "sfllaw@sfllaw.ca")) (:maintainer "Simon Law" . "sfllaw@sfllaw.ca"))]) + (launch-mode . [(20170106 512) ((emacs (24 4))) "Major mode for launch-formatted text" tar ((:url . "https://github.com/iory/launch-mode") (:commit . "25ebd4ba77afcbe729901eb74923dbe9ae81c313") (:revdesc . "25ebd4ba77af") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainers ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com"))]) + (launchctl . [(20210611 2243) ((emacs (24 1))) "Interface to launchctl on Mac OS X" tar ((:url . "http://github.com/pekingduck/launchctl-el") (:commit . "c9b7e93f5ec6fa504dfb03d60571cf3e5dc38e12") (:revdesc . "c9b7e93f5ec6") (:keywords "tools" "convenience") (:authors ("Peking Duck" . "github.com/pekingduck")) (:maintainers ("Peking Duck" . "github.com/pekingduck")) (:maintainer "Peking Duck" . "github.com/pekingduck"))]) + (lavender-theme . [(20170808 1313) ((emacs (24 0))) "An Emacs 24 theme based on Lavender (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "ef5e959b95d7fb8152137bc186c4c24e986c1e3c") (:revdesc . "ef5e959b95d7"))]) + (lavenderless-theme . [(20201222 1627) ((colorless-themes (0 2))) "A mostly colorless version of lavender-theme" tar ((:url . "https://git.sr.ht/~lthms/colorless-themes.el") (:commit . "1b2a507b3b7f9559c944af8fc7531a60b38ae0c3") (:revdesc . "1b2a507b3b7f") (:keywords "faces" "theme") (:authors ("Thomas Letan" . "lthms@soap.coffee")) (:maintainers ("Thomas Letan" . "lthms@soap.coffee")) (:maintainer "Thomas Letan" . "lthms@soap.coffee"))]) + (lazy-ruff . [(20241127 1434) ((emacs (24 3)) (org (9 1))) "Integration with the Ruff Python linter/formatter" tar ((:url . "http://github.com/christophermadsen/emacs-lazy-ruff") (:commit . "4eeea363a133e0e7ed7c02a5e2f1f7b63a78c3f4") (:revdesc . "4eeea363a133") (:keywords "languages" "tools"))]) + (lcb-mode . [(20160816 630) ((emacs (24))) "LiveCode Builder major mode" tar ((:url . "https://github.com/peter-b/lcb-mode") (:commit . "be0768e9aa6f9b8e76f2230f4f7f4d152a766b9a") (:revdesc . "be0768e9aa6f") (:keywords "languages") (: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"))]) + (lcr . [(20221012 742) ((dash (2 12 0)) (emacs (25 1))) "Lightweight coroutines" tar ((:url . "https://github.com/jyp/lcr") (:commit . "6c345112ffb59f3e7babca6c83942f686b5f554b") (:revdesc . "6c345112ffb5") (:keywords "tools") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainers ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com"))]) + (le-gpt . [(20251203 1304) ((emacs (28 1)) (markdown-mode (2 6))) "Emacs on steroids with GPT" tar ((:url . "https://github.com/AnselmC/le-gpt.el") (:commit . "a05675c3855fe9a5fd3e4a14b9737df22fcfddbe") (:revdesc . "a05675c3855f") (:keywords "openai" "anthropic" "deepseek" "gpt" "claude" "language" "copilot" "convenience" "tools" "llm") (:authors ("Andreas Stuhlmueller" . "andreas@ought.org")) (:maintainers ("Anselm Coogan" . "anselm.coogan@gmail.com")) (:maintainer "Anselm Coogan" . "anselm.coogan@gmail.com"))]) + (le-thesaurus . [(20241229 1950) ((request (0 3 2)) (emacs (24 4))) "Query thesaurus.com for synonyms of a given word" tar ((:url . "https://github.com/AnselmC/le-thesaurus.el") (:commit . "8c8ea595678da69df817a173ec043ab1b17d96c3") (:revdesc . "8c8ea595678d"))]) + (leader-key . [(20231001 2236) ((emacs (25 1))) "Leader key configuration (e.g. for god-mode)" tar ((:url . "https://github.com/havner/leader-key") (:commit . "64d2a29e2f667399869f2b0334855a647211e50e") (:revdesc . "64d2a29e2f66") (:keywords "convenience" "keys" "keybinding" "config" "leader" "god" "god-mode") (:authors ("Lukasz Pawelczyk" . "havner@gmail.com")) (:maintainers ("Lukasz Pawelczyk" . "havner@gmail.com")) (:maintainer "Lukasz Pawelczyk" . "havner@gmail.com"))]) + (leaf . [(20241018 516) ((emacs (24 1))) "Simplify your init.el configuration, extended use-package" tar ((:url . "https://github.com/conao3/leaf.el") (:commit . "69c9b057cdeee560450c1d04a9a058235ecff0f7") (:revdesc . "69c9b057cdee") (:keywords "lisp" "settings") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (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 ((:url . "https://github.com/conao3/leaf-convert.el") (:commit . "da86654f1021445cc42c1a5a9195f15097352209") (:revdesc . "da86654f1021") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (leaf-defaults . [(20210301 118) ((emacs (26 1)) (leaf (4 1)) (leaf-keywords (1 1))) "Awesome leaf config collections" tar ((:url . "https://github.com/conao3/leaf-defaults.el") (:commit . "96ce39d4f16736f1e654e24eac16a2603976c724") (:revdesc . "96ce39d4f167") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (leaf-keywords . [(20240808 2302) ((emacs (24 4)) (leaf (3 5 0))) "Additional leaf.el keywords for external packages" tar ((:url . "https://github.com/conao3/leaf-keywords.el") (:commit . "82ec27e3441900daedeaaebca509181f964da81f") (:revdesc . "82ec27e34419") (:keywords "lisp" "settings") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (leaf-manager . [(20211225 624) ((emacs (26 1)) (leaf (4 1)) (leaf-convert (1 0)) (ppp (2 1))) "Configuration manager for leaf based init.el" tar ((:url . "https://github.com/conao3/leaf-manager.el") (:commit . "a9fb7fda1432d0cf6bd8546d98a11b3fbe1d84e6") (:revdesc . "a9fb7fda1432") (:keywords "convenience" "leaf") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (leaf-tree . [(20211105 19) ((emacs (25 1)) (imenu-list (0 8))) "Interactive side-bar feature for init.el using leaf" tar ((:url . "https://github.com/conao3/leaf-tree.el") (:commit . "89c3b8842df067bba67663d309f43aa311acdccd") (:revdesc . "89c3b8842df0") (:keywords "convenience" "leaf") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (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 ((:url . "https://github.com/aborn/leanote-emacs") (:commit . "d499e7b59bb1f1a2fabc0e4c26fb101ed62ebc7b") (:revdesc . "d499e7b59bb1") (:keywords "leanote" "note" "markdown") (:authors ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainers ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainer "Aborn Jiang" . "aborn.jiang@gmail.com"))]) + (learn-ocaml . [(20211003 1412) ((emacs (25 1))) "Emacs frontend for learn-ocaml" tar ((:url . "https://github.com/pfitaxel/learn-ocaml.el") (:commit . "abdc263537a6a534152a4eaaa17b2c3e4e10418b") (:revdesc . "abdc263537a6"))]) + (ledger-import . [(20230904 1837) ((emacs (25 1))) "Fetch OFX files from bank and push them to Ledger" tar ((:url . "https://gitlab.petton.fr/mpdel/libmpdel") (:commit . "e47e8508794462986b982d6ce3d05bcd17c19242") (:revdesc . "e47e85087944") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (ledger-mode . [(20251219 2350) ((emacs (26 1))) "Helper code for use with the \"ledger\" command-line tool" tar ((:url . "https://github.com/ledger/ledger-mode") (:commit . "40e6a167530e21968e3ce7b8cb74e7595cb6009a") (:revdesc . "40e6a167530e"))]) + (leerzeichen . [(20220626 835) nil "Minor mode to display whitespace characters" tar ((:url . "http://github.com/fgeller/leerzeichen.el") (:commit . "9d4126d5f6563569080845a69b0867119a9fd6ea") (:revdesc . "9d4126d5f656") (:keywords "whitespace" "characters") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainers ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com"))]) + (leetcode . [(20250417 1453) ((emacs (28 1)) (s (1 13 0)) (aio (1 0)) (log4e (0 3 3))) "An leetcode client" tar ((:url . "https://github.com/kaiwk/leetcode.el") (:commit . "7f1d6804ed3b9de98d2737e1eab275cd9cbcdb16") (:revdesc . "7f1d6804ed3b") (:keywords "extensions" "tools") (:authors ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainers ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainer "Wang Kai" . "kaiwkx@gmail.com"))]) + (legalese . [(20200119 2248) nil "Add legalese to your program files" tar ((:url . "https://github.com/jorgenschaefer/legalese") (:commit . "e465471d2d5a62d35073d93e0f8d40387a82e302") (:revdesc . "e465471d2d5a") (:keywords "convenience") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx"))]) + (lem . [(20250806 924) ((emacs (29 1)) (fedi (0 2)) (markdown-mode (2 5))) "A lemmy client" tar ((:url . "https://codeberg.org/martianh/lem.el") (:commit . "a0f4fa89fe73dfe7412f5d25d6e0619abf8cff14") (:revdesc . "a0f4fa89fe73") (:keywords "multimedia" "comm" "web" "fediverse") (:authors ("martian hiatus" . "mousebot@disroot.org")) (:maintainers ("martian hiatus" . "mousebot@disroot.org")) (:maintainer "martian hiatus" . "mousebot@disroot.org"))]) + (lemon-mode . [(20130216 1304) nil "A major mode for editing lemon grammar files" tar ((:url . "https://github.com/mooz/lemon-mode") (:commit . "155bfced6c9afc8072a0133d3d1baa54c6d67430") (:revdesc . "155bfced6c9a") (:keywords "lemon") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainers ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com"))]) + (lentic . [(20240303 1456) ((emacs (25)) (m-buffer (0 13)) (dash (2 5 0))) "One buffer as a view of another" tar ((:url . "https://github.com/phillord/lentic") (:commit . "180c1082c016de790f9e6596b63329657c83ce20") (:revdesc . "180c1082c016") (: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 ((:url . "https://github.com/phillord/lentic-server") (:commit . "732b88e7a183707ba65c38e8b3517cac42572644") (:revdesc . "732b88e7a183") (: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 . [(20250109 1131) ((emacs (28 1)) (s (1 12 0)) (aio (1 0))) "Interface for dict.leo.org" tar ((:url . "https://codeberg.org/martianh/emacs-leo") (:commit . "24020b11de5975f71f4b57efbb9ef874ec0bcd87") (:revdesc . "24020b11de59") (:keywords "convenience" "translate" "wp" "dictionary") (:authors ("M.T. Enders" . "michaelATmichael-enders.com") ("Marty Hiatt" . "martianhiatusATriseup.net")) (:maintainers ("M.T. Enders" . "michaelATmichael-enders.com") ("Marty Hiatt" . "martianhiatusATriseup.net")) (:maintainer "M.T. Enders" . "michaelATmichael-enders.com"))]) + (lesim-mode . [(20230627 1350) ((emacs (28 1))) "Major mode for Learning Simulator scripts" tar ((:url . "https://github.com/drghirlanda/lesim-mode") (:commit . "74bffc63058f64b3399e685cf0fe0a8f18cc491e") (:revdesc . "74bffc63058f") (:keywords "languages" "faces") (:authors ("Stefano Ghirlanda" . "drghirlanda@gmail.com")) (:maintainers ("Stefano Ghirlanda" . "drghirlanda@gmail.com")) (:maintainer "Stefano Ghirlanda" . "drghirlanda@gmail.com"))]) + (less-css-mode . [(20161001 453) nil "Major mode for editing LESS CSS files (lesscss.org)" tar ((:url . "https://github.com/purcell/less-css-mode") (:commit . "59bf174c4e9f053ec2a7ef8c8a8198490390f6fb") (:revdesc . "59bf174c4e9f") (:keywords "less" "css" "mode") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (letcheck . [(20160202 1948) nil "Check the erroneous assignments in let forms" tar ((:url . "https://github.com/Fuco1/letcheck") (:commit . "edf188ca2f85349e971b83f164c6484264e79426") (:revdesc . "edf188ca2f85") (:keywords "convenience") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (letterbox-mode . [(20170702 125) ((emacs (24 3))) "Hide sensitive text on a buffer" tar ((:url . "http://github.com/pacha64/letterbox-mode") (:commit . "88c67a51d67216d569a28e8423200883fde096dd") (:revdesc . "88c67a51d672") (:keywords "password" "convenience") (:authors ("Fernando Leboran" . "f.leboran@gmail.com")) (:maintainers ("Fernando Leboran" . "f.leboran@gmail.com")) (:maintainer "Fernando Leboran" . "f.leboran@gmail.com"))]) + (leuven-theme . [(20251223 1627) nil "Elegant Emacs color theme for a white background" tar ((:url . "https://github.com/fniessen/emacs-leuven-theme") (:commit . "1711662e934debdfa00884ebe23b8fc00f78a191") (:revdesc . "1711662e934d") (:keywords "color" "theme") (:authors ("Fabrice Niessen" . "")) (:maintainers ("Fabrice Niessen" . "")) (:maintainer "Fabrice Niessen" . ""))]) + (levenshtein . [(20090830 1040) nil "Edit distance between two strings" tar ((:url . "https://github.com/emacsorphanage/levenshtein") (:commit . "070925197ebf6b704e6e00c4f2d2ec783f3df38c") (:revdesc . "070925197ebf") (:keywords "lisp") (:authors ("Aaron S. Hawley" . "ashawleyatuvmdotedu")) (:maintainers ("Aaron S. Hawley" . "ashawleyatuvmdotedu")) (:maintainer "Aaron S. Hawley" . "ashawleyatuvmdotedu"))]) + (lexbind-mode . [(20141027 1429) nil "Puts the value of lexical-binding in the mode line" tar ((:url . "https://github.com/spacebat/lexbind-mode") (:commit . "fa0a6848c1cfd3fbf45db43dc2deef16377d887d") (:revdesc . "fa0a6848c1cf") (:keywords "convenience" "lisp") (:authors ("Andrew Kirkpatrick" . "ubermonk@gmail.com")) (:maintainers ("Andrew Kirkpatrick" . "ubermonk@gmail.com")) (:maintainer "Andrew Kirkpatrick" . "ubermonk@gmail.com"))]) + (lexic . [(20220501 1432) ((emacs (26 3))) "A major mode to find out more about words" tar ((:url . "https://github.com/tecosaur/lexic") (:commit . "f9b3de4d9c2dd1ce5022383e1a504b87bf7d1b09") (:revdesc . "f9b3de4d9c2d") (:authors ("pluskid" . "pluskid@gmail.com") ("gucong" . "gucong43216@gmail.com") ("TEC" . "tec@tecosaur.com")) (:maintainers ("TEC" . "tec@tecosaur.com")) (:maintainer "TEC" . "tec@tecosaur.com"))]) + (lf . [(20210808 1921) ((s (1 12 0)) (dash (2 16 0)) (emacs (27 1))) "A Language Features library for Emacs Lisp" tar ((:url . "https://alhassy.github.io/lf.el/") (:commit . "35db92ca765a0544721fdeea036d77b7d192d083") (:revdesc . "35db92ca765a") (:keywords "convenience" "programming") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com"))]) + (lfe-mode . [(20250702 1243) nil "Lisp Flavoured Erlang mode" tar ((:url . "https://github.com/rvirding/lfe") (:commit . "ebd7d221c52b6bf8c47c9e4f7daf15b3dee4d3fa") (:revdesc . "ebd7d221c52b"))]) + (lgr . [(20230407 1317) ((emacs (26 1))) "A fully featured logging framework" tar ((:url . "https://github.com/Fuco1/emacs-lgr") (:commit . "4ab6c22bcbc533acace3c854876f40fa9d2f7819") (:revdesc . "4ab6c22bcbc5") (:keywords "tools") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (libbcel . [(20230826 1233) ((emacs (26 1)) (request (0 3 1))) "Library to connect to basecamp 3 API" tar ((:url . "https://gitlab.petton.fr/bcel/libbcel") (:commit . "35679c86b6d73817fef17df4119a7a45dfc9f33d") (:revdesc . "35679c86b6d7") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (libelcouch . [(20230903 800) ((emacs (26 1)) (request (0 3 0))) "Communication with CouchDB" tar ((:url . "https://github.com/DamienCassou/libelcouch/") (:commit . "5202084caee9fd236a18afc6f83293f05168a4c3") (:revdesc . "5202084caee9") (:keywords "tools") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (liberime . [(20240927 141) ((emacs (25 1))) "Rime elisp binding" tar ((:url . "https://github.com/merrickluo/liberime") (:commit . "23c0caa1bf73f4e9ab58d52dc46cf21088dc6c54") (:revdesc . "23c0caa1bf73") (:keywords "convenience" "chinese" "input-method" "rime"))]) + (liblouis . [(20220426 657) ((emacs (26 1))) "Mode for editing liblouis braille translation tables" tar ((:url . "https://github.com/liblouis/liblouis-mode") (:commit . "a341a0c434cdbe7f46956c8db13203c3fc941a34") (:revdesc . "a341a0c434cd") (:keywords "languages") (:authors ("Christian Egli" . "christian.egli@sbs.ch")) (:maintainers ("Christian Egli" . "christian.egli@sbs.ch")) (:maintainer "Christian Egli" . "christian.egli@sbs.ch"))]) + (libmpdee . [(20220825 957) nil "Client end library for mpd, a music playing daemon" tar ((:url . "https://github.com/andyetitmoves/libmpdee") (:commit . "9a84e074385cd085622f94e720a968a0e05ceae5") (:revdesc . "9a84e074385c") (:keywords "music" "mpd") (:authors ("Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com")) (:maintainers ("Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com")) (:maintainer "Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com"))]) + (libmpdel . [(20250922 938) ((emacs (25 1))) "Communication with an MPD server" tar ((:url . "https://github.com/mpdel/libmpdel") (:commit . "f2cb01c8d004b5fbfa937579e899035a47d2a5f2") (:revdesc . "f2cb01c8d004") (:keywords "multimedia") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (librera-sync . [(20230902 1006) ((emacs (26 1)) (f (0 17)) (dash (2 12 0))) "Sync document's position with Librera Reader for Android" tar ((:url . "https://github.com/jumper047/librera-sync") (:commit . "19cf9496d71daac67ce4b0ebcdf7f6ac2c3e689a") (:revdesc . "19cf9496d71d") (:keywords "multimedia" "sync") (:authors ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainers ("Dmitriy Pshonko" . "jumper047@gmail.com")) (:maintainer "Dmitriy Pshonko" . "jumper047@gmail.com"))]) + (lice . [(20220312 2215) nil "License And Header Template" tar ((:url . "https://github.com/buzztaiki/lice-el") (:commit . "0b69ba54057146f1473e85c0760029e584e3eb13") (:revdesc . "0b69ba540571") (:keywords "template" "license" "tools") (:authors ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainer "Taiki Sugawara" . "buzz.taiki@gmail.com"))]) + (license-snippets . [(20201117 1619) ((emacs (26)) (yasnippet (0 8 0))) "LICENSE templates for yasnippet" tar ((:url . "https://github.com/sei40kr/license-snippets") (:commit . "a89988b81604fd23c43746912215770a4b861989") (:revdesc . "a89988b81604") (:keywords "tools") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainers ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com"))]) + (license-templates . [(20250101 1008) ((emacs (24 3)) (request (0 3 0))) "Create LICENSE using GitHub API" tar ((:url . "https://github.com/jcs-elpa/license-templates") (:commit . "93c4374301aa3fdb3dc67e3a7513af02e536d367") (:revdesc . "93c4374301aa") (:keywords "convenience" "license" "api" "template") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (ligature . [(20220808 1225) ((emacs (28))) "Display typographical ligatures in major modes" tar ((:url . "https://www.github.com/mickeynp/ligature.el") (:commit . "89cbd67a815f61e5001f19d64d6ec1771e867742") (:revdesc . "89cbd67a815f") (:keywords "tools" "faces") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainers ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org"))]) + (ligature-pragmatapro . [(20221127 2252) ((emacs (28)) (ligature (1 0))) "PragmataPro support for ligature.el" tar ((:url . "https://gitlab.com/wavexx/ligature-pragmatapro.el") (:commit . "85f7b15a5cf5f2ee843bc0469e03602a0251c275") (:revdesc . "85f7b15a5cf5") (:keywords "faces" "fonts" "ligatures" "programming-ligatures") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (light-soap-theme . [(20150607 1445) ((emacs (24))) "Emacs 24 theme with a light background" tar ((:url . "https://github.com/mswift42/light-soap-theme") (:commit . "76a787bd40c6b567ae68ced7f5d9f9f10725e00d") (:revdesc . "76a787bd40c6"))]) + (line-reminder . [(20250101 909) ((emacs (25 1)) (fringe-helper (1 0 1)) (ov (1 0 6)) (ht (2 0))) "Line annotation for changed and saved lines" tar ((:url . "https://github.com/emacs-vs/line-reminder") (:commit . "bab0c4cbe344ca888842278e982155a3916617d0") (:revdesc . "bab0c4cbe344") (:keywords "convenience" "annotation") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (line-up-words . [(20241121 2033) nil "Align words in an intelligent way" tar ((:url . "https://github.com/janestreet/line-up-words") (:commit . "3c1339a3fb3840dfaea50d8cb966c90b19d14925") (:revdesc . "3c1339a3fb38"))]) + (lines-at-once . [(20180422 247) ((emacs (25))) "Insert and edit multiple lines at once" tar ((:url . "https://github.com/jiahaowork/lines-at-once.el") (:commit . "a018ba90549384d52ec58c2685fd14a0f65252be") (:revdesc . "a018ba905493") (:keywords "abbrev" "tools") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainers ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com"))]) + (lingr . [(20100807 1731) nil "Lingr Client for GNU Emacs" tar ((:url . "http://github.com/lugecy/lingr-el") (:commit . "4215a8704492d3c860097cbe2649936c22c196df") (:revdesc . "4215a8704492") (:keywords "chat" "client" "internet") (:authors ("lugecy" . "lugecy@gmail.com")) (:maintainers ("lugecy" . "lugecy@gmail.com")) (:maintainer "lugecy" . "lugecy@gmail.com"))]) + (linguistic . [(20181129 2116) nil "A package for basic linguistic analysis" tar ((:url . "https://github.com/andcarnivorous/linguistic") (:commit . "23e47e98cdb09ee61883669b6d8a11bf6449862c") (:revdesc . "23e47e98cdb0") (:keywords "linguistics" "text analysis" "matching") (:authors ("Andrew Favia" . "drewlinguistics01atgmaildotcom")) (:maintainers ("Andrew Favia" . "drewlinguistics01atgmaildotcom")) (:maintainer "Andrew Favia" . "drewlinguistics01atgmaildotcom"))]) + (lingva . [(20250208 753) ((emacs (25 1))) "Access Google Translate without tracking via lingva.ml" tar ((:url . "https://codeberg.org/martianh/lingva.el") (:commit . "de11bdbd90c73106ce272e60ac030d2a9a2d5f5b") (:revdesc . "de11bdbd90c7") (:keywords "convenience" "translation" "wp" "text") (:authors ("marty hiatt" . "mousebot@disroot.org")) (:maintainers ("marty hiatt" . "mousebot@disroot.org")) (:maintainer "marty hiatt" . "mousebot@disroot.org"))]) + (link . [(20191111 446) nil "Hypertext links in text buffers" tar ((:url . "https://github.com/myrkr/dictionary-el") (:commit . "c9cad101100975e88873636bfd426b7a19304ebd") (:revdesc . "c9cad1011009") (:keywords "interface" "hypermedia") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainers ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net"))]) + (link-hint . [(20250911 57) ((avy (0 4 0)) (emacs (24 4))) "Use avy to open, copy, etc. visible links" tar ((:url . "https://github.com/noctuid/link-hint.el") (:commit . "8fda5dcb9caff5a3c49d22b82e570ac9e29af7dd") (:revdesc . "8fda5dcb9caf") (:keywords "convenience" "url" "avy" "link" "links" "hyperlink") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net"))]) + (linkin-org . [(20251116 1638) ((emacs (30 1))) "A workflow with fast, reliable links" tar ((:url . "https://github.com/Judafa/linkin-org") (:commit . "1ce63411cc48a89a5b430516f7670f8af208047d") (:revdesc . "1ce63411cc48") (:authors ("Julien Dallot" . "judafa@protonmail.com")) (:maintainers ("Julien Dallot" . "judafa@protonmail.com")) (:maintainer "Julien Dallot" . "judafa@protonmail.com"))]) + (linkode . [(20240604 53) nil "Generate a linkode snippet with region/buffer content" tar ((:url . "https://github.com/erickgnavar/linkode.el") (:commit . "5152aa3ba7a4360133efd5892f0891837af30440") (:revdesc . "5152aa3ba7a4") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io"))]) + (linphone . [(20130524 1109) nil "Emacs interface to Linphone" tar ((:url . "https://github.com/zabbal/emacs-linphone") (:commit . "99af3db941b7f4e5272bb48bff96c1ce4ceac302") (:revdesc . "99af3db941b7") (:keywords "comm") (:authors ("Yoni Rabkin" . "yonirabkin@member.fsf.org")) (:maintainers ("Yoni Rabkin" . "yonirabkin@member.fsf.org")) (:maintainer "Yoni Rabkin" . "yonirabkin@member.fsf.org"))]) + (linum-off . [(20160217 2137) nil "Provides an interface for turning line-numbering off" tar ((:url . "http://www.emacswiki.org/emacs/auto-indent-mode.el ") (:commit . "3e37baaad27d27e405f8dfe01d4ab9cd5b591353") (:revdesc . "3e37baaad27d") (:keywords "line" "numbering"))]) + (linum-relative . [(20221025 517) nil "Display relative line number in emacs" tar ((:url . "http://github.com/coldnew/linum-relative") (:commit . "8fbe89ad897921849665a3e8da18cee7d0721441") (:revdesc . "8fbe89ad8979") (:keywords "converience") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com"))]) + (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 ((:url . "https://github.com/ucsd-progsys/liquid-types.el") (:commit . "cc4bacbbf204ef9cf0756f78dfebee2c6ae14d7b") (:revdesc . "cc4bacbbf204") (:authors ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainers ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainer "Ranjit Jhala" . "jhala@cs.ucsd.edu"))]) + (liquidmetal . [(20240101 1004) ((emacs (24 4))) "A mimetic poly-alloy of the Quicksilver scoring algorithm" tar ((:url . "https://github.com/jcs-elpa/liquidmetal") (:commit . "5d100f4371e0d10656a2bd23c0461781c3c1884b") (:revdesc . "5d100f4371e0") (:keywords "matching" "fuzzy") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (lirve . [(20240419 1918) ((emacs (26 1))) "Learn irregular verbs in English" tar ((:url . "https://github.com/tanrax/lirve.el") (:commit . "ff3031fa82d854411da40a32c6191d201b4abf09") (:revdesc . "ff3031fa82d8"))]) + (liso-theme . [(20160410 2029) nil "Eclectic Dark Theme for GNU Emacs" tar ((:url . "https://github.com/caisah/liso-theme") (:commit . "844688245eb860d23043455e165ee24503454c81") (:revdesc . "844688245eb8") (:keywords "theme" "themes") (:authors ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainers ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainer "Vlad Piersec" . "vlad.piersec@gmail.com"))]) + (lisp-butt-mode . [(20210215 2206) ((emacs (25))) "Slim Lisp Butts" tar ((:url . "https://gitlab.com/marcowahl/lisp-butt-mode") (:commit . "2b719baf0ccba79e28fcb3c2633c4849d976ac23") (:revdesc . "2b719baf0ccb") (:keywords "lisp") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com"))]) + (lisp-docstring-toggle . [(20251123 1932) ((emacs (29 1))) "Toggle Lisp docstring visibility" tar ((:url . "https://github.com/gggion/lisp-docstring-toggle") (:commit . "3379f337efe01699b40ca8cfb9ca41c166d933ad") (:revdesc . "3379f337efe0") (:keywords "lisp" "docs" "editing"))]) + (lisp-extra-font-lock . [(20181008 1921) nil "Highlight bound variables and quoted exprs" tar ((:url . "https://github.com/Lindydancer/lisp-extra-font-lock") (:commit . "4605eccbe1a7fcbd3cacf5b71249435413b4db4f") (:revdesc . "4605eccbe1a7") (:keywords "languages" "faces"))]) + (lisp-local . [(20210605 1347) ((emacs (24 3))) "Allow different Lisp indentation in each buffer" tar ((:url . "https://github.com/lispunion/emacs-lisp-local") (:commit . "22e221c9330d2b5dc07e8b2caa34c83ac7c20b0d") (:revdesc . "22e221c9330d") (:keywords "languages" "lisp") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (lispxmp . [(20170926 23) nil "Automagic emacs lisp code annotation" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/lispxmp.el") (:commit . "7ad077b4ee91ce8a42f84eeddb9fc7ea4eac7814") (:revdesc . "7ad077b4ee91") (:keywords "lisp" "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (lispy . [(20230314 1738) ((emacs (24 3)) (ace-window (0 9 0)) (iedit (0 9 9)) (swiper (0 13 4)) (hydra (0 14 0)) (zoutline (0 2 0))) "Vi-like Paredit" tar ((:url . "https://github.com/abo-abo/lispy") (:commit . "fe44efd21573868638ca86fc8313241148fabbe3") (:revdesc . "fe44efd21573") (:keywords "lisp") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (lispyville . [(20220715 29) ((lispy (0)) (evil (1 2 12)) (cl-lib (0 5)) (emacs (24 4))) "A minor mode for integrating evil with lispy" tar ((:url . "https://github.com/noctuid/lispyville") (:commit . "14ee8711d58b649aeac03581d22b10ab077f06bd") (:revdesc . "14ee8711d58b") (:keywords "vim" "evil" "lispy" "lisp" "parentheses") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net"))]) + (list-environment . [(20210930 1439) nil "A tabulated process environment editor" tar ((:url . "https://github.com/dgtized/list-environment.el") (:commit . "0a72a5a9c1abc090b25202a0387e3f766994b053") (:revdesc . "0a72a5a9c1ab") (:keywords "processes" "unix") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainers ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com"))]) + (list-packages-ext . [(20151115 1716) ((s (1 6 0)) (ht (1 5 0)) (persistent-soft (0 8 6))) "Extras for list-packages" tar ((:url . "https://github.com/laynor/list-packages-ext") (:commit . "b4dd644e4369c9aa66f5bb8895ea49ebbfd0a27a") (:revdesc . "b4dd644e4369") (:keywords "convenience" "tools") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainers ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))]) + (list-projects . [(20250428 1646) ((emacs (28 1))) "List of known projects" tar ((:url . "https://github.com/MatthewTromp/list-projects") (:commit . "8f07faf991f201593388fb85fc7c70320755b71a") (:revdesc . "8f07faf991f2") (:authors ("Matthew Tromp" . "matthewktromp@gmail.com")) (:maintainers ("Matthew Tromp" . "matthewktromp@gmail.com")) (:maintainer "Matthew Tromp" . "matthewktromp@gmail.com"))]) + (list-unicode-display . [(20241119 1152) ((emacs (24 3))) "Search for and list unicode characters by name" tar ((:url . "https://github.com/purcell/list-unicode-display") (:commit . "68feedd776082c1743588c2b07dbb6539dbe51bf") (:revdesc . "68feedd77608") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (list-utils . [(20241106 1849) nil "List-manipulation utility functions" tar ((:url . "http://github.com/rolandwalker/list-utils") (:commit . "bbea0e7cc7ab7d96e7f062014bde438aa8ffcd43") (:revdesc . "bbea0e7cc7ab") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (listenbrainz . [(20230530 741) ((emacs (27 1)) (request (0 3))) "ListenBrainz API interface" tar ((:url . "https://github.com/zzkt/listenbrainz") (:commit . "2386189ec8a19a74d7b8a46e08a9fa6d974a6305") (:revdesc . "2386189ec8a1") (:keywords "music" "scrobbling" "multimedia") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am"))]) + (lister . [(20240102 1500) ((emacs (26 1))) "Yet another list printer" tar ((:url . "https://github.com/publicimageltd/lister") (:commit . "84fbba7450ac02cbb844727a28b6f245f553df7b") (:revdesc . "84fbba7450ac") (:keywords "lisp") (:authors (nil . "joerg@joergvolbers.de")) (:maintainers (nil . "joerg@joergvolbers.de")) (:maintainer nil . "joerg@joergvolbers.de"))]) + (lit-mode . [(20141205 441) nil "Major mode for lit" tar ((:url . "https://github.com/HectorAE/lit-mode") (:commit . "c61c403afc8333a5649c5421ab1a6341dc1c7d92") (:revdesc . "c61c403afc83") (:keywords "languages" "tools") (:authors ("Hector A Escobedo" . "ninjahector.escobedo@gmail.com")) (:maintainers ("Hector A Escobedo" . "ninjahector.escobedo@gmail.com")) (:maintainer "Hector A Escobedo" . "ninjahector.escobedo@gmail.com"))]) + (litable . [(20240321 2059) ((dash (2 6 0))) "Dynamic evaluation replacement with emacs" tar ((:url . "https://github.com/Fuco1/litable") (:commit . "b83b1283ea6642ab82f536f1f3b280160404ff6b") (:revdesc . "b83b1283ea66") (:keywords "lisp") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (litanize . [(20230419 917) ((emacs (24 1)) (enlive (0 0 1)) (s (1 12 0))) "Generate \"Latour Litanies\"" tar ((:url . "https://github.com/zzkt/litanizer") (:commit . "a45902fa29c16ef9606229cb01a5441ea754f11b") (:revdesc . "a45902fa29c1") (:keywords "tools" "latour litany" "alien phenomenology" "ontography" "metaphorism" "carpentry") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am"))]) + (literal-string . [(20191023 733) ((emacs (25)) (edit-indirect (0 1 5))) "Edit string literals in a dedicated buffer" tar ((:url . "https://github.com/joodie/literal-string-mode/") (:commit . "afffa86e626798ee9f9188ea3be2d5ee6ad17c39") (:revdesc . "afffa86e6267") (:keywords "lisp" "tools" "docs") (:authors ("Joost Diepenmaat" . "joost@zeekat.nl")) (:maintainers ("Joost Diepenmaat" . "joost@zeekat.nl")) (:maintainer "Joost Diepenmaat" . "joost@zeekat.nl"))]) + (literate-calc-mode . [(20250809 1227) ((emacs (27)) (dash (2 19 1)) (s (1 12 0))) "Inline results from calc" tar ((:url . "https://github.com/sulami/literate-calc-mode.el") (:commit . "bdfdb6e526cdcf987ecded3bd9032990e5be1236") (:revdesc . "bdfdb6e526cd") (:keywords "calc" "languages" "tools"))]) + (literate-coffee-mode . [(20170211 1515) ((coffee-mode (0 5 0))) "Major-mode for Literate CoffeeScript" tar ((:url . "https://github.com/syohex/emacs-literate-coffee-mode") (:commit . "ef34c3a5b813ef078d44c29887761950ab6821c7") (:revdesc . "ef34c3a5b813") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (literate-elisp . [(20250103 132) ((emacs (26 1))) "Load Emacs Lisp code blocks from Org files" tar ((:url . "https://github.com/jingtaozf/literate-elisp") (:commit . "c559eff46dd7fe0ffc4ad7bf6dd65ee5be516368") (:revdesc . "c559eff46dd7") (:keywords "lisp" "docs" "extensions" "tools") (:authors ("Jingtao Xu" . "jingtaozf@gmail.com")) (:maintainers ("Jingtao Xu" . "jingtaozf@gmail.com")) (:maintainer "Jingtao Xu" . "jingtaozf@gmail.com"))]) + (litex-mode . [(20221107 147) ((emacs (24 4)) (units-mode (0 1 1))) "Minor mode for converting lisp to LaTeX" tar ((:url . "https://github.com/Atreyagaurav/litex-mode") (:commit . "45004b3a865771799b739d17ebb7849190fffa63") (:revdesc . "45004b3a8657") (:keywords "calculator" "lisp" "latex") (:authors ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainers ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainer "Gaurav Atreya" . "allmanpride@gmail.com"))]) + (lithium . [(20250703 243) ((emacs (25 1))) "Lightweight modal interfaces" tar ((:url . "https://github.com/countvajhula/lithium") (:commit . "5ed65cba5ff3de06764ddf1b5efc6761c932017a") (:revdesc . "5ed65cba5ff3") (:keywords "convenience" "emulations" "lisp" "tools") (:authors ("Siddhartha Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Siddhartha Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Siddhartha Kasivajhula" . "sid@countvajhula.com"))]) + (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 ((:url . "https://github.com/david-christiansen/live-code-talks") (:commit . "97f16a9ee4e6ff3e0f9291eaead772c66e3e12ae") (:revdesc . "97f16a9ee4e6") (:keywords "docs" "multimedia") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))]) + (live-preview . [(20231215 1612) ((emacs (24 4))) "Live preview by any shell command while editing" tar ((:url . "https://github.com/lassik/emacs-live-preview") (:commit . "135f2b9a8ecf81d00cf92175d144a33561e36f4c") (:revdesc . "135f2b9a8ecf") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (live-py-mode . [(20251226 1717) ((emacs (24 3))) "Live Coding in Python" tar ((:url . "http://donkirkby.github.io/live-py-plugin/") (:commit . "f5e9445867b26d096b3fa67a5ca5f9813572ac54") (:revdesc . "f5e9445867b2") (:keywords "live" "coding"))]) + (lively . [(20171005 754) nil "Interactively updating text" tar ((:url . "https://github.com/purcell/lively") (:commit . "348675828c6a81bfa1ac311ca465aad813542c1b") (:revdesc . "348675828c6a") (: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 ((:url . "https://github.com/joaotavora/emacs-livereload") (:commit . "1e501d7e46dbd476c2c7cc9d20b5ac9d41fb1955") (:revdesc . "1e501d7e46db") (:keywords "convenience") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com"))]) + (livescript-mode . [(20221015 1316) ((emacs (24 3))) "Major mode for editing LiveScript files" tar ((:url . "https://github.com/yhisamatsu/livescript-mode") (:commit . "e71a82a400e9d451c966c397bb8fa7887d35637b") (:revdesc . "e71a82a400e9") (:keywords "languages" "livescript") (:authors ("Hisamatsu Yasuyuki" . "yas@null.net")) (:maintainers ("Hisamatsu Yasuyuki" . "yas@null.net")) (:maintainer "Hisamatsu Yasuyuki" . "yas@null.net"))]) + (livid-mode . [(20131116 1344) ((skewer-mode (1 5 3)) (s (1 8 0))) "Live browser eval of JavaScript every time a buffer changes" tar ((:url . "https://github.com/pandeiro/livid-mode") (:commit . "dfe5212fa64738bc4138bfebf349fbc8bc237c26") (:revdesc . "dfe5212fa647"))]) + (ll-debug . [(20211002 1031) ((emacs (24 3))) "Low level debug tools" tar ((:url . "https://github.com/replrep/ll-debug") (:commit . "a2cfeab46e5100c348b35987fae34f9ea76d7c0b") (:revdesc . "a2cfeab46e51") (:keywords "abbrev" "convenience" "tools" "c" "lisp") (:authors ("Claus Brunzema" . "mail@cbrunzema.de")) (:maintainers ("Claus Brunzema" . "mail@cbrunzema.de")) (:maintainer "Claus Brunzema" . "mail@cbrunzema.de"))]) + (llama . [(20251101 2002) ((emacs (26 1)) (compat (30 1))) "Compact syntax for short lambda" tar ((:url . "https://github.com/tarsius/llama") (:commit . "e4803de8ab85991b6a944430bb4f543ea338636d") (:revdesc . "e4803de8ab85") (:keywords "extensions"))]) + (llama-cpp . [(20240511 1039) ((emacs (27 1)) (dash (2 19 1))) "A client for llama-cpp server" tar ((:url . "https://github.com/kurnevsky/llama.el") (:commit . "5cea3698aa63921b21888f126cae4f3ebc1baa39") (:revdesc . "5cea3698aa63") (:keywords "tools") (:authors ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainers ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainer "Evgeny Kurnevsky" . "kurnevsky@gmail.com"))]) + (llvm-ts-mode . [(20231120 1251) ((emacs (29 1))) "LLVM major mode using tree-sitter" tar ((:url . "https://github.com/nverno/llvm-ts-mode") (:commit . "9974601dcddbeffc4ad47598d63d3c1a83bb6fb9") (:revdesc . "9974601dcddb") (:keywords "languages" "tree-sitter" "llvm") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (lms . [(20210820 2200) ((emacs (25 1))) "Squeezebox / Logitech Media Server frontend" tar ((:url . "https://hg.serna.eu/emacs/lms") (:commit . "29593b4c18a570dfb2e60b196f24d407a1277daa") (:revdesc . "29593b4c18a5") (:keywords "multimedia") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainers ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com"))]) + (load-bash-alias . [(20240103 916) ((emacs (24 1)) (seq (2 16))) "Convert bash aliases into eshell ones" tar ((:url . "https://github.com/daviderestivo/load-bash-alias") (:commit . "7e7b6773f99e6aafe819596388a3a7fd09dd91a9") (:revdesc . "7e7b6773f99e") (:keywords "emacs" "bash" "eshell" "alias") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it"))]) + (load-env-vars . [(20180511 2210) ((emacs (24))) "Load environment variables from files" tar ((:url . "https://github.com/diasjorge/emacs-load-env-vars") (:commit . "5da97fabb4d36a00a29c40375fce9c16d8005ab3") (:revdesc . "5da97fabb4d3") (:keywords "lisp") (:authors ("Jorge Dias" . "jorge@mrdias.com")) (:maintainers ("Jorge Dias" . "jorge@mrdias.com")) (:maintainer "Jorge Dias" . "jorge@mrdias.com"))]) + (load-relative . [(20230214 1032) nil "Relative file load (within a multi-file Emacs package)" tar ((:url . "https://github.com/rocky/emacs-load-relative") (:commit . "b7987c265a64435299d6b02f960ed2c894c4a145") (:revdesc . "b7987c265a64") (:keywords "internal") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (load-theme-buffer-local . [(20120702 2036) nil "Install emacs24 color themes by buffer" tar ((:url . "http://github.com/vic/color-theme-buffer-local") (:commit . "bc221a88aefec5bdc137b5d5e449e1f1e55ce901") (:revdesc . "bc221a88aefe") (:keywords "faces") (:authors ("Victor Borja" . "vic.borja@gmail.com")) (:maintainers ("Victor Borja" . "vic.borja@gmail.com")) (:maintainer "Victor Borja" . "vic.borja@gmail.com"))]) + (lobsters . [(20251217 1458) ((emacs (25 1)) (request (0 2 0)) (visual-fill-column (2 4))) "A Lobsters client" tar ((:url . "https://github.com/tanrax/lobsters.el") (:commit . "58f91e5adc9660a54a3f6eb1cd49fbbeb2229b74") (:revdesc . "58f91e5adc96") (:authors ("Andros Fenollosa" . "hi@andros.dev")) (:maintainers ("Andros Fenollosa" . "hi@andros.dev")) (:maintainer "Andros Fenollosa" . "hi@andros.dev"))]) + (loc-changes . [(20230214 1036) nil "Keep track of positions even after buffer changes" tar ((:url . "https://github.com/rocky/emacs-loc-changes") (:commit . "622371e432f50626aaac82f8ee2841f71685b0fb") (:revdesc . "622371e432f5") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (loccur . [(20240610 1830) ((emacs (25 1))) "Perform an occur-like folding in current buffer" tar ((:url . "https://codeberg.org/fourier/loccur") (:commit . "f47c53a24a9d262898517c71284337821dad7ea9") (:revdesc . "f47c53a24a9d") (:keywords "matching") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainers ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com"))]) + (lockfile-mode . [(20170625 507) nil "Major mode for .lock files" tar ((:url . "https://github.com/preetpalS/emacs-lockfile-mode") (:commit . "496b6035716df0582f879f9488f296947cabead2") (:revdesc . "496b6035716d"))]) + (loco . [(20250917 1458) ((emacs (29 1))) "Enter complex key sequences with ease!" tar ((:url . "https://github.com/csmclaren/loco") (:commit . "eb9f89221d10b946482a79493d63a6fac15fb9fc") (:revdesc . "eb9f89221d10") (:keywords "abbrev" "convenience") (:authors ("Chris McLaren" . "csmclaren@me.com")) (:maintainers ("Chris McLaren" . "csmclaren@me.com")) (:maintainer "Chris McLaren" . "csmclaren@me.com"))]) + (locs-and-refs . [(20250303 2053) ((emacs (27 1)) (pcre2el (1 11))) "Define locations and references for files and buffers" tar ((:url . "https://github.com/phf-1/locs-and-refs") (:commit . "5c3f0e04ea6cc4728219dfd716d95c7d044b8030") (:revdesc . "5c3f0e04ea6c") (:authors ("Pierre-Henry FRÖHRING" . "contact@phfrohring.com")) (:maintainers ("Pierre-Henry FRÖHRING" . "contact@phfrohring.com")) (:maintainer "Pierre-Henry FRÖHRING" . "contact@phfrohring.com"))]) + (lodgeit . [(20190802 1308) nil "Paste to a lodgeit powered pastebin" tar ((:url . "https://github.com/ionrock/lodgeit-el") (:commit . "442637194d48a7105b7747b8d98772f5899f9e21") (:revdesc . "442637194d48") (:keywords "pastebin" "lodgeit") (:authors ("Eric Larson" . "eric@ionrock.org")) (:maintainers ("Eric Larson" . "eric@ionrock.org")) (:maintainer "Eric Larson" . "eric@ionrock.org"))]) + (log4e . [(20240123 1313) nil "Provide logging framework for elisp" tar ((:url . "https://github.com/aki2o/log4e") (:commit . "6d71462df9bf595d3861bfb328377346aceed422") (:revdesc . "6d71462df9bf") (:keywords "log") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (log4j-mode . [(20230826 1331) ((emacs (25 1))) "Major mode for viewing log files" tar ((:url . "https://github.com/dykstrom/log4j-mode") (:commit . "45d5e3ee918f502a160c3a131ce75fd3c38e5c6e") (:revdesc . "45d5e3ee918f") (:keywords "tools"))]) + (logalimacs . [(20131021 1829) ((popwin (0 6 2)) (popup (0 5 0)) (stem (20130120))) "Front-end to logaling-command for Ruby gems" tar ((:url . "https://github.com/logaling/logalimacs") (:commit . "8286e39502250fc6c3c6656a7f46a8eee8e9a713") (:revdesc . "8286e3950225") (:keywords "translation" "logaling-command") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (logito . [(20201226 534) ((emacs (25 1))) "Logging library for Emacs" tar ((:url . "https://github.com/sigma/logito") (:commit . "d5934ce10ba3a70d3fcfb94d742ce3b9136ce124") (:revdesc . "d5934ce10ba3") (:keywords "lisp" "extensions") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))]) + (logms . [(20250101 1008) ((emacs (27 1)) (f (0 20 0)) (s (1 9 0)) (ht (2 3))) "Log message with clickable links to context" tar ((:url . "https://github.com/jcs-elpa/logms") (:commit . "48d50cdc90b68b86333bcdb3f2ebfa4568db198c") (:revdesc . "48d50cdc90b6") (:keywords "maint" "debug" "log") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (lognav-mode . [(20240115 1637) ((emacs (24 3))) "Navigate Log Error Messages" tar ((:url . "https://github.com/ellisvelo/lognav-mode.git") (:commit . "139da9eb356b4432f416d1db49fdbfa46fb1bf8d") (:revdesc . "139da9eb356b") (:keywords "log" "error" "lognav-mode" "convenience") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainers ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com"))]) + (logpad . [(20201113 917) nil "Simulate Windows Notepad for logging" tar ((:url . "https://github.com/dertuxmalwieder/logpad.el") (:commit . "2955c6e3de40bd1e84acb4c16c7690b210f82bec") (:revdesc . "2955c6e3de40") (:keywords "files" "outlines" "notepad") (:authors ("Sven Knurr" . "git@tuxproject.de")) (:maintainers ("Sven Knurr" . "git@tuxproject.de")) (:maintainer "Sven Knurr" . "git@tuxproject.de"))]) + (logstash-conf . [(20210123 1949) nil "Basic mode for editing logstash configuration" tar ((:url . "https://github.com/Wilfred/logstash-conf.el") (:commit . "ec9b527191cd47d3b5947cb0ec3d6a8a57b121ea") (:revdesc . "ec9b527191cd") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (logview . [(20251104 1725) ((emacs (25 1)) (datetime (0 8)) (extmap (1 0)) (compat (29))) "Major mode for viewing log files" tar ((:url . "https://github.com/doublep/logview") (:commit . "9c97221dd04d7398df098e9f942efff016b60bbf") (:revdesc . "9c97221dd04d") (:keywords "files" "tools") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainers ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com"))]) + (lol-data-dragon . [(20200705 1822) ((emacs (25 1))) "Browse Champions of League of Legends on Data Dragon" tar ((:url . "https://github.com/xuchunyang/lol-data-dragon.el") (:commit . "0deec9867bd7ba96220ee2968a9b2a94fd474431") (:revdesc . "0deec9867bd7") (:keywords "games" "hypermedia"))]) + (lolcat . [(20190527 1145) ((emacs (24 3))) "Rainbows and unicorns!" tar ((:url . "https://github.com/xuchunyang/lolcat.el") (:commit . "4855e587a3b9681c077dac4b9f166dd860f439a4") (:revdesc . "4855e587a3b9") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (lolcode-mode . [(20111002 847) nil "Major mode for editing LOLCODE" tar ((:url . "http://github.com/bodil/lolcode-mode") (:commit . "280a47e0bf02ee3abc7c5b6b14345056f41981f9") (:revdesc . "280a47e0bf02") (:keywords "lolcode" "major" "mode") (:authors ("Bodil Stokke" . "lolcode@bodil.tv")) (:maintainers ("Bodil Stokke" . "lolcode@bodil.tv")) (:maintainer "Bodil Stokke" . "lolcode@bodil.tv"))]) + (look-dired . [(20160729 2323) ((look-mode (1 0))) "Extensions to look-mode for dired buffers" tar ((:url . "https://github.com/vapniks/look-dired") (:commit . "9bfa4e5e6f3810705b6426c88493ea0bf6b15640") (:revdesc . "9bfa4e5e6f38") (:keywords "convenience") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (look-mode . [(20250511 602) nil "Quick file viewer for image and text file browsing" tar ((:url . "https://github.com/petermao/look-mode") (:commit . "6d82a013ede5f9ef5493801c3071bad5f6b283bb") (:revdesc . "6d82a013ede5") (: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 ((:url . "https://github.com/Wilfred/loop.el") (:commit . "0ce77271d56b0fcdba4b3b38fed526081cd1f674") (:revdesc . "0ce77271d56b") (:keywords "loop" "while" "for each" "break" "continue") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (loophole . [(20221126 1556) ((emacs (27 1))) "Manage temporary key bindings" tar ((:url . "https://github.com/0x60df/loophole") (:commit . "dadc3fadc68b13501c4dbe89109f30deb0d3441a") (:revdesc . "dadc3fadc68b") (:keywords "convenience") (:authors ("0x60DF" . "0x60df@gmail.com")) (:maintainers ("0x60DF" . "0x60df@gmail.com")) (:maintainer "0x60DF" . "0x60df@gmail.com"))]) + (loopy . [(20251217 2120) ((emacs (28 1)) (map (3 3 1)) (seq (2 22)) (compat (29 1 3)) (stream (2 4 0))) "A looping macro" tar ((:url . "https://github.com/okamsn/loopy") (:commit . "fff3936e6156a88b9b4f2e113fb0eaff5062952b") (:revdesc . "fff3936e6156") (:keywords "extensions"))]) + (loopy-dash . [(20241228 323) ((emacs (25 1)) (loopy (0 13 0)) (dash (2 19))) "Dash destructuring for `loopy'" tar ((:url . "https://github.com/okamsn/loopy") (:commit . "56c8413dbcffef2b1a0896d53584296619cb1504") (:revdesc . "56c8413dbcff") (:keywords "extensions"))]) + (lorem-ipsum . [(20221214 1857) nil "Insert dummy pseudo Latin text" tar ((:url . "https://github.com/jschaf/emacs-lorem-ipsum") (:commit . "4e87a899868e908a7a9e1812831d76c8d072f885") (:revdesc . "4e87a899868e") (:keywords "tools" "language" "convenience") (:authors ("Jean-Philippe Theberge" . "(jphil21@sourceforge.net)")) (:maintainers ("Joe Schafer" . "(joe@jschaf.com)")) (:maintainer "Joe Schafer" . "(joe@jschaf.com)"))]) + (lox-mode . [(20200619 1700) ((emacs (24 3))) "Major mode for the Lox programming language" tar ((:url . "https://github.com/timmyjose-projects/lox-mode") (:commit . "083a2299e188a516d1e46ef2dd1cbb89db1aec49") (:revdesc . "083a2299e188") (:keywords "languages" "lox") (:authors ("Timmy Jose" . "zoltan.jose@gmail.com")) (:maintainers ("Timmy Jose" . "zoltan.jose@gmail.com")) (:maintainer "Timmy Jose" . "zoltan.jose@gmail.com"))]) + (lox-ts-mode . [(20240820 345) ((emacs (29 1))) "Major mode for Lox using tree-sitter" tar ((:url . "https://github.com/nverno/lox-ts-mode") (:commit . "3a482f6a96318d617d35683089d5edb405cd0752") (:revdesc . "3a482f6a9631") (:keywords "lox" "tree-sitter" "languages") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (lpy . [(20231026 1525) ((emacs (25 1)) (lispy (0 27 0))) "A lispy interface to Python" tar ((:url . "https://github.com/abo-abo/lpy") (:commit . "2c086ec162d4456b99a6095c3c335382a8304734") (:revdesc . "2c086ec162d4") (:keywords "python" "lisp") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (lsp-cfn . [(20240112 921) ((emacs (27 0)) (lsp-mode (8 0 0)) (yaml-mode (0 0 15))) "LSP integration for cfn-lsp-extra" tar ((:url . "https://github.com/LaurenceWarne/lsp-cfn.el") (:commit . "2297533003118ebd9db0116b4d3486a987e98ca9") (:revdesc . "229753300311"))]) + (lsp-dart . [(20250301 2106) ((emacs (28 1)) (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 ((:url . "https://emacs-lsp.github.io/lsp-dart") (:commit . "2170823139269b77c39e3bf7600ff6c751a73b0d") (:revdesc . "217082313926") (:keywords "languages" "extensions"))]) + (lsp-docker . [(20250228 2210) ((emacs (28 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 ((:url . "https://github.com/emacs-lsp/lsp-docker") (:commit . "3960c73349e5658220f0f48587894ac098e62b97") (:revdesc . "3960c73349e5") (:keywords "languages" "langserver") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com"))]) + (lsp-focus . [(20250825 539) ((emacs (28 1)) (focus (0 1 1)) (lsp-mode (6 1))) "Focus.el support for lsp-mode" tar ((:url . "https://github.com/emacs-lsp/lsp-focus") (:commit . "4621d310e780e384cbe93d5680fa9ec5d03e2c73") (:revdesc . "4621d310e780") (:keywords "languages" "lsp-mode"))]) + (lsp-grammarly . [(20250226 2340) ((emacs (28 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 ((:url . "https://github.com/emacs-grammarly/lsp-grammarly") (:commit . "7b788f97d21d689d152c31e7876a04813391d48a") (:revdesc . "7b788f97d21d") (:keywords "convenience" "lsp" "grammarly" "checker") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (lsp-haskell . [(20251121 1710) ((emacs (28 1)) (lsp-mode (3 0))) "Haskell support for lsp-mode" tar ((:url . "https://github.com/emacs-lsp/lsp-haskell") (:commit . "871a0ef2e98b3a749d0b69d958698000ca5640d3") (:revdesc . "871a0ef2e98b") (:keywords "haskell"))]) + (lsp-intellij . [(20180831 2051) ((emacs (25 1)) (lsp-mode (4 1))) "Intellij lsp client" tar ((:url . "https://github.com/Ruin0x11/lsp-intellij") (:commit . "cf30f0ac63bd0140e758840b8ab070e8313697b2") (:revdesc . "cf30f0ac63bd") (:keywords "languages" "processes" "tools") (:authors ("Ruin0x11" . "ipickering2@gmail.com")) (:maintainers ("Ruin0x11" . "ipickering2@gmail.com")) (:maintainer "Ruin0x11" . "ipickering2@gmail.com"))]) + (lsp-ivy . [(20250825 512) ((emacs (28 1)) (dash (2 14 1)) (lsp-mode (6 2 1)) (ivy (0 13 0))) "LSP ivy integration" tar ((:url . "https://github.com/emacs-lsp/lsp-ivy") (:commit . "2927cbc776477e23d4a1062568d55793eed33c51") (:revdesc . "2927cbc77647") (:keywords "languages" "debug"))]) + (lsp-java . [(20251118 1411) ((emacs (28 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 ((:url . "https://github.com/emacs-lsp/lsp-java") (:commit . "094593d9c13d6d0b03d526d46e7fb0ee28c29afc") (:revdesc . "094593d9c13d") (:keywords "languague" "tools"))]) + (lsp-javacomp . [(20190124 1755) ((emacs (25 1)) (lsp-mode (3 0)) (s (1 2 0))) "Provide Java IDE features powered by JavaComp" tar ((:url . "https://github.com/tigersoldier/lsp-javacomp") (:commit . "82aa4ad6ca03a74565c35e855b318b1887bcd89b") (:revdesc . "82aa4ad6ca03") (:keywords "java" "tools" "lsp"))]) + (lsp-jedi . [(20230824 1908) ((emacs (25 1)) (lsp-mode (6 0))) "Lsp client plugin for Python Jedi Language Server" tar ((:url . "http://github.com/fredcamps/lsp-jedi") (:commit . "3c828df8dd422dbb94856cc99db6f9acb52b871d") (:revdesc . "3c828df8dd42") (:keywords "language-server" "tools" "python" "jedi" "ide") (:authors ("Fred Campos" . "fred.tecnologia@gmail.com")))]) + (lsp-julia . [(20230915 654) ((emacs (25 1)) (lsp-mode (6 3)) (julia-mode (0 3))) "Julia support for lsp-mode" tar ((:url . "https://github.com/gdkrmr/lsp-julia") (:commit . "c869b2f6c05a97e5495ed3cc6710a33b4faf41a2") (:revdesc . "c869b2f6c05a") (:keywords "languages" "tools") (: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"))]) + (lsp-latex . [(20251104 1507) ((emacs (29 1)) (lsp-mode (6 0)) (consult (0 35))) "LSP-mode client for LaTeX, on texlab" tar ((:url . "https://github.com/ROCKTAKEY/lsp-latex") (:commit . "a9ac457141f0aa15505b61ded3f12d0ad477b771") (:revdesc . "a9ac457141f0") (:keywords "languages" "tex") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (lsp-ltex . [(20250228 2215) ((emacs (28 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" tar ((:url . "https://github.com/emacs-languagetool/lsp-ltex") (:commit . "3cfb4ed92b71ab63daaab77962fd6dd23a2851e7") (:revdesc . "3cfb4ed92b71") (:keywords "convenience" "lsp" "languagetool" "checker") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (lsp-metals . [(20250228 2145) ((emacs (28 1)) (scala-mode (0 23)) (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))) "Scala Client settings" tar ((:url . "https://github.com/emacs-lsp/lsp-metals") (:commit . "345b4fa80e31c58fd14e4c0cf9b88eb2aededcb0") (:revdesc . "345b4fa80e31") (:keywords "languages" "extensions") (:authors ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainers ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com"))]) + (lsp-mode . [(20251221 1949) ((emacs (28 1)) (dash (2 18 0)) (f (0 21 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0)) (eldoc (1 11))) "LSP mode" tar ((:url . "https://github.com/emacs-lsp/lsp-mode") (:commit . "c6e3660d32813b02ba3de60045de734e680bbcc7") (:revdesc . "c6e3660d3281") (:keywords "languages"))]) + (lsp-mssql . [(20251117 1444) ((emacs (28 1)) (lsp-mode (6 2)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (lsp-treemacs (0 1))) "MSSQL LSP bindings" tar ((:url . "https://github.com/emacs-lsp/lsp-mssql") (:commit . "810d632bd4abc4f105681a674ebea5d09407a04e") (:revdesc . "810d632bd4ab") (:keywords "data" "languages") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainers ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com"))]) + (lsp-origami . [(20250825 521) ((emacs (28 1)) (origami (1 0)) (lsp-mode (6 1))) "Origami.el support for lsp-mode" tar ((:url . "https://github.com/emacs-lsp/lsp-origami") (:commit . "b52f42b7932dd968b398e7cfd2ca29051b1a50b4") (:revdesc . "b52f42b7932d") (:keywords "languages" "lsp-mode"))]) + (lsp-pascal . [(20200422 1610) ((emacs (24 4)) (lsp-mode (6 3))) "LSP client for Pascal" tar ((:url . "https://github.com/arjanadriaanse/lsp-pascal") (:commit . "9b65bf9e923b1459d1feb1d7528e5855e7bd4ef2") (:revdesc . "9b65bf9e923b") (:keywords "languages" "tools") (:authors ("Arjan Adriaanse" . "arjan@adriaan.se")) (:maintainers ("Arjan Adriaanse" . "arjan@adriaan.se")) (:maintainer "Arjan Adriaanse" . "arjan@adriaan.se"))]) + (lsp-pyre . [(20190406 335) ((lsp-mode (6 0))) "Lsp-mode client for python using pyre" tar ((:url . "https://github.com/jra3/lsp-pyre") (:commit . "e177b8f5efd1a955b5753aeb5d1894e6d21be35a") (:revdesc . "e177b8f5efd1") (:authors ("John Allen" . "oss@porcnick.com")) (:maintainers ("John Allen" . "oss@porcnick.com")) (:maintainer "John Allen" . "oss@porcnick.com"))]) + (lsp-pyright . [(20250905 136) ((emacs (28 1)) (lsp-mode (7 0)) (dash (2 18 0)) (ht (2 0))) "Python LSP client using Pyright" tar ((:url . "https://github.com/emacs-lsp/lsp-pyright") (:commit . "3756ff971797ae04fc43ca29c66ba4d854eff038") (:revdesc . "3756ff971797") (:keywords "languages" "tools" "lsp"))]) + (lsp-python-ms . [(20230731 1458) ((emacs (25 1)) (lsp-mode (6 1))) "The lsp-mode client for Microsoft python-language-server" tar ((:url . "https://github.com/emacs-lsp/lsp-python-ms") (:commit . "7bda327bec7b219d140c34dab4b1e1fbd41bc516") (:revdesc . "7bda327bec7b") (:keywords "languages" "tools"))]) + (lsp-rescript . [(20250808 1449) ((lsp-mode (7 0 1)) (emacs (25 1)) (rescript-mode (0 1))) "LSP client configuration for lsp-mode and rescript-vscode" tar ((:url . "https://github.com/jjlee/lsp-rescript") (:commit . "3c13e3ffe2ece7b08f49c72e8a6e6156041f4c8b") (:revdesc . "3c13e3ffe2ec") (:keywords "languages"))]) + (lsp-scheme . [(20250425 1731) ((emacs (26 1)) (f (0 20 0)) (lsp-mode (8 0 0))) "Scheme support for lsp-mode" tar ((:url . "https://codeberg.org/rgherdt/emacs-lsp-scheme") (:commit . "e50f92618ad34c6d6752cffe12b116f8f9705712") (:revdesc . "e50f92618ad3") (:keywords "languages" "lisp" "tools") (:authors ("Ricardo G. Herdt" . "r.herdt@posteo.de")) (:maintainers ("Ricardo G. Herdt" . "r.herdt@posteo.de")) (:maintainer "Ricardo G. Herdt" . "r.herdt@posteo.de"))]) + (lsp-shader . [(20250722 2024) ((emacs (28 1)) (lsp-mode (6 1))) "LSP Clients for ShaderLab" tar ((:url . "https://github.com/shader-ls/lsp-shader") (:commit . "13d696b8d8ab5ca319cc5e4ae4a1045eae2a2413") (:revdesc . "13d696b8d8ab") (:keywords "convenience" "shader") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (lsp-sonarlint . [(20250301 131) ((emacs (28 1)) (dash (2 12 0)) (lsp-mode (6 3)) (ht (2 3))) "Emacs SonarLint lsp client" tar ((:url . "https://github.com/emacs-lsp/lsp-sonarlint") (:commit . "f9c61eafce62edf15f05d7262290ea87f2beb60d") (:revdesc . "f9c61eafce62") (:keywords "languages" "tools" "php" "javascript" "typescript" "go" "xml" "html" "java" "python") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainers ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net"))]) + (lsp-sourcekit . [(20250825 538) ((emacs (28 1)) (lsp-mode (5))) "Sourcekit-lsp client for lsp-mode" tar ((:url . "https://github.com/emacs-lsp/lsp-sourcekit") (:commit . "30918cd1aeeda5cfbc0fd615f97cf1bf388d8f2d") (:revdesc . "30918cd1aeed") (:keywords "languages" "lsp" "swift" "objective-c" "c++"))]) + (lsp-tailwindcss . [(20251009 810) ((lsp-mode (7 1)) (f (0 20 0)) (emacs (26 1))) "A lsp-mode client for tailwindcss" tar ((:url . "https://github.com/merrickluo/lsp-tailwindcss") (:commit . "cdd0325a6a571e51f6c7d1cbc198c7a7ea4a194a") (:revdesc . "cdd0325a6a57") (:keywords "language" "tools") (:authors ("A.I." . "merrick@luois.me")) (:maintainers ("A.I." . "merrick@luois.me")) (:maintainer "A.I." . "merrick@luois.me"))]) + (lsp-treemacs . [(20251217 1621) ((emacs (28 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5)) (lsp-mode (6 0))) "LSP treemacs" tar ((:url . "https://github.com/emacs-lsp/lsp-treemacs") (:commit . "49df7292c521b4bac058985ceeaf006607b497dd") (:revdesc . "49df7292c521") (:keywords "languages"))]) + (lsp-ui . [(20250804 2109) ((emacs (28 1)) (dash (2 18 0)) (lsp-mode (6 0)) (markdown-mode (2 3))) "UI modules for lsp-mode" tar ((:url . "https://github.com/emacs-lsp/lsp-ui") (:commit . "dcce464bc5d171daebf19009fdfbbc959bf2e7cf") (:revdesc . "dcce464bc5d1") (:keywords "languages" "tools") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is") ("Fangrui Song" . "i@maskray.me")) (:maintainers ("Sebastien Chapuis" . "sebastien@chapu.is") ("Fangrui Song" . "i@maskray.me")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is"))]) + (lte . [(20250112 2154) ((emacs (29 1)) (org (9 6)) (edit-indirect (0 1 13))) "Large Table Edition in Org and Markdown buffers" tar ((:url . "http://github.com/fredericgiquel/lte.el") (:commit . "011c86d9fb72d00105293efabef4756274d851b4") (:revdesc . "011c86d9fb72") (:authors ("Frédéric Giquel" . "frederic.giquel@laposte.net")) (:maintainers ("Frédéric Giquel" . "frederic.giquel@laposte.net")) (:maintainer "Frédéric Giquel" . "frederic.giquel@laposte.net"))]) + (lua-mode . [(20250310 1150) ((emacs (24 3))) "A major-mode for editing Lua scripts" tar ((:url . "https://immerrr.github.io/lua-mode") (:commit . "2f6b8d7a6317e42c953c5119b0119ddb337e0a5f") (:revdesc . "2f6b8d7a6317") (:keywords "languages" "processes" "tools") (:authors ("2011-2013 immerrr" . "immerrr+lua@gmail.com") ("2010-2011 Reuben Thomas" . "rrt@sc3d.org") ("2006 Juergen Hoetzel" . "juergen@hoetzel.info") ("2001 Christian Vogler" . "cvogler@gradient.cis.upenn.edu") ("1997 Bret Mogilefsky starting from" . "mogul-lua@gelatinous.com") ("tcl-mode by Gregor Schmid" . "schmid@fb3-s7.math.tu-berlin.de") ("Paul Du Bois and" . "pld-lua@gelatinous.com") ("Aaron Smith" . "aaron-lua@gelatinous.com")) (:maintainers ("2011-2013 immerrr" . "immerrr+lua@gmail.com") ("2010-2011 Reuben Thomas" . "rrt@sc3d.org") ("2006 Juergen Hoetzel" . "juergen@hoetzel.info") ("2001 Christian Vogler" . "cvogler@gradient.cis.upenn.edu") ("1997 Bret Mogilefsky starting from" . "mogul-lua@gelatinous.com") ("tcl-mode by Gregor Schmid" . "schmid@fb3-s7.math.tu-berlin.de") ("Paul Du Bois and" . "pld-lua@gelatinous.com") ("Aaron Smith" . "aaron-lua@gelatinous.com")) (:maintainer "2011-2013 immerrr" . "immerrr+lua@gmail.com"))]) + (luarocks . [(20170430 2305) ((emacs (24)) (cl-lib (0 5))) "Luarocks tools" tar ((:url . "https://github.com/emacs-pe/luarocks.el") (:commit . "cee27ba0716edf338077387969883226dd2b7484") (:revdesc . "cee27ba0716e") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (lumos-mode . [(20251211 650) ((emacs (26 1)) (lsp-mode (8 0))) "Major mode for LUMOS schema language" tar ((:url . "https://github.com/getlumos/lumos-mode") (:commit . "0caf9dccb2676f5d4a7080c3ff515ea65c926038") (:revdesc . "0caf9dccb267") (:keywords "languages" "solana" "blockchain"))]) + (lurk-mode . [(20230120 2226) ((emacs (25 1))) "A major mode for editing lurk files" tar ((:url . "http://github.com/lurk-lang/lurk-emacs") (:commit . "59a3f956944a5ddd43cfd57deeff6b647fc46554") (:revdesc . "59a3f956944a") (:keywords "languages" "lurk" "lisp") (:maintainers ("Jeff Weiss" . "jweiss@protocol.ai")) (:maintainer "Jeff Weiss" . "jweiss@protocol.ai"))]) + (lush-theme . [(20180816 2200) ((emacs (24))) "A dark theme with lush colors" tar ((:url . "https://github.com/andre-richter/emacs-lush-theme") (:commit . "7cfc993709d712f75c51b505078608c9e1c11466") (:revdesc . "7cfc993709d7") (:keywords "theme" "dark" "strong colors") (:authors ("Andre Richter" . "andre.o.richter@gmail.com")) (:maintainers ("Andre Richter" . "andre.o.richter@gmail.com")) (:maintainer "Andre Richter" . "andre.o.richter@gmail.com"))]) + (lusty-explorer . [(20200602 228) ((emacs (25 1))) "Dynamic filesystem explorer and buffer switcher" tar ((:url . "https://github.com/sjbach/lusty-emacs") (:commit . "75233eff9c961b9e99db0e0c50b6720850b595ec") (:revdesc . "75233eff9c96") (:keywords "convenience" "files" "matching" "tools"))]) + (lux-mode . [(20240108 1004) ((emacs (24 3))) "Major mode for editing lux files" tar ((:url . "https://github.com/hawk/lux") (:commit . "322f50143d164cd1375c9f5b432cd19095aedbad") (:revdesc . "322f50143d16"))]) + (lv . [(20200507 1518) nil "Other echo area" tar ((:url . "https://github.com/abo-abo/hydra") (:commit . "87873d788891029d9e44fa5458321d6a05849b94") (:revdesc . "87873d788891"))]) + (lxc . [(20140410 2022) nil "Lxc integration with Emacs" tar ((:url . "https://github.com/nicferrier/emacs-lxc") (:commit . "88bed56c954d1edd9ff5ce0ced2c02dcf9f71835") (:revdesc . "88bed56c954d") (:keywords "processes") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (lxc-tramp . [(20230119 1251) ((emacs (24)) (cl-lib (0 6))) "TRAMP integration for LXC containers" tar ((:url . "https://github.com/montag451/lxc-tramp") (:commit . "57559701334bb5635b82a252bd00298d06d794fe") (:revdesc . "57559701334b") (:keywords "lxc" "convenience"))]) + (lxd-tramp . [(20181023 7) ((emacs (24 4)) (cl-lib (0 6))) "TRAMP integration for LXD containers" tar ((:url . "https://github.com/onixie/lxd-tramp.git") (:commit . "f335c76245f62b02cf67a9376eca6f3863c8a75a") (:revdesc . "f335c76245f6") (:keywords "lxd" "lxc" "convenience") (:authors ("Yc.S" . "onixie@gmail.com")) (:maintainers ("Yc.S" . "onixie@gmail.com")) (:maintainer "Yc.S" . "onixie@gmail.com"))]) + (lyrics . [(20220206 116) ((emacs (25 1)) (seq (2 15))) "Show lyrics" tar ((:url . "https://github.com/emacs-pe/lyrics.el") (:commit . "c3d42f1e039941f32f49252e1b1610de337b4470") (:revdesc . "c3d42f1e0399") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (lyrics-fetcher . [(20241222 1620) ((emacs (27)) (emms (7 5)) (f (0 20 0)) (request (0 3 2))) "Fetch song lyrics and album covers" tar ((:url . "https://github.com/SqrtMinusOne/lyrics-fetcher.el") (:commit . "2686f97830d6ba03e86992e44405fad9ae58981f") (:revdesc . "2686f97830d6") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (m-buffer . [(20241215 2214) ((seq (2 14))) "List-Oriented, Functional Buffer Manipulation" tar ((:url . "https://github.com/phillord/m-buffer-el") (:commit . "5e7714835b2289f61dad24c0b5cf98d28fc313b0") (:revdesc . "5e7714835b22") (: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 ((:url . "https://github.com/DarwinAwardWinner/mac-pseudo-daemon") (:commit . "462031a53255185ae25eb10ae1f4272e49ad70f7") (:revdesc . "462031a53255") (:keywords "convenience" "osx" "mac"))]) + (maccalfw . [(20251104 512) ((emacs (29 1)) (calfw (2 0)) (ical-form (0 2))) "Calendar view for Mac Calendars" tar ((:url . "https://github.com/haji-ali/maccalfw") (:commit . "0a72897c02537948aecc6a65b30c91466c8adaa8") (:revdesc . "0a72897c0253") (:keywords "calendar") (:authors ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainers ("Al Haji-Ali" . "abdo.haji.aliatgmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.aliatgmail.com"))]) + (maces-game . [(20170903 1551) ((dash (2 12 0)) (cl-lib (0 5)) (emacs (24))) "Another anagram game" tar ((:url . "https://github.com/pawelbx/anagram-game") (:commit . "6a067422d305ac51612842930ed6686dc615ffec") (:revdesc . "6a067422d305") (:keywords "games" "word games" "anagram") (:authors ("Pawel Bokota" . "pawelb.lnx@gmail.com")) (:maintainers ("Pawel Bokota" . "pawelb.lnx@gmail.com")) (:maintainer "Pawel Bokota" . "pawelb.lnx@gmail.com"))]) + (macports . [(20250529 2306) ((emacs (26 1)) (transient (0 1 0))) "A porcelain for MacPorts" tar ((:url . "https://github.com/amake/macports.el") (:commit . "f1a4a103ca6a0c32669b3f9e689889e6ccec2bc1") (:revdesc . "f1a4a103ca6a") (:keywords "convenience"))]) + (macro-math . [(20130328 1604) nil "In-buffer mathematical operations" tar ((:url . "http://nschum.de/src/emacs/macro-math/") (:commit . "216e59371e9ee39c34117ba79b9acd78bb415750") (:revdesc . "216e59371e9e") (:keywords "convenience") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainer "Nikolaj Schumacher" . "bugs*nschumde"))]) + (macrostep . [(20250202 2205) ((cl-lib (0 5)) (compat (29))) "Interactive macro expander" tar ((:url . "https://github.com/emacsorphanage/macrostep") (:commit . "d0928626b4711dcf9f8f90439d23701118724199") (:revdesc . "d0928626b471") (:keywords "lisp" "languages" "macro" "debugging") (:authors ("Jon Oddie" . "j.j.oddie@gmail.com")) (:maintainers ("Jeremy Bryant" . "jb@jeremybryant.net")) (:maintainer "Jeremy Bryant" . "jb@jeremybryant.net"))]) + (macrostep-geiser . [(20210717 801) ((emacs (24 4)) (macrostep (0 9)) (geiser (0 12))) "Macrostep for `geiser'" tar ((:url . "https://github.com/nbfalcon/macrostep-geiser") (:commit . "f6a2d5bb96ade4f23df557649af87ebd0cc45125") (:revdesc . "f6a2d5bb96ad") (:keywords "languages" "scheme"))]) + (madhat2r-theme . [(20170203 30) ((emacs (24))) "Dark color theme that is easy on the eyes" tar ((:url . "https://github.com/madhat2r/madhat2r-theme") (:commit . "6b387f09de055cfcc15d74981cd4f32f8f9a7323") (:revdesc . "6b387f09de05") (:keywords "color" "theme"))]) + (mag-menu . [(20150505 1850) ((splitter (0 1 0))) "Intuitive keyboard-centric menu system" tar ((:url . "https://github.com/chumpage/mag-menu") (:commit . "9b9277021cd09fb1dba64b1d2a00705d20914bd6") (:revdesc . "9b9277021cd0") (:keywords "convenience"))]) + (magic-filetype . [(20240130 1805) ((emacs (24 3)) (s (1 9 0))) "Enhance filetype major mode" tar ((:url . "https://github.com/emacs-php/magic-filetype.el") (:commit . "3979ddbd8066d7390e31bde2b35f997c5f5f4516") (:revdesc . "3979ddbd8066") (:keywords "emulations" "vim" "ft" "file" "magic-mode") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (magic-latex-buffer . [(20210306 422) ((cl-lib (0 5)) (emacs (25 1))) "Magically enhance LaTeX-mode font-locking for semi-WYSIWYG editing" tar ((:url . "http://zk-phi.github.io/") (:commit . "903ec91872760e47c0e5715795f8465173615098") (:revdesc . "903ec9187276"))]) + (magik-company . [(20250922 1311) ((emacs (29 1)) (magik-mode (0 5 1)) (company (1 0 2)) (yasnippet (0 14 0))) "Magik backend for company-mode" tar ((:url . "https://github.com/reinierkof/magik-company") (:commit . "f11e7054fc9038ab34eae1702bbc0fb30fa34246") (:revdesc . "f11e7054fc90") (:keywords "convenience") (:authors ("Reinier Koffijberg" . "reinierkof@gmail.com")) (:maintainers ("Reinier Koffijberg" . "reinierkof@gmail.com")) (:maintainer "Reinier Koffijberg" . "reinierkof@gmail.com"))]) + (magik-mode . [(20251006 1327) ((emacs (24 4)) (compat (28 1)) (yasnippet (0 14 0))) "Emacs major mode for Smallworld Magik files" tar ((:url . "https://github.com/roadrunner1776/magik") (:commit . "069a1d630f63f6822607c59ae171ad7be6219631") (:revdesc . "069a1d630f63") (:keywords "languages"))]) + (magit . [(20251217 1836) ((emacs (28 1)) (compat (30 1)) (cond-let (0 1)) (llama (1 0)) (magit-section (4 4)) (seq (2 24)) (transient (0 10)) (with-editor (3 4))) "A Git porcelain inside Emacs" tar ((:url . "https://github.com/magit/magit") (:commit . "655bc502a3bdd7f07928524515a736e4b8101eaf") (:revdesc . "655bc502a3bd") (:keywords "git" "tools" "vc") (:authors ("Marius Vollmer" . "marius.vollmer@gmail.com") ("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev") ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev"))]) + (magit-annex . [(20240811 1850) ((emacs (26 1)) (magit (4 0 0))) "Control git-annex from Magit" tar ((:url . "https://github.com/magit/magit-annex") (:commit . "9db0bc61461f222106c7ae3d8cd6d3de1f1b143f") (:revdesc . "9db0bc61461f") (:keywords "vc" "tools") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com"))]) + (magit-commit-mark . [(20251126 1131) ((emacs (29 1)) (magit (3 3 0))) "Support marking commits as read" tar ((:url . "https://codeberg.org/ideasman42/emacs-magit-commit-mark") (:commit . "26db85085067c13d59e02742cc0e1232e1c3284f") (:revdesc . "26db85085067") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (magit-delta . [(20220125 50) ((emacs (25 1)) (magit (20200426)) (xterm-color (2 0))) "Use Delta when displaying diffs in Magit" tar ((:url . "https://github.com/dandavison/magit-delta") (:commit . "5fc7dbddcfacfe46d3fd876172ad02a9ab6ac616") (:revdesc . "5fc7dbddcfac") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainers ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com"))]) + (magit-diff-flycheck . [(20190524 551) ((magit (2)) (flycheck (31)) (seq (2)) (emacs (25 1))) "Report errors in diffs" tar ((:url . "https://github.com/ragone/magit-diff-flycheck") (:commit . "ad58efa312d708f25661dfcc2a7f83a833cca328") (:revdesc . "ad58efa312d7") (:keywords "convenience" "matching") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainers ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com"))]) + (magit-filenotify . [(20151116 2340) ((magit (1 3 0)) (emacs (24 4))) "Refresh status buffer when git tree changes" tar ((:url . "https://github.com/ruediger/magit-filenotify") (:commit . "c0865b3c41af20b6cd89de23d3b0beb54c8401a4") (:revdesc . "c0865b3c41af") (:keywords "tools") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainers ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de"))]) + (magit-find-file . [(20150702 830) ((magit (2 1 0)) (dash (2 8 0))) "Completing-read over all files in Git" tar ((:url . "https://github.com/bradleywright/magit-find-file.el") (:commit . "035da838b1a19e7a5ee135b4ca8475f4e235b61e") (:revdesc . "035da838b1a1") (:keywords "git") (:authors ("Bradley Wright" . "brad@intranation.com")) (:maintainers ("Bradley Wright" . "brad@intranation.com")) (:maintainer "Bradley Wright" . "brad@intranation.com"))]) + (magit-gerrit . [(20250825 722) ((emacs (25 1)) (magit (2 90 1)) (transient (0 3 0))) "Magit plugin for Gerrit Code Review" tar ((:url . "https://github.com/emacsorphanage/magit-gerrit") (:commit . "37a4774c3cc401f849d57aaa2c105ca401f9983c") (:revdesc . "37a4774c3cc4") (:authors ("Brian Fransioli" . "assem@terranpro.org")) (:maintainers ("Brian Fransioli" . "assem@terranpro.org")) (:maintainer "Brian Fransioli" . "assem@terranpro.org"))]) + (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 ((:url . "https://github.com/sigma/magit-gh-pulls") (:commit . "57f3a5158bbc7bfd169ee136fde351cce999e0ca") (:revdesc . "57f3a5158bbc") (:keywords "git" "tools") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))]) + (magit-gitflow . [(20170929 824) ((magit (2 1 0)) (magit-popup (2 2 0))) "Gitflow extension for magit" tar ((:url . "https://github.com/jtatarik/magit-gitflow") (:commit . "cc41b561ec6eea947fe9a176349fb4f771ed865b") (:revdesc . "cc41b561ec6e") (:keywords "vc" "tools") (:authors ("Jan Tatarik" . "Jan.Tatarik@gmail.com")) (:maintainers ("Jan Tatarik" . "Jan.Tatarik@gmail.com")) (:maintainer "Jan Tatarik" . "Jan.Tatarik@gmail.com"))]) + (magit-gitlab . [(20240707 1506) ((emacs (26 1)) (magit (3 3 0)) (ghub (3 6 0)) (transient (0 6 0))) "Magit plugin for manipulating GitLab merge requests" tar ((:url . "https://gitlab.com/arvidnl/magit-gitlab") (:commit . "6f10468f9091d02aa6f1ce4af914443209a7d2a5") (:revdesc . "6f10468f9091") (:authors ("Arvid Jakobsson" . "arvid.jakobsson@gmail.com")) (:maintainers ("Arvid Jakobsson" . "arvid.jakobsson@gmail.com")) (:maintainer "Arvid Jakobsson" . "arvid.jakobsson@gmail.com"))]) + (magit-gptcommit . [(20251206 1143) ((emacs (29 1)) (dash (2 13 0)) (magit (2 90 1)) (llm (0 16 1))) "Git commit with help of gpt" tar ((:url . "https://github.com/douo/magit-gptcommit") (:commit . "4a60438fd2a349610e571f10596f6642dfab119d") (:revdesc . "4a60438fd2a3") (:authors ("Tiou Lims" . "dourokinga@gmail.com")) (:maintainers ("Tiou Lims" . "dourokinga@gmail.com")) (:maintainer "Tiou Lims" . "dourokinga@gmail.com"))]) + (magit-ido . [(20250330 1737) ((ido-completing-read+ (4 14)) (magit (4 3 2))) "Support using Ido in Magit" tar ((:url . "https://github.com/emacsorphanage/magit-ido") (:commit . "2b94abf65a208e4c844d046217350efbf77cf582") (:revdesc . "2b94abf65a20") (:authors ("Jonas Bernoulli" . "emacs.magit-ido@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.magit-ido@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.magit-ido@jonas.bernoulli.dev"))]) + (magit-imerge . [(20240811 1933) ((emacs (26 1)) (magit (4 0 0))) "Magit extension for git-imerge" tar ((:url . "https://github.com/magit/magit-imerge") (:commit . "e9955c3b4dac2661f67d9882ed3367471e529cfc") (:revdesc . "e9955c3b4dac") (:keywords "vc" "tools") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com"))]) + (magit-lfs . [(20221031 1447) ((emacs (24 4)) (magit (2 10 3)) (dash (2 13 0))) "Magit plugin for Git LFS" tar ((:url . "https://github.com/ailrun/magit-lfs") (:commit . "cd9f46e1840270be27e2c2d9dcf036ff0781f66d") (:revdesc . "cd9f46e18402") (:keywords "magit" "git" "lfs" "tools" "vc") (:authors ("Junyoung/Clare Jang" . "jjc9310@gmail.com")) (:maintainers ("Junyoung/Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung/Clare Jang" . "jjc9310@gmail.com"))]) + (magit-org-todos . [(20180709 1950) ((magit (2 0 0)) (emacs (24))) "Add local todo items to the magit status buffer" tar ((:url . "http://github.com/danielma/magit-org-todos") (:commit . "9ffa3efb098434d837cab4bacd1601fdfc6fe999") (:revdesc . "9ffa3efb0984") (:keywords "org-mode" "magit" "tools"))]) + (magit-p4 . [(20250902 311) ((emacs (27 1)) (magit (4 0 0)) (transient (0 8 0)) (p4 (12 0)) (cl-lib (1 0)) (with-editor (3 4 1))) "Git-p4 plug-in for Magit" tar ((:url . "https://github.com/qoocku/magit-p4") (:commit . "19c54db7423ef87a3688b0ac1e882c2341efee84") (:revdesc . "19c54db7423e") (:keywords "vc" "tools") (:authors ("Damian T. Dobroczyński" . "qoocku@gmail.com") ("Aleksey Fedotov" . "lexa@cfotr.com")) (:maintainers ("Maciej Katafiasz" . "mathrick@gmail.com")) (:maintainer "Maciej Katafiasz" . "mathrick@gmail.com"))]) + (magit-patch-changelog . [(20221209 123) ((emacs (28 1)) (magit (3 3 0))) "Generate a patch according to emacs-mirror/CONTRIBUTE" tar ((:url . "https://github.com/dickmao/magit-patch-changelog") (:commit . "fd259cf6ce270a21df2f00b1e031193c8595a7a9") (:revdesc . "fd259cf6ce27") (:keywords "git" "tools" "vc"))]) + (magit-popup . [(20200719 1015) ((emacs (24 4)) (dash (2 13 0))) "Define prefix-infix-suffix command combos" tar ((:url . "https://github.com/magit/magit-popup") (:commit . "d8585fa39f88956963d877b921322530257ba9f5") (:revdesc . "d8585fa39f88") (:keywords "bindings") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li"))]) + (magit-prime . [(20250803 1914) ((emacs (27 1)) (magit (3 0 0))) "Prime cache before Magit refresh" tar ((:url . "https://github.com/Azkae/magit-prime") (:commit . "ebd58f95a564d69baa21a456471a2584673df78d") (:revdesc . "ebd58f95a564") (:authors ("Romain Ouabdelkader" . "romain.ouabdelkader@gmail.com")) (:maintainers ("Romain Ouabdelkader" . "romain.ouabdelkader@gmail.com")) (:maintainer "Romain Ouabdelkader" . "romain.ouabdelkader@gmail.com"))]) + (magit-rbr . [(20181009 2016) ((magit (2 13 0)) (emacs (24 3))) "Support for git rbr in Magit" tar ((:url . "https://github.com/fanatoly/magit-rbr") (:commit . "029203b3e48537205052a058e964f058cd802c3c") (:revdesc . "029203b3e485") (:keywords "git" "magit" "rbr" "tools") (:authors ("Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com")) (:maintainers ("Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com")) (:maintainer "Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com"))]) + (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 ((:url . "http://github.com/jtamagnan/magit-reviewboard") (:commit . "aceedff88921f1dfef8a6b2fb18fe316fb7223a8") (:revdesc . "aceedff88921") (:keywords "magit" "vc") (:authors ("Jules Tamagnan" . "jtamagnan@gmail.com")) (:maintainers ("Jules Tamagnan" . "jtamagnan@gmail.com")) (:maintainer "Jules Tamagnan" . "jtamagnan@gmail.com"))]) + (magit-section . [(20251220 917) ((emacs (28 1)) (compat (30 1)) (cond-let (0 1)) (llama (1 0)) (seq (2 24))) "Sections for read-only buffers" tar ((:url . "https://github.com/magit/magit") (:commit . "649b4c972151c0ee495876c0d4c8c13787614886") (:revdesc . "649b4c972151") (:keywords "tools") (:authors ("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev"))]) + (magit-stats . [(20230223 1819) ((emacs (25 1))) "Generates GIT Repo Statistics Report" tar ((:url . "https://github.com/LionyxML/magit-stats") (:commit . "41b18e5fc664dba93981a7931f476632c5b54a7d") (:revdesc . "41b18e5fc664") (:keywords "vc" "convenience"))]) + (magit-stgit . [(20250215 2223) ((emacs (27 1)) (llama (0 6 0)) (magit (4 3 0)) (transient (0 8 4))) "StGit extension for Magit" tar ((:url . "https://github.com/stacked-git/magit-stgit") (:commit . "b19d96f8f62bd4def83eb1c09e9cd2582856351e") (:revdesc . "b19d96f8f62b") (:keywords "git" "tools" "vc") (:authors ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainers ("Peter Grayson" . "pete@jpgrayson.net")) (:maintainer "Peter Grayson" . "pete@jpgrayson.net"))]) + (magit-svn . [(20250210 1141) ((emacs (27 1)) (dash (2 19 1)) (magit (4 3 0)) (transient (0 8 4))) "Git-Svn extension for Magit" tar ((:url . "https://github.com/emacsorphanage/magit-svn") (:commit . "ca637c648835eddbeb277cc8089d3ffd6f75ae13") (:revdesc . "ca637c648835") (:keywords "vc" "tools") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainers ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Phil Jackson" . "phil@shellarchive.co.uk"))]) + (magit-tbdiff . [(20250915 2109) ((emacs (26 1)) (magit (4 0 0))) "Magit extension for range diffs" tar ((:url . "https://github.com/magit/magit-tbdiff") (:commit . "f77cffb98dae726f011b133db8936df9ac4a657a") (:revdesc . "f77cffb98dae") (:keywords "vc" "tools") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com"))]) + (magit-todos . [(20250928 1611) ((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 ((:url . "http://github.com/alphapapa/magit-todos") (:commit . "7294a95580bddf7232f2d205efae312dc24c5f61") (:revdesc . "7294a95580bd") (:keywords "magit" "vc") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (magit-topgit . [(20161105 1623) ((emacs (24 4)) (magit (2 1 0))) "TopGit extension for Magit" tar ((:url . "https://github.com/greenrd/magit-topgit") (:commit . "11489ea798bc88d0ea5244bbf725285eedfefbef") (:revdesc . "11489ea798bc") (:keywords "vc" "tools") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Robin Green" . "greenrd@greenrd.org")) (:maintainer "Robin Green" . "greenrd@greenrd.org"))]) + (magit-vcsh . [(20230402 1219) ((magit (2 90 1)) (vcsh (0 4)) (emacs (24 4))) "Magit vcsh integration" tar ((:url . "http://git.smrk.net/magit-vcsh.el") (:commit . "fd6c86c066b14bbf78644d38eca9711d6d9544a1") (:revdesc . "fd6c86c066b1") (:keywords "vc" "files" "magit") (: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"))]) + (magma-mode . [(20211018 917) ((emacs (24 3)) (cl-lib (0 3)) (dash (2 6 0)) (f (0 17 1))) "Mode for editing Magma source code" tar ((:url . "https://github.com/ThibautVerron/magma-mode") (:commit . "11428d18ce3742334923d14ff2a8f493e7bd5ef0") (:revdesc . "11428d18ce37"))]) + (magnatune . [(20151030 1935) ((dash (2 9 0)) (s (1 9 0))) "Browse magnatune's music catalog" tar ((:url . "https://github.com/eikek/magnatune.el") (:commit . "605b01505ba30589c77ebb4c96834b5072ccbdd4") (:revdesc . "605b01505ba3"))]) + (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 ((:url . "https://github.com/p3r7/magrant") (:commit . "6309c001355126e3ade79493479b517925943d17") (:revdesc . "6309c0013551") (:keywords "processes" "terminals"))]) + (major-mode-hydra . [(20231003 2050) ((dash (2 18 0)) (pretty-hydra (0 2 2)) (emacs (25))) "Major mode keybindings managed by Hydra" tar ((:url . "https://github.com/jerrypnz/major-mode-hydra.el") (:commit . "d0a5dadee97c3752fcdef113cf2ba1923972a480") (:revdesc . "d0a5dadee97c") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainers ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com"))]) + (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 ((:url . "https://repo.or.cz/major-mode-icons.git") (:commit . "b0214e0af13cd3691c4d28f03e3108bd98ec7a85") (:revdesc . "b0214e0af13c") (:keywords "frames" "multimedia"))]) + (make-color . [(20251106 1219) nil "Alternative to picking color - update fg/bg color by pressing r/g/b/... keys" tar ((:url . "https://github.com/alezost/make-color.el") (:commit . "aac38ff562f8ba46917f8281ad79973caf379f49") (:revdesc . "aac38ff562f8") (:keywords "color") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (make-it-so . [(20190625 1036) ((swiper (0 8 0)) (emacs (24))) "Transform files with Makefile recipes" tar ((:url . "https://github.com/abo-abo/make-it-so") (:commit . "b73dfb640588123c9eece230ad72b37604f5c126") (:revdesc . "b73dfb640588") (:keywords "make" "dired") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (makefile-executor . [(20230224 1329) ((emacs (27 1)) (dash (2 11 0)) (f (0 11 0)) (s (1 10 0))) "Commands for conveniently running makefile targets" tar ((:url . "https://github.com/Olivia5k/makefile-executor.el") (:commit . "d1d98eaf522a767561f6c7cbd8d2526be58b3ec5") (:revdesc . "d1d98eaf522a") (:keywords "processes") (:authors ("Olivia Thiderman" . "olivia@thiderman.org")) (:maintainers ("Olivia Thiderman" . "olivia@thiderman.org")) (:maintainer "Olivia Thiderman" . "olivia@thiderman.org"))]) + (makey . [(20131231 1430) ((cl-lib (0 2))) "Interactive commandline mode" tar ((:url . "https://github.com/mickeynp/makey") (:commit . "a61781e69d3b451551e269446e1c5f624ab81137") (:revdesc . "a61781e69d3b") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainers ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org"))]) + (malinka . [(20171202 1021) ((s (1 9 0)) (dash (2 4 0)) (f (0 11 0)) (cl-lib (0 3)) (rtags (0 0)) (projectile (0 11 0))) "A C/C++ project configuration package for Emacs" tar ((:url . "https://github.com/LefterisJP/malinka") (:commit . "e3dc5b0703a5954057110b82cb397a990ace23e6") (:revdesc . "e3dc5b0703a5") (:keywords "c" "c++" "project-management") (:authors ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainers ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas" . "lefteris@refu.co"))]) + (mallard-mode . [(20131204 425) nil "Major mode for editing Mallard files" tar ((:url . "https://github.com/jhradilek/emacs-mallard-mode") (:commit . "0a4cfede57bc31134495804ce513cc106de8de3c") (:revdesc . "0a4cfede57bc") (:keywords "xml" "mallard") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainers ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com"))]) + (mallard-snippets . [(20131023 1851) ((yasnippet (0 8 0)) (mallard-mode (0 1 1))) "Yasnippets for Mallard" tar ((:url . "https://github.com/jhradilek/emacs-mallard-snippets") (:commit . "35b7d0558da14fcffd51863f623806216a0093ce") (:revdesc . "35b7d0558da1") (:keywords "snippets" "mallard") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainers ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com"))]) + (malyon . [(20161208 2125) ((cl-lib (0 5))) "Mode to execute Z-code files version 3, 5, 8" tar ((:url . "https://github.com/speedenator/malyon") (:commit . "0d9882650720b4a791556f5e2d917388965d6fc0") (:revdesc . "0d9882650720") (:keywords "games" "emulations") (:authors ("Peter Ilberg" . "peter.ilberg@gmail.com") ("Christopher Madsen" . "cjm@cjmweb.net") ("Erik Selberg" . "erik@selberg.org")) (:maintainers ("Christopher Madsen" . "cjm@cjmweb.net") ("Erik Selberg" . "erik@selberg.org")) (:maintainer "Christopher Madsen" . "cjm@cjmweb.net"))]) + (mame . [(20240828 1559) ((emacs (27 1))) "A MAME front-end" tar ((:url . "https://github.com/Iacob/elmame") (:commit . "7c727999e03932fc65cabdbe2161efbe06ff1274") (:revdesc . "7c727999e039") (:authors ("Yong" . "luo.yong.name@gmail.com")) (:maintainers ("Yong" . "luo.yong.name@gmail.com")) (:maintainer "Yong" . "luo.yong.name@gmail.com"))]) + (man-commands . [(20151221 2221) ((cl-lib (0 5))) "Add interactive commands for every manpages installed in your computer" tar ((:url . "http://github.com/nflath/man-commands") (:commit . "f4ba0c3790855d7544dff92d470d212f24de1d9d") (:revdesc . "f4ba0c379085") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainers ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com"))]) + (manage-minor-mode . [(20240925 754) ((emacs (24 3))) "Manage your minor-modes easily" tar ((:url . "https://github.com/ShingoFukuyama/manage-minor-mode") (:commit . "6d9458e275699f7d360b703c8919d350524ee2fb") (:revdesc . "6d9458e27569") (:keywords "tools" "minor-mode" "manage" "emacs") (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (manage-minor-mode-table . [(20250101 1012) ((emacs (25 1)) (manage-minor-mode (1 1))) "Manage minor-modes in table" tar ((:url . "https://github.com/jcs-elpa/manage-minor-mode-table") (:commit . "5fee7081b0ed78774448fc923cced0384a83d48c") (:revdesc . "5fee7081b0ed") (:keywords "tools" "minor-mode" "manage") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (mandm-theme . [(20250726 1920) nil "An M&M color theme" tar ((:url . "https://github.com/choppsv1/emacs-mandm-theme.git") (:commit . "5b8ccb687b56ce143d3f60f59a681e6ca2e90956") (:revdesc . "5b8ccb687b56") (:authors ("Christian Hopps" . "chopps@gmail.com")) (:maintainers ("Christian Hopps" . "chopps@gmail.com")) (:maintainer "Christian Hopps" . "chopps@gmail.com"))]) + (mandoku . [(20180403 1106) ((org (8)) (github-clone (20150705 1705))) "A tool to access repositories of premodern Chinese texts" tar ((:url . "http://www.mandoku.org") (:commit . "e3b7678762e9824861b1ce775a94b05b096164f5") (:revdesc . "e3b7678762e9") (:keywords "convenience") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainers ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com"))]) + (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 ((:url . "https://github.com/mandoku/mandoku-tls") (:commit . "ffeebf5bd451ac1806ddfe1744fbbd036a56f902") (:revdesc . "ffeebf5bd451") (:keywords "convenience") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainers ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com"))]) + (mantra . [(20250920 129) ((emacs (27 1)) (pubsub (0 1))) "A system for scripting and parsing activity beyond macros" tar ((:url . "https://github.com/countvajhula/mantra") (:commit . "ad46c9d7fdcd50d771f129fd458f85bf6e28dd9d") (:revdesc . "ad46c9d7fdcd") (:authors ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com"))]) + (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 ((:url . "https://github.com/nlamirault/marcopolo") (:commit . "85db828f2bb4346a811b3326349b1c6d0aae4601") (:revdesc . "85db828f2bb4") (:keywords "docker") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (marginalia . [(20251223 1509) ((emacs (29 1)) (compat (30))) "Enrich existing commands with completion annotations" tar ((:url . "https://github.com/minad/marginalia") (:commit . "61bf01985aea982db351002951882438fcada08b") (:revdesc . "61bf01985aea") (:keywords "docs" "help" "matching" "completion") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx"))]) + (mark-multiple . [(20121118 1554) nil "Sorta lets you mark several regions at once" tar ((:url . "https://github.com/magnars/mark-multiple.el") (:commit . "f6a53c7c5283d640ae718f4548b0fda78877a375") (:revdesc . "f6a53c7c5283") (:keywords "marking" "library") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (mark-thing-at . [(20250126 2020) ((emacs (26)) (choice-program (0 14))) "Mark a pattern at the current point" tar ((:url . "https://github.com/plandes/mark-thing-at") (:commit . "a9a6c824ede52825a1dea8d880776ad20f12f488") (:revdesc . "a9a6c824ede5") (:keywords "mark" "point" "lisp"))]) + (mark-tools . [(20130614 1025) nil "Some simple tools to access the mark-ring in Emacs" tar ((:url . "https://github.com/stsquad/emacs-mark-tools") (:commit . "a11b61effa90bd0abc876d12573674d36fc17f0c") (:revdesc . "a11b61effa90") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainers ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com"))]) + (mark-yank . [(20231105 2027) ((emacs (24 4))) "Set region to the last yank" tar ((:url . "https://github.com/mkleehammer/mark-yank") (:commit . "7207aabe9edd0872ec6d506a58b942b43926c122") (:revdesc . "7207aabe9edd") (:authors ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainers ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainer "Michael Kleehammer" . "michael@kleehammer.com"))]) + (markdown-changelog . [(20230805 1720) ((emacs (26)) (dash (2 13 0))) "Maintain changelog entries" tar ((:url . "https://github.com/plandes/markdown-changelog") (:commit . "403d2cd1cff932ae135692d57062824892e01d13") (:revdesc . "403d2cd1cff9") (:keywords "markdown" "changelog" "files"))]) + (markdown-mermaid . [(20251215 8) ((emacs (26 1)) (markdown-mode (2 3))) "Preview Mermaid code blocks in Markdown" tar ((:url . "https://github.com/pasunboneleve/markdown-mermaid") (:commit . "b78f912115e5c218235f3d89a592749c01452be0") (:revdesc . "b78f912115e5") (:keywords "markdown" "tools" "mermaid" "diagrams") (:maintainers ("Daniel Vianna" . "dmlvianna@gmail.com")) (:maintainer "Daniel Vianna" . "dmlvianna@gmail.com"))]) + (markdown-mode . [(20251204 852) ((emacs (28 1))) "Major mode for Markdown-formatted text" tar ((:url . "https://jblevins.org/projects/markdown-mode/") (:commit . "92802fae9ebbc8c2e4c281c06dcdbd74b8bca80e") (:revdesc . "92802fae9ebb") (:keywords "markdown" "github flavored markdown" "itex") (:authors ("Jason R. Blevins" . "jblevins@xbeta.org")) (:maintainers ("Jason R. Blevins" . "jblevins@xbeta.org")) (:maintainer "Jason R. Blevins" . "jblevins@xbeta.org"))]) + (markdown-preview-eww . [(20160111 1502) ((emacs (24 4))) "Realtime preview by eww" tar ((:url . "https://github.com/niku/markdown-preview-eww") (:commit . "5853f836425c877c8a956501f0adda137ef1d3b7") (:revdesc . "5853f836425c") (:authors ("niku" . "niku@niku.name")) (:maintainers ("niku" . "niku@niku.name")) (:maintainer "niku" . "niku@niku.name"))]) + (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 ((:url . "https://github.com/ancane/markdown-preview-mode") (:commit . "68242b3907dc065aa35412bfd928b43d8052d321") (:revdesc . "68242b3907dc") (:keywords "markdown" "gfm" "convenience") (:authors ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainers ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainer "Igor Shymko" . "igor.shimko@gmail.com"))]) + (markdown-soma . [(20240215 228) ((emacs (25)) (s (1 11 0)) (dash (2 19 1)) (f (0 20 0))) "Live preview for Markdown" tar ((:url . "https://github.com/jasonm23/markdown-soma") (:commit . "ba30e609108d32fe6e1998490548b4631e3e48c3") (:revdesc . "ba30e609108d") (:keywords "wp" "docs" "text" "markdown") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (markdown-toc . [(20251210 2018) ((emacs (28 1)) (markdown-mode (2 1)) (dash (2 11 0)) (s (1 9 0))) "A simple TOC generator for markdown file" tar ((:url . "http://github.com/ardumont/markdown-toc") (:commit . "29e5c0f33ed026a5f993e4211f52debd7c02b3ba") (:revdesc . "29e5c0f33ed0") (:keywords "markdown" "toc" "tools") (:authors ("Antoine R. Dumont" . "(@ardumont)")) (:maintainers ("Antoine R. Dumont" . "(@ardumont)") ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Antoine R. Dumont" . "(@ardumont)"))]) + (markdown-ts-mode . [(20240422 2329) ((emacs (29 1))) "Major mode for Markdown using Treesitter" tar ((:url . "https://github.com/LionyxML/markdown-ts-mode") (:commit . "2f1ee8b94cdf53cebc31ae08ecfbba846193d5e1") (:revdesc . "2f1ee8b94cdf") (:keywords "languages" "matching" "faces"))]) + (markdownfmt . [(20160609 1241) ((emacs (24))) "Format markdown using markdownfmt" tar ((:url . "https://github.com/nlamirault/emacs-markdownfmt") (:commit . "af83cd00fafcaa837ffdb50d1fa2b0ac952f16c0") (:revdesc . "af83cd00fafc") (:keywords "markdown") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (markless . [(20250811 1924) ((emacs (24 4))) "Major mode for Markless documents" tar ((:url . "https://shirakumo.org/docs/markless.el/") (:commit . "f8bd797f4d5962fec1dcf9807fba8cf0be17b2f9") (:revdesc . "f8bd797f4d59") (:keywords "languages" "wp") (:authors ("Yukari Hafner" . "shinmera@tymoon.eu")) (:maintainers ("Yukari Hafner" . "shinmera@tymoon.eu")) (:maintainer "Yukari Hafner" . "shinmera@tymoon.eu"))]) + (markup . [(20170420 1129) ((cl-lib (0 5))) "Simple markup generation helpers" tar ((:url . "http://github.com/leoc/markup.el") (:commit . "876da2d3f23473475bb0fd0a1480ae11d2671291") (:revdesc . "876da2d3f234") (:keywords "convenience" "markup" "html") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainers ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com"))]) + (markup-faces . [(20141110 817) nil "Collection of faces for markup language modes" tar ((:url . "https://github.com/sensorflo/markup-faces") (:commit . "98a807ed82473eb41c6a201ed7ef816d6bcd67b0") (:revdesc . "98a807ed8247") (:keywords "wp" "faces") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainers ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainer "Florian Kaufmann" . "sensorflo@gmail.com"))]) + (marmalade-client . [(20141231 2007) ((web (0 5 2)) (kv (0 0 19)) (gh (0 8 0))) "Client for marmalade API from emacs" tar ((:url . "https://github.com/nicferrier/emacs-marmalade-upload") (:commit . "f315dea57e4fbebd9ee0668c0bafd4c45c7b754a") (:revdesc . "f315dea57e4f") (:keywords "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (marquee-header . [(20250101 1012) ((emacs (26 1))) "Code interface for displaying marquee in header" tar ((:url . "https://github.com/jcs-elpa/marquee-header") (:commit . "5f40543099ffe55b64dbcc57308dff7efe948bbe") (:revdesc . "5f40543099ff") (:keywords "wp" "animation" "marquee") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (marron-gold-theme . [(20250224 923) ((emacs (24 1))) "A rich marron-gold theme" tar ((:url . "https://github.com/madara123pain/unique-emacs-theme-pack") (:commit . "ae9a0c318c371ed70ec568f3a618d47124817fe7") (:revdesc . "ae9a0c318c37") (:keywords "faces" "theme" "marron" "gold" "warm" "elegant"))]) + (marshal . [(20201223 1853) ((emacs (25 1)) (ht (2 0))) "Eieio extension for automatic (un)marshalling" tar ((:url . "https://github.com/sigma/marshal.el") (:commit . "490496d974d03906f784707ecc2e0ac36ed84b96") (:revdesc . "490496d974d0") (:keywords "extensions") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))]) + (maruo-macro-mode . [(20160616 1349) ((emacs (24 3))) "Major mode for editing Hidemaru/Maruo macro script" tar ((:url . "https://github.com/zonuexe/maruo-macro-mode.el") (:commit . "8fc9a38ad051eafa8eb94038711acc52c5d1d8d5") (:revdesc . "8fc9a38ad051") (:keywords "programming" "editor" "macro") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (masm-mode . [(20200308 1450) ((emacs (25 1))) "MASM x86 and x64 assembly major mode" tar ((:url . "https://github.com/YiGeeker/masm-mode") (:commit . "ab63524d195332ec9f703783704231606e69c292") (:revdesc . "ab63524d1953") (:keywords "languages") (:authors ("YiGeeker" . "zyfchinese@yeah.net")) (:maintainers ("YiGeeker" . "zyfchinese@yeah.net")) (:maintainer "YiGeeker" . "zyfchinese@yeah.net"))]) + (mason . [(20251212 2009) ((emacs (30 1)) (s (1 13 0))) "Package managers for LSP, DAP, linters, and more" tar ((:url . "https://github.com/deirn/mason.el") (:commit . "3d3bc83bbb364f913b7bfd3f198048ba4a57f06f") (:revdesc . "3d3bc83bbb36") (:keywords "tools" "lsp" "installer") (:authors ("Dimas Firmansyah" . "deirn@bai.lol")) (:maintainers ("Dimas Firmansyah" . "deirn@bai.lol")) (:maintainer "Dimas Firmansyah" . "deirn@bai.lol"))]) + (mastodon . [(20251201 1553) ((emacs (28 1)) (persist (0 8)) (tp (0 7))) "Client for fediverse services using the Mastodon API" tar ((:url . "https://codeberg.org/martianh/mastodon.el") (:commit . "3c00418bfbb13f450551c28a97f8870e8ce3fef9") (:revdesc . "3c00418bfbb1") (:authors ("Johnson Denen" . "johnson.denen@gmail.com") ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainers ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainer "Marty Hiatt" . "mousebot@disroot.org"))]) + (material-theme . [(20210904 1226) ((emacs (24 1))) "A Theme based on the colors of the Google Material Design" tar ((:url . "http://github.com/cpaulik/emacs-material-theme") (:commit . "6823009bc92f82aa3a90e27e1009f7da8e87b648") (:revdesc . "6823009bc92f") (:keywords "themes") (:authors ("Christoph Paulik" . "cpaulik@gmail.com")) (:maintainers ("Christoph Paulik" . "cpaulik@gmail.com")) (:maintainer "Christoph Paulik" . "cpaulik@gmail.com"))]) + (math-preview . [(20240801 513) ((emacs (26 1)) (json (1 4)) (dash (2 18 0)) (s (1 12 0))) "Preview TeX math equations inline" tar ((:url . "https://gitlab.com/matsievskiysv/math-preview") (:commit . "a2ca3c175468ceaf02bab6cdfd8ef016bda2b98d") (:revdesc . "a2ca3c175468") (:keywords "convenience"))]) + (math-symbol-lists . [(20220828 2047) nil "Lists of Unicode math symbols and latex commands" tar ((:url . "https://github.com/vspinu/math-symbol-lists") (:commit . "ac3eb053d3b576fcdd192b0ac6ad5090ea3a7079") (:revdesc . "ac3eb053d3b5") (:keywords "unicode" "symbols" "mathematics") (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainers ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com"))]) + (math-symbols . [(20201005 2313) nil "Math Symbol Input methods and conversion tools" tar ((:url . "https://github.com/kawabata/math-symbols") (:commit . "091b81cb40ceaff97614999ffe85b572ace182f0") (:revdesc . "091b81cb40ce") (:keywords "i18n" "languages" "tex") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (math-tex-convert . [(20221210 1937) ((emacs (26 1)) (math-symbol-lists (1 3)) (auctex (12 1))) "Convert LaTeX macros to unicode and back" tar ((:url . "https://github.com/enricoflor/math-tex-convert") (:commit . "8b174d05e8e5269322a1ee90f94cf1ed018d4976") (:revdesc . "8b174d05e8e5") (:authors ("Enrico Flor" . "enrico@eflor.net")) (:maintainers ("Enrico Flor" . "enrico@eflor.net")) (:maintainer "Enrico Flor" . "enrico@eflor.net"))]) + (matlab-mode . [(20251127 254) ((emacs (27 2))) "Major mode for MATLAB(R) dot-m files" tar ((:url . "https://github.com/mathworks/Emacs-MATLAB-Mode") (:commit . "debcd15126d1f1ce97325b8cffc6c79c81c63d66") (:revdesc . "debcd15126d1") (:keywords "matlab(r)") (:authors ("Matt Wette" . "mwette@alumni.caltech.edu") ("Eric M. Ludlam" . "eludlam@mathworks.com")) (:maintainers ("Eric M. Ludlam" . "eludlam@mathworks.com") ("Uwe Brauer" . "oub@mat.ucm.es") ("John Ciolfi" . "john.ciolfi.32@gmail.com")) (:maintainer "Eric M. Ludlam" . "eludlam@mathworks.com"))]) + (maude-mode . [(20230504 937) ((emacs (25))) "Emacs mode for the programming language Maude" tar ((:url . "https://github.com/rudi/abs-mode") (:commit . "2e1f68a890493d964f933d6e40b0ede047f70ede") (:revdesc . "2e1f68a89049") (:keywords "languages" "maude") (:authors ("Ellef Gjelstad" . "ellefg+maude*ifi.uio.no")) (:maintainers ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at"))]) + (maven-test-mode . [(20141220 557) ((s (1 9)) (emacs (24))) "Utilities for navigating test files and running maven test tasks" tar ((:url . "http://github.com/rranelli/maven-test-mode") (:commit . "a19151861df2ad8ae4880a2e7c86ddf848cb569a") (:revdesc . "a19151861df2") (:keywords "java" "maven" "test"))]) + (maxframe . [(20170120 1705) nil "Maximize the emacs frame based on display size" tar ((:url . "https://github.com/rmm5t/maxframe.el") (:commit . "13bda6dd9f1d96aa4b9dd9957a26cefd399a7772") (:revdesc . "13bda6dd9f1d") (: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 ((:url . "https://gitlab.com/sasanidas/maxima") (:commit . "2de798f6644753772553cd0420d3c419ed50dd0b") (:revdesc . "2de798f66447") (:keywords "maxima" "tools" "math") (:maintainers ("Fermin Munoz" . "fmfs@posteo.net")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net"))]) + (mb-url . [(20250518 621) ((emacs (25))) "Multiple Backends for Emacs URL package" tar ((:url . "https://github.com/dochang/mb-url") (:commit . "3d714075ad31c7c0e119c289b074f143575e86b7") (:revdesc . "3d714075ad31") (:keywords "comm" "data" "processes" "hypermedia") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainers ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com"))]) + (mbe . [(20151126 1134) ((emacs (24)) (cl-lib (0 5))) "Macros by Example" tar ((:url . "https://github.com/ijp/mbe.el") (:commit . "bb10aa8f26bb7e9b1d5746934c94edb00402940c") (:revdesc . "bb10aa8f26bb") (:keywords "tools" "macros") (:authors ("Ian Price" . "ianprice90@googlemail.com")) (:maintainers ("Ian Price" . "ianprice90@googlemail.com")) (:maintainer "Ian Price" . "ianprice90@googlemail.com"))]) + (mbo70s-theme . [(20170808 1315) ((emacs (24 0))) "70s style palette, with similarities to mbo theme" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "bed3db8965708ed4e9482b224a9b084765c052f2") (:revdesc . "bed3db896570"))]) + (mbsync . [(20200128 1053) nil "Run mbsync to fetch mails" tar ((:url . "https://github.com/dimitri/mbsync-el") (:commit . "d3c81da81ce5b154c0d048047a47277338721a70") (:revdesc . "d3c81da81ce5") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org"))]) + (mc-calc . [(20200420 1836) ((emacs (24 4)) (multiple-cursors (1 2 1))) "Combine multiple-cursors and calc" tar ((:url . "https://github.com/hatheroldev/mc-calc") (:commit . "74a046a5728919a4d1135ca62738326b0dde278c") (:revdesc . "74a046a57289") (:keywords "convenience") (:authors (nil . "FrankRolandhatheroldev@fgmail.com")) (:maintainers (nil . "FrankRolandhatheroldev@fgmail.com")) (:maintainer nil . "FrankRolandhatheroldev@fgmail.com"))]) + (mc-extras . [(20231206 1655) ((multiple-cursors (1 2 1))) "Extra functions for multiple-cursors mode" tar ((:url . "https://github.com/knu/mc-extras.el") (:commit . "8718cbdaa7bf3dd5c0f30c66a36a6bfbdf7f07c1") (:revdesc . "8718cbdaa7bf") (:keywords "editing" "cursors") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (mcp . [(20251219 314) ((emacs (30 1)) (jsonrpc (1 0 25))) "Model Context Protocol" tar ((:url . "https://github.com/lizqwerscott/mcp.el") (:commit . "125e0a4478ff1404880ea4e593f5e4ff0122cb83") (:revdesc . "125e0a4478ff") (:keywords "tools") (:authors ("lizqwer scott" . "lizqwerscott@gmail.com")) (:maintainers ("lizqwer scott" . "lizqwerscott@gmail.com")) (:maintainer "lizqwer scott" . "lizqwerscott@gmail.com"))]) + (mcp-server-lib . [(20251103 541) ((emacs (27 1))) "Model Context Protocol server library" tar ((:url . "https://github.com/laurynas-biveinis/mcp-server-lib.el") (:commit . "847bcb180b6c035ee07f497e0ffc8092b3e54c4a") (:revdesc . "847bcb180b6c") (:keywords "comm" "tools") (:authors ("Laurynas Biveinis" . "laurynas.biveinis@gmail.com")) (:maintainers ("Laurynas Biveinis" . "laurynas.biveinis@gmail.com")) (:maintainer "Laurynas Biveinis" . "laurynas.biveinis@gmail.com"))]) + (md-readme . [(20191112 1943) nil "Markdown-formatted READMEs for your ELisp" tar ((:url . "http://github.com/thomas11/md-readme/tree/master") (:commit . "ca99f44de11fab18d1f50d4b1722f2ceee3c814d") (:revdesc . "ca99f44de11f") (:keywords "lisp" "help" "readme" "markdown" "header" "documentation" "github") (:authors ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainers ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainer "Thomas Kappler" . "tkappler@gmail.com"))]) + (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 ((:url . "https://github.com/ahungry/md4rd") (:commit . "2fa198af749e9ddb759e052d911f56a626088903") (:revdesc . "2fa198af749e") (:keywords "ahungry" "reddit" "browse" "news") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (media-progress . [(20250511 1045) ((emacs (28 1))) "Display position where media player stopped" tar ((:url . "https://github.com/jumper047/media-progress") (:commit . "7055f5830690c9b1330816f899ee05791f35b406") (:revdesc . "7055f5830690") (:keywords "files" "convenience") (:authors ("Dmitriy Pshonko" . "http://github.com/jumper047")) (:maintainers ("Dmitriy Pshonko" . "http://github.com/jumper047")) (:maintainer "Dmitriy Pshonko" . "http://github.com/jumper047"))]) + (media-progress-dired . [(20230527 2209) ((emacs (28 1)) (media-progress (0 1 0))) "Display position where media player stopped in dired buffer" tar ((:url . "https://github.com/jumper047/media-progress") (:commit . "438a37019383eef35e45875b3e4df3fca4eaf39f") (:revdesc . "438a37019383") (:keywords "files" "convenience") (:authors ("Dmitriy Pshonko" . "http://github.com/jumper047")) (:maintainers ("Dmitriy Pshonko" . "http://github.com/jumper047")) (:maintainer "Dmitriy Pshonko" . "http://github.com/jumper047"))]) + (media-progress-dirvish . [(20250511 1045) ((emacs (28 1)) (dirvish (2 0 0)) (media-progress (0 1 0))) "Display position where media player stopped in dirvish" tar ((:url . "https://github.com/jumper047/media-progress") (:commit . "7055f5830690c9b1330816f899ee05791f35b406") (:revdesc . "7055f5830690") (:keywords "files" "convenience") (:authors ("Dmitriy Pshonko" . "http://github.com/jumper047")) (:maintainers ("Dmitriy Pshonko" . "http://github.com/jumper047")) (:maintainer "Dmitriy Pshonko" . "http://github.com/jumper047"))]) + (media-thumbnail . [(20240816 458) ((emacs (28 1))) "Utility package to provide media icons" tar ((:url . "https://github.com/jojojames/media-thumbnail") (:commit . "190632c1d6cc2ab94031d57e0c24412a4698faf0") (:revdesc . "190632c1d6cc") (:keywords "files" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (mediawiki . [(20251123 1653) ((emacs (28 1))) "Mediawiki frontend" tar ((:url . "https://github.com/hexmode/mediawiki-el") (:commit . "cf091148fd8fcf17d81bc5ad556ae18c839f6507") (:revdesc . "cf091148fd8f") (:keywords "mediawiki" "wikipedia" "network" "wiki") (:authors ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainers ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org"))]) + (meep . [(20251224 557) ((emacs (30 1))) "Lightweight modal editing" tar ((:url . "https://codeberg.org/ideasman42/emacs-meep") (:commit . "4bc650418af3f2a1c696ecbd6eb4ba77099f58af") (:revdesc . "4bc650418af3") (:keywords "convenience" "modal-editing") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (meghanada . [(20220101 505) ((emacs (24 3)) (yasnippet (0 6 1)) (company (0 9 0)) (flycheck (0 23))) "A better java development mode" tar ((:url . "https://github.com/mopemope/meghanada-emacs") (:commit . "59c46cabb7eee715fe810ce59424934a1286df84") (:revdesc . "59c46cabb7ee") (:keywords "languages" "java") (:authors ("Yutaka Matsubara" . "(yutaka.matsubara@gmail.com)")) (:maintainers ("Yutaka Matsubara" . "(yutaka.matsubara@gmail.com)")) (:maintainer "Yutaka Matsubara" . "(yutaka.matsubara@gmail.com)"))]) + (melancholy-theme . [(20240417 136) ((emacs (27 1))) "A dark theme that's pretty sad -*- lexical-binding: t; -" tar ((:url . "https://gitlab.com/baaash/melancholy-theme") (:commit . "7ba2bb3f062e798236bfb589381691c5bd9a22be") (:revdesc . "7ba2bb3f062e") (:keywords "faces" "frames") (:authors ("@baaash" . "bleat@baaa.sh")) (:maintainers ("@baaash" . "bleat@baaa.sh")) (:maintainer "@baaash" . "bleat@baaa.sh"))]) + (mellow-theme . [(20170808 1317) ((emacs (24 0))) "An Emacs 24 theme based on Mellow (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "2bdf18f05f5212b6f269d9a94afe2cf201766891") (:revdesc . "2bdf18f05f52"))]) + (melpa-upstream-visit . [(20130720 1033) ((s (1 6 0))) "A set of kludges to visit a melpa-hosted package's homepage" tar ((:url . "https://github.com/laynor/melpa-upstream-visit") (:commit . "7310c74fdead3c0f86ad6eff76cf989e63f70f66") (:revdesc . "7310c74fdead") (:keywords "convenience") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainers ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))]) + (memento-mori . [(20240702 2332) ((emacs (24 4))) "Reminder of our mortality" tar ((:url . "https://github.com/gvol/emacs-memento-mori") (:commit . "c53707871aa5aeb551c6b9c02bdca6f477bc9c5b") (:revdesc . "c53707871aa5") (:keywords "help") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com"))]) + (memoize . [(20200103 2036) nil "Memoization functions" tar ((:url . "https://github.com/skeeto/emacs-memoize") (:commit . "51b075935ca7070f62fae1d69fe0ff7d8fa56fdd") (:revdesc . "51b075935ca7") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainers ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com"))]) + (memolist . [(20150804 1721) ((markdown-mode (22 0)) (ag (0 45))) "Memolist.el is Emacs port of memolist.vim" tar ((:url . "http://github.com/mikanfactory/emacs-memolist") (:commit . "60c296e202a71e9dcf1c3936d47b5c4b95c5839f") (:revdesc . "60c296e202a7") (:keywords "markdown" "memo") (:authors ("mikanfactory" . "k952i4j14x17_at_gmail.com")))]) + (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 ((:url . "https://github.com/skangas/mentor") (:commit . "f51dd4f3f87c54b7cc92189924b9d873a53f5a75") (:revdesc . "f51dd4f3f87c") (:keywords "comm" "processes" "bittorrent") (:authors ("Stefan Kangas" . "stefankangas@gmail.com")) (:maintainers ("Stefan Kangas" . "stefankangas@gmail.com")) (:maintainer "Stefan Kangas" . "stefankangas@gmail.com"))]) + (meow . [(20250904 1606) ((emacs (27 1))) "Yet Another modal editing" tar ((:url . "https://www.github.com/DogLooksGood/meow") (:commit . "ff5315b3b2ebc9a37414cbd2f2a3378162f9953a") (:revdesc . "ff5315b3b2eb") (:keywords "convenience" "modal-editing"))]) + (meow-tree-sitter . [(20251214 323) ((emacs (29 1)) (meow (1 2 0))) "Tree-sitter powered motions for Meow" tar ((:url . "https://github.com/skissue/meow-tree-sitter") (:commit . "f050dc0867b7a37efc2c6432b33305a0f14b1029") (:revdesc . "f050dc0867b7") (:keywords "convenience" "files" "languages" "tools") (:authors ("Ad" . "me@skissue.xyz")) (:maintainers ("Ad" . "me@skissue.xyz")) (:maintainer "Ad" . "me@skissue.xyz"))]) + (merlin . [(20240925 900) ((emacs (25 1))) "Mode for Merlin, an assistant for OCaml" tar ((:url . "https://github.com/ocaml/merlin") (:commit . "80e919cf32a62acdaee95a5dab9b4bc18a8b4034") (:revdesc . "80e919cf32a6") (:keywords "ocaml" "languages") (:authors ("Frédéric Bour" . "frederic.bourlakaban.net")) (:maintainers ("Frédéric Bour" . "frederic.bourlakaban.net")) (:maintainer "Frédéric Bour" . "frederic.bourlakaban.net"))]) + (merlin-ac . [(20221123 1408) ((emacs (25 1)) (merlin (3)) (auto-complete (1 5))) "Merlin and auto-complete integration" tar ((:url . "http://github.com/ocaml/merlin") (:commit . "8bcab034a680f57ddf58092fda6288dc4caddd2a") (:revdesc . "8bcab034a680") (:keywords "ocaml" "languages") (:authors ("Simon Castellan" . "simon.castellaniuwt.fr") ("Frédéric Bour" . "frederic.bourlakaban.net") ("Thomas Refis" . "thomas.refisgmail.com")) (:maintainers ("Simon Castellan" . "simon.castellaniuwt.fr") ("Frédéric Bour" . "frederic.bourlakaban.net") ("Thomas Refis" . "thomas.refisgmail.com")) (:maintainer "Simon Castellan" . "simon.castellaniuwt.fr"))]) + (merlin-company . [(20221123 1408) ((emacs (25 1)) (merlin (3)) (company (0 9))) "Merlin and company mode integration" tar ((:url . "http://github.com/ocaml/merlin") (:commit . "8bcab034a680f57ddf58092fda6288dc4caddd2a") (:revdesc . "8bcab034a680") (:keywords "ocaml" "languages") (:authors ("Simon Castellan" . "simon.castellaniuwt.fr") ("Frédéric Bour" . "frederic.bourlakaban.net") ("Thomas Refis" . "thomas.refisgmail.com")) (:maintainers ("Simon Castellan" . "simon.castellaniuwt.fr") ("Frédéric Bour" . "frederic.bourlakaban.net") ("Thomas Refis" . "thomas.refisgmail.com")) (:maintainer "Simon Castellan" . "simon.castellaniuwt.fr"))]) + (merlin-eldoc . [(20230213 555) ((emacs (24 4)) (merlin (3 0))) "Eldoc for OCaml and Reason" tar ((:url . "https://github.com/khady/merlin-eldoc") (:commit . "bf8edc63d85b35e4def352fa7ce4ea39f43e1fd8") (:revdesc . "bf8edc63d85b") (:keywords "merlin" "ocaml" "languages" "eldoc") (:authors ("Louis Roché" . "louis@louisroche.net")) (:maintainers ("Louis Roché" . "louis@louisroche.net")) (:maintainer "Louis Roché" . "louis@louisroche.net"))]) + (merlin-iedit . [(20221123 1408) ((emacs (25 1)) (merlin (3)) (iedit (0 9))) "Merlin and iedit integration" tar ((:url . "http://github.com/ocaml/merlin") (:commit . "8bcab034a680f57ddf58092fda6288dc4caddd2a") (:revdesc . "8bcab034a680") (:keywords "ocaml" "languages") (:authors ("Simon Castellan" . "simon.castellaniuwt.fr") ("Frédéric Bour" . "frederic.bourlakaban.net") ("Thomas Refis" . "thomas.refisgmail.com")) (:maintainers ("Simon Castellan" . "simon.castellaniuwt.fr") ("Frédéric Bour" . "frederic.bourlakaban.net") ("Thomas Refis" . "thomas.refisgmail.com")) (:maintainer "Simon Castellan" . "simon.castellaniuwt.fr"))]) + (mermaid-docker-mode . [(20250424 1730) ((emacs (26 1)) (mermaid-mode (20230517 1527 -4))) "Render mermaid graphs with Docker service" tar ((:url . "https://github.com/KeyWeeUsr/mermaid-docker-mode") (:commit . "ce5f941cdb1bb360872bd5f80574a50d23f85531") (:revdesc . "ce5f941cdb1b") (:keywords "convenience" "docker" "mermaid" "mmd" "graph" "design" "jpg" "image" "api") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (mermaid-mode . [(20250718 1858) ((emacs (25 3))) "Major mode for working with mermaid graphs" tar ((:url . "https://github.com/abrochard/mermaid-mode") (:commit . "9535d513b41ed11bcd91f644815e2db6430c1560") (:revdesc . "9535d513b41e") (:keywords "mermaid" "graphs" "tools" "processes"))]) + (mermaid-ts-mode . [(20250803 205) ((emacs (29 1))) "Major mode for Mermaid" tar ((:url . "https://github.com/JonathanHope/mermaid-ts-mode") (:commit . "973e442cbed980cf51afc256c90ef133c4d02141") (:revdesc . "973e442cbed9") (:keywords "mermaid" "languages") (:authors ("Jonathan Hope" . "jhope@theflatfield.net")) (:maintainers ("Jonathan Hope" . "jhope@theflatfield.net")) (:maintainer "Jonathan Hope" . "jhope@theflatfield.net"))]) + (meson-mode . [(20240601 1647) ((emacs (26 1))) "Major mode for the Meson build system files" tar ((:url . "https://github.com/wentasah/meson-mode") (:commit . "0449c649daaa9322e1c439c1540d8c290501d455") (:revdesc . "0449c649daaa") (:keywords "languages" "tools") (:authors ("Michal Sojka" . "sojkam1@fel.cvut.cz")) (:maintainers ("Michal Sojka" . "sojkam1@fel.cvut.cz")) (:maintainer "Michal Sojka" . "sojkam1@fel.cvut.cz"))]) + (mess . [(20230718 1533) ((emacs (27 1)) (mame (1 0))) "Front-end for MAME MESS" tar ((:url . "https://github.com/Iacob/elmame") (:commit . "65392b0d0ded45de789d4deab28a4ce88de24567") (:revdesc . "65392b0d0ded") (:authors ("Yong" . "luo.yong.name@gmail.com")) (:maintainers ("Yong" . "luo.yong.name@gmail.com")) (:maintainer "Yong" . "luo.yong.name@gmail.com"))]) + (message-attachment-reminder . [(20230124 520) ((emacs (24 1))) "Remind if missing attachment" tar ((:url . "https://github.com/alexmurray/message-attachment-reminder") (:commit . "975381d6e7c6771c462e73abd3398a4ed2a9b86b") (:revdesc . "975381d6e7c6") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainers ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com"))]) + (message-view-patch . [(20210904 2227) ((emacs (24 4)) (magit (3 0 0))) "Colorize patch-like emails in mu4e" tar ((:url . "https://github.com/seanfarley/message-view-patch") (:commit . "50dd3d92a1794f24b7e375b74e5199c63b54a2d8") (:revdesc . "50dd3d92a179") (:keywords "extensions" "mu4e" "gnus"))]) + (messages-are-flowing . [(20191029 954) nil "Visible indication when composing \"flowed\" emails" tar ((:url . "https://github.com/legoscia/messages-are-flowing") (:commit . "d582a564a63b7b90764ffc5c618bc5300225d0ab") (:revdesc . "d582a564a63b") (:keywords "mail") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainers ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com"))]) + (meta-presenter . [(20210714 1658) nil "A simple multi-file presentation tool for Emacs" tar ((:url . "http://ismail.teamfluxion.com") (:commit . "4ab48dacea245b223a0ffd2723ece746bd61c0af") (:revdesc . "4ab48dacea24") (:keywords "productivity" "presentation") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainers ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com"))]) + (metal-archives . [(20240824 1023) ((emacs (26 3)) (alert (1 2)) (ht (2 3)) (request (0 2 2))) "List future releases using Metal-Archives API" tar ((:url . "https://github.com/seblemaguer/metal-archives.el") (:commit . "c474246c0c6b688a34e69c04261d4cd993189dc3") (:revdesc . "c474246c0c6b") (:keywords "lisp" "calendar") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainers ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie"))]) + (metal-archives-shopping-list . [(20251204 1858) ((emacs (26 3)) (org-ml (5 8 7)) (alert (1 2)) (ht (2 3)) (metal-archives (0 3))) "Add shopping list generation support to metal-archives" tar ((:url . "https://github.com/seblemaguer/metal-archives.el") (:commit . "b4924354481b853a6fee58b2817a6b0a3e1674b7") (:revdesc . "b4924354481b") (:keywords "org" "calendar") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainers ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie"))]) + (metalheart-theme . [(20160710 641) ((emacs (24))) "Low-contrast theme with a dark blue-green background" tar ((:url . "https://github.com/mswift42/MetalHeart-Emacs") (:commit . "ec98ea2c11dc1213dae8cbe1fe0cee73ca138bb2") (:revdesc . "ec98ea2c11dc"))]) + (metamorph . [(20220328 129) ((emacs (26 1))) "Transform your buffers with lisp" tar ((:url . "http://github.com/AdamNiederer/metamorph") (:commit . "3633e32a9601c491df32d6c2212dbe63dc6484f4") (:revdesc . "3633e32a9601") (:keywords "metaprogramming" "wp") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com"))]) + (metascript-mode . [(20150709 57) ((emacs (24 3))) "Major mode for the Metascript programming language" tar ((:url . "http://github.com/metascript/metascript-mode") (:commit . "edb361c7b0e5de231e5334a17b90652fb1df78f9") (:revdesc . "edb361c7b0e5") (:keywords "languages" "metascript" "mjs"))]) + (metaweblog . [(20250721 2333) ((emacs (29 4)) (xml-rpc (1 6 15))) "An XML-RPC MetaWeblog and WordPress API client" tar ((:url . "https://github.com/org2blog/org2blog") (:commit . "a47847c4231800335786e624025cb58760a4746e") (:revdesc . "a47847c42318") (:keywords "comm") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")) (:maintainers ("Grant Rettke" . "grant@wisdomandwonder.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com"))]) + (metrics-tracker . [(20250120 1606) ((emacs (24 4)) (seq (2 3))) "Generate reports of personal metrics from diary entries" tar ((:url . "https://github.com/ianxm/emacs-tracker") (:commit . "a58591bad91854f63f539eb4657004f029c1ca24") (:revdesc . "a58591bad918") (:keywords "calendar") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainers ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu"))]) + (metronome . [(20230515 1850) ((emacs (25 1))) "The missing metronome for GNU Emacs" tar ((:url . "https://git.sr.ht/~jagrg/metronome") (:commit . "4811b54d800d1bb69fd501ffeab3adf86978362d") (:revdesc . "4811b54d800d") (:authors ("Jonathan Gregory" . "jgrgatautisticidotorg")) (:maintainers ("Jonathan Gregory" . "jgrgatautisticidotorg")) (:maintainer "Jonathan Gregory" . "jgrgatautisticidotorg"))]) + (mew . [(20251127 544) nil "Messaging in the Emacs World" tar ((:url . "https://github.com/kazu-yamamoto/Mew") (:commit . "505fa0a42dd16a361bd08030318725ddc8bd8954") (:revdesc . "505fa0a42dd1"))]) + (mexican-holidays . [(20210604 1421) nil "Mexico holidays for Emacs calendar" tar ((:url . "https://github.com/sggutier/mexican-holidays") (:commit . "8e28907ea69f2c0ed9aad9f3b99664ca147379d0") (:revdesc . "8e28907ea69f") (:keywords "calendar") (:authors ("Saúl Gutiérrez" . "me@sggc.me")) (:maintainers ("Saúl Gutiérrez" . "me@sggc.me")) (:maintainer "Saúl Gutiérrez" . "me@sggc.me"))]) + (meyvn . [(20250815 2140) ((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 ((:url . "https://github.com/danielsz/meyvn-el") (:commit . "5380626e327b7a48531c4a652bab4896ba179312") (:revdesc . "5380626e327b") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainers ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com"))]) + (mgmtconfig-mode . [(20251028 2100) ((emacs (24 3))) "Mgmt configuration management language" tar ((:url . "https://github.com/purpleidea/mgmt/misc/emacs") (:commit . "7079121217a345c45a31f4f75f6f3b1c0d92a84e") (:revdesc . "7079121217a3") (:keywords "languages") (:authors ("Peter Oliver" . "mgmtconfig@mavit.org.uk")) (:maintainers ("Mgmt contributors" . "https://github.com/purpleidea/mgmt")) (:maintainer "Mgmt contributors" . "https://github.com/purpleidea/mgmt"))]) + (mhc . [(20250904 940) ((calfw (20150703))) "Message Harmonized Calendaring system" tar ((:url . "http://www.quickhack.net/mhc") (:commit . "2e5e6260363744f124bd0ca22ac7d5962e32fd87") (:revdesc . "2e5e62603637") (:keywords "calendar") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net"))]) + (miasma-theme . [(20250513 2310) nil "Miasma: color theme inspired by the woods" tar ((:url . "http://github.com/daut/miasma-theme.el") (:commit . "7eda5d6889716811e7d5fd51edaff9ed7b09ce15") (:revdesc . "7eda5d688971"))]) + (mic . [(20240806 1655) ((emacs (26 1))) "Minimal and combinable configuration manager" tar ((:url . "https://github.com/ROCKTAKEY/mic") (:commit . "f552ddf397e899e9c2b96ef4e56a08cc8804a1c5") (:revdesc . "f552ddf397e8") (:keywords "convenience") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (mic-paren . [(20170731 1907) nil "Advanced highlighting of matching parentheses" tar ((:url . "https://github.com/emacsattic/mic-paren") (:commit . "d0410c7d805c9aaf51a1bcefaaef092bed5824c4") (:revdesc . "d0410c7d805c") (:keywords "languages" "faces" "parenthesis" "matching") (:authors ("Mikael Sjödin" . "(mic@docs.uu.se)") ("Klaus Berndl" . "berndl@sdm.de") ("Jonathan Kotta" . "jpkotta@gmail.com")))]) + (micgoline . [(20160415 326) ((emacs (24 3)) (powerline (2 3))) "Powerline mode, color schemes from microsoft and google's logo" tar ((:url . "https://github.com/yzprofile/micgoline") (:commit . "e3e2effe4846175a3b52b4092c0c134ced5978d8") (:revdesc . "e3e2effe4846") (:keywords "mode-line" "powerline" "theme") (:authors ("yzprofile" . "yzprofiles@gmail.com")) (:maintainers ("yzprofile" . "yzprofiles@gmail.com")) (:maintainer "yzprofile" . "yzprofiles@gmail.com"))]) + (micromamba . [(20250705 2025) ((emacs (27 1)) (pythonic (0 1 0))) "A library for working with micromamba environments" tar ((:url . "https://github.com/SqrtMinusOne/micromamba.el") (:commit . "f0cc31ea2e3d64e1055a8c63700f373a389dc4c0") (:revdesc . "f0cc31ea2e3d") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (migemo . [(20250616 309) ((emacs (25))) "Japanese incremental search through dynamic pattern expansion" tar ((:url . "https://github.com/emacs-jp/migemo") (:commit . "c0d84b4092ddade01110ba875559bfd454862ac2") (:revdesc . "c0d84b4092dd") (: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"))]) + (milkode . [(20140927 529) nil "Command line search and direct jump with Milkode" tar ((:url . "https://github.com/ongaeshi/emacs-milkode") (:commit . "ba97e2aeefa1d9d0b3835bf08edd0de248b0c513") (:revdesc . "ba97e2aeefa1") (:keywords "milkode" "search" "grep" "jump" "keyword"))]) + (mimetypes . [(20201115 1605) ((emacs (25 1))) "Guess a file's mimetype by extension" tar ((:url . "https://github.com/cniles/emacs-mimetypes") (:commit . "1663054ce266ed25e47ec707c19f619d33225903") (:revdesc . "1663054ce266") (:authors ("Craig Niles" . "niles.catgmail.com")) (:maintainers ("Craig Niles" . "niles.catgmail.com")) (:maintainer "Craig Niles" . "niles.catgmail.com"))]) + (mindstream . [(20250821 2237) ((emacs (26 1)) (magit (3 3 0))) "Start writing, stay focused, don't worry" tar ((:url . "https://github.com/countvajhula/mindstream") (:commit . "f76934cdda1c5aa3cf6e64c7ffab350ee97bc22d") (:revdesc . "f76934cdda1c") (:keywords "convenience" "files" "languages" "outlines" "tools" "vc" "wp") (:authors ("Siddhartha Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Siddhartha Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Siddhartha Kasivajhula" . "sid@countvajhula.com"))]) + (minesweeper . [(20200416 2342) nil "Play minesweeper in Emacs" tar ((:url . "https://hg.sr.ht/~zck/minesweeper") (:commit . "d4248e3c9b3e9e7277cb9e6d081330611898f334") (:revdesc . "d4248e3c9b3e") (:keywords "game" "fun" "minesweeper" "inane" "diversion") (:authors ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainers ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainer "Zachary Kanfer" . "zkanfer@gmail.com"))]) + (mingus . [(20230518 1726) ((libmpdee (2 2))) "MPD Interface" tar ((:url . "https://github.com/pft/mingus") (:commit . "3fa9b95552eb062eb245321abb7f442c458618dc") (:revdesc . "3fa9b95552eb") (:keywords "multimedia" "elisp" "music" "mpd") (:authors ("Niels Giesen" . "pfton#emacs")) (:maintainers ("Niels Giesen" . "pfton#emacs")) (:maintainer "Niels Giesen" . "pfton#emacs"))]) + (mini-echo . [(20251203 1147) ((emacs (29 1)) (hide-mode-line (1 0 3))) "Echo buffer status in minibuffer window" tar ((:url . "https://github.com/eki3z/mini-echo.el") (:commit . "3a490395652ff7938129f84c7154996672244baf") (:revdesc . "3a490395652f") (:keywords "frames") (:authors ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz95@gmail.com"))]) + (mini-frame . [(20220627 2041) ((emacs (26 1))) "Show minibuffer in child frame on read-from-minibuffer" tar ((:url . "https://github.com/muffinmad/emacs-mini-frame") (:commit . "60838f3cab438dcbda8eaa15ab3e5d1af88910e9") (:revdesc . "60838f3cab43") (:keywords "frames") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com"))]) + (mini-header-line . [(20170621 1221) ((emacs (24 4))) "A minimal header-line" tar ((:url . "https://github.com/ksjogo/mini-header-line") (:commit . "73b6724e0a26c4528d93768191c8aa59e6bce2e5") (:revdesc . "73b6724e0a26") (:keywords "header-line" "mode-line"))]) + (mini-modeline . [(20230306 1521) ((emacs (25 1)) (dash (2 12 0))) "Display modeline in minibuffer" tar ((:url . "https://github.com/kiennq/emacs-mini-modeline") (:commit . "86e753b6c38a06b0fc80d7560aa6a25245fd4d38") (:revdesc . "86e753b6c38a") (:keywords "convenience" "tools") (:authors ("Kien Nguyen" . "kien.n.quang@gmail.com")) (:maintainers ("Kien Nguyen" . "kien.n.quang@gmail.com")) (:maintainer "Kien Nguyen" . "kien.n.quang@gmail.com"))]) + (minibuf-isearch . [(20151226 1943) nil "Incremental search on minibuffer history" tar ((:url . "https://github.com/knagano/minibuf-isearch") (:commit . "2846c6ac369ee623dad4cd3c8a7a6d9078965516") (:revdesc . "2846c6ac369e") (:keywords "minibuffer" "history" "incremental search") (:authors ("Keiichiro Nagano" . "knagano@sodan.org") ("Hideyuki SHIRAI" . "shirai@meadowy.org")) (:maintainers ("Keiichiro Nagano" . "knagano@sodan.org") ("Hideyuki SHIRAI" . "shirai@meadowy.org")) (:maintainer "Keiichiro Nagano" . "knagano@sodan.org"))]) + (minibuffer-complete-cycle . [(20130813 1645) nil "Cycle through the *Completions* buffer" tar ((:url . "https://github.com/knu/minibuffer-complete-cycle") (:commit . "3df80135887d0169e02294a948711f6dfeca4a6f") (:revdesc . "3df80135887d") (:keywords "completion") (:authors ("Akinori MUSHA" . "knu@iDaemons.org") ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (minibuffer-cua . [(20130906 1134) nil "Make CUA mode's S-up/S-down work in minibuffer" tar ((:url . "https://github.com/knu/minibuffer-cua.el") (:commit . "adc4979a64f8b36e05960e9afa0746dfa9e2e4c7") (:revdesc . "adc4979a64f8") (:keywords "completion" "editing") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (minibuffer-modifier-keys . [(20210823 713) ((emacs (24 3))) "Use spacebar as a modifier key in the minibuffer" tar ((:url . "https://github.com/SpringHan/minibuffer-modifier-keys.git") (:commit . "944cdc01049f7e4b563675495f4d27cb018ca2f0") (:revdesc . "944cdc01049f") (:keywords "tools"))]) + (miniedit . [(20100419 1745) nil "Enhanced editing for minibuffer fields" tar ((:url . "https://github.com/emacsorphanage/miniedit") (:commit . "e12bf659c3eb92dd8a4cb77642dc0865c54667a3") (:revdesc . "e12bf659c3eb"))]) + (minimal-dashboard . [(20251102 1952) ((emacs (27 1))) "A very minimal dashboard plugin" tar ((:url . "https://github.com/dheerajshenoy/minimal-dashboard.el") (:commit . "b7dbce88a19777c0d33df025e2b830094e521af8") (:revdesc . "b7dbce88a197") (:keywords "startup" "screen" "tools" "dashboard") (:authors ("Dheeraj Vittal Shenoy" . "dheerajshenoy22@gmail.com")) (:maintainers ("Dheeraj Vittal Shenoy" . "dheerajshenoy22@gmail.com")) (:maintainer "Dheeraj Vittal Shenoy" . "dheerajshenoy22@gmail.com"))]) + (minimal-session-saver . [(20250228 1021) nil "Very lean session saver" tar ((:url . "http://github.com/rolandwalker/minimal-session-saver") (:commit . "1146d071c370bc3de33538e2d20172a9cca29ba2") (:revdesc . "1146d071c370") (:keywords "tools" "frames" "project") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (minimal-theme . [(20250921 2102) nil "A light/dark minimalistic Emacs 24 theme" tar ((:url . "http://github.com/nullvec/minimal-theme") (:commit . "4382db5c4afc3beab0a356f8867bf480bddc5273") (:revdesc . "4382db5c4afc") (:keywords "color" "theme" "minimal") (:authors ("A. Hdez" . "trefoil_chilled_7k@icloud.com")) (:maintainers ("A. Hdez" . "trefoil_chilled_7k@icloud.com")) (:maintainer "A. Hdez" . "trefoil_chilled_7k@icloud.com"))]) + (minions . [(20251211 1945) ((emacs (26 1)) (compat (30 1))) "A minor-mode menu for the mode line" tar ((:url . "https://github.com/tarsius/minions") (:commit . "4e27da98ab8f6dc5b56a9e5e2b537f5230da7af7") (:revdesc . "4e27da98ab8f") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "emacs.minions@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.minions@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.minions@jonas.bernoulli.dev"))]) + (minitest . [(20250803 49) ((dash (1 0 0)) (emacs (24 3))) "An minor mode for ruby minitest files" tar ((:url . "https://git.sr.ht/~shoshin/minitest-emacs") (:commit . "d278e94fb1874c584699e1d6fa1b34224c1f8550") (:revdesc . "d278e94fb187"))]) + (minizinc-mode . [(20180201 1450) ((emacs (24 1))) "Major mode for MiniZinc code" tar ((:url . "http://github.com/m00nlight/minizinc-mode") (:commit . "2512521ba7f8e263a06db88df663fc6b3cca7e16") (:revdesc . "2512521ba7f8") (:keywords "languages" "minizinc"))]) + (minizinc-ts-mode . [(20250831 753) ((emacs (29 1))) "Major mode for the MiniZinc constraint modeling language" tar ((:url . "https://github.com/AjaiKN/minizinc-ts-mode") (:commit . "c449cde23b8101c589a4cce20b01ea1933978be0") (:revdesc . "c449cde23b81") (:keywords "languages") (:authors ("Ajai Khatri Nelson" . "emacs@ajai.dev")) (:maintainers ("Ajai Khatri Nelson" . "emacs@ajai.dev")) (:maintainer "Ajai Khatri Nelson" . "emacs@ajai.dev"))]) + (minor-mode-hack . [(20170926 34) nil "Change priority of minor-mode keymaps" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/minor-mode-hack.el") (:commit . "c3aa957602c924c01fe07d48d191b8616fb3696a") (:revdesc . "c3aa957602c9") (:keywords "lisp") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (minsk-theme . [(20250706 1827) ((emacs (24))) "Minsk, a theme in deep muted greens" tar ((:url . "https://codeberg.org/loj/minsk-theme") (:commit . "c9caae876ef184053fef0bd3fee6243632702487") (:revdesc . "c9caae876ef1") (:keywords "theme" "faces") (:authors ("June Lo" . "loh.ka.tsun@gmail.com")) (:maintainers ("June Lo" . "loh.ka.tsun@gmail.com")) (:maintainer "June Lo" . "loh.ka.tsun@gmail.com"))]) + (mint-mode . [(20221031 411) ((emacs (25 1))) "Major mode for the Mint programming language" tar ((:url . "https://github.com/creatorrr/emacs-mint-mode") (:commit . "7bb0f9946f5833eada199e880fdc4efa6df09e0b") (:revdesc . "7bb0f9946f58") (:keywords "mint" "languages" "processes" "convenience" "tools" "files") (:authors ("Diwank Tomer" . "singh@diwank.name")) (:maintainers ("jgart" . "jgart@dismail.de")) (:maintainer "jgart" . "jgart@dismail.de"))]) + (minuet . [(20251218 2234) ((emacs (29)) (plz (0 9)) (dash (2 19 1))) "Code completion using LLM" tar ((:url . "https://github.com/milanglacier/minuet-ai.el") (:commit . "d3ce06dfd33f475a63544c1937868a907553afae") (:revdesc . "d3ce06dfd33f") (:authors ("Milan Glacier" . "dev@milanglacier.com")) (:maintainers ("Milan Glacier" . "dev@milanglacier.com")) (:maintainer "Milan Glacier" . "dev@milanglacier.com"))]) + (mip-mode . [(20151127 617) nil "Virtual projects for emacs" tar ((:url . "https://gitlab.com/gaudecker/mip-mode") (:commit . "7c88c383b4c7ed0a4c1dc397735f365c1fcb461c") (:revdesc . "7c88c383b4c7") (:keywords "workspaces" "workspace" "project" "projects" "mip-mode") (:authors ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainers ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainer "Eeli Reilin" . "gaudecker@fea.st"))]) + (mips-mode . [(20220608 1204) ((emacs (25 1))) "Major-mode for MIPS assembly" tar ((:url . "https://github.com/hlissner/emacs-mips-mode") (:commit . "98795cdc81979821ac35d9f94ce354cd99780c67") (:revdesc . "98795cdc8197") (:keywords "languages" "mips" "assembly") (:authors ("Henrik Lissner" . "http://github/hlissner")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io"))]) + (mise . [(20250910 1021) ((emacs (29 1)) (inheritenv (0 2))) "Support for `mise' cli" tar ((:url . "https://github.com/eki3z/mise.el") (:commit . "60ef63466d07417a9ef956af363baae39c9ddf34") (:revdesc . "60ef63466d07") (:keywords "tools" "processes") (:authors ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainers ("Eki Zhang" . "liuyinz95@gmail.com")) (:maintainer "Eki Zhang" . "liuyinz95@gmail.com"))]) + (mistty . [(20250716 1914) ((emacs (29 1))) "Shell/Comint alternative based on term.el" tar ((:url . "http://github.com/szermatt/mistty") (:commit . "bfb17611cff6c845270050a0756a38489cdf4ed6") (:revdesc . "bfb17611cff6") (:keywords "convenience" "unix") (:authors ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainers ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainer "Stephane Zermatten" . "szermatt@gmx.net"))]) + (mix . [(20240122 720) ((emacs (25 1))) "Mix Major Mode. Build Elixir using Mix" tar ((:url . "https://github.com/ayrat555/mix.el") (:commit . "16cc69cbf919769c191b1c49c1cab324fd0682a9") (:revdesc . "16cc69cbf919") (:keywords "tools") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainers ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com"))]) + (mixed-pitch . [(20210304 1900) ((emacs (24 3))) "Use a variable pitch, keeping fixed pitch where it's sensible" tar ((:url . "https://gitlab.com/jabranham/mixed-pitch") (:commit . "519e05f74825abf04b7d2e0e38ec040d013a125a") (:revdesc . "519e05f74825") (:authors ("J. Alexander Branham" . "branham@utexas.edu")) (:maintainers ("J. Alexander Branham" . "branham@utexas.edu")) (:maintainer "J. Alexander Branham" . "branham@utexas.edu"))]) + (mkdown . [(20140517 1418) ((markdown-mode (2 0))) "Pretty Markdown previews based on mkdown.com" tar ((:url . "https://github.com/ajtulloch/mkdown.el") (:commit . "8e23de82719af6c5b53b52b3308a02b3a1fb872e") (:revdesc . "8e23de82719a") (:keywords "markdown"))]) + (mlscroll . [(20250112 1440) ((emacs (27 1))) "A scroll bar for the modeline" tar ((:url . "https://github.com/jdtsmith/mlscroll") (:commit . "d22f5d8e6ca5054d01f06ac57419267098b709a5") (:revdesc . "d22f5d8e6ca5") (:keywords "convenience"))]) + (mmm-jinja2 . [(20170313 1420) ((mmm-mode (0 5 4))) "MMM submode class for Jinja2 Templates" tar ((:url . "https://github.com/glynnforrest/mmm-jinja2") (:commit . "c8cb763174fa2fb61b9a0e5e0ff8cb0210f8492f") (:revdesc . "c8cb763174fa") (:authors ("Ben Hayden" . "hayden767@gmail.com")) (:maintainers ("Ben Hayden" . "hayden767@gmail.com")) (:maintainer "Ben Hayden" . "hayden767@gmail.com"))]) + (mmm-mode . [(20240222 428) ((emacs (25 1)) (cl-lib (0 2))) "Allow Multiple Major Modes in a buffer" tar ((:url . "https://github.com/dgutov/mmm-mode") (:commit . "b1f5c7dbdc405e6e10d9ddd99a43a6b2ad61b176") (:revdesc . "b1f5c7dbdc40") (:keywords "convenience" "faces" "languages" "tools") (:authors ("Michael Abraham Shulman" . "viritrilbia@gmail.com")) (:maintainers ("Dmitry Gutov" . "dmitry@gutov.dev")) (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev"))]) + (mmt . [(20230606 1513) ((emacs (24 5))) "Missing macro tools for Emacs Lisp" tar ((:url . "https://github.com/mrkkrp/mmt") (:commit . "2a24463eeb72ebef100e89977ebfb88f5f220217") (:revdesc . "2a24463eeb72") (:keywords "macro" "lisp" "extensions") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (mo-git-blame . [(20160129 1759) nil "An interactive, iterative 'git blame' mode for Emacs" tar ((:url . "https://codeberg.org/mbunkus/mo-git-blame") (:commit . "254a675eb794cdbbdef9fa2b4b7bb510b70089c0") (:revdesc . "254a675eb794") (:keywords "tools") (:authors ("Moritz Bunkus" . "moritz@bunkus.org")) (:maintainers ("Moritz Bunkus" . "moritz@bunkus.org")) (:maintainer "Moritz Bunkus" . "moritz@bunkus.org"))]) + (mo-vi-ment-mode . [(20181217 206) nil "Provide vi-like cursor movement that's easy on the fingers" tar ((:url . "https://github.com/AjayMT/mo-vi-ment") (:commit . "e8b525ffc5faa31d36ecc5496b40f0f5c3603c08") (:revdesc . "e8b525ffc5fa") (:keywords "convenience") (:authors ("Ajay MT" . "ajay.tatachar@gmail.com")) (:maintainers ("Ajay MT" . "ajay.tatachar@gmail.com")) (:maintainer "Ajay MT" . "ajay.tatachar@gmail.com"))]) + (mobdebug-mode . [(20140110 346) ((lua-mode (20130419)) (emacs (24))) "Major mode for MobDebug" tar ((:url . "https://github.com/deftsp/mobdebug-mode") (:commit . "e1d483bc4e341c762bc5c0a8c52306a8d01ea0da") (:revdesc . "e1d483bc4e34") (:authors ("Shihpin Tseng" . "deftsp@gmail.com")) (:maintainers ("Shihpin Tseng" . "deftsp@gmail.com")) (:maintainer "Shihpin Tseng" . "deftsp@gmail.com"))]) + (moc . [(20241229 1056) ((emacs (29 4)) (hide-mode-line (1 0 3)) (transient (0 7 2))) "Master of Ceremonies" tar ((:url . "http://github.com/positron-solutions/moc") (:commit . "84acdd7d74cfd3b35637b84d49c53db203f657ce") (:revdesc . "84acdd7d74cf") (:keywords "convenience" "outline") (:authors ("Positron Solutions" . "contact@positron.solutions")) (:maintainers ("Positron Solutions" . "contact@positron.solutions")) (:maintainer "Positron Solutions" . "contact@positron.solutions"))]) + (mocha . [(20200729 1130) ((js2-mode (20150909)) (f (0 18))) "Run Mocha or Jasmine tests" tar ((:url . "http://github.com/scottaj/mocha.el") (:commit . "6a72fa20e7be6e55c09b1bc9887ee09c5df28e45") (:revdesc . "6a72fa20e7be") (:keywords "javascript" "mocha" "jasmine"))]) + (mocha-snippets . [(20190417 1931) ((yasnippet (0 8 0))) "Yasnippets for the Mocha JS Testing Framework" tar ((:url . "https://github.com/cowboyd/mocha-snippets.el") (:commit . "361a3809f755577406e109b9e44d473dfa7c08e0") (:revdesc . "361a3809f755") (:keywords "test" "javascript") (:authors ("Charles Lowell" . "cowboyd@frontside.io")) (:maintainers ("Charles Lowell" . "cowboyd@frontside.io")) (:maintainer "Charles Lowell" . "cowboyd@frontside.io"))]) + (mocker . [(20220727 1452) ((emacs (25 1))) "Mocking framework for emacs" tar ((:url . "https://github.com/sigma/mocker.el") (:commit . "4bd8d56eb4c3a1fcbbcdbf616f1b43e076b13eee") (:revdesc . "4bd8d56eb4c3") (:keywords "lisp" "testing") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))]) + (modaled . [(20250124 2004) ((emacs (25 1))) "Build your own minor modes for modal editing" tar ((:url . "https://github.com/DCsunset/modaled") (:commit . "d9ec83a00317ae7ed69a5d7b427c968495761e5c") (:revdesc . "d9ec83a00317") (:keywords "convenience" "modal-editing"))]) + (modalka . [(20230606 1357) ((emacs (24 4))) "Modal editing your way" tar ((:url . "https://github.com/mrkkrp/modalka") (:commit . "6deb661e84cb34746a62ce84842f52c22138beda") (:revdesc . "6deb661e84cb") (:keywords "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (mode-icons . [(20230911 20) ((emacs (24)) (cl-lib (0 5))) "Show icons for modes" tar ((:url . "http://ryuslash.org/projects/mode-icons.html") (:commit . "931250e8f9f1106e7ace6247989867c5e17fc9cc") (:revdesc . "931250e8f9f1") (:keywords "multimedia") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org"))]) + (mode-line-bell . [(20181029 516) nil "Flash the mode line instead of ringing the bell" tar ((:url . "https://github.com/purcell/mode-line-bell") (:commit . "4985ba42f5a19f46ddbf9b3622453a9694995ce5") (:revdesc . "4985ba42f5a1") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (mode-line-debug . [(20251101 2033) ((emacs (28 1)) (compat (30 1))) "Show status of debug-on-error in mode-line" tar ((:url . "https://github.com/tarsius/mode-line-debug") (:commit . "f68cfa2ea28ce2dc6f40d4c93a44a701510e8e04") (:revdesc . "f68cfa2ea28c") (:keywords "convenience" "lisp") (:authors ("Jonas Bernoulli" . "emacs.mode-line-debug@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.mode-line-debug@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.mode-line-debug@jonas.bernoulli.dev"))]) + (mode-line-idle . [(20251224 357) ((emacs (28 1))) "Evaluate mode line content when idle" tar ((:url . "https://codeberg.org/ideasman42/emacs-mode-line-idle") (:commit . "9a5ed3b07bd0737168be74c4929ce5afdd10b9ca") (:revdesc . "9a5ed3b07bd0") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (mode-line-keyboard . [(20250303 2002) ((emacs (26 0))) "Keyboard in mode line for touch screens" tar ((:url . "https://github.com/Lindydancer/mode-line-keyboard") (:commit . "e5613ccd81bd58161efb53ebeaee7bd4dea197ee") (:revdesc . "e5613ccd81bd") (:keywords "convenience"))]) + (modelica-mode . [(20230508 1020) ((emacs (27 1))) "Major mode for editing Modelica files" tar ((:url . "https://github.com/modelica-tools/modelica-mode") (:commit . "7064a4abdae68fc074a85a2e7c159e067c44c0e1") (:revdesc . "7064a4abdae6") (:keywords "languages" "continuous system modeling"))]) + (modern-cpp-font-lock . [(20210405 1155) nil "Font-locking for \"Modern C++\"" tar ((:url . "https://github.com/ludwigpacifici/modern-cpp-font-lock") (:commit . "43c6b68ff58fccdf9deef11674a172e4eaa8455c") (:revdesc . "43c6b68ff58f") (:keywords "languages" "c++" "cpp" "font-lock") (:authors ("Ludwig PACIFICI" . "ludwig@lud.cc")) (:maintainers ("Ludwig PACIFICI" . "ludwig@lud.cc")) (:maintainer "Ludwig PACIFICI" . "ludwig@lud.cc"))]) + (modern-fringes . [(20220401 202) nil "Replaces default fringe bitmaps with better looking ones" tar ((:url . "http://github.com/specialbomb/emacs-modern-fringes") (:commit . "98473694a33922cfdddb18b4791028e4854b53b5") (:revdesc . "98473694a339") (:keywords "themes" "fringes" "convenience") (:authors ("Quen Jankosky" . "quen.jankosky@gmail.com")) (:maintainers ("Quen Jankosky" . "quen.jankosky@gmail.com")) (:maintainer "Quen Jankosky" . "quen.jankosky@gmail.com"))]) + (modern-sh . [(20250320 858) ((emacs (25 1)) (hydra (0 15 0)) (eval-in-repl (0 9 7))) "Minor mode for editing shell script" tar ((:url . "https://github.com/damon-kwok/modern-sh") (:commit . "65bc75828f7d13af713f1a728c038e2915944cd3") (:revdesc . "65bc75828f7d") (:keywords "languages" "programming"))]) + (modtime-skip-mode . [(20140128 2201) nil "Minor mode for disabling modtime and supersession checks on files" tar ((:url . "http://www.github.com/jordonbiondo/modtime-skip-mode") (:commit . "c0e49523aa26b2263a8693691ac775988015f592") (:revdesc . "c0e49523aa26") (:authors ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainers ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainer "Jordon Biondo" . "biondoj@mail.gvsu.edu"))]) + (modular-config . [(20210726 1614) ((emacs (25 1))) "Organize your config into small and loadable modules" tar ((:url . "https://github.com/SidharthArya/modular-config.el") (:commit . "043907d96efff70dfaea1e721de90bd35970e8bd") (:revdesc . "043907d96eff") (:keywords "startup" "lisp" "tools") (:authors ("Sidharth Arya" . "sidhartharya10@gmail.com")) (:maintainers ("Sidharth Arya" . "sidhartharya10@gmail.com")) (:maintainer "Sidharth Arya" . "sidhartharya10@gmail.com"))]) + (modus-themes . [(20251223 558) ((emacs (28 1))) "Elegant, highly legible and customizable themes" tar ((:url . "https://github.com/protesilaos/modus-themes") (:commit . "6dcd3690371fbaa7291b15187f4427cdfa6ada72") (:revdesc . "6dcd3690371f") (:keywords "faces" "theme" "accessibility") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainers ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com"))]) + (moe-theme . [(20251218 536) nil "A colorful eye-candy theme. Moe, moe, kyun!" tar ((:url . "https://github.com/kuanyui/moe-theme.el") (:commit . "a7c8279e8e6160a52236a69ef1a3b2111be29693") (:revdesc . "a7c8279e8e61") (:keywords "themes") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainers ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com"))]) + (molar-mass . [(20220922 1752) ((emacs (24 3))) "Calculates molar mass of a molecule" tar ((:url . "https://github.com/sergiruiztrepat/molar-mass.el") (:commit . "c3b686c4b621b45fa4b17857b4934eb4487d74f5") (:revdesc . "c3b686c4b621") (:keywords "convenience" "chemistry"))]) + (molecule . [(20180527 743) ((emacs (25 1))) "Simple wrapper for molecule" tar ((:url . "https://git.daemons.it/drymer/molecule.el") (:commit . "2ef72b81d9aa24ea782b71a061a3abdad6cae162") (:revdesc . "2ef72b81d9aa") (:keywords ":" "languages" "terminals") (:authors ("drymer" . "drymer[AT]autistici.org")) (:maintainers ("drymer" . "drymer[AT]autistici.org")) (:maintainer "drymer" . "drymer[AT]autistici.org"))]) + (molokai-theme . [(20220106 1520) nil "Molokai theme with Emacs theme engine" tar ((:url . "https://github.com/alloy-d/color-theme-molokai") (:commit . "cc53e997e7eff93b58ad16a376a292c1dd66044b") (:revdesc . "cc53e997e7ef") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (mongo . [(20150315 1219) nil "MongoDB driver for Emacs Lisp" tar ((:url . "https://github.com/emacsorphanage/mongo") (:commit . "595529ddd70ecb9fab8b11daad2c3929941099d6") (:revdesc . "595529ddd70e") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))]) + (monitor . [(20161018 1144) ((dash (2 13 0))) "Utilities for monitoring expressions" tar ((:url . "https://github.com/guiltydolphin/monitor") (:commit . "63f4643a0ee81616dbb692b8b03bae21df2283e2") (:revdesc . "63f4643a0ee8") (:keywords "lisp" "monitor" "utility") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainers ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com"))]) + (monkeytype . [(20210110 513) ((emacs (25 1)) (scrollable-quick-peek (0 1 0))) "Mode for speed typing" tar ((:url . "https://github.com/jpablobr/emacs-monkeytype") (:commit . "0e949d08198c0bd003f1d5c8cdceb7e36bef22f7") (:revdesc . "0e949d08198c") (:keywords "games") (:authors ("Pablo Barrantes" . "xjpablobrx@gmail.com")) (:maintainers ("Pablo Barrantes" . "xjpablobrx@gmail.com")) (:maintainer "Pablo Barrantes" . "xjpablobrx@gmail.com"))]) + (monky . [(20230222 2153) nil "Control Hg from Emacs" tar ((:url . "http://github.com/ananthakumaran/monky") (:commit . "7046eee5fc9ac625924382cb4a82b0d8efcd9ff0") (:revdesc . "7046eee5fc9a") (:keywords "tools") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com"))]) + (mono-complete . [(20251126 1132) ((emacs (29 1))) "Completion suggestions with multiple back-ends" tar ((:url . "https://codeberg.org/ideasman42/emacs-mono-complete") (:commit . "71d46dc015ccdb33b07b2ac31b6b433c651faa02") (:revdesc . "71d46dc015cc") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (monochrome-theme . [(20140326 1050) nil "A dark Emacs 24 theme for your focused hacking sessions" tar ((:url . "https://github.com/fxn/monochrome-theme.el") (:commit . "9cf993670c9e8d198f41d840216e13280585b3e1") (:revdesc . "9cf993670c9e") (: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 ((:url . "https://github.com/dawidof/emacs-monokai-theme") (:commit . "f342b6afc31f929be0626eca2d696ee9fab78011") (:revdesc . "f342b6afc31f"))]) + (monokai-pro-theme . [(20250116 1621) nil "A simple theme based on the Monokai Pro Sublime color schemes" tar ((:url . "https://github.com/belak/emacs-monokai-pro-theme") (:commit . "2c886bbeeb354f5f9da7435b2662f6b1511d17e8") (:revdesc . "2c886bbeeb35") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainers ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io"))]) + (monokai-theme . [(20240911 1046) nil "A fruity color theme for Emacs" tar ((:url . "http://github.com/oneKelvinSmith/monokai-emacs") (:commit . "dacd9d8a8867afea3ed76b15a6c997053ff88093") (:revdesc . "dacd9d8a8867") (:authors ("Kelvin Smith" . "oneKelvinSmith@gmail.com")) (:maintainers ("Kelvin Smith" . "oneKelvinSmith@gmail.com")) (:maintainer "Kelvin Smith" . "oneKelvinSmith@gmail.com"))]) + (monotropic-theme . [(20211116 1328) ((emacs (24))) "Monotropic Theme" tar ((:url . "https://github.com/caffo/monotropic-theme") (:commit . "f32a04b5bfee9cbcce4b223f17228d1142a28211") (:revdesc . "f32a04b5bfee"))]) + (monroe . [(20220915 1647) nil "Yet another client for nREPL" tar ((:url . "http://www.github.com/sanel/monroe") (:commit . "8f809e4aa0a35ec2d1c880aacf59e6bc317a566f") (:revdesc . "8f809e4aa0a3") (:keywords "languages" "clojure" "nrepl" "lisp") (:authors ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainers ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainer "Sanel Zukan" . "sanelz@gmail.com"))]) + (mood-line . [(20231210 1309) ((emacs (26 1))) "A minimal mode line inspired by doom-modeline" tar ((:url . "https://gitlab.com/jessieh/mood-line") (:commit . "d1c024fdf9543fbc0101cd2c6e8b248378f591cd") (:revdesc . "d1c024fdf954") (:keywords "mode-line" "faces") (:authors ("Jessie Hildebrandt" . "jessieh.net")) (:maintainers ("Jessie Hildebrandt" . "jessieh.net")) (:maintainer "Jessie Hildebrandt" . "jessieh.net"))]) + (mood-one-theme . [(20221222 1214) ((emacs (27 1))) "A dark color scheme inspired by the Doom One theme" tar ((:url . "https://gitlab.com/jessieh/mood-one-theme") (:commit . "dfbc81900737d3382a340feeed24d2bcd9bdedb0") (:revdesc . "dfbc81900737") (:keywords "mode-line" "faces") (:authors ("Jessie Hildebrandt" . "jessieh.net")) (:maintainers ("Jessie Hildebrandt" . "jessieh.net")) (:maintainer "Jessie Hildebrandt" . "jessieh.net"))]) + (moody . [(20251101 2036) ((emacs (28 1)) (compat (30 1))) "Tabs and ribbons for the mode line" tar ((:url . "https://github.com/tarsius/moody") (:commit . "c88c360065ccb8371df2bbf12bffbd13afe60234") (:revdesc . "c88c360065cc") (:keywords "faces") (:authors ("Jonas Bernoulli" . "emacs.moody@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.moody@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.moody@jonas.bernoulli.dev"))]) + (moom . [(20250817 1347) ((emacs (25 1))) "Commands to control frame position and size" tar ((:url . "https://github.com/takaxp/Moom") (:commit . "2683e801d3c7be537ddf8b6af5154c0b86fafeb6") (:revdesc . "2683e801d3c7") (:keywords "frames" "faces" "convenience") (:authors ("Takaaki ISHIKAWA" . "takaxpatieeedotorg")) (:maintainers ("Takaaki ISHIKAWA" . "takaxpatieeedotorg")) (:maintainer "Takaaki ISHIKAWA" . "takaxpatieeedotorg"))]) + (moonscript . [(20170831 2226) ((cl-lib (0 5)) (emacs (24))) "Major mode for editing MoonScript code" tar ((:url . "https://github.com/k2052/moonscript-mode") (:commit . "56f90471e2ced2b0a177aed4d8c2f854797e9cc7") (:revdesc . "56f90471e2ce") (:authors (nil . "@GriffinSchneider") (nil . "@k2052") (nil . "@EmacsFodder")) (:maintainers (nil . "@GriffinSchneider") (nil . "@k2052") (nil . "@EmacsFodder")) (:maintainer nil . "@GriffinSchneider"))]) + (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 ((:url . "https://github.com/ageldama/moonshot") (:commit . "ec37a12825888047a90d9ee8131aa4bea348edf7") (:revdesc . "ec37a1282588") (:keywords "convenience" "files" "processes" "tools" "unix") (:authors ("Jong-Hyouk Yun" . "ageldama@gmail.com")) (:maintainers ("Jong-Hyouk Yun" . "ageldama@gmail.com")) (:maintainer "Jong-Hyouk Yun" . "ageldama@gmail.com"))]) + (morganey-mode . [(20170118 934) ((emacs (24 4))) "Major mode for editing Morganey files" tar ((:url . "https://github.com/morganey-lang/morganey-mode") (:commit . "7e33f1be486f58dfcf02adcbf82ccac47f69bd9b") (:revdesc . "7e33f1be486f") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com"))]) + (morgentau-theme . [(20220319 1049) ((emacs (24))) "Tango-based custom theme" tar ((:url . "https://github.com/Melchizedek6809/morgentau-theme") (:commit . "a8da5640b4a9b72a3136901d0a1a03071d9fcb00") (:revdesc . "a8da5640b4a9") (:keywords "theme" "dark" "faces"))]) + (morlock . [(20251101 2037) ((emacs (29 1))) "More font-lock keywords for elisp" tar ((:url . "https://github.com/tarsius/morlock") (:commit . "02759c4d05ef6ec6b05707dab5bfe9a148a2c5ac") (:revdesc . "02759c4d05ef") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "emacs.morlock@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.morlock@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.morlock@jonas.bernoulli.dev"))]) + (morrowind-theme . [(20230912 406) ((emacs (24 1))) "Theme" tar ((:url . "https://github.com/samuelbanya/morrowind-theme") (:commit . "f197ef02e96fa3b8a38eca25ba750df7b843e564") (:revdesc . "f197ef02e96f"))]) + (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 ((:url . "https://github.com/themkat/mos-mode") (:commit . "770f49417e8ad7dbf382c8691f6f689d793b9314") (:revdesc . "770f49417e8a"))]) + (mosey . [(20180614 1649) ((emacs (24 4))) "Mosey around your buffers" tar ((:url . "http://github.com/alphapapa/mosey.el") (:commit . "2e3ac9d334fa2937ed5267193dfd25d8e1f14dc2") (:revdesc . "2e3ac9d334fa") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (most-faces . [(20250606 814) ((emacs (24))) "A List of Most Available Faces" tar ((:url . "https://codeberg.org/mekeor/most-faces") (:commit . "6b97ecab10d0a9e6e9faaecac3af543263fe658a") (:revdesc . "6b97ecab10d0") (:keywords "faces") (:authors ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainers ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainer "Mekeor Melire" . "mekeor@posteo.de"))]) + (most-used-words . [(20200808 1353) ((emacs (24 3))) "Display most used words in buffer" tar ((:url . "https://github.com/udyantw/most-used-words") (:commit . "90c09da92b30c6497e9141f0edfe7842440c4d53") (:revdesc . "90c09da92b30") (:keywords "convenience" "wp") (:authors ("Udyant Wig" . "udyant.wig@gmail.com")) (:maintainers ("Udyant Wig" . "udyant.wig@gmail.com")) (:maintainer "Udyant Wig" . "udyant.wig@gmail.com"))]) + (mote-mode . [(20160123 29) ((ruby-mode (1 1))) "Mote minor mode" tar ((:url . "http://inkel.github.com/mote-mode/") (:commit . "666c6641addbd3b337a7aa01fd2742ded2f41b83") (:revdesc . "666c6641addb") (:authors ("Leandro López" . "inkel.ar@gmail.com")) (:maintainers ("Leandro López" . "inkel.ar@gmail.com")) (:maintainer "Leandro López" . "inkel.ar@gmail.com"))]) + (motion-mode . [(20140920 156) ((flymake-easy (0 7)) (flymake-cursor (1 0 2))) "Major mode for RubyMotion enviroment" tar ((:url . "https://github.com/ainame/motion-mode") (:commit . "4c94180e3ecea611a61240a0c0cd48f1032c4a55") (:revdesc . "4c94180e3ece"))]) + (motion-selection-mode . [(20250204 30) ((emacs (29 3)) (god-mode (2 18 0))) "A minor mode to add a text editing grammar" tar ((:url . "https://github.com/alexispurslane/motion-selection-mode") (:commit . "96b8cbf18beb528f32cabdf77808b8db596f30be") (:revdesc . "96b8cbf18beb") (:keywords "tools") (:authors ("Alexis Purslane" . "alexispurslane@pm.me")) (:maintainers ("Alexis Purslane" . "alexispurslane@pm.me")) (:maintainer "Alexis Purslane" . "alexispurslane@pm.me"))]) + (move-dup . [(20210127 1938) ((emacs (25 1))) "Eclipse-like moving and duplicating lines or rectangles" tar ((:url . "https://github.com/wyuenho/move-dup") (:commit . "bf2e578b89d7e7bf0b5500d9afcf49ac6ec2dcd1") (:revdesc . "bf2e578b89d7") (:keywords "convenience" "text" "edit") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com"))]) + (move-mode . [(20251224 1152) ((emacs (25 1))) "A major-mode for editing Move language" tar ((:url . "https://github.com/amnn/move-mode") (:commit . "e72e2d5102669b82ba70599fb64e64241d49376d") (:revdesc . "e72e2d510266") (:keywords "languages"))]) + (move-text . [(20231204 1514) nil "Move current line or region with M-up or M-down" tar ((:url . "https://github.com/emacsfodder/move-text") (:commit . "90ef0b078dbcb2dee47a15b0c6c6f417101e0c43") (:revdesc . "90ef0b078dbc") (:keywords "edit") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (mowedline . [(20171218 237) nil "Elisp utilities for using mowedline" tar ((:url . "https://github.com/retroj/mowedline") (:commit . "c17501b48ded8261d815ab60bf14cddf7040be72") (:revdesc . "c17501b48ded") (:authors ("John Foerch" . "jjfoerch@earthlink.net")) (:maintainers ("John Foerch" . "jjfoerch@earthlink.net")) (:maintainer "John Foerch" . "jjfoerch@earthlink.net"))]) + (mowie . [(20250113 122) ((emacs (28 1))) "Cycle Through Point-Moving Commands" tar ((:url . "https://codeberg.org/mekeor/mowie") (:commit . "26f605cf632579af897a85a3922bf17fac616519") (:revdesc . "26f605cf6325") (:keywords "convenience") (:authors ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainers ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainer "Mekeor Melire" . "mekeor@posteo.de"))]) + (mozc . [(20251022 236) ((emacs (24 3))) "Minor mode to input Japanese with Mozc" tar ((:url . "https://github.com/google/mozc") (:commit . "d9c3f195582de6b0baa07ecb81a04e8902acf9af") (:revdesc . "d9c3f195582d") (: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 ((:url . "https://github.com/akirak/mozc-posframe") (:commit . "1d07d5055381008ccbb29b97315d140e09a7ee95") (:revdesc . "1d07d5055381") (:keywords "i18n" "tooltip") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (mozc-im . [(20160412 22) ((mozc (0))) "Mozc with input-method-function interface" tar ((:url . "https://github.com/d5884/mozc-im") (:commit . "df614a1076c28a11551fb3e822868bae47e855a5") (:revdesc . "df614a1076c2") (:keywords "i18n" "extentions") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainers ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com"))]) + (mozc-popup . [(20150224 34) ((popup (0 5 2)) (mozc (0))) "Mozc with popup" tar ((:url . "https://github.com/d5884/mozc-popup") (:commit . "f0684b875a7427ec08f8df13939a486e5d5cf420") (:revdesc . "f0684b875a74") (:keywords "i18n" "extentions") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainers ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com"))]) + (mozc-temp . [(20160228 840) ((emacs (24)) (dash (2 10 0)) (mozc (0))) "Use mozc temporarily" tar ((:url . "https://github.com/HKey/mozc-temp") (:commit . "7f5dd5fc8ceeca9b1822f7e056a4be67e2e74959") (:revdesc . "7f5dd5fc8cee") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainers ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com"))]) + (mpages . [(20150710 1404) nil "An Emacs buffer for quickly writing your Morning Pages" tar ((:url . "https://github.com/slevin/mpages") (:commit . "39a72a0931ab1cdbfdf0ab9f412dc12d43a3829f") (:revdesc . "39a72a0931ab"))]) + (mpdel . [(20250922 929) ((emacs (25 1)) (libmpdel (1 2 0)) (navigel (0 7 0))) "Play and control your MPD music" tar ((:url . "https://github.com/mpdel/mpdel") (:commit . "006ccab29492cda567112be76e84e40e51d1f70b") (:revdesc . "006ccab29492") (:keywords "multimedia") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (mpdel-embark . [(20230103 2021) ((emacs (26 1)) (mpdel (2 0 0)) (libmpdel (2 0 0)) (embark (0 19))) "Integrate MPDel with Embark" tar ((:url . "https://github.com/mpdel/mpdel-embark") (:commit . "31d91a62b680fb4472ec34c04ac6af80bb3cf4b8") (:revdesc . "31d91a62b680") (:keywords "multimedia") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (mpdmacs . [(20250917 32) ((emacs (29 1)) (elmpd (0 3))) "A lightweight MPD client" tar ((:url . "https://github.com/sp1ff/mpdmacs") (:commit . "e11d46925ce711de37352fb0a243a2cb55f873a3") (:revdesc . "e11d46925ce7") (:keywords "comm") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainers ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com"))]) + (mpmc-queue . [(20180303 2029) ((emacs (26 0)) (queue (0 2 0))) "A multiple-producer-multiple-consumer queue" tar ((:url . "https://github.com/smizoe/mpmc-queue") (:commit . "df07d6bef7468edb1d73ef73b8331b94d0e5d0ca") (:revdesc . "df07d6bef746") (:keywords "lisp" "async") (:authors ("Sho Mizoe" . "sho.mizoe@gmail.com")) (:maintainers ("Sho Mizoe" . "sho.mizoe@gmail.com")) (:maintainer "Sho Mizoe" . "sho.mizoe@gmail.com"))]) + (mpv . [(20241121 2308) ((emacs (25 1))) "Control mpv for easy note-taking" tar ((:url . "https://github.com/kljohann/mpv.el") (:commit . "62cb8825d525d7c9475dd93d62ba84d419bc4832") (:revdesc . "62cb8825d525") (:keywords "tools" "multimedia") (:authors ("Johann Klähn" . "johann@jklaehn.de")) (:maintainers ("Johann Klähn" . "johann@jklaehn.de")) (:maintainer "Johann Klähn" . "johann@jklaehn.de"))]) + (mpvi . [(20250831 853) ((emacs (28 1)) (emms (11))) "Watch video and take interactive video notes" tar ((:url . "https://github.com/lorniu/mpvi") (:commit . "79a7bd0559b38b289e5463331a9f25336453f3aa") (:revdesc . "79a7bd0559b3") (:keywords "convenience" "docs" "multimedia" "application") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com"))]) + (mqr . [(20180527 1204) ((emacs (24 4))) "Multi-dimensional query and replace" tar ((:url . "https://github.com/calancha/multi-replace") (:commit . "4ade19d4620b8b61340290bf63fa56d5e493859f") (:revdesc . "4ade19d4620b") (:keywords "convenience" "extensions" "lisp") (:authors ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainers ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com"))]) + (mqtt-mode . [(20180611 1735) ((emacs (25)) (dash (2 12 0))) "Client for interaction with MQTT servers" tar ((:url . "https://github.com/andrmuel/mqtt-mode") (:commit . "613e70e9b9940e635e779994b5c83f86eb62c8e6") (:revdesc . "613e70e9b994") (:keywords "tools") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainers ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch"))]) + (msgpack . [(20200323 515) ((emacs (25 1))) "Read and write MessagePack object" tar ((:url . "https://github.com/xuchunyang/msgpack.el") (:commit . "e2a0d76d1087bc8178c9f27222cb9b93e2e815ec") (:revdesc . "e2a0d76d1087") (:keywords "lisp"))]) + (msvc . [(20221015 1610) ((emacs (24)) (cl-lib (0 5)) (cedet (1 0)) (ac-clang (2 0 0))) "Microsoft Visual C/C++ mode" tar ((:url . "https://github.com/yaruopooner/msvc") (:commit . "1bf173b5da3fbf2bdb799116e2a1f31916c1e16e") (:revdesc . "1bf173b5da3f") (:keywords "languages" "completion" "syntax check" "mode" "intellisense"))]) + (mtg-deck-mode . [(20231202 1546) ((emacs (25 1))) "Major mode to edit MTG decks" tar ((:url . "https://github.com/mattiasb/mtg-deck-mode") (:commit . "3cb3866951feae40531c0a2e4fa72c0f2989c36c") (:revdesc . "3cb3866951fe") (:keywords "data" "mtg" "magic"))]) + (mu-cite . [(20190803 439) ((flim (1 14 9))) "A library to provide MIME features" tar ((:url . "https://github.com/ksato9700/mu-cite") (:commit . "b2c83bbce4646d100b942f0f0de0877a8d47298c") (:revdesc . "b2c83bbce464") (:keywords "mail" "news" "citation") (:authors ("MORIOKA Tomohiko" . "tomo@m17n.org") ("Shuhei KOBAYASHI" . "shuhei@aqua.ocn.ne.jp")) (:maintainers ("Katsumi Yamaoka" . "yamaoka@jpl.org")) (:maintainer "Katsumi Yamaoka" . "yamaoka@jpl.org"))]) + (mu2tex . [(20200512 704) nil "Convert plain text molecule names and units to TeX" tar ((:url . "https://github.com/cdominik/mu2tex") (:commit . "4b84cdac955cb36a8c44a2be48f3310252e3d3ad") (:revdesc . "4b84cdac955c") (:keywords "tex") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainers ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com"))]) + (mu4e-alert . [(20251022 2130) ((alert (1 2)) (s (1 10 0)) (ht (2 0)) (emacs (24 4))) "Desktop notification for mu4e" tar ((:url . "https://github.com/xzz53/mu4e-alert") (:commit . "9f20f30b15a5f5cc43fe448684fe1d4b981639aa") (:revdesc . "9f20f30b15a5") (:keywords "mail" "convenience") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainers ("Mikhail Rudenko" . "mike.rudenko@gmail.com")) (:maintainer "Mikhail Rudenko" . "mike.rudenko@gmail.com"))]) + (mu4e-column-faces . [(20250205 2118) ((emacs (25 3))) "Faces for individual mu4e columns" tar ((:url . "https://github.com/Alexander-Miller/mu4e-column-faces") (:commit . "b3586a9bf61f0cddd8a9f4cb214458f13d37955a") (:revdesc . "b3586a9bf61f") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (mu4e-conversation . [(20190609 812) ((emacs (25 1))) "Show a complete thread in a single buffer" tar ((:url . "https://gitlab.com/Ambrevar/mu4e-conversation") (:commit . "98110bb9c300fc9866dee8e0023355f9f79c9b96") (:revdesc . "98110bb9c300") (:keywords "mail" "convenience" "mu4e") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainers ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz"))]) + (mu4e-jump-to-list . [(20221202 1023) ((emacs (24 4)) (cl-lib (0 5))) "Mu4e jump-to-list extension" tar ((:url . "https://gitlab.com/wavexx/mu4e-jump-to-list.el") (:commit . "cf19684d2333cb0cda7f6b62c7607144baa49310") (:revdesc . "cf19684d2333") (:keywords "mu4e" "mail" "convenience") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (mu4e-marker-icons . [(20250228 218) ((emacs (26 1)) (nerd-icons (0 0 1))) "Display icons for mu4e markers" tar ((:url . "https://repo.or.cz/mu4e-marker-icons.git") (:commit . "13541181d5144ee91d570ab74558abce194b083f") (:revdesc . "13541181d514") (:keywords "mail"))]) + (mu4e-overview . [(20250406 1225) ((emacs (26))) "Show overview of maildir" tar ((:url . "https://github.com/mkcms/mu4e-overview") (:commit . "527c3d3a4618c6ba7e6dec679ec2eff8854775d2") (:revdesc . "527c3d3a4618") (:keywords "mail" "tools") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainers ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com"))]) + (mu4e-query-fragments . [(20240415 1421) ((emacs (24 4))) "Mu4e query fragments extension" tar ((:url . "https://gitlab.com/wavexx/mu4e-query-fragments.el") (:commit . "14b38e4a7b7aae47f3c1bdccb6680f8c38c645bf") (:revdesc . "14b38e4a7b7a") (:keywords "mu4e" "mail" "convenience") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (mu4e-views . [(20251130 249) ((emacs (26 1)) (xwidgets-reuse (0 3)) (ht (2 2)) (esxml (20210323 1102))) "View emails in mu4e using xwidget-webkit" tar ((:url . "https://github.com/lordpretzel/mu4e-views") (:commit . "892ea3163fa4964e9fc99e732e0c0d21d4931ae7") (:revdesc . "892ea3163fa4") (:keywords "mail") (:authors ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainers ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainer "Boris Glavic" . "lordpretzel@gmail.com"))]) + (mu4e-walk . [(20251216 2015) ((emacs (29 1))) "Send email addresses for a walk" tar ((:url . "https://codeberg.org/timmli/mu4e-walk") (:commit . "3d0b613cfdd52f0ddf56f305d8f96e9a52b3e4f9") (:revdesc . "3d0b613cfdd5") (:keywords "convenience" "mail") (:authors ("Timm Lichte" . "timm.lichte@uni-tuebingen.de")) (:maintainers ("Timm Lichte" . "timm.lichte@uni-tuebingen.de")) (:maintainer "Timm Lichte" . "timm.lichte@uni-tuebingen.de"))]) + (mu4easy . [(20250621 1238) ((emacs (25 1)) (mu4e-column-faces (1 2 1)) (mu4e-alert (1 0)) (org-msg (4 0))) "Packages + configs for using mu4e with multiple accounts" tar ((:url . "https://github.com/danielfleischer/mu4easy") (:commit . "5767f6fed2ae077116f2876e872943a3dd5ea788") (:revdesc . "5767f6fed2ae") (:keywords "mail") (:authors ("Daniel Fleischer" . "danflscr@gmail.com")) (:maintainers ("Daniel Fleischer" . "danflscr@gmail.com")) (:maintainer "Daniel Fleischer" . "danflscr@gmail.com"))]) + (muban . [(20180415 1219) ((emacs (25))) "Lightweight template expansion tool" tar ((:url . "https://github.com/jiahaowork/muban.el") (:commit . "c134c46e60be1fb3e9a08dba3d07346855e0fcc2") (:revdesc . "c134c46e60be") (:keywords "abbrev" "tools") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainers ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com"))]) + (mugur . [(20250730 1328) ((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 ((:url . "https://github.com/mihaiolteanu/mugur") (:commit . "ee43cd1ab5ae687882b7d5f3eb05b0e34c3fc0a0") (:revdesc . "ee43cd1ab5ae") (:keywords "multimedia") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm"))]) + (multi . [(20131013 1544) ((emacs (24))) "Clojure-style multi-methods for emacs lisp" tar ((:url . "http://github.com/kurisuwhyte/emacs-multi") (:commit . "884203b11fdac8374ec644cca975469aab263404") (:revdesc . "884203b11fda") (:keywords "multimethod" "generic" "predicate" "dispatch") (:authors ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainers ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainer "Christina Whyte" . "kurisu.whyte@gmail.com"))]) + (multi-compile . [(20211113 2119) ((emacs (24 4)) (dash (2 12 1))) "Multi target interface to compile" tar ((:url . "https://github.com/ReanGD/emacs-multi-compile") (:commit . "360e44b200d07da379c906856d37613d0f06a9ae") (:revdesc . "360e44b200d0") (:keywords "tools" "compile" "build") (:authors ("Kvashnin Vladimir" . "reangd@gmail.com")) (:maintainers ("Kvashnin Vladimir" . "reangd@gmail.com")) (:maintainer "Kvashnin Vladimir" . "reangd@gmail.com"))]) + (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 ((:url . "https://github.com/IvanMalison/multi-line") (:commit . "06ea7294c4e4ace0c3253b7952a6d937a169eb55") (:revdesc . "06ea7294c4e4") (:keywords "multi" "line" "length" "whitespace" "programming" "tools" "convenience" "files") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (multi-project . [(20240115 1635) ((emacs (26 1))) "Find files, compile, and search in multiple projects" tar ((:url . "https://github.com/ellisvelo/multi-project.git") (:commit . "3bc67ba8adf10a0844fa2f9cce9d78f130307645") (:revdesc . "3bc67ba8adf1") (:keywords "convenience" "project" "management") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainers ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com"))]) + (multi-run . [(20210108 336) ((emacs (24)) (window-layout (1 4))) "Efficiently manage multiple remote nodes" tar ((:url . "https://www.github.com/sagarjha/multi-run") (:commit . "13d4d923535b5e8482b13ff76185203075fb26a3") (:revdesc . "13d4d923535b") (:keywords "multiple shells" "multi-run" "remote nodes"))]) + (multi-term . [(20200514 428) nil "Managing multiple terminal buffers in Emacs" tar ((:url . "http://www.emacswiki.org/emacs/download/multi-term.el") (:commit . "017c77c550115936860e2ea71b88e585371475d5") (:revdesc . "017c77c55011") (:keywords "term" "terminal" "multiple buffer") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainers ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "Andy Stewart" . "lazycat.manatee@gmail.com"))]) + (multi-vterm . [(20221031 610) ((emacs (26 3)) (vterm (0 0)) (project (0 3 0))) "Like multi-term.el but for vterm" tar ((:url . "https://github.com/suonlight/multi-libvterm") (:commit . "36746d85870dac5aaee6b9af4aa1c3c0ef21a905") (:revdesc . "36746d85870d") (:keywords "terminals" "processes"))]) + (multi-web-mode . [(20130824 354) nil "Multiple major mode support for web editing" tar ((:url . "https://github.com/fgallina/multi-web-mode") (:commit . "ad1c8d1c870334052d244c7ae3636cb7b9357b7c") (:revdesc . "ad1c8d1c8703") (:keywords "convenience" "languages" "wp") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainers ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "Fabián E. Gallina" . "fabian@anue.biz"))]) + (multicolumn . [(20150202 2251) nil "Creating and managing multiple side-by-side windows" tar ((:url . "https://github.com/Lindydancer/multicolumn") (:commit . "c7a3afecd470859b2e60aa7c554d6e4d436df7fa") (:revdesc . "c7a3afecd470"))]) + (multifiles . [(20130615 2133) nil "View and edit parts of multiple files in one buffer" tar ((:url . "https://github.com/magnars/multifiles.el") (:commit . "dddfe64b8e1c1cd1f9ccc1f03405477fc0d53897") (:revdesc . "dddfe64b8e1c") (:keywords "multiple" "files") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (multiple-cursors . [(20251006 2038) ((cl-lib (0 5))) "Multiple cursors for emacs" tar ((:url . "https://github.com/magnars/multiple-cursors.el") (:commit . "9017f3be6b00c1d82e33409db4a178133fb39d47") (:revdesc . "9017f3be6b00") (:keywords "editing" "cursors") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (multistate . [(20210124 2014) ((emacs (25 1)) (ht (2 3))) "Multistate mode" tar ((:url . "https://gitlab.com/matsievskiysv/multistate") (:commit . "a7ab9dc7aac0b6d6d2f872de4e0d1b8550834a9b") (:revdesc . "a7ab9dc7aac0") (:keywords "convenience"))]) + (multitran . [(20240206 1617) ((emacs (24)) (cl-lib (0 5))) "Interface to multitran" tar ((:url . "https://github.com/zevlg/multitran.el") (:commit . "680f31d15b78876daf484bd926e5c172ab061595") (:revdesc . "680f31d15b78") (:keywords "dictionary" "hypermedia") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainers ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru"))]) + (musicbrainz . [(20230530 749) ((emacs (28 1)) (request (0 3))) "MusicBrainz API interface" tar ((:url . "https://github.com/zzkt/metabrainz") (:commit . "986690a515e67526598eaa4200bd383f03a007bd") (:revdesc . "986690a515e6") (:keywords "music" "scrobbling" "multimedia") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am"))]) + (mustache . [(20230713 514) ((emacs (26)) (s (1 3 0)) (dash (1 2 0))) "Mustache templating library in emacs lisp" tar ((:url . "https://github.com/Wilfred/mustache.el") (:commit . "229e01f0f0a5684499bcc6a11a5bf8dbe14fd4e8") (:revdesc . "229e01f0f0a5") (:keywords "convenience" "mustache" "template") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (mustache-mode . [(20141024 1432) nil "A major mode for editing Mustache files" tar ((:url . "https://github.com/mustache/emacs") (:commit . "bf9897eb287ca47ced65d7d4e07ea61ea0aec39f") (:revdesc . "bf9897eb287c"))]) + (mustang-theme . [(20170719 946) nil "Port of vim's mustang theme" tar ((:url . "http://github.com/mswift42/mustang-theme") (:commit . "dda6d04803f1c9b196b620ef564e7768fee15de2") (:revdesc . "dda6d04803f1"))]) + (mustard-theme . [(20170808 1319) ((emacs (24 0))) "An Emacs 24 theme based on Mustard (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "3b15d992c79590d7ea2503004e2a863b57e274b5") (:revdesc . "3b15d992c795"))]) + (mutant . [(20160124 1353) ((emacs (24 4)) (dash (2 1 0))) "An interface for the Mutant testing tool" tar ((:url . "http://github.com/p-lambert/mutant.el") (:commit . "aff50603a70a110f4ecd7142963ef719e8c11c06") (:revdesc . "aff50603a70a") (:keywords "mutant" "testing"))]) + (mutt-mode . [(20191102 2330) ((emacs (24))) "Major mode for editing mutt configuration" tar ((:url . "https://gitlab.com/flexw/mutt-mode") (:commit . "1d495de49e6f536459b00d5396a2f5ce5ad4757b") (:revdesc . "1d495de49e6f") (:keywords "languages") (:authors ("Felix Weilbach" . "felix.weilbach@t-online.de")) (:maintainers ("Felix Weilbach" . "felix.weilbach@t-online.de")) (:maintainer "Felix Weilbach" . "felix.weilbach@t-online.de"))]) + (mvn . [(20181002 1617) nil "Helpers for compiling with maven" tar ((:url . "https://github.com/apgwoz/mvn-el") (:commit . "ffa40235b7dabb6c6c165f64f32a963cde8031f0") (:revdesc . "ffa40235b7da") (:keywords "compilation" "maven" "java") (:authors ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainers ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainer "Andrew Gwozdziewycz" . "git@apgwoz.com"))]) + (mw-thesaurus . [(20230426 1752) ((emacs (25)) (request (0 3 0)) (dash (2 16 0))) "Merriam-Webster Thesaurus" tar ((:url . "https://github.com/agzam/mw-thesaurus.el") (:commit . "c44d793595c2d0f6789621da457da065920968ac") (:revdesc . "c44d793595c2") (:keywords "wp" "matching"))]) + (mwim . [(20181110 1900) nil "Switch between the beginning/end of line or code" tar ((:url . "https://github.com/alezost/mwim.el") (:commit . "b4f3edb4c0fb8f8b71cecbf8095c2c25a8ffbf85") (:revdesc . "b4f3edb4c0fb") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (mxf-view . [(20180501 740) ((emacs (25))) "Simple MXF viewer" tar ((:url . "https://github.com/t-suwa/mxf-view") (:commit . "c4825f35fad81c4624a2fcaea95cc605addf5cbc") (:revdesc . "c4825f35fad8") (:keywords "data" "multimedia") (:authors ("Tomotaka SUWA" . "tomotaka.suwa@gmail.com")) (:maintainers ("Tomotaka SUWA" . "tomotaka.suwa@gmail.com")) (:maintainer "Tomotaka SUWA" . "tomotaka.suwa@gmail.com"))]) + (my-repo-pins . [(20230120 1105) ((emacs (26 1))) "Keep your git repositories organized" tar ((:url . "https://alternativebit.fr/projects/my-repo-pins/") (:commit . "e6fe3864e244e6db74b668d24857c04472b2d475") (:revdesc . "e6fe3864e244") (:authors ("Félix Baylac Jacqué" . "felixatalternativebit.fr")) (:maintainers ("Félix Baylac Jacqué" . "felixatalternativebit.fr")) (:maintainer "Félix Baylac Jacqué" . "felixatalternativebit.fr"))]) + (myanmar-input-methods . [(20160106 1537) nil "Emacs Input Method for Myanmar" tar ((:url . "http://github.com/yelinkyaw/emacs-myanmar-input-methods") (:commit . "9d4e0d6358c61bde7a2274e430ef71683faea32e") (:revdesc . "9d4e0d6358c6") (:keywords "myanmar" "unicode" "keyboard") (:authors ("Ye Lin Kyaw" . "yelinkyaw@gmail.com")) (:maintainers ("Ye Lin Kyaw" . "yelinkyaw@gmail.com")) (:maintainer "Ye Lin Kyaw" . "yelinkyaw@gmail.com"))]) + (mybigword . [(20230809 904) ((emacs (26 1)) (avy (0 5 0))) "Vocabulary builder using Zipf to extract English big words" tar ((:url . "https://github.com/redguardtoo/mybigword") (:commit . "13574e2c47a670df4b776b88bd633b2e8a82b2b2") (:revdesc . "13574e2c47a6") (:keywords "convenience") (:authors ("Chen Bin" . "chenbinDOTshATgmail.com")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmail.com")) (:maintainer "Chen Bin" . "chenbinDOTshATgmail.com"))]) + (mybuild-mode . [(20221007 1928) ((emacs (24 3))) "Major mode for editing Mybuild files from Embox" tar ((:url . "https://github.com/easimonenko/mybuild-mode") (:commit . "54e3c31e3b5f133eb8611a3759e59733b17e33e3") (:revdesc . "54e3c31e3b5f") (:keywords "languages") (:authors ("Evgeny Simonenko" . "easimonenko@gmail.com")) (:maintainers ("Evgeny Simonenko" . "easimonenko@gmail.com")) (:maintainer "Evgeny Simonenko" . "easimonenko@gmail.com"))]) + (mykie . [(20150808 2205) ((emacs (24 3)) (cl-lib (0 5))) "Command multiplexer: Register multiple functions to a keybind" tar ((:url . "https://github.com/yuutayamada/mykie-el") (:commit . "91f222b4f2b2b4285b0bc306905eb960826a67ed") (:revdesc . "91f222b4f2b2") (:keywords "emacs" "configuration" "keybind") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (mynt-mode . [(20150512 2049) ((virtualenvwrapper (20131514))) "Minor mode to work with the mynt static site generator" tar ((:url . "https://github.com/crshd/mynt-mode") (:commit . "23d4489167bfa899634548cb41ed32fdeb3600c9") (:revdesc . "23d4489167bf") (:keywords "convenience"))]) + (myrddin-mode . [(20191225 2120) ((emacs (24 3))) "Major mode for editing Myrddin source files" tar ((:url . "https://git.sr.ht/~jakob/myrddin-mode") (:commit . "51c0a2cb9dfc9526cd47e71313f5a745c99cadcc") (:revdesc . "51c0a2cb9dfc") (:keywords "languages") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainers ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org"))]) + (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 ((:url . "https://github.com/mallt/mysql-to-org-mode") (:commit . "c5eefc71200f2e1d0d67a13ed897b3cdfa835117") (:revdesc . "c5eefc71200f") (: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 ((:url . "http://ismail.teamfluxion.com") (:commit . "c635868e13ee898ec77925d98b36421640e22aa4") (:revdesc . "c635868e13ee") (:keywords "convenience" "shortcuts") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainers ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com"))]) + (n4js . [(20150714 231) ((emacs (24)) (cypher-mode (0))) "Neo4j Shell" tar ((:url . "https://github.com/tmtxt/n4js.el") (:commit . "3991ed8975151d5e8d568e952362df810f7ffab7") (:revdesc . "3991ed897515") (:keywords "neo4j" "shell" "comint") (:authors ("TruongTx" . "me@truongtx.me")) (:maintainers ("TruongTx" . "me@truongtx.me")) (:maintainer "TruongTx" . "me@truongtx.me"))]) + (nael . [(20251217 1400) ((emacs (29 1))) "Major mode for Lean" tar ((:url . "https://codeberg.org/mekeor/nael") (:commit . "7a8fb2615a10f57380bb83fad1f0c12775c4b6c5") (:revdesc . "7a8fb2615a10") (:keywords "languages") (:maintainers ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainer "Mekeor Melire" . "mekeor@posteo.de"))]) + (naga-theme . [(20250608 1926) nil "Dark color theme with green foreground color" tar ((:url . "https://github.com/kenranunderscore/emacs-naga-theme") (:commit . "c150b397d1a14e470dd54d2628b2bd9d3e2faad0") (:revdesc . "c150b397d1a1") (: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 ((:url . "https://github.com/knl/name-this-color.el") (:commit . "e37cd1291d5d68d4c8d6386eab9cb9d94fd3bcfa") (:revdesc . "e37cd1291d5d") (:keywords "lisp" "color" "hex" "rgb" "shade" "name"))]) + (named-timer . [(20181120 2224) ((emacs (24 4))) "Simplified timer management for Emacs Lisp" tar ((:url . "https://github.com/DarwinAwardWinner/emacs-named-timer") (:commit . "670b81e3eddef2e7353a4eedc9553a85306445db") (:revdesc . "670b81e3edde") (:keywords "tools"))]) + (nameframe . [(20221023 957) nil "Manage frames by name" tar ((:url . "https://github.com/john2x/nameframe") (:commit . "06d3400750c6b33ae215b9ac2922ee4dafd6b506") (:revdesc . "06d3400750c6") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainers ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com"))]) + (nameframe-perspective . [(20221023 957) ((nameframe (0 5 0 -2)) (perspective (1 12))) "Nameframe integration with perspective.el" tar ((:url . "https://github.com/john2x/nameframe") (:commit . "06d3400750c6b33ae215b9ac2922ee4dafd6b506") (:revdesc . "06d3400750c6") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainers ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com"))]) + (nameframe-project . [(20221024 209) ((emacs (28 1)) (nameframe (0 5 0 -2)) (project (0 8 1))) "Nameframe integration with project.el" tar ((:url . "https://github.com/john2x/nameframe") (:commit . "3116b6738f74a95e144a75344355e09f72620e01") (:revdesc . "3116b6738f74") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainers ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com"))]) + (nameframe-projectile . [(20221023 957) ((nameframe (0 5 0 -2)) (projectile (0 13 0))) "Nameframe integration with Projectile" tar ((:url . "https://github.com/john2x/nameframe") (:commit . "06d3400750c6b33ae215b9ac2922ee4dafd6b506") (:revdesc . "06d3400750c6") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainers ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com"))]) + (nameless . [(20230112 1259) ((emacs (24 4))) "Hide package namespace in your emacs-lisp code" tar ((:url . "https://github.com/Malabarba/nameless") (:commit . "e468f3eea4518b9827419611868c897dce20453f") (:revdesc . "e468f3eea451") (:keywords "convenience" "lisp") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (names . [(20221227 1825) ((emacs (24 1)) (cl-lib (0 5))) "Namespaces for emacs-lisp. Avoid name clobbering without hiding symbols" tar ((:url . "https://github.com/Malabarba/names") (:commit . "45a272fae915148d9a74d4cb3c39917b272ee9c3") (:revdesc . "45a272fae915") (:keywords "extensions" "lisp") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (namespaces . [(20130326 2250) nil "An implementation of namespaces for Elisp, with an emphasis on immutabilty" tar ((:url . "https://github.com/chrisbarrett/elisp-namespaces") (:commit . "3d02525d9b9a5ae6e7be3adefd880121436e6270") (:revdesc . "3d02525d9b9a"))]) + (nand2tetris . [(20171201 1813) ((emacs (24))) "Major mode for HDL files in the nand2tetris course" tar ((:url . "http://www.github.com/CestDiego/nand2tetris.el/") (:commit . "fe37ee41367ceff6f7d7a472a5f80cf1285e1e01") (:revdesc . "fe37ee41367c") (:keywords "nand2tetris" "hdl") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com"))]) + (nand2tetris-assembler . [(20171201 1813) ((nand2tetris (1 1 0))) "Assembler For the Nand2tetris Course" tar ((:url . "http://www.github.com/CestDiego/nand2tetris-assembler.el/") (:commit . "fe37ee41367ceff6f7d7a472a5f80cf1285e1e01") (:revdesc . "fe37ee41367c") (:keywords "nand2tetris-assembler" "hdl") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com"))]) + (nanowrimo . [(20151105 228) nil "Track progress for nanowrimo" tar ((:url . "https://bitbucket.org/gvol/nanowrimo-mode") (:commit . "b1d41458926ccb39cefbb1bb74aefe4f02fd349f") (:revdesc . "b1d41458926c") (:authors ("Ivan Andrus" . "darthandrusatgmail.com")) (:maintainers ("Ivan Andrus" . "darthandrusatgmail.com")) (:maintainer "Ivan Andrus" . "darthandrusatgmail.com"))]) + (naquadah-theme . [(20190225 1427) nil "A theme based on Tango color set" tar ((:url . "https://github.com/jd/naquadah-theme") (:commit . "430c3b7bd51922cb616b3f60301f4e2604816ed8") (:revdesc . "430c3b7bd519"))]) + (narrow-reindent . [(20150722 1906) ((emacs (24 4))) "Defines a minor mode to left-align narrowed regions" tar ((:url . "https://github.com/emallson/narrow-reindent.el") (:commit . "87466aac4dbeb79597124dd077bf5c704872fd3d") (:revdesc . "87466aac4dbe") (:authors ("J David Smith" . "emallson@atlanis.net")) (:maintainers ("J David Smith" . "emallson@atlanis.net")) (:maintainer "J David Smith" . "emallson@atlanis.net"))]) + (narrowed-page-navigation . [(20150109 519) ((emacs (24)) (cl-lib (0 5))) "A minor mode for showing one page at a time" tar ((:url . "https://github.com/david-christiansen/narrowed-page-navigation") (:commit . "b215adbac4873f56fbab65772062f0f5be8058a1") (:revdesc . "b215adbac487") (:keywords "outlines") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))]) + (narumi . [(20220228 243) ((emacs (26 1))) "A dashboard that displays a ramdom sampled image" tar ((:url . "https://github.com/nryotaro/narumi") (:commit . "2f23f03a7b94766799f26605e167b259a4a90903") (:revdesc . "2f23f03a7b94"))]) + (nash-mode . [(20160830 1212) nil "Nash major mode" tar ((:url . "https://github.com/tiago4orion/nash-mode.el") (:commit . "bb7ae728a16812a0ef506483b877f6221c92ca9c") (:revdesc . "bb7ae728a168") (:keywords "nash" "languages"))]) + (nasm-mode . [(20250320 1646) ((emacs (24 3))) "NASM x86 assembly major mode" tar ((:url . "https://github.com/skeeto/nasm-mode") (:commit . "4e670f6dededab858251670aa5459c950f78d867") (:revdesc . "4e670f6deded") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (native-complete . [(20240909 2007) ((emacs (26 1))) "Shell completion using native complete mechanisms" tar ((:url . "https://github.com/CeleritasCelery/emacs-native-shell-complete") (:commit . "157bd9c23508c4b0b8636c9a6d9b6ecc6209d4f0") (:revdesc . "157bd9c23508") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainers ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com"))]) + (nav . [(20250211 1523) nil "Emacs mode for filesystem navigation" tar ((:url . "https://github.com/emacsorphanage/nav") (:commit . "c9446387e337888778ea289ed7acc009691450da") (:revdesc . "c9446387e337") (: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 ((:url . "http://github.com/rolandwalker/nav-flash") (:commit . "5d4b48567862f6be0ca973d6b1dca90e4815cb9b") (:revdesc . "5d4b48567862") (:keywords "extensions" "navigation" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (navi-mode . [(20201220 1727) ((outshine (2 0)) (outorg (2 0))) "Major-mode for easy buffer-navigation" tar ((:url . "https://github.com/alphapapa/navi") (:commit . "cf97e1e338815ad3a4d0bbbf4ff6dd1a4e322ca8") (:revdesc . "cf97e1e33881") (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (navi2ch . [(20200130 36) nil "Navigator for 2ch for Emacsen" tar ((:url . "https://github.com/naota/navi2ch") (:commit . "7811dba052f679bd920a1f648d621a6fecace10f") (:revdesc . "7811dba052f6") (:keywords "network" "2ch") (:authors ("Taiki SUGAWARA" . "taiki@users.sourceforge.net")) (:maintainers ("Taiki SUGAWARA" . "taiki@users.sourceforge.net")) (:maintainer "Taiki SUGAWARA" . "taiki@users.sourceforge.net"))]) + (navigel . [(20251125 1931) ((emacs (25 1)) (tablist (1 0))) "Facilitate the creation of tabulated-list based UIs" tar ((:url . "https://github.com/DamienCassou/navigel") (:commit . "539fe2d9542b01824869b98cde000079a1159b9f") (:revdesc . "539fe2d9542b") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (naysayer-theme . [(20250406 2017) ((emacs (24))) "The naysayer color theme" tar ((:url . "https://github.com/nickav/naysayer-theme.el") (:commit . "00fe031e38f1111614f088505776b09a5453f4ff") (:revdesc . "00fe031e38f1") (:authors ("Nick Aversano" . "nickav@users.noreply.github.com")) (:maintainers ("Nick Aversano" . "nickav@users.noreply.github.com")) (:maintainer "Nick Aversano" . "nickav@users.noreply.github.com"))]) + (ncl-mode . [(20180129 703) ((emacs (24))) "Major Mode for editing NCL scripts and other goodies" tar ((:url . "https://github.com/yyr/ncl-mode") (:commit . "602292712a9e6b7e7c25155978999e77d06b7338") (:revdesc . "602292712a9e") (:keywords "ncl" "major mode" "ncl-mode" "atmospheric science.") (:authors ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainers ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainer "Yagnesh Raghava Yakkala" . "hi@yagnesh.org"))]) + (nclip . [(20130617 2015) nil "Network (HTTP) Clipboard" tar ((:url . "http://www.github.com/maio/nclip.el") (:commit . "af88e38b1f04be02bf2e57affc662dbd0f828e67") (:revdesc . "af88e38b1f04") (:keywords "nclip" "clipboard" "network") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainers ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com"))]) + (neato-graph-bar . [(20181130 1649) ((emacs (24 3))) "Neat-o graph bars CPU/memory etc" tar ((:url . "https://gitlab.com/RobertCochran/neato-graph-bar") (:commit . "a7ae35afd67911e8924f36e646bce0d3e3c1bbe6") (:revdesc . "a7ae35afd679") (:authors ("Robert Cochran" . "robert-git@cochranmail.com")) (:maintainers ("Robert Cochran" . "robert-git@cochranmail.com")) (:maintainer "Robert Cochran" . "robert-git@cochranmail.com"))]) + (neil . [(20251217 857) ((emacs (29 4))) "Companion for Babashka Neil" tar ((:url . "https://github.com/babashka/neil") (:commit . "196e8f7933289902965fdc6da2d0227b80e06936") (:revdesc . "196e8f793328") (:keywords "convenience" "tools") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com"))]) + (nemerle . [(20161029 2023) nil "Major mode for editing nemerle programs" tar ((:url . "https://github.com/rsdn/nemerle") (:commit . "8818c5af5598e16ea59189e1e3245f0a3d7c78f0") (:revdesc . "8818c5af5598") (:keywords "nemerle" "mode" "languages") (:authors ("Jacek Sliwerski" . "rzyj@o2.pl")) (:maintainers ("Jacek Sliwerski" . "rzyj@o2.pl")) (:maintainer "Jacek Sliwerski" . "rzyj@o2.pl"))]) + (neon-mode . [(20241220 1304) ((emacs (24 1))) "Simple major mode for editing neon files" tar ((:url . "https://github.com/Fuco1/neon-mode") (:commit . "23b12659d72a9520850bca72fe64bb7b06fc7b6b") (:revdesc . "23b12659d72a") (:keywords "conf") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (neotree . [(20250703 2202) ((cl-lib (0 5))) "A tree plugin like NerdTree for Vim" tar ((:url . "https://github.com/jaypei/emacs-neotree") (:commit . "3178805a0942696d1e5162575d9cab43d14b7970") (:revdesc . "3178805a0942") (:authors ("jaypei" . "jaypei97159@gmail.com")) (:maintainers ("jaypei" . "jaypei97159@gmail.com")) (:maintainer "jaypei" . "jaypei97159@gmail.com"))]) + (nerd-icons . [(20251214 1318) ((emacs (25 1))) "Emacs Nerd Font Icons Library" tar ((:url . "https://github.com/rainstormstudio/nerd-icons.el") (:commit . "081f6f4f99b9460b63b5a2a6087b62fefd06a5d0") (:revdesc . "081f6f4f99b9") (:keywords "lisp") (:authors ("Hongyu Ding" . "rainstormstudio@yahoo.com") ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Hongyu Ding" . "rainstormstudio@yahoo.com") ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Hongyu Ding" . "rainstormstudio@yahoo.com"))]) + (nerd-icons-completion . [(20251029 2106) ((emacs (25 1)) (nerd-icons (0 0 1)) (compat (30))) "Add icons to completion candidates" tar ((:url . "https://github.com/rainstormstudio/nerd-icons-completion") (:commit . "d09ea987ed3d2cc64137234f27851594050e2b64") (:revdesc . "d09ea987ed3d") (:keywords "lisp") (:authors ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainers ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainer "Hongyu Ding" . "rainstormstudio@yahoo.com"))]) + (nerd-icons-corfu . [(20250729 1544) ((emacs (27 1)) (nerd-icons (0 1 0))) "Icons for Corfu via nerd-icons" tar ((:url . "https://github.com/LuigiPiucco/nerd-icons-corfu") (:commit . "f821e953b1a3dc9b381bc53486aabf366bf11cb1") (:revdesc . "f821e953b1a3") (:keywords "convenience" "files" "icons") (:authors ("Luigi Sartor Piucco" . "luigipiucco@gmail.com")) (:maintainers ("Luigi Sartor Piucco" . "luigipiucco@gmail.com")) (:maintainer "Luigi Sartor Piucco" . "luigipiucco@gmail.com"))]) + (nerd-icons-dired . [(20251106 1840) ((emacs (24 4)) (nerd-icons (0 0 1))) "Shows icons for each file in dired mode" tar ((:url . "https://github.com/rainstormstudio/nerd-icons-dired") (:commit . "3265d6c4b552eae457d50d423adb10494113d70b") (:revdesc . "3265d6c4b552") (:keywords "lisp") (:authors ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainers ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainer "Hongyu Ding" . "rainstormstudio@yahoo.com"))]) + (nerd-icons-grep . [(20250625 1435) ((emacs (30 1)) (nerd-icons (0 0 1))) "Add nerd-icons to grep-mode" tar ((:url . "https://github.com/hron/nerd-icons-grep") (:commit . "7179ff3384efce53f7de2f3c1a98070a310a10da") (:revdesc . "7179ff3384ef") (:keywords "tools" "grep" "icons") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainers ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com"))]) + (nerd-icons-ibuffer . [(20251022 42) ((emacs (24 3)) (nerd-icons (0 0 1))) "Display nerd icons in ibuffer" tar ((:url . "https://github.com/seagle0128/nerd-icons-ibuffer") (:commit . "590bd834cf5f1898320f5f16ecbed0d5fd3167ed") (:revdesc . "590bd834cf5f") (:keywords "convenience" "icons" "ibuffer") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com"))]) + (nerd-icons-ivy-rich . [(20250307 1005) ((emacs (26 1)) (ivy-rich (0 1 0)) (nerd-icons (0 0 1))) "Excellent experience with nerd icons for ivy/counsel" tar ((:url . "https://github.com/seagle0128/nerd-icons-ivy-rich") (:commit . "5006f91b49e86e232cdc1a628501b76124c41dac") (:revdesc . "5006f91b49e8") (:keywords "convenience" "icons" "ivy") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainers ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com"))]) + (nerd-icons-xref . [(20251214 1029) ((emacs (30 1)) (nerd-icons (0 0 1)) (xref (1 0 4))) "Add nerd-icons to xref buffers" tar ((:url . "https://github.com/hron/nerd-icons-xref") (:commit . "47db9ce08fe6514ddb36bdd714256f4e3985579a") (:revdesc . "47db9ce08fe6") (:keywords "tools" "xref" "icons") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainers ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com"))]) + (nerdtab . [(20180811 339) ((emacs (24 5))) "Keyboard-oriented tabs" tar ((:url . "https://github.com/casouri/nerdtab") (:commit . "601d531fa3748db733fbdff157a0f1cdf8a66416") (:revdesc . "601d531fa374") (:keywords "convenience") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainers ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com"))]) + (netease-music . [(20210411 603) ((names (0 5)) (emacs (25))) "Listen netease music" tar ((:url . "https://github.com/nicehiro/netease-music") (:commit . "db7f1eef2d8544983509db679be1cbe6a5678071") (:revdesc . "db7f1eef2d85") (:keywords "multimedia" "chinese" "music") (:authors ("hiro方圆" . "wfy11235813@gmail.com")) (:maintainers ("hiro方圆" . "wfy11235813@gmail.com")) (:maintainer "hiro方圆" . "wfy11235813@gmail.com"))]) + (nethack . [(20251213 1310) ((emacs (27 1))) "Run Nethack as a subprocess" tar ((:url . "https://github.com/Feyorsh/nethack-el") (:commit . "475d6113aa8a09fb81b581f3fb23fbfe76f7de22") (:revdesc . "475d6113aa8a") (:keywords "games") (:authors ("Ryan Yeske" . "rcyeske@vcn.bc.ca")) (:maintainers ("George Huebner" . "george@feyor.sh")) (:maintainer "George Huebner" . "george@feyor.sh"))]) + (netherlands-holidays . [(20150202 1617) nil "Netherlands holidays for Emacs calendar" tar ((:url . "https://github.com/abo-abo/netherlands-holidays") (:commit . "26236178cdd650df9958bf5a086e184096559f00") (:revdesc . "26236178cdd6") (:keywords "calendar") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (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 ((:url . "http://github.com/Kungsgeten/netrunner") (:commit . "c64672992175c8c1073c0f56c2e471839db71a0f") (:revdesc . "c64672992175") (:keywords "games"))]) + (network-watch . [(20171123 1146) ((emacs (24 3))) "Support for intermittent network connectivity" tar ((:url . "https://github.com/jamiguet/network-watch") (:commit . "d80b38dbec79f813c3949a8df8fb5f58d48b60ee") (:revdesc . "d80b38dbec79") (:keywords "unix" "tools" "hardware" "lisp") (:authors ("Juan Amiguet Vercher" . "jamiguet@gmail.com")) (:maintainers ("Juan Amiguet Vercher" . "jamiguet@gmail.com")) (:maintainer "Juan Amiguet Vercher" . "jamiguet@gmail.com"))]) + (neuron-mode . [(20220718 827) ((emacs (26 3)) (f (0 20 0)) (s (1 12 0)) (markdown-mode (2 3)) (company (0 9 13))) "Major mode for editing zettelkasten notes using neuron" tar ((:url . "https://github.com/felko/neuron-mode") (:commit . "33bc73f9a2ef1c6855bb12fec08e15a8cf4a6c6e") (:revdesc . "33bc73f9a2ef") (:keywords "outlines") (:authors ("felko" . "http://github/felko")) (:maintainers ("felko" . "http://github/felko")) (:maintainer "felko" . "http://github/felko"))]) + (neut-mode . [(20250608 958) ((emacs (29))) "A major mode for Neut" tar ((:url . "https://github.com/vekatze/neut-mode") (:commit . "8cfea9d387dd252de40c941c52b08699d45e1f04") (:revdesc . "8cfea9d387dd") (:authors ("vekatze" . "vekatze@icloud.com")) (:maintainers ("vekatze" . "vekatze@icloud.com")) (:maintainer "vekatze" . "vekatze@icloud.com"))]) + (never-comment . [(20140104 2207) nil "Never blocks are comment" tar ((:url . "http://stackoverflow.com/a/4554658/89376") (:commit . "1996d003cad6bccf1475f7845d79efacbc7cd673") (:revdesc . "1996d003cad6"))]) + (newlisp-mode . [(20160226 1545) nil "NewLISP editing mode for Emacs" tar ((:url . "https://github.com/kosh04/newlisp-mode") (:commit . "ac23be40c81a360988ab803d365f1510733f6db4") (:revdesc . "ac23be40c81a") (:keywords "language" "lisp" "newlisp") (:authors ("KOBAYASHI Shigeru" . "shigeru.kb[at]gmail.com")) (:maintainers ("KOBAYASHI Shigeru" . "shigeru.kb[at]gmail.com")) (:maintainer "KOBAYASHI Shigeru" . "shigeru.kb[at]gmail.com"))]) + (newspeak-mode . [(20211011 1425) ((emacs (24 3))) "Major mode for the Newspeak programming language" tar ((:url . "https://github.com/danielsz/newspeak-mode") (:commit . "f76aee3a1f7ff032ed9ef2d3a092f84c8c985e19") (:revdesc . "f76aee3a1f7f") (:maintainers ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com"))]) + (nexus . [(20220902 2009) nil "REST Client for Nexus Maven Repository servers" tar ((:url . "https://github.com/juergenhoetzel/emacs-nexus") (:commit . "9f0ddf7d6cb5f7df44f684f02e2bd8a96ecabbd6") (:revdesc . "9f0ddf7d6cb5") (:keywords "comm") (:authors ("Juergen Hoetzel" . "juergen@archlinux.org")) (:maintainers ("Juergen Hoetzel" . "juergen@archlinux.org")) (:maintainer "Juergen Hoetzel" . "juergen@archlinux.org"))]) + (nezburn-theme . [(20230726 600) nil "A low contrast color theme for Emacs (inspired by zenburn)" tar ((:url . "http://github.com/lanjoni/nezburn") (:commit . "83ea665941de938350956d62f430de1255a2d36d") (:revdesc . "83ea665941de") (:authors ("João Lanjoni" . "joaoaugustolanjoni@gmail.com")) (:maintainers ("João Lanjoni" . "joaoaugustolanjoni@gmail.com")) (:maintainer "João Lanjoni" . "joaoaugustolanjoni@gmail.com"))]) + (ng2-mode . [(20201203 1925) ((typescript-mode (0 1))) "Major modes for editing Angular 2" tar ((:url . "http://github.com/AdamNiederer/ng2-mode") (:commit . "d341f177c6e4fb9d99b8639943ab5fc9184e2715") (:revdesc . "d341f177c6e4") (:keywords "typescript" "angular" "angular2" "template") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com"))]) + (nginx-mode . [(20240412 402) nil "Major mode for editing nginx config files" tar ((:url . "https://github.com/ajc/nginx-mode") (:commit . "c4ac5de975d65c84893a130a470af32a48b0b66c") (:revdesc . "c4ac5de975d6") (:keywords "languages" "nginx") (:authors ("Andrew J Cosgriff" . "andrew@cosgriff.name")) (:maintainers ("Andrew J Cosgriff" . "andrew@cosgriff.name")) (:maintainer "Andrew J Cosgriff" . "andrew@cosgriff.name"))]) + (nice-org-html . [(20250608 1715) ((emacs (25 1)) (s (1 13 0)) (dash (2 19 1)) (htmlize (1 58)) (uuidgen (1 0))) "Prettier org-to-html export" tar ((:url . "https://github.com/ewantown/nice-org-html") (:commit . "bdb49bbe22dbd99489f2c65a10cb90f29d39d80d") (:revdesc . "bdb49bbe22db") (:keywords "org" "org-export" "html" "css" "js" "tools") (:authors ("Ewan Townshend" . "ewan@etown.dev")) (:maintainers ("Ewan Townshend" . "ewan@etown.dev")) (:maintainer "Ewan Townshend" . "ewan@etown.dev"))]) + (niceify-info . [(20160416 1244) nil "Improve usability of Info pages" tar ((:url . "https://github.com/aaron-em/niceify-info.el") (:commit . "66b45916f1994e16ee023d29fa7cf8fec48078f1") (:revdesc . "66b45916f199"))]) + (nickel-mode . [(20240514 1236) ((emacs (24 3))) "A major mode for editing Nickel source code" tar ((:url . "https://github.com/nickel-lang/nickel-mode") (:commit . "71441281e66500e978e10eb44d58e33a28f55b4e") (:revdesc . "71441281e665") (:keywords "languages" "configuration-language" "configuration" "nickel" "infrastructure") (:authors ("The Nickel Team" . "(nickel-lang@tweag.io)")) (:maintainers ("The Nickel Team" . "(nickel-lang@tweag.io)")) (:maintainer "The Nickel Team" . "(nickel-lang@tweag.io)"))]) + (niconama . [(20170910 1501) ((emacs (24)) (request (20170131 1747)) (cl-lib (0 5))) "Tools for Niconico Live Broadcast" tar ((:url . "https://github.com/NOBUTOKA/niconama.el") (:commit . "96e7553e50e6bf7b58aac50f52c9b0b8edb41c56") (:revdesc . "96e7553e50e6") (:keywords "comm"))]) + (night-owl-theme . [(20250224 1841) ((emacs (24))) "A color theme for the night owls out there" tar ((:url . "http://github.com/aaronjensen/night-owl-theme") (:commit . "13d9966ffda746231eef0dc905b50303309f115e") (:revdesc . "13d9966ffda7") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com"))]) + (nikki . [(20210228 428) ((emacs (24 3))) "A simple diary mode" tar ((:url . "https://github.com/th994/nikki") (:commit . "b2ea20d04a061df88d72bd8dd0412a6e7876458d") (:revdesc . "b2ea20d04a06") (:keywords "convenience") (:authors ("Taiki Harada" . "thdev994@gmail.com")) (:maintainers ("Taiki Harada" . "thdev994@gmail.com")) (:maintainer "Taiki Harada" . "thdev994@gmail.com"))]) + (nikola . [(20170703 2021) ((async (1 5)) (emacs (24 3))) "Simple wrapper for nikola" tar ((:url . ": https://git.daemons.it/drymer/nikola.el") (:commit . "964715ac30943c9d6976999cad208dc60d09def0") (:revdesc . "964715ac3094") (:keywords ":" "nikola") (:authors ("drymer" . "drymer[AT]autistici.org")) (:maintainers ("drymer" . "drymer[AT]autistici.org")) (:maintainer "drymer" . "drymer[AT]autistici.org"))]) + (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 ((:url . "https://github.com/nim-lang/nim-mode") (:commit . "625cc023bd75a741b7d4e629e5bec3a52f45b4be") (:revdesc . "625cc023bd75") (:keywords "nim" "languages") (:maintainers ("Simon Hafner" . "hafnersimon@gmail.com")) (:maintainer "Simon Hafner" . "hafnersimon@gmail.com"))]) + (nimbus-theme . [(20251201 2205) ((emacs (24 1))) "Nimbus dark theme" tar ((:url . "https://github.com/mrcnski/nimbus-theme") (:commit . "fb35c0c89e7da72945d3ee6f72042f25920adb04") (:revdesc . "fb35c0c89e7d") (:keywords "faces") (:authors ("Marcin Swieczkowski" . "marcin@realemail.net")) (:maintainers ("Marcin Swieczkowski" . "marcin@realemail.net")) (:maintainer "Marcin Swieczkowski" . "marcin@realemail.net"))]) + (ninetyfive . [(20251125 2223) ((emacs (26 1)) (websocket (1 12)) (async (1 9 7))) "NinetyFive" tar ((:url . "https://github.com/ninetyfive-gg/ninetyfive.el") (:commit . "0d673ac905c68a91dadf7e9c2ff6fa9c6402034e") (:revdesc . "0d673ac905c6") (:keywords "convenience" "productivity"))]) + (ninja-mode . [(20241103 1737) ((emacs (24 3))) "Major mode for editing .ninja files" tar ((:url . "https://github.com/jhasse/ninja-emacs") (:commit . "573c3aaedc6e90e9a8954bb70a24e079af7df390") (:revdesc . "573c3aaedc6e") (:keywords "languages"))]) + (nix-buffer . [(20180212 1518) ((f (0 17 3)) (emacs (24 4))) "Set up buffer environments with nix" tar ((:url . "https://github.com/shlevy/nix-buffer/tree/master/") (:commit . "db57cda36e7477bdc7ef5a136357b971b1d4d099") (:revdesc . "db57cda36e74"))]) + (nix-env-install . [(20200812 1305) ((emacs (25 1))) "Install packages using nix-env" tar ((:url . "https://github.com/akirak/nix-env-install") (:commit . "79c34bc117ba1cebeb67fab32c364951d2ec37a0") (:revdesc . "79c34bc117ba") (:keywords "processes" "tools") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (nix-haskell-mode . [(20190615 135) ((emacs (25)) (haskell-mode (16 0)) (nix-mode (1 3 0))) "Haskell-mode integrations for Nix" tar ((:url . "https://github.com/matthewbauer/nix-haskell") (:commit . "68efbcbf949a706ecca6409506968ed2ef928a20") (:revdesc . "68efbcbf949a") (:keywords "nix" "haskell" "languages" "processes") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainers ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com"))]) + (nix-mode . [(20230421 2036) ((emacs (25 1)) (magit-section (0)) (transient (0 3))) "Major mode for editing .nix files" tar ((:url . "https://github.com/NixOS/nix-mode") (:commit . "719feb7868fb567ecfe5578f6119892c771ac5e5") (:revdesc . "719feb7868fb") (:keywords "nix" "languages" "tools" "unix") (:maintainers ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com"))]) + (nix-modeline . [(20210405 742) ((emacs (25 1))) "Info about in-progress Nix evaluations on your modeline" tar ((:url . "https://github.com/ocelot-project/nix-modeline") (:commit . "9a6116a11bdacf649f2c50ae1f2f4b12c03bed70") (:revdesc . "9a6116a11bda") (:keywords "processes" "unix" "tools") (:authors ("Jordan Mulcahey" . "snhjordy@gmail.com")) (:maintainers ("Jordan Mulcahey" . "snhjordy@gmail.com")) (:maintainer "Jordan Mulcahey" . "snhjordy@gmail.com"))]) + (nix-sandbox . [(20210325 1622) ((dash (2 12 1)) (s (1 10 0))) "Utility functions to work with nix-shell sandboxes" tar ((:url . "https://github.com/travisbhartwell/nix-emacs") (:commit . "d3ec98405f1f9dac833abf9e146249b1b943870d") (:revdesc . "d3ec98405f1f") (:authors ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainers ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainer "Sven Keidel" . "svenkeidel@gmail.com"))]) + (nix-ts-mode . [(20251114 1500) ((emacs (29 1))) "Major mode for Nix expressions, powered by tree-sitter" tar ((:url . "https://github.com/nix-community/nix-ts-mode") (:commit . "03c77fdbbd22d9b87a654169c26339b28c97d8cd") (:revdesc . "03c77fdbbd22") (:keywords "nix" "languages" "tree-sitter") (:maintainers ("Remi Gelinas" . "mail@remigelin.as")) (:maintainer "Remi Gelinas" . "mail@remigelin.as"))]) + (nix-update . [(20250817 1556) ((emacs (25))) "Update \"fetch\" blocks in .nix expressions" tar ((:url . "https://github.com/jwiegley/nix-update-el") (:commit . "d67f4f7ba8c8ec43144600f5f970c5fd958fc2f7") (:revdesc . "d67f4f7ba8c8") (:keywords "nix") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainers ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com"))]) + (nixfmt . [(20240724 1531) ((emacs (24)) (reformatter (0 3))) "Reformat Nix using nixfmt" tar ((:url . "https://github.com/purcell/emacs-nixfmt") (:commit . "9c8a1c12320247a3fe643191b7574a3674fba317") (:revdesc . "9c8a1c123202") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (nixos-options . [(20160209 1841) ((emacs (24))) "Interface for browsing and completing NixOS options" tar ((:url . "http://www.github.com/travisbhartwell/nix-emacs/") (:commit . "045825c2e1cf0a4fb0a472e72c1dae8f55202cef") (:revdesc . "045825c2e1cf") (:keywords "unix") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com"))]) + (nixpkgs-fmt . [(20200327 2302) ((emacs (24)) (reformatter (0 3))) "Reformat Nix using nixpkgs-fmt" tar ((:url . "https://github.com/purcell/emacs-nixpkgs-fmt") (:commit . "83e03d6f20bdf79c1c448c15734367b1a7cc6b02") (:revdesc . "83e03d6f20bd") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (nlinum-hl . [(20211112 1241) ((emacs (24 4)) (nlinum (1 7)) (cl-lib (0 5))) "Heal nlinum's line numbers" tar ((:url . "https://github.com/hlissner/emacs-nlinum-hl") (:commit . "22f8d75ecdaab67e0d6d0d2da4766358456ca4f5") (:revdesc . "22f8d75ecdaa") (:keywords "nlinum" "highlight" "current" "line" "faces") (:authors ("Henrik Lissner" . "http://github/hlissner")) (:maintainers ("Henrik Lissner" . "git@henrik.io")) (:maintainer "Henrik Lissner" . "git@henrik.io"))]) + (nlinum-relative . [(20160526 708) ((emacs (24 4)) (nlinum (1 5))) "Relative line number with nlinum" tar ((:url . "https://github.com/xcodebuild/nlinum-relative") (:commit . "5b9950c97ba79a6f0683e38b13da23f39e01031c") (:revdesc . "5b9950c97ba7") (:keywords "convenience") (:authors ("codefalling" . "code.falling@gmail.com")) (:maintainers ("codefalling" . "code.falling@gmail.com")) (:maintainer "codefalling" . "code.falling@gmail.com"))]) + (nndiscourse . [(20241014 2134) ((emacs (27 1)) (rbenv (0 0 3)) (json-rpc (0 0 1))) "Gnus backend for Discourse" tar ((:url . "https://github.com/dickmao/nndiscourse") (:commit . "c8aaf40d3d8f10b0bbb40fa60a2d98c864b05aaf") (:revdesc . "c8aaf40d3d8f") (:keywords "news"))]) + (nnhackernews . [(20230705 1359) ((emacs (25 2)) (request (0 3 3)) (dash (2 18 1)) (anaphora (1 0 4))) "Gnus backend for Hacker News" tar ((:url . "https://github.com/dickmao/nnhackernews") (:commit . "4c13d261bf660901d5ff63a7ee170097ebe464ed") (:revdesc . "4c13d261bf66") (:keywords "news"))]) + (nnir-est . [(20180710 2103) nil "Gnus nnir interface for HyperEstraier" tar ((:url . "https://github.com/kawabata/nnir-est") (:commit . "6d0d5c8e33f4e4ccbc22350324c0990d2676fb5a") (:revdesc . "6d0d5c8e33f4") (:keywords "mail") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (nnreddit . [(20250831 1249) ((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 ((:url . "https://github.com/dickmao/nnreddit") (:commit . "4b194b5953e9d4e6d94ce929fc264cd2b9e200a4") (:revdesc . "4b194b5953e9") (:keywords "news"))]) + (nntwitter . [(20230705 1110) ((emacs (25 1)) (dash (20190401)) (anaphora (20180618)) (request (20190819))) "Gnus Backend For Twitter" tar ((:url . "https://github.com/dickmao/nntwitter") (:commit . "e27acca9beeb6645dd13545d42f6d4d97d59d82c") (:revdesc . "e27acca9beeb") (:keywords "news"))]) + (no-emoji . [(20180515 1837) ((emacs (24))) "Show :emoji-name: instead of emoji characters" tar ((:url . "https://github.com/ecraven/no-emoji") (:commit . "ebceeab50dbfe4d60235180a57633745dbc18c77") (:revdesc . "ebceeab50dbf") (:keywords "extensions") (:authors ("Peter" . "craven@gmx.net")) (:maintainers ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net"))]) + (no-littering . [(20251127 229) ((emacs (26 1)) (compat (30 1))) "Help keeping ~/.config/emacs clean" tar ((:url . "https://github.com/emacscollective/no-littering") (:commit . "5b568cab7f8340deecb02a5c59d55885fc7d147c") (:revdesc . "5b568cab7f83") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "emacs.no-littering@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.no-littering@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.no-littering@jonas.bernoulli.dev"))]) + (no-spam . [(20190724 1854) ((emacs (25 1))) "Add repeat delays to commands" tar ((:url . "https://github.com/mamapanda/no-spam") (:commit . "860860e4a0d59bd15c8e092dc42f5f7f769a428e") (:revdesc . "860860e4a0d5") (:keywords "keyboard" "tools") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainers ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com"))]) + (noaa . [(20250102 2211) ((emacs (27 1)) (kv (0 0 19)) (request (0 2 0)) (s (1 12 0))) "Get NOAA weather data" tar ((:url . "https://codeberg.org/thomp/noaa") (:commit . "d162d19dd057430840a08ede0ce333fc30ea5ab9") (:revdesc . "d162d19dd057") (:keywords "calendar"))]) + (noccur . [(20191015 719) nil "Run multi-occur on project/dired files" tar ((:url . "https://github.com/NicolasPetton/noccur.el") (:commit . "fa91647a305e89561d3dbe53da002fff49abe0bb") (:revdesc . "fa91647a305e") (:keywords "convenience") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))]) + (nocomments-mode . [(20250103 1842) nil "Minor mode that makes comments invisible" tar ((:url . "https://github.com/Lindydancer/nocomments-mode") (:commit . "aaa9ef1042e0084fb774b3ee4274e1f8edb4d35e") (:revdesc . "aaa9ef1042e0"))]) + (noctilux-theme . [(20161113 1442) ((emacs (24))) "Dark theme inspired by LightTable" tar ((:url . "https://github.com/sjrmanning/noctilux-theme") (:commit . "a3265a1be7f4d73f44acce6d968ca6f7add1f2ca") (:revdesc . "a3265a1be7f4") (:authors ("Simon Manning" . "simon@ecksdee.org")) (:maintainers ("Simon Manning" . "simon@ecksdee.org")) (:maintainer "Simon Manning" . "simon@ecksdee.org"))]) + (node-resolver . [(20140930 1723) ((cl-lib (0 5))) "Hook to install node modules in background" tar ((:url . "https://github.com/meandavejustice/node-resolver.el") (:commit . "ef9d0486907a746a80b02ffc6208a09c168a9f7c") (:revdesc . "ef9d0486907a") (:keywords "convenience" "nodejs" "javascript" "npm"))]) + (nodejs-repl . [(20240218 2357) nil "Run Node.js REPL" tar ((:url . "https://github.com/abicky/nodejs-repl.el") (:commit . "77a864ca72a6c30217085f1c4db5de72e47eb4da") (:revdesc . "77a864ca72a6"))]) + (nodemcu-mode . [(20180501 2225) ((emacs (25))) "Minor mode for NodeMCU" tar ((:url . "https://github.com/andrmuel/nodemcu-mode") (:commit . "8effd9f3df40b6b92a2f05e4d54750b624afc4a7") (:revdesc . "8effd9f3df40") (:keywords "tools") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainers ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch"))]) + (noether . [(20250320 1847) ((posframe (1 4 2)) (emacs (29 1))) "A modeline which plays hide and seek" tar ((:url . "https://devheroes.codes/lxsameer/noether") (:commit . "c7b85569181f351ae03c4f4d3f622549332534cd") (:revdesc . "c7b85569181f") (:keywords "frames" "modeline") (:authors ("Sameer Rahmani" . "lxsameer@gnu.org")) (:maintainers ("Sameer Rahmani" . "lxsameer@gnu.org")) (:maintainer "Sameer Rahmani" . "lxsameer@gnu.org"))]) + (noflet . [(20141102 1454) nil "Locally override functions" tar ((:url . "https://github.com/nicferrier/emacs-noflet") (:commit . "7ae84dc3257637af7334101456dafe1759c6b68a") (:revdesc . "7ae84dc32576") (:keywords "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (nofrils-acme-theme . [(20180620 1248) ((emacs (24))) "Port of \"No Frils Acme\" Vim theme" tar ((:url . "https://gitlab.com/esessoms/nofrils-theme") (:commit . "98ad7bfaff1d85b33dc162645670285b067c6f92") (:revdesc . "98ad7bfaff1d") (:authors ("Eric Sessoms" . "esessoms@protonmail.com")) (:maintainers ("Eric Sessoms" . "esessoms@protonmail.com")) (:maintainer "Eric Sessoms" . "esessoms@protonmail.com"))]) + (noir-mode . [(20230726 2309) ((emacs (25 1)) (rust-mode (1 0 5))) "Description" tar ((:url . "https://github.com/hhamud/noir-mode") (:commit . "aa6686e15a63498af327cc64f1d79e84c60bda42") (:revdesc . "aa6686e15a63") (:keywords "languages"))]) + (noir-ts-mode . [(20240331 137) ((emacs (29 1))) "Tree-sitter support for Noir" tar ((:url . "https://github.com/hhamud/noir-ts-mode") (:commit . "eb399cc69a3229f4141e193f98efead51d9b3cc8") (:revdesc . "eb399cc69a32") (:keywords "noir" "languages" "tree-sitter") (:authors ("Hamza Hamud" . "self@hamzahamud.com")) (:maintainers ("Hamza Hamud" . "self@hamzahamud.com")) (:maintainer "Hamza Hamud" . "self@hamzahamud.com"))]) + (noman . [(20240610 1145) ((emacs (29 1))) "Read command line help without a man page" tar ((:url . "https://github.com/andykuszyk/noman.el") (:commit . "61ab9c52273fc03b28881a5ce814b863cf050571") (:revdesc . "61ab9c52273f") (:keywords "docs") (:authors ("Andy Kuszyk" . "emacs@akuszyk.com")) (:maintainers ("Andy Kuszyk" . "emacs@akuszyk.com")) (:maintainer "Andy Kuszyk" . "emacs@akuszyk.com"))]) + (non-edit-mode . [(20230926 1404) ((emacs (24 1))) "Minor mode that disables editing" tar ((:url . "https://gitlab.com/aragaer/non-edit-mode") (:commit . "bc9d29e437d70675c725f3ef8a66abe574b9a142") (:revdesc . "bc9d29e437d7") (:keywords "convenience") (:authors ("aragaer" . "aragaer@gmail.com")) (:maintainers ("aragaer" . "aragaer@gmail.com")) (:maintainer "aragaer" . "aragaer@gmail.com"))]) + (nord-theme . [(20250312 2046) ((emacs (24))) "An arctic, north-bluish clean and elegant theme" tar ((:url . "https://github.com/nordtheme/emacs") (:commit . "551b2b8a0751c0a22e5c5daa6958152f208e668f") (:revdesc . "551b2b8a0751") (:authors ("Sven Greb" . "development@svengreb.de")) (:maintainers ("Sven Greb" . "development@svengreb.de")) (:maintainer "Sven Greb" . "development@svengreb.de"))]) + (nordic-night-theme . [(20250624 1732) ((emacs (24 1))) "A darker, more colorful version of the lovely Nord theme" tar ((:url . "https://codeberg.org/ashton314/nordic-night") (:commit . "a500ccc22fab22b291dfbddc8c534e665ae144f9") (:revdesc . "a500ccc22fab") (:authors ("Ashton Wiersdorf" . "mail@wiersdorf.dev")) (:maintainers ("Ashton Wiersdorf" . "mail@wiersdorf.dev")) (:maintainer "Ashton Wiersdorf" . "mail@wiersdorf.dev"))]) + (nordless-theme . [(20201222 1627) ((colorless-themes (0 2))) "A mostly colorless version of nord-theme" tar ((:url . "https://git.sr.ht/~lthms/colorless-themes.el") (:commit . "1b2a507b3b7f9559c944af8fc7531a60b38ae0c3") (:revdesc . "1b2a507b3b7f") (:keywords "faces" "theme") (:authors ("Thomas Letan" . "lthms@soap.coffee")) (:maintainers ("Thomas Letan" . "lthms@soap.coffee")) (:maintainer "Thomas Letan" . "lthms@soap.coffee"))]) + (norns . [(20241011 1212) ((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 ((:url . "https://github.com/p3r7/norns.el") (:commit . "d08eed8555a619a13aa99cfa2ef40e199e86114c") (:revdesc . "d08eed8555a6") (:keywords "processes" "terminals"))]) + (northcode-theme . [(20180423 1649) ((emacs (24))) "A dark theme focused on blue and orange colors" tar ((:url . "https://github.com/Northcode/northcode-theme.el") (:commit . "4d3750461ba25ec45321318b5f1af4e8fdf16147") (:revdesc . "4d3750461ba2") (:authors ("Andreas Larsen" . "andreas@northcode.no")) (:maintainers ("Andreas Larsen" . "andreas@northcode.no")) (:maintainer "Andreas Larsen" . "andreas@northcode.no"))]) + (nothing-theme . [(20200504 402) ((emacs (24 1))) "Monochrome theme" tar ((:url . "https://github.com/jaredgorski/nothing.el") (:commit . "17fc9ecc94af0c919a24c4fe92bb48890bb4c3b0") (:revdesc . "17fc9ecc94af") (:authors (nil . "jaredgorski6@gmail.com")) (:maintainers (nil . "jaredgorski6@gmail.com")) (:maintainer nil . "jaredgorski6@gmail.com"))]) + (notink-theme . [(20240625 326) ((emacs (26 1))) "A custom theme inspired by e-ink displays" tar ((:url . "https://github.com/MetroWind/notink-theme") (:commit . "d1e84622a491bb570d6a450706833fafaad74f39") (:revdesc . "d1e84622a491") (:keywords "faces") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainers ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com"))]) + (notmuch . [(20250620 1557) nil "Run notmuch within emacs" tar ((:url . "https://notmuchmail.org") (:commit . "63665f1ebd6eff7753b7798add657fd6dbd110d6") (:revdesc . "63665f1ebd6e"))]) + (notmuch-addr . [(20251101 2052) ((emacs (29 1)) (compat (30 1)) (notmuch (0 38))) "Improved address completion for Notmuch" tar ((:url . "https://github.com/tarsius/notmuch-addr") (:commit . "0883cd753f0a7a204f41c7311d3282ca3e53f869") (:revdesc . "0883cd753f0a") (:keywords "mail") (:authors ("Jonas Bernoulli" . "emacs.notmuch-addr@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.notmuch-addr@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.notmuch-addr@jonas.bernoulli.dev"))]) + (notmuch-bookmarks . [(20251203 2059) ((seq (2 20)) (emacs (26 1)) (notmuch (0 29 3))) "Add bookmark handling for notmuch buffers" tar ((:url . "https://github.com/publicimageltd/notmuch-bookmarks") (:commit . "11375003fc0a8440b7ff721b786a8eb4493af45f") (:revdesc . "11375003fc0a") (:keywords "mail") (:authors ("Jörg Volbers" . "joerg@joergvolbers.de")) (:maintainers ("Jörg Volbers" . "joerg@joergvolbers.de")) (:maintainer "Jörg Volbers" . "joerg@joergvolbers.de"))]) + (notmuch-labeler . [(20131230 1719) ((notmuch (0))) "Improve notmuch way of displaying labels" tar ((:url . "https://github.com/DamienCassou/notmuch-labeler") (:commit . "d65d1129555d368243df4770ecc1e7ccb88efc58") (:revdesc . "d65d1129555d") (:keywords "emacs" "package" "elisp" "notmuch" "emails") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com"))]) + (notmuch-maildir . [(20251101 2053) ((emacs (29 1)) (compat (30 1)) (notmuch (0 38))) "Display maildirs as a tree" tar ((:url . "https://github.com/tarsius/notmuch-maildir") (:commit . "f4982d49d05d3b76db55462ec0f7cfee35f92d20") (:revdesc . "f4982d49d05d") (:keywords "mail") (:authors ("Jonas Bernoulli" . "emacs.notmuch-maildir@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.notmuch-maildir@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.notmuch-maildir@jonas.bernoulli.dev"))]) + (notmuch-transient . [(20251101 2054) ((emacs (29 1)) (compat (30 1)) (notmuch (0 38)) (transient (0 10))) "Command dispatchers for Notmuch" tar ((:url . "https://github.com/tarsius/notmuch-transient") (:commit . "09861654f1a25a46849f5653a4e9651d9a093ecd") (:revdesc . "09861654f1a2") (:keywords "mail") (:authors ("Jonas Bernoulli" . "emacs.notmuch-transient@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.notmuch-transient@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.notmuch-transient@jonas.bernoulli.dev"))]) + (nov . [(20251213 1501) ((esxml (0 3 6)) (emacs (25 1))) "Featureful EPUB reader mode" tar ((:url . "https://depp.brause.cc/nov.el") (:commit . "874daf5e4791a6d4f47741422c80e2736e907351") (:revdesc . "874daf5e4791") (:keywords "hypermedia" "multimedia" "epub") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (nova-theme . [(20240904 2127) ((emacs (24 3))) "A dark, pastel color theme" tar ((:url . "https://github.com/muirmanders/emacs-nova-theme") (:commit . "51b2899ac56c29638d11336d3b2a9894bb35b86e") (:revdesc . "51b2899ac56c") (:keywords "theme" "dark" "nova" "pastel" "faces") (:authors ("Muir Manders" . "muir+emacs@mnd.rs")) (:maintainers ("Muir Manders" . "muir+emacs@mnd.rs")) (:maintainer "Muir Manders" . "muir+emacs@mnd.rs"))]) + (noxml-fold . [(20170823 1357) nil "Fold away XML things" tar ((:url . "https://github.com/paddymcall/noxml-fold") (:commit . "46c7f6a008672213238a9f8d7a416ce80916aa62") (:revdesc . "46c7f6a00867") (:keywords "xml" "folding") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainers ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org"))]) + (npm . [(20241222 1207) ((emacs (25 1)) (transient (0 1 0)) (jest (20220807 2243))) "Run your npm workflows" tar ((:url . "https://github.com/shaneikennedy/npm.el") (:commit . "45ac45b700c97b61e3133e7a17befb4ebc1d4332") (:revdesc . "45ac45b700c9") (:keywords "tools"))]) + (npm-mode . [(20190616 2025) ((emacs (24 1))) "Minor mode for working with npm projects" tar ((:url . "https://github.com/mojochao/npm-mode") (:commit . "3ee7c0bad5b7a041d4739ef3aaa06a3dc764e5eb") (:revdesc . "3ee7c0bad5b7") (:keywords "convenience" "project" "javascript" "node" "npm") (:authors ("Allen Gooch" . "allen.gooch@gmail.com")) (:maintainers ("Allen Gooch" . "allen.gooch@gmail.com")) (:maintainer "Allen Gooch" . "allen.gooch@gmail.com"))]) + (nrepl-eval-sexp-fu . [(20201007 2311) ((highlight (0 0 0)) (smartparens (0 0 0)) (thingatpt (0 0 0))) "Tiny functionality enhancements for evaluating sexps" tar ((:url . "https://github.com/samaaron/nrepl-eval-sexp-fu") (:commit . "2d6ad728b1ba290974a2ae1f232a5a96810a135b") (:revdesc . "2d6ad728b1ba") (:keywords "lisp" "highlight" "convenience") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainers ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net"))]) + (nrepl-sync . [(20140807 1557) ((cider (0 6))) "Connect to nrepl port and eval .sync.clj" tar ((:url . "https://github.com/phillord/lein-sync") (:commit . "471a08df87687a3eab61b3b8bf25a2e0962b5d5b") (:revdesc . "471a08df8768") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (ns-auto-titlebar . [(20181022 2154) ((emacs (24 4))) "Set the MacOS transparent titlebar to match theme" tar ((:url . "https://github.com/purcell/ns-auto-titlebar") (:commit . "b16092e8058af63ad2bc222f166b0aa3cb66bf9d") (:revdesc . "b16092e8058a") (:keywords "frames") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (nsis-mode . [(20230619 1220) nil "NSIS-mode" tar ((:url . "http://github.com/mlf176f2/nsis-mode") (:commit . "b5ae66dbab9b2d933a234bdcd28e017d44a1276f") (:revdesc . "b5ae66dbab9b") (:keywords "nsis"))]) + (nswbuff . [(20230311 154) ((emacs (25 1))) "Quick switching between buffers" tar ((:url . "https://github.com/joostkremers/nswbuff") (:commit . "dfea30e33ddb212a0d537bc927b4bcdf3ebe2cd1") (:revdesc . "dfea30e33ddb") (:keywords "extensions" "convenience") (:authors ("David Ponce" . "david@dponce.com") ("Kahlil HODGSON" . "dorge@tpg.com.au") ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm"))]) + (nu-mode . [(20250211 1243) ((undo-tree (0 6 5)) (ace-window (0)) (lv (0)) (avy (0)) (which-key (0)) (transpose-frame (0))) "Modern Emacs Keybinding" tar ((:url . "https://github.com/pyluyten/emacs-nu") (:commit . "6510bc3f22e921aeb8ef3190bca1f432acc2870e") (:revdesc . "6510bc3f22e9"))]) + (nubox . [(20170619 910) nil "Nubox color theme (dark, light and tty versions)" tar ((:url . "https://github.com/martijnat/nubox") (:commit . "84aa965f0cb4bde293237e4cc586643d1f662f83") (:revdesc . "84aa965f0cb4") (:keywords "faces") (:authors ("Martijn Terpstra" . "bigmartijn@gmail.com")) (:maintainers ("Martijn Terpstra" . "bigmartijn@gmail.com")) (:maintainer "Martijn Terpstra" . "bigmartijn@gmail.com"))]) + (number . [(20170901 1312) nil "Working with numbers at point" tar ((:url . "https://github.com/emacsattic/number") (:commit . "bbc278d34dbcca83e70e3be855ec98b23debfb99") (:revdesc . "bbc278d34dbc"))]) + (number-lock . [(20160830 200) nil "Enter symbols on your number keys without pressing shift" tar ((:url . "https://github.com/Liu233w/number-lock.el") (:commit . "1ac1b1a269128ddac820df7d45a8d0c703e9c05c") (:revdesc . "1ac1b1a26912") (:keywords "convenience") (:authors ("Liu233w" . "wwwlsmcom@outlook.com")) (:maintainers ("Liu233w" . "wwwlsmcom@outlook.com")) (:maintainer "Liu233w" . "wwwlsmcom@outlook.com"))]) + (numbers . [(20170802 1134) ((emacs (24))) "Display information and trivia about numbers" tar ((:url . "https://github.com/davep/numbers.el") (:commit . "dd02508b788a13b7d4dbcc4923fa23134b783ab3") (:revdesc . "dd02508b788a") (:keywords "games" "trivia" "maths" "numbers") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (numbex . [(20230601 1618) ((emacs (26 1))) "Manage numbered examples" tar ((:url . "https://github.com/enricoflor/numbex") (:commit . "b64f51388726363fc0d154219e2270c6b9c5ce19") (:revdesc . "b64f51388726") (:authors ("Enrico Flor" . "enrico@eflor.net")) (:maintainers ("Enrico Flor" . "enrico@eflor.net")) (:maintainer "Enrico Flor" . "enrico@eflor.net"))]) + (numeri . [(20250907 2357) ((emacs (29 1))) "Roman Numeral Conversion Library" tar ((:url . "https://github.com/kickingvegas/numeri") (:commit . "625694f596d8f54be8ba8f2a8002287f4cd4f6de") (:revdesc . "625694f596d8") (:keywords "tools") (:authors ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainers ("Charles Choi" . "kickingvegas@gmail.com")) (:maintainer "Charles Choi" . "kickingvegas@gmail.com"))]) + (numpydoc . [(20230811 1708) ((emacs (25 1)) (s (1 12 0)) (dash (2 18 0))) "NumPy style docstring insertion" tar ((:url . "https://github.com/douglasdavis/numpydoc.el") (:commit . "77e2893442c6e20af9c99b9ba2c6c11988fe0e80") (:revdesc . "77e2893442c6") (:keywords "convenience") (:authors ("Doug Davis" . "ddavis@ddavis.io")) (:maintainers ("Doug Davis" . "ddavis@ddavis.io")) (:maintainer "Doug Davis" . "ddavis@ddavis.io"))]) + (nushell-mode . [(20231204 1233) ((emacs (24 4))) "Major mode for Nushell scripts" tar ((:url . "https://github.com/mrkkrp/nushell-mode") (:commit . "e92791e06ea13b93be38874111b83172d6de67c1") (:revdesc . "e92791e06ea1") (:keywords "languages" "unix") (:authors ("Azzam S.A" . "vcs@azzamsa.com")) (:maintainers ("Azzam S.A" . "vcs@azzamsa.com")) (:maintainer "Azzam S.A" . "vcs@azzamsa.com"))]) + (nushell-ts-mode . [(20230911 152) ((emacs (29 1))) "Tree-sitter support for Nushell" tar ((:url . "https://github.com/herbertjones/nushell-ts-mode") (:commit . "68afe1a8275880995b4d9a122fecf4accca15183") (:revdesc . "68afe1a82758") (:keywords "nu" "nushell" "languages" "tree-sitter") (:authors ("Herbert Jones" . "jones.herbert@gmail.com")) (:maintainers ("Herbert Jones" . "jones.herbert@gmail.com")) (:maintainer "Herbert Jones" . "jones.herbert@gmail.com"))]) + (nv-delete-back . [(20170224 1249) ((emacs (24))) "Backward delete like modern text editors" tar ((:url . "https://gitlab.com/nivaca/nv-delete-back") (:commit . "44d506105989873dc1725e0cfc675925b35c9c98") (:revdesc . "44d506105989") (:keywords "lisp") (:authors ("Nicolas Vaughan" . "n.vaughan[at]oxon.org")) (:maintainers ("Nicolas Vaughan" . "n.vaughan[at]oxon.org")) (:maintainer "Nicolas Vaughan" . "n.vaughan[at]oxon.org"))]) + (nvm . [(20240921 1901) ((s (1 8 0)) (dash (2 18 0)) (f (0 14 0))) "Manage Node versions within Emacs" tar ((:url . "http://github.com/rejeep/nvm.el") (:commit . "d33f5b9260426617e27ca79c78d83a5e00073f97") (:revdesc . "d33f5b926042") (:keywords "node" "nvm") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (nxml-uxml . [(20220606 1213) ((emacs (25))) "MicroXML support for nXML" tar ((:url . "https://gitlab.com/dpk/nxml-uxml") (:commit . "95bbd0018ab218b9f39f5bf1f1e809f60fbc3edc") (:revdesc . "95bbd0018ab2") (:keywords "languages" "xml" "microxml"))]) + (nyan-mode . [(20220408 2334) ((emacs (24 1))) "Nyan Cat shows position in current buffer in mode-line" tar ((:url . "https://github.com/TeMPOraL/nyan-mode/") (:commit . "09904af23adb839c6a9c1175349a1fb67f5b4370") (:revdesc . "09904af23adb") (:keywords "convenience" "games" "mouse" "multimedia") (:authors ("Jacek TeMPOraL Zlydach" . "temporal.pl@gmail.com")) (:maintainers ("Jacek TeMPOraL Zlydach" . "temporal.pl@gmail.com")) (:maintainer "Jacek TeMPOraL Zlydach" . "temporal.pl@gmail.com"))]) + (nyx-theme . [(20170910 1307) ((emacs (24))) "Dark theme" tar ((:url . "https://github.com/GuidoSchmidt/emacs-nyx-theme") (:commit . "afe2b8c3b5421b4c292d182dcf77079b278e93d8") (:revdesc . "afe2b8c3b542") (:keywords "themes" "dark-theme") (:maintainers ("Guido Schmidt" . "guido.schmidt.2912@gmail.com")) (:maintainer "Guido Schmidt" . "guido.schmidt.2912@gmail.com"))]) + (oauth . [(20230706 2026) ((emacs (25 1))) "OAuth 1.0 client library" tar ((:url . "https://github.com/fvdbeek/emacs-oauth") (:commit . "737f4058b3239261cf7c95043034b95f1ce3b282") (:revdesc . "737f4058b323") (:keywords "comm") (:authors ("Peter Sanford" . "peter@petersdanceparty.com") ("Neil Roberts" . "bpeeluk@yahoo.co.uk")) (:maintainers ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainer "Folkert van der Beek" . "folkertvanderbeek@gmail.com"))]) + (oauth2-auto . [(20250624 1919) ((emacs (26 1)) (aio (1 0)) (alert (1 2)) (dash (2 19))) "Automatically refreshing OAuth 2.0 tokens" tar ((:url . "https://github.com/rhaps0dy/emacs-oauth2-auto") (:commit . "20b3153d9cfb7aafe68a0168647a17373adf5e22") (:revdesc . "20b3153d9cfb") (:keywords "comm" "oauth2") (:authors ("Adrià Garriga-Alonso" . "adria.garriga@gmail.com")) (:maintainers ("Adrià Garriga-Alonso" . "adria.garriga@gmail.com")) (:maintainer "Adrià Garriga-Alonso" . "adria.garriga@gmail.com"))]) + (oauth2-request . [(20210215 657) ((emacs (26 1)) (oauth2 (0 14)) (request (0 3))) "OAuth2 request package interface" tar ((:url . "https://github.com/conao3/oauth2-request.el") (:commit . "86ff048635e002b00e23d6bed2ec6f36c17bca8e") (:revdesc . "86ff048635e0") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (ob-acl2 . [(20240505 1844) ((emacs (28)) (org (9))) "Babel Functions for ACL2" tar ((:url . "https://github.com/tani/ob-acl2") (:commit . "db6b274de3cd16e17b5b525c94bf3ad9cc279970") (:revdesc . "db6b274de3cd") (:keywords "tools" "org" "literate programming" "theorem proving" "acl2" "proof assistant system") (:authors ("TANIGUCHI Masaya" . "masaya.taniguchi@a.riken.jp")) (:maintainers ("TANIGUCHI Masaya" . "masaya.taniguchi@a.riken.jp")) (:maintainer "TANIGUCHI Masaya" . "masaya.taniguchi@a.riken.jp"))]) + (ob-ada-spark . [(20221114 2007) ((emacs (26 1)) (f (0 20 0))) "Babel functions for Ada & SPARK" tar ((:url . "https://github.com/rocher/ob-ada-spark") (:commit . "92978410ca14aa4e84c229a0920ad40be91c35e1") (:revdesc . "92978410ca14") (:keywords "languages" "tools" "outlines"))]) + (ob-aider . [(20250325 1918) ((emacs (27 1)) (org (9 4))) "Org Babel functions for Aider.el & Aidermacs integration" tar ((:url . "https://github.com/localredhead/ob-aider.el") (:commit . "f611b0e733323c04bbbcab710a78a87f47e5fc74") (:revdesc . "f611b0e73332") (:keywords "tools" "convenience" "languages" "org" "processes") (:authors ("Levi Strope" . "levi.strope@gmail.com")) (:maintainers ("Levi Strope" . "levi.strope@gmail.com")) (:maintainer "Levi Strope" . "levi.strope@gmail.com"))]) + (ob-applescript . [(20190709 1607) nil "Org-babel functions for AppleScript" tar ((:url . "http://github.com/stig/ob-applescript.el") (:commit . "2b07b77b75bd02f2102f62e6d52ffdd0f921439a") (:revdesc . "2b07b77b75bd") (:keywords "literate programming" "reproducible research" "mac"))]) + (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 ((:url . "https://github.com/astahlman/ob-async") (:commit . "9aac486073f5c356ada20e716571be33a350a982") (:revdesc . "9aac486073f5") (:keywords "tools") (:authors ("Andrew Stahlman" . "andrewstahlman@gmail.com")) (:maintainers ("Andrew Stahlman" . "andrewstahlman@gmail.com")) (:maintainer "Andrew Stahlman" . "andrewstahlman@gmail.com"))]) + (ob-athena . [(20251130 2251) ((emacs (26 1))) "Run AWS Athena queries from Org Babel" tar ((:url . "https://github.com/will-abb/aws-athena-babel") (:commit . "dd46b58566129ab9a2c93d7702d90dea6900fddb") (:revdesc . "dd46b5856612") (:keywords "aws" "athena" "org" "babel" "sql" "tools") (:authors ("Williams Bosch-Bello" . "williamsbosch@gmail.com")) (:maintainers ("Williams Bosch-Bello" . "williamsbosch@gmail.com")) (:maintainer "Williams Bosch-Bello" . "williamsbosch@gmail.com"))]) + (ob-base64 . [(20241209 748) ((emacs (26 1))) "Org-babel for base64 content" tar ((:url . "https://github.com/keyweeusr/ob-base64") (:commit . "6d3ef9d937838eb69b0a91e4012a0b6084ba26e1") (:revdesc . "6d3ef9d93783") (:keywords "convenience" "embedding" "orgmode" "base64" "rendering") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (ob-bigquery . [(20251201 558) ((emacs (29 1)) (org (9 7))) "Babel support for BigQuery" tar ((:url . "https://www.github.com/lhernanz/ob-bigquery") (:commit . "1ee7996e603faad6edc1eda09b51c25841262218") (:revdesc . "1ee7996e603f") (:keywords "lisp"))]) + (ob-bitfield . [(20220401 600) ((emacs (24 4))) "Babel Functions for bitfield" tar ((:url . "https://github.com/gsingh93/ob-bitfield") (:commit . "abe3d8fe49dc53c4663def689ceb5c0433638652") (:revdesc . "abe3d8fe49dc"))]) + (ob-blockdiag . [(20210412 1541) nil "Org-babel functions for blockdiag evaluation" tar ((:url . "https://github.com/corpix/ob-blockdiag.el") (:commit . "e997644e81cc67a7092e6e9bb13c66f160491efb") (:revdesc . "e997644e81cc") (:keywords "tools" "convenience"))]) + (ob-browser . [(20170720 1918) ((org (8))) "Render HTML in org-mode blocks" tar ((:url . "https://github.com/krisajenkins/ob-browser") (:commit . "a347d9df1c87b7eb660be8723982c7ad2563631a") (:revdesc . "a347d9df1c87") (:keywords "org" "babel" "browser" "phantomjs") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com"))]) + (ob-cfengine3 . [(20230226 1954) ((emacs (24 1))) "Org Babel functions for CFEngine 3" tar ((:url . "https://github.com/nickanderson/ob-cfengine3") (:commit . "52aa32fdfa412860837e795d17d50dac237e56e4") (:revdesc . "52aa32fdfa41") (:keywords "tools" "convenience") (:authors ("Nick Anderson" . "nick@cmdln.org")) (:maintainers ("Nick Anderson" . "nick@cmdln.org")) (:maintainer "Nick Anderson" . "nick@cmdln.org"))]) + (ob-chatgpt-shell . [(20250704 705) ((emacs (27 1)) (chatgpt-shell (2 24 1))) "Org babel functions for ChatGPT evaluation" tar ((:url . "https://github.com/xenodium/ob-chatgpt-shell") (:commit . "0e592d19528f8f3283a93e0e2844299e9ea21fcc") (:revdesc . "0e592d19528f"))]) + (ob-clojurescript . [(20180406 1828) ((emacs (24 4)) (org (9 0))) "Org-babel functions for ClojureScript evaluation" tar ((:url . "https://gitlab.com/statonjr/ob-clojurescript") (:commit . "17ee1558aa94c7b0246fd03f684884122806cfe7") (:revdesc . "17ee1558aa94") (:keywords "literate programming" "reproducible research"))]) + (ob-coffee . [(20170725 1424) ((org (8))) "Org-babel functions for coffee-script evaluation" tar ((:url . "http://github.com/zweifisch/ob-coffee") (:commit . "7f0b330273e8af7777de87a75fe52a89798e4548") (:revdesc . "7f0b330273e8") (:keywords "org" "babel" "coffee-script") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com"))]) + (ob-coffeescript . [(20180126 719) ((emacs (24 4))) "Org-babel functions for coffee-script evaluation, and fully implementation!" tar ((:url . "https://github.com/brantou/ob-coffeescript") (:commit . "5a5bb04aea9c2a6eab5b05f90f5c7cb6de7b4261") (:revdesc . "5a5bb04aea9c") (:keywords "coffee-script" "literate programming" "reproducible research") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com"))]) + (ob-compile . [(20240324 320) ((emacs (24 4))) "Run compile by org-babel" tar ((:url . "https://github.com/TxGVNN/ob-compile") (:commit . "d9c3e446467badad571eef8832232ae5a6f9f05b") (:revdesc . "d9c3e446467b") (:keywords "literate programming" "reproducible" "processes" "compilation") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com"))]) + (ob-crystal . [(20180126 718) ((emacs (24 3))) "Org-babel functions for Crystal evaluation" tar ((:url . "https://github.com/brantou/ob-crystal") (:commit . "b3bb27a21a4cefef3f5aeef52718b694bd51245b") (:revdesc . "b3bb27a21a4c") (:keywords "crystal" "literate programming" "reproducible research") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com"))]) + (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 ((:url . "http://github.com/zweifisch/ob-cypher") (:commit . "da9f97339474a48d759fc128cee610c0bc9ae6c0") (:revdesc . "da9f97339474") (:keywords "org" "babel" "cypher" "neo4j") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com"))]) + (ob-d2 . [(20230314 352) ((emacs (24 1))) "Org-babel functions for d2" tar ((:url . "https://github.com/xcapaldi/ob-d2") (:commit . "5d197f8225a9fb4da997235b231abe30049c6825") (:revdesc . "5d197f8225a9") (:keywords "languages"))]) + (ob-dall-e-shell . [(20241112 2008) ((emacs (27 1)) (dall-e-shell (0 43 1))) "Org babel functions for DALL-E evaluation" tar ((:url . "https://github.com/xenodium/chatgpt-shell") (:commit . "1ef7951bf47f63d2d0808c3f475f82eac8c9b219") (:revdesc . "1ef7951bf47f"))]) + (ob-dao . [(20170816 1558) ((org (8))) "Org Babel Functions for Dao" tar ((:url . "https://github.com/xuchunyang/ob-dao") (:commit . "8c62bd800b1f572860e30be4b72c71fa415a2e31") (:revdesc . "8c62bd800b1f") (:keywords "literate programming" "reproducible research" "org" "babel" "dao") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (ob-dart . [(20221201 633) ((emacs (24 4))) "Evaluate Dart source blocks in org-mode" tar ((:url . "http://github.org/mzimmerm/ob-dart") (:commit . "f6d5664d5cc8b15e002f6899f8adedcb10ced5f1") (:revdesc . "f6d5664d5cc8") (:keywords "languages"))]) + (ob-deno . [(20250913 1628) ((emacs (29 1))) "Babel Functions for Javascript/TypeScript with Deno" tar ((:url . "https://github.com/isamert/ob-deno") (:commit . "d9225ecf2e4e111d75b1a059ec04448bc044f3d2") (:revdesc . "d9225ecf2e4e") (:keywords "literate programming" "reproducible research" "javascript" "typescript" "tools" "deno"))]) + (ob-diagrams . [(20160407 1237) nil "Org-babel functions for diagrams evaluation" tar ((:url . "http://orgmode.org") (:commit . "be45815f5596d181592fae709096b7b5f4a71992") (:revdesc . "be45815f5596") (:keywords "literate programming" "reproducible research"))]) + (ob-drawtiming . [(20230312 1740) ((emacs (24 1)) (org (8 0))) "Functions for drawtiming evaluation in org-babel" tar ((:url . "https://github.com/perfab71/ob-drawtiming") (:commit . "813736e20ce1c223700c87a6e70e3f126a11e933") (:revdesc . "813736e20ce1") (:keywords "tools" "multimedia"))]) + (ob-dsq . [(20220915 1610) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" tar ((:url . "https://github.com/fritzgrabo/ob-dsq") (:commit . "e001b263af87993755319caefaf5d19e196e4e1b") (:revdesc . "e001b263af87") (:keywords "data" "tools") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (ob-duckdb . [(20251220 1924) ((emacs (28 1)) (org (9 5))) "Org Babel integration for DuckDB CLI" tar ((:url . "https://github.com/gggion/ob-duckdb") (:commit . "c50b3168dc40ba646f137e8f090a2272f611d135") (:revdesc . "c50b3168dc40") (:keywords "languages" "org" "babel" "duckdb" "sql" "data" "analytics") (:maintainers ("gggion" . "gggion123@gmail.com")) (:maintainer "gggion" . "gggion123@gmail.com"))]) + (ob-elixir . [(20250706 556) ((org (8))) "Org-babel functions for elixir evaluation" tar ((:url . "http://github.com/zweifisch/ob-elixir") (:commit . "8e5d2f3c7adb0d5acde390264fec94627aa7af31") (:revdesc . "8e5d2f3c7adb") (:keywords "org" "babel" "elixir") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com"))]) + (ob-elm . [(20200528 1857) ((emacs (26 1)) (org (9 3))) "Org-babel functions for elm evaluation" tar ((:url . "https://www.bonfacemunyoki.com") (:commit . "d3a9fbc2f56416894c9aed65ea9a20cc1d98f15d") (:revdesc . "d3a9fbc2f564") (:keywords "languages" "tools"))]) + (ob-elvish . [(20180427 1900) nil "Org-babel functions for Elvish shell" tar ((:url . "https://github.com/zzamboni/ob-elvish") (:commit . "369181ceae1190bf971c71aebf9fc6133bd98c39") (:revdesc . "369181ceae11") (:keywords "literate programming" "elvish" "shell" "languages" "processes" "tools") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainers ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org"))]) + (ob-ess-julia . [(20210414 1444) ((ess (20201004 1522)) (julia-mode (0 4))) "Org babel support for Julia language" tar ((:url . "https://github.com/frederic-santos/ob-ess-julia") (:commit . "147e9e7fe55c41dd77171417e92af40db3530b84") (:revdesc . "147e9e7fe55c") (:keywords "languages"))]) + (ob-ffuf . [(20221004 1715) ((emacs (28 1))) "Babel functions for ffuf" tar ((:url . "https://github.com/daniel-ts/ob-ffuf") (:commit . "5310a3e766a252ac34f8cb2307c4e48e982f5611") (:revdesc . "5310a3e766a2") (:keywords "comm" "tools") (:maintainers ("Daniel Tschertkow" . "daniel.tschertkow@posteo.de")) (:maintainer "Daniel Tschertkow" . "daniel.tschertkow@posteo.de"))]) + (ob-fricas . [(20220612 854) ((emacs (26 1)) (frimacs (1 0))) "A FriCAS backend for Org-Babel" tar ((:url . "https://github.com/pdo/frimacs") (:commit . "742268f6f05f418993dc366bbca9ccc931125748") (:revdesc . "742268f6f05f") (:keywords "fricas" "computer algebra" "extensions" "tools") (:authors ("Paul Onions" . "paul.onions@acm.org")) (:maintainers ("Paul Onions" . "paul.onions@acm.org")) (:maintainer "Paul Onions" . "paul.onions@acm.org"))]) + (ob-fsharp . [(20221113 1904) ((emacs (25)) (fsharp-mode (1 9 8)) (seq (2 22))) "Org-Babel F#" tar ((:url . "https://github.com/juergenhoetzel/ob-fsharp") (:commit . "a5e893a88d47bd8ea01cf456331ce54910321b47") (:revdesc . "a5e893a88d47") (:keywords "literate programming" "reproducible research") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainers ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org"))]) + (ob-git-permalink . [(20220627 46) ((emacs (25 1))) "Import GitHub code given a permalink" tar ((:url . "https://github.com/kijimaD/ob-git-permalink") (:commit . "14224327a6b34c804b0e90d37b80630a80c56c0a") (:revdesc . "14224327a6b3") (:keywords "docs" "convenience") (:authors ("kijima Daigo" . "norimaking777@gmail.com")) (:maintainers ("kijima Daigo" . "norimaking777@gmail.com")) (:maintainer "kijima Daigo" . "norimaking777@gmail.com"))]) + (ob-go . [(20190201 2040) nil "Org-babel functions for go evaluation" tar ((:url . "http://orgmode.org") (:commit . "2067ed55f4c1d33a43cb3f6948609d240a8915f5") (:revdesc . "2067ed55f4c1") (:keywords "golang" "go" "literate programming" "reproducible research"))]) + (ob-graphql . [(20201222 1515) ((emacs (24 4)) (graphql-mode (20191024 1221)) (request (0 3 2))) "Org-Babel execution backend for GraphQL source blocks" tar ((:url . "https://github.com/jdormit/ob-graphql") (:commit . "7c35419f9eec5dc44967cbcfa13c7135b9a96bfc") (:revdesc . "7c35419f9eec") (:authors ("Jeremy Dormitzer" . "jeremy.dormitzer@gmail.com")) (:maintainers ("Jeremy Dormitzer" . "jeremy.dormitzer@gmail.com")) (:maintainer "Jeremy Dormitzer" . "jeremy.dormitzer@gmail.com"))]) + (ob-html-chrome . [(20181219 1042) ((emacs (24 4)) (f (0 20 0)) (s (1 7 0))) "HTML code blocks converted to PNG using Chrome" tar ((:url . "http://github.com/nikclayton/ob-html-chrome") (:commit . "7af6e4a24ed0aaf67751bdf752c7ca0ba02bb8d4") (:revdesc . "7af6e4a24ed0") (:keywords "languages" "org" "org-babel" "chrome" "html") (:authors (nil . "NikClaytonnik@ngo.org.uk")) (:maintainers (nil . "NikClaytonnik@ngo.org.uk")) (:maintainer nil . "NikClaytonnik@ngo.org.uk"))]) + (ob-http . [(20180707 1448) ((s (1 9 0)) (cl-lib (0 5))) "Http request in org-mode babel" tar ((:url . "http://github.com/zweifisch/ob-http") (:commit . "b1428ea2a63bcb510e7382a1bf5fe82b19c104a7") (:revdesc . "b1428ea2a63b") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com"))]) + (ob-hy . [(20180702 540) ((emacs (24 4))) "Org-babel functions for Hy-lang evaluation" tar ((:url . "https://github.com/brantou/ob-hy") (:commit . "a42ecaf440adc03e279afe43ee5ef6093ddd542a") (:revdesc . "a42ecaf440ad") (:keywords "hy" "literate programming" "reproducible research") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainers ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com"))]) + (ob-ipython . [(20180224 953) ((s (1 9 0)) (dash (2 10 0)) (dash-functional (1 2 0)) (f (0 17 2)) (emacs (24))) "Org-babel functions for IPython evaluation" tar ((:url . "http://www.gregsexton.org") (:commit . "7147455230841744fb5b95dcbe03320313a77124") (:revdesc . "714745523084") (:keywords "literate programming" "reproducible research") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainers ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com"))]) + (ob-julia-vterm . [(20250619 1430) ((emacs (26 1)) (julia-vterm (0 26)) (queue (0 2))) "Babel functions for Julia that work with julia-vterm" tar ((:url . "https://github.com/shg/ob-julia-vterm.el") (:commit . "bc0f851d4a64f1659021b480f61cdac024ce76fe") (:revdesc . "bc0f851d4a64") (:keywords "julia" "org" "outlines" "literate programming" "reproducible research"))]) + (ob-kotlin . [(20180823 1321) ((org (8))) "Org-babel functions for kotlin evaluation" tar ((:url . "http://github.com/zweifisch/ob-kotlin") (:commit . "b817ffb7fd03a25897eb2aba24af2035bbe3cfa8") (:revdesc . "b817ffb7fd03") (:keywords "org" "babel" "kotlin") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com"))]) + (ob-latex-as-png . [(20200629 1013) ((emacs (26 1)) (org (9 1))) "Org-babel functions for latex-as-png evaluation" tar ((:url . "https://github.com/alhassy/ob-latex-as-png") (:commit . "b0c68bdb54741fbee1068654e4eba1962241f271") (:revdesc . "b0c68bdb5474") (:keywords "literate programming" "reproducible research" "org" "convenience") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com"))]) + (ob-lesim . [(20230619 357) ((emacs (28 1)) (org (9 3)) (lesim-mode (0 3 3))) "Org-babel functions for lesim-mode" tar ((:url . "https://github.com/drghirlanda/ob-lesim") (:commit . "37e15f610783ff12926b5d221cefb4a49b4d54d6") (:revdesc . "37e15f610783") (:keywords "languages" "tools") (:authors ("Stefano Ghirlanda" . "drghirlanda@gmail.com")) (:maintainers ("Stefano Ghirlanda" . "drghirlanda@gmail.com")) (:maintainer "Stefano Ghirlanda" . "drghirlanda@gmail.com"))]) + (ob-lfe . [(20170725 1420) ((org (8))) "Org-babel functions for lfe evaluation" tar ((:url . "http://github.com/zweifisch/ob-lfe") (:commit . "f7780f58e650b4d29dfd834c662b1d354b620a8e") (:revdesc . "f7780f58e650") (:keywords "org" "babel" "lfe" "lisp" "erlang") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainers ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com"))]) + (ob-llm . [(20251208 18) ((emacs (27 1))) "Use `llm' as an Org Babel language" tar ((:url . "https://github.com/sunflowerseastar/ob-llm") (:commit . "16237613f3ce1fd909544ef8acc402674c482ed0") (:revdesc . "16237613f3ce") (:keywords "llm" "org-mode" "tools" "convenience" "org" "babel") (:authors ("Grant Surlyn" . "grant@sunflowerseastar.com")) (:maintainers ("Grant Surlyn" . "grant@sunflowerseastar.com")) (:maintainer "Grant Surlyn" . "grant@sunflowerseastar.com"))]) + (ob-lurk . [(20221122 2058) ((emacs (25 1)) (lurk-mode (0 1 6))) "Evaluate lurk code blocks in org mode" tar ((:url . "http://github.com/lurk-lang/lurk-emacs") (:commit . "bd7cf661ccb31bfbfab542018c361bd79064d4f4") (:revdesc . "bd7cf661ccb3") (:keywords "languages" "lurk" "lisp") (:maintainers ("Jeff Weiss" . "jweiss@protocol.ai")) (:maintainer "Jeff Weiss" . "jweiss@protocol.ai"))]) + (ob-mermaid . [(20250621 1655) nil "Org-babel support for mermaid evaluation" tar ((:url . "https://github.com/arnm/ob-mermaid") (:commit . "9b64cbc4b58a8e46ae7adbaa0cedc0e7d4c2eaf9") (:revdesc . "9b64cbc4b58a") (:keywords "lisp") (:authors ("Alexei Nunez" . "alexeirnunez@gmail.com")) (:maintainers ("Alexei Nunez" . "alexeirnunez@gmail.com")) (:maintainer "Alexei Nunez" . "alexeirnunez@gmail.com"))]) + (ob-ml-marklogic . [(20190312 1314) nil "Org-babel functions for MarkLogic evaluation" tar ((:url . "http://github.com/ndw/ob-ml-marklogic") (:commit . "d5660ad14f29e17cd26ae92eeb585b24030e9570") (:revdesc . "d5660ad14f29") (:keywords "marklogic" "xquery" "javascript" "sparql") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainers ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com"))]) + (ob-mongo . [(20170720 1919) ((org (8))) "Execute mongodb queries within org-mode blocks" tar ((:url . "https://github.com/krisajenkins/ob-mongo") (:commit . "371bf19c7c10eab2f86424f8db8ab685997eb5aa") (:revdesc . "371bf19c7c10") (:keywords "org" "babel" "mongo" "mongodb") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com"))]) + (ob-napkin . [(20240405 1223) ((emacs (26 1))) "Babel functions for Napkin" tar ((:url . "https://github.com/pinetr2e/ob-napkin") (:commit . "497bde38772e6fd2a393dd292435ae3787580db4") (:revdesc . "497bde38772e") (:keywords "tools" "literate programming" "reproducible research" "napkin" "plantuml"))]) + (ob-nim . [(20210601 1807) ((cl-lib (0 5))) "Babel Functions for nim" tar ((:url . "https://github.com/Lompik/ob-nim") (:commit . "315ee36b3ff72437bd65704c456f7ac48205e389") (:revdesc . "315ee36b3ff7") (:keywords "literate programming" "reproducible research"))]) + (ob-nix . [(20221224 334) ((emacs (24 1))) "Simple org-babel support for nix" tar ((:url . "https://codeberg.org/theesm/ob-nix") (:commit . "76d71b37fb031f25bd52ff9c98b29292ebe0424e") (:revdesc . "76d71b37fb03") (:keywords "lisp" "tools") (:authors ("Wilko Meyer" . "w-devel@wmeyer.eu")) (:maintainers ("Wilko Meyer" . "w-devel@wmeyer.eu")) (:maintainer "Wilko Meyer" . "w-devel@wmeyer.eu"))]) + (ob-p5js . [(20230802 1613) ((emacs (25 1))) "Support for p5js in org-babel" tar ((:url . "https://github.com/alejandrogallo/p5js") (:commit . "6a1684a02f5baf6c433bfaf700b8c33b0f6ff12e") (:revdesc . "6a1684a02f5b") (:keywords "javascript" "graphics" "multimedia" "p5js" "processing" "org-babel") (:authors ("Alejandro Gallo" . "aamsgallo@gmail.com")) (:maintainers ("Alejandro Gallo" . "aamsgallo@gmail.com")) (:maintainer "Alejandro Gallo" . "aamsgallo@gmail.com"))]) + (ob-php . [(20220221 1254) ((org (8))) "Execute PHP within org-mode source blocks" tar ((:url . "https://repo.or.cz/ob-php.git") (:commit . "6ebf7799e9ded1d5114094f46785960a50000614") (:revdesc . "6ebf7799e9de") (:keywords "org" "babel" "php") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com"))]) + (ob-pic . [(20250604 2027) ((emacs (24 1))) "Org babel functions for pic language -*- lexical-binding: t;" tar ((:url . "https://github.com/ddoherty03/ob-pic") (:commit . "e60eab82e8fa70ebb288350166baff56ec8f1342") (:revdesc . "e60eab82e8fa") (:keywords "org" "babel" "pic" "tools") (:authors ("Daniel E. Doherty" . "ded-obpic@ddoherty.net")) (:maintainers ("Daniel E. Doherty" . "ded-obpic@ddoherty.net")) (:maintainer "Daniel E. Doherty" . "ded-obpic@ddoherty.net"))]) + (ob-powershell . [(20250220 1241) ((emacs (26 1))) "Org-babel functions for powershell evaluation" tar ((:url . "https://github.com/rkiggen/ob-powershell") (:commit . "1ba2f3bff0fcb8f4c58ddf534d5bf23bf52a87ca") (:revdesc . "1ba2f3bff0fc") (:keywords "powershell" "shell" "execute" "outlines" "processes") (:maintainers ("Mois Moshev" . "mois.moshev@bottleshipvfx.com")) (:maintainer "Mois Moshev" . "mois.moshev@bottleshipvfx.com"))]) + (ob-prolog . [(20190410 2130) nil "Org-babel functions for prolog evaluation" tar ((:url . "https://github.com/ljos/ob-prolog") (:commit . "149abd3832fc5a6a1cb01a586a1622a8f25887dc") (:revdesc . "149abd3832fc") (:keywords "literate programming" "reproducible research"))]) + (ob-raku . [(20221013 1938) ((emacs (24 1))) "Provides raku support for org-babel" tar ((:url . "https://github.com/masukomi/ob-raku") (:commit . "21aa77a0ca70b7bef0ecf7d4d9c5272d71f0210c") (:revdesc . "21aa77a0ca70") (:keywords "literate programming" "reproducible research" "languages"))]) + (ob-redis . [(20220221 1249) ((org (8))) "Execute Redis queries within org-mode blocks" tar ((:url . "https://repo.or.cz/ob-redis.git") (:commit . "44c83636ccbea0b3e9838b0180471905c30224c5") (:revdesc . "44c83636ccbe") (:keywords "org" "babel" "redis") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com"))]) + (ob-restclient . [(20250806 2153) ((restclient (0))) "Org-babel functions for restclient-mode" tar ((:url . "https://github.com/alf/ob-restclient.el") (:commit . "94dd9cd98ff50717135ed5089afb378616faf11a") (:revdesc . "94dd9cd98ff5") (:keywords "literate programming" "reproducible research"))]) + (ob-reticulate . [(20240224 1615) ((org (9 4)) (emacs (24 4))) "Babel Functions for reticulate" tar ((:url . "https://github.com/jackkamm/ob-reticulate") (:commit . "dc08d43df967b15446f3d229fdc6bd600b7ea0df") (:revdesc . "dc08d43df967") (:keywords "literate programming" "reproducible research" "r" "python" "statistics" "languages" "outlines" "processes"))]) + (ob-rust . [(20220824 1923) nil "Org-babel functions for Rust" tar ((:url . "https://github.com/micanzhang/ob-rust") (:commit . "be059d231fafeb24a658db212a55ccdc55c0c500") (:revdesc . "be059d231faf") (:keywords "rust" "languages" "org" "babel"))]) + (ob-sagemath . [(20191106 828) ((sage-shell-mode (0 0 8)) (s (1 8 0)) (emacs (24))) "Org-babel functions for SageMath evaluation" tar ((:url . "https://github.com/stakemori/ob-sagemath") (:commit . "79645bce0c25a650bae61e550434bed836995dce") (:revdesc . "79645bce0c25") (:keywords "sagemath" "org-babel") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainers ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com"))]) + (ob-smiles . [(20220221 1255) ((smiles-mode (0 0 1)) (org (8))) "Org-mode Babel support for SMILES" tar ((:url . "https://repo.or.cz/ob-smiles.git") (:commit . "d178f3d4a7e3c1ca9910f0a063d2a3cfd97d8609") (:revdesc . "d178f3d4a7e3") (:keywords "org" "babel" "smiles") (:authors (nil . "JohnKitchinjkitchin@andrew.cmu.edu")) (:maintainers (nil . "stardivinernumbchild@gmail.com")) (:maintainer nil . "stardivinernumbchild@gmail.com"))]) + (ob-sml . [(20130829 1843) ((sml-mode (6 4))) "Org-babel functions for template evaluation" tar ((:url . "http://orgmode.org") (:commit . "958165c92b6cff6cada5c85c8ae5887806b8451b") (:revdesc . "958165c92b6c") (:keywords "literate programming" "reproducible research"))]) + (ob-solidity . [(20220213 1910) ((emacs (24 4)) (solidity-mode (0 1 10))) "Org-babel functions for solidity evaluation" tar ((:url . "https://github.com/hrkrshnn/ob-solidity") (:commit . "7e3e6cb2d7ec9269514e80248c7ec85c04dbbf89") (:revdesc . "7e3e6cb2d7ec") (:keywords "solidity" "literate programming" "reproducible research" "languages"))]) + (ob-spice . [(20221030 217) ((spice-mode (0 0 1)) (org (8))) "Org-babel functions for spice evaluation" tar ((:url . "https://repo.or.cz/ob-spice.git") (:commit . "4d3ab60c2012aba2a5bd96a4d42dfeea0be6edac") (:revdesc . "4d3ab60c2012") (:maintainers ("stardiviner" . "(numbchild@gmail.com)")) (:maintainer "stardiviner" . "(numbchild@gmail.com)"))]) + (ob-sql-mode . [(20190421 1539) ((emacs (24 4))) "SQL code blocks evaluated by sql-mode" tar ((:url . "http://github.com/nikclayton/ob-sql-mode") (:commit . "b31a016585324ad91f1742ff6205bcb76f3ece6e") (:revdesc . "b31a01658532") (:keywords "languages" "org" "org-babel" "sql") (:authors (nil . "NikClaytonnik@google.com")) (:maintainers (nil . "NikClaytonnik@google.com")) (:maintainer nil . "NikClaytonnik@google.com"))]) + (ob-svgbob . [(20190911 300) ((emacs (24))) "Babel Functions for svgbob" tar ((:url . "https://github.com/mgxm/ob-svgbob") (:commit . "5747f96fb4fdb8711546b3313df9412177eb3c1a") (:revdesc . "5747f96fb4fd") (:keywords "tools" "files") (:authors ("Marcio Giaxa" . "i@mgxm.me")) (:maintainers ("Marcio Giaxa" . "i@mgxm.me")) (:maintainer "Marcio Giaxa" . "i@mgxm.me"))]) + (ob-swift . [(20170921 1325) ((org (8))) "Org-babel functions for swift evaluation" tar ((:url . "http://github.com/zweifisch/ob-swift") (:commit . "ed478ddbbe41ce5373efde06b4dd0c3663c9055f") (:revdesc . "ed478ddbbe41") (:keywords "org" "babel" "swift") (:authors ("Feng Zhou" . "zf.pascal@gmail.com")) (:maintainers ("Feng Zhou" . "zf.pascal@gmail.com")) (:maintainer "Feng Zhou" . "zf.pascal@gmail.com"))]) + (ob-swiftui . [(20251023 1031) ((emacs (25 1)) (swift-mode (8 2 0)) (org (9 2 0))) "Org babel functions for SwiftUI evaluation" tar ((:url . "https://github.com/xenodium/ob-swiftui") (:commit . "82154e06ae335ee6669b3c4d344759a0302efab2") (:revdesc . "82154e06ae33"))]) + (ob-tmux . [(20221005 2025) ((emacs (25 1)) (seq (2 3)) (s (1 9 0))) "Babel Support for Interactive Terminal" tar ((:url . "https://github.com/ahendriksen/ob-tmux") (:commit . "e672ca5a9534b9f33ed7aa5cd21b88189ccc5697") (:revdesc . "e672ca5a9534") (:keywords "literate programming" "interactive shell" "tmux"))]) + (ob-translate . [(20170720 1919) ((google-translate (0 11)) (org (8))) "Translation of text blocks in org-mode" tar ((:url . "https://github.com/krisajenkins/ob-translate") (:commit . "9d9054a51bafd5a29a8135964069b4fa3a80b169") (:revdesc . "9d9054a51baf") (:keywords "org" "babel" "translate" "translation") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com"))]) + (ob-ts-node . [(20250929 1013) ((emacs (25 1)) (org (8 0))) "Org-Babel support for TypeScript via ts-node" tar ((:url . "https://github.com/tmythicator/ob-ts-node") (:commit . "11e25ba2f73b56af66824f67dac167a0d5ae129e") (:revdesc . "11e25ba2f73b") (:keywords "languages" "tools"))]) + (ob-typescript . [(20231227 311) ((emacs (24)) (org (8 0))) "Org-babel functions for typescript evaluation" tar ((:url . "https://github.com/lurdan/ob-typescript") (:commit . "5fe1762f8d8692dd5b6f1697bedbbf4cae9ef036") (:revdesc . "5fe1762f8d86") (:keywords "literate programming" "reproducible research" "typescript"))]) + (ob-uart . [(20170521 858) nil "Org-babel support for UART communication" tar ((:url . "https://www.0x7.ch") (:commit . "90daeac90a9e75c20cdcf71234c67b812110c50e") (:revdesc . "90daeac90a9e") (:keywords "tools" "comm" "org-mode" "uart" "literate programming" "reproducible development"))]) + (oberon . [(20120715 909) nil "Major mode for editing Oberon/Oberon-2 program texts" tar ((:url . "https://github.com/emacsorphanage/oberon") (:commit . "fb57d18ce13835a8a69b6bafecdd9193ca9a59a3") (:revdesc . "fb57d18ce138") (:keywords "oberon" "oberon-2" "languages" "oop") (:authors ("Karl Landström" . "karl@karllandstrom.se")) (:maintainers ("Karl Landström" . "karl@karllandstrom.se")) (:maintainer "Karl Landström" . "karl@karllandstrom.se"))]) + (obfusurl . [(20170809 1524) ((cl-lib (0 5))) "Obfuscate URLs so they aren't spoilers" tar ((:url . "https://github.com/davep/obfusurl.el") (:commit . "7a5a41905000ce2ec1fd72509a5567e5fd9f47e5") (:revdesc . "7a5a41905000") (:keywords "convenience" "web" "text") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (objc-font-lock . [(20250103 1606) nil "Highlight Objective-C method calls" tar ((:url . "https://github.com/Lindydancer/objc-font-lock") (:commit . "c971d72599e5a943e8552f929562346ed15446ce") (:revdesc . "c971d72599e5") (:keywords "languages" "faces"))]) + (objed . [(20200911 1435) ((emacs (25)) (cl-lib (0 5))) "Navigate and edit text objects" tar ((:url . "https://github.com/clemera/objed") (:commit . "e93dda73bd932563d35e76f1c2f1b50895b640cf") (:revdesc . "e93dda73bd93") (:keywords "convenience") (:authors ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainers ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Clemens Radermacher" . "clemera@posteo.net"))]) + (oblivion-theme . [(20240320 1152) ((emacs (24 1))) "A port of GEdit oblivion theme" tar ((:url . "https://codeberg.org/ideasman42/emacs-theme-oblivion") (:commit . "8b7ed6627ee3c838acd2ec9bfd5a6fb02228edfb") (:revdesc . "8b7ed6627ee3") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (obsidian . [(20250220 2245) ((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)) (ht (2 3))) "Obsidian Notes interface" tar ((:url . "https://github.com/licht1stein/obsidian.el") (:commit . "0b31775d5da1dfd3d1ffcf9fa05908a3ba26ed15") (:revdesc . "0b31775d5da1") (:keywords "obsidian" "pkm" "convenience"))]) + (obsidian-theme . [(20170719 948) nil "Port of the eclipse obsidian theme" tar ((:url . "http://github.com/mswift42/obsidian-theme") (:commit . "f45efb2ebe9942466c1db6abbe2d0e6847b785ea") (:revdesc . "f45efb2ebe99"))]) + (ocaml-eglot . [(20251219 1518) ((emacs (29 1))) "An OCaml companion for Eglot" tar ((:url . "https://github.com/tarides/ocaml-eglot") (:commit . "ca06dee696552d72eb968a3cb385a88663ff56dc") (:revdesc . "ca06dee69655") (:keywords "ocaml" "languages") (:authors ("Xavier Van de Woestyne" . "xaviervdw@gmail.com")) (:maintainers ("Xavier Van de Woestyne" . "xaviervdw@gmail.com")) (:maintainer "Xavier Van de Woestyne" . "xaviervdw@gmail.com"))]) + (ocaml-ts-mode . [(20230820 1946) ((emacs (29 1))) "Major mode for OCaml using tree-sitter" tar ((:url . "https://github.com/dmitrig/ocaml-ts-mode") (:commit . "bb8c86bd49e4e98f41e45fb0ec82e38f90bc3ee4") (:revdesc . "bb8c86bd49e4") (:keywords "ocaml" "languages" "tree-sitter"))]) + (ocamlformat . [(20251024 1250) ((emacs (24 3))) "Utility functions to format ocaml code" tar ((:url . "https://github.com/ocaml-ppx/ocamlformat") (:commit . "809492a6044557239ed1e1c2f78eec602f068ea4") (:revdesc . "809492a60445") (:keywords "languages" "ocaml"))]) + (occidental-theme . [(20130312 1958) nil "Custom theme for faces based on Adwaita" tar ((:url . "http://github.com/olcai/occidental-theme") (:commit . "fd2db7256d4f78c43d99c3cddb1c39106d479816") (:revdesc . "fd2db7256d4f") (:authors ("William Stevenson" . "yhvh2000@gmail.com") ("Erik Timan" . "dev@timan.info")) (:maintainers ("William Stevenson" . "yhvh2000@gmail.com") ("Erik Timan" . "dev@timan.info")) (:maintainer "William Stevenson" . "yhvh2000@gmail.com"))]) + (occur-context-resize . [(20250510 1447) nil "Dynamically resize context around matches in occur-mode" tar ((:url . "https://github.com/dgtized/occur-context-resize.el") (:commit . "7a3f039b54274d353ec2f24067666da9edaaa185") (:revdesc . "7a3f039b5427") (:keywords "matching") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainers ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com"))]) + (occur-x . [(20130610 1343) nil "Extra functionality for occur" tar ((:url . "https://github.com/juan-leon/occur-x") (:commit . "352f5fab207d8a1d3dd048073ff127a83e97c82b") (:revdesc . "352f5fab207d") (:keywords "occur" "search" "convenience") (:authors ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainers ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainer "Juan-Leon Lahoz" . "juanleon1@gmail.com"))]) + (occurx-mode . [(20230822 1841) ((emacs (27 1)) (rbit (0 1))) "Occur-like filtering of buffers with rx patterns" tar ((:url . "https://github.com/k32/occurx-mode") (:commit . "71ecab6b1cdf6159a02cef3dd7d2610c45cbaf02") (:revdesc . "71ecab6b1cdf") (:keywords "matching"))]) + (oceanic-theme . [(20161015 819) nil "Oceanic theme" tar ((:url . "https://github.com/terry3/oceanic-theme") (:commit . "00288f6a5245eb001dc123e36af1820eb3cbe985") (:revdesc . "00288f6a5245") (:keywords "oceanic" "color" "theme"))]) + (ocodo-svg-modelines . [(20150516 1419) ((svg-mode-line-themes (0))) "A collection of beautiful SVG modelines" tar ((:url . "https://github.com/ocodo/ocodo-svg-modelines") (:commit . "a6c5b9a7536c7a8fa3bd9d9dafdebc8d99903018") (:revdesc . "a6c5b9a7536c") (:authors ("ocodo" . "what.is.ocodo@gmail.com")) (:maintainers ("ocodo" . "what.is.ocodo@gmail.com")) (:maintainer "ocodo" . "what.is.ocodo@gmail.com"))]) + (ocp-indent . [(20251001 1320) nil "Automatic indentation with ocp-indent" tar ((:url . "http://www.typerex.org/ocp-indent.html") (:commit . "8aeb5cc580106366050de0068c11e20f8a947acc") (:revdesc . "8aeb5cc58010") (:keywords "ocaml" "languages"))]) + (octicons . [(20151101 340) ((cl-lib (0 5))) "Octicons utility" tar ((:url . "https://github.com/syohex/emacs-octicons") (:commit . "229286a6166dba8ddabc8c4d338798c6cd3cf67d") (:revdesc . "229286a6166d") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (octo-mode . [(20161008 1229) ((emacs (24))) "Major mode for Octo assembly language" tar ((:url . "https://github.com/cryon/octo-mode") (:commit . "4b2ed4a61674f73a6ccd390b5ae123474bd0c977") (:revdesc . "4b2ed4a61674") (:keywords "languages") (:authors ("John Olsson" . "john@cryon.se")) (:maintainers ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se"))]) + (octopress . [(20190123 107) nil "A lightweight wrapper for Jekyll and Octopress" tar ((:url . "https://github.com/aaronbieber/octopress.el") (:commit . "f2c92d5420f14fc9167c7de1873836510e652de2") (:revdesc . "f2c92d5420f1") (:keywords "octopress" "blog") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainers ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com"))]) + (oer-reveal . [(20250826 1503) ((emacs (24 4)) (org-re-reveal (3 35 0))) "OER with reveal.js, plugins, and org-re-reveal" tar ((:url . "https://gitlab.com/oer/oer-reveal") (:commit . "20456112467fa6c962b242d1d6d4ddcc66488bd3") (:revdesc . "20456112467f") (:keywords "hypermedia" "tools" "slideshow" "presentation" "oer"))]) + (offlineimap . [(20150916 1158) nil "Run OfflineIMAP from Emacs" tar ((:url . "http://julien.danjou.info/offlineimap-el.html") (:commit . "cc3e067e6237a1eb7b21c575a41683b1febb47f1") (:revdesc . "cc3e067e6237") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainers ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info"))]) + (oj . [(20230212 148) ((emacs (26 1)) (quickrun (2 2))) "Competitive programming tools client for AtCoder, Codeforces" tar ((:url . "https://github.com/conao3/oj.el") (:commit . "6d586cb108c642bc166c64df113e03193f4d1495") (:revdesc . "6d586cb108c6") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (ol-bible . [(20250819 1543) ((emacs (27 1))) "Org Link support for Bible Passages" tar ((:url . "https://git.sr.ht/~swflint/ol-bible") (:commit . "b67ff8c45d51af9fa71aa44bacb4a872f6b750c6") (:revdesc . "b67ff8c45d51") (:keywords "convenience" "outlines") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (ol-notmuch . [(20251101 2058) ((emacs (29 1)) (compat (30 1)) (notmuch (0 38)) (org (9 7))) "Links to notmuch messages" tar ((:url . "https://github.com/tarsius/ol-notmuch") (:commit . "7655f5ea25ea40b7d0453ae6531cae59e5ea592f") (:revdesc . "7655f5ea25ea") (:keywords "hypermedia" "mail") (:authors ("Matthieu Lemerre" . "racin@free.fr")) (:maintainers ("Jonas Bernoulli" . "emacs.ol-notmuch@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.ol-notmuch@jonas.bernoulli.dev"))]) + (ol-tmsu . [(20230207 1457) ((emacs (28 1)) (tmsu (0 9))) "Org-mode links to TMSU queries" tar ((:url . "https://github.com/vifon/tmsu.el") (:commit . "9672d193a51f2848696445528de757aa21b2b686") (:revdesc . "9672d193a51f") (:keywords "files" "outlines" "hypermedia"))]) + (olc . [(20200818 1221) ((emacs (25 1))) "Open location code library" tar ((:url . "https://gitlab.liu.se/davby02/olc") (:commit . "d2dc62dbc3cf6460cc12bd96857a988bc80ac37e") (:revdesc . "d2dc62dbc3cf") (:keywords "extensions" "lisp") (:authors ("David Byers" . "david.byers@liu.se")) (:maintainers ("David Byers" . "david.byers@liu.se")) (:maintainer "David Byers" . "david.byers@liu.se"))]) + (old-norse-input . [(20170816 1842) ((emacs (24))) "An input method for Old Norse" tar ((:url . "https://github.com/david-christiansen/emacs-old-norse-input") (:commit . "c2e21ee72c3768e9152aff6baf12a19cde1d0c53") (:revdesc . "c2e21ee72c37") (:keywords "languages") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk"))]) + (oldlace-theme . [(20150705 1300) ((emacs (24))) "Emacs 24 theme with an 'oldlace' background" tar ((:url . "https://github.com/mswift42/oldlace-theme") (:commit . "9ecbef999b63021c967846a3c80b3fbfc81f1290") (:revdesc . "9ecbef999b63"))]) + (olivetti . [(20241030 542) ((emacs (24 4))) "Minor mode to automatically balance window margins" tar ((:url . "https://github.com/rnkn/olivetti") (:commit . "845eb7a95a3ca3325f1120c654d761b91683f598") (:revdesc . "845eb7a95a3c") (:keywords "wp" "text") (:authors ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainers ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainer "Paul W. Rankin" . "rnkn@rnkn.xyz"))]) + (ollama-buddy . [(20251211 1257) ((emacs (28 1))) "Ollama LLM AI Assistant ChatGPT Claude Gemini Grok Codestral Support" tar ((:url . "https://github.com/captainflasmr/ollama-buddy") (:commit . "3e5e38c2263f2ece0c276d79778fed01448b5446") (:revdesc . "3e5e38c2263f") (:keywords "applications" "tools" "convenience") (:authors ("James Dyer" . "captainflasmr@gmail.com")) (:maintainers ("James Dyer" . "captainflasmr@gmail.com")) (:maintainer "James Dyer" . "captainflasmr@gmail.com"))]) + (om-mode . [(20140915 2110) nil "Insert Om component template with life cycle" tar ((:url . "https://github.com/danielsz/om-mode") (:commit . "5a6b380f8d1293a865d8a37aa4816d7412c512ce") (:revdesc . "5a6b380f8d12") (:keywords "clojurescript") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainers ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com"))]) + (omni-kill . [(20171016 2140) nil "Kill all the things" tar ((:url . "https://github.com/AdrieanKhisbe/omni-kill.el") (:commit . "904549c8fd6ac3cf22b5d7111ca8944e179cffea") (:revdesc . "904549c8fd6a") (:keywords "convenience" "editing" "tools") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr"))]) + (omni-log . [(20200304 2229) ((emacs (24)) (ht (2 0)) (s (1 6 1)) (dash (2 13 0))) "Logging utilities" tar ((:url . "https://github.com/AdrieanKhisbe/omni-log.el") (:commit . "0a240660ccdd0b6588b4e3c322743b5ab1161338") (:revdesc . "0a240660ccdd") (:keywords "convenience" "languages" "tools") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr"))]) + (omni-quotes . [(20200304 2341) ((dash (2 8)) (omni-log (0 4 0)) (f (0 19 0)) (s (1 11 0)) (ht (2 1))) "Random quotes displayer" tar ((:url . "https://github.com/AdrieanKhisbe/omni-quotes.el") (:commit . "cfc7b7f01628a5d57384820d1096de4541e67cdf") (:revdesc . "cfc7b7f01628") (:keywords "convenience") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr"))]) + (omni-scratch . [(20171009 2151) nil "Easy and mode-specific draft buffers" tar ((:url . "https://github.com/AdrieanKhisbe/omni-scratch.el") (:commit . "636374c59c7d33c2f72c97ad8ba9fb4854f2324d") (:revdesc . "636374c59c7d") (:keywords "convenience" "languages" "tools") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr"))]) + (omni-tags . [(20170426 2109) ((pcre2el (1 7)) (cl-lib (0 5))) "Highlight and Actions for 'Tags'" tar ((:url . "http://github.com/AdrieanKhisbe/omni-tags.el") (:commit . "8f0f6c302fab900b7681e5c039f90850cbbabd33") (:revdesc . "8f0f6c302fab") (:keywords "convenience") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainers ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr"))]) + (omnibox . [(20180423 49) ((emacs (26 1)) (dash (2 13)) (frame-local (0 0 1))) "Selection package" tar ((:url . "https://github.com/sebastiencs/omnibox") (:commit . "8ee75c71c20c438ebc43ba24ef6f543633d118f3") (:revdesc . "8ee75c71c20c") (:keywords "completion" "selection" "convenience" "frames") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainers ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is"))]) + (omnisharp . [(20210725 1955) ((emacs (24 4)) (flycheck (30)) (dash (2 12 0)) (auto-complete (1 4)) (popup (0 5 1)) (csharp-mode (0 8 7)) (cl-lib (0 5)) (s (1 10 0)) (f (0 19 0))) "Omnicompletion (intellisense) and more for C#" tar ((:url . "https://github.com/Omnisharp/omnisharp-emacs") (:commit . "c222e970998d796bdfd49e45ed789e2fd1a9da03") (:revdesc . "c222e970998d") (:keywords "languages" "csharp" "c#" "ide" "auto-complete" "intellisense"))]) + (omtose-phellack-themes . [(20240928 1241) ((emacs (24))) "Two dark themes, with cold blusish touch" tar ((:url . "http:/github.com/franksn/omtose-darker/") (:commit . "b96905deb9b2bef097e0c573100874812c1e9aa8") (:revdesc . "b96905deb9b2"))]) + (on . [(20250703 2313) ((emacs (27 1))) "Hooks for faster startup" tar ((:url . "https://gitlab.com/ajgrf/on.el") (:commit . "101619bc008564adeecf2e6d27b16aa7cf68ba0e") (:revdesc . "101619bc0085") (:keywords "convenience") (:authors ("Alex Griffin" . "alex.griffin@axgfn.com")) (:maintainers ("Alex Griffin" . "alex.griffin@axgfn.com")) (:maintainer "Alex Griffin" . "alex.griffin@axgfn.com"))]) + (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 ((:url . "https://github.com/willghatch/emacs-on-parens") (:commit . "b8ee8cea45c9b34820fcb951f522f13e3736d216") (:revdesc . "b8ee8cea45c9") (:keywords "evil" "smartparens"))]) + (one . [(20250824 1102) ((emacs (28 1)) (jack (1 0)) (htmlize (1 57))) "Static Site Generator for org-mode users" tar ((:url . "https://github.com/tonyaldon/one.el") (:commit . "0960d56c5a28820e28ba35fce9b204af0dcb558d") (:revdesc . "0960d56c5a28") (:keywords "hypermedia" "outlines") (:authors ("Tony Aldon" . "tony@tonyaldon.com")) (:maintainers ("Tony Aldon" . "tony@tonyaldon.com")) (:maintainer "Tony Aldon" . "tony@tonyaldon.com"))]) + (one-time-pad-encrypt . [(20160329 1513) nil "One time pad encryption within file" tar ((:url . "https://github.com/garvinguan/emacs-one-time-pad/") (:commit . "87cc1f124024ce3d277299ca0ac703f182937d9f") (:revdesc . "87cc1f124024") (:keywords "convenience") (:authors ("Garvin Guan" . "garvin.guan@gmail.com")) (:maintainers ("Garvin Guan" . "garvin.guan@gmail.com")) (:maintainer "Garvin Guan" . "garvin.guan@gmail.com"))]) + (opam . [(20150719 1220) ((emacs (24 1))) "OPAM tools" tar ((:url . "https://github.com/lunaryorn/opam.el") (:commit . "4d589de5765728f56af7078fae328b6792de8600") (:revdesc . "4d589de57657") (:keywords "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com"))]) + (opam-switch-mode . [(20230802 917) ((emacs (25 1))) "Select OCaml opam switches via a menu" tar ((:url . "https://github.com/ProofGeneral/opam-switch-mode") (:commit . "1069e56a662f23ea09d4e05611bdedeb99257012") (:revdesc . "1069e56a662f") (:maintainers (nil . "proof-general-maintainers@groupes.renater.fr")) (:maintainer nil . "proof-general-maintainers@groupes.renater.fr"))]) + (open-color . [(20231220 1921) ((emacs (25 1))) "Open Color color palette" tar ((:url . "https://github.com/a13/open-color.el") (:commit . "4db381311d4b659922566236697a424f5f3fde6f") (:revdesc . "4db381311d4b") (:keywords "faces") (:authors ("DK" . "a13@users.noreply.github.com")) (:maintainers ("DK" . "a13@users.noreply.github.com")) (:maintainer "DK" . "a13@users.noreply.github.com"))]) + (open-in-msvs . [(20170123 2228) nil "Open current file:line:column in Microsoft Visual Studio" tar ((:url . "https://github.com/evgeny-panasyuk/open-in-msvs") (:commit . "e0d071c83188ad5db8f3297d6ce784b4ed554a04") (:revdesc . "e0d071c83188") (:keywords "convenience" "usability" "integration" "visual studio" "msvs" "ide"))]) + (open-junk-file . [(20161210 1114) nil "Open a junk (memo) file to try-and-error" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/open-junk-file.el") (:commit . "558bec7372b0fed4c4cb6074ab906535fae615bd") (:revdesc . "558bec7372b0") (:keywords "convenience" "tools") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (opencc . [(20170722 816) ((emacs (24 4))) "中文简繁转换 <-> 中文簡繁轉換 (Convert Chinese with OpenCC)" tar ((:url . "https://github.com/xuchunyang/emacs-opencc") (:commit . "959d9ffbae095752182026e3bd9b8fd61178c39f") (:revdesc . "959d9ffbae09") (:keywords "chinese") (:authors (nil . "mail@xuchunyang.me")) (:maintainers (nil . "mail@xuchunyang.me")) (:maintainer nil . "mail@xuchunyang.me"))]) + (opencl-c-mode . [(20250512 1753) nil "Syntax coloring for opencl kernels" tar ((:url . "https://github.com/salmanebah/opencl-mode") (:commit . "0d305f9618ff56eb7e5e35c5bae980bcf957e972") (:revdesc . "0d305f9618ff") (:keywords "c" "opencl"))]) + (opener . [(20161207 1810) ((request (0 2 0)) (emacs (24)) (cl-lib (0 5))) "Opening urls as buffers" tar ((:url . "https://github.com/0robustus1/opener.el") (:commit . "c384f67278046fdcd220275fdd212ab85672cbeb") (:revdesc . "c384f6727804") (:keywords "url" "http" "files") (:authors ("Tim Reddehase" . "tr@rightsrestricted.com")) (:maintainers ("Tim Reddehase" . "tr@rightsrestricted.com")) (:maintainer "Tim Reddehase" . "tr@rightsrestricted.com"))]) + (openfoam . [(20210516 1015) ((emacs (25 1))) "OpenFOAM files and directories" tar ((:url . "https://github.com/ralph-schleicher/emacs-openfoam") (:commit . "e2c899009a9df412bf9f360492b1072eb6f1513f") (:revdesc . "e2c899009a9d") (:keywords "languages") (:authors ("Ralph Schleicher" . "rs@ralph-schleicher.de")) (:maintainers ("Ralph Schleicher" . "rs@ralph-schleicher.de")) (:maintainer "Ralph Schleicher" . "rs@ralph-schleicher.de"))]) + (opensource . [(20160926 1616) ((s (1 11 0)) (dash (2 12 1)) (pkg-info (0 6 0)) (request (0 2 0))) "Client for Opensource API" tar ((:url . "https://github.com/OpenSourceOrg/el-opensourceorg") (:commit . "42742d5f1b9590acff7f05ee0094e3a80f4f7171") (:revdesc . "42742d5f1b95") (:keywords "opensource") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (opensub . [(20250329 717) ((emacs (25 1)) (plz (0))) "Search and download from open-subtitles" tar ((:url . "https://github.com/danielfleischer/opensub") (:commit . "d8b11e979897616a661edd22a759e5cb025af356") (:revdesc . "d8b11e979897") (:keywords "multimedia") (:authors ("Daniel Fleischer" . "danflscr@gmail.com")) (:maintainers ("Daniel Fleischer" . "danflscr@gmail.com")) (:maintainer "Daniel Fleischer" . "danflscr@gmail.com"))]) + (openwith . [(20120531 2136) nil "Open files with external programs" tar ((:url . "https://bitbucket.org/jpkotta/openwith") (:commit . "dd1f0e2a527535086c2b0ae12031dbf3ab7c5fd7") (:revdesc . "dd1f0e2a5275") (:keywords "files" "processes") (:authors ("Markus Triska" . "markus.triska@gmx.at")) (:maintainers ("Markus Triska" . "markus.triska@gmx.at")) (:maintainer "Markus Triska" . "markus.triska@gmx.at"))]) + (operate-on-number . [(20231114 1921) nil "Operate on number at point with arithmetic functions" tar ((:url . "https://github.com/knu/operate-on-number.el") (:commit . "0ddebae1885c1b54eae1d79e66204d6d83c5065b") (:revdesc . "0ddebae1885c") (:keywords "editing") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (orangey-bits-theme . [(20220822 324) ((autothemer (0 2)) (emacs (27 1))) "A Theme with smashing orangey bits" tar ((:url . "http://github.com/emacsfodder/emacs-theme-orangey-bits") (:commit . "533856d399cb4098300bcaf4a2d20920395746f8") (:revdesc . "533856d399cb"))]) + (orca . [(20250205 1726) ((emacs (24 3)) (zoutline (0 1 0))) "Org Capture" tar ((:url . "https://github.com/abo-abo/orca") (:commit . "c6105df2ff6cec9f7d109a4348cc16e62bb0feef") (:revdesc . "c6105df2ff6c") (:keywords "org" "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (ordered-set . [(20250616 1432) ((emacs (25 3)) (seq (2 23))) "Insertion-order sets" tar ((:url . "https://github.com/kisaragi-hiu/ordered-set.el") (:commit . "9688d9e39f365ac86f852c5381f294a757d3bdf4") (:revdesc . "9688d9e39f36") (:keywords "extensions" "sequences" "collection" "set") (:authors ("Kisaragi Hiu" . "mail@kisaragi-hiu.com")) (:maintainers ("Kisaragi Hiu" . "mail@kisaragi-hiu.com")) (:maintainer "Kisaragi Hiu" . "mail@kisaragi-hiu.com"))]) + (orderless . [(20251128 2028) ((emacs (27 1)) (compat (30))) "Completion style for matching regexps in any order" tar ((:url . "https://github.com/oantolin/orderless") (:commit . "26a384894678a1e51e3bf914af3699a61794fb57") (:revdesc . "26a384894678") (:keywords "matching" "completion") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainers ("Omar Antolín Camarena" . "omar@matem.unam.mx") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx"))]) + (ordinal . [(20210519 1442) ((emacs (24 3))) "Convert number to ordinal number notation" tar ((:url . "https://github.com/zonuexe/ordinal.el") (:commit . "a7f378306290b6807fb6b87cee3ef79b31cec711") (:revdesc . "a7f378306290") (:keywords "lisp") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (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 ((:url . "https://github.com/aki2o/org-ac") (:commit . "41e3ef8e4039619d0370c23c66730b3b2e9e32ed") (:revdesc . "41e3ef8e4039") (:keywords "org" "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (org-agenda-dock . [(20250809 703) ((emacs (28 1)) (dock (0 0 1)) (org (9 0))) "Integrate org-mode with Gnome's Dock or KDE's taskbar" tar ((:url . "https://github.com/hron/org-agenda-dock") (:commit . "1a0d37f471b6a8f5e9320b6bc97c5932ff83743b") (:revdesc . "1a0d37f471b6") (:keywords "convenience" "org" "dock" "desktop") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainers ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com"))]) + (org-agenda-files-track . [(20231209 1529) ((emacs (27 1))) "Fine-track `org-agenda-files' to speed-up `org-agenda'" tar ((:url . "https://git.sr.ht/~ngraves/org-agenda-files-track") (:commit . "c0f5f7746ec023a32ba106ec24812eca5cbe15df") (:revdesc . "c0f5f7746ec0") (:keywords "data" "files" "tools") (:authors ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainers ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainer "Nicolas Graves" . "ngraves@ngraves.fr"))]) + (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 ((:url . "https://git.sr.ht/~ngraves/org-agenda-files-track") (:commit . "832cffe62c35f32850afb800e9a3b8a20a05ad7b") (:revdesc . "832cffe62c35") (:keywords "data" "files" "tools") (:authors ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainers ("Nicolas Graves" . "ngraves@ngraves.fr")) (:maintainer "Nicolas Graves" . "ngraves@ngraves.fr"))]) + (org-agenda-property . [(20140626 2116) ((emacs (24 2))) "Display org properties in the agenda buffer" tar ((:url . "http://github.com/Bruce-Connor/org-agenda-property") (:commit . "01afb36072eb27846eb09310dfca7991dbae831e") (:revdesc . "01afb36072eb") (:keywords "calendar") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (org-ai . [(20251203 1121) ((emacs (27 1)) (websocket (1 15))) "Use ChatGPT and other LLMs in org-mode and beyond" tar ((:url . "https://github.com/rksm/org-ai") (:commit . "28a974c3bf55dc5e6b364707fcb2f0e75550d1c1") (:revdesc . "28a974c3bf55") (:authors ("Robert Krahn" . "robert@kra.hn")) (:maintainers ("Robert Krahn" . "robert@kra.hn")) (:maintainer "Robert Krahn" . "robert@kra.hn"))]) + (org-alert . [(20241225 2356) ((org (9 0)) (alert (1 2))) "Notify org deadlines via notify-send" tar ((:url . "https://github.com/spegoraro/org-alert") (:commit . "0bc04cea718387134c37c9fc4c22215adc3f79db") (:revdesc . "0bc04cea7183") (:keywords "org" "org-mode" "notify" "notifications" "calendar") (:authors ("Stephen Pegoraro" . "spegoraro@tutive.com")) (:maintainers ("Stephen Pegoraro" . "spegoraro@tutive.com")) (:maintainer "Stephen Pegoraro" . "spegoraro@tutive.com"))]) + (org-analyzer . [(20191001 1717) nil "Org-analyzer is a tool that extracts time tracking data from org files" tar ((:url . "https://github.com/rksm/clj-org-analyzer") (:commit . "19da62aa4dcf1090be8f574f6f2d4c7e116163a8") (:revdesc . "19da62aa4dcf") (:keywords "calendar") (:authors ("Robert Krahn" . "robert@kra.hn")) (:maintainers ("Robert Krahn" . "robert@kra.hn")) (:maintainer "Robert Krahn" . "robert@kra.hn"))]) + (org-anki . [(20250610 911) ((emacs (27 1)) (request (0 3 2)) (dash (2 17)) (promise (1 1))) "Synchronize org-mode entries to Anki" tar ((:url . "https://github.com/eyeinsky/org-anki") (:commit . "55724018316c76a9db4ce6a886bb2b563b26184e") (:revdesc . "55724018316c") (:keywords "outlines" "flashcards" "memory") (:authors ("Markus Läll" . "markus.l2ll@gmail.com")) (:maintainers ("Markus Läll" . "markus.l2ll@gmail.com")) (:maintainer "Markus Läll" . "markus.l2ll@gmail.com"))]) + (org-appear . [(20240716 1413) ((emacs (29 1)) (org (9 3))) "Auto-toggle Org elements" tar ((:url . "https://github.com/awth13/org-appear") (:commit . "32ee50f8fdfa449bbc235617549c1bccb503cb09") (:revdesc . "32ee50f8fdfa") (:authors ("Alice Istleyeva" . "awth13@gmail.com")) (:maintainers ("Alice Istleyeva" . "awth13@gmail.com")) (:maintainer "Alice Istleyeva" . "awth13@gmail.com"))]) + (org-arbeitszeit . [(20250724 1857) ((emacs (27 1))) "Calculate your worktime" tar ((:url . "https://github.com/bkaestner/org-arbeitszeit") (:commit . "7f8c50e1dea3595bbf3e79f5a5737f7336478a92") (:revdesc . "7f8c50e1dea3") (:keywords "tools" "org" "calendar" "convenience") (:authors ("Benjamin Kästner" . "benjamin.kaestner@gmail.com")) (:maintainers ("Benjamin Kästner" . "benjamin.kaestner@gmail.com")) (:maintainer "Benjamin Kästner" . "benjamin.kaestner@gmail.com"))]) + (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 ((:url . "https://github.com/tyler-dodge/org-assistant") (:commit . "d036f82072e22a7fc985e94853deaf65c41d5967") (:revdesc . "d036f82072e2") (:keywords "convenience") (:authors ("Tyler Dodge" . "(tyler@tdodge.consulting)")) (:maintainers ("Tyler Dodge" . "(tyler@tdodge.consulting)")) (:maintainer "Tyler Dodge" . "(tyler@tdodge.consulting)"))]) + (org-attach-screenshot . [(20210221 1336) ((emacs (24 3))) "Screenshots integrated with org attachment dirs" tar ((:url . "https://github.com/dfeich/org-screenshot") (:commit . "14240909b64605fa966955a14c6045df0f402367") (:revdesc . "14240909b646") (:keywords "org" "multimedia") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainers ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch"))]) + (org-auto-expand . [(20231006 854) ((emacs (26 1)) (org (9 6))) "Automatically expand certain headings" tar ((:url . "https://github.com/alphapapa/org-auto-expand") (:commit . "86e3b24e894ab377ea005b1a574e77daace0451d") (:revdesc . "86e3b24e894a") (:keywords "convenience" "outlines" "org") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-auto-export-pandoc . [(20241026 832) ((ox-pandoc (2 0)) (emacs (24 1))) "Add org auto export with pandoc" tar ((:url . "https://github.com/Y0ngg4n/org-auto-export-pandoc.git") (:commit . "4c63da7ed3c6bae6fd512d2b886ed3c57c850219") (:revdesc . "4c63da7ed3c6") (:keywords "convenience") (:authors ("Yonggan" . "yonggan@obco.pro")) (:maintainers ("Yonggan" . "yonggan@obco.pro")) (:maintainer "Yonggan" . "yonggan@obco.pro"))]) + (org-auto-tangle . [(20220812 2327) ((emacs (24 1)) (async (1 9 3))) "Automatically and Asynchronously tangles org files on save" tar ((:url . "https://github.com/yilkalargaw/org-auto-tangle") (:commit . "2494a6f78c9db5311123abc7cad119851a29a55c") (:revdesc . "2494a6f78c9d") (:keywords "outlines") (:authors ("Yilkal Argaw" . "yilkalargawworkneh@gmail.com")) (:maintainers ("Yilkal Argaw" . "yilkalargawworkneh@gmail.com")) (:maintainer "Yilkal Argaw" . "yilkalargawworkneh@gmail.com"))]) + (org-autoexport . [(20250502 1854) ((emacs (29 1)) (org (9 6))) "Auto-export org file on save" tar ((:url . "https://git.sr.ht/~zondo/org-autoexport") (:commit . "90b8646ad1c8d658fcb142b34a3cdecc1f48b469") (:revdesc . "90b8646ad1c8") (:keywords "org" "wp") (:authors ("Glenn Hutchings" . "zondo42@gmail.com")) (:maintainers ("Glenn Hutchings" . "zondo42@gmail.com")) (:maintainer "Glenn Hutchings" . "zondo42@gmail.com"))]) + (org-autolist . [(20220530 1620) nil "Improved list management in org-mode" tar ((:url . "https://github.com/calvinwyoung/org-autolist") (:commit . "da3a45f95f2e9f7281d533d1e5cec1764ae26a9c") (:revdesc . "da3a45f95f2e") (:keywords "lists" "checklists" "org-mode"))]) + (org-aws-iam-role . [(20251130 2226) ((emacs (29 1)) (async (1 9)) (promise (1 1))) "Browse, modify, and simulate AWS IAM Roles in Org Babel" tar ((:url . "https://github.com/will-abb/org-aws-iam-role") (:commit . "f5dd83600fa1501e27d5b98beb41272cb3aa9021") (:revdesc . "f5dd83600fa1") (:keywords "aws" "iam" "org" "babel" "tools") (:authors ("William Bosch-Bello" . "williamsbosch@gmail.com")) (:maintainers ("William Bosch-Bello" . "williamsbosch@gmail.com")) (:maintainer "William Bosch-Bello" . "williamsbosch@gmail.com"))]) + (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 ((:url . "https://github.com/diadochos/org-babel-eval-in-repl") (:commit . "3591f062873de2d64cc6f83b3555d030506e6ee7") (:revdesc . "3591f062873d") (:keywords "literate programming" "reproducible research" "async execution") (:authors ("Takeshi Teshima" . "diadochos.developer@gmail.com")) (:maintainers ("Takeshi Teshima" . "diadochos.developer@gmail.com")) (:maintainer "Takeshi Teshima" . "diadochos.developer@gmail.com"))]) + (org-beautify-theme . [(20250730 2044) ((emacs (24 1))) "A sub-theme to make org-mode more beautiful" tar ((:url . "https://github.com/jonnay/org-beautify-theme") (:commit . "5301f8cfab127f4219aad83e52787898f0710d4f") (:revdesc . "5301f8cfab12") (:keywords "faces" "org" "theme") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainers ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net"))]) + (org-board . [(20230408 1041) nil "Bookmarking and web archival system for Org mode" tar ((:url . "https://github.com/scallywag/org-board") (:commit . "500fe02bc114e5b535a2eb2ab73954d79428168f") (:revdesc . "500fe02bc114") (:keywords "org" "bookmarks" "archives") (:authors ("Charles A. Roelli" . "charles@aurox.ch")) (:maintainers ("Charles A. Roelli" . "charles@aurox.ch")) (:maintainer "Charles A. Roelli" . "charles@aurox.ch"))]) + (org-bookmark-heading . [(20240906 521) ((emacs (25 1)) (compat (29 1 4 5))) "Emacs bookmark support for Org mode" tar ((:url . "http://github.com/alphapapa/org-bookmark-heading") (:commit . "bcab006ec42d7e2c92875c7170df193de2ee55f5") (:revdesc . "bcab006ec42d") (:keywords "hypermedia" "outlines") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-bookmarks . [(20251113 351) ((emacs (29 1)) (nerd-icons (0 1 0)) (seq (2 24))) "Manage bookmarks in Org mode" tar ((:url . "https://repo.or.cz/org-bookmarks.git") (:commit . "b3a46dc78175f7398502050420e5ea7d237a736f") (:revdesc . "b3a46dc78175") (:keywords "outline" "matching" "hypermedia" "org"))]) + (org-bookmarks-extractor . [(20220829 146) ((emacs (25 1))) "Extract bookmarks from Org mode" tar ((:url . "https://github.com/jxq0/org-bookmarks-extractor") (:commit . "26d810d4d58de1f64f0bbd649e13816f96663d73") (:revdesc . "26d810d4d58d") (:keywords "convenience" "org") (:authors ("Xuqing Jia" . "jxq@jxq.me")) (:maintainers ("Xuqing Jia" . "jxq@jxq.me")) (:maintainer "Xuqing Jia" . "jxq@jxq.me"))]) + (org-books . [(20251022 1020) ((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 ((:url . "https://github.com/lepisma/org-books") (:commit . "3f769e5a5a85a5eb6a2249ba971a3d77dc6e7d94") (:revdesc . "3f769e5a5a85") (:keywords "outlines") (:authors ("Abhinav Tushar" . "abhinav@lepisma.xyz")) (:maintainers ("Abhinav Tushar" . "abhinav@lepisma.xyz")) (:maintainer "Abhinav Tushar" . "abhinav@lepisma.xyz"))]) + (org-brain . [(20230217 1908) ((emacs (25 1)) (org (9 2))) "Org-mode concept mapping" tar ((:url . "http://github.com/Kungsgeten/org-brain") (:commit . "2bad7732aae1a3051e2a14de2e30f970bbe43c25") (:revdesc . "2bad7732aae1") (:keywords "outlines" "hypermedia") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainers ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com"))]) + (org-bulletproof . [(20230615 640) ((emacs (27 1))) "Automatic plain list bullet cycling" tar ((:url . "https://github.com/pondersson/org-bulletproof") (:commit . "8ae80a53f8034914f502a8655f420c55078e02e1") (:revdesc . "8ae80a53f803") (:keywords "outlines" "convenience") (:authors ("Pontus Andersson" . "pondersson@gmail.com")) (:maintainers ("Pontus Andersson" . "pondersson@gmail.com")) (:maintainer "Pontus Andersson" . "pondersson@gmail.com"))]) + (org-bullets . [(20200317 1740) nil "Show bullets in org-mode as UTF-8 characters" tar ((:url . "https://github.com/integral-dw/org-bullets") (:commit . "9ec0dbd30be7c6310804141ee952ac8c5f753557") (:revdesc . "9ec0dbd30be7") (:maintainers ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net"))]) + (org-caldav . [(20250212 334) ((emacs (26 3)) (org (9 1))) "Sync org files with external calendar through CalDAV" tar ((:url . "https://github.com/dengste/org-caldav/") (:commit . "44a6d463cee3c3be8acf7511db785ab55519b375") (:revdesc . "44a6d463cee3") (:keywords "calendar" "caldav") (:authors ("David Engster" . "deng@randomsample.de")) (:maintainers ("David Engster" . "deng@randomsample.de")) (:maintainer "David Engster" . "deng@randomsample.de"))]) + (org-calibre-notes . [(20221202 1657) ((emacs (27 1))) "Extract highlights and notes from Calibre EPUB reader" tar ((:url . "https://github.com/bpanthi977/org-calibre-notes") (:commit . "3120797ecbcb58827b91e3610e65579593d9a402") (:revdesc . "3120797ecbcb") (:authors ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainers ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainer "Bibek Panthi" . "bpanthi977@gmail.com"))]) + (org-capture-pop-frame . [(20230516 236) ((emacs (24 4))) "Run org-capture in a new pop frame" tar ((:url . "https://github.com/tumashu/org-capture-pop-frame.git") (:commit . "d88b75cc02fc53716701051dbdd906db0515de8c") (:revdesc . "d88b75cc02fc") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (org-category-capture . [(20230830 1733) ((org (9 0 0)) (emacs (24))) "Contextualy capture of org-mode TODOs" tar ((:url . "https://github.com/IvanMalison/org-project-capture") (:commit . "bf1c30b750020ab8dd634dd66b2c7b76c56286c5") (:revdesc . "bf1c30b75002") (:keywords "org-mode" "todo" "tools" "outlines") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (org-change . [(20240318 2003) ((emacs (29 1)) (org (9 3))) "Annotate changes in org-mode files" tar ((:url . "https://github.com/drghirlanda/org-change") (:commit . "e944bb4a0943cdd06abd9032e6e6cbd34424ea42") (:revdesc . "e944bb4a0943") (:keywords "wp" "convenience"))]) + (org-chef . [(20250714 107) ((org (0)) (emacs (24 3))) "Cookbook and recipe management with org-mode" tar ((:url . "https://github.com/Chobbes/org-chef") (:commit . "9f749324f7e8c51a2da8516820268c83e825c6c7") (:revdesc . "9f749324f7e8") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainers ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca"))]) + (org-cite-overlay . [(20251130 300) ((emacs (28 1)) (citeproc (0 9 4))) "Overlays for org-cite citations" tar ((:url . "https://git.sr.ht/~swflint/org-cite-overlay") (:commit . "452f467f044866b169314d6b691e22f95c94e2b5") (:revdesc . "452f467f0448") (:keywords "bib" "tex") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (org-cite-overlay-sidecar . [(20251130 300) ((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 ((:url . "https://git.sr.ht/~swflint/org-cite-overlay") (:commit . "452f467f044866b169314d6b691e22f95c94e2b5") (:revdesc . "452f467f0448") (:keywords "bib") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (org-cliplink . [(20201126 1020) ((emacs (24 4))) "Insert org-mode links from the clipboard" tar ((:url . "http://github.com/rexim/org-cliplink") (:commit . "13e0940b65d22bec34e2de4bc8cba1412a7abfbc") (:revdesc . "13e0940b65d2") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com"))]) + (org-clock-agenda-daytime-mode . [(20240403 1115) ((org (9 6 18)) (emacs (26 1))) "Display the time clocked today in the modeline" tar ((:url . "https://www.draketo.de/software/emacs-daytime") (:commit . "f10c7b92a5b2a25f2300b885c2c70526ada50d9c") (:revdesc . "f10c7b92a5b2") (:keywords "org" "lisp" "clock" "time" "agenda") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainers ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de"))]) + (org-clock-convenience . [(20230424 2101) ((org (8)) (emacs (24 3))) "Convenience functions for org time tracking" tar ((:url . "https://github.com/dfeich/org-clock-convenience") (:commit . "08417dfd51deb400b890cf71c87b57393fc5ac8c") (:revdesc . "08417dfd51de") (:keywords "convenience") (:authors ("Derek Feichtinger" . "dfeich.gmail.com")) (:maintainers ("Derek Feichtinger" . "dfeich.gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich.gmail.com"))]) + (org-clock-csv . [(20201222 1506) ((org (8 3)) (s (1 0))) "Export `org-mode' clock entries to CSV format" tar ((:url . "https://github.com/atheriel/org-clock-csv") (:commit . "af94b58c2e179a5bcc938f339e93de0eee3da99c") (:revdesc . "af94b58c2e17") (:keywords "calendar" "data" "org") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainers ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com"))]) + (org-clock-reminder . [(20230222 1956) ((emacs (26 1))) "Notifications that remind you about clocked-in tasks" tar ((:url . "https://github.com/inickey/org-clock-reminder") (:commit . "d3bf97113fd519aa08198e2283ba9c236a6df168") (:revdesc . "d3bf97113fd5") (:keywords "calendar" "convenience") (:authors ("Nikolay Brovko" . "i@nickey.ru")) (:maintainers ("Nikolay Brovko" . "i@nickey.ru")) (:maintainer "Nikolay Brovko" . "i@nickey.ru"))]) + (org-clock-split . [(20200331 526) ((emacs (24))) "Split clock entries" tar ((:url . "https://github.com/justintaft/emacs-org-clock-split") (:commit . "39e1d2912a7a7223e2356a5fc4dff03507ae084d") (:revdesc . "39e1d2912a7a") (:keywords "calendar") (:authors ("Justin Taft" . "https://github.com/justintaft")) (:maintainers ("Justin Taft" . "https://github.com/justintaft")) (:maintainer "Justin Taft" . "https://github.com/justintaft"))]) + (org-clock-today . [(20220918 514) ((emacs (25))) "Show total clocked time of the current day in the mode line" tar ((:url . "https://github.com/mallt/org-clock-today-mode") (:commit . "b73cca120eb64538ab0666892a8b97b6d65b4d6b") (:revdesc . "b73cca120eb6") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainers ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) + (org-commentary . [(20160802 637) ((dash (2 0)) (emacs (24 4)) (org (8 0))) "Generate or update conventional library headers using Org mode files" tar ((:url . "https://github.com/smaximov/org-commentary") (:commit . "821ccb994811359c42f4e3d459e0e88849d42b75") (:revdesc . "821ccb994811") (:keywords "convenience" "docs" "tools") (:authors ("Sergei Maximov" . "s.b.maximov@gmail.com")) (:maintainers ("Sergei Maximov" . "s.b.maximov@gmail.com")) (:maintainer "Sergei Maximov" . "s.b.maximov@gmail.com"))]) + (org-contacts . [(20250905 335) ((emacs (29 1)) (org (9 7))) "Contacts management system for Org mode" tar ((:url . "https://repo.or.cz/org-contacts.git") (:commit . "41f10b9ab07f267613d77e98ef7a33b1772292b0") (:revdesc . "41f10b9ab07f") (:keywords "contacts" "org-mode" "outlines" "hypermedia" "calendar") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com"))]) + (org-context . [(20220606 1339) nil "Contextual capture and agenda commands for Org-mode" tar ((:url . "https://github.com/thisirs/org-context") (:commit . "47bd45149cb74dab2ebecccfb918f6f8502a4f2c") (:revdesc . "47bd45149cb7") (:keywords "org" "capture" "agenda" "convenience") (:authors ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainers ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainer "Sylvain Rousseau" . "thisirsatgmaildotcom"))]) + (org-cua-dwim . [(20120203 534) nil "Org-mode and Cua mode compatibility layer" tar ((:url . "https://github.com/mattfidler/org-cua-dwim.el") (:commit . "a55d6c7009fc0b22f1110c07de629acc955c85e4") (:revdesc . "a55d6c7009fc") (:keywords "org-mode" "cua-mode"))]) + (org-custom-cookies . [(20240414 44) ((emacs (25 1)) (org (9 4))) "Custom cookies for org-mode" tar ((:url . "https://github.com/gsingh93/org-custom-cookies") (:commit . "5650c73d20e53310dab62f6a65754a55aea9b40b") (:revdesc . "5650c73d20e5") (:authors ("Gulshan Singh" . "gsingh2011@gmail.com")) (:maintainers ("Gulshan Singh" . "gsingh2011@gmail.com")) (:maintainer "Gulshan Singh" . "gsingh2011@gmail.com"))]) + (org-d20 . [(20240726 255) ((s (1 11 0)) (seq (2 19)) (dash (2 12 0)) (emacs (24))) "Minor mode for d20 tabletop roleplaying games" tar ((:url . "https://spwhitton.name/tech/code/org-d20/") (:commit . "ad399cde0ee21adc67ed0c95ae20900fa936f008") (:revdesc . "ad399cde0ee2") (:keywords "outlines" "games") (:authors ("Sean Whitton" . "spwhitton@spwhitton.name")) (:maintainers ("Sean Whitton" . "spwhitton@spwhitton.name")) (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name"))]) + (org-daily-reflection . [(20251208 558) ((emacs (26 1)) (org (9 4)) (compat (30 0 0 0))) "Concurrent display of org(-roam) dailies" tar ((:url . "https://github.com/emacsomancer/org-daily-reflection") (:commit . "d72170fd1cf9b605a13a80b9aa2d5301d6232033") (:revdesc . "d72170fd1cf9") (:keywords "convenience" "frames" "terminals" "tools" "window-system") (:authors ("Benjamin Slade" . "slade@lambda-y.net")) (:maintainers ("Benjamin Slade" . "slade@lambda-y.net")) (:maintainer "Benjamin Slade" . "slade@lambda-y.net"))]) + (org-dashboard . [(20171223 1924) ((cl-lib (0 5))) "Visually summarize progress in org files" tar ((:url . "http://github.com/bard/org-dashboard") (:commit . "02c0699771d199075a286e4502340ca6e7c9e831") (:revdesc . "02c0699771d1") (:keywords "outlines" "calendar") (:authors ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainers ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainer "Massimiliano Mirra" . "hyperstruct@gmail.com"))]) + (org-doing . [(20161017 1620) nil "Keep track of what you're doing" tar ((:url . "https://github.com/omouse/org-doing") (:commit . "4819e75c827c2115bd28f3b3148d846aa64ccd9b") (:revdesc . "4819e75c827c") (:keywords "tools" "org"))]) + (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 ((:url . "https://github.com/vapniks/org-dotemacs") (:commit . "598759f4a139f94da62836e8f8064da6377536b2") (:revdesc . "598759f4a139") (:keywords "local") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (org-download . [(20241118 1846) ((emacs (24 3)) (async (1 2))) "Image drag-and-drop for Org-mode" tar ((:url . "https://github.com/abo-abo/org-download") (:commit . "c8be2611786d1d8d666b7b4f73582de1093f25ac") (:revdesc . "c8be2611786d") (:keywords "multimedia" "images" "screenshots" "download"))]) + (org-dp . [(20180311 923) ((cl-lib (0 5))) "Declarative Local Programming with Org Elements" tar ((:url . "https://github.com/tj64/org-dp") (:commit . "334fefd06eb925c86b1642787b2a088aa0932bab") (:revdesc . "334fefd06eb9") (:authors ("Thorsten Jolitz" . "tjolitzATgmailDOTcom")) (:maintainers ("Thorsten Jolitz" . "tjolitzATgmailDOTcom")) (:maintainer "Thorsten Jolitz" . "tjolitzATgmailDOTcom"))]) + (org-drawio . [(20240213 38) ((org (9 6 6)) (emacs (28 1))) "Convert and include drawio image to orgmode" tar ((:url . "https://github.com/kimim/org-drawio") (:commit . "6b25d0ecf7de364da96c96da30a995df8a4cb835") (:revdesc . "6b25d0ecf7de") (:keywords "multimedia" "convenience") (:authors ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainers ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainer "Kimi Ma" . "kimi.im@outlook.com"))]) + (org-drill . [(20210427 2003) ((emacs (25 3)) (seq (2 14)) (org (9 3)) (persist (0 3))) "Self-testing using spaced repetition" tar ((:url . "https://gitlab.com/phillord/org-drill/issues") (:commit . "e55415221eedba2f2bd37a30cb71c842e344b5ee") (:revdesc . "e55415221eed") (:keywords "games" "outlines" "multimedia") (:authors ("Paul Sexton" . "eeeickythump@gmail.com")) (:maintainers ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))]) + (org-dropbox . [(20150114 509) ((dash (2 2)) (names (20150000)) (emacs (24))) "Move Dropbox notes from phone into org-mode datetree" tar ((:url . "https://github.com/heikkil/org-dropbox") (:commit . "2dc677a770c9e82f928ad8e97a7707eb368e58ed") (:revdesc . "2dc677a770c9") (:keywords "dropbox" "android" "notes" "org-mode") (:authors ("Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com")) (:maintainers ("Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com")) (:maintainer "Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com"))]) + (org-easy-img-insert . [(20160915 2008) ((emacs (24 4))) "An easier way to add images from the web in org mode" tar ((:url . "https://github.com/tashrifsanil/org-easy-img-insert") (:commit . "3efb4d70e5a39bfbf7ee4c4033cc61afa89430dd") (:revdesc . "3efb4d70e5a3") (:keywords "convenience" "hypermedia" "files") (:authors ("Tashrif Sanil" . "tashrifsanil@kloke-source.com")) (:maintainers ("Tashrif Sanil" . "tashrifsanil@kloke-source.com")) (:maintainer "Tashrif Sanil" . "tashrifsanil@kloke-source.com"))]) + (org-edit-indirect . [(20220909 457) ((emacs (27)) (edit-indirect (0 1 10)) (org (9 0))) "Edit anything, not just source blocks" tar ((:url . "https://github.com/agzam/org-edit-indirect.el") (:commit . "62894ac7b8b85eb03766f66072b0be10ffb6898e") (:revdesc . "62894ac7b8b8") (:keywords "convenience" "extensions" "outlines") (:authors ("Ag Ibragimomv" . "https://github.com/agzam")) (:maintainers ("Ag Ibragimomv" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimomv" . "agzam.ibragimov@gmail.com"))]) + (org-edit-latex . [(20170908 1522) ((emacs (24 4)) (auctex (11 90))) "Edit embedded LaTeX in a dedicated buffer" tar ((:url . "https://github.com/et2010/org-edit-latex") (:commit . "ecd91601cb6f3aa79d055bde99bfec6d2b335952") (:revdesc . "ecd91601cb6f") (:keywords "org" "latex") (:authors ("James Wong" . "jianwang.academic@gmail.com")) (:maintainers ("James Wong" . "jianwang.academic@gmail.com")) (:maintainer "James Wong" . "jianwang.academic@gmail.com"))]) + (org-ehtml . [(20220216 2054) ((web-server (20140109 2200)) (emacs (24 3))) "Export Org-mode files as editable web pages" tar ((:url . "https://github.com/eschulte/org-ehtml") (:commit . "419932d6dbce193b0d90b1ccf9bf643169d21f52") (:revdesc . "419932d6dbce") (:keywords "org" "web-server" "javascript" "html") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainers ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com"))]) + (org-elisp-help . [(20161122 55) ((cl-lib (0 5)) (org (9 0))) "Org links to emacs-lisp documentation" tar ((:url . "https://github.com/tarsius/org-elisp-help") (:commit . "3e33ab1a2933dd7f2782ef91d667a37f12d633ab") (:revdesc . "3e33ab1a2933") (:keywords "org" "remember" "lisp") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li"))]) + (org-elp . [(20210329 1535) ((emacs (27 1))) "Preview latex equations in org mode while editing" tar ((:url . "https://github.com/guanyilun/org-elp") (:commit . "36b5ab2ed3fa3b5917f058e3acf8dff2df69efae") (:revdesc . "36b5ab2ed3fa") (:keywords "lisp" "tex" "org"))]) + (org-emms . [(20230626 1102) ((emacs (24 1)) (org (9 3)) (emms (0 0))) "Playback multimedia files from Org documents" tar ((:url . "https://git.sr.ht/~jagrg/org-emms") (:commit . "13c8f245885a7f4f87bf88c5ad5612af03be1e77") (:revdesc . "13c8f245885a") (:keywords "multimedia") (:authors ("Jonathan Gregory" . "jgrgatautisticidotorg")) (:maintainers ("Jonathan Gregory" . "jgrgatautisticidotorg")) (:maintainer "Jonathan Gregory" . "jgrgatautisticidotorg"))]) + (org-epa-gpg . [(20241206 2357) ((emacs (27 1))) "Patch to enable EasyPG .gpg images in Org mode inline" tar ((:url . "https://github.com/KeyWeeUsr/org-epa-gpg") (:commit . "6f3b8b77bdf63e96465322bbb545b96c9641d521") (:revdesc . "6f3b8b77bdf6") (:keywords "lisp" "org" "gpg" "pgp" "epa" "encryption" "image" "inline" "patch") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (org-evil . [(20210809 1724) ((dash (2 19 0)) (evil (0)) (org (9 4 4))) "Evil extensions for Org" tar ((:url . "https://github.com/guiltydolphin/org-evil") (:commit . "981b0931d043d3b0eb61fcab6258b5a88cc74d15") (:revdesc . "981b0931d043") (:keywords "convenience" "evil" "org") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainers ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com"))]) + (org-expose-emphasis-markers . [(20250726 28) ((emacs (29 1))) "Automatically show hidden org emphasis markers" tar ((:url . "https://github.com/lorniu/org-expose-emphasis-markers") (:commit . "5ca3994f2e13b342e0b9d353b66b892e34c7b784") (:revdesc . "5ca3994f2e13") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com"))]) + (org-fancy-priorities . [(20210830 1657) nil "Display org priorities as custom strings" tar ((:url . "https://github.com/harrybournis/org-fancy-priorities") (:commit . "7f677c6c14ecf05eab8e0efbfe7f1b00ae68eb1d") (:revdesc . "7f677c6c14ec") (:keywords "convenience" "faces" "outlines") (:authors ("Harry Bournis" . "harrybournis@gmail.com")) (:maintainers ("Harry Bournis" . "harrybournis@gmail.com")) (:maintainer "Harry Bournis" . "harrybournis@gmail.com"))]) + (org-fragtog . [(20220714 2146) ((emacs (27 1))) "Auto-toggle Org LaTeX fragments" tar ((:url . "https://github.com/io12/org-fragtog") (:commit . "c675563af3f9ab5558cfd5ea460e2a07477b0cfd") (:revdesc . "c675563af3f9") (:authors ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainers ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainer "Benjamin Levy" . "blevy@protonmail.com"))]) + (org-gamedb . [(20210525 2338) ((emacs (25 1))) "Track video games in org-mode with giantbomb.com's API" tar ((:url . "https://github.com/repelliuss/org-gamedb") (:commit . "f283b6f6a7e8ad090405be57202caa3d3c424447") (:revdesc . "f283b6f6a7e8") (:keywords "outlines" "org" "games" "convenience" "api") (:authors ("repelliuss" . "https://github.com/repelliuss")) (:maintainers ("repelliuss" . "repelliuss@gmail.com")) (:maintainer "repelliuss" . "repelliuss@gmail.com"))]) + (org-gcal . [(20250624 1628) ((aio (1 0)) (alert (1 2)) (elnode (20190702 1509)) (emacs (26 1)) (oauth2-auto (20240326 2225)) (org (9 3)) (persist (0 4)) (request (20190901)) (request-deferred (20181129))) "Org sync with Google Calendar" tar ((:url . "https://github.com/kidd/org-gcal.el") (:commit . "c7ad854ee44e88a55db74269d53819c931d55b8e") (:revdesc . "c7ad854ee44e") (:keywords "convenience") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")) (:maintainers ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com"))]) + (org-generate . [(20240713 159) ((emacs (26 1)) (org (9 3)) (mustache (0 23))) "Generate template files/folders from org document" tar ((:url . "https://github.com/conao3/org-generate.el") (:commit . "39dbf8b5c3d225438f7d65e0dc7e9766d61d4c81") (:revdesc . "39dbf8b5c3d2") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (org-gnome . [(20150614 1457) ((alert (1 2)) (telepathy (0 1)) (gnome-calendar (0 1))) "Orgmode integration with the GNOME desktop" tar ((:url . "https://github.com/NicolasPetton/org-gnome.el") (:commit . "1012d47886cfd30eed25b73d9f18e475e0155f88") (:revdesc . "1012d47886cf") (:keywords "org" "gnome") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))]) + (org-grep . [(20230821 2356) ((emacs (26 1))) "Kind of M-x rgrep adapted for Org mode" tar ((:url . "https://sr.ht/~minshall/org-grep/") (:commit . "64d23c2ca11ca68db85fc2c500377c9151e8e40b") (:revdesc . "64d23c2ca11c") (:authors ("François Pinard" . "pinard@iro.umontreal.ca")) (:maintainers ("Greg Minshall" . "minshall@umich.edu")) (:maintainer "Greg Minshall" . "minshall@umich.edu"))]) + (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 ((:url . "https://github.com/Trevoke/org-gtd.el") (:commit . "f82eb971db0008b773a57c207120751f913bde6b") (:revdesc . "f82eb971db00") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainers ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com"))]) + (org-habit-stats . [(20240208 323) ((emacs (25 1))) "Display info about habits" tar ((:url . "https://github.com/ml729/org-habit-stats/") (:commit . "d500f3a1b269b26097dd2f4cd414c3cb7c68ca23") (:revdesc . "d500f3a1b269") (:keywords "calendar" "org-mode" "org-habit" "habits" "stats" "statistics" "charts" "graphs"))]) + (org-hide-drawers . [(20250924 732) ((emacs (26 1))) "Hide drawers in Org using overlays" tar ((:url . "https://github.com/krisbalintona/org-hide-drawers.git") (:commit . "15c8fa7fe5b15e09a751699ce780dde7edf7b5bd") (:revdesc . "15c8fa7fe5b1") (:keywords "tools" "extensions") (:authors ("Kristoffer Balintona" . "krisbalintona@gmail.com")) (:maintainers ("Kristoffer Balintona" . "krisbalintona@gmail.com")) (:maintainer "Kristoffer Balintona" . "krisbalintona@gmail.com"))]) + (org-hyperscheduler . [(20250716 1801) ((emacs (27 1)) (websocket (1 13)) (log4e (0 3 3))) "UI (web) representation of org-agenda" tar ((:url . "https://github.com/dmitrym0/org-hyperscheduler") (:commit . "f40e3df279452dc0cb8506de3bfb6acbf2df79c1") (:revdesc . "f40e3df27945") (:keywords "org-mode" "calendar") (:authors ("Dmitry Markushevich" . "dmitrym@gmail.com")) (:maintainers ("Dmitry Markushevich" . "dmitrym@gmail.com")) (:maintainer "Dmitry Markushevich" . "dmitrym@gmail.com"))]) + (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 ((:url . "https://github.com/marcIhm/org-id-cleanup") (:commit . "45b598c7971d149ce4eae5f790469d89f691c8e6") (:revdesc . "45b598c7971d") (:authors ("Marc Ihm" . "marc@ihm.name")) (:maintainers ("Marc Ihm" . "marc@ihm.name")) (:maintainer "Marc Ihm" . "marc@ihm.name"))]) + (org-if . [(20150920 1513) nil "Interactive Fiction Authoring System for Org-Mode" tar ((:url . "https://gitlab.com/elzair/org-if") (:commit . "fab602cc1bbee7a4e99c0083e129219d3f9ed2e8") (:revdesc . "fab602cc1bbe") (:keywords "if" "org-if" "org org-mode") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainers ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com"))]) + (org-incoming . [(20250522 752) ((emacs (24 4)) (dash (2 19 1)) (datetime (0 7 2)) (s (1 13 1))) "Sort incoming PDFs into your org files" tar ((:url . "https://github.com/tinloaf/org-incoming") (:commit . "e702e208326a583e44e4e0c6bf7d9ce397a97453") (:revdesc . "e702e208326a") (:keywords "files") (:authors ("Lukas Barth" . "mail@tinloaf.de")) (:maintainers ("Lukas Barth" . "mail@tinloaf.de")) (:maintainer "Lukas Barth" . "mail@tinloaf.de"))]) + (org-index . [(20250914 850) ((org (9 3)) (dash (2 12)) (s (1 12)) (emacs (26 3))) "Ranked and incremental search among selected org-headlines" tar ((:url . "https://github.com/marcIhm/org-index") (:commit . "77bdcefab4cfc673844e21eaea7b446e40498ef6") (:revdesc . "77bdcefab4cf") (:authors ("Marc Ihm" . "marc@ihm.name")) (:maintainers ("Marc Ihm" . "marc@ihm.name")) (:maintainer "Marc Ihm" . "marc@ihm.name"))]) + (org-inline-anim . [(20230610 1504) ((emacs (25 3)) (org (9 4))) "Inline playback of animated GIF/PNG for Org" tar ((:url . "https://github.com/shg/org-inline-anim.el") (:commit . "488fed644748b578dffe7e3847970ec25dcfd24d") (:revdesc . "488fed644748") (:keywords "org" "outlines" "hypermedia" "multimedia"))]) + (org-inline-pdf . [(20230826 1220) ((emacs (25 1)) (org (9 4))) "Inline PDF previewing for Org" tar ((:url . "https://github.com/shg/org-inline-pdf.el") (:commit . "2460c429e0977587863f41176aafe1ca858c13e8") (:revdesc . "2460c429e097") (:keywords "org" "outlines" "hypermedia"))]) + (org-inline-pdfcomment . [(20241014 237) ((emacs (24 4))) "Export Support for Inline Tasks as PDF Comments" tar ((:url . "https://git.sr.ht/~swflint/org-inline-pdfcomment") (:commit . "a0af513b24deffcee14c27641477fef65b228696") (:revdesc . "a0af513b24de") (:keywords "docs" "text") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (org-invoice-table . [(20250409 402) ((emacs (26 1))) "Invoicing table formatter for org-mode" tar ((:url . "https://codeberg.org/trevdev/org-invoice-table") (:commit . "3fe481f54050bb98493a0e3a1eb2a0693cda36d6") (:revdesc . "3fe481f54050") (:authors ("Trevor Richards" . "trev@trevdev.ca")) (:maintainers ("Trevor Richards" . "trev@trevdev.ca")) (:maintainer "Trevor Richards" . "trev@trevdev.ca"))]) + (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 ((:url . "https://github.com/kuangdash/org-iv") (:commit . "7f2bb1b32647655fd9d6684f6f09dcc66b61b0cd") (:revdesc . "7f2bb1b32647") (:authors ("kuangdash" . "kuangdash@163.com")) (:maintainers ("kuangdash" . "kuangdash@163.com")) (:maintainer "kuangdash" . "kuangdash@163.com"))]) + (org-ivy-search . [(20250305 159) ((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 ((:url . "https://github.com/beacoder/org-ivy-search") (:commit . "d09472c5ae5c099bee17fb0e4f3f017ce7ebd031") (:revdesc . "d09472c5ae5c") (:keywords "convenience" "tool" "org") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com"))]) + (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 ((:url . "https://gitlab.com/hperrey/org-jami-bot") (:commit . "020b03f299dad438f65d7bcbf93553b273fd7c33") (:revdesc . "020b03f299da") (:keywords "comm" "outlines" "org-capture" "jami") (:authors ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainers ("Hanno Perrey" . "hanno@hoowl.se")) (:maintainer "Hanno Perrey" . "hanno@hoowl.se"))]) + (org-jira . [(20251120 307) ((emacs (24 5)) (cl-lib (0 5)) (request (0 2 0)) (dash (2 14 1))) "Syncing between Jira and Org-mode" tar ((:url . "https://github.com/ahungry/org-jira") (:commit . "f5ccb0719478a6f7dd2c045b1b191420d04242d7") (:revdesc . "f5ccb0719478") (:keywords "ahungry" "jira" "org" "bug" "tracker") (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (org-journal . [(20250525 951) ((emacs (26 1)) (org (9 1))) "A simple org-mode based journaling mode" tar ((:url . "http://github.com/bastibe/org-journal") (:commit . "8b9b46f988ed69baee0b3db4fde9ee5827587b1e") (:revdesc . "8b9b46f988ed"))]) + (org-journal-list . [(20190221 2052) ((emacs (25))) "Org mode Journal List" tar ((:url . "https://github.com/huytd/org-journal-list") (:commit . "2b26d00181bb49bff64b31ad020490acd1b6ae02") (:revdesc . "2b26d00181bb") (:authors ("Huy Tran" . "huytd189@gmail.com")) (:maintainers ("Huy Tran" . "huytd189@gmail.com")) (:maintainer "Huy Tran" . "huytd189@gmail.com"))]) + (org-journal-tags . [(20250824 823) ((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 ((:url . "https://github.com/SqrtMinusOne/org-journal-tags") (:commit . "e815fe09e05a53482b86470c774422c2d49e2754") (:revdesc . "e815fe09e05a") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (org-kanban . [(20250329 2201) ((s (0)) (dash (2 17 0))) "Kanban dynamic block for org-mode" tar ((:url . "http://github.com/gizmomogwai/org-kanban") (:commit . "bc7864f2140d3ed510ec0ecd60c6d3d8b8589ea4") (:revdesc . "bc7864f2140d") (:keywords "org-mode" "org" "kanban" "tools") (:authors ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainers ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainer "Christian Köstlin" . "christian.koestlin@gmail.com"))]) + (org-kindle . [(20220210 1408) ((emacs (25)) (cl-lib (0 5)) (seq (2 20))) "Send org link file to ebook reader" tar ((:url . "https://repo.or.cz/org-kindle.git") (:commit . "fadcfd62e254d0c45e87d63128a82a08ae21869a") (:revdesc . "fadcfd62e254") (:keywords "org" "link" "ebook" "kindle" "epub" "azw3" "mobi"))]) + (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 ((:url . "https://github.com/yangsheng6810/org-latex-instant-preview") (:commit . "031025a8be9bf7255aa047388d027642cd2d6183") (:revdesc . "031025a8be9b") (:keywords "tex" "tools") (:authors ("Sheng Yang" . "styang@fastmail.com")) (:maintainers ("Sheng Yang" . "styang@fastmail.com")) (:maintainer "Sheng Yang" . "styang@fastmail.com"))]) + (org-linenote . [(20241231 616) ((emacs (29 1)) (projectile (2 8 0)) (vertico (1 7)) (eldoc (1 11)) (lsp-mode (9 0 0)) (fringe-helper (1 0 1))) "A package inspired by VSCode Linenote" tar ((:url . "https://github.com/seokbeomKim/org-linenote") (:commit . "407d2ac834d1de82dd1e37f4642f74a81cf03350") (:revdesc . "407d2ac834d1") (:keywords "tools" "note" "org") (:authors ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainers ("Jason Kim" . "sukbeom.kim@gmail.com")) (:maintainer "Jason Kim" . "sukbeom.kim@gmail.com"))]) + (org-link-beautify . [(20251226 1128) ((emacs (29 1)) (nerd-icons (0 0 1)) (qrencode (1 3))) "Beautify Org Links" tar ((:url . "https://repo.or.cz/org-link-beautify.git") (:commit . "d15ee0a511d47949d71879a4aaf2d32587143d24") (:revdesc . "d15ee0a511d4") (:keywords "hypermedia"))]) + (org-link-travis . [(20140405 2327) ((org (7))) "Insert/Export the link of Travis CI on org-mode" tar ((:url . "https://github.com/aki2o/org-link-travis") (:commit . "596615ad8373d9090bd4138da683524f0ad0bda5") (:revdesc . "596615ad8373") (:keywords "org") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (org-linkotron . [(20200112 2235) ((emacs (26 1)) (org (9 3))) "Org-mode link selector" tar ((:url . "https://gitlab.com/perweij/org-linkotron") (:commit . "d0adc5247b205bc73d2f1a83d4a512d2be541eb5") (:revdesc . "d0adc5247b20") (:keywords "hypermedia" "org") (:authors ("Per Weijnitz" . "per.weijnitz@gmail.com")) (:maintainers ("Per Weijnitz" . "per.weijnitz@gmail.com")) (:maintainer "Per Weijnitz" . "per.weijnitz@gmail.com"))]) + (org-links . [(20251223 2147) ((emacs (27 1))) "Better manage line numbers in links of Org mode" tar ((:url . "https://github.com/Anoncheg1/emacs-org-links") (:commit . "452ccc4ff5674df8da6c788e48abeeed6f3abd29") (:revdesc . "452ccc4ff567") (:keywords "org" "text" "hypermedia" "url") (:authors (nil . "github.com/Anoncheg1,codeberg.org/Anoncheg")) (:maintainers (nil . "github.com/Anoncheg1,codeberg.org/Anoncheg")) (:maintainer nil . "github.com/Anoncheg1,codeberg.org/Anoncheg"))]) + (org-listcruncher . [(20210706 1741) ((seq (2 3)) (emacs (26 1))) "Planning tool - Parse Org mode lists into table" tar ((:url . "https://github.com/dfeich/org-listcruncher") (:commit . "075e0e6d36eb50406a608bc8a2f0dd359ec63938") (:revdesc . "075e0e6d36eb") (:keywords "convenience") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainers ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich@gmail.com"))]) + (org-mac-link . [(20231016 2047) ((emacs (27 1))) "Insert org-mode links to items selected in various Mac apps" tar ((:url . "https://gitlab.com/aimebertrand/org-mac-link") (:commit . "e30171a6e98db90787ab8a23b3a7dc4fd13b10f9") (:revdesc . "e30171a6e98d") (:keywords "files" "wp" "url" "org") (:authors ("Anthony Lander" . "anthony.lander@gmail.com") ("John Wiegley" . "johnw@gnu.org") ("Christopher Suckling" . "sucklingatgmaildotcom") ("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"))]) + (org-make-toc . [(20240830 2046) ((emacs (26 1)) (dash (2 12)) (s (1 10 0)) (org (9 3)) (compat (29 1))) "Automatic tables of contents for Org files" tar ((:url . "http://github.com/alphapapa/org-make-toc") (:commit . "5f0f39b11c091a5abf49ddf78a6f740252920f78") (:revdesc . "5f0f39b11c09") (:keywords "org" "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-mcp . [(20251111 1319) ((emacs (27 1)) (mcp-server-lib (0 2 0))) "MCP server for Org-mode" tar ((:url . "https://github.com/laurynas-biveinis/org-mcp") (:commit . "70fef64ee096c13eb33389c4803c5825e146c60e") (:revdesc . "70fef64ee096") (:keywords "convenience" "files" "matching" "outlines") (:authors ("Laurynas Biveinis" . "laurynas.biveinis@gmail.com")) (:maintainers ("Laurynas Biveinis" . "laurynas.biveinis@gmail.com")) (:maintainer "Laurynas Biveinis" . "laurynas.biveinis@gmail.com"))]) + (org-mem . [(20251108 841) ((emacs (29 1)) (el-job (2 5 1)) (llama (0 5 0))) "Fast info from a large number of Org file contents" tar ((:url . "https://github.com/meedstrom/org-mem") (:commit . "0a33650ccb79c9bd49d7598fbb8f09beb2153350") (:revdesc . "0a33650ccb79") (:keywords "text") (:authors ("Martin Edström" . "meedstrom@runbox.eu")) (:maintainers ("Martin Edström" . "meedstrom@runbox.eu")) (:maintainer "Martin Edström" . "meedstrom@runbox.eu"))]) + (org-mime . [(20251201 245) ((emacs (27 1))) "Org html export for text/html MIME emails" tar ((:url . "http://github.com/org-mime/org-mime") (:commit . "ffaad784a8597ee52842a578c01bd347d3e0281d") (:revdesc . "ffaad784a859") (:keywords "mime" "mail" "email" "html") (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (org-mind-map . [(20180826 2340) ((emacs (24)) (dash (1 8 0)) (org (8 2 10))) "Creates a directed graph from org-mode files" tar ((:url . "https://github.com/theodorewiles/org-mind-map") (:commit . "41df4b2e30455494f1848b4e06cc9208aa9e902b") (:revdesc . "41df4b2e3045") (:keywords "orgmode" "extensions" "graphviz" "dot") (:authors ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainers ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainer "Ted Wiles" . "theodore.wiles@gmail.com"))]) + (org-ml . [(20250514 2314) ((emacs (27 1)) (org (9 7)) (dash (2 17)) (s (1 12))) "Functional Org Mode API" tar ((:url . "https://github.com/ndwarshuis/org-ml") (:commit . "e348f446746bd1699eae05a82dccd4276c6cc9a8") (:revdesc . "e348f446746b") (:keywords "org-mode" "outlines") (:authors ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainers ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainer "Nathan Dwarshuis" . "ndwar@yavin4.ch"))]) + (org-mobile-sync . [(20180606 524) ((emacs (24 3 50)) (org (8 0))) "Automatically sync org-mobile on changes" tar ((:url . "https://framagit.org/steckerhalter/org-mobile-sync") (:commit . "06764b943a528827df1e2acc6bc7806cc2c1351f") (:revdesc . "06764b943a52") (:keywords "org-mode" "org" "mobile" "sync" "todo"))]) + (org-modern . [(20251219 1424) ((emacs (29 1)) (org (9 6)) (compat (30))) "Modern looks for Org" tar ((:url . "https://github.com/minad/org-modern") (:commit . "55b5bbeb1eb9483d0cb43f4803615c380bf3b1ed") (:revdesc . "55b5bbeb1eb9") (:keywords "outlines" "hypermedia" "text") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (org-movies . [(20210920 101) ((emacs (26 1)) (org (9 0)) (request (0 3 0))) "Manage watchlist with Org mode" tar ((:url . "https://github.com/teeann/org-movies") (:commit . "e96fecaffa2924de64a507aa31d2934e667ee1ea") (:revdesc . "e96fecaffa29") (:keywords "hypermedia" "outlines" "org"))]) + (org-mpv-notes . [(20241222 1958) ((emacs (28 1))) "Take notes in org mode while watching videos in mpv" tar ((:url . "https://github.com/bpanthi977/org-mpv-notes") (:commit . "1d8db9ff803122e2a9bfc1b41d806f3b70acfc57") (:revdesc . "1d8db9ff8031") (:authors ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainers ("Bibek Panthi" . "bpanthi977@gmail.com")) (:maintainer "Bibek Panthi" . "bpanthi977@gmail.com"))]) + (org-mru-clock . [(20240522 826) ((emacs (26 1))) "Clock in/out of tasks with completion and persistent history" tar ((:url . "https://github.com/unhammer/org-mru-clock") (:commit . "198beb2089ea5e457dd13e8ac64d775eeff8fd89") (:revdesc . "198beb2089ea") (:keywords "convenience" "calendar") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (org-msg . [(20251029 2127) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML" tar ((:url . "https://github.com/jeremy-compostella/org-msg") (:commit . "327768e2c38020f6ea44730e71f2a62f3f0ce3bd") (:revdesc . "327768e2c380") (:keywords "extensions" "mail") (: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"))]) + (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 ((:url . "https://github.com/akirak/org-multi-wiki") (:commit . "bf8039aadddaf02569fab473f766071ef7e63563") (:revdesc . "bf8039aaddda") (:keywords "org" "outlines" "files") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (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 ((:url . "https://github.com/myuhe/org-multiple-keymap.el") (:commit . "4eb8aa0aada012b2346cc7f0c55e07783141a2c3") (:revdesc . "4eb8aa0aada0") (:keywords "convenience" "org-mode") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (org-newtab . [(20240227 155) ((emacs (27 1)) (websocket (1 14)) (async (1 9 7))) "Supercharge your browser's new tab page" tar ((:url . "https://github.com/Zweihander-Main/org-newtab") (:commit . "eca494a43e242558bd8db24d321ad62a8ec86c02") (:revdesc . "eca494a43e24") (:keywords "outlines") (:authors ("Zweihänder" . "zweidev@zweihander.me")) (:maintainers ("Zweihänder" . "zweidev@zweihander.me")) (:maintainer "Zweihänder" . "zweidev@zweihander.me"))]) + (org-nix-shell . [(20240603 859) ((emacs (27 1)) (org (9 4))) "Org local nix-shell" tar ((:url . "https://github.com/AntonHakansson/") (:commit . "f359d9e1053fadee86dd668f4789ae2e700d8e8a") (:revdesc . "f359d9e1053f") (:keywords "processes" "outlines") (:maintainers ("Anton Hakansson" . "anton@hakanssn.com")) (:maintainer "Anton Hakansson" . "anton@hakanssn.com"))]) + (org-node . [(20251218 306) ((emacs (29 1)) (llama (0 5 0)) (org-mem (0 22 0)) (magit-section (4 3 0))) "Fast org-roam replacement" tar ((:url . "https://github.com/meedstrom/org-node") (:commit . "3956804cc0cc19fba0d98b2eb9b76056feda77ae") (:revdesc . "3956804cc0cc") (:keywords "org" "hypermedia") (:authors ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainers ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainer "Martin Edström" . "meedstrom91@gmail.com"))]) + (org-node-fakeroam . [(20250519 2339) ((emacs (29 1)) (org-mem (0 8 2)) (org-node (3 1 0)) (org-roam (2 2 2))) "Deprecated extension to org-node" tar ((:url . "https://github.com/meedstrom/org-node-fakeroam") (:commit . "449a5e841f8fe5dd389a390da79e21b696d3c7ac") (:revdesc . "449a5e841f8f") (:keywords "org" "hypermedia") (:authors ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainers ("Martin Edström" . "meedstrom91@gmail.com")) (:maintainer "Martin Edström" . "meedstrom91@gmail.com"))]) + (org-notebook . [(20170322 452) ((emacs (24)) (org (8)) (cl-lib (0 5))) "Ease the use of org-mode as a notebook" tar ((:url . "https://github.com/Rahi374/org-notebook") (:commit . "d90c4aeca2442161e6dd89de175561af85aace03") (:revdesc . "d90c4aeca244") (:keywords "convenience" "tools") (:authors ("Paul Elder" . "paul.elder@amanokami.net")) (:maintainers ("Paul Elder" . "paul.elder@amanokami.net")) (:maintainer "Paul Elder" . "paul.elder@amanokami.net"))]) + (org-noter . [(20250730 30) ((emacs (24 4)) (cl-lib (0 6)) (org (9 4))) "A synchronized, Org-mode, document annotator" tar ((:url . "https://github.com/org-noter/org-noter") (:commit . "aafa08a49c4c3311d9b17864629aceeff02d33da") (:revdesc . "aafa08a49c4c") (:keywords "lisp" "pdf" "interleave" "annotate" "external" "sync" "notes" "documents" "org-mode") (:authors ("Gonçalo Santos" . "in@bsentia") ("Maintainer Dmitry M" . "dmitrym@gmail.com")) (:maintainers ("Peter Mao" . "peter.mao@gmail.com") ("Dmitry M" . "dmitrym@gmail.com")) (:maintainer "Peter Mao" . "peter.mao@gmail.com"))]) + (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 ((:url . "https://github.com/fuxialexander/org-pdftools") (:commit . "4e420233a153a9c4ab3d1a7e1d7d3211c836f0ac") (:revdesc . "4e420233a153") (:keywords "convenience") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainers ("Alexander Fu Xi" . "fuxialexnader@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexnader@gmail.com"))]) + (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 ((:url . "https://github.com/doppelc/org-notifications") (:commit . "b8032f8adfbeb328962a5657c6dd173e64cc76e5") (:revdesc . "b8032f8adfbe") (:keywords "outlines"))]) + (org-octopress . [(20170821 415) ((org (9 0)) (orglue (0 1)) (ctable (0 1 1))) "Compose octopress articles using org-mode" tar ((:url . "https://github.com/yoshinari-nomura/org-octopress") (:commit . "38598ef98d04076a8eb78d549907ddfde8d3a652") (:revdesc . "38598ef98d04") (:keywords "org" "jekyll" "octopress" "blog") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net"))]) + (org-onenote . [(20171008 500) ((oauth2 (0 11)) (request (0 2 0)) (org (8 2 10))) "Export org-mode document to onenote" tar ((:url . "https://github.com/ifree/org-onenote") (:commit . "5ce5cf4edb143180e0b185ac26826d39ae5bc929") (:revdesc . "5ce5cf4edb14") (:keywords "tools" "docs" "org-mode" "onenote") (:authors ("Frei Zhang" . "ifree0@gmail.com")) (:maintainers ("Frei Zhang" . "ifree0@gmail.com")) (:maintainer "Frei Zhang" . "ifree0@gmail.com"))]) + (org-outline-numbering . [(20180705 1501) ((emacs (24)) (org (8 3)) (cl-lib (0 6)) (ov (1 0 6))) "Show outline numbering as overlays in org-mode" tar ((:url . "https://gitlab.com/andersjohansson/org-outline-numbering") (:commit . "b95b6a7ed9289637cb512232470633b330ca9713") (:revdesc . "b95b6a7ed928") (:keywords "wp" "convenience"))]) + (org-outlook . [(20160705 1338) nil "Outlook org" tar ((:url . "https://github.com/mlf176f2/org-outlook.el") (:commit . "ec32d8d9d8ffd17e6de4de0b52fc3f5ad9b4cc0d") (:revdesc . "ec32d8d9d8ff") (:keywords "org-outlook"))]) + (org-page . [(20241227 814) ((ht (1 5)) (simple-httpd (1 4 6)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0)) (cl-lib (0 5)) (git (0 1 1))) "Static site generator based on org mode" tar ((:url . "https://github.com/kelvinh/org-page") (:commit . "3641afab005b892b586a1e70da29201004c189c3") (:revdesc . "3641afab005b") (:keywords "org-mode" "convenience" "beautify") (:authors ("Kelvin Hu" . "iniDOTkelvinATgmailDOTcom")) (:maintainers ("Kelvin Hu" . "iniDOTkelvinATgmailDOTcom")) (:maintainer "Kelvin Hu" . "iniDOTkelvinATgmailDOTcom"))]) + (org-parser . [(20200417 301) ((emacs (25 1)) (dash (2 12 0)) (ht (2 1))) "Parse org files into structured datatypes" tar ((:url . "https://hg.sr.ht/~zck/org-parser") (:commit . "fd4cb7035ff649378cc968b1ec2c386b5c565706") (:revdesc . "fd4cb7035ff6") (:keywords "files" "outlines" "tools"))]) + (org-pdftools . [(20250714 1631) ((emacs (26 1)) (org (9 3 6)) (pdf-tools (0 8)) (org-noter (1 4 1))) "Support for links to documents in pdfview mode" tar ((:url . "https://github.com/fuxialexander/org-pdftools") (:commit . "2b3357828a4c2dfba8f87c906d64035d8bf221f2") (:revdesc . "2b3357828a4c") (:keywords "convenience") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainers ("Alexander Fu Xi" . "fuxialexnader@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexnader@gmail.com"))]) + (org-picklink . [(20210210 516) ((emacs (24 4))) "Pick a headline link from org-agenda" tar ((:url . "https://github.com/tumashu/org-picklink") (:commit . "bfdc22b436482752be41c5d6f6f37dca76b1c7c3") (:revdesc . "bfdc22b43648") (:keywords "convenience") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (org-pomodoro . [(20220318 1618) ((alert (0 5 10)) (cl-lib (0 5))) "Pomodoro implementation for org-mode" tar ((:url . "https://github.com/lolownia/org-pomodoro") (:commit . "3f5bcfb80d61556d35fc29e5ddb09750df962cc6") (:revdesc . "3f5bcfb80d61") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com") ("Marcin Koziej" . "marcinatlolowniadotorg")) (:maintainers ("Arthur Leonard Andersen" . "leoc.git@gmail.com") ("Marcin Koziej" . "marcinatlolowniadotorg")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com"))]) + (org-present . [(20220806 1847) ((org (7))) "Minimalist presentation minor-mode for Emacs org-mode" tar ((:url . "https://github.com/rlister/org-present") (:commit . "4ec04e1b77dea76d7c30066ccf3200d2e0b7bee9") (:revdesc . "4ec04e1b77de"))]) + (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 ((:url . "https://gitlab.com/duncan-bayne/org-present-remote") (:commit . "95ea38b985b5aaa49b8039010bbe5fda5188a197") (:revdesc . "95ea38b985b5") (:keywords "comm" "docs") (:authors ("Duncan Bayne" . "duncan@bayne.id.au")) (:maintainers ("Duncan Bayne" . "duncan@bayne.id.au")) (:maintainer "Duncan Bayne" . "duncan@bayne.id.au"))]) + (org-pretty-tags . [(20211228 1546) ((emacs (25))) "Surrogates for tags" tar ((:url . "https://gitlab.com/marcowahl/org-pretty-tags") (:commit . "e127a1e08df8273b909a99594ffaad84960ff212") (:revdesc . "e127a1e08df8") (:keywords "reading" "outlines") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com"))]) + (org-preview-html . [(20220809 1033) ((emacs (25 1)) (org (8 0))) "Automatically preview org-exported HTML files within Emacs" tar ((:url . "https://github.com/jakebox/org-preview-html") (:commit . "785e1f5c99c0f2d76a9a6611a06b4552a343e221") (:revdesc . "785e1f5c99c0") (:keywords "org" "convenience" "outlines") (:authors ("Jake B" . "jakebox0@protonmail.com")) (:maintainers ("Jake B" . "jakebox0@protonmail.com")) (:maintainer "Jake B" . "jakebox0@protonmail.com"))]) + (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 ((:url . "https://github.com/colonelpanic8/org-project-capture") (:commit . "581ca06383b957e2927c24290debd3cf83355456") (:revdesc . "581ca06383b9") (:keywords "org-mode" "todo" "tools" "outlines" "project" "capture") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (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 ((:url . "https://github.com/colonelpanic8/org-project-capture") (:commit . "4ca2667d498fa259772e46ff5e101285446d70b6") (:revdesc . "4ca2667d498f") (:keywords "org-mode" "projectile" "todo" "tools" "outlines" "project" "capture") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (org-projectile-helm . [(20230817 801) ((org-projectile (1 0 0)) (helm (2 3 1)) (emacs (25))) "Helm functions for org-projectile" tar ((:url . "https://github.com/IvanMalison/org-projectile") (:commit . "214a6068c467323a795b27996c1e7b75ae42dc68") (:revdesc . "214a6068c467") (:keywords "org" "projectile" "todo" "helm" "outlines") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (org-protocol-jekyll . [(20170328 1639) ((cl-lib (0 5))) "Jekyll's handler for org-protocol" tar ((:url . "https://github.com/vonavi/org-protocol-jekyll") (:commit . "dec064a42d6dfe81dfde7ba59ece5ca103ac6334") (:revdesc . "dec064a42d6d") (:authors ("Vladimir S. Ivanov" . "ivvl82@gmail.com")) (:maintainers ("Vladimir S. Ivanov" . "ivvl82@gmail.com")) (:maintainer "Vladimir S. Ivanov" . "ivvl82@gmail.com"))]) + (org-ql . [(20250421 133) ((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 ((:url . "https://github.com/alphapapa/org-ql") (:commit . "4b8330a683c43bb4a2c64ccce8cd5a90c8b174ca") (:revdesc . "4b8330a683c4") (:keywords "hypermedia" "outlines" "org" "agenda") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-radiobutton . [(20210519 1225) ((dash (2 13 0)) (emacs (24))) "Radiobutton for org-mode lists" tar ((:url . "https://github.com/Fuco1/org-radiobutton") (:commit . "4ba26bbd26102c45c234bc6ce9a8e9c655c6a0a2") (:revdesc . "4ba26bbd2610") (:keywords "outlines") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (org-rainbow-tags . [(20250125 950) ((emacs (28 1))) "Colorize org tags automatically" tar ((:url . "https://github.com/KaratasFurkan/org-rainbow-tags") (:commit . "dfe36047bc9646b621452f3e2e97170e99e2b43f") (:revdesc . "dfe36047bc96") (:keywords "faces" "outlines") (:authors ("Furkan Karataş" . "furkan.karatas02@gmail.com")) (:maintainers ("Furkan Karataş" . "furkan.karatas02@gmail.com")) (:maintainer "Furkan Karataş" . "furkan.karatas02@gmail.com"))]) + (org-random-todo . [(20190214 2057) ((emacs (24 3)) (alert (1 3))) "Show a random TODO (with alert) every so often" tar ((:url . "https://github.com/unhammer/org-random-todo") (:commit . "4f7677af740e8f3f7cfaf630ae2e594a125af760") (:revdesc . "4f7677af740e") (:keywords "org" "todo" "notification" "calendar") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (org-randomnote . [(20200110 1407) ((f (0 19 0)) (dash (2 12 0)) (org (0))) "Find a random note in your Org-Mode files" tar ((:url . "http://github.com/mwfogleman/org-randomnote") (:commit . "ea8cf4385970637efffff8f79e14576ba6d7ad13") (:revdesc . "ea8cf4385970") (:authors ("Michael Fogleman" . "michaelwfogleman@gmail.com")) (:maintainers ("Michael Fogleman" . "michaelwfogleman@gmail.com")) (:maintainer "Michael Fogleman" . "michaelwfogleman@gmail.com"))]) + (org-re-reveal . [(20251222 1741) ((emacs (24 4)) (org (8 3)) (htmlize (1 34))) "Org export to reveal.js presentations" tar ((:url . "https://gitlab.com/oer/org-re-reveal") (:commit . "72c24637820f9dafa96d4ad23a0802c47de7651e") (:revdesc . "72c24637820f") (:keywords "tools" "outlines" "hypermedia" "slideshow" "presentation" "oer"))]) + (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 ((:url . "https://gitlab.com/oer/org-re-reveal-citeproc") (:commit . "faa9ea387917b20bd1499ad90199ff3d417c00c2") (:revdesc . "faa9ea387917") (:keywords "hypermedia" "tools" "slideshow" "presentation" "bibliography"))]) + (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 ((:url . "https://gitlab.com/oer/org-re-reveal-ref") (:commit . "ea9661864d5fbef87b12b78f516c13a40c683f24") (:revdesc . "ea9661864d5f") (:keywords "hypermedia" "tools" "slideshow" "presentation" "bibliography"))]) + (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 ((:url . "http://github.com/alphapapa/org-recent-headings") (:commit . "97418d581ea030f0718794e50b005e9bae44582e") (:revdesc . "97418d581ea0") (:keywords "hypermedia" "outlines" "org") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-recur . [(20230124 1532) ((emacs (24 1)) (org (9 0)) (dash (2 7 0))) "Recurring org-mode tasks" tar ((:url . "https://github.com/mrcnski/org-recur") (:commit . "628099883a63d219f76cd9631cc914fe6ec8a3e3") (:revdesc . "628099883a63") (:authors ("Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com")) (:maintainers ("Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com")) (:maintainer "Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com"))]) + (org-redmine . [(20160711 1114) nil "Redmine tools using Emacs OrgMode" tar ((:url . "https://github.com/gongo/org-redmine") (:commit . "a526c3ac802634486bf10de9c2283ccb1a30ec8d") (:revdesc . "a526c3ac8026") (:keywords "redmine" "org") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainers ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com"))]) + (org-ref . [(20251206 1422) ((org (9 4)) (htmlize (0)) (transient (0)) (avy (0)) (parsebib (0)) (bibtex-completion (0)) (citeproc (0)) (ox-pandoc (0)) (request (0))) "Citations, cross-references and bibliographies in org-mode" tar ((:url . "https://github.com/jkitchin/org-ref") (:commit . "dc2481d430906fe2552f9318f4405242e6d37396") (:revdesc . "dc2481d43090") (:keywords "org-mode" "cite" "ref" "label") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainers ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu"))]) + (org-ref-prettify . [(20220507 649) ((emacs (24 3)) (org-ref (3 0)) (bibtex-completion (1 0 0))) "Prettify org-ref citation links" tar ((:url . "https://github.com/alezost/org-ref-prettify.el") (:commit . "0ec3b6e398ee117c8b8a787a0422b95d9e95f7bb") (:revdesc . "0ec3b6e398ee") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com") ("Vitus Schäfftlein" . "vitusschaefftlein@live.de")) (:maintainers ("Alex Kost" . "alezost@gmail.com") ("Vitus Schäfftlein" . "vitusschaefftlein@live.de")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (org-repeat-by-cron . [(20251225 956) ((emacs (24 4))) "An Org mode task repeater based on Cron expressions" tar ((:url . "https://github.com/TomoeMami/org-repeat-by-cron.el") (:commit . "5d780367bf5d33dd91b26baf2f230aaff76ab25d") (:revdesc . "5d780367bf5d") (:keywords "calendar") (:authors ("TomoeMami" . "trembleafterme@outlook.com")) (:maintainers ("TomoeMami" . "trembleafterme@outlook.com")) (:maintainer "TomoeMami" . "trembleafterme@outlook.com"))]) + (org-repo-todo . [(20171228 119) nil "Simple repository todo management with org-mode" tar ((:url . "https://github.com/waymondo/org-repo-todo") (:commit . "f73ebd91399c5760ad52c6ad9033de1066042003") (:revdesc . "f73ebd91399c") (:keywords "convenience") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainers ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com"))]) + (org-reverse-datetree . [(20250513 848) ((emacs (29 1)) (dash (2 19 1)) (org (9 6))) "Create reverse date trees in org-mode" tar ((:url . "https://github.com/akirak/org-reverse-datetree") (:commit . "8466a3566292cf17e70e6ab4e7fb9e1b48831586") (:revdesc . "8466a3566292") (:keywords "outlines") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (org-review . [(20250416 802) nil "Schedule reviews for Org entries" tar ((:url . "https://github.com/brabalan/org-review") (:commit . "1f24fa504d58d619bb81a2c16058f685d85c2151") (:revdesc . "1f24fa504d58") (:keywords "calendar") (:authors ("Alan Schmitt" . "alan.schmitt@polytechnique.org")) (:maintainers ("Alan Schmitt" . "alan.schmitt@polytechnique.org")) (:maintainer "Alan Schmitt" . "alan.schmitt@polytechnique.org"))]) + (org-rich-yank . [(20250923 919) ((emacs (25 1))) "Paste with org-mode markup and link to source" tar ((:url . "https://github.com/unhammer/org-rich-yank") (:commit . "fe2ba1c9d9f1f7943d8f76879a1b2b9b15928147") (:revdesc . "fe2ba1c9d9f1") (:keywords "convenience" "hypermedia" "org") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (org-roam . [(20251125 729) ((emacs (26 1)) (compat (30 1)) (dash (2 13)) (org (9 6)) (emacsql (4 1 0)) (magit-section (3 0 0))) "A database abstraction layer for Org-mode" tar ((:url . "https://github.com/org-roam/org-roam") (:commit . "f4ba41cf3d59084e182a5186d432afc9aa3fc423") (:revdesc . "f4ba41cf3d59") (:keywords "org-mode" "roam" "convenience") (:authors ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainers ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainer "Jethro Kuan" . "jethrokuan95@gmail.com"))]) + (org-roam-bibtex . [(20250215 1156) ((emacs (27 1)) (org-roam (2 2 0)) (bibtex-completion (1 0 0))) "Org Roam meets BibTeX" tar ((:url . "https://github.com/org-roam/org-roam-bibtex") (:commit . "b065198f2c3bc2a47ae520acd2b1e00e7b0171e6") (:revdesc . "b065198f2c3b") (:keywords "bib" "hypermedia" "outlines" "wp") (:authors ("Mykhailo Shevchuk" . "mail@mshevchuk.com") ("Leo Vivier" . "leo.vivier+dev@gmail.com")) (:maintainers ("Mykhailo Shevchuk" . "mail@mshevchuk.com") ("Leo Vivier" . "leo.vivier+dev@gmail.com")) (:maintainer "Mykhailo Shevchuk" . "mail@mshevchuk.com"))]) + (org-roam-ql . [(20251217 2009) ((emacs (28)) (org-roam (2 2 0)) (s (1 12 0)) (magit-section (3 3 0)) (transient (0 4)) (dash (2 0))) "Interface to query and view results from org-roam" tar ((:url . "https://github.com/ahmed-shariff/org-roam-ql") (:commit . "420ce9b5a28c8e9c9583cb88142e83d905e06c96") (:revdesc . "420ce9b5a28c"))]) + (org-roam-ql-ql . [(20251030 2042) ((emacs (28)) (org-roam-ql (0 1)) (org-ql (0 8 2)) (org-roam (2 2 0)) (s (1 12 0)) (transient (0 4))) "Intgrating org-roam and org-ql" tar ((:url . "https://github.com/ahmed-shariff/org-roam-ql") (:commit . "cdf6b11279783346607542dfac07c74d8651a650") (:revdesc . "cdf6b1127978"))]) + (org-roam-timestamps . [(20221104 1544) ((emacs (26 1)) (org-roam (2 0 0))) "Keep track of modification times for org-roam" tar ((:url . "https://github.com/ThomasFKJorna/org-roam-timestamps/") (:commit . "c4ff1e2f5b0905b5caa917249aab56ddc1de1ab3") (:revdesc . "c4ff1e2f5b09") (:keywords "calendar" "outlines" "files") (:authors ("Thomas F. K. Jorna" . "https://github.com/thomas")) (:maintainers ("Thomas F. K. Jorna" . "jorna@jtrialerror.com")) (:maintainer "Thomas F. K. Jorna" . "jorna@jtrialerror.com"))]) + (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 ((:url . "https://github.com/org-roam/org-roam-ui") (:commit . "5ac74960231db0bf7783c2ba7a19a60f582e91ab") (:revdesc . "5ac74960231d") (:keywords "files" "outlines"))]) + (org-ros . [(20251102 1408) ((emacs (24 1))) "Rahul's Org-Mode Screenshot" tar ((:url . "https://github.com/LionyxML/ros") (:commit . "f212ede14350b339ce5e41b0a0b9ca13482ceb10") (:revdesc . "f212ede14350") (:authors ("Rahul Martim Juliato" . "rahul.juliato@gmail.com")) (:maintainers ("Rahul Martim Juliato" . "rahul.juliato@gmail.com")) (:maintainer "Rahul Martim Juliato" . "rahul.juliato@gmail.com"))]) + (org-rtm . [(20160214 1236) ((rtm (0 1))) "Simple import/export from rememberthemilk to org-mode" tar ((:url . "https://github.com/pmiddend/org-rtm") (:commit . "adc42ad1fbe92ab447ccc9553780f4456f2508d2") (:revdesc . "adc42ad1fbe9") (:keywords "outlines" "data") (:authors ("Philipp Middendorf" . "pmidden@secure.mailbox.org")) (:maintainers ("Philipp Middendorf" . "pmidden@secure.mailbox.org")) (:maintainer "Philipp Middendorf" . "pmidden@secure.mailbox.org"))]) + (org-runbook . [(20230503 319) ((emacs (27 1)) (seq (2 3)) (f (0 20 0)) (s (1 12 0)) (dash (2 17 0)) (mustache (0 24)) (ht (0 9)) (ivy (0 8 0))) "Org mode for runbooks" tar ((:url . "https://github.com/tyler-dodge/org-runbook") (:commit . "7ada3903a56266d60541d59ae92410e8ab6fe836") (:revdesc . "7ada3903a562") (:keywords "convenience" "processes" "terminals" "files"))]) + (org-scrum . [(20241231 2251) ((emacs (24 5)) (org (8 2)) (seq (2 3)) (cl-lib (1 0))) "Org mode extensions for scrum planning and reporting" tar ((:url . "https://github.com/ianxm/emacs-scrum") (:commit . "c1da15f576c8f55245df4804221c3b0efa7fbf40") (:revdesc . "c1da15f576c8") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainers ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu"))]) + (org-seek . [(20161217 502) ((emacs (24 3)) (ag (0 48))) "Searching Org-mode files with search tools" tar ((:url . "https://github.com/stardiviner/org-seek.el") (:commit . "1f51e6634e3b9a6a29d335d0d14370a6ffef2265") (:revdesc . "1f51e6634e3b") (:keywords "org" "search" "ag" "pt") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainers ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com"))]) + (org-shoplist . [(20240831 1140) ((emacs (25))) "Eat the world" tar ((:url . "https://github.com/lordnik22") (:commit . "20c33b7310694742b814bf1ca3c05d3496d2a313") (:revdesc . "20c33b731069") (:keywords "extensions" "matching"))]) + (org-shortcut . [(20250223 0) ((plz (0 9 1)) (emacs (28 1))) "Bindings for shortcut.com in org-mode" tar ((:url . "https://github.com/endi1/org-shortcut") (:commit . "5344d2011e749b59cb54ed405e7c2d4adcaa6539") (:revdesc . "5344d2011e74") (:keywords "comm") (:authors ("Endi Sukaj" . "endisukaj@gmail.com")) (:maintainers ("Endi Sukaj" . "endisukaj@gmail.com")) (:maintainer "Endi Sukaj" . "endisukaj@gmail.com"))]) + (org-side-tree . [(20240601 1001) ((emacs (28 1))) "Navigate Org outlines in side window tree" tar ((:url . "https://github.com/localauthor/org-side-tree") (:commit . "e8da5217ce23440a62f4a46ef60e2082b6284b28") (:revdesc . "e8da5217ce23") (:authors ("Grant Rosson" . "https://github.com/localauthor")) (:maintainers ("Grant Rosson" . "https://github.com/localauthor")) (:maintainer "Grant Rosson" . "https://github.com/localauthor"))]) + (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 ((:url . "https://github.com/alphapapa/org-sidebar") (:commit . "1e06d1b4ab5f0d09301712cdecb757c9437a7179") (:revdesc . "1e06d1b4ab5f") (:keywords "hypermedia" "outlines" "org" "agenda") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-sliced-images . [(20250408 2114) ((emacs (28 1))) "Sliced inline images in org-mode" tar ((:url . "https://github.com/jcfk/org-sliced-images") (:commit . "cbe25ca63bb4c3979396834f279308cf87923f71") (:revdesc . "cbe25ca63bb4") (:keywords "convenience") (:authors ("Jacob Fong" . "jacobcfong@gmail.com")) (:maintainers ("Jacob Fong" . "jacobcfong@gmail.com")) (:maintainer "Jacob Fong" . "jacobcfong@gmail.com"))]) + (org-snooze . [(20181229 1424) ((emacs (24 4))) "Snooze your code, doc and feed" tar ((:url . "https://github.com/xueeinstein/org-snooze.el") (:commit . "8799adc14a20f3489063d279ff69312de3180bf9") (:revdesc . "8799adc14a20") (:keywords "extensions"))]) + (org-social . [(20251218 930) ((emacs (30 1)) (org (9 0)) (request (0 3 0)) (seq (2 20)) (emojify (1 2))) "An Org-social client" tar ((:url . "https://github.com/tanrax/org-social.el") (:commit . "b8d9e0586a8cfdfaa610f830ad8da77fb45afaf8") (:revdesc . "b8d9e0586a8c") (:authors ("Andros Fenollosa" . "hi@andros.dev")) (:maintainers ("Andros Fenollosa" . "hi@andros.dev")) (:maintainer "Andros Fenollosa" . "hi@andros.dev"))]) + (org-special-block-extras . [(20250715 1754) ((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 ((:url . "https://alhassy.github.io/org-special-block-extras") (:commit . "1a236c783958782a4027e29dafc1efe488f443f1") (:revdesc . "1a236c783958") (:keywords "org" "blocks" "colors" "convenience") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com"))]) + (org-sql . [(20240819 2145) ((emacs (27 1)) (s (1 13)) (f (0 20 0)) (dash (2 19 1)) (org-ml (5 8 8))) "Org-Mode SQL converter" tar ((:url . "https://github.com/ndwarshuis/org-sql") (:commit . "3dbf11d692cf0d5e64235ad4041ed0b5a6775064") (:revdesc . "3dbf11d692cf") (:keywords "org-mode" "data") (:authors ("Nathan Dwarshuis" . "natedwarshuis@gmail.com")) (:maintainers ("Nathan Dwarshuis" . "natedwarshuis@gmail.com")) (:maintainer "Nathan Dwarshuis" . "natedwarshuis@gmail.com"))]) + (org-srs . [(20251223 1556) ((emacs (30 1)) (org (9 7)) (fsrs (6 0))) "A flexible spaced repetition system for Org-mode" tar ((:url . "https://github.com/bohonghuang/org-srs") (:commit . "c0aff45392b1f836fd943467cc266cef50899a44") (:revdesc . "c0aff45392b1") (:keywords "outlines") (:authors ("Bohong Huang" . "bohonghuang@qq.com")) (:maintainers ("Bohong Huang" . "bohonghuang@qq.com")) (:maintainer "Bohong Huang" . "bohonghuang@qq.com"))]) + (org-starter . [(20220326 1106) ((emacs (25 1)) (dash (2 18))) "A basic configuration framework for org mode" tar ((:url . "https://github.com/akirak/org-starter") (:commit . "cd9c5c0402de941299d1c8901f26a8f24d755022") (:revdesc . "cd9c5c0402de") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (org-starter-swiper . [(20220326 1106) ((emacs (25 1)) (swiper (0 11)) (org-starter (0 2 4))) "Swiper for org-starter" tar ((:url . "https://github.com/akirak/org-starter") (:commit . "cd9c5c0402de941299d1c8901f26a8f24d755022") (:revdesc . "cd9c5c0402de") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (org-static-blog . [(20250320 1842) ((emacs (24 3))) "A simple org-mode based static blog generator" tar ((:url . "https://github.com/bastibe/org-static-blog") (:commit . "728968e4a84ba28c5acedc54ece17e49d6811ad9") (:revdesc . "728968e4a84b"))]) + (org-sticky-header . [(20201223 143) ((emacs (24 4)) (org (8 3 5))) "Show off-screen Org heading at top of window" tar ((:url . "http://github.com/alphapapa/org-sticky-header") (:commit . "79136b8c54c48547ba8a07a72a9790cb8e23ecbd") (:revdesc . "79136b8c54c4") (:keywords "hypermedia" "outlines" "org") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-super-agenda . [(20250421 130) ((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 ((:url . "http://github.com/alphapapa/org-super-agenda") (:commit . "fb20ad9c8a9705aa05d40751682beae2d094e0fe") (:revdesc . "fb20ad9c8a97") (:keywords "hypermedia" "outlines" "org" "agenda") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-superstar . [(20250914 1308) ((org (9 1 9)) (emacs (26 1))) "Prettify headings and plain lists in Org mode" tar ((:url . "https://github.com/integral-dw/org-superstar-mode") (:commit . "ce6f7f421f995893f72d75ffdfa92964b9bea2e3") (:revdesc . "ce6f7f421f99") (:keywords "faces" "outlines") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainers ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net"))]) + (org-sync . [(20181204 23) ((cl-lib (0 5)) (org (8 2)) (emacs (24))) "Synchronize Org documents with External Issue Trackers" tar ((:url . "https://github.com/arbox/org-sync") (:commit . "e34a385fa9e658c8341a0a6e6bc3472d4d536bb8") (:revdesc . "e34a385fa9e6") (:keywords "org" "synchronization" "issue tracking" "github" "redmine") (:authors ("Aurelien Aptel" . "aureliendotaptelatgmaildotcom")) (:maintainers ("Andrei Beliankou" . "arbox@yandex.ru")) (:maintainer "Andrei Beliankou" . "arbox@yandex.ru"))]) + (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 ((:url . "https://github.com/abrochard/org-sync-snippets") (:commit . "88f995dea188b8a645a3388c42b62a2bb88953d3") (:revdesc . "88f995dea188") (:keywords "snippet" "org-mode" "yasnippet" "tools"))]) + (org-table-color . [(20220311 1927) ((emacs (26 1))) "Add color to your org-mode table cells" tar ((:url . "https://github.com/fosskers/org-table-color") (:commit . "2022f301ef323953c3a0e087a1b601da85e06da1") (:revdesc . "2022f301ef32") (:keywords "data" "faces" "lisp") (:authors ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca"))]) + (org-table-comment . [(20120209 1851) nil "Org table comment modes" tar ((:url . "http://github.com/mlf176f2/org-table-comment.el") (:commit . "33b9966c33ecbc3e27cca67c2f2cdea04364d74e") (:revdesc . "33b9966c33ec") (:keywords "org-mode" "orgtbl") (:authors ("Matthew L. Fidler" . "matthewdotfidleratgmail.com")))]) + (org-table-highlight . [(20250727 544) ((emacs (27 1))) "Highlight Org table columns and rows" tar ((:url . "https://github.com/llcc/org-table-highlight") (:commit . "bf2ed6ce251ff7b660526f082515e0589d74c2ed") (:revdesc . "bf2ed6ce251f") (:keywords "org-table" "convenience"))]) + (org-table-sticky-header . [(20190924 506) ((org (8 2 10)) (emacs (24 4))) "Sticky header for org-mode tables" tar ((:url . "https://github.com/cute-jumper/org-table-sticky-header") (:commit . "b65442857128ab04724aaa301e60aa874a31a798") (:revdesc . "b65442857128") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (org-tag-beautify . [(20251226 1125) ((emacs (26 1)) (nerd-icons (0 0 1))) "Beautify Org mode tags" tar ((:url . "https://repo.or.cz/org-tag-beautify.git") (:commit . "0013b81cf16436ed29bb2fade47c2be06c7ff79b") (:revdesc . "0013b81cf164") (:keywords "hypermedia"))]) + (org-tag-tree . [(20251109 1131) ((emacs (28 1)) (org (9 0))) "Define Org-mode tag hierarchies from Org subtrees" tar ((:url . "https://github.com/p-snow/org-tag-tree") (:commit . "af2b574dbddac0f73cc03bfb15acfe675f622f83") (:revdesc . "af2b574dbdda") (:keywords "outlines" "convenience") (:authors ("p-snow" . "public@p-snow.org")) (:maintainers ("p-snow" . "public@p-snow.org")) (:maintainer "p-snow" . "public@p-snow.org"))]) + (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 ((:url . "http://github.com/gizmomogwai/org-tagged") (:commit . "4b0174473772fca976426e982bb3f4a3037c1e37") (:revdesc . "4b0174473772") (:keywords "org-mode" "org" "gtd" "tools") (:authors ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainers ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainer "Christian Köstlin" . "christian.koestlin@gmail.com"))]) + (org-tanglesync . [(20200127 1616) ((emacs (24 4))) "Syncing org src blocks with tangled external files" tar ((:url . "https://github.com/mtekman/org-tanglesync.el") (:commit . "31aa5502d1d4f8b032807949908c016b00556684") (:revdesc . "31aa5502d1d4") (:keywords "outlines"))]) + (org-tfl . [(20170923 1218) ((org (0 16 2)) (cl-lib (0 5)) (emacs (24 1))) "Transport for London meets Orgmode" tar ((:url . "https://github.com/storax/org-tfl") (:commit . "f0d7d39106a1de5457f5160cddd98ab892b61066") (:revdesc . "f0d7d39106a1") (:keywords "org" "tfl") (:authors (nil . "zuber[dot]david[at]gmx[dot]de")) (:maintainers (nil . "zuber[dot]david[at]gmx[dot]de")) (:maintainer nil . "zuber[dot]david[at]gmx[dot]de"))]) + (org-tidy . [(20241212 28) ((emacs (27 1)) (dash (2 19 1))) "A minor mode to tidy org-mode buffers" tar ((:url . "https://github.com/jxq0/org-tidy") (:commit . "0bea3a2ceaa999e0ad195ba525c5c1dcf5fba43b") (:revdesc . "0bea3a2ceaa9") (:keywords "convenience" "org") (:authors ("Xuqing Jia" . "jxq@jxq.me")) (:maintainers ("Xuqing Jia" . "jxq@jxq.me")) (:maintainer "Xuqing Jia" . "jxq@jxq.me"))]) + (org-time-budgets . [(20200715 1016) ((alert (0 5 10)) (cl-lib (0 5))) "Define time budgets and display clocked time" tar ((:url . "https://github.com/leoc/org-time-budgets") (:commit . "1d6bfc323013bbf725167842d9e097fad805de03") (:revdesc . "1d6bfc323013") (: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 . [(20241027 805) ((emacs (28 1)) (compat (29 1 4 1)) (org (9 0)) (svg (1 1))) "Interactive SVG calendar for orgmode tasks" tar ((:url . "https://github.com/ichernyshovvv/org-timeblock") (:commit . "e61e5734b49f933ed178029f804a0499f3308e1e") (:revdesc . "e61e5734b49f") (:keywords "org" "calendar" "timeblocking" "agenda") (:authors ("Ilya Chernyshov" . "ichernyshovvv@gmail.com")) (:maintainers ("Ilya Chernyshov" . "ichernyshovvv@gmail.com")) (:maintainer "Ilya Chernyshov" . "ichernyshovvv@gmail.com"))]) + (org-timeline . [(20211110 1952) ((dash (2 13 0)) (emacs (24 3))) "Add graphical view of agenda to agenda buffer" tar ((:url . "https://github.com/Fuco1/org-timeline/") (:commit . "2b300abc8adc9955418fa2334f55e0610bff79f5") (:revdesc . "2b300abc8adc") (:keywords "calendar") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (org-toodledo . [(20150301 1113) ((request-deferred (0 2 0)) (emacs (24)) (cl-lib (0 5))) "Toodledo integration for Emacs Org mode" tar ((:url . "https://github.com/myuhe/org-toodledo") (:commit . "01b53b637f304b89cd3bf2d29009b5ed6ad9466d") (:revdesc . "01b53b637f30") (:keywords "outlines" "data") (:authors ("Christopher J. White" . "emacs@grierwhite.com")) (:maintainers ("Christopher J. White" . "emacs@grierwhite.com")) (:maintainer "Christopher J. White" . "emacs@grierwhite.com"))]) + (org-tracktable . [(20161118 1329) ((emacs (24)) (cl-lib (0 5))) "Track your writing progress in an org-table" tar ((:url . "https://github.com/tty-tourist/org-tracktable") (:commit . "8e0e60a582a034bd66d5efb72d513140b7d4d90a") (:revdesc . "8e0e60a582a0") (:keywords "org" "writing") (:authors ("tty-tourist" . "andreasrasholm@protonmail.com")) (:maintainers ("tty-tourist" . "andreasrasholm@protonmail.com")) (:maintainer "tty-tourist" . "andreasrasholm@protonmail.com"))]) + (org-transclusion-http . [(20240619 2130) ((emacs (28 1)) (org-transclusion (1 4 0)) (plz (0 7 2))) "Transclude over HTTP" tar ((:url . "https://git.sr.ht/~ushin/org-transclusion-http") (:commit . "65caad0d9b19bf19c815bd7c033ffb907c3ebb12") (:revdesc . "65caad0d9b19") (:authors ("Joseph Turner" . "firstnameatushin.org")) (:maintainers ("Joseph Turner" . "~ushin/ushin@lists.sr.ht")) (:maintainer "Joseph Turner" . "~ushin/ushin@lists.sr.ht"))]) + (org-transform-tree-table . [(20200413 1959) ((dash (2 10 0)) (s (1 3 0))) "Transform org-mode tree with properties to a table, and the other way around" tar ((:url . "https://github.com/jplindstrom/emacs-org-transform-tree-table") (:commit . "d84e7fb87bf2d5fc2be252500de0cddf20facf4f") (:revdesc . "d84e7fb87bf2") (:keywords "org-mode" "table" "org-table" "tree" "csv" "convert") (:authors ("Johan Lindstrom" . "buzzwordninjanot_this_bit@googlemail.com")) (:maintainers ("Johan Lindstrom" . "buzzwordninjanot_this_bit@googlemail.com")) (:maintainer "Johan Lindstrom" . "buzzwordninjanot_this_bit@googlemail.com"))]) + (org-tree-slide . [(20230826 1234) ((emacs (25 2))) "A presentation tool for org-mode" tar ((:url . "https://github.com/takaxp/org-tree-slide") (:commit . "941e7e6cb8a5a0b193345263ed912cceecae1887") (:revdesc . "941e7e6cb8a5") (:keywords "convenience" "org-mode" "presentation" "narrowing") (:authors ("Takaaki ISHIKAWA" . "takaxpatieeedotorg")) (:maintainers ("Takaaki ISHIKAWA" . "takaxpatieeedotorg")) (:maintainer "Takaaki ISHIKAWA" . "takaxpatieeedotorg"))]) + (org-tree-slide-pauses . [(20201215 146) ((emacs (24 5)) (org-tree-slide (2 8 4))) "Bring the pause command from Beamer to org-tree-slide" tar ((:url . "https://github.com/cnngimenez/org-tree-slide-pauses") (:commit . "f02af7102e9ecef7c3dac0d376d85bbb8c4de4cc") (:revdesc . "f02af7102e9e") (:keywords "convenience" "org-mode" "presentation"))]) + (org-treescope . [(20200503 1609) ((emacs (24 3)) (org (9 2 3)) (org-ql (0 5 -1)) (dash (2 17 0))) "Time scoping sparse trees within org" tar ((:url . "https://github.com/mtekman/org-treescope.el") (:commit . "a7c386ff134c71fd4f1f042e320751f077d57ddb") (:revdesc . "a7c386ff134c") (:keywords "outlines"))]) + (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 ((:url . "https://github.com/mtekman/org-treeusage.el") (:commit . "c561b3d468aa35e70a43d9a18a4f505996ae882d") (:revdesc . "c561b3d468aa") (:keywords "outlines"))]) + (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 ((:url . "https://github.com/org-trello/org-trello") (:commit . "9c1c94dff1a46631669023286078b887d077c305") (:revdesc . "9c1c94dff1a4") (:keywords "org-mode" "trello" "sync" "org-trello") (:authors ("Antoine R. Dumont" . "antoine.romain.dumont@gmail.com")) (:maintainers ("Antoine R. Dumont" . "antoine.romain.dumont@gmail.com")) (:maintainer "Antoine R. Dumont" . "antoine.romain.dumont@gmail.com"))]) + (org-unique-id . [(20220907 821) ((emacs (25 1)) (org (9 3))) "Create unique IDs for org headers" tar ((:url . "https://labs.phundrak.com/phundrak/org-unique-id") (:commit . "c3a0908ff2123c8786735f3c6f35e905efea2ef6") (:revdesc . "c3a0908ff212") (:keywords "convenience") (:authors ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainers ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com"))]) + (org-upcoming-modeline . [(20241028 1217) ((emacs (26 1)) (ts (0 2)) (org-ql (0 6))) "Show next org event in mode line" tar ((:url . "https://github.com/unhammer/org-upcoming-modeline") (:commit . "66bfdbe847f398f87e8a05c0cf472eb673fac522") (:revdesc . "66bfdbe847f3") (:keywords "convenience" "calendar") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (org-variable-pitch . [(20220220 1757) ((emacs (25))) "Minor mode for variable pitch text in org mode" tar ((:url . "https://dev.gkayaalp.com/elisp/index.html#ovp") (:commit . "350af0e5d53307c900e4f8b2617f3852f51a74d2") (:revdesc . "350af0e5d533") (:keywords "faces") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainers ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com"))]) + (org-vcard . [(20250828 809) ((emacs (24 4))) "Org-mode support for vCard export and import" tar ((:url . "https://github.com/pinoaffe/org-vcard") (:commit . "03c504c34e5c31091d971090b249064e332987d7") (:revdesc . "03c504c34e5c") (:keywords "outlines" "org" "vcard") (:authors ("Alexis" . "flexibeast@gmail.com") ("Will Dey" . "will123dey@gmail.com") ("pinoaffe" . "pinoaffe@gmail.com")) (:maintainers ("pinoaffe" . "pinoaffe@gmail.com")) (:maintainer "pinoaffe" . "pinoaffe@gmail.com"))]) + (org-view-mode . [(20251211 720) ((emacs (25 1))) "Read-only viewer with less markup clutter in org mode files" tar ((:url . "https://github.com/amno1/org-view-mode") (:commit . "8082b9e9841d1a2e947ab7bebbdf0c49c4b64cdf") (:revdesc . "8082b9e9841d") (:keywords "convenience" "outlines" "tools") (:authors ("Arthur Miller" . "arthur.miller@live.com")) (:maintainers ("Arthur Miller" . "arthur.miller@live.com")) (:maintainer "Arthur Miller" . "arthur.miller@live.com"))]) + (org-visibility . [(20220929 1415) ((emacs (27 1))) "Persistent org tree visibility" tar ((:url . "https://github.com/nullman/emacs-org-visibility") (:commit . "afa4b6f8ff274df87eb11f1afd0321084a45a2ab") (:revdesc . "afa4b6f8ff27") (:keywords "outlines" "convenience") (:authors ("Kyle W T Sherman" . "kylewsherman@gmail.com")) (:maintainers ("Kyle W T Sherman" . "kylewsherman@gmail.com")) (:maintainer "Kyle W T Sherman" . "kylewsherman@gmail.com"))]) + (org-wc . [(20251023 1922) nil "Count words in org mode trees" tar ((:url . "https://github.com/tesujimath/org-wc") (:commit . "65e2caaeaeea01b4ab3ab3cd964c911297885a0f") (:revdesc . "65e2caaeaeea"))]) + (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 ((:url . "http://github.com/alphapapa/org-web-tools") (:commit . "7a6498f442fc7f29504745649948635c7165d847") (:revdesc . "7a6498f442fc") (:keywords "hypermedia" "outlines" "org" "web") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (org-web-track . [(20250610 1142) ((emacs (29 1)) (request (0 3 0)) (enlive (0 0 1)) (gnuplot (0 8 1))) "Web data tracking framework in Org Mode" tar ((:url . "https://github.com/p-snow/org-web-track") (:commit . "c32eebcd1794f618b723cbaadae125cc98781121") (:revdesc . "c32eebcd1794") (:keywords "org" "agenda" "web" "hypermedia") (:authors ("p-snow" . "public@p-snow.org")) (:maintainers ("p-snow" . "public@p-snow.org")) (:maintainer "p-snow" . "public@p-snow.org"))]) + (org-working-set . [(20250620 1501) ((org (9 3)) (dash (2 12)) (s (1 12)) (emacs (28 0))) "Manage and visit a small and changing set of org-nodes that you work on" tar ((:url . "https://github.com/marcIhm/org-working-set") (:commit . "ab14880f7875381ba574183af9e4eec0b5975b07") (:revdesc . "ab14880f7875") (:authors ("Marc Ihm" . "marc@ihm.name")) (:maintainers ("Marc Ihm" . "marc@ihm.name")) (:maintainer "Marc Ihm" . "marc@ihm.name"))]) + (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 ((:url . "https://github.com/myuhe/org-wunderlist.el") (:commit . "1a084bb49be4b5a1066db9cd9b7da2f8efab293f") (:revdesc . "1a084bb49be4") (:keywords "convenience") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (org-xlatex . [(20240707 1343) ((emacs (29 1))) "Instant LaTeX preview in an xwidget" tar ((:url . "https://github.com/ksqsf/org-xlatex") (:commit . "8f25ba5e4784b3f12f5ac5c69b1a1d0695c53b8e") (:revdesc . "8f25ba5e4784") (:keywords "convenience" "org" "tex" "preview" "xwidget") (:authors ("ksqsf" . "justksqsf@gmail.com")) (:maintainers ("ksqsf" . "justksqsf@gmail.com")) (:maintainer "ksqsf" . "justksqsf@gmail.com"))]) + (org-zettelkasten . [(20240716 2114) ((emacs (25 1)) (org (9 3))) "A Zettelkasten mode leveraging Org" tar ((:url . "https://sr.ht/~ymherklotz/org-zettelkasten") (:commit . "b6ee54071f9653fb95a33491e2c0152efc3c61c8") (:revdesc . "b6ee54071f96") (:keywords "files" "hypermedia" "org" "notes") (:authors ("Yann Herklotz" . "git@yannherklotz.com")) (:maintainers ("Yann Herklotz" . "git@yannherklotz.com")) (:maintainer "Yann Herklotz" . "git@yannherklotz.com"))]) + (org2blog . [(20250722 223) ((emacs (29 4)) (htmlize (1 58)) (hydra (0 15 0)) (xml-rpc (1 6 15)) (writegood-mode (2 2 0)) (metaweblog (1 1 18))) "Blog from Org mode to WordPress" tar ((:url . "https://github.com/org2blog/org2blog") (:commit . "d0168606e60df2267b451dfe92975ad3f5c7919c") (:revdesc . "d0168606e60d") (:keywords "comm" "convenience" "outlines" "wp") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")) (:maintainers ("Grant Rettke" . "grant@wisdomandwonder.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com"))]) + (org2ctex . [(20200331 550) ((emacs (24 4))) "Export org to ctex (a latex macro for Chinese)" tar ((:url . "https://github.com/tumashu/org2ctex") (:commit . "2e40aa5e78b0562516f46f689e7b74cdf451cc2a") (:revdesc . "2e40aa5e78b0") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (org2elcomment . [(20170324 945) ((org (8 3 4))) "Convert Org file to Elisp comments" tar ((:url . "https://github.com/cute-jumper/org2elcomment") (:commit . "c88a75d9587c484ead18f7adf08592b09c1cceb0") (:revdesc . "c88a75d9587c") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (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 ((:url . "https://github.com/lujun9972/org2issue") (:commit . "910b98c858762fd14b11d261626c5e979dde0833") (:revdesc . "910b98c85876") (:keywords "convenience" "github" "org") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (org2jekyll . [(20210829 1113) ((dash (2 18 0)) (s (1 9 0))) "Minor mode to publish org-mode post to jekyll without specific yaml" tar ((:url . "https://github.com/ardumont/org2jekyll") (:commit . "4393402448da722667f6f5a4d742fa817dec0c0f") (:revdesc . "4393402448da") (:keywords "org-mode" "jekyll" "blog" "publish") (:authors ("Antoine R. Dumont" . "antoine.romain.dumont@gmail.com")) (:maintainers ("Antoine R. Dumont" . "antoine.romain.dumont@gmail.com")) (:maintainer "Antoine R. Dumont" . "antoine.romain.dumont@gmail.com"))]) + (org2web . [(20241226 1757) ((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))) "Static site generator based on org mode" tar ((:url . "https://github.com/tumashu/org2web") (:commit . "0e343770b9785f6150afc98153cd00a316d88d01") (:revdesc . "0e343770b978") (:keywords "org-mode" "convenience" "beautify") (:authors ("Feng Shu" . "tumashuAT163.com") ("Jorge Javier Araya Navarro" . "elcorreoATdeshackra.com") ("Kelvin Hu" . "iniDOTkelvinATgmailDOTcom")) (:maintainers ("Feng Shu" . "tumashuAT163.com") ("Jorge Javier Araya Navarro" . "elcorreoATdeshackra.com") ("Kelvin Hu" . "iniDOTkelvinATgmailDOTcom")) (:maintainer "Feng Shu" . "tumashuAT163.com"))]) + (organic-green-theme . [(20240731 2058) nil "Low-contrast green color theme" tar ((:url . "https://gitlab.com/kostafey/organic-green-theme") (:commit . "8ea2fea0aea27d67448440f22b4ccdf6f9e6e8f6") (:revdesc . "8ea2fea0aea2"))]) + (organize-imports-java . [(20250101 1012) ((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 ((:url . "https://github.com/jcs-elpa/organize-imports-java") (:commit . "6221c85b37d7baee27288848fa38d5519cdeafd5") (:revdesc . "6221c85b37d7") (:keywords "convenience" "organize" "imports" "java" "eclipse") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (orgbox . [(20180827 218) ((org (8 0)) (cl-lib (0 5))) "Mailbox-like task scheduling Org" tar ((:url . "https://github.com/yasuhito/orgbox") (:commit . "609e5e37348815ec3ba53ab6d643e38b0cc4fe17") (:revdesc . "609e5e373488") (:keywords "org") (:authors ("Yasuhito Takamiya" . "yasuhito@gmail.com")) (:maintainers ("Yasuhito Takamiya" . "yasuhito@gmail.com")) (:maintainer "Yasuhito Takamiya" . "yasuhito@gmail.com"))]) + (orgit . [(20251123 1801) ((emacs (28 1)) (compat (30 1)) (cond-let (0 2)) (magit (4 4)) (org (9 7))) "Support for Org links to Magit buffers" tar ((:url . "https://github.com/magit/orgit") (:commit . "0444b8659620e5100ab8d09694c6ffe6841b24cd") (:revdesc . "0444b8659620") (:keywords "hypermedia" "vc") (:authors ("Jonas Bernoulli" . "emacs.orgit@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.orgit@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.orgit@jonas.bernoulli.dev"))]) + (orgit-file . [(20251222 1309) ((emacs (29 1)) (compat (30 1)) (magit (4 3)) (org (9 7)) (orgit (2 0))) "Support for links to files in Git repositories" tar ((:url . "https://github.com/gggion/orgit-file") (:commit . "08f7a16f3cc3d6a85ad4cad89d4c31b3b1c9346d") (:revdesc . "08f7a16f3cc3") (:keywords "hypermedia" "vc"))]) + (orgit-forge . [(20251123 1809) ((emacs (29 1)) (compat (30 1)) (cond-let (0 2)) (forge (0 6)) (magit (4 4)) (org (9 7)) (orgit (2 1))) "Org links to Forge issue buffers" tar ((:url . "https://github.com/magit/orgit-forge") (:commit . "8b3de493a5b6db36c441202d1ba5b95a5be4dd91") (:revdesc . "8b3de493a5b6") (:keywords "hypermedia" "vc") (:authors ("Jonas Bernoulli" . "emacs.orgit-forge@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.orgit-forge@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.orgit-forge@jonas.bernoulli.dev"))]) + (orglink . [(20251101 2047) ((emacs (26 1)) (compat (30 1)) (org (9 7)) (seq (2 24))) "Use Org Mode links in other modes" tar ((:url . "https://github.com/tarsius/orglink") (:commit . "1f76298c90ee1c7f4b1c77ab2389f304ea75fc8b") (:revdesc . "1f76298c90ee") (:keywords "hypermedia") (:authors ("Jonas Bernoulli" . "emacs.orglink@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.orglink@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.orglink@jonas.bernoulli.dev"))]) + (orglue . [(20200411 311) ((org (9 3)) (epic (0 2))) "More functionality to org-mode" tar ((:url . "https://github.com/yoshinari-nomura/orglue") (:commit . "9d5a8e24be9acb8c55bb4d6aa8b98e30e2677401") (:revdesc . "9d5a8e24be9a") (:keywords "org") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net"))]) + (orgmdb . [(20251105 2227) ((emacs (27 1)) (dash (2 11 0)) (s (1 12 0)) (org (8 0 0))) "An OMDb API client with some convenience functions" tar ((:url . "https://github.com/isamert/orgmdb.el") (:commit . "416b2d6e9a9db179d69798d0f034307dc9cc762d") (:revdesc . "416b2d6e9a9d") (:authors ("Isa Mert Gurbuz" . "isamert@protonmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamert@protonmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamert@protonmail.com"))]) + (orgnav . [(20170608 1713) ((helm (2 7 0)) (s (1 11 0)) (dash (1 11 0)) (emacs (24))) "Org tree navigation using helm" tar ((:url . "http://github.com/facetframer/orgnav") (:commit . "9e2cac9c1a67af5f0080e60022e821bf7b70312d") (:revdesc . "9e2cac9c1a67") (:keywords "convenience" "outlines") (:authors ("Facet Framer" . "(facet@facetframer.com)")) (:maintainers ("Facet Framer" . "(facet@facetframer.com)")) (:maintainer "Facet Framer" . "(facet@facetframer.com)"))]) + (orgnote . [(20240814 2021) ((emacs (27 1))) "Sync org-roam notes with OrgNote app" tar ((:url . "https://github.com/Artawower/orgnote.el") (:commit . "d2d0c8d16ea2dbcc29b79f9d4a48e03e90c3f57d") (:revdesc . "d2d0c8d16ea2") (:authors ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainers ("Artur Yaroshenko" . "artawower@protonmail.com")) (:maintainer "Artur Yaroshenko" . "artawower@protonmail.com"))]) + (orgstrap . [(20250316 1815) ((emacs (24 4))) "Bootstrap an Org file using file local variables" tar ((:url . "https://github.com/tgbugs/orgstrap") (:commit . "67f4f61716750b4cf4da715b40a19c5ed4bb505c") (:revdesc . "67f4f6171675") (:keywords "lisp" "org" "org-mode" "bootstrap"))]) + (orgtbl-aggregate . [(20251216 1352) ((emacs (26 1))) "Aggregate an Org Mode table | + | + | into another table" tar ((:url . "https://github.com/tbanel/orgaggregate/blob/master/README.org") (:commit . "710bcf8705aaf94ff749f41eead9d7a774a7d788") (:revdesc . "710bcf8705aa") (:keywords "data" "extensions"))]) + (orgtbl-ascii-plot . [(20230122 816) nil "Ascii-art bar plots in org-mode tables" tar ((:url . "https://github.com/tbanel/orgtblasciiplot") (:commit . "4160128045b271bc1aef3d14dbf0c5b53ae58bd2") (:revdesc . "4160128045b2") (:keywords "org" "table" "ascii" "plot"))]) + (orgtbl-fit . [(20251223 923) ((emacs (24 4))) "Fit an Org Mode column using Calc regression methods" tar ((:url . "https://github.com/tbanel/orgtblfit/blob/master/README.org") (:commit . "a4731d4a3b5f8ca405090ee0079ba660cfca3d78") (:revdesc . "a4731d4a3b5f") (:keywords "data" "extensions"))]) + (orgtbl-join . [(20251216 931) ((emacs (24 3))) "Join columns from other Org Mode tables" tar ((:url . "https://github.com/tbanel/orgtbljoin/blob/master/README.org") (:commit . "efc557bdb2dd4edeeabb473476d0dc2b207ea28d") (:revdesc . "efc557bdb2dd") (:keywords "data" "extensions"))]) + (orgtbl-show-header . [(20230903 903) nil "Show the header of the current column in the minibuffer" tar ((:url . "https://github.com/DamienCassou/orgtbl-show-header") (:commit . "1ab18f5afa2b01e67618ada0d40e6b7a65d9d14c") (:revdesc . "1ab18f5afa2b") (: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 ((:url . "https://github.com/gregsexton/origami.el") (:commit . "e558710a975e8511b9386edc81cd6bdd0a5bda74") (:revdesc . "e558710a975e") (:keywords "folding") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainers ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com"))]) + (origami-predef . [(20200615 1044) ((emacs (24 3)) (origami (1 0))) "Apply folding when finding (opening) files" tar ((:url . "https://github.com/alvarogonzalezsotillo/origami-predef") (:commit . "edcba971ba52a14f69a436ad47888827d7927982") (:revdesc . "edcba971ba52") (:keywords "convenience" "folding") (:authors ("lvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainers ("lvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "lvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com"))]) + (ormolu . [(20220530 921) ((emacs (24)) (reformatter (0 4))) "Format Haskell source code using the \"ormolu\" program" tar ((:url . "https://github.com/vyorkin/ormolu.el") (:commit . "a6b1d3f8838d067ac5352fb0673c3c3dae7abd73") (:revdesc . "a6b1d3f8838d") (:keywords "files" "tools") (:authors ("Vasiliy Yorkin" . "vasiliy.yorkin@gmail.com")))]) + (orthodox-christian-new-calendar-holidays . [(20210830 1657) nil "Feasts (NS)" tar ((:url . "https://github.com/cmchittom/orthodox-christian-new-calendar-holidays") (:commit . "6869024ecd45eefd0ec648979c6a59d7c79770e0") (:revdesc . "6869024ecd45") (:keywords "calendar") (:authors ("Carson Chittom" . "carson@wistly.net")) (:maintainers ("Carson Chittom" . "carson@wistly.net")) (:maintainer "Carson Chittom" . "carson@wistly.net"))]) + (osa . [(20200522 2103) ((emacs (25 1))) "OSA (JavaScript / AppleScript) bridge" tar ((:url . "https://github.com/atomontage/osa") (:commit . "615ca9eef4131a23d9971691fa0d0f20fe59d01b") (:revdesc . "615ca9eef413") (:keywords "extensions") (:authors ("xristos" . "xristos@sdf.org")) (:maintainers ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org"))]) + (osa-chrome . [(20250129 1831) ((emacs (25 1)) (osa (1 0))) "Google Chrome remote tab control" tar ((:url . "https://github.com/atomontage/osa-chrome") (:commit . "53a139a6c56d52d9bddbf420b0e65f042a1259eb") (:revdesc . "53a139a6c56d") (:keywords "comm") (:authors ("xristos" . "xristos@sdf.org")) (:maintainers ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org"))]) + (osm . [(20251224 940) ((emacs (29 1)) (compat (30))) "OpenStreetMap viewer" tar ((:url . "https://github.com/minad/osm") (:commit . "bf7e02e4492c4bc5cd31bd80e0cd26767c86d370") (:revdesc . "bf7e02e4492c") (:keywords "network" "multimedia" "hypermedia" "mouse") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (osx-browse . [(20140508 2041) ((string-utils (0 3 2)) (browse-url-dwim (0 6 6))) "Web browsing helpers for OS X" tar ((:url . "http://github.com/rolandwalker/osx-browse") (:commit . "838b81625853e04919fbb56fd21f387762b2e3f5") (:revdesc . "838b81625853") (:keywords "hypermedia" "external") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (osx-clipboard . [(20141012 717) nil "Use the OS X clipboard from terminal Emacs" tar ((:url . "https://github.com/joddie/osx-clipboard-mode") (:commit . "e46dd31327a3f92f77b013b4c9b1e5fdd0e5c73d") (:revdesc . "e46dd31327a3") (:authors ("Jon Oddie" . "jonxfieldatgmail.com")) (:maintainers ("Jon Oddie" . "jonxfieldatgmail.com")) (:maintainer "Jon Oddie" . "jonxfieldatgmail.com"))]) + (osx-dictionary . [(20240330 942) ((cl-lib (0 5))) "Interface for OSX Dictionary.app" tar ((:url . "https://github.com/xuchunyang/osx-dictionary.el") (:commit . "6abfd6908b0dc773020466225c908000870b383b") (:revdesc . "6abfd6908b0d") (:keywords "mac" "dictionary") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (osx-lib . [(20211206 619) ((emacs (24 4))) "Basic functions for Apple/OSX" tar ((:url . "https://github.com/raghavgautam/osx-lib") (:commit . "7afdb57edd5725e8a66f841a90fa571a4cbb81e7") (:revdesc . "7afdb57edd57") (:keywords "apple" "applescript" "osx" "finder" "emacs" "elisp" "vpn" "speech") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainers ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainer "Raghav Kumar Gautam" . "raghav@apache.org"))]) + (osx-location . [(20200304 2209) ((emacs (24 1))) "Watch and respond to changes in geographical location on OS X" tar ((:url . "https://github.com/purcell/osx-location") (:commit . "733f116dbc56ac73bee3cebe4a489dc9eb37ab78") (:revdesc . "733f116dbc56") (:keywords "convenience" "calendar") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (osx-org-clock-menubar . [(20150205 2111) nil "Simple menubar integration for org-clock" tar ((:url . "https://github.com/jordonbiondo/osx-org-clock-menubar") (:commit . "9964d2a97cc2fb6570dc4116da44f73bd8eb7cb3") (:revdesc . "9964d2a97cc2") (:keywords "org" "osx") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainers ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com"))]) + (osx-plist . [(20200212 1724) ((emacs (25 1))) "Apple plist file parser" tar ((:url . "https://github.com/gonewest818/osx-plist") (:commit . "cd86c03a52eab9b1a1496618809155b25b030ba6") (:revdesc . "cd86c03a52ea") (:keywords "convenience") (:authors ("Theresa O'Connor" . "tess@oconnor.cx")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (osx-pseudo-daemon . [(20240922 2024) ((mac-pseudo-daemon (2 2))) "Daemon mode that plays nice with OSX" tar ((:url . "https://github.com/DarwinAwardWinner/mac-pseudo-daemon") (:commit . "c2326fe5baf53790d51386a75f09a114e0678c5e") (:revdesc . "c2326fe5baf5") (:keywords "convenience" "osx"))]) + (osx-trash . [(20220913 1736) ((emacs (24 1))) "System trash for OS X" tar ((:url . "https://github.com/lunaryorn/osx-trash.el") (:commit . "90f0c99206022fec646206018fcd63d9d2e57325") (:revdesc . "90f0c9920602") (:keywords "files" "convenience" "tools" "unix") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com"))]) + (otama . [(20160404 1032) nil "Org-table Manipulator" tar ((:url . "https://github.com/yoshinari-nomura/otama") (:commit . "b69e0740846ace7885b0c0717f7abe8d0419eefd") (:revdesc . "b69e0740846a") (:keywords "database" "org-mode") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainers ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net"))]) + (other-emacs-eval . [(20180408 1348) ((emacs (25 1)) (async (1 9 2))) "Evaluate the Emacs Lisp expression in other Emacs" tar ((:url . "https://github.com/xuchunyang/other-emacs-eval") (:commit . "8ace5acafef65daabf0c6619eff60733d7f5d792") (:revdesc . "8ace5acafef6") (:keywords "tools") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (otpp . [(20250909 2023) ((emacs (28 1)) (compat (29 1))) "One tab per project, with unique names" tar ((:url . "https://github.com/abougouffa/one-tab-per-project") (:commit . "fb8e72b924013443ba810ad5347d6ca39f005158") (:revdesc . "fb8e72b92401") (:keywords "convenience") (:authors ("Abdelhak Bougouffa (rot13" . "\"nobhtbhssn@srqbencebwrpg.bet\")")) (:maintainers ("Abdelhak Bougouffa (rot13" . "\"nobhtbhssn@srqbencebwrpg.bet\")")) (:maintainer "Abdelhak Bougouffa (rot13" . "\"nobhtbhssn@srqbencebwrpg.bet\")"))]) + (ouroboros . [(20230606 1150) ((emacs (27 1)) (dash (2 19 0)) (cbor (0 2 5)) (bech32 (0 2 1))) "Ouroboros network mini-protocol" tar ((:url . "https://github.com/Titan-C/cardano.el") (:commit . "cf85424b305e8f89debb756dc67eebc84639f711") (:revdesc . "cf85424b305e") (:authors ("Oscar Najera" . "https://oscarnajera.com")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com"))]) + (outli . [(20251012 1930) ((emacs (27 1))) "Org-like code outliner" tar ((:url . "https://github.com/jdtsmith/outli") (:commit . "009e74c1757143040a0427f477ae882107b14592") (:revdesc . "009e74c17571") (:keywords "convenience" "outlines" "org") (:authors ("J.D. Smith" . "jdtsmith@gmail.com")) (:maintainers ("J.D. Smith" . "jdtsmith@gmail.com")) (:maintainer "J.D. Smith" . "jdtsmith@gmail.com"))]) + (outline-indent . [(20251103 1434) ((emacs (26 1))) "Folding text based on indentation (origami alternative)" tar ((:url . "https://github.com/jamescherti/outline-indent.el") (:commit . "832595bc0f6699171e9ebcafce3952e2a151cb26") (:revdesc . "832595bc0f66") (:keywords "outlines"))]) + (outline-magic . [(20180619 1819) nil "Outline mode extensions for Emacs" tar ((:url . "https://github.com/tj64/outline-magic") (:commit . "2a5f07417b696cf7541d435c43bafcc64817636b") (:revdesc . "2a5f07417b69") (:keywords "outlines") (:authors ("Carsten Dominik" . "dominik@science.uva.nl")) (:maintainers ("Thorsten Jolitz" . "tjolitzATgmailDOTcom")) (:maintainer "Thorsten Jolitz" . "tjolitzATgmailDOTcom"))]) + (outline-minor-faces . [(20251101 1934) ((emacs (27 1)) (compat (30 1))) "Highlight only section headings" tar ((:url . "https://github.com/tarsius/outline-minor-faces") (:commit . "67a100641d0da0e75bd1f69b760e2b6c39fcb920") (:revdesc . "67a100641d0d") (:keywords "faces" "outlines") (:authors ("Jonas Bernoulli" . "emacs.outline-minor-faces@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.outline-minor-faces@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.outline-minor-faces@jonas.bernoulli.dev"))]) + (outline-toc . [(20200401 1208) nil "Sidebar showing a \"table of contents\"" tar ((:url . "https://github.com/abingham/outline-toc.el") (:commit . "81d373633b40628cc3a6b6fb534fd7730076bcdb") (:revdesc . "81d373633b40") (:keywords "convenience" "outlines") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (outlook . [(20180428 1430) ((emacs (24 4))) "Send emails in MS Outlook style" tar ((:url . "https://github.com/asavonic/outlook.el") (:commit . "b6a7a06b996d84647e8024412876e9e76ca884e4") (:revdesc . "b6a7a06b996d") (:keywords "mail"))]) + (outorg . [(20190720 2002) ((emacs (24 4))) "Org-style comment editing" tar ((:url . "https://github.com/alphapapa/outorg") (:commit . "ef0f86f4b893b30be8bcf8b43a5ec357a6c70f07") (:revdesc . "ef0f86f4b893") (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (outrespace . [(20220218 1936) ((emacs (24 4))) "Some c++ namespace utility functions" tar ((:url . "https://github.com/articuluxe/outrespace.git") (:commit . "3c8efa5e7903d88a2e81178a5def627f37379ee4") (:revdesc . "3c8efa5e7903") (:keywords "tools" "c++" "namespace") (:authors ("Dan Harms" . "danielrharms@gmail.com")) (:maintainers ("Dan Harms" . "danielrharms@gmail.com")) (:maintainer "Dan Harms" . "danielrharms@gmail.com"))]) + (outshine . [(20220326 540) ((outorg (2 0)) (cl-lib (0 5))) "Outline with outshine outshines outline" tar ((:url . "https://github.com/alphapapa/outshine") (:commit . "bf1eed10dd7a89b63d0fc014944033db397c1e23") (:revdesc . "bf1eed10dd7a") (:keywords "convenience" "outlines" "org") (:maintainers ("Thibault Polge" . "thibault@thb.lt")) (:maintainer "Thibault Polge" . "thibault@thb.lt"))]) + (ov . [(20230522 1117) ((emacs (24 3))) "Overlay library for Emacs Lisp" tar ((:url . "https://github.com/ShingoFukuyama/ov.el") (:commit . "e2971ad986b6ac441e9849031d34c56c980cf40b") (:revdesc . "e2971ad986b6") (:keywords "convenience" "overlay"))]) + (overcast-theme . [(20200425 1601) ((emacs (24))) "A dark but vibrant color theme for Emacs" tar ((:url . "http://ismail.teamfluxion.com") (:commit . "e02b835a08919ead079d7221d513348ac02ba92e") (:revdesc . "e02b835a0891") (:keywords "theme") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainers ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com"))]) + (overleaf . [(20250728 2103) ((emacs (29 4)) (plz (0 9)) (websocket (1 15)) (webdriver (0 1)) (posframe (1 4 4))) "Sync and track changes live with overleaf" tar ((:url . "https://github.com/vale981/overleaf.el") (:commit . "515e45df1bec11e1c0cd2dc4810c48f8ad0685cb") (:revdesc . "515e45df1bec") (:keywords "hypermedia" "tex" "comm") (:maintainers ("Valentin Boettcher" . "overleafatprotagon.space")) (:maintainer "Valentin Boettcher" . "overleafatprotagon.space"))]) + (overseer . [(20240109 800) ((emacs (24)) (dash (2 10 0)) (pkg-info (0 4)) (f (0 18 1))) "Ert-runner Integration Into Emacs" tar ((:url . "http://www.github.com/tonini/overseer.el") (:commit . "7fdcf1a6fba6b1569a09c1666b4e51bcde266ed9") (:revdesc . "7fdcf1a6fba6") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainers ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com"))]) + (ovpn-mode . [(20250916 7) ((emacs (25)) (cl-lib (0 5))) "An openvpn management mode" tar ((:url . "https://github.com/anticomputer/ovpn-mode") (:commit . "0474294b76f3a7b468c94090352fe71f7aedeebf") (:revdesc . "0474294b76f3") (:keywords "comm") (:authors ("Bas Alberts" . "bas@anti.computer")) (:maintainers ("Bas Alberts" . "bas@anti.computer")) (:maintainer "Bas Alberts" . "bas@anti.computer"))]) + (owcmd . [(20200517 2039) ((emacs (26 3))) "Run a single command in the other window" tar ((:url . "https://github.com/fishyfriend/owcmd") (:commit . "05fb8f8f81838b5888fdec8b3947096dd2222e61") (:revdesc . "05fb8f8f8183") (:keywords "convenience") (:authors ("Jacob First" . "jacob.first@member.fsf.org")) (:maintainers ("Jacob First" . "jacob.first@member.fsf.org")) (:maintainer "Jacob First" . "jacob.first@member.fsf.org"))]) + (owdriver . [(20240211 457) ((log4e (0 4 1)) (yaxception (1 0 0))) "Quickly perform various actions on other windows" tar ((:url . "https://github.com/aki2o/owdriver") (:commit . "ae96f3ff7aca560a872c77d40999f1527f7f84eb") (:revdesc . "ae96f3ff7aca") (:keywords "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (ox-750words . [(20220625 1407) ((emacs (24 4)) (750words (0 0 1))) "Org mode exporter for 750words.com" tar ((:url . "https://github.com/zzamboni/750words-client") (:commit . "43eee19428fc8f5a133192398510d7313eb33d97") (:revdesc . "43eee19428fc") (:keywords "files" "org" "writing") (:authors ("Diego Zamboni" . "https://github.com/zzamboni")) (:maintainers ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org"))]) + (ox-asciidoc . [(20240821 2247) ((org (8 1))) "AsciiDoc Back-End for Org Export Engine" tar ((:url . "https://github.com/yashi/org-asciidoc") (:commit . "a8d49c44cc9aa8a3f384155f0ae052dbf36df00c") (:revdesc . "a8d49c44cc9a") (:keywords "org" "asciidoc") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainers ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com"))]) + (ox-bb . [(20240907 1042) ((emacs (24 4)) (org (8 0))) "BBCode Back-End for Org Export Engine" tar ((:url . "https://github.com/mmitch/ox-bb") (:commit . "4d0a3ea6c4509ecb73a288da11140b588a902e76") (:revdesc . "4d0a3ea6c450") (:keywords "bbcode" "org" "export" "outlines") (:authors ("Christian Garbs" . "mitch@cgarbs.de")) (:maintainers ("Christian Garbs" . "mitch@cgarbs.de")) (:maintainer "Christian Garbs" . "mitch@cgarbs.de"))]) + (ox-beamer-lecture . [(20250918 358) ((emacs (29 1))) "Beamer Lecture Back-End for Org Export Engine" tar ((:url . "https://github.com/fjesser/ox-beamer-lecture") (:commit . "d9cb630ab5d9e5ef58f68216a4b9e472d67eb46e") (:revdesc . "d9cb630ab5d9") (:keywords "org" "text" "tex") (:authors ("Felix J. Esser" . "code-esser@mailbox.org")) (:maintainers ("Felix J. Esser" . "code-esser@mailbox.org")) (:maintainer "Felix J. Esser" . "code-esser@mailbox.org"))]) + (ox-bibtex-chinese . [(20170723 309) ((emacs (24 4))) "Let ox-bibtex work well for Chinese users" tar ((:url . "https://github.com/tumashu/ox-bibtex-chinese.git") (:commit . "2ad2364399229144110db7ef6365ad0461d6a38c") (:revdesc . "2ad236439922") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (ox-clip . [(20240310 1513) ((org (8 2)) (htmlize (0))) "Cross-platform formatted copying for org-mode" tar ((:url . "https://github.com/jkitchin/ox-clip") (:commit . "a549cc8e1747beb6b7e567ffac27e31ba45cb8e8") (:revdesc . "a549cc8e1747") (:keywords "org-mode") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainers ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu"))]) + (ox-epub . [(20181101 1854) ((emacs (24 3)) (org (9))) "Export org mode projects to EPUB" tar ((:url . "http://github.com/ofosos/org-epub") (:commit . "a66eeb00daa01ad403ac1a1db953ddbf9054be07") (:revdesc . "a66eeb00daa0") (:keywords "hypermedia") (:authors ("Mark Meyer" . "mark@ofosos.org")) (:maintainers ("Mark Meyer" . "mark@ofosos.org")) (:maintainer "Mark Meyer" . "mark@ofosos.org"))]) + (ox-gemini . [(20240221 2127) ((emacs (26 1))) "Output gemini formatted documents from org-mode" tar ((:url . "https://git.sr.ht/~abrahms/ox-gemini") (:commit . "50818de823b7929f2d3207833e7c581280a60289") (:revdesc . "50818de823b7") (:keywords "lisp" "gemini") (:authors ("Justin Abrahms" . "justin@abrah.ms")) (:maintainers ("Justin Abrahms" . "justin@abrah.ms")) (:maintainer "Justin Abrahms" . "justin@abrah.ms"))]) + (ox-gfm . [(20231215 1901) nil "Github Flavored Markdown Back-End for Org Export Engine" tar ((:url . "https://github.com/larstvei/ox-gfm") (:commit . "4f774f13d34b3db9ea4ddb0b1edc070b1526ccbb") (:revdesc . "4f774f13d34b") (: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 ((:url . "https://github.com/punchagan/org2gist/") (:commit . "e9f1f11af0e97fee30c2b15b56c236b1f4e1f400") (:revdesc . "e9f1f11af0e9") (:keywords "org" "lisp" "gist" "github") (:authors ("Puneeth Chaganti" . "punchagan+emacs@muse-amuse.in")) (:maintainers ("Puneeth Chaganti" . "punchagan+emacs@muse-amuse.in")) (:maintainer "Puneeth Chaganti" . "punchagan+emacs@muse-amuse.in"))]) + (ox-haunt . [(20230725 1) ((emacs (26 1))) "Haunt-flavored HTML backend for the Org export engine" tar ((:url . "https://git.sr.ht/~jakob/ox-haunt") (:commit . "1c8c70e3173f98206768c15cb2e4de706559f151") (:revdesc . "1c8c70e3173f") (:keywords "convenience" "hypermedia" "wp") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainers ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org"))]) + (ox-html5slide . [(20221025 521) ((org (8 0))) "Export org-mode to HTML5 slide" tar ((:url . "http://github.com/coldnew/org-html5slide") (:commit . "4e0d9026c96e1dde22cca7c700669f1f863a9d07") (:revdesc . "4e0d9026c96e") (:keywords "html" "presentation") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com"))]) + (ox-hugo . [(20251206 1738) ((emacs (26 3)) (tomelr (0 4 3))) "Hugo Markdown Back-End for Org Export Engine" tar ((:url . "https://ox-hugo.scripter.co") (:commit . "b7dc44dc28911b9d8e3055a18deac16c3b560b03") (:revdesc . "b7dc44dc2891") (:keywords "org" "markdown" "docs") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com") ("Matt Price" . "moptop99@gmail.com")) (:maintainers ("Kaushal Modi" . "kaushal.modi@gmail.com") ("Matt Price" . "moptop99@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com"))]) + (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 ((:url . "http://github.com/coldnew/org-ioslide") (:commit . "6555680be5364c8ddd2bf446865cb1a82adb6b9e") (:revdesc . "6555680be536") (:keywords "html" "presentation") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com"))]) + (ox-jekyll-md . [(20211222 1718) nil "Export Jekyll on Markdown articles using org-mode" tar ((:url . "https://github.com/gonsie/ox-jekyll-md") (:commit . "26edb3f4575bcb0f1a2aed56237cd89694284449") (:revdesc . "26edb3f4575b") (:keywords "org" "jekyll") (:authors ("Elsa Gonsiorowski" . "gonsie@me.com")) (:maintainers ("Elsa Gonsiorowski" . "gonsie@me.com")) (:maintainer "Elsa Gonsiorowski" . "gonsie@me.com"))]) + (ox-jira . [(20241014 953) ((org (8 3))) "JIRA Backend for Org Export Engine" tar ((:url . "https://github.com/stig/ox-jira.el") (:commit . "6c2013088f442530cbd895abcf4a290c06e2beb0") (:revdesc . "6c2013088f44") (:keywords "outlines" "hypermedia" "wp") (:authors ("Stig Brautaset" . "stig@brautaset.org")) (:maintainers ("Stig Brautaset" . "stig@brautaset.org")) (:maintainer "Stig Brautaset" . "stig@brautaset.org"))]) + (ox-json . [(20250825 125) ((emacs (26 1)) (org (9)) (s (1 12))) "JSON export backend for Org mode" tar ((:url . "https://github.com/jlumpe/ox-json") (:commit . "0f7c63b9bbbf6c8b2547e46adc7f34289869105f") (:revdesc . "0f7c63b9bbbf") (:keywords "outlines") (:authors ("Jared Lumpe" . "jared@jaredlumpe.com")) (:maintainers ("Jared Lumpe" . "jared@jaredlumpe.com")) (:maintainer "Jared Lumpe" . "jared@jaredlumpe.com"))]) + (ox-latex-subfigure . [(20200326 919) ((emacs (24 4)) (org (9 0))) "Subfigure for latex export" tar ((:url . "http://github.com/linktohack/ox-latex-subfigure") (:commit . "be0a0dde62fde8cdf8d72b6968344906aa8c6f54") (:revdesc . "be0a0dde62fd") (:keywords "convenience" "ox" "latex" "subfigure" "org" "org-mode") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainers ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com"))]) + (ox-leanpub . [(20251028 957) ((org (9 1)) (ox-gfm (1 0)) (emacs (26 1)) (s (1 12 0))) "Export Org documents to Leanpub book format" tar ((:url . "https://gitlab.com/zzamboni/ox-leanpub") (:commit . "c1550a1f828afeee909850f51d7a0219a261e280") (:revdesc . "c1550a1f828a") (:keywords "files" "org" "leanpub") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainers ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org"))]) + (ox-linuxmag-fr . [(20250907 1103) ((emacs (28 1))) "Org-mode exporter for the French GNU/Linux Magazine" tar ((:url . "https://github.com/DamienCassou/ox-linuxmag-fr") (:commit . "67381be882a384e0e0ed810b24556148c0eb6b9f") (:revdesc . "67381be882a3"))]) + (ox-mdx-deck . [(20181115 1847) ((emacs (24)) (ox-hugo (0 7))) "Org-mode to mdx-deck exporter" tar ((:url . "https://github.com/WolfeCub/ox-mdx-deck/") (:commit . "f3dbc35870b69a5d8971b1647da8c5468f520c5d") (:revdesc . "f3dbc35870b6") (:keywords "lisp" "org" "ox" "mdx" "deck"))]) + (ox-mediawiki . [(20230425 115) ((cl-lib (0 5)) (s (1 9 0))) "Mediawiki Back-End for Org Export Engine" tar ((:url . "https://github.com/tomalexander/orgmode-mediawiki") (:commit . "fa4954c12ab339ac8adf2830141390e71ee13067") (:revdesc . "fa4954c12ab3") (:keywords "org" "wp" "mediawiki") (:authors ("Tom Alexander" . "tomalexander@paphus.com")) (:maintainers ("Tom Alexander" . "tomalexander@paphus.com")) (:maintainer "Tom Alexander" . "tomalexander@paphus.com"))]) + (ox-minutes . [(20180202 1734) ((emacs (24 4))) "Plain text backend for Org for Meeting Minutes" tar ((:url . "https://github.com/kaushalmodi/ox-minutes") (:commit . "27c29f3fdb9181322ae56f8bace8d95e621230e5") (:revdesc . "27c29f3fdb91") (:keywords "org" "exporter" "notes") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainers ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com"))]) + (ox-nikola . [(20151114 1116) ((emacs (24 4)) (org (8 2 4)) (ox-rst (0 2))) "Export Nikola articles using org-mode" tar ((:url . "https://github.com/masayuko/ox-nikola") (:commit . "5bcbc1a38f6619f62294194f13ca0cd4ca14dd48") (:revdesc . "5bcbc1a38f66") (:keywords "org" "nikola") (:authors ("IGARASHI Masanao" . "syoux2@gmail.com")) (:maintainers ("IGARASHI Masanao" . "syoux2@gmail.com")) (:maintainer "IGARASHI Masanao" . "syoux2@gmail.com"))]) + (ox-pandoc . [(20250424 908) ((org (8 2)) (emacs (24 4)) (dash (2 8)) (ht (2 0))) "An Org-mode exporter using pandoc" tar ((:url . "https://github.com/a-fent/ox-pandoc") (:commit . "5766c70b6db5a553829ccdcf52fcf3c6244e443d") (:revdesc . "5766c70b6db5") (:keywords "tools") (:authors ("Taichi" . "kawabata.taichi@gmail.com") ("Alex" . "a-fent@github")) (:maintainers ("Alex" . "a-fent@github")) (:maintainer "Alex" . "a-fent@github"))]) + (ox-qmd . [(20230325 1315) ((emacs (27 2)) (request (0 3 3)) (mimetypes (1 0))) "Qiita Markdown Back-End for Org Export Engine" tar ((:url . "https://github.com/0x60df/ox-qmd") (:commit . "0b5fa1e20aaa48d93600e1b8d09c3b6f55af3373") (:revdesc . "0b5fa1e20aaa") (:keywords "wp") (:authors ("0x60DF" . "0x60DF@gmail.com")) (:maintainers ("0x60DF" . "0x60DF@gmail.com")) (:maintainer "0x60DF" . "0x60DF@gmail.com"))]) + (ox-report . [(20250611 2053) ((emacs (24 4)) (org-msg (3 9))) "Export your org file to minutes report PDF file" tar ((:url . "https://github.com/DarkBuffalo/ox-report") (:commit . "81973dafc10fd06d46b8f7abaab9ac90ff5ccca2") (:revdesc . "81973dafc10f") (:keywords "org" "outlines" "report" "exporter" "meeting" "minutes") (:authors ("Matthias David" . "db@gnu.re")) (:maintainers ("Matthias David" . "db@gnu.re")) (:maintainer "Matthias David" . "db@gnu.re"))]) + (ox-reveal . [(20221127 814) ((org (8 3))) "Reveal.js Presentation Back-End for Org Export Engine" tar ((:url . "https://github.com/yjwen/org-reveal") (:commit . "f55c851bf6aeb1bb2a7f6cf0f2b7bd0e79c4a5a0") (:revdesc . "f55c851bf6ae") (:keywords "outlines" "hypermedia" "slideshow" "presentation") (:authors ("Yujie Wen" . "yjwen.tyatgmaildotcom")) (:maintainers ("Yujie Wen" . "yjwen.tyatgmaildotcom")) (:maintainer "Yujie Wen" . "yjwen.tyatgmaildotcom"))]) + (ox-review . [(20250826 1233) ((emacs (26 1)) (org (9))) "Re:VIEW Back-End for Org Export Engine" tar ((:url . "https://github.com/masfj/ox-review") (:commit . "516bce8fb298e84d813d3c65b9cba200fa72e3b0") (:revdesc . "516bce8fb298") (:keywords "outlines" "hypermedia"))]) + (ox-rfc . [(20240901 1714) ((emacs (24 3)) (org (8 3))) "RFC Back-End for Org Export Engine" tar ((:url . "https://github.com/choppsv1/org-rfc-export") (:commit . "ab66ace2f6306828c0842fdd729e018cc2395c94") (:revdesc . "ab66ace2f630") (:keywords "org" "rfc" "wp" "xml") (:authors ("Christian Hopps" . "chopps@devhopps.com")) (:maintainers ("Christian Hopps" . "chopps@devhopps.com")) (:maintainer "Christian Hopps" . "chopps@devhopps.com"))]) + (ox-rss . [(20230408 231) ((emacs (26 1)) (org (9 3))) "RSS 2.0 Back-End for Org Export Engine" tar ((:url . "https://github.com/benedicthw/ox-rss.git") (:commit . "ee7347fca8f10a4b53075a8d1e3cac3aff6e6dac") (:revdesc . "ee7347fca8f1") (:keywords "org" "wp" "blog" "feed" "rss") (:authors ("Bastien Guerry" . "bzg@gnu.org")) (:maintainers ("Benedict Wang" . "foss@bhw.name")) (:maintainer "Benedict Wang" . "foss@bhw.name"))]) + (ox-rst . [(20250428 534) ((emacs (25 1)) (org (8 3))) "Export reStructuredText using org-mode" tar ((:url . "https://github.com/msnoigrs/ox-rst") (:commit . "b73eff187eebac24b457688bfd27f09eff434860") (:revdesc . "b73eff187eeb") (:keywords "org" "rst" "rest" "restructuredtext") (:authors ("Masanao Igarashi" . "syoux2@gmail.com")) (:maintainers ("Masanao Igarashi" . "syoux2@gmail.com")) (:maintainer "Masanao Igarashi" . "syoux2@gmail.com"))]) + (ox-slack . [(20200108 1546) ((emacs (24)) (org (9 1 4)) (ox-gfm (1 0))) "Slack Exporter for org-mode" tar ((:url . "https://github.com/titaniumbones/ox-slack") (:commit . "c55b003f4ac343d6c6d8ef7cbe01d0d100abac34") (:revdesc . "c55b003f4ac3") (:keywords "org" "slack" "outlines"))]) + (ox-spectacle . [(20250218 1032) ((emacs (28 1)) (org (8 3))) "Spectacle.js Presentation Back-End for Org Export Engine" tar ((:url . "https://github.com/lorniu/ox-spectacle") (:commit . "42bf787371560f89bdffafcec689f133a13b63ea") (:revdesc . "42bf78737156") (:keywords "convenience") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com"))]) + (ox-ssh . [(20210917 1517) ((emacs (24 4))) "SSH Config Backend for Org Export Engine" tar ((:url . "https://github.com/dantecatalfamo/ox-ssh") (:commit . "be3b39160da6ae37b1f1cd175ed854ac41d1cb63") (:revdesc . "be3b39160da6") (:keywords "outlines" "org" "ssh"))]) + (ox-textile . [(20210919 1738) ((org (8 1))) "Textile Back-End for Org Export Engine" tar ((:url . "https://github.com/yashi/org-textile") (:commit . "92764235055bd1b51411d3e9490023bed7437d7b") (:revdesc . "92764235055b") (:keywords "org" "textile") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainers ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com"))]) + (ox-tiddly . [(20200927 857) ((org (8)) (emacs (24 4))) "Org TiddlyWiki exporter" tar ((:url . "https://github.com/dfeich/org8-wikiexporters") (:commit . "3377d8732aa916e736ce5822c7a9a4fbdc894e37") (:revdesc . "3377d8732aa9") (:keywords "org") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainers ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch"))]) + (ox-timeline . [(20220321 2115) ((emacs (24 4))) "HTML Timeline Back-End for Org Export Engine" tar ((:url . "https://github.com/jjuliano/org-simple-timeline") (:commit . "b28bd4ccd5fa114c0f51b9766f0b9be7fe05fdd8") (:revdesc . "b28bd4ccd5fa") (:keywords "simple timeline" "timeline" "hypermedia" "html timeline") (:authors ("Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom")) (:maintainers ("Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom")) (:maintainer "Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom"))]) + (ox-trac . [(20171026 1823) ((org (9 0))) "Org Export Backend to Trac WikiFormat" tar ((:url . "https://github.com/JalapenoGremlin/ox-trac") (:commit . "5ac6c81bbc18db6c17e267d6399778c3fb5bf1ee") (:revdesc . "5ac6c81bbc18") (:keywords "org-mode" "trac") (:authors ("Brian J. Carlson" . "hackerabutilizecom")) (:maintainers ("Brian J. Carlson" . "hackerabutilizecom")) (:maintainer "Brian J. Carlson" . "hackerabutilizecom"))]) + (ox-tufte . [(20240919 1332) ((emacs (27 1)) (org (9 5))) "Tufte HTML org-mode export backend" tar ((:url . "https://github.com/ox-tufte/ox-tufte") (:commit . "03e6c9e5e0ee467516139ed6b3f2b4bb13f847ec") (:revdesc . "03e6c9e5e0ee") (:keywords "org" "tufte" "html" "outlines" "hypermedia" "calendar" "wp"))]) + (ox-twbs . [(20200628 1949) nil "Bootstrap compatible HTML Back-End for Org" tar ((:url . "https://github.com/marsmining/ox-twbs") (:commit . "e8a27dc78b7be494d9918f26db7a3bbb6b45020b") (:revdesc . "e8a27dc78b7b") (:keywords "org" "html" "publish" "twitter" "bootstrap") (:authors ("Carsten Dominik" . "carstenatorgmodedotorg") ("Jambunathan K" . "kjambunathanatgmaildotcom") ("Brandon van Beekum" . "marsminingatgmaildotcom")) (:maintainers ("Carsten Dominik" . "carstenatorgmodedotorg") ("Jambunathan K" . "kjambunathanatgmaildotcom") ("Brandon van Beekum" . "marsminingatgmaildotcom")) (:maintainer "Carsten Dominik" . "carstenatorgmodedotorg"))]) + (ox-twiki . [(20200927 857) ((org (8)) (emacs (24 4))) "Org Twiki and Foswiki export" tar ((:url . "https://github.com/dfeich/org8-wikiexporters") (:commit . "3377d8732aa916e736ce5822c7a9a4fbdc894e37") (:revdesc . "3377d8732aa9") (:keywords "org") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainers ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch"))]) + (ox-typst . [(20251130 1244) ((emacs (30 1)) (org (9 7))) "Typst Back-End for Org Export Engine" tar ((:url . "https://github.com/jmpunkt/ox-typst") (:commit . "ac8893c79fa85a92a9251a695776971526ba8d76") (:revdesc . "ac8893c79fa8") (:keywords "text" "wp" "org" "typst"))]) + (ox-wk . [(20191231 2058) ((emacs (24 4)) (org (8 3))) "Wiki Back-End for Org Export Engine" tar ((:url . "https://github.com/w-vi/ox-wk.el") (:commit . "d34d1b72e4e940745a377bfa745dfb618900a09e") (:revdesc . "d34d1b72e4e9") (:keywords "org" "wp" "wiki") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainers ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainer "Vilibald Wanča" . "vilibald@wvi.cz"))]) + (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 ((:url . "https://github.com/LaurenceWarne/ox-yaow.el") (:commit . "71d7cee736542f6504c4733d040601d2d2086443") (:revdesc . "71d7cee73654") (:keywords "outlines" "hypermedia"))]) + (ox-zenn . [(20200924 1607) ((emacs (27 1)) (org (9 0))) "Zenn flavored markdown backend for org export engine" tar ((:url . "https://github.com/conao3/ox-zenn.el") (:commit . "b53bd82116c9f7dbb5b476d2cfcc8ed0f3bc9c78") (:revdesc . "b53bd82116c9") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (p-search . [(20250802 538) ((emacs (29 1)) (compat (29 1))) "Local Search Engine for Emacs" tar ((:url . "https://github.com/zkry/p-search") (:commit . "c382c80947a95825e258332d6f89bd6be496d914") (:revdesc . "c382c80947a9") (:keywords "tools"))]) + (p4 . [(20150721 1937) nil "Simple Perforce-Emacs Integration" tar ((:url . "https://github.com/gareth-rees/p4.el") (:commit . "eff047caa75dbe4965defca9d1212454cdb755d5") (:revdesc . "eff047caa75d") (:authors ("Gareth Rees" . "gdr@garethrees.org")) (:maintainers ("Gareth Rees" . "gdr@garethrees.org")) (:maintainer "Gareth Rees" . "gdr@garethrees.org"))]) + (p4-ts-mode . [(20241215 2358) ((emacs (29 1)) (xcscope (1 0))) "Major mode for the P4_16 programming language" tar ((:url . "https://github.com/oxidecomputer/p4-ts-mode") (:commit . "a2b8a0ecde12b23487dff2bb85b2a9dcd1962cb8") (:revdesc . "a2b8a0ecde12") (:keywords "languages" "p4_16" "p4") (:authors ("Zeeshan Lakhani" . "zeeshan@oxidecomputer.com")) (:maintainers ("Zeeshan Lakhani" . "zeeshan@oxidecomputer.com")) (:maintainer "Zeeshan Lakhani" . "zeeshan@oxidecomputer.com"))]) + (pabbrev . [(20240617 1622) ((emacs (25 1))) "Predictive abbreviation expansion" tar ((:url . "https://github.com/phillord/pabbrev") (:commit . "d5f120c523ddce2e8dea1868150248cd188d8ad8") (:revdesc . "d5f120c523dd") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Arthur Miller" . "arthur.miller@live.com")) (:maintainer "Arthur Miller" . "arthur.miller@live.com"))]) + (pacdiff . [(20251019 627) ((emacs (28 1))) "Manage pacdiff files" tar ((:url . "https://github.com/fbrosda/pacdiff.el") (:commit . "f1c13777e5c8056a6d6e823ecb51b9bbadc8e0c3") (:revdesc . "f1c13777e5c8") (:authors ("Fabian Brosda" . "fabi3141@gmx.de")) (:maintainers ("Fabian Brosda" . "fabi3141@gmx.de")) (:maintainer "Fabian Brosda" . "fabi3141@gmx.de"))]) + (pacfiles-mode . [(20230503 1523) ((emacs (26 1))) "The pacnew and pacsave merging tool" tar ((:url . "https://github.com/UndeadKernel/pacfiles-mode") (:commit . "a613d1d88dba4cb293ecaf42a9aeff7d8a3ce8aa") (:revdesc . "a613d1d88dba") (:keywords "files" "pacman" "arch" "pacnew" "pacsave" "update" "linux") (:authors ("Carlos G. Cordero" . "http://github/UndeadKernel")) (:maintainers ("Carlos G. Cordero" . "pacfiles@binarycharly.com")) (:maintainer "Carlos G. Cordero" . "pacfiles@binarycharly.com"))]) + (pache-dark-theme . [(20251222 925) ((emacs (24 1))) "High-contrast theme based on Gruvbox" tar ((:url . "https://github.com/0xhenrique/pache-dark-theme") (:commit . "73f2209c35f2d49fc4292564c9c4305fc16eec5b") (:revdesc . "73f2209c35f2") (:authors ("Henrique Marques" . "hm2030master@proton.me")) (:maintainers ("Henrique Marques" . "hm2030master@proton.me")) (:maintainer "Henrique Marques" . "hm2030master@proton.me"))]) + (pack . [(20191017 456) ((emacs (24)) (cl-lib (0 5))) "Pack and unpack archive files" tar ((:url . "https://github.com/10sr/pack-el") (:commit . "85cd856fdc00a2365e88b50373b99f1b3d2227be") (:revdesc . "85cd856fdc00") (:keywords "files" "dired") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainers ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com"))]) + (package+ . [(20240823 2307) ((emacs (24 3))) "Extensions for the package library" tar ((:url . "https://github.com/zenspider/package") (:commit . "c677513c61b273f3c688464b6005149aeed700ff") (:revdesc . "c677513c61b2") (:keywords "extensions" "tools") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainers ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com"))]) + (package-build . [(20251205 1541) ((emacs (26 1)) (compat (30 1))) "Tools for assembling a package archive" tar ((:url . "https://github.com/melpa/package-build") (:commit . "bc2764a38de2790dd55a91bc14a5a3165f4ada72") (:revdesc . "bc2764a38de2") (:keywords "maint" "tools") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net") ("Steve Purcell" . "steve@sanityinc.com") ("Jonas Bernoulli" . "emacs.package-build@jonas.bernoulli.dev") ("Phil Hagelberg" . "technomancy@gmail.com")) (:maintainers ("Jonas Bernoulli" . "emacs.package-build@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.package-build@jonas.bernoulli.dev"))]) + (package-filter . [(20161122 719) nil "Package archive whitelist and blacklist" tar ((:url . "https://github.com/milkypostman/package-filter") (:commit . "c8e2531227c02c4c5e9d593f2cdb6a4ab4a6849b") (:revdesc . "c8e2531227c0") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainers ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net"))]) + (package-lint . [(20251205 1720) ((emacs (24 4)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:url . "https://github.com/purcell/package-lint") (:commit . "1c37329703a507fa357302cf6fc29d4f2fe631a8") (:revdesc . "1c37329703a5") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (package-lint-flymake . [(20250418 1424) ((emacs (26 1)) (package-lint (0 5))) "A package-lint Flymake backend" tar ((:url . "https://github.com/purcell/package-lint") (:commit . "26b27201f1276a71257d328513152494e3edfc5d") (:revdesc . "26b27201f127"))]) + (package-loading-notifier . [(20230809 446) ((emacs (25))) "Notify a package is being loaded" tar ((:url . "https://github.com/tttuuu888/package-loading-notifier") (:commit . "f64f994cb1a55f9d59444deaec884bff0ed2b26e") (:revdesc . "f64f994cb1a5") (:keywords "convenience" "faces" "config" "startup") (:authors ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainers ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainer "SeungKi Kim" . "tttuuu888@gmail.com"))]) + (package-utils . [(20250106 1354) ((restart-emacs (0 1 1))) "Extensions for package.el" tar ((:url . "https://github.com/Silex/package-utils") (:commit . "41c7bf2c0174a9a8bd6efc2260fa9805fbb44c5e") (:revdesc . "41c7bf2c0174") (:keywords "package" "convenience") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainers ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com"))]) + (pacmacs . [(20220106 2248) ((emacs (24 4)) (dash (2 18 0)) (cl-lib (0 5)) (f (0 18 0))) "Pacman for Emacs" tar ((:url . "http://github.com/codingteam/pacmacs.el") (:commit . "25a8c30210f6bd94634a7ff743a2f8be391ed3b3") (:revdesc . "25a8c30210f6") (:authors ("Codingteam" . "codingteam@conference.jabber.ru")) (:maintainers ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com"))]) + (pact-mode . [(20201219 2223) ((emacs (24 3))) "Mode for Pact, a LISPlike smart contract language" tar ((:url . "https://github.com/kadena-io/pact-mode") (:commit . "f48a4faf5f8f8435423bda3888eca6ee67ee13a9") (:revdesc . "f48a4faf5f8f") (:keywords "pact" "lisp" "languages" "blockchain" "smartcontracts" "tools" "mode") (:maintainers ("Stuart Popejoy" . "stuart@kadena.io")) (:maintainer "Stuart Popejoy" . "stuart@kadena.io"))]) + (paganini-theme . [(20180815 1921) ((emacs (24 0))) "A colorful, dark and warm theme" tar ((:url . "https://github.com/onurtemizkan/paganini") (:commit . "255c5a2a8abee9c5935465ec42b9c3604c178c3c") (:revdesc . "255c5a2a8abe"))]) + (page-break-lines . [(20250218 1607) ((emacs (25 1))) "Display ^L page breaks as tidy horizontal lines" tar ((:url . "https://github.com/purcell/page-break-lines") (:commit . "982571749c8fe2b5e2997dd043003a1b9fe87b38") (:revdesc . "982571749c8f") (:keywords "convenience" "faces") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (pager . [(20151202 120) nil "Windows-scroll commands" tar ((:url . "https://github.com/emacsorphanage/pager") (:commit . "5c791ed23f1136e04040d6f4bc9b4ca5b6dc919f") (:revdesc . "5c791ed23f11") (:authors (nil . "MikaelSjödin--mic@docs.uu.se")) (:maintainers (nil . "MikaelSjödin--mic@docs.uu.se")) (:maintainer nil . "MikaelSjödin--mic@docs.uu.se"))]) + (pager-default-keybindings . [(20130719 2057) ((pager (1 0))) "Add the default keybindings suggested for pager.el" tar ((:url . "http://github.com/nflath/pager-default-keybindings") (:commit . "dbbd49c2ac5906d1dabf9e9c832bfebc1ab405b3") (:revdesc . "dbbd49c2ac59") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainers ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com"))]) + (paimon . [(20240904 1857) ((aio (1 0)) (closql (2 0 0)) (emacs (28 1)) (emacsql (4 0 2)) (f (0 20 0)) (ht (2 4)) (transient (0 7 5)) (request (0 3 2)) (compat (30 0 0 0))) "A major mode for Splunk" tar ((:url . "https://github.com/r0man/paimon.el") (:commit . "b3a5b1ca20e221cc88e20169635076b9b1b08a51") (:revdesc . "b3a5b1ca20e2") (:keywords "paimon" "search" "tools") (:authors ("r0man" . "roman@burningswell.com")) (:maintainers ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com"))]) + (pair-tree . [(20211219 1816) ((emacs (27 1)) (dash (2 17 0))) "Visualize a list" tar ((:url . "https://github.com/zainab-ali/pair-tree") (:commit . "00bdaf9df933aaacbed66b5d666e2abc29870103") (:revdesc . "00bdaf9df933") (:keywords "lisp" "tools") (:authors ("Zainab Ali" . "zainab@kebab-ca.se")) (:maintainers ("Zainab Ali" . "zainab@kebab-ca.se")) (:maintainer "Zainab Ali" . "zainab@kebab-ca.se"))]) + (palimpsest . [(20200805 1048) nil "Various deletion strategies when editing" tar ((:url . "https://github.com/danielsz/Palimpsest") (:commit . "f474b3ad706373d9953abdc401d683a2a023d28e") (:revdesc . "f474b3ad7063") (: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 ((:url . "https://github.com/abo-abo/pamparam") (:commit . "0ba91149095bee8c43688c68f83f4d365fbe6771") (:revdesc . "0ba91149095b") (:keywords "outlines" "hypermedia" "flashcards" "memory") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (panda . [(20240102 348) ((emacs (25))) "Client for Bamboo's REST API" tar ((:url . "https://github.com/sebasmonia/panda") (:commit . "286785687d4ffe29fd1d95c699d378743d32ac00") (:revdesc . "286785687d4f") (:keywords "maint" "tool") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com"))]) + (panda-theme . [(20181128 1738) ((emacs (24))) "Panda Theme" tar ((:url . "https://github.com/jamiecollinson/emacs-panda-theme") (:commit . "60aa47c7a930377807da0d601351ad91e8ca446a") (:revdesc . "60aa47c7a930") (:authors ("jamiecollinson" . "jamiecollinson@gmail.com")) (:maintainers ("jamiecollinson" . "jamiecollinson@gmail.com")) (:maintainer "jamiecollinson" . "jamiecollinson@gmail.com"))]) + (pandoc . [(20161128 1157) ((emacs (24 4))) "Pandoc interface" tar ((:url . "https://github.com/zonuexe/pandoc.el") (:commit . "198d262d09e30448f1672338b0b5a81cf75e1eaa") (:revdesc . "198d262d09e3") (:keywords "hypermedia" "documentation" "markup" "converter") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (pandoc-mode . [(20251029 1925) nil "Minor mode for interacting with Pandoc" tar ((:url . "http://joostkremers.github.io/pandoc-mode/") (:commit . "8d6e976b465cb4fa59d12efe8159b781a57f915e") (:revdesc . "8d6e976b465c") (:keywords "text" "pandoc") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm"))]) + (pangu-spacing . [(20250124 142) nil "Minor-mode to add space between Chinese and English characters" tar ((:url . "http://github.com/coldnew/pangu-spacing") (:commit . "6509df9c90bbdb9321a756f7ea15bb2b60ed2530") (:revdesc . "6509df9c90bb") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainers ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com"))]) + (paper-theme . [(20230318 48) ((emacs (24))) "A minimal Emacs colour theme" tar ((:url . "https://dev.gkayaalp.com/elisp/index.html#paper") (:commit . "8d337b85592ae44e1fa3ad03f0c65ca99036f9e2") (:revdesc . "8d337b85592a") (:keywords "theme" "paper"))]) + (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 ((:url . "https://github.com/atgreen/paperless") (:commit . "ef2e7ef5aeaffa997794f5d6e27be6631ba05d34") (:revdesc . "ef2e7ef5aeaf") (:keywords "pdf" "convenience") (:authors ("Anthony Green" . "green@moxielogic.com")) (:maintainers ("Anthony Green" . "green@moxielogic.com")) (:maintainer "Anthony Green" . "green@moxielogic.com"))]) + (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 ((:url . "https://github.com/Malabarba/paradox") (:commit . "96401577ed02f433debe7604e49afd478e9eda61") (:revdesc . "96401577ed02") (:keywords "package" "packages") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (parchment-theme . [(20221206 1541) ((autothemer (0 2))) "Light theme inspired by Acme and Leuven" tar ((:url . "https://gitlab.com/ajgrf/parchment") (:commit . "07c9887be6e7d94a8546db625c7d62c54d2e5923") (:revdesc . "07c9887be6e7") (:authors ("Alex Griffin" . "a@ajgrf.com")) (:maintainers ("Alex Griffin" . "a@ajgrf.com")) (:maintainer "Alex Griffin" . "a@ajgrf.com"))]) + (paredit . [(20241103 2046) nil "Minor mode for editing parentheses" tar ((:url . "https://paredit.org") (:commit . "89e75b4cb21f525a6f4cabcd12f1bd4204e682ab") (:revdesc . "89e75b4cb21f") (:keywords "lisp") (:authors ("Taylor R. Campbell" . "campbell@paredit.org")) (:maintainers ("Taylor R. Campbell" . "campbell@paredit.org")) (:maintainer "Taylor R. Campbell" . "campbell@paredit.org"))]) + (paredit-everywhere . [(20210510 531) ((paredit (22))) "Enable some paredit features in non-lisp buffers" tar ((:url . "https://github.com/purcell/paredit-everywhere") (:commit . "b81e5d5356c85001a71640941b469aea9cf2e309") (:revdesc . "b81e5d5356c8") (:keywords "languages" "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (paredit-menu . [(20160128 1733) ((paredit (25))) "Adds a menu to paredit.el as memory aid" tar ((:url . "https://github.com/phillord/paredit-menu") (:commit . "cc0ae85bd819f9ebfa4f2a419ab3b2d70e39c9c8") (:revdesc . "cc0ae85bd819") (:keywords "paredit") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (paren-completer . [(20160501 1052) ((emacs (24 3))) "Automatically, language agnostically, fill in delimiters" tar ((:url . "https://github.com/MatthewBregg/paren-completer") (:commit . "74183a8e13fa1266271bdcbcb4bfb29a4f915f0a") (:revdesc . "74183a8e13fa") (:keywords "convenience"))]) + (paren-face . [(20251101 2048) ((emacs (26 1)) (compat (30 1))) "A face for parentheses in lisp modes" tar ((:url . "https://github.com/tarsius/paren-face") (:commit . "b121bc08ecb0c11a89705ed9f77c5343e2baec04") (:revdesc . "b121bc08ecb0") (:keywords "faces" "lisp") (:authors ("Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev"))]) + (parent-mode . [(20240210 1906) nil "Get major mode's parent modes" tar ((:url . "https://github.com/Fanael/parent-mode") (:commit . "9fe5363b2a190619641c79b3a40d874d8c8f9f40") (:revdesc . "9fe5363b2a19") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com"))]) + (parenthesis-face . [(20251101 2048) ((emacs (30 1))) "A face for parentheses" tar ((:url . "https://github.com/tarsius/paren-face") (:commit . "b121bc08ecb0c11a89705ed9f77c5343e2baec04") (:revdesc . "b121bc08ecb0") (:keywords "faces" "lisp") (:authors ("Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.paren-face@jonas.bernoulli.dev"))]) + (parinfer-rust-mode . [(20251209 617) ((emacs (26 1)) (track-changes (1 1))) "An interface for the parinfer-rust library" tar ((:url . "https://github.com/justinbarclay/parinfer-rust-mode") (:commit . "40b4b9f226f115b8eec245ac8f97e43d1bfafa0f") (:revdesc . "40b4b9f226f1") (:keywords "lisp" "tools") (:authors ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainers ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainer "Justin Barclay" . "justinbarclay@gmail.com"))]) + (parrot . [(20220101 518) ((emacs (24 1))) "Party Parrot rotates gracefully in mode-line" tar ((:url . "https://github.com/dp12/parrot.git") (:commit . "1d381f24d74242018e306d1a0c891bed9a465ac3") (:revdesc . "1d381f24d742") (:keywords "party" "parrot" "rotate" "sirocco" "kakapo" "games") (:authors ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainers ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainer "Daniel Ting" . "deep.paren.12@gmail.com"))]) + (parse-csv . [(20241214 246) ((emacs (24 3))) "Parse strings with CSV fields into s-expressions" tar ((:url . "https://github.com/mrc/el-csv") (:commit . "b2e7010ba91ecce25498a73f64f950de4dd8dbe2") (:revdesc . "b2e7010ba91e") (:keywords "csv") (:authors ("Matt Curtis" . "matt.r.curtis@gmail.com")) (:maintainers ("Matt Curtis" . "matt.r.curtis@gmail.com")) (:maintainer "Matt Curtis" . "matt.r.curtis@gmail.com"))]) + (parse-it . [(20250101 1011) ((emacs (25 1)) (s (1 12 0))) "Basic Parser in Emacs Lisp" tar ((:url . "https://github.com/jcs-elpa/parse-it") (:commit . "19df0d8d67f0f3b73d80ad2db57a1790f3e43beb") (:revdesc . "19df0d8d67f0") (:keywords "convenience" "parse" "parser" "lex" "lexer" "ast") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (parsebib . [(20251125 1320) ((emacs (25 1))) "A library for parsing bib files" tar ((:url . "https://github.com/joostkremers/parsebib") (:commit . "b3990a18984284f0809e6e095196936e65fda2eb") (:revdesc . "b3990a189842") (:keywords "text" "bibtex") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm"))]) + (parsec . [(20180730 16) ((emacs (24)) (cl-lib (0 5))) "Parser combinator library" tar ((:url . "https://github.com/cute-jumper/parsec.el") (:commit . "2cbbbc2254aa7bcaa4fb5e07c8c1bf2f381dba26") (:revdesc . "2cbbbc2254aa") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (parseclj . [(20231203 1905) ((emacs (25))) "Clojure/EDN parser" tar ((:url . "https://github.com/clojure-emacs/parseclj") (:commit . "6af22372e0fe14df882dd300b22b12ba2d7e00b0") (:revdesc . "6af22372e0fe") (:keywords "lisp" "clojure" "edn" "parser") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net"))]) + (parseedn . [(20231203 1909) ((emacs (26)) (parseclj (1 1 1)) (map (2))) "Clojure/EDN parser" tar ((:url . "http://www.github.com/clojure-emacs/parseedn") (:commit . "3407e4530a367b6c2b857dae261cdbb67a440aaa") (:revdesc . "3407e4530a36") (:keywords "lisp" "clojure" "edn" "parser") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainers ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net"))]) + (pasp-mode . [(20180404 1700) ((emacs (24 3))) "- A major mode for editing Answer Set Programs" tar ((:url . "https://github.com/santifa/pasp-mode") (:commit . "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92") (:revdesc . "59385eb0e8eb") (:keywords "asp" "pasp" "answer set programs" "potassco answer set programs" "major mode" "languages") (:authors ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainers ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainer "Henrik Jürges" . "juerges.henrik@gmail.com"))]) + (pass . [(20250721 1935) ((emacs (25 1)) (password-store (1 7 4)) (password-store-otp (0 1 5)) (f (0 17))) "Major mode for password-store.el" tar ((:url . "https://github.com/NicolasPetton/pass") (:commit . "7651389c52919f5e0e41d9217b29c7166e3a45c2") (:revdesc . "7651389c5291") (:keywords "tools" "files") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))]) + (password-generator . [(20250615 2300) nil "Password generator for humans. Good, Bad, Phonetic passwords included" tar ((:url . "http://github.com/vandrlexay/emacs-password-genarator") (:commit . "2d0deb52f2fd978bff9001e155e36ac5bd287d52") (:revdesc . "2d0deb52f2fd"))]) + (password-menu . [(20250608 2335) ((emacs (29 1))) "Password Menu for auth-source secrets" tar ((:url . "https://github.com/rnadler/password-menu") (:commit . "071f4b2fc596946f5284689da15263f8bd33957a") (:revdesc . "071f4b2fc596") (:keywords "news") (:authors ("Robert Nadler" . "robert.nadler@gmail.com")) (:maintainers ("Robert Nadler" . "robert.nadler@gmail.com")) (:maintainer "Robert Nadler" . "robert.nadler@gmail.com"))]) + (password-mode . [(20220706 507) ((emacs (25 1))) "Hide password text using overlays" tar ((:url . "https://github.com/juergenhoetzel/password-mode") (:commit . "883981d9f8d0e2a8ec479c89f5f6b2492c22e01a") (:revdesc . "883981d9f8d0") (:keywords "docs" "password" "passphrase") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainers ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org"))]) + (password-store . [(20250618 951) ((emacs (26 1)) (with-editor (2 5 11))) "Password store (pass) support" tar ((:url . "https://www.passwordstore.org/") (:commit . "3ca13cd8882cae4083c1c478858adbf2e82dd037") (:revdesc . "3ca13cd8882c") (:keywords "tools" "pass" "password" "password-store" "gpg") (:authors ("Svend Sorensen" . "svend@svends.net")) (:maintainers ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com"))]) + (password-store-menu . [(20250706 1858) ((emacs (29 1)) (password-store (2 3 2)) (transient (0 8 3))) "A better, more complete UI for password-store" tar ((:url . "https://github.com/rjekker/password-store-menu") (:commit . "31b0884d1cdc80ad4ee7d84680c11653e659bb18") (:revdesc . "31b0884d1cdc") (:keywords "convenience" "data" "files") (:authors ("Reindert-Jan Ekker" . "info@rjekker.nl")) (:maintainers ("Reindert-Jan Ekker" . "info@rjekker.nl")) (:maintainer "Reindert-Jan Ekker" . "info@rjekker.nl"))]) + (password-store-otp . [(20220128 1320) ((emacs (25)) (s (1 9 0)) (password-store (0 1))) "Password store (pass) OTP extension support" tar ((:url . "https://github.com/volrath/password-store-otp.el") (:commit . "be3a00a981921ed1b2f78012944dc25eb5a0beca") (:revdesc . "be3a00a98192") (:keywords "tools" "pass"))]) + (password-vault . [(20220321 1521) ((cl-lib (0 2)) (emacs (24))) "A Password manager for Emacs" tar ((:url . "http://github.com/PuercoPop/password-vault") (:commit . "56bc893372a435b4fb3c8937c7f811bca3475f12") (:revdesc . "56bc893372a4") (:keywords "password" "productivity") (:authors ("Javier PuercoPop Olaechea" . "pirata@gmail.com")) (:maintainers ("Javier PuercoPop Olaechea" . "pirata@gmail.com")) (:maintainer "Javier PuercoPop Olaechea" . "pirata@gmail.com"))]) + (paste-of-code . [(20170709 2355) ((emacs (24 3)) (request (0 2 0))) "Paste code on https://paste.ofcode.org" tar ((:url . "https://github.com/spebern/paste-of-code.el") (:commit . "92d258e8ec98598d847ecab82903f9224c7c2050") (:revdesc . "92d258e8ec98") (:keywords "lisp") (:authors ("Bernhard Specht" . "bernhard@specht.net")) (:maintainers ("Bernhard Specht" . "bernhard@specht.net")) (:maintainer "Bernhard Specht" . "bernhard@specht.net"))]) + (pastebin . [(20101125 2002) nil "A simple interface to the www.pastebin.com webservice" tar ((:url . "https://github.com/nicferrier/elpastebin") (:commit . "8e9a829298ce0f747ab80758aa26caeb2af6cb30") (:revdesc . "8e9a829298ce"))]) + (pastehub . [(20140627 1319) nil "A client for the PasteHub cloud service" tar ((:url . "https://github.com/kiyoka/pastehub") (:commit . "37b045c67659c078f1517d0fbd5282dab58dca23") (:revdesc . "37b045c67659"))]) + (pastelmac-theme . [(20151031 236) ((emacs (24 1))) "A soothing theme with a pastel color palette" tar ((:url . "https://github.com/bmastenbrook/pastelmac-theme-el") (:commit . "bead21741e3f46f6506e8aef4469d4240a819389") (:revdesc . "bead21741e3f") (:keywords "themes") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainers ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net"))]) + (pastery . [(20171114 349) ((emacs (24 4)) (request (0 2 0))) "Paste snippets to pastery.net" tar ((:url . "https://github.com/diasbruno/pastery.el") (:commit . "4493be98b743b4d062cb4e00760125e394a55022") (:revdesc . "4493be98b743") (:keywords "tools") (:authors ("Bruno Dias" . "dias.h.bruno@gmail.com")) (:maintainers ("Bruno Dias" . "dias.h.bruno@gmail.com")) (:maintainer "Bruno Dias" . "dias.h.bruno@gmail.com"))]) + (pasvortilo . [(20251210 2125) ((emacs (26 1)) (transient (0 3 0))) "Password manager interface for pass/gopass" tar ((:url . "https://codeberg.org/mester/pasvortilo") (:commit . "a38d016d00164ab319173aa47f2d7f6a7dd1aaf3") (:revdesc . "a38d016d0016") (:keywords "unix" "extensions" "passwords"))]) + (path-headerline-mode . [(20140423 1332) nil "Displaying file path on headerline" tar ((:url . "https://github.com/7696122/path-headerline-mode") (:commit . "b5b2725c6a8b1cb592fc242b7dbbd54b4dff2e69") (:revdesc . "b5b2725c6a8b") (:keywords "headerline"))]) + (path-helper . [(20181208 2229) ((emacs (24))) "Set PATH environment variables from config files" tar ((:url . "https://github.com/arouanet/path-helper") (:commit . "34538affb3f341b3c56a875bb094ddb2b859a8ef") (:revdesc . "34538affb3f3") (:keywords "tools" "unix") (:authors ("Arnaud Rouanet" . "arnaud@rouanet.org")) (:maintainers ("Arnaud Rouanet" . "arnaud@rouanet.org")) (:maintainer "Arnaud Rouanet" . "arnaud@rouanet.org"))]) + (pathify . [(20160423 846) nil "Symlink your scripts into a PATH directory" tar ((:url . "https://gitlab.com/alezost-emacs/pathify") (:commit . "335332a900717ae01bde5ccb8f3dc97a5350f123") (:revdesc . "335332a90071") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (paxedit . [(20160730 1727) ((cl-lib (0 5)) (paredit (23))) "Structured, Context Driven LISP Editing and Refactoring" tar ((:url . "https://github.com/promethial/paxedit") (:commit . "48df0a26285f68cd20ea64368e7bf2a5fbf13135") (:revdesc . "48df0a26285f") (:keywords "lisp" "refactoring" "context"))]) + (pbcopy . [(20150225 459) nil "Emacs Interface to pbcopy" tar ((:url . "https://github.com/jkp/pbcopy.el") (:commit . "338f7245746b5de1bb96c5cc2b32bfd9b5d83272") (:revdesc . "338f7245746b") (:keywords "mac" "osx" "pbcopy"))]) + (pc-bufsw . [(20201011 1918) nil "PC style quick buffer switcher" tar ((:url . "https://github.com/ibukanov/pc-bufsw") (:commit . "a7295e4813d636d5a20605d134acd42e4e4fe8fa") (:revdesc . "a7295e4813d6") (:keywords "buffer") (:authors ("Igor Bukanov" . "igor@mir2.org")) (:maintainers ("Igor Bukanov" . "igor@mir2.org")) (:maintainer "Igor Bukanov" . "igor@mir2.org"))]) + (pcache . [(20220724 1841) ((emacs (25 1))) "Persistent caching for Emacs" tar ((:url . "https://github.com/sigma/pcache") (:commit . "cae29ddbc3d12fac18ab5cfc26fa3ef13eb97dad") (:revdesc . "cae29ddbc3d1") (:keywords "extensions") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainers ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com"))]) + (pcap-mode . [(20161025 1448) ((emacs (24 3))) "Major mode for working with PCAP files" tar ((:url . "https://github.com/apconole/pcap-mode") (:commit . "52780669af0ade136f84d73f21b4dbb7ab655416") (:revdesc . "52780669af0a") (:keywords "pcap" "packets" "tcpdump" "wireshark" "tshark") (:authors ("Aaron Conole" . "aconole@bytheb.org")) (:maintainers ("Aaron Conole" . "aconole@bytheb.org")) (:maintainer "Aaron Conole" . "aconole@bytheb.org"))]) + (pcmpl-args . [(20250217 342) ((emacs (25 1))) "Enhanced shell command completion" tar ((:url . "https://github.com/JonWaltman/pcmpl-args.el") (:commit . "bccbfe931a8383fb4ecc75551305057a9bd33700") (:revdesc . "bccbfe931a83") (:keywords "abbrev" "completion" "convenience" "processes" "terminals" "unix") (:authors ("Jonathan Waltman" . "jonathan.waltman@gmail.com")) (:maintainers ("Jonathan Waltman" . "jonathan.waltman@gmail.com")) (:maintainer "Jonathan Waltman" . "jonathan.waltman@gmail.com"))]) + (pcmpl-homebrew . [(20200911 742) nil "Pcomplete for homebrew" tar ((:url . "https://github.com/suzzvv/pcmpl-homebrew") (:commit . "a2044042dd498abad1dc06162a8ee0d70314ca40") (:revdesc . "a2044042dd49") (:keywords "pcomplete" "homebrew" "tools" "cask" "services") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainers ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com"))]) + (pcmpl-pip . [(20181229 1420) ((s (1 12 0)) (f (0 19 0)) (seq (2 15))) "Pcomplete for pip" tar ((:url . "https://github.com/suzzvv/pcmpl-pip") (:commit . "ebb672d4494f876f611639e65df4e28e566c06b5") (:revdesc . "ebb672d4494f") (:keywords "pcomplete" "pip" "python" "tools") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainers ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com"))]) + (pcomplete-extension . [(20190928 519) ((emacs (24)) (cl-lib (0 5))) "Additional completion for pcomplete" tar ((:url . "https://github.com/thierryvolpiatto/pcomplete-extension") (:commit . "bc5eb204fee659e0980056009409b44bc7655716") (:revdesc . "bc5eb204fee6") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))]) + (pcre2el . [(20240629 2322) ((emacs (25 1))) "Regexp syntax converter" tar ((:url . "https://github.com/joddie/pcre2el") (:commit . "b4d846d80dddb313042131cf2b8fbf647567e000") (:revdesc . "b4d846d80ddd") (:authors ("joddie" . "jonxfieldatgmail.com")) (:maintainers ("joddie" . "jonxfieldatgmail.com")) (:maintainer "joddie" . "jonxfieldatgmail.com"))]) + (pcsv . [(20240112 1431) ((emacs (25 1))) "Parser of csv" tar ((:url . "https://github.com/mhayashi1120/Emacs-pcsv") (:commit . "aa421d12c0da0adb9bc74a050a591dcbabf934ae") (:revdesc . "aa421d12c0da") (:keywords "data") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (pd-remote . [(20230314 428) ((emacs (24 3)) (faust-mode (0 6)) (lua-mode (20210802))) "Pd remote control helper" tar ((:url . "https://github.com/agraef/pd-remote") (:commit . "dcd68097d2b7468303517d91cb76682bfb47db63") (:revdesc . "dcd68097d2b7") (:keywords "multimedia" "pure-data") (:authors ("Albert Graef" . "aggraef@gmail.com")) (:maintainers ("Albert Graef" . "aggraef@gmail.com")) (:maintainer "Albert Graef" . "aggraef@gmail.com"))]) + (pdb-capf . [(20200419 1237) ((emacs (25 1))) "Completion-at-point function for python debugger" tar ((:url . "https://github.com/muffinmad/emacs-pdb-capf") (:commit . "2f4099aa1330f87df4e9cd526de057ee9b71de6c") (:revdesc . "2f4099aa1330") (:keywords "languages" "abbrev" "convenience") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com"))]) + (pdb-mode . [(20150128 1751) nil "Major mode for editing Protein Data Bank files" tar ((:url . "http://bondxray.org/software/pdb-mode/") (:commit . "855fb18ebb73b5df30c8d7677c2bcd0f361b138a") (:revdesc . "855fb18ebb73") (:keywords "data" "pdb") (:authors (nil . "charles.bond@uwa.edu.au")) (:maintainers (nil . "aix.bing@gmail.com")) (:maintainer nil . "aix.bing@gmail.com"))]) + (pdd . [(20250809 509) ((emacs (28 1))) "HTTP library & Async Toolkit" tar ((:url . "https://github.com/lorniu/pdd.el") (:commit . "533e8fde36cb9fae1fae3bf44eb6dbf39ec10f53") (:revdesc . "533e8fde36cb") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainers ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com"))]) + (pdf-meta-edit . [(20251118 2327) ((emacs (24 3)) (compat (29 1))) "Edit PDF metadata via pdftk" tar ((:url . "https://github.com/krisbalintona/pdf-meta-edit") (:commit . "18d8b9156f15f77ed3f79152b221551c703b680c") (:revdesc . "18d8b9156f15") (:keywords "files" "data") (:authors ("Kristoffer Balintona" . "krisbalintona@gmail.com")) (:maintainers ("Kristoffer Balintona" . "krisbalintona@gmail.com")) (:maintainer "Kristoffer Balintona" . "krisbalintona@gmail.com"))]) + (pdf-tools . [(20240429 407) ((emacs (26 3)) (tablist (1 0)) (let-alist (1 0 4))) "Support library for PDF documents" tar ((:url . "http://github.com/vedang/pdf-tools/") (:commit . "30b50544e55b8dbf683c2d932d5c33ac73323a16") (:revdesc . "30b50544e55b") (:keywords "files" "multimedia") (:authors ("Andreas Politz" . "mail@andreas-politz.de")) (:maintainers ("Vedang Manerikar" . "vedang.manerikar@gmail.com")) (:maintainer "Vedang Manerikar" . "vedang.manerikar@gmail.com"))]) + (pdf-view-pagemark . [(20240518 626) ((pdf-tools (0 90)) (posframe (1 4 2)) (emacs (26 0))) "Add indicator in pdfview mode to show the page remaining" tar ((:url . "https://github.com/kimim/pdf-view-pagemark") (:commit . "a746cf8b86d030ebfc61bb2ff10c0e16b5d195c6") (:revdesc . "a746cf8b86d0") (:keywords "multimedia" "convenience") (:authors ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainers ("Kimi Ma" . "kimi.im@outlook.com")) (:maintainer "Kimi Ma" . "kimi.im@outlook.com"))]) + (pdf-view-restore . [(20190904 1708) ((pdf-tools (0 90)) (emacs (26 0))) "Support for opening last known pdf position in pdfview mode" tar ((:url . "https://github.com/007kevin/pdf-view-restore") (:commit . "5a1947c01a3edecc9e0fe7629041a2f53e0610c9") (:revdesc . "5a1947c01a3e") (:keywords "files" "convenience") (:authors ("Kevin Kim" . "kevinkim1991@gmail.com")) (:maintainers ("Kevin Kim" . "kevinkim1991@gmail.com")) (:maintainer "Kevin Kim" . "kevinkim1991@gmail.com"))]) + (pdfgrep . [(20210203 1730) ((emacs (24 4))) "Run `pdfgrep' and display the results" tar ((:url . "https://github.com/jeremy-compostella/pdfgrep") (:commit . "a4ca0a1e6521de93f28bb6736a5344b4974d144c") (:revdesc . "a4ca0a1e6521") (:keywords "extensions" "mail" "pdf" "grep") (: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"))]) + (peacock-theme . [(20170808 1320) ((emacs (24 0))) "An Emacs 24 theme based on Peacock (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "9e46fbfb562b6e26c6e3d6d618b044b3694da4c8") (:revdesc . "9e46fbfb562b"))]) + (pebble-mode . [(20230123 1801) ((emacs (24 3))) "A major mode for pebble" tar ((:url . "https://github.com/ArneBab/pebble-mode") (:commit . "bcbc76aa89196338f12a8ddfe4486edf83c19c5e") (:revdesc . "bcbc76aa8919"))]) + (peek-mode . [(20130620 1946) ((elnode (0 9 8 1))) "Serve buffers live over HTTP with elnode backend" tar ((:url . "https://github.com/erikriverson/peek-mode") (:commit . "55a7dd011375330c7d57322257a5167516702c71") (:revdesc . "55a7dd011375") (:authors ("Erik Iverson" . "erik@sigmafield.org")) (:maintainers ("Erik Iverson" . "erik@sigmafield.org")) (:maintainer "Erik Iverson" . "erik@sigmafield.org"))]) + (peep-dired . [(20160321 2237) nil "Peep at files in another window from dired buffers" tar ((:url . "https://github.com/asok/peep-dired") (:commit . "12d7e52cd5ae29fd828db0bf1fbf648020077145") (:revdesc . "12d7e52cd5ae") (:keywords "files" "convenience") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainers ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com"))]) + (peertube . [(20210101 1007) ((emacs (25 1)) (transmission (0 12 1))) "Query and download PeerTube videos" tar ((:url . "https://git.sr.ht/~yoctocell/peertube") (:commit . "bb529db154596e86327829edbd7144b67cf72255") (:revdesc . "bb529db15459") (:keywords "peertube" "multimedia") (:authors ("yoctocell" . "public@yoctocell.xyz")) (:maintainers ("yoctocell" . "public@yoctocell.xyz")) (:maintainer "yoctocell" . "public@yoctocell.xyz"))]) + (pelican-mode . [(20190124 2336) ((emacs (25))) "Minor mode for editing Pelican sites" tar ((:url . "https://git.korewanetadesu.com/pelican-mode.git") (:commit . "a69934885c7a3b303049e2418333b3915b8f8fb8") (:revdesc . "a69934885c7a") (:keywords "convenience" "editing") (:authors ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainers ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com"))]) + (pepita . [(20240102 401) ((emacs (25)) (csv (2 1))) "Run Splunk search commands, export results to CSV/HTML/JSON" tar ((:url . "https://github.com/sebasmonia/pepita.git") (:commit . "02ac00ad23b9a3e19797fc76ac569c2d46da54b9") (:revdesc . "02ac00ad23b9") (:keywords "tools" "convenience" "matching") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com"))]) + (per-buffer-theme . [(20221002 2219) ((emacs (25 1))) "Change theme and font according to buffer name or major mode" tar ((:url . "https://hg.serna.eu/emacs/per-buffer-theme") (:commit . "2cbb15c05edff4ce23ce61858cf16e8953cd58b3") (:revdesc . "2cbb15c05edf") (:keywords "themes") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainers ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com"))]) + (perfect-margin . [(20251209 2114) ((emacs (25 1))) "Auto center windows, works with line numbers" tar ((:url . "https://github.com/mpwang/perfect-margin") (:commit . "d38a2ff6b89dde81da03e8f4a83c0cad2baade0e") (:revdesc . "d38a2ff6b89d") (:keywords "convenience" "frames") (:authors ("Randall Wang" . "randall.wjz@gmail.com")) (:maintainers ("Randall Wang" . "randall.wjz@gmail.com")) (:maintainer "Randall Wang" . "randall.wjz@gmail.com"))]) + (perject . [(20250115 1657) ((emacs (27 1)) (dash (2 10)) (transient (0 3 7))) "Session-persistent project management" tar ((:url . "https://github.com/overideal/perject") (:commit . "28fad17c048685d89c815b6bf6e69c3102ee3712") (:revdesc . "28fad17c0486"))]) + (perl-ts-mode . [(20250425 953) ((emacs (30 1))) "Another Major mode for Perl" tar ((:url . "https://hg.sr.ht/~pranshu/perl-ts-mode") (:commit . "aa34c2a15aec61febb05afb74926b38f6a77f60e") (:revdesc . "aa34c2a15aec") (:keywords "languages" "perl") (:authors ("Pranshu Sharma" . "pranshu@bauherren.ovh")) (:maintainers ("Pranshu Sharma" . "pranshu@bauherren.ovh")) (:maintainer "Pranshu Sharma" . "pranshu@bauherren.ovh"))]) + (perlbrew . [(20230823 1652) nil "A perlbrew wrapper for Emacs" tar ((:url . "https://github.com/kentaro/perlbrew.el") (:commit . "527b7f6a6a5edd2b779ae98029e60994391c0903") (:revdesc . "527b7f6a6a5e") (:keywords "emacs" "perl") (:authors ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainers ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainer "Kentaro Kuribayashi" . "kentarok@gmail.com"))]) + (persist-state . [(20240904 2057) ((emacs (28 2))) "Regularly persist bookmarks, history, recent files and more" tar ((:url . "https://codeberg.org/bram85/emacs-persist-state.git") (:commit . "51b2092ac206a0d8a0f682fbc32fe089716c37cb") (:revdesc . "51b2092ac206") (:keywords "convenience") (:authors ("Bram Schoenmakers" . "me@bramschoenmakers.nl")) (:maintainers ("Bram Schoenmakers" . "me@bramschoenmakers.nl")) (:maintainer "Bram Schoenmakers" . "me@bramschoenmakers.nl"))]) + (persist-text-scale . [(20250915 132) ((emacs (26 1))) "Persist and restore text scale" tar ((:url . "https://github.com/jamescherti/persist-text-scale.el") (:commit . "235e37b1ca38816b3bb882f7a40bb109e8739ea8") (:revdesc . "235e37b1ca38") (:keywords "convenience"))]) + (persistent-overlays . [(20161128 700) nil "Minor mode to store selected overlays to be loaded later" tar ((:url . "https://github.com/mneilly/Emacs-Persistent-Overlays") (:commit . "f563c8b966edc78c9d806661c4eb80e4781c4eab") (:revdesc . "f563c8b966ed") (:keywords "overlays" "persistent") (:authors ("Michael Neilly" . "mneilly@yahoo.com")) (:maintainers ("Michael Neilly" . "mneilly@yahoo.com")) (:maintainer "Michael Neilly" . "mneilly@yahoo.com"))]) + (persistent-scratch . [(20230225 1439) ((emacs (24))) "Preserve the scratch buffer across Emacs sessions" tar ((:url . "https://github.com/Fanael/persistent-scratch") (:commit . "5ff41262f158d3eb966826314516f23e0cb86c04") (:revdesc . "5ff41262f158") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com"))]) + (persistent-soft . [(20250805 1017) ((pcache (0 3 1)) (list-utils (0 4 2))) "Persistent storage, returning nil on failure" tar ((:url . "http://github.com/rolandwalker/persistent-soft") (:commit . "24e41d1952bef5953ef0af2288de146265c7ee10") (:revdesc . "24e41d1952be") (:keywords "data" "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (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 ((:url . "http://github.com/rocher/persp-fr") (:commit . "1adbb6a9f9a4db580a9b7ed8b4091738e01345e6") (:revdesc . "1adbb6a9f9a4") (:keywords "perspectives" "workspace" "windows" "convenience") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainers ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com"))]) + (persp-mode . [(20250830 955) ((emacs (24 3))) "Windows/buffers sets shared among frames + save/load" tar ((:url . "https://github.com/Bad-ptr/persp-mode.el") (:commit . "fab4bf76927445d2e431f06e74572acba81f47d5") (:revdesc . "fab4bf769274") (:keywords "perspectives" "session" "workspace" "persistence" "windows" "buffers" "convenience") (:authors ("Constantin Kulikov" . "zxnotdead@gmail.com")) (:maintainers ("Constantin Kulikov" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov" . "zxnotdead@gmail.com"))]) + (persp-mode-projectile-bridge . [(20170315 1120) ((persp-mode (2 9)) (projectile (0 13 0)) (cl-lib (0 5))) "Persp-mode + projectile integration" tar ((:url . "https://github.com/Bad-ptr/persp-mode-projectile-bridge.el") (:commit . "f6453cd7b8b4352c06e771706f2c5b7e2cdff1ce") (:revdesc . "f6453cd7b8b4") (:keywords "persp-mode" "projectile") (:authors ("Constantin Kulikov" . "zxnotdead@gmail.com")) (:maintainers ("Constantin Kulikov" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov" . "zxnotdead@gmail.com"))]) + (persp-projectile . [(20210618 708) ((perspective (1 9)) (projectile (2 4)) (cl-lib (0 3))) "Perspective integration with Projectile" tar ((:url . "https://github.com/bbatsov/persp-projectile") (:commit . "6e4c2e017d59d10d627cf95b2bb9f9fa2b22a3a3") (:revdesc . "6e4c2e017d59") (:keywords "project" "convenience"))]) + (perspective . [(20251104 1408) ((emacs (24 4)) (cl-lib (0 5))) "Switch between named \"perspectives\" of the editor" tar ((:url . "http://github.com/nex3/perspective-el") (:commit . "7f47c9a7be7b7d03f6d8430c84eec80ae5896699") (:revdesc . "7f47c9a7be7b") (:keywords "workspace" "convenience" "frames") (:authors ("Natalie Weizenbaum" . "nex342@gmail.com")) (:maintainers ("Natalie Weizenbaum" . "nex342@gmail.com")) (:maintainer "Natalie Weizenbaum" . "nex342@gmail.com"))]) + (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 ((:url . "https://github.com/SqrtMinusOne/perspective-exwm.el") (:commit . "68fb0ca2d482e0f4a92c4ceb19bf2262ea937e95") (:revdesc . "68fb0ca2d482") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (perspective-project-bridge . [(20231024 1737) ((emacs (27 1)) (perspective (2 18))) "Integration of perspective.el + project.el" tar ((:url . "https://github.com/arunkmv/perspective-project-bridge") (:commit . "7b65b08a0151b8279fc3ae75f0016cb8d5eadb53") (:revdesc . "7b65b08a0151") (:keywords "perspective" "project" "convenience" "frames") (:authors ("Arunkumar Vaidyanathan" . "arunkumarmv1997@gmail.com")) (:maintainers ("Arunkumar Vaidyanathan" . "arunkumarmv1997@gmail.com")) (:maintainer "Arunkumar Vaidyanathan" . "arunkumarmv1997@gmail.com"))]) + (perspeen . [(20171203 1021) ((emacs (25 0)) (powerline (2 4))) "An package for multi-workspace" tar ((:url . "https://github.com/seudut/perspeen") (:commit . "edb70c530bda50ff3d1756e32a703d5fef5e5480") (:revdesc . "edb70c530bda") (:keywords "lisp") (:authors ("Peng Li" . "seudut@gmail.com")) (:maintainers ("Peng Li" . "seudut@gmail.com")) (:maintainer "Peng Li" . "seudut@gmail.com"))]) + (pest-mode . [(20221231 15) ((emacs (26 3))) "Major mode for editing Pest files" tar ((:url . "https://github.com/ksqsf/pest-mode") (:commit . "8023a92ce59c34dcd1587cbd85ed144f206ddb89") (:revdesc . "8023a92ce59c") (:keywords "languages") (:authors ("ksqsf" . "i@ksqsf.moe")) (:maintainers ("ksqsf" . "i@ksqsf.moe")) (:maintainer "ksqsf" . "i@ksqsf.moe"))]) + (pet . [(20251217 2147) ((emacs (27 1)) (f (0 6 0)) (map (3 3 1)) (seq (2 24))) "Executable and virtualenv tracker for python-mode" tar ((:url . "https://github.com/wyuenho/emacs-pet/") (:commit . "222f1da892462d7bea5c7a7bbcb6b5a5f4cb2158") (:revdesc . "222f1da89246") (:keywords "tools") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com"))]) + (pfuture . [(20220913 1401) ((emacs (25 2))) "A simple wrapper around asynchronous processes" tar ((:url . "https://github.com/Alexander-Miller/pfuture") (:commit . "19b53aebbc0f2da31de6326c495038901bffb73c") (:revdesc . "19b53aebbc0f") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (pg . [(20251226 1404) ((emacs (28 1)) (peg (1 0 1))) "Socket-level interface to the PostgreSQL database" tar ((:url . "https://github.com/emarsden/pg-el") (:commit . "d0062a20788b48dba693368faee62b5e42ef5961") (:revdesc . "d0062a20788b") (:keywords "data" "comm" "database" "postgresql") (:authors ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainers ("Eric Marsden" . "eric.marsden@risk-engineering.org")) (:maintainer "Eric Marsden" . "eric.marsden@risk-engineering.org"))]) + (pgdevenv . [(20150105 2236) nil "Manage your PostgreSQL development envs" tar ((:url . "https://github.com/dimitri/pgdevenv-el") (:commit . "7f1d5bc734750aca98cf67a9491cdbd5615fd132") (:revdesc . "7f1d5bc73475") (:keywords "emacs" "postgresql" "development" "environment" "shell" "debug" "gdb") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org"))]) + (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 ((:url . "https://github.com/ajtulloch/phabricator.el") (:commit . "d09d6f059aea92d3b11c68664a5e80c901182ab8") (:revdesc . "d09d6f059aea") (:keywords "phabricator" "arcanist" "diffusion"))]) + (phan . [(20200805 356) ((emacs (24)) (composer (0 0 8)) (f (0 17))) "Utility functions for Phan (PHP static analizer)" tar ((:url . "https://github.com/emacs-php/phan.el") (:commit . "b7d523630bb072c4dbcfa9995dc734b25b72a69f") (:revdesc . "b7d523630bb0") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@pixiv.com")) (:maintainers ("USAMI Kenta" . "tadsan@pixiv.com")) (:maintainer "USAMI Kenta" . "tadsan@pixiv.com"))]) + (phi-autopair . [(20210306 424) ((paredit (20))) "Another simple-minded autopair implementation" tar ((:url . "http://zk-phi.gitub.io/") (:commit . "6a67c37d31a3ff9261fc9f812547a0c86721fc90") (:revdesc . "6a67c37d31a3"))]) + (phi-grep . [(20221004 836) ((cl-lib (0 1)) (emacs (26 1))) "Interactively-editable recursive grep implementation in elisp" tar ((:url . "http://github.com/zk-phi/phi-grep") (:commit . "9f3c42952ad4ad75d24abbdccb041240db4f0557") (:revdesc . "9f3c42952ad4"))]) + (phi-rectangle . [(20200911 204) nil "Another rectangle-mark command (rewrite of rect-mark)" tar ((:url . "http://zk-phi.github.io/") (:commit . "43ee8aea9998b34a9fdb28d7da2e4f75e4154030") (:revdesc . "43ee8aea9998"))]) + (phi-search . [(20250611 1725) nil "Another incremental search & replace, compatible with \"multiple-cursors\"" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "2caee8a353608eb41a41e794e7999a5950dbfee3") (:revdesc . "2caee8a35360"))]) + (phi-search-dired . [(20200816 1542) ((phi-search (2 2 0))) "Interactive filtering for dired powered by phi-search" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "f014a9fb0b6a94af2df0e22f91ef79ce6996afd7") (:revdesc . "f014a9fb0b6a"))]) + (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 ((:url . "https://github.com/knu/phi-search-mc.el") (:commit . "8670eb007604555baa7ef017684a46fc97d254dc") (:revdesc . "8670eb007604") (:keywords "search" "cursors") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (phi-search-migemo . [(20170618 921) ((phi-search (2 2 0)) (migemo (1 9 1))) "Migemo extension for phi-search" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "723b584d386639d59298d872ad7a035d3f8008b0") (:revdesc . "723b584d3866"))]) + (phoenix-dark-mono-theme . [(20170729 1406) nil "Monochromatic version of the Phoenix theme" tar ((:url . "http://github.com/j0ni/phoenix-dark-mono") (:commit . "a54f515d162148bcb38676980bc2316adb3d7b8b") (:revdesc . "a54f515d1621") (:authors ("J Irving" . "j@lollyshouse.ca")) (:maintainers ("J Irving" . "j@lollyshouse.ca")) (:maintainer "J Irving" . "j@lollyshouse.ca"))]) + (phoenix-dark-pink-theme . [(20190821 48) nil "Originally a port of the Sublime Text 2 theme" tar ((:url . "http://github.com/j0ni/phoenix-dark-pink") (:commit . "ddd98a45775be105984ec598384e68df3d3e8046") (:revdesc . "ddd98a45775b") (:authors ("J Irving" . "j@lollyshouse.ca")) (:maintainers ("J Irving" . "j@lollyshouse.ca")) (:maintainer "J Irving" . "j@lollyshouse.ca"))]) + (php-boris . [(20130527 821) nil "Run boris php REPL" tar ((:url . "https://github.com/tomterl/php-boris") (:commit . "4bb7e4d34d9906ddce688205eb24cafe634c6d06") (:revdesc . "4bb7e4d34d99") (:keywords "php" "commint" "repl" "boris") (:maintainers ("Tom Regner" . "tom@goochesa.de")) (:maintainer "Tom Regner" . "tom@goochesa.de"))]) + (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 ((:url . "https://github.com/steckerhalter/php-boris-minor-mode") (:commit . "8648eba604e4ff82ef6594a2c5ee4cb4825e6235") (:revdesc . "8648eba604e4") (:keywords "php" "repl" "eval"))]) + (php-cs-fixer . [(20250211 214) ((emacs (24 3))) "The php-cs-fixer wrapper" tar ((:url . "https://github.com/pivaldi/php-cs-fixer") (:commit . "4bf549c1dedad2a2a52257b866bcb180a31f129d") (:revdesc . "4bf549c1deda") (:keywords "languages" "php"))]) + (php-eldoc . [(20140202 1941) nil "Eldoc backend for php" tar ((:url . "https://github.com/sabof/php-eldoc") (:commit . "df05064146b884d9081e10657e32dc480f070cfe") (:revdesc . "df05064146b8"))]) + (php-mode . [(20250602 1308) ((emacs (27 1))) "Major mode for editing PHP code" tar ((:url . "https://github.com/emacs-php/php-mode") (:commit . "40b8abed3079771e060dd99a56703520dabf5be4") (:revdesc . "40b8abed3079") (:keywords "languages" "php") (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (php-quickhelp . [(20210819 2025) ((emacs (25 1))) "Quickhelp at point for php" tar ((:url . "https://github.com/vpxyz/php-quickhelp") (:commit . "d5e11b7a6bad64550521e8822139a33218b8c9bb") (:revdesc . "d5e11b7a6bad"))]) + (php-refactor-mode . [(20171124 635) nil "Minor mode to quickly and safely perform common refactorings" tar ((:url . "https://github.com/keelerm84/php-refactor-mode.el") (:commit . "d06dabd9ca743a04067e02282b69d7b7467fb4b7") (:revdesc . "d06dabd9ca74") (:keywords "php" "refactor") (:authors ("Matthew M. Keeler" . "keelerm84@gmail.com")) (:maintainers ("Matthew M. Keeler" . "keelerm84@gmail.com")) (:maintainer "Matthew M. Keeler" . "keelerm84@gmail.com"))]) + (php-runtime . [(20241024 1622) ((emacs (25 1)) (compat (29))) "Language binding bridge to PHP" tar ((:url . "https://github.com/emacs-php/php-runtime.el") (:commit . "37beef404c70d7b80dc085b1ee1e13fd9c375fe6") (:revdesc . "37beef404c70") (:keywords "processes" "php" "lisp") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (php-scratch . [(20210706 459) ((emacs (24 3)) (s (1 11 0)) (php-mode (1 17 0))) "A scratch buffer to interactively evaluate php code" tar ((:url . "https://github.com/mallt/php-scratch") (:commit . "b6bfd279da8a8ac7fc30459485956f3fd5d02573") (:revdesc . "b6bfd279da8a") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainers ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) + (phpactor . [(20251226 855) ((emacs (27 1)) (php-runtime (0 2)) (composer (0 2 0)) (async (1 9 3))) "Interface to Phpactor" tar ((:url . "https://github.com/emacs-php/phpactor.el") (:commit . "a4371b525afd5cd74c24461c50a489a1f459bd38") (:revdesc . "a4371b525afd") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (phpstan . [(20250930 1139) ((emacs (25 1)) (compat (30)) (php-mode (1 22 3)) (php-runtime (0 2))) "Interface to PHPStan (PHP static analyzer)" tar ((:url . "https://github.com/emacs-php/phpstan.el") (:commit . "07ef7531f2ec73b90a965ac865cca8c96086f9de") (:revdesc . "07ef7531f2ec") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (phpt-mode . [(20190512 1809) ((emacs (25)) (polymode (0 1 5)) (php-mode (1 21 2))) "Major mode for editing PHPT test code" tar ((:url . "https://github.com/emacs-php/phpt-mode") (:commit . "deb386f1a81003074c476f15e1975d445ff6df01") (:revdesc . "deb386f1a810") (:keywords "languages" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (phpunit . [(20230801 1523) ((s (1 12 0)) (f (0 19 0)) (pkg-info (0 6)) (cl-lib (0 5)) (emacs (24 3))) "Launch PHP unit tests using phpunit" tar ((:url . "https://github.com/nlamirault/phpunit.el") (:commit . "e5baa445363942fbd9898ac3cb91eea64b69d316") (:revdesc . "e5baa4453639") (:keywords "tools" "php" "tests" "phpunit") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com") ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com") ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (pianobar . [(20201002 1756) nil "Thin wrapper for Pianobar, a Pandora Radio client" tar ((:url . "http://github.com/agrif/pianobar.el") (:commit . "d708417608df4f09ee565fddaad03dfe181829a8") (:revdesc . "d708417608df") (:authors ("Aaron Griffith" . "aargri@gmail.com")) (:maintainers ("Aaron Griffith" . "aargri@gmail.com")) (:maintainer "Aaron Griffith" . "aargri@gmail.com"))]) + (pickle . [(20190923 354) ((emacs (25 1)) (cl-lib (0 6 1))) "Major mode for editing cucumber gherkin files" tar ((:url . "https://github.com/ahungry/pickle-mode") (:commit . "3a0a717f2a24827667f34bc53830a3b81cd57460") (:revdesc . "3a0a717f2a24") (:keywords "ahungry" "languages" "cucumber" "gherkin") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (picpocket . [(20250830 1131) ((emacs (25 1))) "Image viewer" tar ((:url . "https://github.com/johanclaesson/picpocket") (:commit . "9fafd11824fd81cd884c20ff7243d6a58cea8ff2") (:revdesc . "9fafd11824fd") (:keywords "multimedia") (:authors ("Johan Claesson" . "johanwclaesson@gmail.com")) (:maintainers ("Johan Claesson" . "johanwclaesson@gmail.com")) (:maintainer "Johan Claesson" . "johanwclaesson@gmail.com"))]) + (pif . [(20250207 1624) ((emacs (29 1))) "Prevent Initial Flash of Light" tar ((:url . "https://github.com/oliverepper/pif") (:commit . "c993c1446ff3460a2f599b84ac81e9f00c4c7333") (:revdesc . "c993c1446ff3") (:keywords "convenience" "faces" "display" "startup" "appearance" "dark-theme") (:authors ("Oliver Epper" . "oliver.epper@gmail.com")) (:maintainers ("Oliver Epper" . "oliver.epper@gmail.com")) (:maintainer "Oliver Epper" . "oliver.epper@gmail.com"))]) + (pig-mode . [(20180520 1400) nil "Major mode for Pig files" tar ((:url . "https://github.com/motus/pig-mode") (:commit . "4c6c6e1b1bb719d8adc6c47cc24665f6fe558959") (:revdesc . "4c6c6e1b1bb7"))]) + (pig-snippets . [(20130913 624) ((yasnippet (0 8 0))) "Snippets for pig-mode" tar ((:url . "https://github.com/motus/pig-mode") (:commit . "69ca24cb756dd516828e284e33274145eba21183") (:revdesc . "69ca24cb756d") (:keywords "snippets") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainers ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))]) + (pikchr-mode . [(20241127 2138) ((emacs (27 1))) "A major mode for the pikchr diagram markup language" tar ((:url . "https://github.com/kljohann/pikchr-mode") (:commit . "27b5d06d6f55b4db45b9fc96d614f1dce8ee70fa") (:revdesc . "27b5d06d6f55") (:keywords "languages") (:authors ("Johann Klähn" . "johann@jklaehn.de")) (:maintainers ("Johann Klähn" . "johann@jklaehn.de")) (:maintainer "Johann Klähn" . "johann@jklaehn.de"))]) + (pillar . [(20141112 1811) ((makey (0 3))) "Major mode for editing Pillar files" tar ((:url . "http://github.com/DamienCassou/pillar-mode") (:commit . "13a7f676544cc66005ccd8e6fc1c25e4ccd6f909") (:revdesc . "13a7f676544c") (:keywords "markup" "major-mode") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com"))]) + (pinboard . [(20230101 850) ((emacs (25 1)) (cl-lib (0 5))) "A pinboard.in client" tar ((:url . "https://github.com/davep/pinboard.el") (:commit . "112e903b489fed3f71b3165447ba6f21ee5675e6") (:revdesc . "112e903b489f") (:keywords "hypermedia" "bookmarking" "reading" "pinboard") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (pinboard-api . [(20140324 1148) nil "Rudimentary http://pinboard.in integration" tar ((:url . "https://github.com/danieroux/pinboard-api-el") (:commit . "b7b5214d0c35178f8dca08cf22d6ef3c21f0fce4") (:revdesc . "b7b5214d0c35") (:keywords "pinboard" "www") (:authors ("Danie Roux" . "danie@danieroux.com")) (:maintainers ("Danie Roux" . "danie@danieroux.com")) (:maintainer "Danie Roux" . "danie@danieroux.com"))]) + (pinboard-popular . [(20180511 1726) ((loop (1 4))) "Displays links from the pinboard.in popular page" tar ((:url . "https://github.com/asimpson/pinboard-popular") (:commit . "c0bc76cd35f8ecf34723c64a702b82eec2751318") (:revdesc . "c0bc76cd35f8") (:keywords "pinboard"))]) + (pine-script-mode . [(20250826 901) ((emacs (24))) "Major mode for TradingView Pine Script v6 and older" tar ((:url . "https://github.com/darrylhebbes/pine-script-mode") (:commit . "f8c8ae596ca6296b9d5f618ff5b82c223d007ed5") (:revdesc . "f8c8ae596ca6") (:keywords "extensions" "pinescript") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.edu")) (:maintainers ("Darryl Hebbes" . "darryl.hebbes@gmail.com")) (:maintainer "Darryl Hebbes" . "darryl.hebbes@gmail.com"))]) + (pink-bliss-uwu-theme . [(20251211 1304) ((emacs (24 1))) "Pink color theme" tar ((:url . "https://github.com/themkat/pink-bliss-uwu") (:commit . "be3ceccb6fc035ca9dbfff4a54e653b8621f949a") (:revdesc . "be3ceccb6fc0"))]) + (pinot . [(20140211 2026) nil "Emacs interface to pinot-search" tar ((:url . "https://github.com/tkf/emacs-pinot-search") (:commit . "67fda555a155b22bb2ce44ba618b4bd6fc5f144a") (:revdesc . "67fda555a155") (:authors ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainers ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com"))]) + (pinyin . [(20220815 1239) ((cl-lib (0 5)) (emacs (24))) "Convert Hanzi to Pinyin (汉字转拼音)" tar ((:url . "https://github.com/xuchunyang/pinyin.el") (:commit . "b7a0aad8ff35e50d1c536df4c0e73fc7e9d06700") (:revdesc . "b7a0aad8ff35") (:keywords "extensions") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (pinyin-isearch . [(20240328 2110) ((emacs (28 1))) "Pinyin mode for isearch" tar ((:url . "https://github.com/Anoncheg1/pinyin-isearch") (:commit . "bc69e38e25e623a321c5c37959fb175334cf9e1a") (:revdesc . "bc69e38e25e6") (:keywords "chinese" "pinyin" "matching" "convenience"))]) + (pinyin-search . [(20230919 538) ((pinyinlib (0 1 0))) "Search Chinese by Pinyin" tar ((:url . "https://github.com/xuchunyang/pinyin-search.el") (:commit . "3632bb98a5b8c0a396cd0a9d107e323e1ed3b7e7") (:revdesc . "3632bb98a5b8") (:keywords "chinese" "search") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com"))]) + (pinyinlib . [(20200911 1723) nil "Convert first letter of Pinyin to Simplified/Traditional Chinese characters" tar ((:url . "https://github.com/cute-jumper/pinyinlib.el") (:commit . "1772c79b6f319b26b6a394a8dda065be3ea4498d") (:revdesc . "1772c79b6f31") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (pip-frame . [(20220802 1914) ((emacs (25 1))) "Display and manage a PIP frame" tar ((:url . "https://git.zamazal.org/pdm/pip-frame") (:commit . "8c396a11f532a1beb594b65e99e594f1e9f1c2c8") (:revdesc . "8c396a11f532") (:keywords "frames") (:authors ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainers ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainer "Milan Zamazal" . "pdm@zamazal.org"))]) + (pip-requirements . [(20240621 2151) ((dash (2 8 0))) "A major mode for editing pip requirements files" tar ((:url . "https://github.com/Wilfred/pip-requirements.el") (:commit . "31e0dc62abb2d88fa765e0ea88b919d756cc0e4f") (:revdesc . "31e0dc62abb2") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (pipenv . [(20220514 123) ((emacs (25 1)) (s (1 12 0)) (pyvenv (1 20)) (load-env-vars (0 0 2))) "A Pipenv porcelain" tar ((:url . "https://github.com/pwalsh/pipenv.el") (:commit . "3af159749824c03f59176aff7f66ddd6a5785a10") (:revdesc . "3af159749824") (:authors ("Paul Walsh" . "paulywalsh@gmail.com")) (:maintainers ("Paul Walsh" . "paulywalsh@gmail.com")) (:maintainer "Paul Walsh" . "paulywalsh@gmail.com"))]) + (pipewire . [(20220725 1858) ((emacs (28 1))) "PipeWire user interface" tar ((:url . "https://git.zamazal.org/pdm/pipewire-0") (:commit . "115a8a89a3a0c6a89ebe22df0ef0928a701cb1f0") (:revdesc . "115a8a89a3a0") (:keywords "multimedia") (:authors ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainers ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainer "Milan Zamazal" . "pdm@zamazal.org"))]) + (pippel . [(20220416 1743) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0))) "Frontend to python package manager pip" tar ((:url . "https://github.com/arifer612/pippel") (:commit . "19153aa8845aa95d080f224d4fcaf2d75224bd5a") (:revdesc . "19153aa8845a") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainers ("Arif Er" . "arifer612@protonmail.me")) (:maintainer "Arif Er" . "arifer612@protonmail.me"))]) + (pixelblaze . [(20220918 1925) ((emacs (27 1)) (websocket (1 13))) "Interact with a Pixelblaze via Websocket" tar ((:url . "https://github.com/mgsb/emacs-pixelblaze") (:commit . "564a093f700a3292cbffb3887dd3a8d789f54e6d") (:revdesc . "564a093f700a") (:keywords "games" "pixelblaze" "neopixel" "ws2812" "sk6812") (:authors ("Mark Grosen" . "mark@grosen.org")) (:maintainers ("Mark Grosen" . "mark@grosen.org")) (:maintainer "Mark Grosen" . "mark@grosen.org"))]) + (pixie-mode . [(20180626 541) ((clojure-mode (3 0 1)) (inf-clojure (1 0 0))) "Major mode for Pixie-lang" tar ((:url . "https://github.com/johnwalker/pixie-mode") (:commit . "a40c2632cfbe948852a5cdcfd44e6a65db11834d") (:revdesc . "a40c2632cfbe") (:authors ("John Walker" . "john.lou.walker@gmail.com")) (:maintainers ("John Walker" . "john.lou.walker@gmail.com")) (:maintainer "John Walker" . "john.lou.walker@gmail.com"))]) + (pixiv-novel-mode . [(20160220 1421) nil "Major mode for pixiv novel" tar ((:url . "https://github.com/zonuexe/pixiv-novel-mode.el") (:commit . "0d1ca524d92b91f20a7105402a773bc21779b434") (:revdesc . "0d1ca524d92b") (:keywords "novel" "pixiv") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (pkg-info . [(20150517 1143) ((epl (0 8))) "Information about packages" tar ((:url . "https://github.com/lunaryorn/pkg-info.el") (:commit . "4dbe328c9eced79e0004e3fdcd7bfb997a928be5") (:revdesc . "4dbe328c9ece") (:keywords "convenience") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainers ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com"))]) + (pkg-overview . [(20210802 1509) ((emacs (24 3))) "Make org documentation from elisp source file" tar ((:url . "https://github.com/Boruch-Baum/emacs-pkg-overview") (:commit . "9b2e416758a6c107bb8cc670ec4d2627f82d5590") (:revdesc . "9b2e416758a6") (:keywords "docs" "help" "lisp" "maint" "outlines" "tools") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainers ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com"))]) + (pkgbuild-mode . [(20250106 2055) ((emacs (26 1))) "Interface to the Arch Linux package manager" tar ((:url . "https://github.com/juergenhoetzel/pkgbuild-mode") (:commit . "aadf3d1d19c5eb9b52c15c5b73b1a46faac5b7d5") (:revdesc . "aadf3d1d19c5") (:keywords "languages") (:authors ("Juergen Hoetzel" . "juergen@hoetzel.info")) (:maintainers ("Juergen Hoetzel" . "juergen@hoetzel.info")) (:maintainer "Juergen Hoetzel" . "juergen@hoetzel.info"))]) + (pkl-mode . [(20240422 1529) ((emacs (24 3))) "Major mode for editing Pkl files" tar ((:url . "https://github.com/sin-ack/pkl-mode") (:commit . "c57fe374a9c57eee6432d0b449e410ab8dc40a89") (:revdesc . "c57fe374a9c5") (:keywords "languages" "pkl") (:authors ("sin-ack" . "sin-ack@protonmail.com")) (:maintainers ("sin-ack" . "sin-ack@protonmail.com")) (:maintainer "sin-ack" . "sin-ack@protonmail.com"))]) + (plain-org-wiki . [(20201217 1027) ((emacs (24 3)) (ivy (0 12 0))) "Simple jump-to-org-files in a directory package" tar ((:url . "https://github.com/abo-abo/plain-org-wiki") (:commit . "faeeb54ca808bbf0f4380a938e75805b7a78dbf7") (:revdesc . "faeeb54ca808") (:keywords "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (plain-theme . [(20171124 410) ((emacs (24))) "Plain theme without syntax highlighting" tar ((:url . "https://github.com/yegortimoshenko/plain-theme") (:commit . "2609a811335d58cfb73a65d6307c156fe09037d3") (:revdesc . "2609a811335d"))]) + (plan9-theme . [(20180804 1441) nil "A color theme for Emacs based on Plan9" tar ((:url . "https://github.com/john2x/plan9-theme.el") (:commit . "4c1050b8ed42e0f99ef64c77ec370a786bd0003c") (:revdesc . "4c1050b8ed42") (:authors ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainers ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainer "John Louis Del Rosario" . "john2x@gmail.com"))]) + (planemo-mode . [(20230227 1139) ((emacs (27 1)) (dash (2 17 0))) "Minor mode for editing Galaxy XML files" tar ((:url . "https://gitlab.com/mtekman/planemo-mode.el") (:commit . "537ebe40688ca8f3786aa1e9842265e6f34584d2") (:revdesc . "537ebe40688c") (:keywords "outlines"))]) + (planet-theme . [(20161031 217) ((emacs (24))) "A dark theme inspired by Gmail's 'Planets' theme of yore" tar ((:url . "https://github.com/cmack/emacs-planet-theme") (:commit . "b0a310ff36565fe22224c407cf59569986698a32") (:revdesc . "b0a310ff3656") (:keywords "themes") (:authors ("Charlie McMackin" . "charlie.mac@gmail.com")) (:maintainers ("Charlie McMackin" . "charlie.mac@gmail.com")) (:maintainer "Charlie McMackin" . "charlie.mac@gmail.com"))]) + (plantuml-mode . [(20250705 1148) ((dash (2 0 0)) (emacs (25 1)) (deflate (0 0 3))) "Major mode for PlantUML" tar ((:url . "https://github.com/skuro/plantuml-mode") (:commit . "0a19d9988879c57b176dd4c03f59003644f9c9b0") (:revdesc . "0a19d9988879") (:keywords "files" "text" "processes" "tools"))]) + (plaster . [(20250821 1444) ((emacs (24 3))) "Pasting to a plaster host with buffers" tar ((:url . "https://shirakumo.org/docs/plaster/") (:commit . "9d77d89aef9ea438e4e0a144256f0ccbe3072a7c") (:revdesc . "9d77d89aef9e") (:keywords "convenience" "paste service") (:authors ("Yukari Hafner" . "shinmera@tymoon.eu")) (:maintainers ("Yukari Hafner" . "shinmera@tymoon.eu")) (:maintainer "Yukari Hafner" . "shinmera@tymoon.eu"))]) + (platformio-mode . [(20210511 957) ((emacs (25 1)) (async (1 9 0)) (projectile (0 13 0))) "PlatformIO integration" tar ((:url . "https://github.com/zachmassia/platformio-mode") (:commit . "f4fd8932995a8aed80eab14e54232010c2889012") (:revdesc . "f4fd8932995a") (:authors ("Zach Massia" . "zmassia@gmail.com") ("Dante Catalfamo" . "dante@lambda.cx")) (:maintainers ("Zach Massia" . "zmassia@gmail.com") ("Dante Catalfamo" . "dante@lambda.cx")) (:maintainer "Zach Massia" . "zmassia@gmail.com"))]) + (play-crystal . [(20180114 1024) ((emacs (24 4)) (dash (2 12 0)) (request (0 2 0))) "Https://play.crystal-lang.org integration" tar ((:url . "https://github.com/veelenga/play-crystal.el") (:commit . "86b54346e7c832c14f8e5654a462f6490a6b11d7") (:revdesc . "86b54346e7c8") (:keywords "convenience"))]) + (play-routes-mode . [(20170426 733) nil "Play Framework Routes File Support" tar ((:url . "https://github.com/brocode/play-routes-mode/") (:commit . "ef8230932f7bb96643febbd6872c522932f9571a") (:revdesc . "ef8230932f7b") (:keywords "play" "scala") (:authors ("M.Riehl" . "max@flatmap.ninja") ("P.Haun" . "bomgar85@googlemail.com")) (:maintainers ("M.Riehl" . "max@flatmap.ninja") ("P.Haun" . "bomgar85@googlemail.com")) (:maintainer "M.Riehl" . "max@flatmap.ninja"))]) + (playerctl . [(20220714 1234) nil "Control your music player (e.g. Spotify) with playerctl" tar ((:url . "https://github.com/thomasluquet/playerctl.el") (:commit . "0912ed5a5ab6d611b5f35db589f608f1fafdc81a") (:revdesc . "0912ed5a5ab6") (:keywords "multimedia" "playerctl" "music") (:authors ("Thomas Luquet" . "thomas@luquet.net")) (:maintainers ("Thomas Luquet" . "thomas@luquet.net")) (:maintainer "Thomas Luquet" . "thomas@luquet.net"))]) + (playground . [(20200812 1336) ((emacs (24 4))) "Manage sandboxes for alternative configurations" tar ((:url . "https://github.com/akirak/emacs-playground") (:commit . "77d2faab0bc3f6e1f2c65c66644c52167304610d") (:revdesc . "77d2faab0bc3") (:keywords "maint") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (playonline . [(20200318 758) ((emacs (24 4)) (dash (2 1)) (request (0 2))) "Play code with online playgrounds" tar ((:url . "https://github.com/twlz0ne/playonline.el") (:commit . "463a94fc01112817d1e6e0209ea85385efcb1329") (:revdesc . "463a94fc0111") (:keywords "tools") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com"))]) + (plenv . [(20130707 616) nil "A plenv wrapper for Emacs" tar ((:url . "https://github.com/karupanerura/plenv.el") (:commit . "ee937d0f3a1a7ba2d035f45be896d3ed8fefaee2") (:revdesc . "ee937d0f3a1a") (:keywords "emacs" "perl") (:authors ("Kenta Sato" . "karupa@cpan.org")) (:maintainers ("Kenta Sato" . "karupa@cpan.org")) (:maintainer "Kenta Sato" . "karupa@cpan.org"))]) + (plim-mode . [(20140813 13) nil "Major mode for editing Plim files" tar ((:url . "http://github.com/dongweiming/plim-mode") (:commit . "98cd6d11b7ff3ee7b6cb8845f143b5a692a3e6e8") (:revdesc . "98cd6d11b7ff") (:keywords "markup" "language"))]) + (plisp-mode . [(20250328 45) nil "Major mode for PicoLisp programming" tar ((:url . "https://github.com/flexibeast/plisp-mode") (:commit . "062c333343e64427dd70a2739ab9225fd23e550a") (:revdesc . "062c333343e6") (:keywords "picolisp" "lisp" "programming") (:authors ("Alexis Guillermo R. Palavecine" . "grpala@gmail.com") ("Thorsten Jolitz" . "tjolitz@gmail.com") ("Alexis" . "flexibeast@gmail.com")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com"))]) + (plsense . [(20151104 1445) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 2 0))) "Provide interface for PlSense that is a development tool for Perl" tar ((:url . "https://github.com/aki2o/emacs-plsense") (:commit . "d50f9dccc98f42bdb42f1d1c8142246e03879218") (:revdesc . "d50f9dccc98f") (:keywords "perl" "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (plsense-direx . [(20140520 2008) ((direx (0 1 -3)) (plsense (0 3 2)) (log4e (0 2 0)) (yaxception (0 3 2))) "Perl Package Explorer" tar ((:url . "https://github.com/aki2o/plsense-direx") (:commit . "8a2f465264c74e04524cc789cdad0190ace43f6c") (:revdesc . "8a2f465264c7") (:keywords "perl" "convenience") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (plumber . [(20250903 2031) ((emacs (25 1)) (compat (28 1 2 2))) "Run different commands depending on the text format" tar ((:url . "https://github.com/8dcc/plumber.el") (:commit . "6fb863d0c0b6b86fc6e488d4d9b1a2a85822c3de") (:revdesc . "6fb863d0c0b6") (:keywords "convenience" "matching" "tools") (:authors ("8dcc" . "8dcc.git@gmail.com")) (:maintainers ("8dcc" . "8dcc.git@gmail.com")) (:maintainer "8dcc" . "8dcc.git@gmail.com"))]) + (plur . [(20160504 924) ((emacs (24 4))) "Easily search and replace multiple variants of a word" tar ((:url . "https://github.com/xuchunyang/plur") (:commit . "5bdd3b9a2f0624414bd596e798644713cd1545f0") (:revdesc . "5bdd3b9a2f06") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com"))]) + (pmdm . [(20191101 2346) nil "Poor man's desktop-mode alternative" tar ((:url . "https://hg.serna.eu/emacs/pmdm") (:commit . "6d2af9f9e88e6c91eb74dafaddb5f009e1de4907") (:revdesc . "6d2af9f9e88e") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainers ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com"))]) + (pnpm-mode . [(20200527 557) ((emacs (24 1))) "Minor mode for working with pnpm projects" tar ((:url . "https://github.com/rajasegar/pnpm-mode") (:commit . "ec66ba36ba6e07883b029569c33fd461d28eed75") (:revdesc . "ec66ba36ba6e") (:keywords "convenience" "project" "javascript" "node" "npm" "pnpm") (:authors ("Rajasegar Chandran" . "rajasegar.c@gmail.com")) (:maintainers ("Rajasegar Chandran" . "rajasegar.c@gmail.com")) (:maintainer "Rajasegar Chandran" . "rajasegar.c@gmail.com"))]) + (po-mode . [(20231006 1425) nil "Major mode for GNU gettext PO files" tar ((:url . "https://github.com/emacsmirror/po-mode") (:commit . "ca125eba813a6b29b5fbe7ea8a2e3d92f225ab8c") (:revdesc . "ca125eba813a") (:keywords "i18n" "gettext"))]) + (pocket-api . [(20180403 109) ((emacs (24 4)) (request (0 2))) "Another pocket api" tar ((:url . "https://github.com/lujun9972/pocket-api.el") (:commit . "3eb9430b9db90bc02e736e433eb86389f7655189") (:revdesc . "3eb9430b9db9") (:keywords "convenience" "pocket") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (pocket-lib . [(20240713 1529) ((emacs (25 1)) (plz (0 7 3)) (dash (2 13 0)) (kv (0 0 19)) (s (1 12 0))) "Library for accessing getpocket.com API" tar ((:url . "https://github.com/alphapapa/pocket-lib.el") (:commit . "f05f80645d8101518eed13b2da81400fe9b50918") (:revdesc . "f05f80645d81") (:keywords "pocket") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (pocket-mode . [(20171201 1315) ((emacs (24 4)) (pocket-api (0 1))) "Manage your pocket" tar ((:url . "https://github.com/lujun9972/pocket-mode") (:commit . "229de7d35b7e5605797591c46aa8200d7efc363c") (:revdesc . "229de7d35b7e") (:keywords "convenience" "pocket") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (pocket-reader . [(20241225 117) ((emacs (25 1)) (dash (2 13 0)) (kv (0 0 19)) (peg (1 0 1)) (pocket-lib (0 3 -1)) (s (1 10)) (ov (1 0 6)) (org-web-tools (0 1)) (ht (2 2))) "Client for Pocket reading list" tar ((:url . "https://github.com/alphapapa/pocket-reader.el") (:commit . "d507c376f0edaee475466e4ecdcead4d4184e5aa") (:revdesc . "d507c376f0ed") (:keywords "pocket") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (podcaster . [(20200607 1054) ((cl-lib (0 5))) "Podcast client" tar ((:url . "https://github.com/lujun9972/podcaster") (:commit . "7a21173da0c57e6aa41dbdc33383047386b35eb5") (:revdesc . "7a21173da0c5") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (poe-lootfilter-mode . [(20190330 1117) ((emacs (24 3))) "Major mode for editing Path of Exile lootfilters" tar ((:url . "https://github.com/jdodds/poe-lootfilter-mode") (:commit . "5ef06684cb2b17b090ee1f303c2b789fa71bc106") (:revdesc . "5ef06684cb2b") (:keywords "languages" "games") (:authors ("Jeremiah Dodds" . "jeremiah.dodds@gmail.com")) (:maintainers ("Jeremiah Dodds" . "jeremiah.dodds@gmail.com")) (:maintainer "Jeremiah Dodds" . "jeremiah.dodds@gmail.com"))]) + (poet-theme . [(20200606 2343) ((emacs (24 1))) "A theme for prose" tar ((:url . "https://github.com/kunalb/poet/") (:commit . "16eb694f0755c04c4db98614d0eca1199fddad70") (:revdesc . "16eb694f0755") (:keywords "faces" "theme" "prose") (:authors ("Kunal Bhalla" . "bhalla.kunal@gmail.com")) (:maintainers ("Kunal Bhalla" . "bhalla.kunal@gmail.com")) (:maintainer "Kunal Bhalla" . "bhalla.kunal@gmail.com"))]) + (poetry . [(20240329 1103) ((transient (0 2 0)) (pyvenv (1 2)) (emacs (25 1))) "Interface to Poetry" tar ((:url . "https://github.com/cybniv/poetry.el") (:commit . "1dff0d4a51ea8aff5f6ce97b154ea799902639ad") (:revdesc . "1dff0d4a51ea") (:keywords "python" "tools") (:authors ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainers ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Gaby Launay" . "gaby.launay@protonmail.com"))]) + (point-pos . [(20170421 1632) nil "Save and restore point positions" tar ((:url . "https://github.com/alezost/point-pos.el") (:commit . "4cd0f8c8d1296c5c64f708b6a5835e8520c51b68") (:revdesc . "4cd0f8c8d129") (:keywords "tools" "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (point-stack . [(20200427 107) nil "Back and forward navigation through buffer locations" tar ((:url . "https://github.com/dgutov/point-stack") (:commit . "cddcea2c91038710c245819b3cda2dd739726134") (:revdesc . "cddcea2c9103") (:authors ("Matt Harrison" . "matthewharrison@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainers ("Matt Harrison" . "matthewharrison@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Matt Harrison" . "matthewharrison@gmail.com"))]) + (poke-line . [(20201023 247) ((emacs (24 3))) "Minor mode to show position in a buffer using a Pokemon" tar ((:url . "https://github.com/RyanMillerC/poke-line/") (:commit . "8d484dbaa1215d902fbd1e3c9163b39a43ec532a") (:revdesc . "8d484dbaa121") (:keywords "pokemon" "fun" "mode-line" "mouse") (:authors ("Ryan Miller" . "ryan@devopsmachine.com")) (:maintainers ("Ryan Miller" . "ryan@devopsmachine.com")) (:maintainer "Ryan Miller" . "ryan@devopsmachine.com"))]) + (polish-holidays . [(20250613 2245) ((emacs (24 1))) "Polish holidays" tar ((:url . "https://github.com/przemarbor/polish-holidays") (:commit . "3a1e11f53b0fa41bc511c65ae1699394f49cbb08") (:revdesc . "3a1e11f53b0f") (:keywords "calendar"))]) + (pollen-mode . [(20220904 447) ((emacs (24 3)) (cl-lib (0 5))) "Major mode for editing pollen files" tar ((:url . "https://github.com/lijunsong/pollen-mode") (:commit . "19174fab69ce4d2ae903ef2c3da44054e8b84268") (:revdesc . "19174fab69ce") (:keywords "languages" "pollen" "pollenpub") (:authors ("Junsong Li" . "ljs.darkfishATGMAIL")))]) + (poly-R . [(20250502 1525) ((emacs (25)) (ess (25)) (polymode (0 2 2)) (poly-markdown (0 2 2)) (poly-noweb (0 2 2))) "Various polymodes for R language" tar ((:url . "https://github.com/polymode/poly-R") (:commit . "fee0b6e99943fa49ca5ba8ae1a97cbed5ed51946") (:revdesc . "fee0b6e99943") (:keywords "languages" "multi-modes"))]) + (poly-ansible . [(20250501 1455) ((ansible (0 4 1)) (ansible-doc (0 4)) (emacs (24 1)) (jinja2-mode (0 2)) (polymode (0 2)) (systemd (1 4)) (yaml-mode (0 0 13))) "Polymode for Ansible: Jinja2 in YAML" tar ((:url . "https://gitlab.com/mavit/poly-ansible/") (:commit . "fc31708bff007a40314c1cfd5a5b9659f39b024a") (:revdesc . "fc31708bff00") (:keywords "languages") (:authors ("Peter Oliver" . "poly-ansible@mavit.org.uk")) (:maintainers ("Peter Oliver" . "poly-ansible@mavit.org.uk")) (:maintainer "Peter Oliver" . "poly-ansible@mavit.org.uk"))]) + (poly-erb . [(20200316 1314) ((emacs (25)) (polymode (0 2 2))) "Polymode for erb" tar ((:url . "https://github.com/polymode/poly-erb") (:commit . "56c744b8d87d8cbe0aba2696d4e8525afc4aa0e8") (:revdesc . "56c744b8d87d") (:keywords "emacs"))]) + (poly-gams . [(20240812 1540) ((emacs (25)) (polymode (0 2 2)) (gams-mode (6 12))) "Polymode for GAMS" tar ((:url . "https://github.com/ShiroTakeda/poly-gams") (:commit . "e3abb2a195077750c89146900607894ed6239cb4") (:revdesc . "e3abb2a19507") (:keywords "languages" "multi-modes" "gams"))]) + (poly-markdown . [(20251101 1318) ((emacs (25)) (polymode (0 2 2)) (markdown-mode (2 3))) "Polymode for markdown-mode" tar ((:url . "https://github.com/polymode/poly-markdown") (:commit . "2eb00d1d07a9dd5d94c5c12c27714e095b3b142a") (:revdesc . "2eb00d1d07a9") (:keywords "emacs"))]) + (poly-noweb . [(20200316 1315) ((emacs (25)) (polymode (0 2 2))) "Polymode for noweb" tar ((:url . "https://github.com/polymode/poly-noweb") (:commit . "3b0cd36ca9a707e8a09337a3468fa85d81fc461c") (:revdesc . "3b0cd36ca9a7") (:keywords "languages" "multi-modes"))]) + (poly-org . [(20241208 1024) ((emacs (25)) (polymode (0 2 2))) "Polymode for org-mode" tar ((:url . "https://github.com/polymode/poly-org") (:commit . "90d9ca9f440d3b6c03b185353edd37a100559ec4") (:revdesc . "90d9ca9f440d") (:keywords "languages" "multi-modes"))]) + (poly-rst . [(20210418 1009) ((emacs (25)) (polymode (0 2 2))) "Poly-rst-mode polymode" tar ((:url . "https://github.com/polymode/poly-rst") (:commit . "e71f2ae6a00683cdb8006f953e5db0673043e144") (:revdesc . "e71f2ae6a006") (:keywords "languages" "multi-modes"))]) + (poly-ruby . [(20180905 929) ((emacs (25)) (polymode (0 1 2))) "Provides poly-ruby-mode" tar ((:url . "https://github.com/knu/poly-ruby.el") (:commit . "794ebb926ace23e9c1398da934701951432dcea2") (:revdesc . "794ebb926ace") (:keywords "languages") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (poly-slim . [(20200316 1316) ((emacs (25)) (polymode (0 2 2)) (slim-mode (1 1))) "Polymodes for slim" tar ((:url . "https://github.com/polymode/poly-slim") (:commit . "9e9b5164c68955974fd5f5d220aec5af9b5ba3ae") (:revdesc . "9e9b5164c689") (:keywords "emacs"))]) + (poly-wdl . [(20190712 529) ((emacs (25)) (polymode (0 2)) (wdl-mode (20170709))) "Polymode for WDL" tar ((:url . "https://github.com/jmonlong/poly-wdl") (:commit . "fe2ee0c441795c35a8c127fa1f7006a5f251f564") (:revdesc . "fe2ee0c44179") (:keywords "languages") (:authors ("Jean Monlong" . "jean.monlong@gmail.com")) (:maintainers ("Jean Monlong" . "jean.monlong@gmail.com")) (:maintainer "Jean Monlong" . "jean.monlong@gmail.com"))]) + (polybar-sesman . [(20210901 1336) ((emacs (25 1)) (dash (2 19 1)) (sesman (0 3 0))) "Display active sesman connections in polybar" tar ((:url . "https://github.com/markgdawson/polybar-sesman.el") (:commit . "5b8ff640ada92da98400206ba9a61140093a823f") (:revdesc . "5b8ff640ada9") (:keywords "project" "convenience") (:authors ("Mark Dawson" . "markgdawson@gmail.com")) (:maintainers ("Mark Dawson" . "markgdawson@gmail.com")) (:maintainer "Mark Dawson" . "markgdawson@gmail.com"))]) + (polymode . [(20251217 1327) ((emacs (25))) "Extensible framework for multiple major modes" tar ((:url . "https://github.com/polymode/polymode") (:commit . "a48648fe2b2e7ca7675ae88ddc2d197c25914eb9") (:revdesc . "a48648fe2b2e") (:keywords "languages" "multi-modes" "processes") (:maintainers ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com"))]) + (pomidor . [(20240601 1617) ((emacs (24 3)) (alert (1 2)) (dash (2 17 0))) "Simple and cool pomodoro timer" tar ((:url . "https://github.com/TatriX/pomidor") (:commit . "de71c34a1a9aff745181107094d3389816dbeca5") (:revdesc . "de71c34a1a9a") (:keywords "tools" "time" "applications" "pomodoro technique") (:authors ("TatriX" . "tatrics@gmail.com")) (:maintainers ("TatriX" . "tatrics@gmail.com")) (:maintainer "TatriX" . "tatrics@gmail.com"))]) + (pomm . [(20251223 1344) ((emacs (27 1)) (alert (1 2)) (seq (2 22)) (transient (0 3 0))) "Pomodoro and Third Time timers" tar ((:url . "https://github.com/SqrtMinusOne/pomm.el") (:commit . "f198afa7519c365d1d929e7f468caed415df1c43") (:revdesc . "f198afa7519c") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (pomo-cat . [(20251127 1631) ((emacs (27 1)) (popon (0 13)) (posframe (1 1 1))) "Pomodoro timer with cat-themed breaks" tar ((:url . "https://github.com/kn66/pomo-cat.el") (:commit . "441b5f8476e99e740eba72cf52c4edf1bbe51673") (:revdesc . "441b5f8476e9") (:keywords "convenience" "tools" "calendar"))]) + (pomodoro . [(20210225 2018) nil "A timer for the Pomodoro Technique" tar ((:url . "https://github.com/baudtack/pomodoro.el") (:commit . "ed888b24d0b89a5dec6f5278b1064c530c827321") (:revdesc . "ed888b24d0b8") (: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 ((:url . "https://github.com/davidmiller/pony-mode") (:commit . "760684d30b6c234d1b88c9a4673a808f36f7f341") (:revdesc . "760684d30b6c") (:keywords "python" "django") (:authors ("David Miller" . "david@deadpansincerity.com")) (:maintainers ("David Miller" . "david@deadpansincerity.com")) (:maintainer "David Miller" . "david@deadpansincerity.com"))]) + (pony-snippets . [(20200418 354) ((yasnippet (0 8 0))) "Yasnippets for Pony" tar ((:url . "https://github.com/seantallen/pony-snippets") (:commit . "115a0d5066f89554bee9cb1045bcda5a18ebd441") (:revdesc . "115a0d5066f8") (:keywords "snippets" "pony"))]) + (ponylang-mode . [(20250819 1840) ((emacs (28 1))) "A major mode for the Pony programming language" tar ((:url . "https://github.com/ponylang/ponylang-mode") (:commit . "7e6425f2c12538bfeffce754b32ba75a14c72cbd") (:revdesc . "7e6425f2c125") (:keywords "languages" "programming"))]) + (pophint . [(20250202 713) ((log4e (0 4 0)) (yaxception (1 0 0))) "Provide navigation using pop-up tips, like Firefox's Vimperator Hint Mode" tar ((:url . "https://github.com/aki2o/emacs-pophint") (:commit . "c37195caec62a56af77432a8bd92ac720689b5fe") (:revdesc . "c37195caec62") (:keywords "popup") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (poporg . [(20170403 751) nil "Pop a comment or string to an empty buffer for text editing" tar ((:url . "https://github.com/QBobWatson/poporg") (:commit . "2c58d68c81ecca4140bf179f19ed153ec804b65a") (:revdesc . "2c58d68c81ec") (:keywords "outlines" "tools") (: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"))]) + (popper . [(20250323 2147) ((emacs (26 1))) "Summon and dismiss buffers as popups" tar ((:url . "https://github.com/karthink/popper") (:commit . "49f4904480cf4ca5c6db83fcfa9e6ea8d4567d96") (:revdesc . "49f4904480cf") (:keywords "convenience") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com"))]) + (popup . [(20250101 843) ((emacs (24 3))) "Visual Popup User Interface" tar ((:url . "https://github.com/auto-complete/popup-el") (:commit . "7a05700a37aae66d2b24f0cd8851f65383a5cf96") (:revdesc . "7a05700a37aa") (:keywords "lisp") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (popup-complete . [(20141109 308) ((popup (0 5 0))) "Completion with popup" tar ((:url . "https://github.com/syohex/emacs-popup-complete") (:commit . "e362d4a005b36646ffbaa6be604e9e31bc406ca9") (:revdesc . "e362d4a005b3") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (popup-edit-menu . [(20170404 1425) ((emacs (24))) "A popup context edit menu package" tar ((:url . "https://github.com/debugfan/popup-edit-menu") (:commit . "925600a6e29183841199e866cf55e566a6a1b002") (:revdesc . "925600a6e291") (:keywords "lisp" "pop-up" "context" "edit" "menu") (:authors ("Debugfan Chin" . "debugfanchin@gmail.com")) (:maintainers ("Debugfan Chin" . "debugfanchin@gmail.com")) (:maintainer "Debugfan Chin" . "debugfanchin@gmail.com"))]) + (popup-imenu . [(20210404 1153) ((dash (2 12 1)) (popup (0 5 3)) (flx-ido (0 6 1))) "Imenu index popup" tar ((:url . "https://github.com/ancane/popup-imenu") (:commit . "b00c4d503cbbaf01c136b1647329e6a6257d012c") (:revdesc . "b00c4d503cbb") (:keywords "popup" "imenu") (:authors ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainers ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainer "Igor Shymko" . "igor.shimko@gmail.com"))]) + (popup-kill-ring . [(20251130 2000) ((emacs (25 1)) (pos-tip (0 4 6)) (popup (0 5 9))) "Interactively insert items from the kill-ring" tar ((:url . "https://github.com/doomchild/popup-kill-ring") (:commit . "4558409b105ae5f6089081c238139f53cc3ae84f") (:revdesc . "4558409b105a") (:keywords "convenience" "popup" "kill-ring" "pos-tip") (:authors ("HAMANO Kiyoto" . "khiker.mail+elisp@gmail.com")) (:maintainers ("Lee Crabtree" . "lee.crabtree@gmail.com")) (:maintainer "Lee Crabtree" . "lee.crabtree@gmail.com"))]) + (popup-switcher . [(20201216 2229) ((cl-lib (0 3)) (popup (0 5 3))) "Switch to other buffers and files via popup" tar ((:url . "https://github.com/kostafey/popup-switcher") (:commit . "166a90c13310b829bd392235bf7cc1e45188faff") (:revdesc . "166a90c13310") (:keywords "popup" "switch" "buffers" "functions") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com"))]) + (popwin . [(20240925 752) ((emacs (24 3))) "Popup Window Manager" tar ((:url . "https://github.com/emacsorphanage/popwin") (:commit . "58adcd0ca7c3dbd58626ec7019252d64cbc73042") (:revdesc . "58adcd0ca7c3") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (portage-modes . [(20250207 1057) nil "Major modes for editing Portage config files" tar ((:url . "https://github.com/OpenSauce04/portage-modes") (:commit . "10ac263d717ec771e79fdfc1309ea822ec4ba501") (:revdesc . "10ac263d717e") (:authors ("OpenSauce" . "opensauce04@gmail.com")) (:maintainers ("OpenSauce" . "opensauce04@gmail.com")) (:maintainer "OpenSauce" . "opensauce04@gmail.com"))]) + (portage-navi . [(20141208 1355) ((concurrent (0 3 1)) (ctable (0 1 2))) "Portage viewer" tar ((:url . "https://github.com/kiwanami/emacs-portage-navi") (:commit . "8016c3e99fe6cef101d479a3d69185796b22ca2f") (:revdesc . "8016c3e99fe6") (:keywords "tools" "gentoo") (:authors (nil . "m.sakuraiatkiwanami.net")) (:maintainers (nil . "m.sakuraiatkiwanami.net")) (:maintainer nil . "m.sakuraiatkiwanami.net"))]) + (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 ((:url . "https://github.com/jcaw/porthole") (:commit . "9e68b419acf9245208f8094e10041b7f04511473") (:revdesc . "9e68b419acf9") (:keywords "comm" "rpc" "http" "json"))]) + (pos-tip . [(20240209 837) nil "Show tooltip at point" tar ((:url . "https://github.com/pitkali/pos-tip") (:commit . "4889e08cf9077c8589ea6fea4e2ce558614dfcde") (:revdesc . "4889e08cf907") (:keywords "tooltip"))]) + (posframe . [(20251125 846) ((emacs (26 1))) "Pop a posframe (just a frame) at point" tar ((:url . "https://github.com/tumashu/posframe") (:commit . "d93828bf6c36383c365bd564ad3bab5a4403804c") (:revdesc . "d93828bf6c36") (:keywords "convenience" "tooltip") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (posix-manual . [(20231215 1604) ((emacs (24))) "POSIX manual page lookup" tar ((:url . "https://github.com/lassik/emacs-posix-manual") (:commit . "428b10d011082a57db0ce310fad6cd092267e139") (:revdesc . "428b10d01108") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (postcss-sorting . [(20180211 956) ((emacs (24))) "Postcss-sorting interface" tar ((:url . "https://github.com/P233/postcss-sorting.el") (:commit . "deb0c935d2904c11a965758a9aee5a0e905f21fc") (:revdesc . "deb0c935d290") (:authors ("Peiwen Lu" . "hi@peiwen.lu")) (:maintainers ("Peiwen Lu" . "hi@peiwen.lu")) (:maintainer "Peiwen Lu" . "hi@peiwen.lu"))]) + (pov-mode . [(20161115 743) nil "Major mode for editing POV-Ray scene files" tar ((:url . "https://github.com/melmothx/pov-mode") (:commit . "9fc1db3aab7c27155674dd1a87ec62606035d074") (:revdesc . "9fc1db3aab7c") (:keywords "pov" "povray") (:authors ("Peter Boettcher" . "pwb@andrew.cmu.edu")) (:maintainers ("Marco Pessotto" . "melmothx@gmail.com")) (:maintainer "Marco Pessotto" . "melmothx@gmail.com"))]) + (power-mode . [(20220817 429) ((emacs (26 1))) "Imbue Emacs with power!" tar ((:url . "https://github.com/elizagamedev/power-mode.el") (:commit . "313698d9c7766c17b077a70b31a2d0f52496d767") (:revdesc . "313698d9c776") (:keywords "games"))]) + (powerline . [(20221110 1956) ((cl-lib (0 2))) "Rewrite of Powerline" tar ((:url . "http://github.com/milkypostman/powerline/") (:commit . "c35c35bdf5ce2d992882c1f06f0f078058870d4a") (:revdesc . "c35c35bdf5ce") (:keywords "mode-line") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainers ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net"))]) + (powerline-evil . [(20190603 340) ((evil (1 0 8)) (powerline (2 3))) "Utilities for better Evil support for Powerline" tar ((:url . "http://github.com/johnson-christopher/powerline-evil/") (:commit . "b77e2cf571e9990734f2b30d826f3a362b559fd1") (:revdesc . "b77e2cf571e9") (:keywords "evil" "mode-line" "powerline") (:authors ("Chris Johnson" . "chris@christophermjohnson.net")) (:maintainers ("Chris Johnson" . "chris@christophermjohnson.net")) (:maintainer "Chris Johnson" . "chris@christophermjohnson.net"))]) + (powershell . [(20251122 1430) ((emacs (24 5))) "Mode for editing PowerShell scripts" tar ((:url . "http://github.com/jschaf/powershell.el") (:commit . "ae60e11c96cc1767f05ce0cab6a917240ce2e37a") (:revdesc . "ae60e11c96cc") (:keywords "powershell" "languages") (:authors ("Frédéric Perrin" . "fredericperrinreselfr")) (:maintainers ("Juergen Hoetzel" . "juergen@hoetzel.info")) (:maintainer "Juergen Hoetzel" . "juergen@hoetzel.info"))]) + (powerthesaurus . [(20230426 1719) ((emacs (26 1)) (jeison (1 0 0)) (s (1 13 0))) "Powerthesaurus integration" tar ((:url . "http://github.com/SavchenkoValeriy/emacs-powerthesaurus") (:commit . "4b97797cf789aaba411c61a85fe23474ebc5bedc") (:revdesc . "4b97797cf789") (:keywords "convenience" "writing"))]) + (ppcompile . [(20220619 1535) ((emacs (25 1))) "Ping-pong compile projects on remote machines" tar ((:url . "https://github.com/whatacold/ppcompile") (:commit . "4c287c9ebc0e78dbbe75195bb5eb3fe82e0bfaff") (:revdesc . "4c287c9ebc0e") (:keywords "tools") (:authors ("Guangwang Huang" . "whatacold@gmail.com")))]) + (ppd-sr-speedbar . [(20151108 1224) ((sr-speedbar (20140914 2339)) (project-persist-drawer (0 0 4))) "Sr Speedbar adaptor for project-persist-drawer" tar ((:url . "https://github.com/rdallasgrayppd-sr-speedbar") (:commit . "19d3e924407f40a6bb38c8fe427a159af755adce") (:revdesc . "19d3e924407f") (:keywords "projects" "drawer"))]) + (ppp . [(20220211 1529) ((emacs (25 1))) "Extended pretty printer for Emacs Lisp" tar ((:url . "https://github.com/conao3/ppp.el") (:commit . "d5d854c3006dfd268e62c7f91c2aad6f86a505b5") (:revdesc . "d5d854c3006d") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (pr-review . [(20251016 1540) ((emacs (27 1)) (magit-section (4 0)) (magit (4 0)) (markdown-mode (2 5)) (ghub (3 5))) "Review github PR" tar ((:url . "https://github.com/blahgeek/emacs-pr-review") (:commit . "d893429168b87003a99bf567932dce57fdac93fa") (:revdesc . "d893429168b8") (:keywords "tools") (:authors ("Yikai Zhao" . "yikai@z1k.dev")) (:maintainers ("Yikai Zhao" . "yikai@z1k.dev")) (:maintainer "Yikai Zhao" . "yikai@z1k.dev"))]) + (prassee-theme . [(20180709 1004) ((emacs (24))) "A high contrast color theme for Emacs" tar ((:url . "https://github.com/prassee/prassee-emacs-theme") (:commit . "81126f69cdbaab836c00ae7a49aaf89d4229fde1") (:revdesc . "81126f69cdba") (:keywords "dark" "high-contrast" "faces") (:authors ("Prassee" . "prassee.sathian@gmail.com")) (:maintainers ("Prassee" . "prassee.sathian@gmail.com")) (:maintainer "Prassee" . "prassee.sathian@gmail.com"))]) + (prefab . [(20240720 1858) ((emacs (27 1)) (f (0 2 0)) (transient (0 3 7))) "Integration for project generation tools like cookiecutter" tar ((:url . "https://github.com/laurencewarne/prefab.el") (:commit . "51da6c214f095a44f3d2223bcf079a3073923115") (:revdesc . "51da6c214f09"))]) + (preproc-font-lock . [(20250103 1541) nil "Highlight C preprocessor directives" tar ((:url . "https://github.com/Lindydancer/preproc-font-lock") (:commit . "b16b59afcdc53614e6c3c272d1eaea592a832f65") (:revdesc . "b16b59afcdc5") (:keywords "c" "languages" "faces"))]) + (prescient . [(20250816 19) ((emacs (25 1))) "Better sorting and filtering" tar ((:url . "https://github.com/raxod502/prescient.el") (:commit . "87e2d2f2ddf24f591a5f70cc90d2afb4537caa18") (:revdesc . "87e2d2f2ddf2") (:keywords "extensions") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes"))]) + (preseed-generic-mode . [(20180210 500) nil "Debian preseed file major mode" tar ((:url . "https://github.com/suntong/preseed-generic-mode") (:commit . "3aa8806c4a659064baa01751400c53fbaf847f66") (:revdesc . "3aa8806c4a65") (:authors ("Tong Sun" . "suntong@users.sourceforge.net")) (:maintainers ("Tong Sun" . "suntong@users.sourceforge.net")) (:maintainer "Tong Sun" . "suntong@users.sourceforge.net"))]) + (presentation . [(20250327 202) ((emacs (24 4)) (compat (30))) "Display large character for presentation" tar ((:url . "https://github.com/zonuexe/emacs-presentation-mode") (:commit . "42f13613b0d01ef78c36fc352ae8976cffc50e71") (:revdesc . "42f13613b0d0") (:keywords "environment" "faces" "frames") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (pretend-type . [(20251019 2122) ((emacs (24 3))) "Reveal buffer as you pretend to type" tar ((:url . "https://github.com/haji-ali/pretend-type") (:commit . "1396a0c28986af260a462525ff20a1269cb64eb2") (:revdesc . "1396a0c28986") (:keywords "hide" "show" "invisible" "learning" "games") (:authors ("Al Haji-Ali" . "abdo.haji.ali@gmail.com")) (:maintainers ("Al Haji-Ali" . "abdo.haji.ali@gmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.ali@gmail.com"))]) + (prettier . [(20240902 1516) ((emacs (26 1)) (iter2 (0 9)) (nvm (0 2)) (editorconfig (0 9))) "Code formatting with Prettier" tar ((:url . "https://github.com/jscheid/prettier.el") (:commit . "9e202f129835317d70aea405e536a9f4228680c5") (:revdesc . "9e202f129835") (:keywords "convenience" "languages" "files") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainers ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com"))]) + (prettier-js . [(20250705 322) ((emacs (28 1))) "Minor mode to format code on file save" tar ((:url . "https://github.com/prettier/prettier-emacs") (:commit . "1ce7a310b000200e333f0015b87d910672ebdb7e") (:revdesc . "1ce7a310b000") (:keywords "convenience" "wp" "edit" "js"))]) + (prettier-rc . [(20220330 145) ((emacs (24 3)) (prettier-js (0 1 0))) "Use local rc rules with prettier" tar ((:url . "https://github.com/jjuliano/prettier-rc-emacs") (:commit . "99e40a9783299e41911f6b37156626d53e43809e") (:revdesc . "99e40a978329") (:keywords "convenience" "edit" "js" "ts" "rc" "prettierrc" "prettier-rc" "prettier" "prettier-js") (:authors ("Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom")) (:maintainers ("Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom")) (:maintainer "Joel Bryan Juliano" . "joelbryandotjulianoatgmaildotcom"))]) + (prettify-greek . [(20160603 908) nil "Greek letters for prettify-symbols" tar ((:url . "https://gitlab.com/fommil/emacs-prettify-greek") (:commit . "698d07a6ffe85f6fb53f3bfec4f49380c25cfd90") (:revdesc . "698d07a6ffe8") (:keywords "faces"))]) + (prettify-math . [(20231215 204) ((emacs (27 1)) (dash (2 19 0)) (s (1 12 0)) (jsonrpc (1 0 9))) "Prettify math formula" tar ((:url . "https://github.com/shaqxu/prettify-math") (:commit . "3e659cc446379fb78926db33ac74d296c818b22a") (:revdesc . "3e659cc44637") (:keywords "math" "asciimath" "tex" "latex" "prettify" "mathjax") (:authors ("Shaq Tsui" . "shaqtsui@outlook.com")) (:maintainers ("Shaq Tsui" . "shaqtsui@outlook.com")) (:maintainer "Shaq Tsui" . "shaqtsui@outlook.com"))]) + (pretty-hydra . [(20250310 2303) ((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 ((:url . "https://github.com/jerrypnz/major-mode-hydra.el") (:commit . "2494d71e24b61c1f5ef2dc17885e2f65bf98b3b2") (:revdesc . "2494d71e24b6") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainers ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com"))]) + (pretty-mode . [(20190615 2045) nil "Redisplay parts of the buffer as pretty Unicode symbols" tar ((:url . "https://github.com/akatov/pretty-mode") (:commit . "5154355e90fdd70d3647257280a89eeb725ef084") (:revdesc . "5154355e90fd") (:keywords "pretty" "unicode" "symbols") (:authors ("Arthur Danskin" . "arthurdanskin@gmail.com")) (:maintainers ("Grant Rettke" . "grant@wisdomandwonder.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com"))]) + (pretty-sha-path . [(20141105 1826) nil "Prettify Guix/Nix store paths" tar ((:url . "https://gitorious.org/alezost-emacs/pretty-sha-path") (:commit . "beea38bdf34ed27059d6484e1e2a337a27e1f7ce") (:revdesc . "beea38bdf34e") (:keywords "faces" "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (pretty-speedbar . [(20220303 1726) ((emacs (27 1))) "Make speedbar pretty" tar ((:url . "https://github.com/kcyarn/pretty-speedbar") (:commit . "56dc9f114fcc55843e182cde1fc9d7a14c261c6a") (:revdesc . "56dc9f114fcc") (:keywords "file" "tags" "tools") (:authors ("Kristle Chester" . "kcyarn7@gmail.com")) (:maintainers ("Kristle Chester" . "kcyarn7@gmail.com")) (:maintainer "Kristle Chester" . "kcyarn7@gmail.com"))]) + (pretty-symbols . [(20140814 959) nil "Draw tokens as Unicode glyphs" tar ((:url . "http://github.com/drothlis/pretty-symbols") (:commit . "ab82b3fba129fae14e4031eb7fd648c1a92d0e71") (:revdesc . "ab82b3fba129") (:keywords "faces") (:authors ("David Röthlisberger" . "david@rothlis.net")) (:maintainers ("David Röthlisberger" . "david@rothlis.net")) (:maintainer "David Röthlisberger" . "david@rothlis.net"))]) + (preview-dvisvgm . [(20211225 635) ((emacs (27 1)) (auctex (13 0 12))) "SVG output for LaTeX preview" tar ((:url . "https://github.com/TobiasZawada/preview-dvisvgm") (:commit . "630e2f008c4a6c67a01824b7ad6b844977b28f87") (:revdesc . "630e2f008c4a") (:keywords "tex") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainers ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de"))]) + (prism . [(20241024 40) ((emacs (27 1)) (compat (29 1 4 5)) (dash (2 14 1))) "Customizable, depth-based syntax coloring" tar ((:url . "https://github.com/alphapapa/prism.el") (:commit . "2fa8eb5a9ca62a548d33befef4517e5d0266eb28") (:revdesc . "2fa8eb5a9ca6") (:keywords "faces" "lisp") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (prisma-ts-mode . [(20251024 1356) ((emacs (29 1))) "Major mode for prisma using tree-sitter" tar ((:url . "https://github.com/nverno/prisma-ts-mode") (:commit . "c63117764dc9e177aea7ddbef23c47feba1523d8") (:revdesc . "c63117764dc9") (:keywords "prisma" "languages" "tree-sitter") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (private . [(20150122 157) ((aes (0 6))) "Take care of your private configuration files" tar ((:url . "https://github.com/cheunghy/private") (:commit . "f57f1c2f6bfe900bd40b252688df4c6ed6a5f44b") (:revdesc . "f57f1c2f6bfe") (:keywords "private" "configuration" "backup" "recover") (:authors ("Cheung Mou Wai" . "yeannylam@gmail.com")) (:maintainers ("Cheung Mou Wai" . "yeannylam@gmail.com")) (:maintainer "Cheung Mou Wai" . "yeannylam@gmail.com"))]) + (private-comments-mode . [(20240926 1557) ((emacs (27 1))) "Minor mode for masukomi/private_comments" tar ((:url . "https://github.com/masukomi/private-comments-mode") (:commit . "616d63eccc5a21f1785801baf0fa3667ddfeb80f") (:revdesc . "616d63eccc5a") (:keywords "tools"))]) + (private-diary . [(20151216 1657) ((emacs (24 0))) "Maintain a private diary in Emacs" tar ((:url . "https://github.com/cacology/private-diary") (:commit . "5b1aeb22f22447fd35e1c107b6db44a7b27b8a42") (:revdesc . "5b1aeb22f224") (:keywords "diary" "encryption") (:authors ("James P. Ascher" . "jpa4q@virginia.edu")) (:maintainers ("James P. Ascher" . "jpa4q@virginia.edu")) (:maintainer "James P. Ascher" . "jpa4q@virginia.edu"))]) + (proc-net . [(20130322 12) nil "Network process tools" tar ((:url . "http://github.com/nicferrier/emacs-procnet") (:commit . "00bfc92a381787ec387974ed17070118ced6d9ad") (:revdesc . "00bfc92a3817") (:keywords "processes") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (proced-narrow . [(20190911 1818) ((seq (2 20)) (emacs (24))) "Live-narrowing of search results for proced" tar ((:url . "https://github.com/travisjeffery/proced-narrow") (:commit . "0e2a4dfb072eb0369d0020b429e820ae620d325e") (:revdesc . "0e2a4dfb072e") (:keywords "processes" "proced") (:authors ("Travis Jeffery" . "tj@travisjeffery.com")) (:maintainers ("Travis Jeffery" . "tj@travisjeffery.com")) (:maintainer "Travis Jeffery" . "tj@travisjeffery.com"))]) + (processing-mode . [(20171022 2302) nil "Major mode for Processing 2.0" tar ((:url . "https://github.com/ptrv/processing2-emacs") (:commit . "448aba82970c98322629eaf2746e73be6c30c98e") (:revdesc . "448aba82970c") (:keywords "languages" "snippets") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainers ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))]) + (processing-snippets . [(20140426 1428) ((yasnippet (0 8 0))) "Snippets for processing-mode" tar ((:url . "https://github.com/ptrv/processing2-emacs") (:commit . "6175b8eef76369c4b1b8608b8df9a37f14b1be5c") (:revdesc . "6175b8eef763") (:keywords "snippets") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainers ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))]) + (procress . [(20250914 1846) ((emacs (27 1)) (auctex (13 0))) "Process progress" tar ((:url . "https://github.com/haji-ali/procress.git") (:commit . "137655ec1193bd1ea1a1ee3362349491c873710a") (:revdesc . "137655ec1193") (:keywords "compile" "progress" "tex" "svg") (:authors ("Al Haji-Ali" . "abdo.haji.ali@gmail.com")) (:maintainers ("Al Haji-Ali" . "abdo.haji.ali@gmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.ali@gmail.com"))]) + (prodigy . [(20250401 1948) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0)) (emacs (27 1))) "Manage external services" tar ((:url . "http://github.com/rejeep/prodigy.el") (:commit . "7bd89fdd544209afb28d6abe828728ad62257617") (:revdesc . "7bd89fdd5442") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (professional-theme . [(20150315 1100) nil "Emacs port of Vim's professional theme" tar ((:url . "https://github.com/juanjux/emacs-professional-theme") (:commit . "0927d1474049a193f9f366bde5eb1887b9ba20ed") (:revdesc . "0927d1474049") (:keywords "theme" "light" "professional") (:authors ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainers ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainer "Juanjo Alvarez" . "juanjo@juanjoalvarez.net"))]) + (prog-face-refine . [(20251224 840) ((emacs (28 0))) "Refine faces for programming modes" tar ((:url . "https://codeberg.org/ideasman42/emacs-prog-face-refine") (:commit . "67237a7f4ad6da0a044b99c37da1eac4b3f0f906") (:revdesc . "67237a7f4ad6") (:keywords "faces" "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (prog-fill . [(20180607 132) ((emacs (25 1)) (cl-lib (0 6 1))) "Smartly format lines to use vertical space" tar ((:url . "https://github.com/ahungry/prog-fill") (:commit . "3fbf7da6dd826e95c9077d659566ee29814a31d8") (:revdesc . "3fbf7da6dd82") (:keywords "ahungry" "convenience" "c" "formatting" "editing") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (prognth . [(20130920 1759) nil "Extend prog1 to arbitrary index" tar ((:url . "https://github.com/Fuco1/prognth") (:commit . "2f1ca4d34b1fd581163e1df122c85418137e8e62") (:revdesc . "2f1ca4d34b1f") (:keywords "lisp") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (programmer-dvorak . [(20150427 137) nil "Input method for Programmer Dvorak" tar ((:url . "https://github.com/yangchenyun/programmer-dvorak") (:commit . "c35d5e3b8b53c1e9341957b5d5db40387ba0c8ee") (:revdesc . "c35d5e3b8b53") (:keywords "dvorak" "programmer-dvorak" "input-method") (:authors ("Chenyun Yang" . "yangchenyun@gmail.com")) (:maintainers ("Chenyun Yang" . "yangchenyun@gmail.com")) (:maintainer "Chenyun Yang" . "yangchenyun@gmail.com"))]) + (project-abbrev . [(20250101 1011) ((emacs (25 1))) "Customize abbreviation expansion in the project" tar ((:url . "https://github.com/jcs-elpa/project-abbrev") (:commit . "05eaf3a0f00b68d427b76cd0410519783999807d") (:revdesc . "05eaf3a0f00b") (:keywords "abbrev" "abbreviation" "customizable" "shortcut") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (project-butler . [(20240718 1920) ((emacs (28 1))) "Lay out a project's buffers" tar ((:url . "https://codeberg.org/jabbo/project-butler") (:commit . "7a20dd1e0672942ba971978baffa063b399151ef") (:revdesc . "7a20dd1e0672") (:keywords "convenience" "projects") (:authors ("Stefan Thesing" . "software@webdings.de")) (:maintainers ("Stefan Thesing" . "software@webdings.de")) (:maintainer "Stefan Thesing" . "software@webdings.de"))]) + (project-cmake . [(20250830 1304) ((emacs (30 1))) "A cmake backend for project.el" tar ((:url . "https://github.com/lucius-martius/project-cmake") (:commit . "519ca5d7dd490a6b54435841c9fce3d5e3dcc140") (:revdesc . "519ca5d7dd49") (:keywords "tools" "convenience") (:authors ("Lucius Martius" . "lucius.martius@mailbox.org")) (:maintainers ("Lucius Martius" . "lucius.martius@mailbox.org")) (:maintainer "Lucius Martius" . "lucius.martius@mailbox.org"))]) + (project-explorer . [(20150504 14) ((cl-lib (0 3)) (es-lib (0 3)) (es-windows (0 1)) (emacs (24))) "A project explorer sidebar" tar ((:url . "https://github.com/sabof/project-explorer") (:commit . "589a09008706f5f4ef91393dc4306eede0d15ca9") (:revdesc . "589a09008706"))]) + (project-mode-line-tag . [(20231215 807) ((emacs (25 1))) "Display a buffer's project in its mode line" tar ((:url . "https://github.com/fritzgrabo/project-mode-line-tag") (:commit . "c63f254e006ddf6ad12c7dc15eed0484d57a8cb5") (:revdesc . "c63f254e006d") (:keywords "convenience") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (project-persist . [(20180906 1302) nil "A minor mode to allow loading and saving of project settings" tar ((:url . "https://github.com/rdallasgray/project-persist") (:commit . "26d9435bef44da2a1b0892eba822f9f487b98eec") (:revdesc . "26d9435bef44") (:keywords "project" "persistence"))]) + (project-persist-drawer . [(20151108 1222) ((project-persist (0 3))) "Use a project drawer with project-persist" tar ((:url . "https://github.com/rdallasgray/project-persist-drawer.git") (:commit . "35bbe132a4fab6a0fec15ce6c0fd2fe6a4aa9626") (:revdesc . "35bbe132a4fa") (:keywords "defaults") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainers ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com"))]) + (project-rootfile . [(20251111 720) ((emacs (27 1))) "Extension of project.el to detect project with root file" tar ((:url . "https://github.com/buzztaiki/project-rootfile.el") (:commit . "6c674446350ac3e54536c5520dd3f622463c6f4a") (:revdesc . "6c674446350a") (:authors ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainer "Taiki Sugawara" . "buzz.taiki@gmail.com"))]) + (project-shells . [(20231005 641) ((emacs (24 3)) (seq (2 19))) "Manage the shell buffers of each project" tar ((:url . "https://github.com/hying-caritas/project-shells") (:commit . "15f70d99b6d5f078f490ceb64b6f13c000b37e24") (:revdesc . "15f70d99b6d5") (:keywords "processes" "terminals") (:authors ("Huang, Ying" . "huang.ying.caritas@gmail.com")) (:maintainers ("Huang, Ying" . "huang.ying.caritas@gmail.com")) (:maintainer "Huang, Ying" . "huang.ying.caritas@gmail.com"))]) + (project-tab-groups . [(20231215 755) ((emacs (28 1))) "Support a \"one tab group per project\" workflow" tar ((:url . "https://github.com/fritzgrabo/project-tab-groups") (:commit . "2658405d5f3c539fbd9ccf95297a016a2c91816a") (:revdesc . "2658405d5f3c") (:keywords "convenience") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (project-tasks . [(20241220 1028) ((emacs (26 1)) (project (0 6 0))) "Efficient task management for your project" tar ((:url . "https://github.com/TxGVNN/project-tasks") (:commit . "1faaa975c99e358165cfc3df160c21c2c611e1c3") (:revdesc . "1faaa975c99e") (:keywords "project" "workflow" "tools") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com"))]) + (project-treemacs . [(20230529 1207) ((emacs (28 1)) (treemacs (3 1))) "Simple treemacs backend for project.el" tar ((:url . "https://github.com/cmccloud/project-treemacs") (:commit . "36bec1109ba0498c2d1ef29756c841d2e23b063e") (:revdesc . "36bec1109ba0"))]) + (projectile . [(20250704 908) ((emacs (26 1))) "Manage and navigate projects in Emacs easily" tar ((:url . "https://github.com/bbatsov/projectile") (:commit . "5c1b32d9548982d470c3fd48639fb0ec8d239c50") (:revdesc . "5c1b32d95489") (:keywords "project" "convenience") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (projectile-codesearch . [(20180508 1522) ((codesearch (20171122 431)) (projectile (20150405 126))) "Integration of codesearch into projectile" tar ((:url . "https://github.com/abingham/emacs-codesearch") (:commit . "e40efc62e9333db0593bd81b5c78d08b19bfb193") (:revdesc . "e40efc62e933") (:keywords "tools" "development" "search") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (projectile-git-autofetch . [(20200820 2028) ((emacs (25 1)) (projectile (0 14 0))) "Automatically fetch git repositories" tar ((:url . "https://github.com/andrmuel/projectile-git-autofetch") (:commit . "423ed5fa6508c4edc0a837bb585c7e77e99876be") (:revdesc . "423ed5fa6508") (:keywords "tools" "vc") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainers ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch"))]) + (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 ((:url . "https://github.com/asok/projectile-rails") (:commit . "701784df7befe17b861f1b53fe9cbc59d0b94b9f") (:revdesc . "701784df7bef") (:keywords "rails" "projectile") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainers ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com"))]) + (projectile-ripgrep . [(20221013 541) ((ripgrep (0 3 0)) (projectile (0 14 0))) "Run ripgrep with Projectile" tar ((:url . "https://github.com/nlamirault/ripgrep.el") (:commit . "b6bd5beb0c11348f1afd9486cbb451d0d2e3c45a") (:revdesc . "b6bd5beb0c11") (:keywords "ripgrep" "projectile") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (projectile-sift . [(20160107 1015) ((sift (0 2 0)) (projectile (0 13 0))) "Run a sift with Projectile" tar ((:url . "https://github.com/nlamirault/sift.el") (:commit . "8c3f3d14a351a2394027d72ee0599aa73b9f0d13") (:revdesc . "8c3f3d14a351") (:keywords "sift" "projectile") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (projectile-speedbar . [(20190807 2010) ((projectile (0 11 0)) (sr-speedbar (0))) "Projectile integration for speedbar" tar ((:url . "https://github.com/anshulverma/projectile-speedbar") (:commit . "93320e467ee78772065e599a5dba94889a77db22") (:revdesc . "93320e467ee7") (:keywords "project" "convenience" "speedbar" "projectile") (:authors ("Anshul Verma" . "anshul.verma86@gmail.com")) (:maintainers ("Anshul Verma" . "anshul.verma86@gmail.com")) (:maintainer "Anshul Verma" . "anshul.verma86@gmail.com"))]) + (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 ((:url . "https://github.com/micdahl/projectile-trailblazer") (:commit . "79299498d74876f2ac3fe8075716b39a5bdd04cd") (:revdesc . "79299498d748") (:keywords "rails" "projectile" "trailblazer" "languages") (:authors ("Michael Dahl" . "michael.dahl84@gmail.com")) (:maintainers ("Michael Dahl" . "michael.dahl84@gmail.com")) (:maintainer "Michael Dahl" . "michael.dahl84@gmail.com"))]) + (projectile-variable . [(20230916 441) ((emacs (24)) (cl-lib (0 5))) "Store project local variables" tar ((:url . "https://github.com/emacs-php/projectile-variable") (:commit . "fa6bf595529156ee3b6d08f90ebea3b4ab7c5ef8") (:revdesc . "fa6bf5955291") (:keywords "project" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (projection . [(20250927 1605) ((emacs (29 1)) (project (0 9 8)) (compat (29 1 4 1)) (f (0 20)) (s (1 13))) "Project type support for `project'" tar ((:url . "https://github.com/mohkale/projection") (:commit . "482789397c5e11dbb95438c87ccd0cad3d37a33a") (:revdesc . "482789397c5e") (:keywords "project" "convenience") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe"))]) + (projection-dape . [(20241107 2107) ((emacs (29 1)) (projection (0 1)) (dape (0 8))) "Projection integration for `dape'" tar ((:url . "https://github.com/mohkale/projection") (:commit . "50d4f0ec4edfddd24f7c1c540f299a919aa4c151") (:revdesc . "50d4f0ec4edf") (:keywords "project" "convenience") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe"))]) + (projection-multi . [(20250921 1037) ((emacs (29 1)) (projection (0 1)) (compile-multi (0 5))) "Projection integration for `compile-multi'" tar ((:url . "https://github.com/mohkale/projection") (:commit . "f4b108eeb55c79b201c140bd8fe7f1fcaffd3617") (:revdesc . "f4b108eeb55c") (:keywords "project" "convenience") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe"))]) + (projection-multi-embark . [(20241107 2107) ((emacs (29 1)) (projection (0 1)) (compile-multi-embark (0 5))) "Integration for `projection-multi' and `embark'" tar ((:url . "https://github.com/mohkale/projection") (:commit . "50d4f0ec4edfddd24f7c1c540f299a919aa4c151") (:revdesc . "50d4f0ec4edf") (:keywords "project" "convenience") (:authors ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainers ("Mohsin Kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem" . "mohkale@kisara.moe"))]) + (projector . [(20211112 1514) ((alert (1 1)) (cl-lib (0 5))) "Lightweight library for managing project-aware shell and command buffers" tar ((:url . "https://github.com/waymondo/projector.el") (:commit . "1d0f2d307591ea50888d31dcae7e463e2ada1316") (:revdesc . "1d0f2d307591") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com"))]) + (projekt . [(20150324 848) ((emacs (24))) "Some kind of staging for CVS" tar ((:url . "https://github.com/tekai/projekt") (:commit . "a65e554e5d8b0def08c5d06f3fe34fec40bebd83") (:revdesc . "a65e554e5d8b") (:authors ("Engelke Eschner" . "tekai@gmx.li")) (:maintainers ("Engelke Eschner" . "tekai@gmx.li")) (:maintainer "Engelke Eschner" . "tekai@gmx.li"))]) + (projmake-mode . [(20241228 1643) ((dash (20150611 922)) (indicators (20130217 1405))) "Run build system for project" tar ((:url . "https://github.com/ericbmerritt/projmake-mode") (:commit . "93e2a23f929d69ac3d735a05d6bdcd93fca32471") (:revdesc . "93e2a23f929d"))]) + (prometheus-mode . [(20230522 2358) ((emacs (26 1))) "Major modes for Prometheus files" tar ((:url . "https://gitlab.com/peterhoeg/prometheus-mode") (:commit . "df7f1b13a432594594a967f0b2ff0f3b1ba41656") (:revdesc . "df7f1b13a432") (:keywords "languages") (:authors ("Peter Hoeg" . "(peter@hoeg.com)")) (:maintainers ("Peter Hoeg" . "(peter@hoeg.com)")) (:maintainer "Peter Hoeg" . "(peter@hoeg.com)"))]) + (promise . [(20210307 727) ((emacs (25 1))) "Promises/A+" tar ((:url . "https://github.com/chuntaro/emacs-promise") (:commit . "cec51feb5f957e8febe6325335cf57dc2db6be30") (:revdesc . "cec51feb5f95") (:keywords "async" "promise" "convenience") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainers ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp"))]) + (prompt-binder . [(20250621 853) ((emacs (24 3)) (llm (0 26 0))) "Bind LLM prompts to key chords and editor context" tar ((:url . "http://github.com/tracym") (:commit . "e0e81fba2f1eaf7fa82827fbf32c0cdbf1328d2f") (:revdesc . "e0e81fba2f1e") (:keywords "llm" "tools" "prompt"))]) + (prompt-text . [(20190408 310) nil "Configure your minibuffer prompt" tar ((:url . "https://github.com/10sr/prompt-text-el") (:commit . "b842bf13c53d0a2bd2bc7a00d37cc713d69fa9e9") (:revdesc . "b842bf13c53d") (:keywords "utility" "minibuffer") (:authors ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainers ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainer "10sr" . "8slashes+el[at]gmail[dot]com"))]) + (prompts . [(20160916 1041) ((dash (2 13 0))) "Utilities for working with text prompts" tar ((:url . "https://github.com/guiltydolphin/prompts.el") (:commit . "1cd5e732ff2a86b47836eb7252e5b59cd4b6ab26") (:revdesc . "1cd5e732ff2a") (:keywords "input" "minibuffer") (:authors ("Ben Moon" . "guiltydolphin@gmail.com")) (:maintainers ("Ben Moon" . "guiltydolphin@gmail.com")) (:maintainer "Ben Moon" . "guiltydolphin@gmail.com"))]) + (pronto . [(20200218 1633) ((emacs (24))) "Compilation mode for pronto stylechecks" tar ((:url . "https://github.com/julianrubisch/pronto.el") (:commit . "c0cd13d8219879610b7fe284b182a9db4d3d40b3") (:revdesc . "c0cd13d82198") (:keywords "processes" "tools") (:authors ("Julian Rubisch" . "julian@julianrubisch.at")) (:maintainers ("Julian Rubisch" . "julian@julianrubisch.at")) (:maintainer "Julian Rubisch" . "julian@julianrubisch.at"))]) + (proof-general . [(20251120 1746) ((emacs (25 2))) "A generic Emacs interface for proof assistants" tar ((:url . "https://proofgeneral.github.io/") (:commit . "d60382db080370501bfe81d2a4f069035c8372a7") (:revdesc . "d60382db0803") (:maintainers (nil . "proof-general-maintainers@groupes.renater.fr")) (:maintainer nil . "proof-general-maintainers@groupes.renater.fr"))]) + (prop-menu . [(20150728 1118) ((emacs (24 3)) (cl-lib (0 5))) "Create and display a context menu based on text and overlay properties" tar ((:url . "https://github.com/david-christiansen/prop-menu-el") (:commit . "50b102c1c0935fd3e0c465feed7f27d66b21cdf3") (:revdesc . "50b102c1c093") (:keywords "convenience") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk"))]) + (propfont-mixed . [(20150113 2211) ((emacs (24)) (cl-lib (0 5))) "Use proportional fonts with space-based indentation" tar ((:url . "https://github.com/ikirill/propfont-mixed") (:commit . "0b461ef4754a469610dba71874a34b6da42176bf") (:revdesc . "0b461ef4754a") (:keywords "faces") (:authors ("Kirill Ignatiev" . "github.com/ikirill")) (:maintainers ("Kirill Ignatiev" . "github.com/ikirill")) (:maintainer "Kirill Ignatiev" . "github.com/ikirill"))]) + (proportional . [(20221205 1417) ((emacs (25 1))) "Use a proportional font everywhere" tar ((:url . "https://github.com/ksjogo/proportional") (:commit . "6b675694292a5dbebb52b6196e8ccee6e3a73042") (:revdesc . "6b675694292a") (:keywords "faces"))]) + (prosjekt . [(20151127 1416) ((dash (2 8 0))) "A software project tool for emacs" tar ((:url . "https://github.com/abingham/prosjekt") (:commit . "a864a8be5842223043702395f311e3350c28e9db") (:revdesc . "a864a8be5842") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (protobuf-mode . [(20240823 1417) nil "Major mode for editing protocol buffers" tar ((:url . "https://github.com/protocolbuffers/protobuf") (:commit . "138451296bf4101f992faa215a1899f3b9ec29e7") (:revdesc . "138451296bf4") (:keywords "google" "protobuf" "languages") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainers ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com"))]) + (protobuf-ts-mode . [(20230728 1747) ((emacs (29))) "Tree sitter support for Protocol Buffers (proto3 only)" tar ((:url . "https://git.ookami.one/cgit/protobuf-ts-mode") (:commit . "65152f5341ea4b3417390b3e60b195975161b8bc") (:revdesc . "65152f5341ea") (:keywords "protobuf" "languages" "tree-sitter") (:authors ("ookami" . "mail@ookami.one")) (:maintainers ("ookami" . "mail@ookami.one")) (:maintainer "ookami" . "mail@ookami.one"))]) + (protocols . [(20170802 1132) ((cl-lib (0 5))) "Protocol database access functions" tar ((:url . "https://github.com/davep/protocols.el") (:commit . "d0f7c4acb05465f1a0d4be54363bbd2802647e77") (:revdesc . "d0f7c4acb054") (:keywords "convenience" "net" "protocols") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (proxy-mode . [(20230303 706) ((emacs (25))) "A minor mode to toggle proxy" tar ((:url . "https://repo.or.cz/proxy-mode.git") (:commit . "eca6f0b8a17fcf9eb961ed0426f57a5b7ca4e1f6") (:revdesc . "eca6f0b8a17f") (:keywords "comm" "proxy"))]) + (psalm . [(20230914 1925) ((emacs (27 1)) (php-mode (1 22 3))) "Interface to Psalm" tar ((:url . "https://github.com/emacs-php/psalm.el") (:commit . "9449c09b8d570705aa74b5aef7651893b482cc66") (:revdesc . "9449c09b8d57") (:keywords "tools" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (psc-ide . [(20250523 1854) ((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 ((:url . "https://github.com/purescript-emacs/psc-ide-emacs") (:commit . "c64b05d9011d7c87c6ff2b53be08c3374b6dab66") (:revdesc . "c64b05d9011d") (:keywords "languages") (:authors ("Erik Post" . "erik@shinsetsu.nl") ("Dmitry Bushenko" . "d.bushenko@gmail.com") ("Christoph Hegemann" . "christoph.hegemann1337@gmail.com")) (:maintainers ("Erik Post" . "erik@shinsetsu.nl") ("Dmitry Bushenko" . "d.bushenko@gmail.com") ("Christoph Hegemann" . "christoph.hegemann1337@gmail.com")) (:maintainer "Erik Post" . "erik@shinsetsu.nl"))]) + (psci . [(20231219 52) ((emacs (25 1)) (purescript-mode (13 10)) (dash (2 9 0)) (inheritenv (0 2))) "Major mode for purescript repl psci" tar ((:url . "https://github.com/purescript-emacs/emacs-psci") (:commit . "ef31045295f29485fc697892fba53390fe193595") (:revdesc . "ef31045295f2") (:keywords "languages" "purescript" "psci" "repl") (:authors ("Antoine R. Dumont" . "eniotna.tATgmail.com")) (:maintainers ("Antoine R. Dumont" . "eniotna.tATgmail.com")) (:maintainer "Antoine R. Dumont" . "eniotna.tATgmail.com"))]) + (psession . [(20250307 1629) ((emacs (24)) (cl-lib (0 5)) (async (1 9 3))) "Persistent save of elisp objects" tar ((:url . "https://github.com/thierryvolpiatto/psession") (:commit . "371e23c9cc1ad5d8ccb149ccdaf6500935f27da1") (:revdesc . "371e23c9cc1a") (:keywords "psession" "persistent" "save" "session") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net"))]) + (psysh . [(20230815 730) ((emacs (24 3)) (s (1 9 0)) (php-runtime (0 2))) "PsySH, PHP interactive shell (REPL)" tar ((:url . "https://github.com/emacs-php/psysh.el") (:commit . "8bf82fa68ca90fc72528ea406f0e57718bcb1cbf") (:revdesc . "8bf82fa68ca9") (:keywords "processes" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (pt . [(20161226 1959) nil "A front-end for pt, The Platinum Searcher" tar ((:url . "https://github.com/bling/pt.el") (:commit . "6d99b2aaded3ece3db19a20f4b8f1d4abe382622") (:revdesc . "6d99b2aaded3") (:keywords "pt" "ack" "ag" "grep" "search"))]) + (ptemplate . [(20210324 1446) ((emacs (25 1)) (yasnippet (0 13 0))) "Project templates" tar ((:url . "https://github.com/nbfalcon/ptemplate") (:commit . "b81cc7be8865745c3a60177a244d2a69729ab21b") (:revdesc . "b81cc7be8865") (:authors ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainers ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainer "Nikita Bloshchanevich" . "nikblos@outlook.com"))]) + (ptemplate-templates . [(20210324 1443) ((emacs (25 1)) (ptemplate (2 0 0))) "Official templates" tar ((:url . "https://github.com/nbfalcon/ptemplate-templates") (:commit . "3788387973dde3101f9a3f2064572be033c59ad6") (:revdesc . "3788387973dd") (:authors ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainers ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainer "Nikita Bloshchanevich" . "nikblos@outlook.com"))]) + (ptree . [(20221106 1649) ((emacs (25 1))) "Property tree data structure" tar ((:url . "https://github.com/alpha-catharsis/ptree") (:commit . "23cb9093f99b9869606f8d54fa5c45ea35fcc789") (:revdesc . "23cb9093f99b") (:keywords "lisp") (:authors ("Alpha Catharsis" . "alpha.catharsis@gmail.com")) (:maintainers ("Alpha Catharsis" . "alpha.catharsis@gmail.com")) (:maintainer "Alpha Catharsis" . "alpha.catharsis@gmail.com"))]) + (pubmed . [(20221023 930) ((emacs (26 1)) (esxml (0 3 4)) (s (1 12 0)) (unidecode (0 2))) "Interface to PubMed" tar ((:url . "https://gitlab.com/fvdbeek/emacs-pubmed") (:commit . "b2fbc124cabf0d373845763adf882e9d89ff5daa") (:revdesc . "b2fbc124cabf") (:keywords "pubmed" "hypermedia") (:authors ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainers ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainer "Folkert van der Beek" . "folkertvanderbeek@gmail.com"))]) + (pubsub . [(20250905 719) ((emacs (24 1))) "A basic publish/subscribe system" tar ((:url . "https://github.com/countvajhula/pubsub") (:commit . "84b57d3a3d166b73dfe79acf254fab2938f473f4") (:revdesc . "84b57d3a3d16") (:authors ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com"))]) + (pueue . [(20230219 1558) ((emacs (28 1)) (with-editor (3 0 4))) "Interface for pueue" tar ((:url . "https://github.com/xFA25E/pueue") (:commit . "386e43d46cbf68470d040b422061ac2ba1629749") (:revdesc . "386e43d46cbf") (:keywords "processes") (:authors ("Valeriy Litkovskyy" . "vlr.ltkvsk@protonmail.com")) (:maintainers ("Valeriy Litkovskyy" . "vlr.ltkvsk@protonmail.com")) (:maintainer "Valeriy Litkovskyy" . "vlr.ltkvsk@protonmail.com"))]) + (pug-mode . [(20211114 1645) ((emacs (24 4)) (cl-lib (0 5))) "Major mode for jade/pug template files" tar ((:url . "https://github.com/hlissner/emacs-pug-mode") (:commit . "73f8c2f95eba695f701df20c8436f49abadebdc1") (:revdesc . "73f8c2f95eba") (:keywords "markup" "language" "jade" "pug") (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io"))]) + (pulseaudio-control . [(20230316 1819) nil "Use `pactl' to manage PulseAudio volumes" tar ((:url . "https://git.sr.ht/~flexibeast/pulseaudio-control") (:commit . "e917e84661b0e2496b295f1bbfba6ad32a656527") (:revdesc . "e917e84661b0") (:keywords "multimedia" "hardware" "sound" "pulseaudio") (:authors ("Alexis" . "flexibeast@gmail.com") ("Ellington Santos" . "ellingtonsantos@gmail.com") ("Sergey Trofimov" . "sarg@sarg.org.ru") ("conses" . "contact@conses.eu")) (:maintainers ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com"))]) + (pumpkin-spice-theme . [(20231011 1253) ((emacs (27 1)) (autothemer (0 2))) "Spice up your day with a delightful pumpkin colored theme" tar ((:url . "https://cicadas.surf/cgit/pumpkin-spice-theme.git") (:commit . "8d38276f6b2d16325ca372dd3630653b21e6e7ed") (:revdesc . "8d38276f6b2d") (:keywords "faces" "theme" "halloween" "pumpkin") (:authors ("Grant Shangreaux" . "shoshin@cicadas.surf")) (:maintainers ("Grant Shangreaux" . "shoshin@cicadas.surf")) (:maintainer "Grant Shangreaux" . "shoshin@cicadas.surf"))]) + (punctuality-logger . [(20141120 2031) nil "Punctuality logger for Emacs" tar ((:url . "https://gitlab.com/elzair/punctuality-logger") (:commit . "d76c5d5589a4f8a94cc5537686d9a3b46ea7cc59") (:revdesc . "d76c5d5589a4") (:keywords "reminder" "calendar") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainers ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com"))]) + (pungi . [(20150222 1246) ((jedi (0 2 0 -3 2)) (pyvenv (1 5))) "Integrates jedi with virtualenv and buildout python environments" tar ((:url . "https://github.com/mgrbyte/pungi") (:commit . "41c9f8b7795e083bfd63ba0d06c789c250998723") (:revdesc . "41c9f8b7795e") (:keywords "convenience") (:authors ("Matthew Russell" . "matthew.russell@horizon5.org")) (:maintainers ("Matthew Russell" . "matthew.russell@horizon5.org")) (:maintainer "Matthew Russell" . "matthew.russell@horizon5.org"))]) + (puni . [(20241007 1609) ((emacs (26 1))) "Parentheses Universalistic" tar ((:url . "https://github.com/AmaiKinono/puni") (:commit . "f430f5b0a14c608176e3376058eb380ab0824621") (:revdesc . "f430f5b0a14c") (:keywords "convenience" "lisp" "tools") (:authors ("Hao Wang" . "amaikinono@gmail.com")) (:maintainers ("Hao Wang" . "amaikinono@gmail.com")) (:maintainer "Hao Wang" . "amaikinono@gmail.com"))]) + (punpun-themes . [(20250421 1819) ((emacs (24 1))) "Common color definitions for punpun themes" tar ((:url . "https://depp.brause.cc/punpun-themes") (:commit . "735cedca649e0576ffba3771a039744c4a70528d") (:revdesc . "735cedca649e") (:keywords "themes" "faces") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (puppet-mode . [(20250716 542) ((emacs (24 1)) (pkg-info (0 4))) "Major mode for Puppet manifests" tar ((:url . "https://github.com/voxpupuli/puppet-mode") (:commit . "f02aa30f5c0ce7fd0e1ffb245e5c832538bf6a91") (:revdesc . "f02aa30f5c0c") (:keywords "languages") (: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") ("Bozhidar Batsov" . "bozhidar@batsov.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com") ("Tim Meusel" . "tim@bastelfreak.de")) (:maintainer "Vox Pupuli" . "voxpupuli@groups.io"))]) + (puppet-ts-mode . [(20251212 1319) ((emacs (29 1))) "Major mode for Puppet using Tree-sitter" tar ((:url . "https://github.com/smoeding/puppet-ts-mode") (:commit . "7ef01e46e66b7b02c702bbd0523d63a8d567a474") (:revdesc . "7ef01e46e66b") (:keywords "languages") (:authors ("Stefan Möding" . "stm@kill-9.net")) (:maintainers ("Stefan Möding" . "stm@kill-9.net")) (:maintainer "Stefan Möding" . "stm@kill-9.net"))]) + (purescript-mode . [(20250613 944) ((emacs (25 1))) "A PureScript editing mode" tar ((:url . "https://github.com/purescript-emacs/purescript-mode") (:commit . "61732e23bd33b7d0d71bc6cff84b612bd2d9dff2") (:revdesc . "61732e23bd33") (:keywords "faces" "files" "purescript") (:authors ("1997-1998 Graeme E Moss and" . "gem@cs.york.ac.uk") ("Tommy Thorn" . "thorn@irisa.fr") ("2003 Dave Love" . "fx@gnu.org") ("2014 Tim Dysinger" . "tim@dysinger.net")) (:maintainers ("1997-1998 Graeme E Moss and" . "gem@cs.york.ac.uk") ("Tommy Thorn" . "thorn@irisa.fr") ("2003 Dave Love" . "fx@gnu.org") ("2014 Tim Dysinger" . "tim@dysinger.net")) (:maintainer "1997-1998 Graeme E Moss and" . "gem@cs.york.ac.uk"))]) + (purp-theme . [(20210912 1940) nil "A dark color theme with few colors" tar ((:url . "https://github.com/gnuvince/purp") (:commit . "8d3510e1ed995b8323cd5205626ddde6386a76ca") (:revdesc . "8d3510e1ed99") (:keywords "faces") (:authors ("Vincent Foley" . "vfoley@gmail.com")) (:maintainers ("Vincent Foley" . "vfoley@gmail.com")) (:maintainer "Vincent Foley" . "vfoley@gmail.com"))]) + (purple-haze-theme . [(20141015 229) ((emacs (24 0))) "An overtly purple color theme for Emacs24" tar ((:url . "https://github.com/jasonm23/emacs-purple-haze-theme") (:commit . "3e245cbef7cd09e6b3ee124963e372a04e9a6485") (:revdesc . "3e245cbef7cd") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (purty-mode . [(20131004 2259) nil "Safely pretty-print greek letters, mathematical symbols, or anything else" tar ((:url . "https://github.com/jcatw/purty-mode") (:commit . "ad48149bfd0c765796a728b22d679e03fc124328") (:revdesc . "ad48149bfd0c") (:authors ("James Atwood" . "jatwood@cs.umass.edu")) (:maintainers ("James Atwood" . "jatwood@cs.umass.edu")) (:maintainer "James Atwood" . "jatwood@cs.umass.edu"))]) + (pushbullet . [(20140809 1232) ((grapnel (0 5 2)) (json (1 2))) "Emacs client for the PushBullet Android app" tar ((:url . "http://www.github.com/theanalyst/revolver") (:commit . "73c59a0f1dc04875b3e5a2c8afbc26c32128e445") (:revdesc . "73c59a0f1dc0") (:keywords "convenience") (:authors ("Abhishek L" . "abhishek.lekshmanan@gmail.com")) (:maintainers ("Abhishek L" . "abhishek.lekshmanan@gmail.com")) (:maintainer "Abhishek L" . "abhishek.lekshmanan@gmail.com"))]) + (pushover . [(20170818 2103) ((cl-lib (0 5))) "Pushover API Access" tar ((:url . "http://github.com/swflint/pushover.el") (:commit . "bbe3ac8df3c532a72da4552615af960b8a577588") (:revdesc . "bbe3ac8df3c5") (:keywords "notifications") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (px . [(20170317 2330) nil "Preview inline latex in any mode" tar ((:url . "http://github.com/aaptel/preview-latex") (:commit . "0c52f7933eab3ca1642ab0df151db9950430c9e2") (:revdesc . "0c52f7933eab") (:authors ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainers ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainer "Aurélien Aptel" . "aurelien.aptel@gmail.com"))]) + (py-autopep8 . [(20251215 1113) ((emacs (29 1))) "Use autopep8 to beautify a Python buffer" tar ((:url . "https://codeberg.org/ideasman42/emacs-py-autopep8") (:commit . "262e0a55bdc486bdea03839d16fb05d975ab2750") (:revdesc . "262e0a55bdc4") (:keywords "convenience") (:authors ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (py-gnitset . [(20170821 1732) nil "Run your Python tests any way you'd like" tar ((:url . "https://www.github.com/quodlibetor/py-gnitset") (:commit . "1e993cc29cbc31e06fe1e335dec198e21972fa55") (:revdesc . "1e993cc29cbc") (:authors ("Brandon W Maister" . "quodlibetor@gmail.com")) (:maintainers ("Brandon W Maister" . "quodlibetor@gmail.com")) (:maintainer "Brandon W Maister" . "quodlibetor@gmail.com"))]) + (py-import-check . [(20130802 1111) nil "Finds the unused python imports using importchecker" tar ((:url . "https://github.com/psibi/emacs-py-import-check") (:commit . "38ad91e67047bd37231497d11d409d064d510f98") (:revdesc . "38ad91e67047") (:keywords "python" "import" "check") (:authors ("Sibi" . "sibi@psibi.in")) (:maintainers ("Sibi" . "sibi@psibi.in")) (:maintainer "Sibi" . "sibi@psibi.in"))]) + (py-isort . [(20160925 1018) nil "Use isort to sort the imports in a Python buffer" tar ((:url . "http://paetzke.me/project/py-isort.el") (:commit . "e67306f459c47c53a65604e4eea88a3914596560") (:revdesc . "e67306f459c4") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainers ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm"))]) + (py-smart-operator . [(20170531 1209) ((s (1 9 0))) "Smart-operator for python-mode" tar ((:url . "https://github.com/rmuslimov/py-smart-operator") (:commit . "0c8a66faca4b35158d0b5885472cb75286039167") (:revdesc . "0c8a66faca4b") (:keywords "python" "convenience" "smart-operator") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainers ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com"))]) + (py-snippets . [(20220918 952) ((yasnippet (0 8 0))) "Collection of advanced Python yasnippet snippets" tar ((:url . "https://github.com/Xaldew/py-snippets") (:commit . "1a85c41ea33f33e5b4a5a12a64fd9c4591fc0bcb") (:revdesc . "1a85c41ea33f") (:keywords "convenience" "snippets") (:authors ("Gustaf Waldemarson" . "gustaf.waldemarson@gmail.com")) (:maintainers ("Gustaf Waldemarson" . "gustaf.waldemarson@gmail.com")) (:maintainer "Gustaf Waldemarson" . "gustaf.waldemarson@gmail.com"))]) + (py-test . [(20230714 517) ((dash (2 9 0)) (f (0 17)) (emacs (24 4))) "A test runner for Python code" tar ((:url . "https://github.com/Bogdanp/py-test.el") (:commit . "72975bb547b6123dcc1213ff78fdcf80f7b29842") (:revdesc . "72975bb547b6") (:keywords "python" "testing" "py.test") (:authors ("Bogdan Paul Popa" . "popa.bogdanp@gmail.com")) (:maintainers ("Bogdan Paul Popa" . "popa.bogdanp@gmail.com")) (:maintainer "Bogdan Paul Popa" . "popa.bogdanp@gmail.com"))]) + (py-vterm-interaction . [(20251024 2208) ((emacs (27 1)) (vterm (0 0 2)) (python (0 28))) "A mode for Python REPL using vterm" tar ((:url . "https://github.com/vale981/py-vterm-interaction.el") (:commit . "3e79540a715dc69b7998fe7712a0a8183570387d") (:revdesc . "3e79540a715d") (:keywords "languages" "python") (:maintainers ("Valentin Boettcher" . "hiroatprotagon.space")) (:maintainer "Valentin Boettcher" . "hiroatprotagon.space"))]) + (py-yapf . [(20160925 1122) nil "Use yapf to beautify a Python buffer" tar ((:url . "https://github.com/paetzke/py-yapf.el") (:commit . "a878304202ad827a1f3de3dce1badd9ca8731146") (:revdesc . "a878304202ad") (:authors ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainers ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainer "Friedrich Paetzke" . "f.paetzke@gmail.com"))]) + (pycarddavel . [(20150831 1216) ((helm (1 7 0)) (emacs (24 0))) "Integrate pycarddav" tar ((:url . "https://github.com/DamienCassou/pycarddavel") (:commit . "6ead921066fa0156f20155b7126e5875ce11c328") (:revdesc . "6ead921066fa") (:keywords "helm" "pyccarddav" "carddav" "message" "mu4e" "contacts") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (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 ((:url . "https://github.com/andcarnivorous/pyconf") (:commit . "f1587f20463496193625526ba805c3cf084db966") (:revdesc . "f1587f204634") (:keywords "processes" "python") (:authors ("Andrew Favia" . "drewlinguistics01atgmaildotcom")) (:maintainers ("Andrew Favia" . "drewlinguistics01atgmaildotcom")) (:maintainer "Andrew Favia" . "drewlinguistics01atgmaildotcom"))]) + (pycoverage . [(20200513 2047) ((emacs (24 3))) "Support for coverage stats on Python 2.X and 3" tar ((:url . "https://github.com/mattharrison/pycoverage.el") (:commit . "3c69ed312121368f1b24cc04d54a29ce4ed4f743") (:revdesc . "3c69ed312121") (:keywords "project" "convenience"))]) + (pydoc . [(20250910 2000) nil "Functional, syntax highlighted pydoc navigation" tar ((:url . "https://github.com/statmobile/pydoc") (:commit . "5e76e74538ac3201ad7a3526ecf16d9ac7e73310") (:revdesc . "5e76e74538ac") (:keywords "pydoc" "python") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainers ("Brian J. Lopes" . "statmobile@gmail.com")) (:maintainer "Brian J. Lopes" . "statmobile@gmail.com"))]) + (pyenv-mode . [(20230821 1645) ((emacs (25 1)) (pythonic (0 1 0))) "Integrate pyenv with python-mode" tar ((:url . "https://github.com/proofit404/pyenv-mode") (:commit . "6820aa6673e6a51ace88611a58b423b5b1effb19") (:revdesc . "6820aa6673e6") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com"))]) + (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 ((:url . "https://github.com/JackCrawley/pygen/") (:commit . "3a5d1d1a0640865b15be05cd1eeb33bb4793b622") (:revdesc . "3a5d1d1a0640") (:keywords "python" "code generation") (:authors ("Jack Crawley" . "http://www.github.com/jackcrawley")) (:maintainers ("Jack Crawley" . "http://www.github.com/jackcrawley")) (:maintainer "Jack Crawley" . "http://www.github.com/jackcrawley"))]) + (pygn-mode . [(20241216 1959) ((emacs (26 1)) (tree-sitter (0 15 2)) (tree-sitter-langs (0 12 242)) (uci-mode (0 5 4)) (nav-flash (1 0 0)) (ivy (0 10 0))) "Major-mode for chess PGN files, powered by Python" tar ((:url . "https://github.com/dwcoates/pygn-mode") (:commit . "3f1ce4efd1c34b9fc347c848eb4426bfcc851118") (:revdesc . "3f1ce4efd1c3") (:keywords "data" "games" "chess"))]) + (pyim . [(20251125 839) ((emacs (27 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime" tar ((:url . "https://github.com/tumashu/pyim") (:commit . "bc85ecc3b2521d05c7585df97939f7c0ec5b1496") (:revdesc . "bc85ecc3b252") (:keywords "convenience" "chinese" "pinyin" "input-method") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (pyim-basedict . [(20240923 739) ((pyim (3 7))) "The default pinyin dict of pyim" tar ((:url . "https://github.com/tumashu/pyim-basedict") (:commit . "55d9b324831b0fc79ff62f1c6f21aad72341a114") (:revdesc . "55d9b324831b") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (pyim-cangjiedict . [(20250924 1320) ((pyim (3 7))) "Some cangjie dicts for pyim" tar ((:url . "https://github.com/cor5corpii/pyim-cangjiedict") (:commit . "2742edcfb60328793fc983bd4a0dedc88f550ec1") (:revdesc . "2742edcfb603") (:keywords "convenience" "chinese" "pinyin" "input-method" "cangjie") (:authors ("Yuanchen Xie" . "xieych@outlook.com")) (:maintainers ("Yuanchen Xie" . "xieych@outlook.com")) (:maintainer "Yuanchen Xie" . "xieych@outlook.com"))]) + (pyim-smzmdict . [(20250621 828) ((pyim (5 3 4))) "Strange scheMas of ZhengMa dict for pyim" tar ((:url . "https://github.com/cor5corpii/pyim-smzmdict") (:commit . "853908d2ae88a30038dd03a7cd3f00aeabd89ac2") (:revdesc . "853908d2ae88") (:keywords "convenience" "pyim" "chinese" "zhengma") (:maintainers ("Yuanchen Xie" . "xieych@outlook.com")) (:maintainer "Yuanchen Xie" . "xieych@outlook.com"))]) + (pyim-wbdict . [(20220604 1340) ((pyim (3 7))) "Some wubi dicts for pyim" tar ((:url . "https://github.com/tumashu/pyim-wbdict") (:commit . "e3b128cfcf218e4a0ca04189b0bd46909761227e") (:revdesc . "e3b128cfcf21") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (pyimport . [(20240207 719) ((dash (2 8 0)) (s (1 9 0)) (shut-up (0 3 2))) "Manage Python imports!" tar ((:url . "https://github.com/Wilfred/pyimport") (:commit . "4398ce8dd64fa0f685f4bf8683a35087649346d3") (:revdesc . "4398ce8dd64f") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (pyimpsort . [(20250710 1607) ((emacs (24 3)) (python (0))) "Sort Python imports" tar ((:url . "https://github.com/emacsorphanage/pyimpsort") (:commit . "70d739c134d89ba2025322fee101a13420d0b032") (:revdesc . "70d739c134d8") (:keywords "tools" "python" "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Alain Delplanque" . "alaindelplanque@mailoo.org")) (:maintainer "Alain Delplanque" . "alaindelplanque@mailoo.org"))]) + (pyinspect . [(20230216 1121) ((emacs (27 1))) "Python object inspector" tar ((:url . "https://github.com/it-is-wednesday/pyinspect.el") (:commit . "4437dc589d0c1eb0ca80bf0d005ee27d15cf69fc") (:revdesc . "4437dc589d0c") (:keywords "tools") (:authors ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainers ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainer "Maor Kadosh" . "git@avocadosh.xyz"))]) + (pylint . [(20221117 1303) nil "Minor mode for running `pylint'" tar ((:url . "https://github.com/emacsorphanage/pylint") (:commit . "bddb91610b6b6aa1e7fee96b6be3be69dfe3695e") (:revdesc . "bddb91610b6b") (:keywords "languages" "python") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainers ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com"))]) + (pynt . [(20180710 726) ((emacs (24 4)) (ein (0 13 1)) (epc (0 1 1)) (deferred (0 5 1))) "Generate and scroll EIN buffers from python code" tar ((:url . "https://github.com/ebanner/pynt") (:commit . "963c43cfdb5deea7daedc269aafa79192d853154") (:revdesc . "963c43cfdb5d") (:keywords "convenience") (:authors ("Edward Banner" . "edward.banner@gmail.com")) (:maintainers ("Edward Banner" . "edward.banner@gmail.com")) (:maintainer "Edward Banner" . "edward.banner@gmail.com"))]) + (pyramid . [(20230114 1049) ((emacs (25 2)) (pythonic (0 1 1)) (tablist (0 70))) "Minor mode for working with pyramid projects" tar ((:url . "https://github.com/dakra/pyramid.el") (:commit . "c8a8b36725d85664e74f59600fe5d18d06ea907d") (:revdesc . "c8a8b36725d8") (:keywords "python" "pyramid" "pylons" "convenience" "tools" "processes") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainers ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my"))]) + (pytest . [(20230810 1218) ((s (1 9 0))) "Easy Python test running in Emacs" tar ((:url . "https://github.com/ionrock/pytest-el") (:commit . "8692f965bf4ddf3d755cf1fbf77a7a768e22460e") (:revdesc . "8692f965bf4d") (:keywords "pytest" "python" "testing"))]) + (pytest-pdb-break . [(20200804 848) ((emacs (25))) "A pytest PDB launcher" tar ((:url . "https://github.com/poppyschmo/pytest-pdb-break") (:commit . "05d227493b7b96f3556cba22f215cb85f9282020") (:revdesc . "05d227493b7b") (:keywords "languages" "tools") (:authors ("Jane Soko" . "poppyschmo@protonmail.com")) (:maintainers ("Jane Soko" . "poppyschmo@protonmail.com")) (:maintainer "Jane Soko" . "poppyschmo@protonmail.com"))]) + (python-black . [(20240520 729) ((emacs (25)) (dash (2 16 0)) (reformatter (0 3))) "Reformat Python using python-black" tar ((:url . "https://github.com/wbolster/emacs-python-black") (:commit . "4da1519345b3d5c513d82ef0d39536dd9c626d42") (:revdesc . "4da1519345b3") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (python-cell . [(20240126 841) ((emacs (25 1))) "Support for MATLAB-like cells in python mode" tar ((:url . "https://github.com/thisch/python-cell.el") (:commit . "ea469071adc72f371698934c3709ee370ac6be6f") (:revdesc . "ea469071adc7") (:keywords "extensions" "python" "matlab" "cell") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainers ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com"))]) + (python-coverage . [(20250601 1621) ((emacs (25 1)) (dash (2 18 0)) (s (1 12 0)) (xml+ (0))) "Show Python coverage via overlays or Flycheck" tar ((:url . "https://github.com/wbolster/emacs-python-coverage") (:commit . "ec1789b8cbbfd58b8f4f687c2e4efb7e30429643") (:revdesc . "ec1789b8cbbf") (:keywords "languages" "processes" "tools") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (python-django . [(20150822 404) nil "A Jazzy package for managing Django projects" tar ((:url . "https://github.com/fgallina/python-django.el") (:commit . "fc54ad74f0309670359b939f64d0f1fff68aeac4") (:revdesc . "fc54ad74f030") (:keywords "languages") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")))]) + (python-docstring . [(20231203 2036) nil "Smart Python docstring formatting" tar ((:url . "https://github.com/glyph/python-docstring-mode") (:commit . "48e6489ec2db8b4959a9f591910941c2a5f132a3") (:revdesc . "48e6489ec2db"))]) + (python-environment . [(20150310 853) ((deferred (0 3 1))) "Virtualenv API for Emacs Lisp" tar ((:url . "https://github.com/tkf/emacs-python-environment") (:commit . "401006584e32864a10c69d29f14414828909362e") (:revdesc . "401006584e32") (:keywords "applications" "tools") (:authors ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainers ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com"))]) + (python-insert-docstring . [(20211127 1232) ((emacs (25 1))) "Python Google docstring inserter" tar ((:url . "https://github.com/macurovc/insert-docstring") (:commit . "cd6419b74c99c06d5c48c1b289572acce1fd193b") (:revdesc . "cd6419b74c99") (:authors ("Marco Vocialta" . "macurovc@tutanota.com")) (:maintainers ("Marco Vocialta" . "macurovc@tutanota.com")) (:maintainer "Marco Vocialta" . "macurovc@tutanota.com"))]) + (python-isort . [(20210603 2153) ((emacs (26)) (reformatter (0 6))) "Reformat python-mode buffer with isort" tar ((:url . "https://github.com/wyuenho/emacs-python-isort") (:commit . "339814df22b87eebca02137e581f65d6283fce97") (:revdesc . "339814df22b8") (:keywords "languages") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainers ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com"))]) + (python-mls . [(20240621 2114) ((emacs (27 1)) (compat (29 1))) "Multi-line shell for (i)Python" tar ((:url . "https://github.com/jdtsmith/python-mls") (:commit . "3ebacc6c46e9f7de25279783001ca3fc8964d7a8") (:revdesc . "3ebacc6c46e9") (:keywords "languages" "processes"))]) + (python-mode . [(20251215 1157) nil "Python major mode" tar ((:url . "https://gitlab.com/groups/python-mode-devs") (:commit . "5719f9a18c4813303df6c8102ac25fce8e4536d0") (:revdesc . "5719f9a18c48") (:keywords "python" "languages" "oop") (:maintainers (nil . "python-mode@python.org")) (:maintainer nil . "python-mode@python.org"))]) + (python-pytest . [(20250726 1726) ((emacs (24 4)) (dash (2 18 0)) (transient (0 3 7)) (s (1 12 0))) "Helpers to run pytest" tar ((:url . "https://github.com/wbolster/emacs-python-pytest") (:commit . "ed2ecee09d1cccb4245842860d91940cb2fda769") (:revdesc . "ed2ecee09d1c") (:keywords "pytest" "test" "python" "languages" "processes" "tools") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (python-switch-quotes . [(20250804 904) ((emacs (24 3))) "Cycle between single and double quotes in python strings" tar ((:url . "https://github.com/werehuman/python-switch-quotes") (:commit . "dc3bf1d7c206168605f4df7a605bc4615d296cd6") (:revdesc . "dc3bf1d7c206") (:keywords "python" "tools" "convenience") (:authors ("Vladimir Lagunov" . "lagunov.vladimir@gmail.com")) (:maintainers ("Vladimir Lagunov" . "lagunov.vladimir@gmail.com")) (:maintainer "Vladimir Lagunov" . "lagunov.vladimir@gmail.com"))]) + (python-tdd-mode . [(20250719 1438) ((emacs (27 1))) "Modern TDD Mode for Python" tar ((:url . "https://github.com/marcwebbie/tdd-mode") (:commit . "e0c05730c76bfed1d819bc981c90ab16e681b55d") (:revdesc . "e0c05730c76b") (:keywords "tools" "convenience" "testing" "python" "tdd") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainers ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com"))]) + (python-test . [(20181018 29) ((emacs (25 1))) "Python testing integration" tar ((:url . "https://github.com/emacs-pe/python-test.el") (:commit . "f899975b133539e19ba822e4b0bfd1a28572967e") (:revdesc . "f899975b1335") (:keywords "convenience" "tools" "processes") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (python-view-data . [(20230508 543) ((emacs (28 1)) (python (0 2)) (csv-mode (1 12))) "View data in python" tar ((:url . "https://github.com/ShuguangSun/python-view-data") (:commit . "1dd5f99679db9767530cfc20642a40a48bd479be") (:revdesc . "1dd5f99679db") (:keywords "tools") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (python-x . [(20251219 1134) ((python (0 24)) (folding (0 0)) (emacs (24 5)) (compat (26 1))) "Python.el extras for interactive evaluation" tar ((:url . "https://gitlab.com/wavexx/python-x.el") (:commit . "27aefe146c9d4ca1088843053367fbab4f61f418") (:revdesc . "27aefe146c9d") (:keywords "languages" "processes" "python" "eval" "folding") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (pythonic . [(20230821 1733) ((emacs (25 1)) (s (1 9)) (f (0 17 2))) "Utility functions for writing pythonic emacs package" tar ((:url . "https://github.com/proofit404/pythonic") (:commit . "f6e0bec552319341f260a5c4740288799c2b3a5b") (:revdesc . "f6e0bec55231") (:keywords "convenience" "pythonic") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainers ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com"))]) + (pythontest . [(20240813 1322) ((emacs (29 1))) "Testing executor for python" tar ((:url . "https://github.com/erickgnavar/pythontest.el") (:commit . "4bb4f330c13ef82bb6e4a4b15c47cb3fede83523") (:revdesc . "4bb4f330c13e") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io"))]) + (pyvenv . [(20211014 707) nil "Python virtual environment interface" tar ((:url . "http://github.com/jorgenschaefer/pyvenv") (:commit . "31ea715f2164dd611e7fc77b26390ef3ca93509b") (:revdesc . "31ea715f2164") (:keywords "python" "virtualenv" "tools") (:authors ("Jorgen Schaefer" . "contact@jorgenschaefer.de")) (:maintainers ("Jorgen Schaefer" . "contact@jorgenschaefer.de")) (:maintainer "Jorgen Schaefer" . "contact@jorgenschaefer.de"))]) + (pyvenv-auto . [(20230106 415) ((emacs (26 3)) (pyvenv (1 21))) "Automatically switch Python venvs" tar ((:url . "https://github.com/nryotaro/pyvenv-auto") (:commit . "b4365e60e3ba747a5fec8ca909f64fe8c73d8db2") (:revdesc . "b4365e60e3ba"))]) + (q-mode . [(20251220 1731) ((emacs (24))) "A q editing mode" tar ((:url . "https://github.com/psaris/q-mode") (:commit . "626743cb7da52e23f10290e579a31f10f68d1295") (:revdesc . "626743cb7da5") (:keywords "faces" "files" "q"))]) + (qml-mode . [(20161016 31) nil "Major mode for editing QT Declarative (QML) code" tar ((:url . "https://github.com/coldnew/qml-mode") (:commit . "6c5f33ba88ae010bf201a80ee8095e20a724558c") (:revdesc . "6c5f33ba88ae") (:keywords "qml" "qt" "qt declarative") (:authors ("Yen-Chin Lee" . "coldnew.tw@gmail.com")) (:maintainers ("Yen-Chin Lee" . "coldnew.tw@gmail.com")) (:maintainer "Yen-Chin Lee" . "coldnew.tw@gmail.com"))]) + (qrencode . [(20240922 1231) ((emacs (25 1))) "QRCode encoder" tar ((:url . "https://github.com/ruediger/qrencode-el") (:commit . "4bbb1f331d7e394470e3fbf172329a9b70174cc8") (:revdesc . "4bbb1f331d7e") (:keywords "qrcode" "comm") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")) (:maintainers ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.net"))]) + (qso . [(20250709 1505) ((emacs (25 1))) "Amateur radio QSO logging" tar ((:url . "https://github.com/K6SM/Emacs-QSO-Logger") (:commit . "33d3211748aa7e94f1aa187570beca8b9b2093d8") (:revdesc . "33d3211748aa") (:keywords "lisp"))]) + (qt-pro-mode . [(20170604 1841) ((emacs (24))) "Qt Pro/Pri major mode" tar ((:url . "https://github.com/emacsorphanage/qt-pro-mode") (:commit . "1e0052fcfb89c15cb47714c1546d4e8ec6e01ae6") (:revdesc . "1e0052fcfb89") (:keywords "extensions") (:authors ("Todd Neal" . "tolchz@gmail.com")) (:maintainers ("Todd Neal" . "tolchz@gmail.com")) (:maintainer "Todd Neal" . "tolchz@gmail.com"))]) + (qtcreator-theme . [(20201215 1523) ((emacs (24 3))) "A color theme that mimics Qt Creator IDE" tar ((:url . "https://github.com/LesleyLai/emacs-qtcreator-theme") (:commit . "515532b05063898459157d2ba5c10ec0d5a4b1bd") (:revdesc . "515532b05063") (:keywords "theme" "light" "faces") (:authors ("Lesley Lai" . "lesley@lesleylai.info")) (:maintainers ("Lesley Lai" . "lesley@lesleylai.info")) (:maintainer "Lesley Lai" . "lesley@lesleylai.info"))]) + (quack . [(20181106 1301) nil "Enhanced support for editing and running Scheme code" tar ((:url . "https://github.com/emacsmirror/quack") (:commit . "2146805ce2b5a9b155d73929986f11e713787e26") (:revdesc . "2146805ce2b5"))]) + (quakec-mode . [(20230619 947) ((emacs (27 1))) "Major mode for QuakeC" tar ((:url . "https://github.com/vkazanov/quakec-mode") (:commit . "7b5d13fbdd9dfdc319ee8db1f1e954e00bdfce54") (:revdesc . "7b5d13fbdd9d") (:keywords "games" "languages"))]) + (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 ((:url . "https://github.com/quarto-dev/quarto-emacs") (:commit . "b7dcba7050b2e1e65acdd5656d08a186bca2c922") (:revdesc . "b7dcba7050b2") (:keywords "languages" "multi-modes"))]) + (quasi-monochrome-theme . [(20200415 705) nil "Quasi Monochrome theme" tar ((:url . "https://github.com/lbolla/emacs-quasi-monochrome") (:commit . "b38d71860fdea945e10e8a766ac9dfa1410ade67") (:revdesc . "b38d71860fde") (:keywords "color-theme" "monochrome" "high contrast") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainers ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) + (quelpa . [(20250113 1906) ((emacs (25 1))) "Emacs Lisp packages built directly from source" tar ((:url . "https://github.com/quelpa/quelpa") (:commit . "cf01224edd82920a0fb8a90568d2e14347354fc8") (:revdesc . "cf01224edd82") (:keywords "tools" "package" "management" "build" "source" "elpa"))]) + (quelpa-leaf . [(20250101 904) ((emacs (25 1)) (quelpa (1 0)) (leaf (4 1 0))) "Quelpa handler for leaf" tar ((:url . "https://github.com/quelpa/quelpa-leaf") (:commit . "e800fc73c3aa0a2a4bfe9552a5d45f34e4d98cd3") (:revdesc . "e800fc73c3aa") (:keywords "convenience" "package" "managment" "elpa" "leaf") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (quelpa-use-package . [(20201022 746) ((emacs (25 1)) (quelpa (1 0)) (use-package (2))) "Quelpa handler for use-package" tar ((:url . "https://github.com/quelpa/quelpa-use-package") (:commit . "a97461008391d045aa2a506fc126280a12a060e4") (:revdesc . "a97461008391") (:keywords "package" "management" "elpa" "use-package"))]) + (quick-buffer-switch . [(20221220 1142) nil "Quick switch to file or dir buffers" tar ((:url . "https://github.com/renard/quick-buffer-switch") (:commit . "280f67f1a5e02533573b45d585c222c937f11f81") (:revdesc . "280f67f1a5e0") (:keywords "emacs" "configuration") (:authors ("Sebastien Gross" . "seb•ɑƬ•chezwam•ɖɵʈ•org")) (:maintainers ("Sebastien Gross" . "seb•ɑƬ•chezwam•ɖɵʈ•org")) (:maintainer "Sebastien Gross" . "seb•ɑƬ•chezwam•ɖɵʈ•org"))]) + (quick-fasd . [(20251103 1434) ((emacs (25 1))) "Integration for the command-line tool `fasd'" tar ((:url . "https://github.com/jamescherti/quick-fasd.el") (:commit . "98b53d3dbf8446002948d4e81181510ac5b55829") (:revdesc . "98b53d3dbf84") (:keywords "convenience"))]) + (quick-peek . [(20200130 2059) ((emacs (24 3))) "Inline quick-peek windows" tar ((:url . "https://github.com/cpitclaudel/quick-peek") (:commit . "03a276086795faad46a142454fc3e28cab058b70") (:revdesc . "03a276086795") (:keywords "tools" "help" "doc" "convenience") (: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"))]) + (quick-preview . [(20191017 1920) nil "Quick preview using GNOME sushi, gloobus or quick look" tar ((:url . "https://github.com/myuhe/quick-preview.el") (:commit . "a312ab5539b9a362da9d305e4da814e17c5721c9") (:revdesc . "a312ab5539b9") (:keywords "files" "hypermedia") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (quick-sdcv . [(20251202 1728) ((emacs (25 1))) "Offline dictionary using 'sdcv' (StartDict cli dictionary)" tar ((:url . "https://github.com/jamescherti/quick-sdcv.el") (:commit . "43385cddb1e0cad978ac007079f33a788cc5457a") (:revdesc . "43385cddb1e0") (:keywords "docs" "startdict" "sdcv"))]) + (quick-shell-keybind . [(20230927 1036) ((emacs (24))) "Interactively bind a key to shell commands" tar ((:url . "https://github.com/eyeinsky/quick-shell-keybind") (:commit . "be830a69cf7eec92d4ea269fd389ac39b0c162f1") (:revdesc . "be830a69cf7e") (:keywords "maint" "convenience" "processes") (:authors ("eyeinsky" . "eyeinsky9@gmail.com")) (:maintainers ("eyeinsky" . "eyeinsky9@gmail.com")) (:maintainer "eyeinsky" . "eyeinsky9@gmail.com"))]) + (quickref . [(20170817 1232) ((dash (1 0 3)) (s (1 0 0))) "Display relevant notes-to-self in the echo area" tar ((:url . "https://github.com/pd/quickref.el") (:commit . "f368c8b8219bb90498c5ab84e26f00eedaa234cf") (:revdesc . "f368c8b8219b"))]) + (quickrun . [(20250503 2058) ((emacs (26 1)) (ht (2 0))) "Run commands quickly" tar ((:url . "https://github.com/emacsorphanage/quickrun") (:commit . "bae8efb8c5bc428e4df731b5c214aae478c707da") (:revdesc . "bae8efb8c5bc") (:keywords "tools") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (quiet . [(20230530 859) nil "Disconnect from the online world for a while" tar ((:url . "https://github.com/zzkt/quiet") (:commit . "985b56606517971330c08686c49a8d06db763f3c") (:revdesc . "985b56606517") (:keywords "convenience" "quiet" "distraction" "network" "detachment" "offline") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am"))]) + (quilt . [(20190828 506) ((emacs (26 0))) "Minor mode for working with files in quilt" tar ((:url . "https://github.com/jstranik/emacs-quilt") (:commit . "b56a1f1acc46cdf8655710e4c8f24f5f31f22c6a") (:revdesc . "b56a1f1acc46") (:keywords "extensions") (:authors ("Matt Mackall" . "mpm@selenic.com")) (:maintainers ("Jan Stranik" . "jan@stranik.org")) (:maintainer "Jan Stranik" . "jan@stranik.org"))]) + (quiz . [(20190525 1206) ((cl-lib (0 5)) (emacs (25))) "Multiple choice quiz game" tar ((:url . "https://github.com/davep/quiz.el") (:commit . "570bf53926d89282cdb9653bd5aa8fe968f92bbd") (:revdesc . "570bf53926d8") (:keywords "games" "trivia" "quiz") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (quotient . [(20251029 1348) ((emacs (25 1)) (compat (30 1 0 1))) "A library for generating random quotes using a text corpus" tar ((:url . "https://github.com/tvirolai/quotient") (:commit . "3bece7b17a4ef7745f8c49c0c21570239f2b4ded") (:revdesc . "3bece7b17a4e") (:keywords "lisp") (:authors ("Tuomo Virolainen" . "tvirolai@soittakaaparanoid.mail.kapsi.fi")) (:maintainers ("Tuomo Virolainen" . "tvirolai@soittakaaparanoid.mail.kapsi.fi")) (:maintainer "Tuomo Virolainen" . "tvirolai@soittakaaparanoid.mail.kapsi.fi"))]) + (qwen-chat-shell . [(20240612 343) ((emacs (27 1)) (shell-maker (0 50 1))) "Qwen-chat shell + buffer insert commands" tar ((:url . "https://github.com/Pavinberg/qwen-chat-shell") (:commit . "2d6562c8a75aebf7a59e554011571ba5883cf4fd") (:revdesc . "2d6562c8a75a") (:authors ("Pavinberg" . "pavin0702@gmail.com")) (:maintainers ("Pavinberg" . "pavin0702@gmail.com")) (:maintainer "Pavinberg" . "pavin0702@gmail.com"))]) + (r-autoyas . [(20140101 1510) ((ess (0)) (yasnippet (0 8 0))) "Provides automatically created yasnippets for R function argument lists" tar ((:url . "https://github.com/mlf176f2/r-autoyas.el") (:commit . "d321a7da0ef2e94668d53e0807277da7b70ea678") (:revdesc . "d321a7da0ef2") (:keywords "r" "yasnippet"))]) + (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 ((:url . "https://github.com/racer-rust/emacs-racer") (:commit . "1e63e98626737ea9b662d4a9b1ffd6842b1c648c") (:revdesc . "1e63e9862673") (:keywords "abbrev" "convenience" "matching" "rust" "tools"))]) + (racket-mode . [(20251220 1436) ((emacs (25 1)) (compat (30 0 2 0))) "Racket editing, REPL, and more" tar ((:url . "https://www.racket-mode.com/") (:commit . "577af47246e1ce9fe5c17847eefe0e9513ca7049") (:revdesc . "577af47246e1") (:authors ("Greg Hendershott" . "racket-mode-author@greghendershott.com")))]) + (rails-i18n . [(20220126 1643) ((emacs (27 2)) (yaml (0 1 0)) (dash (2 19 1))) "Seach and insert i18n on ruby code" tar ((:url . "https://github.com/otavioschwanck/rails-i18n.el") (:commit . "8e87e4e48e31902b8259ded28a208c2e7efea6e9") (:revdesc . "8e87e4e48e31") (:keywords "tools" "languages") (: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"))]) + (rails-log-mode . [(20140408 425) nil "Major mode for viewing Rails log files" tar ((:url . "https://github.com/ananthakumaran/rails-log-mode") (:commit . "ff440003ad7d47cb0ac3300f2a632f4cfd36a446") (:revdesc . "ff440003ad7d") (:keywords "rails" "log") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com"))]) + (rails-routes . [(20220126 1631) ((emacs (27 2)) (inflections (1 1))) "Search for and insert rails routes" tar ((:url . "https://github.com/otavioschwanck/rails-routes") (:commit . "eab995a9297ca5bd9bd4f4c2737f2fecfc36def0") (:revdesc . "eab995a9297c") (:keywords "tools" "languages") (:authors ("Otávio Schwanck" . "otavioschwanck@gmail.com")) (:maintainers ("Otávio Schwanck" . "otavioschwanck@gmail.com")) (:maintainer "Otávio Schwanck" . "otavioschwanck@gmail.com"))]) + (railscasts-reloaded-theme . [(20201130 903) nil "Railscasts Reloaded color theme" tar ((:url . "https://github.com/thegeorgeous/railscasts-reloaded-theme") (:commit . "1c3850568e60a555d59cbb57bf2b6aa06e99d454") (:revdesc . "1c3850568e60") (:authors ("George Thomas" . "iamgeorgethomas@gmail.com")) (:maintainers ("George Thomas" . "iamgeorgethomas@gmail.com")) (:maintainer "George Thomas" . "iamgeorgethomas@gmail.com"))]) + (railscasts-theme . [(20150219 1525) nil "Railscasts color theme for GNU Emacs" tar ((:url . "https://github.com/mikenichols/railscasts-theme") (:commit . "1340c3f6c2717761cab95617cf8dcbd962b1095b") (:revdesc . "1340c3f6c271") (:keywords "railscasts" "color" "theme"))]) + (rainbow-blocks . [(20210715 1518) nil "Block syntax highlighting for lisp code" tar ((:url . "https://github.com/istib/rainbow-blocks") (:commit . "83c4d6e77a1e25d3d2d124a4e90d5b084f3e15a5") (:revdesc . "83c4d6e77a1e"))]) + (rainbow-delimiters . [(20210515 1254) nil "Highlight brackets according to their depth" tar ((:url . "https://github.com/Fanael/rainbow-delimiters") (:commit . "7919681b0d883502155d5b26e791fec15da6aeca") (:revdesc . "7919681b0d88") (:keywords "faces" "convenience" "lisp" "tools") (:authors ("Jeremy Rayman" . "opensource@jeremyrayman.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com"))]) + (rainbow-fart . [(20251212 1420) ((emacs (25 1)) (flycheck (32 -4))) "Checks the keywords of code to play suitable sounds" tar ((:url . "https://repo.or.cz/emacs-rainbow-fart.git") (:commit . "3fe606cc2fa7cb6713e5e65e0adb7cd7a5ec4ea7") (:revdesc . "3fe606cc2fa7") (:keywords "tools"))]) + (rainbow-identifiers . [(20141102 1526) ((emacs (24))) "Highlight identifiers according to their names" tar ((:url . "https://github.com/Fanael/rainbow-identifiers") (:commit . "19fbfded1baa98d12335f26f6d7b20e5ae44ce2e") (:revdesc . "19fbfded1baa") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com"))]) + (rake . [(20220211 827) ((f (0 13 0)) (dash (1 5 0)) (cl-lib (0 5))) "Run rake commands" tar ((:url . "https://github.com/asok/rake.el") (:commit . "452ea0caca33376487103c64177c295ed2960cca") (:revdesc . "452ea0caca33") (:keywords "rake" "ruby") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainers ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com"))]) + (raku-mode . [(20250930 1151) ((emacs (24 4))) "Major mode for editing Raku code" tar ((:url . "https://github.com/hinrik/perl6-mode") (:commit . "d06baaa2e881470dddb97193713f9f0a278942ad") (:revdesc . "d06baaa2e881") (:keywords "languages") (: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"))]) + (rally-mode . [(20161114 354) ((popwin (1 0 0))) "A mode to interact with the Rally Software web site" tar ((:url . "https://pragcraft.wordpress.com/") (:commit . "0f5e09a6abe2de7613f174b4f54863df93343134") (:revdesc . "0f5e09a6abe2") (:keywords "rally" "ca" "agile") (:authors ("Sean LeBlanc" . "seanleblanc@gmail.com")) (:maintainers ("Sean LeBlanc" . "seanleblanc@gmail.com")) (:maintainer "Sean LeBlanc" . "seanleblanc@gmail.com"))]) + (rand-theme . [(20151219 2335) ((cl-lib (0 5))) "Random Emacs theme at start-up!" tar ((:url . "https://github.com/gopar/rand-theme") (:commit . "65a00e5c5150f857aa96803b68f50bc8da0215b7") (:revdesc . "65a00e5c5150"))]) + (random-splash-image . [(20240501 1550) nil "Randomly sets splash image to *GNU Emacs* buffer on startup" tar ((:url . "https://github.com/kakakaya/random-splash-image") (:commit . "05a5cdb8315577536de5e425f6ef6cbb994c6282") (:revdesc . "05a5cdb83155") (:keywords "games") (:authors ("kakakaya" . "kakakayaATgmail.com")) (:maintainers ("kakakaya" . "kakakayaATgmail.com")) (:maintainer "kakakaya" . "kakakayaATgmail.com"))]) + (ranger . [(20251109 5) ((emacs (24 4))) "Make dired more like ranger" tar ((:url . "https://github.com/ralesi/ranger") (:commit . "8774f1bbb2754df7ae79dab8b75a6ce9285cc926") (:revdesc . "8774f1bbb275") (:keywords "files" "convenience" "dired") (:authors ("Rich Alesi" . "https://github.com/ralesi")) (:maintainers ("Rich Alesi" . "https://github.com/ralesi")) (:maintainer "Rich Alesi" . "https://github.com/ralesi"))]) + (rase . [(20120928 2045) nil "Run At Sun Event daemon" tar ((:url . "https://github.com/m00natic/rase/") (:commit . "59b5f7e8102570b65040e8d55781c7ea28de7338") (:revdesc . "59b5f7e81025") (:keywords "solar" "sunrise" "sunset" "midday" "midnight") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainers ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com"))]) + (rasi-mode . [(20250603 758) ((emacs (24 3))) "Major mode for editing RASI configuration files" tar ((:url . "https://github.com/taquangtrung/emacs-rasi-mode") (:commit . "f6c8551cdc98cb893997f482b9d8d6b366fa39d8") (:revdesc . "f6c8551cdc98") (:keywords "languages"))]) + (rats . [(20170818 1013) ((s (1 10 0)) (go-mode (1 3 1)) (cl-lib (0 5))) "Rapid testing suite for Go" tar ((:url . "https://github.com/ane/rats.el") (:commit . "a6d55aebcc54f669c6c6ffedf84364c4097903cc") (:revdesc . "a6d55aebcc54") (:keywords "go") (:authors ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainers ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainer "Antoine Kalmbach" . "ane@iki.fi"))]) + (raycast-mode . [(20230607 2107) ((emacs (26 1))) "Develop Raycast Extensions" tar ((:url . "https://github.com/nhojb/raycast-mode") (:commit . "f6401605cc9dfacdcaaf98d5844348b818cfc010") (:revdesc . "f6401605cc9d") (:keywords "convenience" "languages" "tools") (:authors ("John Buckley" . "nhoj.buckley@gmail.com")) (:maintainers ("John Buckley" . "nhoj.buckley@gmail.com")) (:maintainer "John Buckley" . "nhoj.buckley@gmail.com"))]) + (rbenv . [(20240120 6) nil "Emacs integration for rbenv" tar ((:url . "https://github.com/senny/rbenv.el") (:commit . "588b817d510737b9d6afd6d1ecddd517d96b78e5") (:revdesc . "588b817d5107") (:keywords "ruby" "rbenv") (:authors ("Yves Senn" . "yves.senn@gmail.com")) (:maintainers ("Yves Senn" . "yves.senn@gmail.com")) (:maintainer "Yves Senn" . "yves.senn@gmail.com"))]) + (rbs-mode . [(20240806 56) ((emacs (24 5))) "A major mode for RBS" tar ((:url . "https://github.com/ybiquitous/rbs-mode") (:commit . "d382032cb276d452fdd512c1f1f1b9f95153b356") (:revdesc . "d382032cb276") (:keywords "languages"))]) + (rbt . [(20170202 2302) ((popup (0 5 3)) (magit (20160128 1201))) "Integrate reviewboard with emacs" tar ((:url . "https://github.com/joeheyming/rbt.el") (:commit . "32bfba9062a014e375451cf4203c29535b5efc1e") (:revdesc . "32bfba9062a0") (:keywords "reviewboard" "rbt") (:authors ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainers ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainer "Joe Heyming" . "joeheyming@gmail.com"))]) + (rbtagger . [(20251024 1551) ((emacs (25 1))) "Ruby tagging tools" tar ((:url . "https://www.github.com/thiagoa/rbtagger") (:commit . "650c428ef145ce697f02ef12cfadd9deb82b856f") (:revdesc . "650c428ef145") (:keywords "languages" "tools") (:authors ("Thiago Araújo" . "thiagoaraujos@gmail.com")) (:maintainers ("Thiago Araújo" . "thiagoaraujos@gmail.com")) (:maintainer "Thiago Araújo" . "thiagoaraujos@gmail.com"))]) + (rc-mode . [(20160913 1918) nil "Major mode for the Plan9 rc shell" tar ((:url . "https://github.com/mrhmouse/rc-mode.el") (:commit . "fe2e0570bf9c19a292e16b18fd4b0a256df5d93f") (:revdesc . "fe2e0570bf9c") (:keywords "rc" "plan9" "shell"))]) + (rcirc-alertify . [(20140407 119) ((alert (20140406 1353))) "Cross platform notifications for rcirc" tar ((:url . "https://github.com/fgallina/rcirc-alertify") (:commit . "ea5cafc55893f375eccbe013d12dbaa94bf6e259") (:revdesc . "ea5cafc55893") (:keywords "comm" "convenience") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainers ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org"))]) + (rcirc-groups . [(20170731 2101) nil "An emacs buffer in rcirc-groups major mode" tar ((:url . "http://tapoueh.org/emacs/rcirc-groups.html") (:commit . "b68ece9d219b909244d4e3c0d8bf6a746d6fead7") (:revdesc . "b68ece9d219b") (:keywords "comm" "convenience") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org"))]) + (rcirc-notify . [(20150219 2204) nil "Libnotify popups" tar ((:url . "https://github.com/nicferrier/rcirc-notify") (:commit . "841a7b5a6cdb0c11a812df924d2c6a7d364fd455") (:revdesc . "841a7b5a6cdb") (:keywords "lisp" "rcirc" "irc" "notify" "growl") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (rcirc-styles . [(20210414 1712) ((cl-lib (0 5))) "Support mIRC-style color and attribute codes" tar ((:url . "https://github.com/aaron-em/rcirc-styles.el") (:commit . "dd06ec5fa455131788bbc885fcfaaec16b08f13b") (:revdesc . "dd06ec5fa455"))]) + (rdf-prefix . [(20240403 1710) nil "Prefix lookup for RDF" tar ((:url . "https://github.com/simenheg/rdf-prefix") (:commit . "c591608d12278b293a14c27ab2df72a269eb535d") (:revdesc . "c591608d1227") (:keywords "convenience" "abbrev") (:authors ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainers ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainer "Simen Heggestøyl" . "simenheg@runbox.com"))]) + (rdxmk . [(20170630 134) nil "A small set of tools for redox developments" tar ((:url . "https://github.com/jsalzbergedu/rdxmk") (:commit . "e78749fb29738365ffa4d863ffabeb969ebb0bcf") (:revdesc . "e78749fb2973") (:keywords "redox" "convenience" "tools") (:authors ("Jacob Salzberg" . "jsalzbergedu@yahoo.com")) (:maintainers ("Jacob Salzberg" . "jsalzbergedu@yahoo.com")) (:maintainer "Jacob Salzberg" . "jsalzbergedu@yahoo.com"))]) + (react-snippets . [(20210430 1510) ((yasnippet (0 7 0))) "Yasnippets for React" tar ((:url . "https://github.com/johnmastro/react-snippets.el") (:commit . "9d0a1bb90ac36c689cded48b661e81d4544fd719") (:revdesc . "9d0a1bb90ac3") (:keywords "snippets") (:authors ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainers ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com"))]) + (read-aloud . [(20160923 500) ((emacs (24 4))) "A simple interface to TTS engines" tar ((:url . "https://github.com/gromnitsky/read-aloud.el") (:commit . "d5f80ab72054a957aed25224639c1779cae5f4d1") (:revdesc . "d5f80ab72054") (:keywords "multimedia") (:authors ("Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com")) (:maintainers ("Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com")) (:maintainer "Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com"))]) + (read-only-cfg . [(20210717 205) ((emacs (24 3))) "Make files read-only based on user config" tar ((:url . "https://github.com/pfchen/read-only-cfg") (:commit . "fa16d6018a5a29f26adf6007b6b76ea1b3c0bfce") (:revdesc . "fa16d6018a5a") (:keywords "tools" "convenience") (:authors ("pfchen" . "pfchen31@gmail.com")) (:maintainers ("pfchen" . "pfchen31@gmail.com")) (:maintainer "pfchen" . "pfchen31@gmail.com"))]) + (readable-numbers . [(20220711 911) ((emacs (24 1))) "Visually separate long integers" tar ((:url . "https://github.com/Titan-C/cardano.el") (:commit . "a3ebdcdd91d32f044b68541a00e162396e4acb38") (:revdesc . "a3ebdcdd91d3") (:authors ("Oscar Najera" . "https://oscarnajera.com")) (:maintainers ("Oscar Najera" . "hi@oscarnajera.com")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com"))]) + (readline-complete . [(20150708 1437) nil "Offers completions in shell mode" tar ((:url . "https://github.com/monsanto/readline-complete.el") (:commit . "30c020c37b2741160cc37e656e13c85d826a0ebf") (:revdesc . "30c020c37b27") (:authors ("Christopher Monsanto" . "chris@monsan.to")) (:maintainers ("Christopher Monsanto" . "chris@monsan.to")) (:maintainer "Christopher Monsanto" . "chris@monsan.to"))]) + (ready-player . [(20251205 1320) ((emacs (28 1))) "Open media files in ready-player major mode" tar ((:url . "https://github.com/xenodium/ready-player") (:commit . "f1a422c855748d0af0c61964f8a92ad81c445470") (:revdesc . "f1a422c85574"))]) + (real-auto-save . [(20200505 1537) ((emacs (24 4))) "Automatically save your buffers/files at regular intervals" tar ((:url . "https://github.com/ChillarAnand/real-auto-save") (:commit . "8e51241e5ba7b07b91d8188c14cf193017640292") (:revdesc . "8e51241e5ba7") (:authors ("Chaoji Li" . "lichaojiATgmailDOTcom") ("Anand Reddy Pandikunta" . "anand21nandaATgmailDOTcom")) (:maintainers ("Chaoji Li" . "lichaojiATgmailDOTcom") ("Anand Reddy Pandikunta" . "anand21nandaATgmailDOTcom")) (:maintainer "Chaoji Li" . "lichaojiATgmailDOTcom"))]) + (real-mono-themes . [(20251126 803) ((emacs (28 1))) "Real monochromatic color themes" tar ((:url . "https://github.com/NestorLiao/real-mono-themes") (:commit . "45d68036bce5c3d95fcfdb4f02fca5fddb70e3db") (:revdesc . "45d68036bce5") (:keywords "faces") (:authors ("Qingsong Liao" . "llqingsong@qq.com")) (:maintainers ("Qingsong Liao" . "llqingsong@qq.com")) (:maintainer "Qingsong Liao" . "llqingsong@qq.com"))]) + (realgud . [(20251024 2145) ((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 ((:url . "https://github.com/realgud/realgud/") (:commit . "56a8d82830ad65c9cbb9c694617f078f007281ac") (:revdesc . "56a8d82830ad") (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (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 ((:url . "http://github.com/rocky/realgud-byebug") (:commit . "f8f20b92c6b13f75cc9797921c0e28d3def48b1c") (:revdesc . "f8f20b92c6b1"))]) + (realgud-ipdb . [(20200722 1116) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) "Realgud front-end to ipdb" tar ((:url . "https://github.com/realgud/realgud-ipdb") (:commit . "f18f907aa4ddd3e59dc19ca296d4ee2dc5e436b0") (:revdesc . "f18f907aa4dd") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (realgud-jdb . [(20200722 1120) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) "Realgud front-end to Java's jdb debugger\"" tar ((:url . "https://github.com/realgud/realgud-jdb") (:commit . "1c183b2f8aae0de60942ea01444b896bf182c66a") (:revdesc . "1c183b2f8aae") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (realgud-lldb . [(20241119 209) ((load-relative (1 3 1)) (realgud (1 5 0)) (emacs (25))) "Realgud front-end to lldb" tar ((:url . "http://github.com/realgud/realgud-lldb") (:commit . "deacd070e8ab8830f4d577fee37136ad89183d13") (:revdesc . "deacd070e8ab") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (realgud-node-debug . [(20190525 1634) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (25))) "Realgud front-end to older \"node debug\"" tar ((:url . "http://github.com/realgud/realgud-node-debug") (:commit . "72e786359ce9dace1796b0d81a00e9340e9c90ad") (:revdesc . "72e786359ce9") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (realgud-node-inspect . [(20190523 1251) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to newer \"node inspect\"" tar ((:url . "http://github.com/realgud/realgud-node-inspect") (:commit . "e0f18442d759b8ce4479c01e090975b62270257d") (:revdesc . "e0f18442d759") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (realgud-old-debuggers . [(20190520 1150) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to older lesser-used debuggers" tar ((:url . "http://github.com/rocky/realgud-old-debuggers") (:commit . "0fad38283e885c452160232e01adf3f6ae51983b") (:revdesc . "0fad38283e88"))]) + (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 ((:url . "http://github.com/rocky/realgud-pry") (:commit . "264ca6811b0bef5de4decc54acfeacf0bce2f51f") (:revdesc . "264ca6811b0b"))]) + (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 ((:url . "http://github.com/rocky/realgud-ruby-debugger2") (:commit . "3594aa74f7afda3c3251bb2af7fe0e8ec6d621ae") (:revdesc . "3594aa74f7af"))]) + (realgud-trepan-ni . [(20210513 2237) ((load-relative (1 2)) (realgud (1 5 0)) (emacs (25))) "Realgud front-end to trepan-ni" tar ((:url . "https://github.com/realgud/realgud-trepan-ni") (:commit . "0ec088ea343835e24ae73da09bea96bfb02a3130") (:revdesc . "0ec088ea3438") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (reaper . [(20250123 619) ((emacs (26 2))) "Interact with Harvest time tracking app" tar ((:url . "https://github.com/xendk/reaper") (:commit . "7515ef42e0bfb0fd45d2e283e654271fe20cf447") (:revdesc . "7515ef42e0bf") (:keywords "tools") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainers ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk"))]) + (reason-mode . [(20230405 517) ((emacs (24 3))) "A major mode for editing ReasonML" tar ((:url . "https://github.com/reasonml-editor/reason-mode") (:commit . "d657ff75572a8ea7eda6fe22ada3a2ebf5bc6119") (:revdesc . "d657ff75572a") (:keywords "languages" "ocaml"))]) + (reazon . [(20211229 1733) ((emacs (26))) "MiniKanren for Emacs" tar ((:url . "https://github.com/nickdrozd/reazon") (:commit . "da3c4a8acf236eddb73348056e08bea330e868c0") (:revdesc . "da3c4a8acf23") (:keywords "languages" "extensions" "lisp") (:authors ("Nick Drozd" . "nicholasdrozd@gmail.com")) (:maintainers ("Nick Drozd" . "nicholasdrozd@gmail.com")) (:maintainer "Nick Drozd" . "nicholasdrozd@gmail.com"))]) + (rebecca-theme . [(20250603 428) ((emacs (24))) "Rebecca Purple Theme" tar ((:url . "https://github.com/vic/rebecca-theme") (:commit . "718787fb8c9f3e29e09bb9cbdd966c810f15aa81") (:revdesc . "718787fb8c9f") (:keywords "theme" "dark") (:authors ("vic" . "vborja@apache.org")) (:maintainers ("vic" . "vborja@apache.org")) (:maintainer "vic" . "vborja@apache.org"))]) + (rebox2 . [(20121113 1300) nil "Handling of comment boxes in various styles" tar ((:url . "https://github.com/lewang/rebox2") (:commit . "00634eca420cc48657b81e40e599ff8548083985") (:revdesc . "00634eca420c"))]) + (recall . [(20250120 2131) ((emacs (29 1))) "Recall Emacs subprocess" tar ((:url . "https://github.com/svaante/recall") (:commit . "a8f961e9a5d6b609ee1934a0ae68ed003ee4987b") (:revdesc . "a8f961e9a5d6") (:maintainers ("Daniel Pettersson" . "daniel@dpettersson.net")) (:maintainer "Daniel Pettersson" . "daniel@dpettersson.net"))]) + (recentf-ext . [(20170926 35) nil "Recentf extensions" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/recentf-ext.el") (:commit . "450de5f8544ed6414e88d4924d7daa5caa55b7fe") (:revdesc . "450de5f8544e") (:keywords "convenience" "files") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (recentf-remove-sudo-tramp-prefix . [(20220621 749) ((emacs (24 4))) "Normalise recentf history" tar ((:url . "https://github.com/ncaq/recentf-remove-sudo-tramp-prefix") (:commit . "95ff600058371dd08f615095a55850d2910021bb") (:revdesc . "95ff60005837") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainers ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net"))]) + (recently . [(20210930 207) ((cl-lib (0 5)) (emacs (24))) "Track recently opened files to visit them again" tar ((:url . "https://github.com/10sr/recently-el") (:commit . "94b31f6bf1dab6af942948fec975e37424938a62") (:revdesc . "94b31f6bf1da") (:keywords "utility" "files") (:authors ("10sr" . "8.slashes[at]gmail[dot]com")) (:maintainers ("10sr" . "8.slashes[at]gmail[dot]com")) (:maintainer "10sr" . "8.slashes[at]gmail[dot]com"))]) + (recompile-on-save . [(20151126 1446) ((dash (1 1 0)) (cl-lib (0 5))) "Trigger recompilation on file save" tar ((:url . "https://github.com/maio/recompile-on-save.el") (:commit . "92e11446869d878803d4f3dec5d2101380c12bb2") (:revdesc . "92e11446869d") (:keywords "convenience" "files" "processes" "tools") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainers ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com"))]) + (recomplete . [(20251214 1150) ((emacs (29 1))) "Immediately (re)complete actions" tar ((:url . "https://codeberg.org/ideasman42/emacs-recomplete") (:commit . "be53d7b0c5734c90e45252ba24d5913ee178a925") (:revdesc . "be53d7b0c573") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (recover-buffers . [(20171009 437) nil "Revisit all buffers from an auto-save file" tar ((:url . "https://github.com/tripleee/recover-buffers") (:commit . "81a5cb53099955ebc2a411a44cba5a394ee3f2d1") (:revdesc . "81a5cb530999") (:authors ("era eriksson" . "http://www.iki.fi/era")) (:maintainers ("era eriksson" . "http://www.iki.fi/era")) (:maintainer "era eriksson" . "http://www.iki.fi/era"))]) + (rect+ . [(20250120 829) nil "Extensions to rect.el" tar ((:url . "https://github.com/mhayashi1120/Emacs-rectplus") (:commit . "6b1d49b64b331c4f59a265e0fa91333a0e8243c2") (:revdesc . "6b1d49b64b33") (:keywords "extensions" "data" "tools") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (rectangle-utils . [(20240830 306) ((emacs (24)) (cl-lib (0 5))) "Some useful rectangle functions" tar ((:url . "https://github.com/thierryvolpiatto/rectangle-utils") (:commit . "0d9c5dcef2d660cf6b67fc52f18a720d02514f01") (:revdesc . "0d9c5dcef2d6") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))]) + (recur . [(20230121 1836) ((emacs (24 3))) "Tail call optimization" tar ((:url . "https://github.com/ROCKTAKEY/recur") (:commit . "043b3267125cb9fa273d0f0afee0dda1fc60c507") (:revdesc . "043b3267125c") (:keywords "lisp") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (recursion-indicator . [(20250921 1714) ((emacs (29 1)) (compat (30))) "Recursion indicator" tar ((:url . "https://github.com/minad/recursion-indicator") (:commit . "91140813d5f54f2ab56116914a10d1f7aae65826") (:revdesc . "91140813d5f5") (:keywords "convenience") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (recursive-narrow . [(20190306 1521) nil "Narrow-to-region that operates recursively" tar ((:url . "http://github.com/nflath/recursive-narrow") (:commit . "5e3e2067d5a148d7e64e64e0355d3b6860e4c259") (:revdesc . "5e3e2067d5a1") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainers ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com"))]) + (redacted . [(20220108 1037) ((emacs (25 1))) "Obscure text in buffer" tar ((:url . "https://github.com/bkaestner/redacted.el") (:commit . "b3f44ccf51d9d5274f7837fc825db0a378055744") (:revdesc . "b3f44ccf51d9") (:keywords "games") (:authors ("Benjamin Kästner" . "benjamin.kaestner@gmail.com")) (:maintainers ("Benjamin Kästner" . "benjamin.kaestner@gmail.com")) (:maintainer "Benjamin Kästner" . "benjamin.kaestner@gmail.com"))]) + (reddigg . [(20240730 2339) ((emacs (26 3)) (promise (1 1)) (ht (2 3)) (org (9 2))) "A reader for redditt" tar ((:url . "https://github.com/thanhvg/emacs-reddigg") (:commit . "4d22e06a6e2523fe6d83c0280847d3bde19fabb5") (:revdesc . "4d22e06a6e25") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainers ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com"))]) + (redis . [(20231111 1733) ((emacs (24)) (cl-lib (0 5))) "Redis integration" tar ((:url . "https://github.com/emacs-pe/redis.el") (:commit . "84382456beae70677aed2f9558a0b446f8ccc17a") (:revdesc . "84382456beae") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (redpen-paragraph . [(20160625 1050) ((emacs (24)) (cl-lib (0 5)) (json (1 4))) "RedPen interface" tar ((:url . "https://github.com/karronoli/redpen-paragraph.el") (:commit . "770ffb34b04bfa0ea8484fa1506e96c530168e13") (:revdesc . "770ffb34b04b") (:keywords "document" "proofreading" "help"))]) + (redprl . [(20180418 1434) ((emacs (24 3))) "Major mode for editing RedPRL proofs and interacting with RedPRL" tar ((:url . "https://github.com/RedPRL/sml-redprl") (:commit . "4abdbdeda4604ff30ce19c0df3f43e34faf60bd7") (:revdesc . "4abdbdeda460") (:keywords "languages") (:authors ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainers ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainer "Jonathan Sterling" . "jon@jonmsterling.com"))]) + (redshank . [(20180730 407) ((paredit (21))) "Common Lisp Editing Extensions" tar ((:url . "https://github.com/emacsattic/redshank") (:commit . "d059c5841044aa163664f8bf87c1d981bf0a04fe") (:revdesc . "d059c5841044") (:keywords "languages" "lisp") (:authors ("Michael Weber" . "michaelw@foldr.org")) (:maintainers ("Michael Weber" . "michaelw@foldr.org")) (:maintainer "Michael Weber" . "michaelw@foldr.org"))]) + (redtick . [(20180424 2136) ((emacs (24 4))) "Smallest pomodoro timer (1 char)" tar ((:url . "http://github.com/ferfebles/redtick") (:commit . "0faa6b7b479fae39f5d4632f0cbbef0f2917780e") (:revdesc . "0faa6b7b479f") (:keywords "calendar"))]) + (redtt . [(20181121 21) ((emacs (25 3))) "Major mode for editing redtt proofs" tar ((:url . "http://github.com/RedPRL/redtt") (:commit . "c95d1a0787fb92eb011df690b4bdc1029a611c0b") (:revdesc . "c95d1a0787fb") (:keywords "languages") (:authors ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainers ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainer "Jonathan Sterling" . "jon@jonmsterling.com"))]) + (refine . [(20240914 634) ((emacs (24 3)) (s (1 11 0)) (dash (2 12 0)) (list-utils (0 4 4)) (loop (1 2))) "Interactive value editing" tar ((:url . "https://github.com/Wilfred/refine") (:commit . "07c1f3518fff4e363c68c0a110137756754641df") (:revdesc . "07c1f3518fff") (:keywords "convenience") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (reformatter . [(20241204 1051) ((emacs (24 3))) "Define commands which run reformatters on the current buffer" tar ((:url . "https://github.com/purcell/emacs-reformatter") (:commit . "f2cb59466b1c3f85a8c960f7d4b7b7ead015bedc") (:revdesc . "f2cb59466b1c") (:keywords "convenience" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (regex-dsl . [(20220125 506) nil "Lisp syntax for regexps" tar ((:url . "https://github.com/alk/elisp-regex-dsl") (:commit . "8802555ecdab8b50bb64181798497c10cdb5034b") (:revdesc . "8802555ecdab") (: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 ((:url . "http://www.newartisans.com/") (:commit . "0b4a0111143c88ef94bec56624cb2e00c1a054e6") (:revdesc . "0b4a0111143c") (:keywords "regex" "languages" "programming" "development") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainers ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com"))]) + (region-bindings-mode . [(20140407 2214) nil "Enable custom bindings when mark is active" tar ((:url . "https://github.com/fgallina/region-bindings-mode") (:commit . "3fa5dbdbd7c000bebff6d9d14a4be326ec24b6fc") (:revdesc . "3fa5dbdbd7c0") (:keywords "convenience") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainers ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "Fabián E. Gallina" . "fabian@anue.biz"))]) + (region-convert . [(20210519 1655) ((emacs (24 3))) "Convert string in region by Lisp function" tar ((:url . "https://github.com/zonuexe/right-click-context") (:commit . "cb3ab0417d7b74e5edd34bf23a70737fc7bf1d3a") (:revdesc . "cb3ab0417d7b") (:keywords "region" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (region-occurrences-highlighter . [(20241219 1705) ((emacs (26 1))) "Mark occurrences of current region (selection)" tar ((:url . "https://github.com/alvarogonzalezsotillo/region-occurrences-highlighter") (:commit . "4c2c7a241fd257dd51f2726715cd1be022b3445a") (:revdesc . "4c2c7a241fd2") (:keywords "convenience") (:authors ("lvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (region-state . [(20181205 1746) nil "Show the number of chars/lines or rows/columns in the region" tar ((:url . "https://github.com/xuchunyang/region-state.el") (:commit . "f9e3926036a7c261b20bad9bf46f68ead8c15024") (:revdesc . "f9e3926036a7") (:keywords "convenience") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (register-channel . [(20210120 1618) nil "Jump around fast using registers" tar ((:url . "https://github.com/YangZhao11/register-channel") (:commit . "ed7f563e92170b758dc878fcb5df88d46d5d44cc") (:revdesc . "ed7f563e9217") (:keywords "convenience") (:authors ("Yang Zhao" . "YangZhao11@users.noreply.github.com")) (:maintainers ("Yang Zhao" . "YangZhao11@users.noreply.github.com")) (:maintainer "Yang Zhao" . "YangZhao11@users.noreply.github.com"))]) + (rego-mode . [(20201102 1420) ((emacs (24 4)) (reformatter (0 3))) "A major mode for rego language" tar ((:url . "https://github.com/psibi/rego-mode") (:commit . "be110e6cef5d34eef0529a8739c68e619cf15310") (:revdesc . "be110e6cef5d") (:keywords "languages") (:authors ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainers ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainer "Sibi Prabakaran" . "sibi@psibi.in"))]) + (regswap . [(20240602 2051) ((emacs (24 3))) "Functionality for swapping two regions" tar ((:url . "http://github.com/skitov/regswap") (:commit . "65e2319e013c5d59f338edde12b98ef1c737e870") (:revdesc . "65e2319e013c"))]) + (related . [(20190327 1024) ((cl-lib (0 5))) "Switch back and forth between similarly named buffers" tar ((:url . "https://github.com/julien-montmartin/related") (:commit . "546c7e811b290470288b617f2c27106bd83ccd33") (:revdesc . "546c7e811b29") (:keywords "file" "buffer" "switch" "selection" "matching" "convenience"))]) + (related-files . [(20230903 851) ((emacs (28 2))) "Easily find files related to the current one" tar ((:url . "https://www.gnu.org/software/emacs/") (:commit . "8020f375013d5e83c9b8117d118d2402c63e66bb") (:revdesc . "8020f375013d") (:keywords "tools") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (remark-mode . [(20221123 2127) ((emacs (25 1)) (markdown-mode (2 0))) "Major mode for the remark slideshow tool" tar ((:url . "https://github.com/torgeir/remark-mode.el") (:commit . "5a2a702d2af8fd007ae02237d5824356d0c1acc6") (:revdesc . "5a2a702d2af8") (:keywords "remark" "slideshow" "markdown" "hot reload") (:authors (nil . "@torgeir")) (:maintainers (nil . "@torgeir")) (:maintainer nil . "@torgeir"))]) + (remember-last-theme . [(20250921 2104) ((emacs (24 4))) "Remember the last used theme between sessions" tar ((:url . "https://github.com/nullvec/remember-last-theme") (:commit . "6c180928df64bf825f96241291b90e44f5163032") (:revdesc . "6c180928df64") (:keywords "convenience" "faces") (:authors ("A. Hdez" . "trefoil_chilled_7k@icloud.com")) (:maintainers ("A. Hdez" . "trefoil_chilled_7k@icloud.com")) (:maintainer "A. Hdez" . "trefoil_chilled_7k@icloud.com"))]) + (remind-bindings . [(20200820 1723) ((emacs (25 1)) (omni-quotes (0 5)) (popwin (1 0)) (map (2 0))) "Reminders for your init bindings" tar ((:url . "https://github.com/mtekman/remind-bindings.el") (:commit . "c9a327bfd3c68a0c41b5b64df491bdee4c73ca39") (:revdesc . "c9a327bfd3c6") (:keywords "outlines"))]) + (renpy-mode . [(20251118 1922) ((emacs (27 1))) "Major mode for editing Ren'Py files" tar ((:url . "https://github.com/Reagankm/renpy-mode") (:commit . "f4b7512af930efbf6a9be8dd7d43f47031acba40") (:revdesc . "f4b7512af930") (:keywords "languages") (:authors ("Dave Love" . "fx@gnu.org")) (:maintainers ("Reagan Middlebrook" . "reagankm@gmail.com")) (:maintainer "Reagan Middlebrook" . "reagankm@gmail.com"))]) + (repeat-fu . [(20251224 1312) ((emacs (29 1))) "Minor mode to repeat typing or commands" tar ((:url . "https://codeberg.org/ideasman42/emacs-repeat-fu") (:commit . "688b734eb5e73fba5acb523c6436dc0628286349") (:revdesc . "688b734eb5e7") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (repeat-help . [(20230118 24) ((emacs (28 1))) "Display keybindings for repeat-mode" tar ((:url . "https://github.com/karthink/repeat-help") (:commit . "41dea6fba2edd6ac748d0ca7a6da4058290feede") (:revdesc . "41dea6fba2ed") (:keywords "convenience") (:authors ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthikchikmagalur@gmail.com"))]) + (repeat-ring . [(20250915 2234) ((emacs (25 1)) (virtual-ring (0 1)) (pubsub (0 1)) (mantra (0 1))) "Structured and configurable repetition" tar ((:url . "https://github.com/countvajhula/repeat-ring") (:commit . "04c128149e50827134ecd8e5a5176cd889469175") (:revdesc . "04c128149e50") (:authors ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com"))]) + (repeatable-motion . [(20170620 1848) ((emacs (24))) "Make repeatable versions of motions" tar ((:url . "https://github.com/willghatch/emacs-repeatable-motion") (:commit . "77aa35b27c8a76dc8deef87c9f71ef7e6fd289ee") (:revdesc . "77aa35b27c8a") (:keywords "motion" "repeatable") (:authors ("William Hatch" . "willghatch@gmail.com")) (:maintainers ("William Hatch" . "willghatch@gmail.com")) (:maintainer "William Hatch" . "willghatch@gmail.com"))]) + (repeater . [(20180418 1212) ((emacs (24 4))) "Repeat recent repeated commands" tar ((:url . "https://github.com/xuchunyang/repeater") (:commit . "854b874542b186b2408cbc58ad0591fe8eb70b6c") (:revdesc . "854b874542b1") (:keywords "convenience") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (repl-driven-development . [(20241110 1611) ((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)) (json-navigator (1 0 0))) "Send arbitrary code to a REPL in the background" tar ((:url . "http://alhassy.com/repl-driven-development") (:commit . "2ffa5368a6db602a9f220935cd985999c60845ba") (:revdesc . "2ffa5368a6db") (:keywords "repl-driven-development" "rdd" "repl" "lisp" "eval" "java" "python" "ruby" "programming" "convenience") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainers ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com"))]) + (repl-toggle . [(20220920 752) ((fullframe (0 0 5))) "Switch to/from repl buffer for current major-mode" tar ((:url . "https://git.sr.ht/~tomterl/repl-toggle") (:commit . "e05996b4a2b988f93ccce67f933cfad00064360f") (:revdesc . "e05996b4a2b9") (:keywords "repl" "buffers" "toggle") (:authors ("Tom Regner" . "tom@goochesa.de")) (:maintainers ("Tom Regner" . "tom@goochesa.de")) (:maintainer "Tom Regner" . "tom@goochesa.de"))]) + (replace-from-region . [(20240224 52) nil "Replace commands whose query is from region" tar ((:url . "http://www.emacswiki.org/emacs/download/replace-from-region.el") (:commit . "7b5b5ce5488ad5314acaa301d6482bf781db4ebd") (:revdesc . "7b5b5ce5488a") (:keywords "replace" "search" "region") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (replace-pairs . [(20160207 1251) ((emacs (24 4))) "Query-replace pairs of things" tar ((:url . "https://github.com/davidshepherd7/replace-pairs") (:commit . "ef6f2719aab7714f6cb209fd3dd6d2e720681b3c") (:revdesc . "ef6f2719aab7") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com"))]) + (replace-symbol . [(20160518 12) nil "Rename symbols in expressions or buffers" tar ((:url . "https://github.com/bmastenbrook/replace-symbol-el") (:commit . "baf949e528aee1881f455f9c84e67718bedcb3f6") (:revdesc . "baf949e528ae") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainers ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net"))]) + (replace-with-inflections . [(20240122 927) ((cl-lib (0 5)) (string-inflection (1 0 10)) (inflections (1 1))) "Inflection aware `query-replace'" tar ((:url . "https://github.com/knu/replace-with-inflections.el") (:commit . "c57cfb06752bb17389465890ff0ef58a7dd465d2") (:revdesc . "c57cfb06752b") (:keywords "matching") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (repo . [(20240425 1307) ((emacs (24 3))) "Running repo from Emacs" tar ((:url . "https://github.com/snogge/repo-el") (:commit . "1572f3ee82eaadc06e741f03e1889281308c79fa") (:revdesc . "1572f3ee82ea") (:keywords "convenience"))]) + (repo-grep . [(20250826 1109) ((emacs (25 1))) "Project-wide grep search" tar ((:url . "https://github.com/BHFock/repo-grep") (:commit . "98dd4b492d93b8d13f9bc7b80efe91577c13e779") (:revdesc . "98dd4b492d93") (:keywords "tools" "search" "grep" "convenience" "project"))]) + (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 ((:url . "https://github.com/edvorg/req-package") (:commit . "a77da72931914ac5f3f64dc61fe9dc3522b2817e") (:revdesc . "a77da7293191") (:keywords "dotemacs" "startup" "speed" "config" "package") (:authors ("Edward Knyshov" . "edvorg@gmail.com")) (:maintainers ("Edward Knyshov" . "edvorg@gmail.com")) (:maintainer "Edward Knyshov" . "edvorg@gmail.com"))]) + (request . [(20250219 2213) ((emacs (24 4))) "Compatible layer for URL request" tar ((:url . "https://github.com/tkf/emacs-request") (:commit . "6f419b5cdd2dfa83675ae53f04d8463d00a533f8") (:revdesc . "6f419b5cdd2d") (:authors ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainers ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com"))]) + (request-deferred . [(20220614 1604) ((emacs (24 1)) (deferred (0 3 1)) (request (0 3))) "Wrap request.el by deferred" tar ((:url . "https://github.com/tkf/emacs-request") (:commit . "38ed1d2e64138eb16a9d8ed2987cff2e01b4a93b") (:revdesc . "38ed1d2e6413") (:authors ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainers ("Takafumi Arakaki" . "aka.tkfatgmail.com")) (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com"))]) + (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 ((:url . "https://github.com/joeheyming/requirejs-emacs") (:commit . "4ea2a5fcbc76e4cbb6a7461e6f05f019b75865b1") (:revdesc . "4ea2a5fcbc76") (:keywords "javascript" "requirejs") (:authors ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainers ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainer "Joe Heyming" . "joeheyming@gmail.com"))]) + (requirejs-mode . [(20130215 2104) nil "Improved AMD module management" tar ((:url . "https://github.com/moricard/requirejs-mode") (:commit . "011849043098b6c4f27571625ae19071b53b8824") (:revdesc . "011849043098") (:keywords "javascript" "amd" "requirejs") (:authors ("Marc-Olivier Ricard" . "marco.ricard@gmail.com")) (:maintainers ("Marc-Olivier Ricard" . "marco.ricard@gmail.com")) (:maintainer "Marc-Olivier Ricard" . "marco.ricard@gmail.com"))]) + (rescript-mode . [(20240312 1235) ((emacs (26 1))) "A major mode for editing ReScript" tar ((:url . "https://github.com/jjlee/rescript-mode") (:commit . "e97487a8786dd329593c3a786443a6d987d719e9") (:revdesc . "e97487a8786d") (:keywords "languages" "rescript") (: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"))]) + (resize-window . [(20180918 538) ((emacs (24)) (cl-lib (0 5))) "Easily resize windows" tar ((:url . "https://github.com/dpsutton/resize-mode") (:commit . "09dc5968f1c988c51fcd6ea5d68bb38b7541eb66") (:revdesc . "09dc5968f1c9") (:keywords "window" "resize") (:authors ("Dan Sutton" . "danielsutton01@gmail.com")) (:maintainers ("Dan Sutton" . "danielsutton01@gmail.com")) (:maintainer "Dan Sutton" . "danielsutton01@gmail.com"))]) + (restart-emacs . [(20201127 1425) nil "Restart emacs from within emacs" tar ((:url . "https://github.com/iqbalansari/restart-emacs") (:commit . "d0fca7fba014b2d0d4dedcb9744a1e73cd9a6409") (:revdesc . "d0fca7fba014") (:keywords "convenience") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainers ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com"))]) + (restclient . [(20251209 2022) ((emacs (26 1)) (compat (30 1 0 0))) "An interactive HTTP client for Emacs" tar ((:url . "https://github.com/emacsorphanage/restclient") (:commit . "1800a4e367c250051617d0b8c16a7cbd7f47da69") (:revdesc . "1800a4e367c2") (:keywords "http" "comm" "tools") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainers ("Peder O. Klingenberg" . "peder@klingenberg.no")) (:maintainer "Peder O. Klingenberg" . "peder@klingenberg.no"))]) + (restclient-helm . [(20170314 1554) ((restclient (0)) (helm (1 9 4))) "Helm interface for restclient.el" tar ((:url . "https://github.com/emacsorphanage/restclient") (:commit . "af7420085dd67ed08d199a2402e8ff3e996c3029") (:revdesc . "af7420085dd6") (:keywords "http" "helm") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainers ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainer "Pavel Kurnosov" . "pashky@gmail.com"))]) + (restclient-jq . [(20250803 2119) ((restclient (20200502 831)) (jq-mode (0 4 1)) (emacs (24 4))) "Support for setting restclient vars from jq expressions" tar ((:url . "https://github.com/pashky/restclient.el") (:commit . "6764278a3d63520eaf117344d8dc23654b640645") (:revdesc . "6764278a3d63") (:keywords "tools" "comm" "http" "jq") (:authors ("Cameron Dorrat" . "cdorrat@gmail.com")) (:maintainers ("Cameron Dorrat" . "cdorrat@gmail.com")) (:maintainer "Cameron Dorrat" . "cdorrat@gmail.com"))]) + (restclient-test . [(20240207 1415) ((emacs (26 1)) (restclient (0))) "Run tests with restclient.el" tar ((:url . "https://github.com/simenheg/restclient-test.el") (:commit . "5a364b93779eb3b4566dd6d843d7637983fcc949") (:revdesc . "5a364b93779e") (:authors ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainers ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainer "Simen Heggestøyl" . "simenheg@runbox.com"))]) + (retraction-viewer . [(20250520 1615) ((emacs (27 1)) (plz (0 9 1))) "View retraction information for current citation" tar ((:url . "https://git.sr.ht/~swflint/retraction-viewer") (:commit . "8c913286dcb4bfdbb96c1e87770fae8ec644a966") (:revdesc . "8c913286dcb4") (:keywords "bib" "tex" "data") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (retraction-viewer-section . [(20240509 1440) ((emacs (25 1)) (retraction-viewer (1 0 2)) (universal-sidecar (1 5 1))) "Show retraction information in the universal-sidecar" tar ((:url . "https://git.sr.ht/~swflint/retraction-viewer") (:commit . "e8ab96e5a95a93849b912e2684b9776c685ac4bd") (:revdesc . "e8ab96e5a95a") (:keywords "bib" "tex") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (retrie . [(20200519 551) ((emacs (24 5))) "Refactoring Haskell code with retrie" tar ((:url . "https://github.com/Ailrun/emacs-retrie") (:commit . "976d6f01a3e214917f16b82e750d825cb9bfcc59") (:revdesc . "976d6f01a3e2") (:keywords "files" "languages" "tools") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainers ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com"))]) + (revbufs . [(20200907 2223) nil "Reverts all out-of-date buffers safely" tar ((:url . "http://www.neilvandyke.org/revbufs/") (:commit . "df3c02d3063951582c693ae12547993cec8256e2") (:revdesc . "df3c02d30639") (:keywords "convenience" "buffers") (:authors ("Neil Van Dyke" . "neil@neilvandyke.org")) (:maintainers ("Sam Kleinman" . "sam@tychoish.com")) (:maintainer "Sam Kleinman" . "sam@tychoish.com"))]) + (reveal-in-folder . [(20250101 1011) ((emacs (24 3)) (f (0 20 0)) (s (1 12 0))) "Reveal current file/directory in folder" tar ((:url . "https://github.com/jcs-elpa/reveal-in-folder") (:commit . "f3b7d1edcf8534152ce205bf45d7cae2b7793263") (:revdesc . "f3b7d1edcf85") (:keywords "convenience" "folder" "finder" "reveal" "file" "explorer") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (reveal-in-osx-finder . [(20150802 1657) nil "Reveal file associated with buffer in OS X Finder" tar ((:url . "https://github.com/kaz-yos/reveal-in-osx-finder") (:commit . "5710e5936e47139a610ec9a06899f72e77ddc7bc") (:revdesc . "5710e5936e47") (:keywords "os x" "finder"))]) + (reverse-im . [(20250526 1156) ((emacs (25 1)) (seq (2 23))) "Reverse mapping for non-default system layouts" tar ((:url . "https://github.com/a13/reverse-im.el") (:commit . "20d5f0514a761f0a06284b2adf0baf4bf7b93db2") (:revdesc . "20d5f0514a76") (:keywords "i18n") (:authors ("Juri Linkov" . "juri@jurta.org")) (:maintainers ("DK" . "a13@users.noreply.github.com")) (:maintainer "DK" . "a13@users.noreply.github.com"))]) + (reverse-theme . [(20141205 145) nil "Reverse theme for Emacs" tar ((:url . "https://github.com/syohex/emacs-reverse-theme") (:commit . "3105c950bcb51c662c79b59ca102ef662c2b0be0") (:revdesc . "3105c950bcb5") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (reverso . [(20250610 1032) ((emacs (27 1)) (transient (0 3 7)) (request (0 3 2))) "Translation, grammar checking, context search" tar ((:url . "https://github.com/SqrtMinusOne/reverso.el") (:commit . "40ed3d83c4f04c39e05d69d84595761ae2956a64") (:revdesc . "40ed3d83c4f0") (:authors ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainers ("Korytov Pavel" . "thexcloud@gmail.com")) (:maintainer "Korytov Pavel" . "thexcloud@gmail.com"))]) + (revert-buffer-all . [(20251214 1120) ((emacs (28 1))) "Revert all open buffers" tar ((:url . "https://codeberg.org/ideasman42/emacs-buffer-revert-all") (:commit . "e00fc97fe469265b31a9790f40f1e8b749380b01") (:revdesc . "e00fc97fe469") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (review-mode . [(20241210 1258) nil "Major mode for ReVIEW" tar ((:url . "https://github.com/kmuto/review-el") (:commit . "2a297e3e533cd1f9aac85b77a0c549ec36af5ae3") (:revdesc . "2a297e3e533c") (:authors ("Kenshi Muto" . "kmuto@kmuto.jp")) (:maintainers ("Kenshi Muto" . "kmuto@kmuto.jp")) (:maintainer "Kenshi Muto" . "kmuto@kmuto.jp"))]) + (rewriting-pcase . [(20230419 23) ((emacs (27 1))) "Support for rewriting sexps in source code" tar ((:url . "https://github.com/owinebar/emacs-rewriting-pcase") (:commit . "3a2efb79bfc68629bd20a8bc1770c8f6d24575fa") (:revdesc . "3a2efb79bfc6") (:keywords "extensions" "lisp"))]) + (reykjavik-theme . [(20201219 947) ((emacs (24))) "Theme with a dark background" tar ((:url . "https://github.com/mswift42/reykjavik-theme") (:commit . "f6d8e83946633603234cd1dac725e17447f40bce") (:revdesc . "f6d8e8394663"))]) + (rfc-mode . [(20231013 1353) ((emacs (25 1))) "RFC document browser and viewer" tar ((:url . "https://github.com/galdor/rfc-mode") (:commit . "ab09db78d9d1baa4da4f926930833598e1e978ce") (:revdesc . "ab09db78d9d1") (:authors ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainers ("Nicolas Martyanoff" . "nicolas@n16f.net")) (:maintainer "Nicolas Martyanoff" . "nicolas@n16f.net"))]) + (rg . [(20251022 457) ((emacs (28 1)) (transient (0 9 2)) (wgrep (2 1 10))) "A search tool based on ripgrep" tar ((:url . "https://github.com/dajva/rg.el") (:commit . "9ff6cb24bda58f481886ebaf16b524f4f9b3769c") (:revdesc . "9ff6cb24bda5") (:keywords "matching" "tools") (:authors ("David Landell" . "david.landell@sunnyhill.email") ("Roland McGrath" . "roland@gnu.org")) (:maintainers ("David Landell" . "david.landell@sunnyhill.email") ("Roland McGrath" . "roland@gnu.org")) (:maintainer "David Landell" . "david.landell@sunnyhill.email"))]) + (rg-themes . [(20250718 1826) ((emacs (25 1))) "The rg theme collection" tar ((:url . "https://github.com/raegnald/rg-themes") (:commit . "5947efd002f262e685aae169e4ce68b088dacb7d") (:revdesc . "5947efd002f2") (:keywords "faces") (:authors ("Ronaldo Gligan" . "ronaldogligan@gmail.com")) (:maintainers ("Ronaldo Gligan" . "ronaldogligan@gmail.com")) (:maintainer "Ronaldo Gligan" . "ronaldogligan@gmail.com"))]) + (rgb . [(20220717 1940) ((emacs (24 3))) "RGB control via OpenRGB" tar ((:url . "https://gitlab.com/cwpitts/rgb.el") (:commit . "4aab5a5be16b69b47ef5e67d02782df5e41dbd7b") (:revdesc . "4aab5a5be16b"))]) + (rhq . [(20230731 1544) ((emacs (24 4))) "Client for rhq" tar ((:url . "https://github.com/ROCKTAKEY/rhq") (:commit . "9f571787bf0781c78c277db82394fb9a692ec21e") (:revdesc . "9f571787bf07") (:keywords "tools" "extensions") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (rhtml-mode . [(20130422 1311) nil "Major mode for editing RHTML files" tar ((:url . "https://github.com/eschulte/rhtml") (:commit . "a6d71b38a3db867ccf82999c99805db1a3a33c33") (:revdesc . "a6d71b38a3db"))]) + (rib-mode . [(20170726 1448) ((emacs (24))) "RenderMan® Interface Bytestream (RIB) Major Mode" tar ((:url . "https://github.com/blezek/rib-mode") (:commit . "97470158784c3c212e22e2c20b8471ee65ba59af") (:revdesc . "97470158784c") (: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"))]) + (rich-minority . [(20240924 2317) ((cl-lib (0 5))) "Clean-up and Beautify the list of minor-modes" tar ((:url . "https://github.com/Malabarba/rich-minority") (:commit . "77cf5ec620aaef18385d2e1d2dad05b4f63dad95") (:revdesc . "77cf5ec620aa") (:keywords "mode-line" "faces") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (ride-mode . [(20240727 456) ((emacs (25 1))) "A major-mode for editing RIDE language" tar ((:url . "https://codeberg.org/deadblackclover/ride-mode") (:commit . "f1b826fc9b14007aefca8d5748549b9a720b0684") (:revdesc . "f1b826fc9b14") (:keywords "languages") (:authors ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainers ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainer "DEADBLACKCLOVER" . "deadblackclover@protonmail.com"))]) + (right-click-context . [(20210519 1713) ((emacs (24 3)) (popup (0 5)) (ordinal (0 0 1))) "Right Click Context menu" tar ((:url . "https://github.com/zonuexe/right-click-context") (:commit . "c3c9d36ffbc9fb2bc7c2c4b75291dbcdb1c5f531") (:revdesc . "c3c9d36ffbc9") (:keywords "mouse" "menu" "rightclick") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (rigid-tabs . [(20230905 940) ((emacs (24 3))) "Fix TAB alignment in diff buffers" tar ((:url . "https://gitlab.com/wavexx/rigid-tabs.el") (:commit . "9553118e76fcbc1d8f0bcb960de13c7e3f07b9df") (:revdesc . "9553118e76fc") (:keywords "diff" "whitespace" "version control" "magit") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (rii . [(20210317 1330) ((emacs (24 3))) "Reversible input interface for multiple input" tar ((:url . "https://github.com/ROCKTAKEY/rii") (:commit . "9df603a5c63ae38ec776e27dc93d3618e2b0fabe") (:revdesc . "9df603a5c63a") (:keywords "extensions" "tools") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com"))]) + (rime . [(20251105 1505) ((emacs (26 3)) (dash (2 17 0)) (cl-lib (0 6 1)) (popup (0 5 3)) (posframe (0 1 0))) "Rime input method" tar ((:url . "https://www.github.com/DogLooksGood/emacs-rime") (:commit . "f927d26e471e7d63de65ffa92897944242f2fd92") (:revdesc . "f927d26e471e") (:keywords "convenience" "input-method"))]) + (rimero-theme . [(20180901 1348) ((emacs (24))) "Theme with a dark background suitable for UI and terminal usage" tar ((:url . "https://github.com/yveszoundi/emacs-rimero-theme") (:commit . "a2e706c2b34f749019979a133f08a2d94a1104b3") (:revdesc . "a2e706c2b34f") (:keywords "faces" "theme" "dark" "light colors") (:authors ("Yves Zoundi" . "yveszoundi@users.sf.net")) (:maintainers ("Yves Zoundi" . "yveszoundi@users.sf.net")) (:maintainer "Yves Zoundi" . "yveszoundi@users.sf.net"))]) + (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 ((:url . "https://github.com/eschulte/rinari") (:commit . "be07b0f42aefa24c5d36c441d1f3f72e64fffaa4") (:revdesc . "be07b0f42aef") (:keywords "ruby" "rails" "project" "convenience" "web"))]) + (ring-mode . [(20221226 1159) ((emacs (24 3))) "A major mode for the Ring programming language" tar ((:url . "https://github.com/thechampagne/ring-mode") (:commit . "4e38dd5ca374d7d40fd1eeed1e83ef935efd387a") (:revdesc . "4e38dd5ca374") (:keywords "files" "ring"))]) + (rings . [(20160531 2027) nil "Buffer rings. Like tabs, but better" tar ((:url . "http://github.com/konr/rings") (:commit . "3590b222eb80652cbd27866f066bd3571d86edfc") (:revdesc . "3590b222eb80") (:keywords "utilities" "productivity"))]) + (ripgrep . [(20220520 1410) nil "Front-end for ripgrep, a command line search tool" tar ((:url . "https://github.com/nlamirault/ripgrep.el") (:commit . "872e250e8f93b8bb0a8a1de8bde17fd9bd116e31") (:revdesc . "872e250e8f93") (:keywords "ripgrep" "ack" "pt" "ag" "sift" "grep" "search") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (riscv-mode . [(20220916 206) ((emacs (24 4))) "Major-mode for RISC V assembly" tar ((:url . "https://github.com/AdamNiederer/riscv-mode") (:commit . "8e335b9c93de93ed8dd063d702b0f5ad48eef6d7") (:revdesc . "8e335b9c93de") (:keywords "riscv" "assembly") (:authors ("Adam Niederer" . "https://github.com/AdamNiederer")))]) + (rivet-mode . [(20201013 1905) ((emacs (24)) (web-mode (16))) "A minor mode for editing Apache Rivet files" tar ((:url . "https://gitlab.com/thornjad/rivet-mode") (:commit . "6cf58cf04fee933113857af07414b3f27c24b505") (:revdesc . "6cf58cf04fee"))]) + (rjsx-mode . [(20200224 2149) ((emacs (24 4)) (js2-mode (20170504))) "Real support for JSX" tar ((:url . "https://github.com/felipeochoa/rjsx-mode/") (:commit . "0061587a06cdc2579a8d0e90863498d96bf982d8") (:revdesc . "0061587a06cd") (:keywords "languages") (:authors ("Felipe Ochoa" . "felipe@fov.space")) (:maintainers ("Felipe Ochoa" . "felipe@fov.space")) (:maintainer "Felipe Ochoa" . "felipe@fov.space"))]) + (rmsbolt . [(20250325 50) ((emacs (25 1))) "A compiler output viewer" tar ((:url . "http://gitlab.com/jgkamat/rmsbolt") (:commit . "05c4795226f859009bc570940139473b6b6f7555") (:revdesc . "05c4795226f8") (:keywords "compilation" "tools") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainers ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com"))]) + (robe . [(20250219 1910) ((inf-ruby (2 5 1)) (emacs (27 1))) "Code navigation, documentation lookup and completion for Ruby" tar ((:url . "https://github.com/dgutov/robe") (:commit . "73a78e55394c1c70c11f9354ef52e7ffce31547c") (:revdesc . "73a78e55394c") (:keywords "ruby" "convenience" "rails"))]) + (robot-log . [(20220719 1301) ((emacs (28 1))) "Major mode for viewing RobotFramework debug log files" tar ((:url . "https://git.sr.ht/~apteryx/emacs-robot-log") (:commit . "26da47597aa97be9649cb60f4da6d94d47d0c0ac") (:revdesc . "26da47597aa9") (:keywords "convenience" "files"))]) + (robot-mode . [(20240721 1023) ((emacs (26 1))) "Major-mode for Robot Framework files" tar ((:url . "https://github.com/kopoli/robot-mode") (:commit . "7c8d7adfa37b7bd15d61cbb78a02e0e1596c453c") (:revdesc . "7c8d7adfa37b") (:keywords "languages" "files") (:authors ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainers ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainer "Kalle Kankare" . "kalle.kankare@iki.fi"))]) + (robots-txt-mode . [(20190812 1858) nil "Major mode for editing robots.txt" tar ((:url . "https://github.com/emacs-php/robots-txt-mode") (:commit . "8bf67285a25a6756607354d184e36583f2847e7d") (:revdesc . "8bf67285a25a") (:keywords "languages" "comm" "web") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (roc-ts-mode . [(20250311 1928) ((emacs (29 1))) "Roc programming language mode" tar ((:url . "https://gitlab.com/tad-lispy/roc-ts-mode") (:commit . "f96ba038e53efbc4113bf675a22d2599be8c21ad") (:revdesc . "f96ba038e53e") (:keywords "languages") (:authors ("Tad Lispy" . "tadeusz@lazurski.pl") ("Ajai Khatri Nelson" . "emacs@ajai.dev")) (:maintainers ("Tad Lispy" . "tadeusz@lazurski.pl") ("Ajai Khatri Nelson" . "emacs@ajai.dev")) (:maintainer "Tad Lispy" . "tadeusz@lazurski.pl"))]) + (roguel-ike . [(20241228 929) ((popup (0 5 0))) "Main file for roguel-ike" tar ((:url . "https://github.com/stevenremot/roguel-ike") (:commit . "e2e0c089129353f0d4c08b42baf6dc9d66a05175") (:revdesc . "e2e0c0891293"))]) + (rom-party . [(20250627 838) ((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 ((:url . "https://github.com/LaurenceWarne/rom-party.el") (:commit . "3664be5a15431c54f1bf04d2597ca546956edb6f") (:revdesc . "3664be5a1543"))]) + (romanian-holidays . [(20250102 1029) ((emacs (26))) "Romanian holidays" tar ((:url . "https://github.com/petrem/romanian-holidays") (:commit . "96c9983ea170503abbd5b3cd79bfe4481c72f43d") (:revdesc . "96c9983ea170") (:keywords "calendar" "holidays" "romanian"))]) + (romkan . [(20251019 1646) ((emacs (24 3))) "Romaji/Kana conversion library" tar ((:url . "https://github.com/gicrisf/romkan.el") (:commit . "81cf9448450b866913b1f24d899f0a716fa49f0b") (:revdesc . "81cf9448450b") (:keywords "i18n" "languages") (:authors ("gicrisf" . "giovanni.crisalfi@protonmail.com")) (:maintainers ("gicrisf" . "giovanni.crisalfi@protonmail.com")) (:maintainer "gicrisf" . "giovanni.crisalfi@protonmail.com"))]) + (ron-mode . [(20200830 1554) ((emacs (24 5 1))) "Rusty Object Notation mode" tar ((:url . "https://chiselapp.com/user/Hutzdog/repository/ron-mode/home") (:commit . "c5e0454b9916d6b73adc15dab8abbb0b0a68ea22") (:revdesc . "c5e0454b9916") (:keywords "languages") (:authors ("Daniel Hutzley" . "endergeryt@gmail.com")) (:maintainers ("Daniel Hutzley" . "endergeryt@gmail.com")) (:maintainer "Daniel Hutzley" . "endergeryt@gmail.com"))]) + (rope-read-mode . [(20250428 1236) ((emacs (24))) "Rearrange lines to read text smoothly" tar ((:url . "https://gitlab.com/marcowahl/rope-read-mode") (:commit . "7cd80d6c8e4a7e24a5147c06f083d745aef91b55") (:revdesc . "7cd80d6c8e4a") (:keywords "reading" "convenience" "chill") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainers ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com"))]) + (ropgadget . [(20230107 1225) ((emacs (24 4)) (transient (0 3 6))) "Display and filter ROP gadgets of a binary" tar ((:url . "https://github.com/Dragoncraft89/ropgadget-el") (:commit . "10e9d6f66de1ee805d871c59f4acc078b66747a3") (:revdesc . "10e9d6f66de1") (:keywords "tools" "ctf" "pwn" "rop"))]) + (ros . [(20250224 943) ((emacs (27 1)) (s (0)) (with-shell-interpreter (0)) (kv (0)) (cl-lib (0)) (transient (0)) (hydra (0)) (grep (0)) (string-inflection (0))) "Package to write code for ROS systems" tar ((:url . "https://github.com/DerBeutlin/ros.el") (:commit . "2108aed4d075652c342e537fab120392f4703d74") (:revdesc . "2108aed4d075") (:keywords "convenience" "tools") (:authors ("Max Beutelspacher" . "https://github.com/mtb")) (:maintainers ("Max Beutelspacher" . "max@beutelspacher.eu")) (:maintainer "Max Beutelspacher" . "max@beutelspacher.eu"))]) + (roseline-theme . [(20250305 936) ((emacs (24 1))) "Roseline theme" tar ((:url . "https://github.com/madara123pain/unique-emacs-theme-pack") (:commit . "43afeb68b3ba0394f8cc925ebb90e9a6620b4b28") (:revdesc . "43afeb68b3ba") (:keywords "faces" "theme" "custom") (:authors ("Omer Arif" . "omerarifkhan.official123@gmail.com")) (:maintainers ("Omer Arif" . "omerarifkhan.official123@gmail.com")) (:maintainer "Omer Arif" . "omerarifkhan.official123@gmail.com"))]) + (rotate . [(20210126 637) nil "Rotate the layout of emacs" tar ((:url . "https://github.com/daichirata/emacs-rotate") (:commit . "4e9ac3ff800880bd9b705794ef0f7c99d72900a6") (:revdesc . "4e9ac3ff8008") (:keywords "window" "layout") (:authors ("daichi.hirata" . "hirata.daichiatgmail.com")) (:maintainers ("daichi.hirata" . "hirata.daichiatgmail.com")) (:maintainer "daichi.hirata" . "hirata.daichiatgmail.com"))]) + (roy-mode . [(20121208 1158) nil "Roy major mode" tar ((:url . "https://github.com/folone/roy-mode") (:commit . "e1a4fb5ec0f46e82f569865ca47042ba5934e425") (:revdesc . "e1a4fb5ec0f4") (:keywords "extensions"))]) + (royal-hemlock-theme . [(20251223 528) ((emacs (24))) "Soothing royal-blue light-theme" tar ((:url . "https://github.com/vs-123/royal-hemlock-theme") (:commit . "bfb297342003d3551b7753526516a906fb5b8e0e") (:revdesc . "bfb297342003") (:keywords "color" "theme" "faces"))]) + (rpm-spec-mode . [(20250329 139) ((emacs (27 1))) "RPM spec mode for Emacs/XEmacs" tar ((:url . "https://github.com/Thaodan/rpm-spec-mode/") (:commit . "8cd329b78c7bc6285b7b9f2c65a58a9e778a59ca") (:revdesc . "8cd329b78c7b") (:keywords "unix" "languages" "rpm") (:authors (nil . "stig@bjorlykke.org") ("Tore Olsen" . "toreo@tihlde.org") ("Steve Sanbeg" . "sanbeg@dset.com") ("Tim Powers" . "timp@redhat.com") ("Trond Eivind Glomsrød" . "teg@redhat.com") ("Chmouel Boudjnah" . "chmouel@mandrakesoft.com") ("Ville Skyttä" . "ville.skytta@iki.fi") ("Adam Spiers" . "elisp@adamspiers.org")) (:maintainers ("Björn Bidar" . "bjorn.bidar@thaodan.de")) (:maintainer "Björn Bidar" . "bjorn.bidar@thaodan.de"))]) + (rpn-calc . [(20210306 426) ((popup (0 4))) "Quick RPN calculator for hackers" tar ((:url . "https://github.com/zk-phi/rpn-calc") (:commit . "320123ede874a8fc6cde542baa0d106950318071") (:revdesc . "320123ede874"))]) + (rspec-mode . [(20230819 154) ((ruby-mode (1 0)) (cl-lib (0 4))) "Enhance ruby-mode for RSpec" tar ((:url . "http://github.com/pezra/rspec-mode") (:commit . "29df3d081c6a1cbdf840cd13d45ea1c100c5bbaa") (:revdesc . "29df3d081c6a") (:keywords "rspec" "ruby"))]) + (rsync-mode . [(20210911 0) ((emacs (27 1)) (spinner (1 7 1))) "Rsync projects to remote machines" tar ((:url . "https://github.com/r-zip/rsync-mode.el") (:commit . "2bc76aa8c2d82bb08ef70e23813a653d66bf3195") (:revdesc . "2bc76aa8c2d8") (:keywords "comm") (:authors ("Ryan Pilgrim" . "ryan.z.pilgrim@gmail.com")) (:maintainers ("Ryan Pilgrim" . "ryan.z.pilgrim@gmail.com")) (:maintainer "Ryan Pilgrim" . "ryan.z.pilgrim@gmail.com"))]) + (rtags . [(20250801 1701) ((emacs (24 3))) "A front-end for rtags" tar ((:url . "https://github.com/Andersbakken/rtags") (:commit . "a09caa2d56aa9523222243764e99477458447913") (:revdesc . "a09caa2d56aa") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainers ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com"))]) + (rtags-xref . [(20250801 1701) ((emacs (25 1)) (rtags (2 37))) "RTags backend for xref.el" tar ((:url . "https://github.com/Andersbakken/rtags") (:commit . "62d881dab01ecb9ee6d54b705124ca8dadba726f") (:revdesc . "62d881dab01e"))]) + (rtm . [(20180329 1508) ((cl-lib (1 0))) "An elisp implementation of the Remember The Milk API" tar ((:url . "https://github.com/pmiddend/emacs-rtm") (:commit . "3e3d09387cb84801343ecca8fb02e82f213e7bbe") (:revdesc . "3e3d09387cb8") (:keywords "remember" "the" "milk" "productivity" "todo") (:authors ("Friedrich Delgado Friedrichs" . "frie...@nomaden.org")) (:maintainers ("Friedrich Delgado Friedrichs" . "frie...@nomaden.org")) (:maintainer "Friedrich Delgado Friedrichs" . "frie...@nomaden.org"))]) + (rubik . [(20180222 2014) ((cl-lib (1 0)) (emacs (25 3))) "Rubik's Cube" tar ((:url . "https://github.com/Kurvivor19/rubik-mode") (:commit . "c8dab1726463dbc9042a0b00186e4a8df02eb868") (:revdesc . "c8dab1726463") (:keywords "games") (:authors ("Ivan 'Kurvivor' Truskov" . "trus19@gmail.com")) (:maintainers ("Ivan 'Kurvivor' Truskov" . "trus19@gmail.com")) (:maintainer "Ivan 'Kurvivor' Truskov" . "trus19@gmail.com"))]) + (rubocop . [(20210309 1241) ((emacs (24))) "An Emacs interface for RuboCop" tar ((:url . "https://github.com/rubocop/rubocop-emacs") (:commit . "f5fd18aa810c3d3269188cbbd731ddc09006f8f5") (:revdesc . "f5fd18aa810c") (:keywords "project" "convenience"))]) + (rubocopfmt . [(20230204 1110) ((cl-lib (0 5))) "Minor-mode to format Ruby code with RuboCop on save" tar ((:url . "https://github.com/jimeh/rubocopfmt.el") (:commit . "1c6f4f1da755c9e60eb475eb9530320726904341") (:revdesc . "1c6f4f1da755") (:keywords "convenience" "wp" "edit" "ruby" "rubocop"))]) + (ruby-compilation . [(20150709 640) ((inf-ruby (2 2 1))) "Run a ruby process in a compilation buffer" tar ((:url . "https://github.com/eschulte/rinari") (:commit . "be07b0f42aefa24c5d36c441d1f3f72e64fffaa4") (:revdesc . "be07b0f42aef") (:keywords "test" "convenience") (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (ruby-electric . [(20250110 1017) nil "Minor mode for electrically editing ruby code" tar ((:url . "https://github.com/ruby/elisp-ruby-electric") (:commit . "c53376da891713e0c49f01aad2ff64d4fbb0b812") (:revdesc . "c53376da8917") (:keywords "languages" "ruby") (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (ruby-end . [(20230205 115) nil "Automatic insertion of end blocks for Ruby" tar ((:url . "http://github.com/rejeep/ruby-end") (:commit . "1c87e214de6a75936b89ab50ee5fe522b87b009e") (:revdesc . "1c87e214de6a") (:keywords "speed" "convenience" "ruby") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru"))]) + (ruby-extra-highlight . [(20250103 1518) nil "Highlight Ruby parameters" tar ((:url . "https://github.com/Lindydancer/ruby-extra-highlight") (:commit . "d1f6d41e5c2fc4cc7a23f4e79fa3710fdc74ec61") (:revdesc . "d1f6d41e5c2f") (:keywords "languages" "faces"))]) + (ruby-factory . [(20160102 721) ((inflections (1 1))) "Minor mode for Ruby test object generation libraries" tar ((:url . "http://github.com/sshaw/ruby-factory-mode") (:commit . "2bb7ccc2fccb5257376a989aa395bc7b9eb1d55d") (:revdesc . "2bb7ccc2fccb") (:keywords "ruby" "rails" "convenience") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainers ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com"))]) + (ruby-hash-syntax . [(20210106 224) ((emacs (24 1))) "Toggle ruby hash syntax between => and 1.9+ styles" tar ((:url . "https://github.com/purcell/ruby-hash-syntax") (:commit . "d458fb5891e0da85271b1cba3ee0ee69ea66a374") (:revdesc . "d458fb5891e0") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (ruby-interpolation . [(20131112 1652) nil "Ruby string interpolation helpers" tar ((:url . "http://github.com/leoc/ruby-interpolation.el") (:commit . "1978e337601222cedf00e117bf4b5cac15d1f203") (:revdesc . "1978e3376012") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainers ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com"))]) + (ruby-json-to-hash . [(20211108 351) ((emacs (27 2)) (smartparens (1 11 0)) (string-inflection (1 0 16))) "Convert JSON to Hash and play with the keys" tar ((:url . "https://github.com/otavioschwanck/ruby-json-to-hash.el") (:commit . "8e94d8c5ac1732e1f4d09786968b46e14139520c") (:revdesc . "8e94d8c5ac17") (:keywords "tools" "languages") (: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"))]) + (ruby-refactor . [(20160214 1650) ((ruby-mode (1 2))) "A minor mode which presents various Ruby refactoring helpers" tar ((:url . "https://github.com/ajvargo/ruby-refactor") (:commit . "e6b7125878a08518bffec6942df0c606f748e9ee") (:revdesc . "e6b7125878a0") (:keywords "refactor" "ruby"))]) + (ruby-test-mode . [(20210205 1107) ((ruby-mode (1 0)) (pcre2el (1 8))) "Minor mode for Behaviour and Test Driven" tar ((:url . "https://github.com/ruby-test-mode/ruby-test-mode") (:commit . "d66db4aca6e6a246f65f7195ecfbc7581d35fb7a") (:revdesc . "d66db4aca6e6") (:keywords "ruby" "unit" "test" "rspec" "tools") (: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"))]) + (ruby-tools . [(20151209 1615) nil "Collection of handy functions for ruby-mode" tar ((:url . "http://github.com/rejeep/ruby-tools") (:commit . "6b97066b58a4f82eb2ecea6434a0a7e981aa4c18") (:revdesc . "6b97066b58a4") (:keywords "speed" "convenience" "ruby") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (ruff-format . [(20241230 1856) ((emacs (24)) (reformatter (0 3))) "Ruff format Python source" tar ((:url . "https://github.com/JoshHayes/emacs-ruff-format") (:commit . "063a5e703b070103f405a4cb090af47396cfb00b") (:revdesc . "063a5e703b07") (:authors ("Ville Skyttä" . "ville.skytta@iki.fi")) (:maintainers ("Ville Skyttä" . "ville.skytta@iki.fi")) (:maintainer "Ville Skyttä" . "ville.skytta@iki.fi"))]) + (rufo . [(20170718 1416) ((emacs (24 3))) "Use rufo to automatically format ruby files" tar ((:url . "https://github.com/danielma/rufo.el") (:commit . "85a6d80fb05fef396a8029b8f944c92a53faf8fe") (:revdesc . "85a6d80fb05f") (:authors ("Daniel Ma and contributors" . "danielhgma@gmail.com")) (:maintainers ("Daniel Ma and contributors" . "danielhgma@gmail.com")) (:maintainer "Daniel Ma and contributors" . "danielhgma@gmail.com"))]) + (ruled-switch-buffer . [(20211205 636) ((emacs (24 3))) "Rule based buffer switching" tar ((:url . "https://github.com/kzkn/ruled-switch-buffer") (:commit . "99b53f7679e3eb868e4b4585085bbed102e5fce7") (:revdesc . "99b53f7679e3") (:keywords "convenience") (:authors ("Kazuki Nishikawa" . "kzkn@hey.com")) (:maintainers ("Kazuki Nishikawa" . "kzkn@hey.com")) (:maintainer "Kazuki Nishikawa" . "kzkn@hey.com"))]) + (rum-mode . [(20180127 22) ((emacs (24))) "Major mode for Rum programming language" tar ((:url . "https://github.com/rumlang/rum-mode") (:commit . "161471e6476d232d479f9767535918920811d7bf") (:revdesc . "161471e6476d") (:keywords "rum" "languages" "lisp"))]) + (run-command . [(20230317 2004) ((emacs (27 1))) "Run an external command from a context-dependent list" tar ((:url . "https://github.com/bard/emacs-run-command") (:commit . "477c42acce9e36ec59d18deaa73992f94faf7b99") (:revdesc . "477c42acce9e") (:keywords "processes") (:authors ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainers ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainer "Massimiliano Mirra" . "hyperstruct@gmail.com"))]) + (run-command-recipes . [(20240708 1555) ((emacs (25 1)) (dash (2 18 0)) (f (0 20 0)) (run-command (1 0 0))) "Start pack of recipes to `run-command'" tar ((:url . "https://github.com/semenInRussia/emacs-run-command-recipes") (:commit . "5a249052933dfa5e8f768da6c73d926e167d6175") (:revdesc . "5a249052933d") (:keywords "extensions" "run-command") (:authors ("semenInRussia" . "hrams205@gmail.com")) (:maintainers ("semenInRussia" . "hrams205@gmail.com")) (:maintainer "semenInRussia" . "hrams205@gmail.com"))]) + (run-stuff . [(20251209 1448) ((emacs (29 1))) "Context based command execution" tar ((:url . "https://codeberg.org/ideasman42/emacs-run-stuff") (:commit . "0873d04a8b18785bb8b1c9e49ac1ee6cea660d73") (:revdesc . "0873d04a8b18") (:keywords "files" "lisp" "convenience" "hypermedia") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (runner . [(20160524 1048) nil "Improved \"open with\" suggestions for dired" tar ((:url . "https://github.com/thamer/runner") (:commit . "a211d57ddc600410d07a8b534920ba905b093d87") (:revdesc . "a211d57ddc60") (:keywords "shell command" "dired" "file extension" "open with") (:authors ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainers ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainer "Thamer Mahmoud" . "thamer.mahmoud@gmail.com"))]) + (runtests . [(20150807 831) nil "Run unit tests from Emacs" tar ((:url . "https://github.com/sunesimonsen/emacs-runtests") (:commit . "ed90249f24cc48290018df48b9b9b7172440be3e") (:revdesc . "ed90249f24cc") (:keywords "test") (:authors ("Sune Simonsen" . "sune@we-knowhow.dk")) (:maintainers ("Sune Simonsen" . "sune@we-knowhow.dk")) (:maintainer "Sune Simonsen" . "sune@we-knowhow.dk"))]) + (russian-calendar . [(20251201 1323) ((emacs (29 4))) "Russian holidays and conferences. Updated 2025-09-30" tar ((:url . "https://github.com/Anoncheg1/emacs-russian-calendar") (:commit . "4b250e6aeb37470a030ebddf92f9a65184f67f03") (:revdesc . "4b250e6aeb37") (:keywords "calendar" "holidays"))]) + (russian-holidays . [(20170109 2140) nil "Russian holidays for the calendar" tar ((:url . "https://github.com/grafov/russian-holidays") (:commit . "b285a30f29d85c48e3ea4eb93972d34a090c167b") (:revdesc . "b285a30f29d8") (:authors ("Alexander I.Grafov" . "siberian@laika.name")) (:maintainers ("Alexander I.Grafov" . "siberian@laika.name")) (:maintainer "Alexander I.Grafov" . "siberian@laika.name"))]) + (russian-techwriter . [(20251010 538) nil "Input methods for Russian technical writers" tar ((:url . "https://github.com/dunmaksim/emacs-russian-techwriter-input-method") (:commit . "a568c8a3f409f7f9b5cb12143f277af78fef9a26") (:revdesc . "a568c8a3f409") (:keywords "multilingual" "input method" "cyrillic" "i18n") (:authors ("Maxim Dunaevskii" . "dunmaksim@yandex.ru")))]) + (rust-auto-use . [(20200608 1359) nil "Utility to automatically insert Rust use statements" tar ((:url . "https://github.com/vmalloc/rust-auto-use.el") (:commit . "d5205f7b9b9eae0f7d0893f87d3391464719f9c0") (:revdesc . "d5205f7b9b9e") (:keywords "languages") (:authors ("Rotem Yaari" . "rotemy@MBP.local")) (:maintainers ("Rotem Yaari" . "rotemy@MBP.local")) (:maintainer "Rotem Yaari" . "rotemy@MBP.local"))]) + (rust-mode . [(20250705 1444) ((emacs (25 1))) "A major-mode for editing Rust source code" tar ((:url . "https://github.com/rust-lang/rust-mode") (:commit . "f7334861bfc1d3dbcfbde464751837be2ec09ef3") (:revdesc . "f7334861bfc1") (:keywords "languages") (:authors ("Mozilla" . "rust-mode@noreply.github.com")) (:maintainers ("Mozilla" . "rust-mode@noreply.github.com")) (:maintainer "Mozilla" . "rust-mode@noreply.github.com"))]) + (rust-playground . [(20200116 1043) ((emacs (24 3))) "Local Rust playground for short code snippets" tar ((:url . "https://github.com/grafov/rust-playground") (:commit . "5a117781dcb66065bea7830dd73618008fc34949") (:revdesc . "5a117781dcb6") (:keywords "tools" "rust") (:authors ("Alexander I.Grafov + all the contributors" . "grafov@gmail.com")) (:maintainers ("Alexander I.Grafov + all the contributors" . "grafov@gmail.com")) (:maintainer "Alexander I.Grafov + all the contributors" . "grafov@gmail.com"))]) + (rustic . [(20250630 1332) ((emacs (28 2)) (rust-mode (1 0 6)) (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)) (spinner (1 7 3)) (xterm-color (1 6))) "Rust development environment" tar ((:url . "https://github.com/emacs-rustic/rustic") (:commit . "bfff139f260c386f60d581edef6df1a0d109a131") (:revdesc . "bfff139f260c") (:keywords "languages"))]) + (rutils . [(20241027 1606) ((emacs (26 1)) (ess (18 10 1)) (transient (0 3 0))) "R utilities with transient" tar ((:url . "https://github.com/ShuguangSun/rutils.el") (:commit . "e39ca3c953ef395f28176f740ebf500d62edb429") (:revdesc . "e39ca3c953ef") (:keywords "convenience") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (rvm . [(20220910 1558) nil "Emacs integration for rvm" tar ((:url . "http://www.emacswiki.org/emacs/RvmEl") (:commit . "e1e83b5466c132c066142ac63729ba833c530c83") (:revdesc . "e1e83b5466c1") (:keywords "ruby" "rvm") (:authors ("Yves Senn" . "yves.senn@gmx.ch")) (:maintainers ("Yves Senn" . "yves.senn@gmx.ch")) (:maintainer "Yves Senn" . "yves.senn@gmx.ch"))]) + (ryo-modal . [(20240820 707) ((emacs (25 1))) "Roll your own modal mode" tar ((:url . "http://github.com/Kungsgeten/ryo-modal") (:commit . "83da38b2a816fda683d500eb4d3b10cff68c46e8") (:revdesc . "83da38b2a816") (:keywords "convenience" "modal" "keys") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainers ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com"))]) + (s . [(20220902 1511) nil "The long lost Emacs string manipulation library" tar ((:url . "https://github.com/magnars/s.el") (:commit . "b4b8c03fcef316a27f75633fe4bb990aeff6e705") (:revdesc . "b4b8c03fcef3") (:keywords "strings") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (s-buffer . [(20130605 2124) ((s (1 6 0)) (noflet (0 0 3))) "S operations for buffers" tar ((:url . "http://github.com/nicferrier/emacs-s-buffer") (:commit . "f95d234282377f00a2c3a9846681080cb95bb1df") (:revdesc . "f95d23428237") (:keywords "lisp") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (s12cpuv2-mode . [(20171013 2051) ((emacs (24 3))) "Major-mode for S12CPUV2 assembly" tar ((:url . "https://github.com/AdamNiederer/s12cpuv2-mode") (:commit . "b17d4cf848dec1e20e66458e5c7ff77a2c051a8c") (:revdesc . "b17d4cf848de") (:keywords "s12cpuv2" "assembly" "languages") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com"))]) + (sackspace . [(20130719 956) nil "A better backspace" tar ((:url . "http://github.com/cofi/sackspace.el") (:commit . "fd0480eaaf6d3d11fd30ac5feb2da2f4f7572708") (:revdesc . "fd0480eaaf6d") (:keywords "delete" "convenience") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainers ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com"))]) + (sage-shell-mode . [(20240504 726) ((cl-lib (0 6 1)) (emacs (24 4)) (let-alist (1 0 5)) (deferred (0 5 1))) "A front-end for Sage Math" tar ((:url . "https://github.com/sagemath/sage-shell-mode") (:commit . "4291700e981a2105d55fa56382ba25046d3d268d") (:revdesc . "4291700e981a") (:keywords "sage" "math") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainers ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com"))]) + (sailfish-scratchbox . [(20171202 1332) nil "Sailfish OS scratchbox inside the emacs" tar ((:url . "https://github.com/vityafx/sailfish-scratchbox.el") (:commit . "bb5ed0f0b0cd72f2eb1af065b7587ec81866b089") (:revdesc . "bb5ed0f0b0cd") (:keywords "sb2" "mb2" "building" "scratchbox" "sailfish") (:authors ("V. V. Polevoy" . "fx@thefx.co")) (:maintainers ("V. V. Polevoy" . "fx@thefx.co")) (:maintainer "V. V. Polevoy" . "fx@thefx.co"))]) + (sakura-theme . [(20240921 1028) ((autothemer (0 2)) (emacs (24))) "Filled with cherry blossoms" tar ((:url . "http://github.com/emacsfodder/emacs-theme-sakura") (:commit . "22d36d0a9b05e4e24ec701c585145b032e42bc7a") (:revdesc . "22d36d0a9b05"))]) + (salesforce-utils . [(20160814 154) ((cl-lib (0 5))) "Simple utilities for Salesforce" tar ((:url . "https://github.com/grimnebulin/emacs-salesforce") (:commit . "73328baf0fb94ac0d0de645a8f6d42e5ae27f773") (:revdesc . "73328baf0fb9"))]) + (salt-mode . [(20200210 1200) ((emacs (24 4)) (yaml-mode (0 0 12)) (mmm-mode (0 5 4)) (mmm-jinja2 (0 1))) "Major mode for Salt States" tar ((:url . "https://github.com/glynnforrest/salt-mode") (:commit . "e76e78d93e4770d42bdde9367a11d0e0836a21c9") (:revdesc . "e76e78d93e47") (:keywords "languages") (:authors ("Ben Hayden" . "hayden767@gmail.com")) (:maintainers ("Glynn Forrest" . "me@glynnforrest.com")) (:maintainer "Glynn Forrest" . "me@glynnforrest.com"))]) + (samskritam . [(20250829 2315) ((emacs (28 1))) "Show samskrit word definitions" tar ((:url . "https://github.com/thapakrish/samskritam") (:commit . "e84358904b93c5c03d00b62f1e6735393d2b3d53") (:revdesc . "e84358904b93") (:keywords "samskrit" "sanskrit" "संस्कृत" "dictionary" "devanagari" "convenience" "language") (:authors ("Krishna Thapa" . "thapakrish@gmail.com")) (:maintainers ("Krishna Thapa" . "thapakrish@gmail.com")) (:maintainer "Krishna Thapa" . "thapakrish@gmail.com"))]) + (sas-py . [(20230131 523) ((emacs (28 1)) (ess (18 10 1))) "SAS with SASPy" tar ((:url . "https://github.com/ShuguangSun/sas-py") (:commit . "76a2226eb49ec37f211904c6395ee066bd440560") (:revdesc . "76a2226eb49e") (:keywords "tools") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (sass-mode . [(20190502 53) ((haml-mode (3 0 15)) (cl-lib (0 5))) "Major mode for editing Sass files" tar ((:url . "http://github.com/nex3/haml/tree/master") (:commit . "247a0d4b509f10b28e4687cd8763492bca03599b") (:revdesc . "247a0d4b509f") (:keywords "markup" "language" "css"))]) + (satysfi-ts-mode . [(20240319 321) ((emacs (29 1))) "A tree-sitter based major-mode for SATySFi" tar ((:url . "https://github.com/Kyure-A/satysfi-ts-mode") (:commit . "b40d55ebd6ffeadadb85aabaf2e636110c85370c") (:revdesc . "b40d55ebd6ff") (:keywords "languages") (:authors ("Kyure_A" . "twitter.com/kyureq")) (:maintainers ("Kyure_A" . "twitter.com/kyureq")) (:maintainer "Kyure_A" . "twitter.com/kyureq"))]) + (sauron . [(20201015 836) nil "Track (erc/org/dbus/...) events and react to them" tar ((:url . "https://github.com/djcb/sauron") (:commit . "5daade4836da5b1b2ab26d84128d6c38328a5d52") (:revdesc . "5daade4836da") (:keywords "comm" "frames") (:authors ("Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl")) (:maintainers ("Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl")) (:maintainer "Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl"))]) + (save-load-path . [(20140206 1214) nil "Save load-path and reuse it to test" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/save-load-path.el") (:commit . "6cb763a37e2b8af505bff2bcd11fd49c9ea04d66") (:revdesc . "6cb763a37e2b") (:keywords "lisp") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (save-visited-files . [(20200212 414) nil "Save opened files across sessions" tar ((:url . "http://github.com/nflath/save-visited-files") (:commit . "8203a05a322324ec17b14437c8dfb38efdb53241") (:revdesc . "8203a05a3223") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainers ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com"))]) + (savefold . [(20251002 924) ((emacs (28 1)) (compat (29 1))) "Persistence for various folding systems" tar ((:url . "https://github.com/jcfk/savefold.el") (:commit . "068f67dcfca6653187fe4c208d66a08b1f5e642a") (:revdesc . "068f67dcfca6") (:keywords "convenience") (:authors ("Jacob Fong" . "jacobcfong@gmail.com")) (:maintainers ("Jacob Fong" . "jacobcfong@gmail.com")) (:maintainer "Jacob Fong" . "jacobcfong@gmail.com"))]) + (savekill . [(20140418 229) nil "Save kill ring to disk" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/savekill.el") (:commit . "67fc94e3d8fe8ce3ca16f90518f6a46479b63e34") (:revdesc . "67fc94e3d8fe") (:keywords "tools") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (saveplace-pdf-view . [(20250625 1437) ((emacs (29 1))) "Save place in pdf-view buffers" tar ((:url . "https://github.com/nicolaisingh/saveplace-pdf-view") (:commit . "dc1e0b28a5ed8319a0b6725abaffba7c2fa8c730") (:revdesc . "dc1e0b28a5ed") (:keywords "files" "convenience") (:authors ("Nicolai Singh" . "nicolaisinghatpm.me")) (:maintainers ("Nicolai Singh" . "nicolaisinghatpm.me")) (:maintainer "Nicolai Singh" . "nicolaisinghatpm.me"))]) + (say-what-im-doing . [(20160706 1931) nil "Dictate what you're doing with text to speech" tar ((:url . "http://github.com/benaiah/say-what-im-doing") (:commit . "5b2ce6783b02805bcac1107a149bfba3852cd9d5") (:revdesc . "5b2ce6783b02") (:keywords "text to speech" "dumb" "funny"))]) + (sayid . [(20220101 1357) ((cider (0 21 0))) "Sayid nREPL middleware client" tar ((:url . "https://github.com/clojure-emacs/sayid") (:commit . "879aff586336a0ec4d46c0ed4720fb1de22082bd") (:revdesc . "879aff586336") (:keywords "clojure" "cider" "debugger") (:authors ("Bill Piel" . "bill@billpiel.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (sbt-mode . [(20240404 1105) ((emacs (24 4))) "Interactive support for sbt projects" tar ((:url . "https://github.com/hvesalai/emacs-sbt-mode") (:commit . "cc68728a6ef0600aad369157b3a2d0ce56afba9b") (:revdesc . "cc68728a6ef0") (:keywords "languages"))]) + (scad-mode . [(20251007 1702) ((emacs (28 1)) (compat (30))) "A major mode for editing OpenSCAD code" tar ((:url . "https://github.com/openscad/emacs-scad-mode") (:commit . "b130730a3123387e69c85cf10633701ea447fa2a") (:revdesc . "b130730a3123") (:keywords "languages") (:maintainers ("Len Trigg" . "lenbok@gmail.com") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Len Trigg" . "lenbok@gmail.com"))]) + (scala-mode . [(20241231 839) ((emacs (25 1))) "Major mode for editing Scala" tar ((:url . "https://github.com/hvesalai/emacs-scala-mode") (:commit . "661337d8aa0a0cb418184c83757661603de3b2e3") (:revdesc . "661337d8aa0a") (:keywords "languages"))]) + (scala-repl . [(20240427 1456) ((emacs (29 1))) "Scala REPL Mode" tar ((:url . "https://github.com/sheepduke/scala-repl.el") (:commit . "679bdf663e0b32a5a285d6f98daa2e3d5de60289") (:revdesc . "679bdf663e0b") (:keywords "languages" "tools") (:authors ("Daian YUE" . "sheepduke@gmail.com")) (:maintainers ("Daian YUE" . "sheepduke@gmail.com")) (:maintainer "Daian YUE" . "sheepduke@gmail.com"))]) + (scala-ts-mode . [(20250418 813) ((emacs (29 1))) "An tree-sitter based major-mode for Scala" tar ((:url . "https://github.com/KaranAhlawat/scala-ts-mode") (:commit . "c7671e10419261ef70b1820d3b970ad39f6fcfe2") (:revdesc . "c7671e104192") (:keywords "emacs" "scala" "languages" "tree-sitter" "scala-ts-mode") (:authors ("Karan Ahlawat" . "ahlawatkaran12@gmail.com")) (:maintainers ("Karan Ahlawat" . "ahlawatkaran12@gmail.com")) (:maintainer "Karan Ahlawat" . "ahlawatkaran12@gmail.com"))]) + (scallop-mode . [(20250522 1432) ((emacs (24 3))) "Major mode for editing Scallop programming language" tar ((:url . "https://github.com/taquangtrung/emacs-scallop-mode") (:commit . "ba416989c3ec64369fe2fe1dafc521ca6821b23d") (:revdesc . "ba416989c3ec") (:keywords "languages"))]) + (scf-mode . [(20151122 248) nil "Shorten file-names in compilation type buffers" tar ((:url . "https://github.com/lewang/scf-mode") (:commit . "dbfcdcd89034f208d65e181af58e0d73ad09f8b2") (:revdesc . "dbfcdcd89034") (:keywords "compilation"))]) + (scheme-complete . [(20241205 111) nil "Smart auto completion for Scheme in Emacs" tar ((:url . "https://github.com/ashinn/scheme-complete") (:commit . "569277c0caa3edf8b28086b0efca6db4186184a8") (:revdesc . "569277c0caa3"))]) + (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 ((:url . "https://github.com/teeann/scholar-import") (:commit . "2456367578caa7fd768e30238ce080687faa0a25") (:revdesc . "2456367578ca") (:authors ("Anh T Nguyen" . "https://github.com/teeann")) (:maintainers ("Anh T Nguyen" . "https://github.com/teeann")) (:maintainer "Anh T Nguyen" . "https://github.com/teeann"))]) + (schrute . [(20170521 1840) ((emacs (24 3))) "Help you remember there is a better way to do something" tar ((:url . "https://bitbucket.org/shackra/dwight-k.-schrute") (:commit . "59faa6c4232ae183cea93237301acad8c0763997") (:revdesc . "59faa6c4232a") (:keywords "convenience") (:authors ("Jorge Araya Navarro" . "elcorreo@deshackra.com")) (:maintainers ("Jorge Araya Navarro" . "elcorreo@deshackra.com")) (:maintainer "Jorge Araya Navarro" . "elcorreo@deshackra.com"))]) + (scihub . [(20250104 420) ((emacs (27 1))) "Sci-Hub integration" tar ((:url . "https://github.com/emacs-pe/scihub.el") (:commit . "899d9144f7f88925a48257dfee28988628df084d") (:revdesc . "899d9144f7f8") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (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 ((:url . "https://github.com/chrisbarrett/sclang-extensions") (:commit . "e9cc79732f16fdb582129303110c163dcc0d6da0") (:revdesc . "e9cc79732f16") (:keywords "sclang" "supercollider" "languages" "tools") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainers ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))]) + (sclang-snippets . [(20130513 751) ((yasnippet (0 8 0))) "Snippets for the SuperCollider Emacs mode" tar ((:url . "https://github.com/ptrv/sclang-snippets") (:commit . "c840a416b96f83bdd70491e3d1fbe2f1ae8b3f58") (:revdesc . "c840a416b96f") (:keywords "snippets") (:authors ("ptrv" . "mail@petervasil.net")) (:maintainers ("ptrv" . "mail@petervasil.net")) (:maintainer "ptrv" . "mail@petervasil.net"))]) + (scopeline . [(20250120 331) ((emacs (29 1))) "Show scope info of blocks in buffer at end of scope" tar ((:url . "https://github.com/meain/scopeline.el") (:commit . "5f2cd5aad329190ee3dc56d8003fc957dd65f211") (:revdesc . "5f2cd5aad329") (:keywords "scope" "context" "tree-sitter" "convenience"))]) + (scpaste . [(20250706 1759) ((htmlize (1 39))) "Paste to the web via scp" tar ((:url . "https://git.sr.ht/~technomancy/scpaste") (:commit . "5203d3625c34e51433435dc466853aa36f4ebe21") (:revdesc . "5203d3625c34") (:keywords "convenience" "hypermedia"))]) + (scratch . [(20220319 1705) ((emacs (25 1))) "Mode-specific scratch buffers" tar ((:url . "https://github.com/ieure/scratch-el") (:commit . "f000648c9663833a76a8de9b1e78c99a9d698e48") (:revdesc . "f000648c9663") (:keywords "convenience" "tools" "files") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainers ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com"))]) + (scratch-comment . [(20200812 1025) ((emacs (26 1))) "Insert Elisp result as comment in scratch buffer" tar ((:url . "https://github.com/conao3/scratch-comment.el") (:commit . "cf3e967b4def1308b6ef1cfeedd2cf15ee6e226c") (:revdesc . "cf3e967b4def") (:keywords "convenience") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (scratch-ext . [(20220617 132) ((emacs (24 1))) "Extensions for *scratch*" tar ((:url . "https://github.com/kyanagi/scratch-ext-el") (:commit . "8bbe1649503bb2e3676643e6e49fde155c1d6c70") (:revdesc . "8bbe1649503b") (:authors ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainers ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainer "Kouhei Yanagita" . "yanagi@shakenbu.org"))]) + (scratch-log . [(20141115 743) nil "Utility for *scratch* buffer" tar ((:url . "https://github.com/mori-dev/scratch-log") (:commit . "1168f7f16d36ca0f4ddf2bb98881f8db62cc5dc0") (:revdesc . "1168f7f16d36") (:authors ("kmori" . "morihenotegami@gmail.com")) (:maintainers ("kmori" . "morihenotegami@gmail.com")) (:maintainer "kmori" . "morihenotegami@gmail.com"))]) + (scratch-message . [(20220209 2207) nil "Changing message in your scratch buffer" tar ((:url . "https://github.com/thisirs/scratch-message.git") (:commit . "0d4198f6effd8f118bf03ee4979f566041ef6a9b") (:revdesc . "0d4198f6effd") (:keywords "util" "scratch") (:authors ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainers ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainer "Sylvain Rousseau" . "thisirsatgmaildotcom"))]) + (scratch-palette . [(20250104 1359) nil "Make scratch buffer for each files" tar ((:url . "http://zk-phi.github.io/") (:commit . "e4389fbb97f2890c4caebba0588cbc5d5f1ecbc6") (:revdesc . "e4389fbb97f2"))]) + (scratch-plus . [(20250728 109) ((emacs (29 1))) "Better Scratch Buffer Behavior" tar ((:url . "https://git.sr.ht/~swflint/scratch-plus") (:commit . "b794901f968000f6e338808307385b683b79ec8b") (:revdesc . "b794901f9680") (:keywords "convenience") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (scratch-pop . [(20200910 226) nil "Generate, popup (& optionally backup) scratch buffer(s)" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "545badcd840dd50b39dd7dfa37459c6f71d02ea6") (:revdesc . "545badcd840d"))]) + (scratches . [(20151006 416) ((dash (2 11 0)) (f (0 17 0))) "Multiple scratches in any language" tar ((:url . "https://github.com/victorteokw/scratches") (:commit . "9441afe6396ca38f08029123fab5d87429cbf315") (:revdesc . "9441afe6396c") (:keywords "scratch") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com"))]) + (scribble-mode . [(20190912 200) ((emacs (24))) "Major mode for editing Scribble documents" tar ((:url . "https://github.com/emacs-pe/scribble-mode") (:commit . "5c3ea3cc9bbad585476eee41ea76dc056c2012bb") (:revdesc . "5c3ea3cc9bba") (:keywords "convenience") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainers ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com"))]) + (scroll-on-drag . [(20251215 1143) ((emacs (29 1))) "Interactive scrolling" tar ((:url . "https://codeberg.org/ideasman42/emacs-scroll-on-drag") (:commit . "86f335ff594aed225423d581bbe5690534c1dd12") (:revdesc . "86f335ff594a") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (scroll-on-jump . [(20251213 1140) ((emacs (26 2))) "Scroll when jumping to a new point" tar ((:url . "https://codeberg.org/ideasman42/emacs-scroll-on-jump") (:commit . "4dd1cd66f36072e2a124afc5d32286f2db39a4a3") (:revdesc . "4dd1cd66f360") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (scrollable-quick-peek . [(20201224 329) ((quick-peek (1 0)) (emacs (24 4))) "Display scrollable overlays" tar ((:url . "https://github.com/jpablobr/scrollable-quick-peek") (:commit . "3e3492145a61831661d6e97fdcb47b5b66c73287") (:revdesc . "3e3492145a61") (:keywords "convenience" "extensions" "help" "tools") (:authors ("Pablo Barrantes" . "xjpablobrx@gmail.com")) (:maintainers ("Pablo Barrantes" . "xjpablobrx@gmail.com")) (:maintainer "Pablo Barrantes" . "xjpablobrx@gmail.com"))]) + (scrollkeeper . [(20190109 629) ((emacs (25 1))) "Custom scrolling commands with visual guidelines" tar ((:url . "https://github.com/alphapapa/scrollkeeper.el") (:commit . "3c4ac6b6b44686d31c260ee0b19daaee59bdccd6") (:revdesc . "3c4ac6b6b446") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (scrooge . [(20180630 1022) ((emacs (24)) (cl-lib (0 5)) (dash (2 13 0)) (thrift (0 9 3))) "Major mode for Twitter Scrooge files" tar ((:url . "https://github.com/cosmicexplorer/emacs-scrooge") (:commit . "0a8c58e9e6708abe4ef7e415bc1e0472318bb1b0") (:revdesc . "0a8c58e9e670") (:keywords "scrooge" "thrift") (:authors ("Daniel McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainers ("Daniel McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Daniel McClanahan" . "danieldmcclanahan@gmail.com"))]) + (scss-mode . [(20180123 1708) nil "Major mode for editing SCSS files" tar ((:url . "https://github.com/antonj/scss-mode") (:commit . "cf58dbec5394280503eb5502938f3b5445d1b53d") (:revdesc . "cf58dbec5394") (:keywords "scss" "css" "mode") (:authors ("Anton Johansson - http://antonj.se" . "anton.johansson@gmail.com")) (:maintainers ("Anton Johansson - http://antonj.se" . "anton.johansson@gmail.com")) (:maintainer "Anton Johansson - http://antonj.se" . "anton.johansson@gmail.com"))]) + (sculpture-themes . [(20251223 1057) ((emacs (26 1))) "Themes with vivid colors" tar ((:url . "https://github.com/precompute/sculpture-theme") (:commit . "74f4eea4a038605bc3976861f435d0202cab7c14") (:revdesc . "74f4eea4a038") (:authors ("Precompute" . "git@precompute.net")) (:maintainers ("Precompute" . "git@precompute.net")) (:maintainer "Precompute" . "git@precompute.net"))]) + (sdcv . [(20241227 319) ((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 ((:url . "https://repo.or.cz/sdcv.el.git") (:commit . "941ac2fbbb1be9ad595aed6dd782a842c4676a1a") (:revdesc . "941ac2fbbb1b") (:keywords "startdict" "sdcv") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainers ("Andy Stewart" . "lazycat.manatee@gmail.com") (nil . "stardiviner(numbchild@gmail.com")) (:maintainer "Andy Stewart" . "lazycat.manatee@gmail.com"))]) + (sdlang-mode . [(20161201 711) ((emacs (24 3))) "Major mode for Simple Declarative Language files" tar ((:url . "https://github.com/CyberShadow/sdlang-mode") (:commit . "d42a6eedefeb44919fbacf58d302b6df18f05bbc") (:revdesc . "d42a6eedefeb") (:keywords "languages"))]) + (sdml-mode . [(20251030 1814) ((emacs (28 1)) (tree-sitter (0 18 0)) (tree-sitter-indent (0 4))) "Major mode for SDML" tar ((:url . "https://github.com/sdm-lang/emacs-sdml-mode") (:commit . "3b2430df46a026e70a69da019afa8f40a8ed9225") (:revdesc . "3b2430df46a0") (:keywords "languages" "tools") (:authors ("Simon Johnston" . "johnstonskj@gmail.com")) (:maintainers ("Simon Johnston" . "johnstonskj@gmail.com")) (:maintainer "Simon Johnston" . "johnstonskj@gmail.com"))]) + (search-web . [(20150312 1103) nil "Post web search queries using `browse-url'" tar ((:url . "https://github.com/tomoya/search-web.el") (:commit . "c4ae86ac1acfc572b81f3d78764bd9a54034c331") (:revdesc . "c4ae86ac1acf") (:authors ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainers ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainer "Tomoya Otake" . "tomoya.ton@gmail.com"))]) + (searcher . [(20250101 1011) ((emacs (25 1)) (dash (2 10)) (f (0 20 0))) "Searcher in pure elisp" tar ((:url . "https://github.com/jcs-elpa/searcher") (:commit . "12008a7a9e03980e86cfa6d9589665c70ec0ad4d") (:revdesc . "12008a7a9e03") (:keywords "convenience" "search" "searcher" "string") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (searchq . [(20150829 1211) ((emacs (24 3))) "Framework of queued search tasks using GREP, ACK, AG and more" tar ((:url . "https://github.com/tcw165/searchq") (:commit . "dd510d55ad66a82c6ef022cfe7c4a73ad5365f82") (:revdesc . "dd510d55ad66"))]) + (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 ((:url . "https://gitlab.com/shackra/secretaria") (:commit . "03986130a2ada1fa952d45e83536729f20230fcf") (:revdesc . "03986130a2ad") (:keywords "org" "convenience") (:authors ("Jorge Araya Navarro" . "jorge@esavara.cr")) (:maintainers ("Jorge Araya Navarro" . "jorge@esavara.cr")) (:maintainer "Jorge Araya Navarro" . "jorge@esavara.cr"))]) + (see-mode . [(20180511 41) ((emacs (24 4)) (language-detection (0 1 0))) "Edit string in a separate buffer" tar ((:url . "https://github.com/marcelino-m/see-mode") (:commit . "db9e4324f9dcc14d5125cb6a79d6c9fad5b14626") (:revdesc . "db9e4324f9dc") (:keywords "convenience") (: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"))]) + (seeing-is-believing . [(20170214 1320) nil "Minor mode for running the seeing-is-believing ruby gem" tar ((:url . "https://github.com/jcinnamond/seeing-is-believing") (:commit . "fbbe246c0fda87bb26227bb826eebadb418a220f") (:revdesc . "fbbe246c0fda"))]) + (seethru . [(20150218 1829) ((shadchen (1 4))) "Easily change Emacs' transparency" tar ((:url . "http://github.com/benaiah/seethru") (:commit . "d87e231f99313bea75b1e69e48c0f32968c82060") (:revdesc . "d87e231f9931") (:keywords "lisp" "tools" "alpha" "transparency") (:authors ("Benaiah Mischenko" . "benaiah@mischenko.com")) (:maintainers ("Benaiah Mischenko" . "benaiah@mischenko.com")) (:maintainer "Benaiah Mischenko" . "benaiah@mischenko.com"))]) + (sekka . [(20170803 1247) ((cl-lib (0 3)) (concurrent (0 3 1)) (popup (0 5 2))) "A client for Sekka IME server" tar ((:url . "https://github.com/kiyoka/sekka") (:commit . "d1fd5d47aacba723631d5d374169a45ff2051c41") (:revdesc . "d1fd5d47aacb") (:keywords "ime" "skk" "japanese") (:authors ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainers ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainer "Kiyoka Nishiyama" . "kiyoka@sumibi.org"))]) + (selcand . [(20240430 1408) ((emacs (25 1))) "Select a candidate from a tree of hint characters" tar ((:url . "https://github.com/erjoalgo/selcand") (:commit . "6baa1771eacbcfe7ec854362bed17baea865424e") (:revdesc . "6baa1771eacb") (:keywords "lisp" "completing-read" "prompt" "combinations" "vimium") (:maintainers ("concat \"erjoalgo\" \"@\" \"gmail\" \".com\"" . "")) (:maintainer "concat \"erjoalgo\" \"@\" \"gmail\" \".com\"" . ""))]) + (select-themes . [(20160221 106) nil "Color theme selection with completing-read" tar ((:url . "https://github.com/jasonm23/emacs-select-themes") (:commit . "236f54287519a3ea6dd7b3992d053e4f4ff5d0fe") (:revdesc . "236f54287519") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (selected . [(20230219 1328) nil "Keymap for when region is active" tar ((:url . "http://github.com/Kungsgeten/selected.el") (:commit . "1ca6e12f456caa1dc97c3d68597598662eb5de9a") (:revdesc . "1ca6e12f456c") (:keywords "convenience"))]) + (selected-window-accent-mode . [(20251205 1215) ((emacs (28 1))) "Accent Selected Window" tar ((:url . "https://github.com/captainflasmr/selected-window-accent-mode") (:commit . "cfdcf242e2967c131ac01da6565d70a367e10320") (:revdesc . "cfdcf242e296") (:keywords "convenience") (:authors ("James Dyer" . "captainflasmr@gmail.com")) (:maintainers ("James Dyer" . "captainflasmr@gmail.com")) (:maintainer "James Dyer" . "captainflasmr@gmail.com"))]) + (selected-window-contrast . [(20250108 1338) ((emacs (29 4))) "Highlight by brightness of text and background" tar ((:url . "https://codeberg.org/Anoncheg/selected-window-contrast") (:commit . "a913fda9fcb2e73cfa213444ca811c388b5fcc6c") (:revdesc . "a913fda9fcb2") (:keywords "color" "contrast" "selected" "windows" "faces" "buffer"))]) + (selectric-mode . [(20200209 2107) nil "IBM Selectric mode for Emacs" tar ((:url . "https://github.com/rbanffy/selectric-mode") (:commit . "bb9e66678f34e9bc23624ff6292cf5e7857e8e5f") (:revdesc . "bb9e66678f34") (:keywords "multimedia" "convenience" "typewriter" "selectric") (:authors ("Ricardo Bánffy" . "rbanffy@gmail.com")) (:maintainers ("Ricardo Banffy" . "rbanffy@gmail.com")) (:maintainer "Ricardo Banffy" . "rbanffy@gmail.com"))]) + (selectrum . [(20220513 2106) ((emacs (26 1))) "Easily select item from list" tar ((:url . "https://github.com/radian-software/selectrum") (:commit . "810ea697bdd559d97b86b795e01769cddfa3daf2") (:revdesc . "810ea697bdd5") (:keywords "extensions") (:authors ("Radian LLC" . "contact+selectrum@radian.codes")) (:maintainers ("Radian LLC" . "contact+selectrum@radian.codes")) (:maintainer "Radian LLC" . "contact+selectrum@radian.codes"))]) + (selectrum-prescient . [(20250816 19) ((emacs (25 1)) (prescient (6 1 0)) (selectrum (3 1))) "Prescient.el + Selectrum" tar ((:url . "https://github.com/raxod502/prescient.el") (:commit . "87e2d2f2ddf24f591a5f70cc90d2afb4537caa18") (:revdesc . "87e2d2f2ddf2") (:keywords "extensions") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes"))]) + (semantic-thrift . [(20251221 1454) ((thrift (0 0 1)) (emacs (28 2))) "Thrift LALR parser" tar ((:url . "https://github.com/jerryxgh/semantic-thrift") (:commit . "102f1bfa25347bf41a393e28102e94b58e7d50f6") (:revdesc . "102f1bfa2534") (:keywords "extensions" "thrift" "semantic") (:authors (nil . "GuanghuiXugh_xu@qq.com")) (:maintainers (nil . "GuanghuiXugh_xu@qq.com")) (:maintainer nil . "GuanghuiXugh_xu@qq.com"))]) + (semaphore . [(20190607 1949) ((emacs (26))) "Semaphore based on condition variables" tar ((:url . "http://github.com/webnf/semaphore.el") (:commit . "ec4c485c8e4cff63805ecc25523a031a6c2ad7cd") (:revdesc . "ec4c485c8e4c") (:keywords "processes" "unix") (:authors ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainers ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainer "Herwig Hochleitner" . "herwig@bendlas.net"))]) + (semaphore-promise . [(20190607 2115) ((emacs (26)) (semaphore (1)) (promise (1))) "Semaphore integration with promise" tar ((:url . "http://github.com/webnf/semaphore.el") (:commit . "9cdfef91cc0293371af549ad41027aa5b73f30a4") (:revdesc . "9cdfef91cc02") (:keywords "processes" "unix") (:authors ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainers ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainer "Herwig Hochleitner" . "herwig@bendlas.net"))]) + (semi . [(20251207 1834) ((emacs (24 5)) (apel (0)) (flim (0))) "MIME features" tar ((:url . "https://github.com/emacsmirror/semi") (:commit . "9904bd849a6243646f4db65d623f2b38b05d79bd") (:revdesc . "9904bd849a62") (:keywords "mime" "multimedia" "mail" "news") (:authors ("MORIOKA Tomohiko" . "tomo@m17n.org")) (:maintainers ("MORIOKA Tomohiko" . "tomo@m17n.org")) (:maintainer "MORIOKA Tomohiko" . "tomo@m17n.org"))]) + (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 ((:url . "https://github.com/conao3/seml-mode.el") (:commit . "23d684ac590fad6aa3c5ce3962c4683c1eb8fdb5") (:revdesc . "23d684ac590f") (:keywords "lisp" "html") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (sendto . [(20160425 1250) ((emacs (24 4))) "Send the region content to a function" tar ((:url . "https://github.com/lujun9972/sendto.el") (:commit . "076b81d7a53f75b0a59b0ef3448f35570567054c") (:revdesc . "076b81d7a53f") (:keywords "convenience" "region") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (sensei . [(20250831 1341) ((emacs (27 1)) (projectile (2 5 0)) (request (0 3 2))) "A client for sensei" tar ((:url . "https://abailly.github.io/sensei") (:commit . "3129584a6b4b57cbf0e4769dcb8efcc21d8bc821") (:revdesc . "3129584a6b4b") (:keywords "hypermedia") (:authors ("Arnaud Bailly" . "arnaud@pankzsoft.com")) (:maintainers ("Arnaud Bailly" . "arnaud@pankzsoft.com")) (:maintainer "Arnaud Bailly" . "arnaud@pankzsoft.com"))]) + (sensitive . [(20170818 1251) ((emacs (24)) (sequences (0 1 0))) "A dead simple way to load sensitive information" tar ((:url . "https://github.com/timvisher/sensitive.el") (:commit . "69dd6125a41d8b55f4b6ba61daa4d1aa1f716fa8") (:revdesc . "69dd6125a41d") (:keywords "convenience") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainers ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com"))]) + (sentence-navigation . [(20220522 1137) ((ample-regexps (0 1)) (cl-lib (0 5)) (emacs (24 4))) "Commands to navigate one-spaced sentences" tar ((:url . "https://github.com/noctuid/emacs-sentence-navigation") (:commit . "ea6e94a5518643acda5b6e98e4e7f47dfc107d29") (:revdesc . "ea6e94a55186") (:keywords "sentence" "evil") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainers ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org"))]) + (sentex . [(20230411 1650) ((emacs (27 1))) "Regex-based sentence navigation rules" tar ((:url . "https://codeberg.org/martianh/sentex") (:commit . "ab96ee0e9856222aaad6b085cf4ca0c5dda73789") (:revdesc . "ab96ee0e9856") (:keywords "languages" "convenience" "translation" "sentences" "text" "wp") (:authors ("Marty Hiatt" . "martianhiatusATriseup.net")) (:maintainers ("Marty Hiatt" . "martianhiatusATriseup.net")) (:maintainer "Marty Hiatt" . "martianhiatusATriseup.net"))]) + (seoul256-theme . [(20180505 757) ((emacs (24 3))) "Low-contrast color scheme based on Seoul Colors" tar ((:url . "http://github.com/anandpiyer/seoul256-emacs") (:commit . "8e76d0207489964ef780420723d49e409f68f7d1") (:revdesc . "8e76d0207489") (:keywords "theme") (:authors ("Anand Iyer" . "anand.ucb@gmail.com")) (:maintainers ("Anand Iyer" . "anand.ucb@gmail.com")) (:maintainer "Anand Iyer" . "anand.ucb@gmail.com"))]) + (separedit . [(20250506 833) ((emacs (25 1)) (dash (2 18)) (edit-indirect (0 1 11))) "Edit comment/string/docstring/code block in separate buffer" tar ((:url . "https://github.com/twlz0ne/separedit.el") (:commit . "5cb46a65fc6e12b753dce8f581fbfa144d011a80") (:revdesc . "5cb46a65fc6e") (:keywords "tools" "languages" "docs") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com"))]) + (sequed . [(20251219 1858) ((emacs (25 2))) "Major mode for FASTA format DNA alignments" tar ((:url . "https://github.com/brannala/sequed") (:commit . "d8b76c47db7de52118ab9217dac7d3308d4df9cc") (:revdesc . "d8b76c47db7d") (:authors ("Bruce Rannala" . "brannala@ucdavis.edu")) (:maintainers ("Bruce Rannala" . "brannala@ucdavis.edu")) (:maintainer "Bruce Rannala" . "brannala@ucdavis.edu"))]) + (sequences . [(20170818 1252) ((emacs (24))) "Ports of some Clojure sequence functions" tar ((:url . "https://github.com/timvisher/sequences.el") (:commit . "564ebbd93b0beea4e75acfbf824350e90b5d5738") (:revdesc . "564ebbd93b0b") (:keywords "convenience") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainers ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com"))]) + (sequential-command . [(20170926 40) nil "Many commands into one command" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sequential-command.el") (:commit . "a48cbcbe273b33edd3ae56e68f44b4100fa3a48a") (:revdesc . "a48cbcbe273b") (:keywords "convenience" "lisp") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (sequential-yank . [(20231126 1530) ((emacs (24 4))) "Minor mode to copy and paste strings sequentially" tar ((:url . "https://github.com/knu/sequential-yank.el") (:commit . "3c7f98a842c391b59379566cbf03f143004b26da") (:revdesc . "3c7f98a842c3") (:keywords "killing" "convenience") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (seriestracker . [(20250315 1813) ((dash (2 12 1)) (transient (0 3 2)) (emacs (27 1))) "Series tracker" tar ((:url . "https://www.github.com/MaximeWack/seriesTracker") (:commit . "03e5937abe7911fef6286601cbe54e0a6bc9ec3f") (:revdesc . "03e5937abe79") (:keywords "multimedia") (:authors ("Maxime Wack" . "contactatmaximewackdotcom")) (:maintainers ("Maxime Wack" . "contactatmaximewackdotcom")) (:maintainer "Maxime Wack" . "contactatmaximewackdotcom"))]) + (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 ((:url . "http://github.com/rejeep/servant.el") (:commit . "4d2aa8250b54b28e6e7ee4cd5ebd98a33db2c134") (:revdesc . "4d2aa8250b54") (:keywords "elpa" "server") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com") ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com") ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (services . [(20170802 1130) ((cl-lib (0 5))) "Services database access functions" tar ((:url . "https://github.com/davep/services.el") (:commit . "04c7986041a33dfa0b0ae57c7d6fbd600548c596") (:revdesc . "04c7986041a3") (:keywords "convenience" "net" "services") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (sesman . [(20240417 1723) ((emacs (25))) "Generic Session Manager" tar ((:url . "https://github.com/vspinu/sesman") (:commit . "7bca68dbbab0af26a6a23be1ff5fa97f9a18e022") (:revdesc . "7bca68dbbab0") (:keywords "process"))]) + (session . [(20210422 53) nil "Use variables, registers and buffer places across sessions" tar ((:url . "http://emacs-session.sourceforge.net/") (:commit . "3be207c50dfe964de3cbf5cd8fa9b07fc7d2e609") (:revdesc . "3be207c50dfe") (:keywords "session" "session management" "desktop" "data" "tools") (:authors ("Christoph Wedler" . "wedler@users.sourceforge.net")) (:maintainers ("Christoph Wedler" . "wedler@users.sourceforge.net")) (:maintainer "Christoph Wedler" . "wedler@users.sourceforge.net"))]) + (session-async . [(20231125 2106) ((emacs (27 1)) (jsonrpc (1 0 9))) "Asynchronous processing in a forked process session" tar ((:url . "https://codeberg.org/FelipeLema/session-async.el") (:commit . "6e361073256740ce546f4fa104045f2b3818ef94") (:revdesc . "6e3610732567") (:keywords "async" "comm" "data" "files" "internal" "maint" "processes" "tools") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainers ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org"))]) + (seti-theme . [(20190201 1848) nil "A dark colored theme, inspired by Seti Atom Theme" tar ((:url . "https://github.com/caisah/seti-theme") (:commit . "9d76db0b91d4f574dd96ac80fad41da35bffa109") (:revdesc . "9d76db0b91d4") (:keywords "themes") (:authors ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainers ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainer "Vlad Piersec" . "vlad.piersec@gmail.com"))]) + (sexp-diff . [(20200314 2018) ((emacs (25))) "Diff sexps based on Levenshtein-like edit distance" tar ((:url . "https://github.com/xuchunyang/sexp-diff.el") (:commit . "4fea80f7b04c64b160a95bdc9d6de68c71096706") (:revdesc . "4fea80f7b04c") (:keywords "lisp"))]) + (sexp-move . [(20150915 1730) nil "Improved S-Expression Movement" tar ((:url . "https://gitlab.com/elzair/sexp-move") (:commit . "117f7a91ab7c25e438413753e916570122011ce7") (:revdesc . "117f7a91ab7c") (:keywords "sexp") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainers ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com"))]) + (sexy-monochrome-theme . [(20200115 2146) nil "A sexy dark Emacs >= 24 theme for your sexy code" tar ((:url . "https://github.com/voloyev/sexy-monochrome-theme") (:commit . "f3ad07d60c966ef34cb11026eaba053e114bb8f1") (:revdesc . "f3ad07d60c96") (:keywords "themes") (:authors ("Volodymyr Yevtushenko" . "voloyev@vivaldi.net")) (:maintainers ("Volodymyr Yevtushenko" . "voloyev@vivaldi.net")) (:maintainer "Volodymyr Yevtushenko" . "voloyev@vivaldi.net"))]) + (sexy-theme . [(20250312 1640) ((emacs (24 1))) "A strong colors variant of the Gruber Darker theme" tar ((:url . "http://github.com/bgcicca/sexy-theme.el") (:commit . "57cca02c067ded3964de6cf1566ef08cf5130189") (:revdesc . "57cca02c067d") (:authors ("Bruno Ciccarino" . "brunociccarinoo@gmail.com")) (:maintainers ("Bruno Ciccarino" . "brunociccarinoo@gmail.com")) (:maintainer "Bruno Ciccarino" . "brunociccarinoo@gmail.com"))]) + (sfz-mode . [(20200716 1023) ((emacs (25 1))) "Major mode for SFZ files" tar ((:url . "https://github.com/sfztools/emacs-sfz-mode") (:commit . "aaf31d1b68817251affed7da719dfcb2acd4b51a") (:revdesc . "aaf31d1b6881") (:keywords "languages") (:authors ("Jean Pierre Cimalando" . "jp-dev@inbox.ru")) (:maintainers ("Jean Pierre Cimalando" . "jp-dev@inbox.ru")) (:maintainer "Jean Pierre Cimalando" . "jp-dev@inbox.ru"))]) + (shackle . [(20240402 1315) ((emacs (24 3)) (cl-lib (0 5))) "Enforce rules for popups" tar ((:url . "https://depp.brause.cc/shackle") (:commit . "ae25e7e0e593520c8590440fe5e3c0ea8053dc26") (:revdesc . "ae25e7e0e593") (:keywords "convenience") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (shadchen . [(20141102 1839) nil "Pattern matching for elisp" tar ((:url . "https://github.com/VincentToups/shadchen-el") (:commit . "35f2b9c304eec990c16efbd557198289dc7cbb1f") (:revdesc . "35f2b9c304ee"))]) + (shader-mode . [(20220930 1052) ((emacs (24))) "Major mode for shader" tar ((:url . "https://github.com/midnightSuyama/shader-mode") (:commit . "fe5a1982ba69e4a98b834141a46a1908f132df15") (:revdesc . "fe5a1982ba69") (:authors ("midnightSuyama" . "midnightSuyama@gmail.com")) (:maintainers ("midnightSuyama" . "midnightSuyama@gmail.com")) (:maintainer "midnightSuyama" . "midnightSuyama@gmail.com"))]) + (shades-of-purple-theme . [(20230421 2059) nil "A theme with bold shades of purple" tar ((:url . "https://github.com/arturovm/shades-of-purple-emacs") (:commit . "8757594c5f6265b09d156cf9f8671f78863b25db") (:revdesc . "8757594c5f62") (:authors ("Arturo Vergara" . "hello@dead.computer")) (:maintainers ("Arturo Vergara" . "hello@dead.computer")) (:maintainer "Arturo Vergara" . "hello@dead.computer"))]) + (shadowenv . [(20250604 2048) ((emacs (24 3))) "Shadowenv integration" tar ((:url . "https://github.com/Shopify/shadowenv.el") (:commit . "2b8383b54cac9edf8204050d2a8d70a0e6f0d972") (:revdesc . "2b8383b54cac") (:keywords "shadowenv" "tools") (:authors ("Dante Catalfamo" . "dante.catalfamo@shopify.com")) (:maintainers ("Dante Catalfamo" . "dante.catalfamo@shopify.com")) (:maintainer "Dante Catalfamo" . "dante.catalfamo@shopify.com"))]) + (shakespeare-mode . [(20180704 2138) nil "A major mode for editing Shakespearean templates" tar ((:url . "http://github.com/CodyReichert/shakespeare-mode") (:commit . "c442eeea9d585e1b1fbb8813e33d47feec348a57") (:revdesc . "c442eeea9d58") (:keywords "shakespeare" "hamlet" "lucius" "julius" "mode"))]) + (shampoo . [(20230522 1722) ((emacs (24 1))) "A remote Smalltalk development mode" tar ((:url . "https://revival.sh/shampoo/") (:commit . "4112f3b9282be0ce1f334e148f5c89b03a5df40c") (:revdesc . "4112f3b9282b") (:keywords "languages") (:authors ("Dmitry Matveev" . "me@dmitrymatveev.co.uk")) (:maintainers ("Dmitry Matveev" . "me@dmitrymatveev.co.uk")) (:maintainer "Dmitry Matveev" . "me@dmitrymatveev.co.uk"))]) + (shanty-themes . [(20230123 2111) ((emacs (24 5 1))) "The themes for digital workers" tar ((:url . "https://github.com/qhga/shanty-themes") (:commit . "3f678d953771c4a109bd16f6d7def6bd9bbc811d") (:revdesc . "3f678d953771") (:keywords "faces" "theme" "blue" "yellow" "gold" "dark" "light") (:authors ("Philip Gaber" . "phga@posteo.de")) (:maintainers ("Philip Gaber" . "phga@posteo.de")) (:maintainer "Philip Gaber" . "phga@posteo.de"))]) + (share2computer . [(20200316 31) ((emacs (25 1))) "Elisp helper of android ShareToComputer" tar ((:url . "https://github.com/tumashu/share2computer") (:commit . "15da47625a800e3310b8dc714bd4e41e32966d6a") (:revdesc . "15da47625a80") (:keywords "convenience" "comm") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com"))]) + (sharper . [(20250403 1243) ((emacs (27 1)) (transient (0 2 0))) "A dotnet CLI wrapper, using Transient" tar ((:url . "https://github.com/sebasmonia/sharper") (:commit . "5049795848609e6508e4c9718a9f97ee481bf36c") (:revdesc . "504979584860") (:keywords "maint" "tool") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com"))]) + (shell-command-x . [(20231214 1) ((emacs (28 1))) "Extensions for shell commands" tar ((:url . "https://github.com/elizagamedev/shell-command-x.el") (:commit . "d2fe4d08be306d6570f3c316ea06b0e6931ea5d5") (:revdesc . "d2fe4d08be30") (:keywords "convenience" "processes" "unix"))]) + (shell-current-directory . [(20140101 2354) nil "Create new shell based on buffer directory" tar ((:url . "https://github.com/metaperl/shell-current-directory") (:commit . "bf843771bf9a4aa05e054ade799eb8862f3be89a") (:revdesc . "bf843771bf9a") (:keywords "shell" "comint"))]) + (shell-here . [(20220102 1703) nil "Open a shell relative to the working directory" tar ((:url . "https://codeberg.org/emacs-weirdware/shell-here") (:commit . "eeb437ff26d62a5009046b1b3b4503b768e3131a") (:revdesc . "eeb437ff26d6") (:keywords "unix" "tools" "processes") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainers ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com"))]) + (shell-history . [(20100505 839) nil "Integration with shell history" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/shell-history.el") (:commit . "ee371a81f2d2bf5a308344078329ca1e9b5ed38c") (:revdesc . "ee371a81f2d2") (:keywords "processes" "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (shell-maker . [(20251211 958) ((emacs (27 1))) "Interaction mode for making comint shells" tar ((:url . "https://github.com/xenodium/shell-maker") (:commit . "63f178f925b535668eb68257016a01dca9d1cf30") (:revdesc . "63f178f925b5"))]) + (shell-pop . [(20241207 1539) ((emacs (26 1))) "Helps you to use shell easily on Emacs. Only one key action to work" tar ((:url . "http://github.com/kyagi/shell-pop-el") (:commit . "657171f296fc930b1f335a96e6f67ae04b731b19") (:revdesc . "657171f296fc") (:keywords "shell" "terminal" "tools") (:authors ("Kazuo YAGI" . "kazuo.yagi@gmail.com")) (:maintainers ("Kazuo YAGI" . "kazuo.yagi@gmail.com")) (:maintainer "Kazuo YAGI" . "kazuo.yagi@gmail.com"))]) + (shell-split-string . [(20151224 1008) nil "Split strings using shell-like syntax" tar ((:url . "https://github.com/10sr/shell-split-string-el") (:commit . "19f6f999c33cc66a4c91bacdcc3697c25d97bf5a") (:revdesc . "19f6f999c33c") (:keywords "utility" "library" "shell" "string") (: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"))]) + (shell-switcher . [(20241229 1657) ((emacs (24))) "Provide fast switching between shell buffers" tar ((:url . "https://github.com/DamienCassou/shell-switcher") (:commit . "4c96dc27afb519bdbf7bbe42d49a51497f078192") (:revdesc . "4c96dc27afb5") (:keywords "emacs" "package" "elisp" "shell" "eshell" "term" "switcher") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (shell-toggle . [(20150226 1411) nil "Toggle to and from the shell buffer" tar ((:url . "https://github.com/knu/shell-toggle.el") (:commit . "0d01bd9a780fdb7fe6609c552523f4498649a3b9") (:revdesc . "0d01bd9a780f") (:keywords "processes") (:authors ("Mikael Sjödin" . "mic@docs.uu.se") ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Mikael Sjödin" . "mic@docs.uu.se") ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Mikael Sjödin" . "mic@docs.uu.se"))]) + (shellcop . [(20220629 817) ((emacs (25 1))) "Analyze info&error in shell-mode" tar ((:url . "https://github.com/redguardtoo/shellcop") (:commit . "3f051e42288ddfe4cd7cd0ee62efad90227de24b") (:revdesc . "3f051e42288d") (:keywords "unix" "tools") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainers ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com"))]) + (shelldoc . [(20230207 250) ((cl-lib (0 3)) (s (1 9 0))) "Shell command editing support with man page" tar ((:url . "http://github.com/mhayashi1120/Emacs-shelldoc") (:commit . "178d78d08e94b273b23ab1a32c5be509fdfe2286") (:revdesc . "178d78d08e94") (:keywords "applications") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (shelldon . [(20220325 1305) ((emacs (27 1))) "An enhanced shell interface" tar ((:url . "https://github.com/Overdr0ne/shelldon") (:commit . "8d073ce580e7782ed863fc6e19dc33b4f73c0d79") (:revdesc . "8d073ce580e7") (:keywords "tools" "convenience") (:authors ("overdr0ne" . "scmorris.dev@gmail.com")) (:maintainers ("overdr0ne" . "scmorris.dev@gmail.com")) (:maintainer "overdr0ne" . "scmorris.dev@gmail.com"))]) + (shelltest-mode . [(20180501 141) nil "Major mode for shelltestrunner" tar ((:url . "https://github.com/rtrn/shelltest-mode") (:commit . "5fea8c9394380e822971a171905b6b5ab9be812d") (:revdesc . "5fea8c939438") (:keywords "languages") (:authors ("Dustin Fechner" . "dfe@rtrn.io")) (:maintainers ("Dustin Fechner" . "dfe@rtrn.io")) (:maintainer "Dustin Fechner" . "dfe@rtrn.io"))]) + (shen-elisp . [(20221211 1313) ((emacs (24 4))) "Shen implementation in Elisp" tar ((:url . "https://github.com/deech/shen-elisp") (:commit . "957ab44654fc7a7cc1b78181d244fa25166f9b09") (:revdesc . "957ab44654fc") (:authors ("Aditya Siram" . "aditya.siram@gmail.com")) (:maintainers ("Aditya Siram" . "aditya.siram@gmail.com")) (:maintainer "Aditya Siram" . "aditya.siram@gmail.com"))]) + (shenshou . [(20241015 1227) ((emacs (27 1))) "Download&Extract subtitles from opensubtitles" tar ((:url . "http://github.com/redguardtoo/shenshou") (:commit . "65163b449131ed0946ca6e817a660b4bbb7d35e9") (:revdesc . "65163b449131") (:keywords "convenience" "tools") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (shfmt . [(20250709 1443) ((emacs (24)) (reformatter (0 3))) "Reformat shell scripts using shfmt" tar ((:url . "https://github.com/purcell/emacs-shfmt") (:commit . "c81cb23fed1a77732b972ea036d74cbeb7c13bb1") (:revdesc . "c81cb23fed1a") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (shift-number . [(20251126 348) ((emacs (24 1))) "Increase/decrease the number at point" tar ((:url . "https://codeberg.org/ideasman42/emacs-shift-number") (:commit . "bb14d9609fed47000b76ecc8393285abff1bb766") (:revdesc . "bb14d9609fed") (:keywords "convenience") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainers ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com"))]) + (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 ((:url . "https://github.com/sabof/shift-text") (:commit . "1be9cbf994000022172ceb746fe1d597f57ea8ba") (:revdesc . "1be9cbf99400"))]) + (shimbun . [(20251225 713) nil "Interfacing with web newspapers" tar ((:url . "https://github.com/emacs-w3m/emacs-w3m") (:commit . "1669155d9aa074638d7fc7db0c356628d2c810fb") (:revdesc . "1669155d9aa0") (:keywords "news") (: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") ("Akihiro Arisawa" . "ari@mbf.sphere.ne.jp") ("Yuuichi Teranishi" . "teranisi@gohome.org") ("Katsumi Yamaoka" . "yamaoka@jpl.org")) (:maintainer "TSUCHIYA Masatoshi" . "tsuchiya@namazu.org"))]) + (shm . [(20180327 57) nil "Structured Haskell Mode" tar ((:url . "https://github.com/projectional-haskell/structured-haskell-mode") (:commit . "7f9df73f45d107017c18ce4835bbc190dfe6782e") (:revdesc . "7f9df73f45d1") (:keywords "development" "haskell" "structured") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainers ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com"))]) + (shortcuts-mode . [(20240707 1606) ((emacs (25 1))) "Minor mode providing a buffer shortcut bar" tar ((:url . "https://github.com/tetron/shortcuts-mode") (:commit . "a781ae97e33f5a0bf75058c21a7784032e22b28d") (:revdesc . "a781ae97e33f") (:keywords "lisp") (:authors ("Peter Amstutz" . "tetron@interreality.org")) (:maintainers ("Peter Amstutz" . "tetron@interreality.org")) (:maintainer "Peter Amstutz" . "tetron@interreality.org"))]) + (shoulda . [(20140616 1833) ((cl-lib (0 5))) "Shoulda test support for ruby" tar ((:url . "https://github.com/marcwebbie/shoulda.el") (:commit . "24dc6b6138a06edde9c8d13a6aaa1654d1d7de54") (:revdesc . "24dc6b6138a0") (:keywords "ruby" "tests" "shoulda") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainers ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com"))]) + (show-css . [(20160210 1408) ((doom (1 3)) (s (1 10 0))) "Show the css of the html attribute the cursor is on" tar ((:url . "https://github.com/smmcg/showcss-mode") (:commit . "771daeddd4df7a7c10f66419a837145649bab63b") (:revdesc . "771daeddd4df") (:keywords "hypermedia") (:authors ("Sheldon McGrandle" . "developer@rednemesis.com")) (:maintainers ("Sheldon McGrandle" . "developer@rednemesis.com")) (:maintainer "Sheldon McGrandle" . "developer@rednemesis.com"))]) + (show-eol . [(20250101 1011) ((emacs (24 4))) "Show end of line symbol in buffer" tar ((:url . "https://github.com/jcs-elpa/show-eol") (:commit . "117060c077dca1facb7ea8942ea866d0621ef5ce") (:revdesc . "117060c077dc") (:keywords "convenience" "end" "eol" "line") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (show-font-mode . [(20201225 2217) ((emacs (25 1))) "Show font at point on mode line" tar ((:url . "https://github.com/melissaboiko/show-font-mode") (:commit . "c7328b85655688d257b769192d26b9f5c9bbe26d") (:revdesc . "c7328b856556") (:keywords "faces" "i18n" "unicode" "fonts" "fontsets") (:authors ("Melissa Boiko" . "melissa@namakajiri.net")) (:maintainers ("Melissa Boiko" . "melissa@namakajiri.net")) (:maintainer "Melissa Boiko" . "melissa@namakajiri.net"))]) + (showtip . [(20090830 1040) nil "Show tip at cursor" tar ((:url . "https://github.com/emacsorphanage/showtip") (:commit . "930da302809a4257e8d69425455b29e1cc91949b") (:revdesc . "930da302809a") (:keywords "help") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainers ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))]) + (shpec-mode . [(20150530 922) nil "Minor mode for shpec specification" tar ((:url . "http://github.com/shpec/shpec-mode") (:commit . "76bccd63e3b70233a6c9ca0798dd03550952cc76") (:revdesc . "76bccd63e3b7") (:keywords "languages" "tools") (:authors ("AdrieanKhisbe" . "adriean.khisbe@live.fr")) (:maintainers ("AdrieanKhisbe" . "adriean.khisbe@live.fr")) (:maintainer "AdrieanKhisbe" . "adriean.khisbe@live.fr"))]) + (shr-tag-pre-highlight . [(20250501 1509) ((emacs (25 1)) (language-detection (0 1 0))) "Syntax highlighting code block in HTML" tar ((:url . "https://github.com/xuchunyang/shr-tag-pre-highlight.el") (:commit . "02a93d48f030d71eba460bd09d091baedcad6626") (:revdesc . "02a93d48f030") (:keywords "html") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (shrface . [(20251224 957) ((emacs (25 1)) (org (9 0)) (language-detection (0 1 0))) "Extend shr/eww with org features and analysis capability" tar ((:url . "https://github.com/chenyanming/shrface") (:commit . "9016f3d7276c29feeb49337f765d9fa5f889adf0") (:revdesc . "9016f3d7276c") (:keywords "faces") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainers ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com"))]) + (shrink-path . [(20190208 1335) ((emacs (24)) (s (1 6 1)) (dash (1 8 0)) (f (0 10 0))) "Fish-style path" tar ((:url . "https://gitlab.com/bennya/shrink-path.el") (:commit . "c14882c8599aec79a6e8ef2d06454254bb3e1e41") (:revdesc . "c14882c8599a"))]) + (shrink-whitespace . [(20181003 321) nil "Whitespace removal DWIM key" tar ((:url . "https://gitlab.com/jcpetkovich/shrink-whitespace.el") (:commit . "0407b89c142bd17e65edb666f35e2c6755bd0867") (:revdesc . "0407b89c142b") (:keywords "convenience") (:authors ("Jean-Christophe Petkovich" . "jcpetkovich@gmail.com")) (:maintainers ("Jean-Christophe Petkovich" . "jcpetkovich@gmail.com")) (:maintainer "Jean-Christophe Petkovich" . "jcpetkovich@gmail.com"))]) + (shroud . [(20210220 1952) ((emacs (25)) (epg (1 0 0)) (s (1 6 0)) (bui (1 2 0)) (dash (2 18 0))) "Shroud secrets" tar ((:url . "https://github.com/o-nly/emacs-shroud") (:commit . "2e6ff2bab4a1e798c090c9d7fbd90b7f3463d5c5") (:revdesc . "2e6ff2bab4a1") (:keywords "tools" "password") (:authors ("Amar Singh" . "nly@disroot.org")) (:maintainers ("Amar Singh" . "nly@disroot.org")) (:maintainer "Amar Singh" . "nly@disroot.org"))]) + (shut-up . [(20240429 605) ((cl-lib (0 3)) (emacs (24))) "Shut up would you!" tar ((:url . "http://github.com/rejeep/shut-up.el") (:commit . "ed62a7fefdf04c81346061016f1bc69ca045aaf6") (:revdesc . "ed62a7fefdf0") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (shx . [(20251225 43) ((emacs (24 4))) "Extras for the comint-mode shell" tar ((:url . "https://github.com/riscy/shx-for-emacs") (:commit . "019975297b4abbf9474172f4981e565152e9aa34") (:revdesc . "019975297b4a") (:keywords "terminals" "processes" "comint" "shell" "repl") (:maintainers ("Chris Rayner" . "dchrisrayner@gmail.com")) (:maintainer "Chris Rayner" . "dchrisrayner@gmail.com"))]) + (sibilant-mode . [(20151119 2145) nil "Support for the Sibilant programming language" tar ((:url . "http://sibilantjs.info") (:commit . "5baf8c3e80ee0736c7298a2a17fb615ba5ac0d2d") (:revdesc . "5baf8c3e80ee") (:keywords "languages") (:authors ("Jacob Rothstein" . "hi@jbr.me")) (:maintainers ("Jacob Rothstein" . "hi@jbr.me")) (:maintainer "Jacob Rothstein" . "hi@jbr.me"))]) + (sicp . [(20240826 1844) nil "Structure and Interpretation of Computer Programs in info format" tar ((:url . "https://mitpress.mit.edu/sicp") (:commit . "552b44fd873b5cadde4e76d10cef4d6e21a4287a") (:revdesc . "552b44fd873b"))]) + (side-hustle . [(20240625 1228) ((emacs (24 4)) (seq (2 20))) "Hustle through Imenu in a side window" tar ((:url . "https://github.com/rnkn/side-hustle") (:commit . "94450b58cec1b809afe08d0754a6662839efbc9d") (:revdesc . "94450b58cec1") (:keywords "convenience") (:authors ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainers ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainer "Paul W. Rankin" . "rnkn@rnkn.xyz"))]) + (side-notes . [(20240629 1008) ((emacs (24 4))) "Easy access to a directory notes file" tar ((:url . "https://github.com/rnkn/side-notes") (:commit . "96a142dfd5768d66b1d574027e13c572e4c82a87") (:revdesc . "96a142dfd576") (:keywords "convenience") (:authors ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainers ("Paul W. Rankin" . "rnkn@rnkn.xyz")) (:maintainer "Paul W. Rankin" . "rnkn@rnkn.xyz"))]) + (sidecar-locals . [(20251209 1502) ((emacs (28 1))) "A flexible alternative to built-in dir-locals" tar ((:url . "https://codeberg.org/ideasman42/emacs-sidecar-locals") (:commit . "0a370c10b07782c891bda2f9c65d5661050281fd") (:revdesc . "0a370c10b077") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (sideline . [(20250517 508) ((emacs (28 1)) (ht (2 4))) "Show information on the side" tar ((:url . "https://github.com/emacs-sideline/sideline") (:commit . "6c0562c5abfa9eb16320cec755ffe09ebc26c0cc") (:revdesc . "6c0562c5abfa") (:keywords "convenience") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (sideline-blame . [(20250704 251) ((emacs (28 1)) (sideline (0 1 0)) (vc-msg (1 1 1))) "Show blame messages with sideline" tar ((:url . "https://github.com/emacs-sideline/sideline-blame") (:commit . "33b0699a5c9843a03b76cf6de19b5860738a9ac5") (:revdesc . "33b0699a5c98") (:keywords "convenience" "blame") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (sideline-eglot . [(20251214 646) ((emacs (29 1)) (eglot (1 12 29)) (sideline (0 1 0)) (ht (2 4))) "Show eglot information with sideline" tar ((:url . "https://github.com/emacs-sideline/sideline-eglot") (:commit . "1ca026df95ab463581c52f2eb516d788402bf734") (:revdesc . "1ca026df95ab") (:keywords "convenience" "eglot") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (sideline-flycheck . [(20250201 1746) ((emacs (28 1)) (sideline (0 1 1)) (flycheck (0 14)) (ht (2 4))) "Show flycheck errors with sideline" tar ((:url . "https://github.com/emacs-sideline/sideline-flycheck") (:commit . "886b0d923aeaac5e6e4cd4ab42ee6a6a18553907") (:revdesc . "886b0d923aea") (:keywords "convenience" "flycheck") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (sideline-flymake . [(20250514 2147) ((emacs (28 1)) (sideline (0 1 0))) "Show flymake errors with sideline" tar ((:url . "https://github.com/emacs-sideline/sideline-flymake") (:commit . "46f6cdd69bfa6825cf06f71f9417de8364280353") (:revdesc . "46f6cdd69bfa") (:keywords "convenience" "flymake") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (sideline-lsp . [(20250805 922) ((emacs (28 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 ((:url . "https://github.com/emacs-sideline/sideline-lsp") (:commit . "fed3ab896be6b508ce3e37994600dd56af993185") (:revdesc . "fed3ab896be6") (:keywords "convenience" "lsp") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (sift . [(20200421 1423) nil "Front-end for sift, a fast and powerful grep alternative" tar ((:url . "https://github.com/nlamirault/sift.el") (:commit . "cdddba2d183146c340915003f1b5d09d13712c22") (:revdesc . "cdddba2d1831") (:keywords "sift" "ack" "pt" "ag" "grep" "search") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (signal . [(20160816 1438) ((emacs (24)) (cl-lib (0 5))) "Advanced hook" tar ((:url . "https://github.com/mola-T/signal") (:commit . "aa58327e2297df921d72a0370468b48663efd438") (:revdesc . "aa58327e2297") (:keywords "internal" "lisp" "processes" "tools") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainers ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz"))]) + (silkworm-theme . [(20210215 1120) ((emacs (24))) "Light theme with pleasant, low contrast colors" tar ((:url . "https://github.com/mswift42/silkworm-theme") (:commit . "ff80e9294da0fb093e15097ac62153ef4a64a889") (:revdesc . "ff80e9294da0"))]) + (simp . [(20180607 254) nil "Simple project definition, chiefly for file finding, and grepping" tar ((:url . "https://github.com/re5et/simp") (:commit . "d4d4b8547055347828bedccbeffdb4fd2d5a5d34") (:revdesc . "d4d4b8547055") (:keywords "project" "grep" "find"))]) + (simple-bookmarks . [(20190204 1426) ((cl-lib (0 5))) "Bookmark / functioncall manager" tar ((:url . "https://github.com/jtkDvlp/simple-bookmarks") (:commit . "54e8d771bcdb0eb235b31c0aa9642171369500e5") (:revdesc . "54e8d771bcdb") (:keywords "bookmark" "functioncall") (:authors ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainers ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainer "Julian T. Knabenschuh" . "jtkdevelopments@gmail.com"))]) + (simple-call-tree . [(20240713 1008) ((emacs (24 3)) (anaphora (1 0 0))) "Analyze source code based on font-lock text-properties" tar ((:url . "http://www.emacswiki.org/emacs/download/simple-call-tree.el") (:commit . "90de7cb42e1dbfe295516e696df928966f1eede9") (:revdesc . "90de7cb42e1d") (:keywords "programming") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (simple-httpd . [(20230821 1458) ((cl-lib (0 3))) "Pure elisp HTTP server" tar ((:url . "https://github.com/skeeto/emacs-http-server") (:commit . "347c30494d3bcfc79de35e54538f92f4e4a46ecd") (:revdesc . "347c30494d3b") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (simple-indentation . [(20230625 1610) ((emacs (24 3)) (dash (2 18 0)) (s (1 12 0))) "Simplify writing indentation functions, alternative to SMIE" tar ((:url . "https://github.com/semenInRussia/simple-indentation.el") (:commit . "b5f97fc14b3f494cfe009938cf5ee9016a83d30e") (:revdesc . "b5f97fc14b3f") (:authors ("Semen Khramtsov" . "hrams205@gmail.com")) (:maintainers ("Semen Khramtsov" . "hrams205@gmail.com")) (:maintainer "Semen Khramtsov" . "hrams205@gmail.com"))]) + (simple-modeline . [(20210312 1048) ((emacs (26 1))) "A simple mode-line configuration for Emacs" tar ((:url . "https://github.com/gexplorer/simple-modeline") (:commit . "119d8224a8ae0ee17b09ac1fed6cdb9cb1d048fd") (:revdesc . "119d8224a8ae") (:keywords "mode-line" "faces") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainers ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com"))]) + (simple-mpc . [(20220216 102) ((s (1 10 0))) "Provides a simple interface to mpc" tar ((:url . "https://github.com/jorenvo/simple-mpc") (:commit . "57ee14ada8aec477ddde5e4f632c8d3d99a66535") (:revdesc . "57ee14ada8ae") (:keywords "multimedia" "mpd" "mpc") (:authors ("Joren Van Onder" . "joren@jvo.sh")) (:maintainers ("Joren Van Onder" . "joren@jvo.sh")) (:maintainer "Joren Van Onder" . "joren@jvo.sh"))]) + (simple-paren . [(20230810 729) ((emacs (24)) (cl-lib (0 5))) "Non-electrical insert paired delimiter, wrap" tar ((:url . "https://github.com/andreas-roehler/simple-paren") (:commit . "206d8f3f82123f61e7133a14f66c83a9632bd99e") (:revdesc . "206d8f3f8212") (:keywords "convenience"))]) + (simple-rtm . [(20160222 1534) ((rtm (0 1)) (dash (2 0 0))) "Interactive Emacs mode for Remember The Milk" tar ((:url . "https://codeberg.org/mbunkus/simple-rtm") (:commit . "37c5feffea7c9b571279b6f549d06cf9c0720273") (:revdesc . "37c5feffea7c") (:keywords "remember" "the" "milk" "productivity" "todo") (:authors ("Moritz Bunkus" . "morit@bunkus.org")) (:maintainers ("Moritz Bunkus" . "morit@bunkus.org")) (:maintainer "Moritz Bunkus" . "morit@bunkus.org"))]) + (simple-screen . [(20241228 113) nil "Simple screen configuration manager" tar ((:url . "https://github.com/wachikun/simple-screen") (:commit . "66eb5ddab259025ef5790084ca33018c266d6940") (:revdesc . "66eb5ddab259") (:keywords "tools") (:authors ("Tadashi Watanabe" . "wac@umiushi.org")) (:maintainers ("Tadashi Watanabe" . "wac@umiushi.org")) (:maintainer "Tadashi Watanabe" . "wac@umiushi.org"))]) + (simpleclip . [(20250505 1710) nil "Simplified access to the system clipboard" tar ((:url . "http://github.com/rolandwalker/simpleclip") (:commit . "105b7adce212fdc9bbcbe7801531669a658c735b") (:revdesc . "105b7adce212") (:keywords "convenience") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (simplecov . [(20221206 350) ((dash (2 19)) (emacs (28))) "Colorize untested ruby code" tar ((:url . "https://github.org/zenspider/elisp") (:commit . "215f2bdc5d2ef9b4439779ba4d3129210c9f34ab") (:revdesc . "215f2bdc5d2e") (:keywords "tools" "languages") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainers ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com"))]) + (simplenote . [(20141118 1440) nil "Interact with simple-note.appspot.com" tar ((:url . "https://github.com/dotemacs/simplenote.el") (:commit . "734603e877b2d642162ca45f799d2f7b956d2ea0") (:revdesc . "734603e877b2") (:keywords "simplenote") (:authors ("Konstantinos Efstathiou" . "konstantinos@efstathiou.gr")) (:maintainers ("Konstantinos Efstathiou" . "konstantinos@efstathiou.gr")) (:maintainer "Konstantinos Efstathiou" . "konstantinos@efstathiou.gr"))]) + (simplenote2 . [(20190321 933) ((request-deferred (0 2 0)) (uuidgen (20140918)) (unicode-escape (1 1))) "Interact with app.simplenote.com" tar ((:url . "https://github.com/alpha22jp/simplenote2.el") (:commit . "760ffecda63bd218876b623f46d332e3ef079be6") (:revdesc . "760ffecda63b") (:keywords "simplenote") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainers ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com"))]) + (simplezen . [(20130421 1000) ((s (1 4 0)) (dash (1 1 0))) "A simple subset of zencoding-mode for Emacs" tar ((:url . "https://github.com/magnars/simplezen.el") (:commit . "9f91554a3f7f4e9b2b5ec009effafbf12b091973") (:revdesc . "9f91554a3f7f") (: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 ((:url . "http://github.com/smallwat3r/emacs-simplicity-theme") (:commit . "f4aab6aa07b536688eb62355b83dde5fcd16e049") (:revdesc . "f4aab6aa07b5") (:keywords "faces" "theme" "minimal") (:authors ("Matthieu Petiteau" . "mpetiteau.pro@gmail.com")) (:maintainers ("Matthieu Petiteau" . "mpetiteau.pro@gmail.com")) (:maintainer "Matthieu Petiteau" . "mpetiteau.pro@gmail.com"))]) + (simply-annotate . [(20250703 2055) ((emacs (28 1))) "Enhanced annotation system with threading" tar ((:url . "https://github.com/captainflasmr/simply-annotate") (:commit . "7fbeb4d76fd242ec0cdadca20857af5c43e2da5e") (:revdesc . "7fbeb4d76fd2") (:keywords "applications" "tools" "convenience") (:authors ("James Dyer" . "captainflasmr@gmail.com")) (:maintainers ("James Dyer" . "captainflasmr@gmail.com")) (:maintainer "James Dyer" . "captainflasmr@gmail.com"))]) + (sink . [(20240523 747) ((emacs (25 1))) "Receive messages from the plan9 plumber" tar ((:url . "https://github.com/alcah/sink.el") (:commit . "a14e1cc0a051543723c043a5ece081ce9a567ddd") (:revdesc . "a14e1cc0a051"))]) + (siri-shortcuts . [(20211229 1833) ((emacs (25 2))) "Interact with Siri Shortcuts" tar ((:url . "https://github.com/DaniruKun/siri-shortcuts.el") (:commit . "190f242f71e071adfd89fa1f2f6ea22b62afd133") (:revdesc . "190f242f71e0") (:keywords "convenience" "multimedia") (:authors ("Daniils Petrovs" . "thedanpetrov@gmail.com")) (:maintainers ("Daniils Petrovs" . "thedanpetrov@gmail.com")) (:maintainer "Daniils Petrovs" . "thedanpetrov@gmail.com"))]) + (sis . [(20251208 853) ((emacs (27 1))) "Minimize manual input source (input method) switching" tar ((:url . "https://github.com/laishulu/emacs-smart-input-source") (:commit . "515e1dbe0180f33c292660b4b70d02d47153be5b") (:revdesc . "515e1dbe0180") (:keywords "convenience"))]) + (sisyphus . [(20251101 2122) ((emacs (30 1)) (compat (30 1)) (cond-let (0 2)) (elx (2 3)) (llama (1 0)) (magit (4 4))) "Create releases of Emacs packages" tar ((:url . "https://github.com/magit/sisyphus") (:commit . "8fe6d76d3d31db60149173c1054961c2757c9f74") (:revdesc . "8fe6d76d3d31") (:keywords "git" "tools" "vc") (:authors ("Jonas Bernoulli" . "emacs.sisyphus@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.sisyphus@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.sisyphus@jonas.bernoulli.dev"))]) + (sixcolors-mode . [(20230406 1031) ((emacs (27 1))) "A customizable horizontal scrollbar" tar ((:url . "https://github.com/mastro35/sixcolors-mode") (:commit . "4124a8cf664b04a4bf4c39f7c3b7da3e480b99c8") (:revdesc . "4124a8cf664b") (:keywords "convenience" "colors") (:authors ("Davide Mastromatteo" . "mastro35@gmail.com")) (:maintainers ("Davide Mastromatteo" . "mastro35@gmail.com")) (:maintainer "Davide Mastromatteo" . "mastro35@gmail.com"))]) + (sixcolors-theme . [(20251028 1442) ((emacs (27 1))) "Just another theme" tar ((:url . "https://github.com/mastro35/sixcolors-theme") (:commit . "be8db0ca5f7868a9f139056cb8067d24aeffe67e") (:revdesc . "be8db0ca5f78") (:keywords "faces" "colors" "apple" "sixcolors" "vintage" "dark") (:authors ("Davide Mastromatteo" . "mastro35@gmail.com")) (:maintainers ("Davide Mastromatteo" . "mastro35@gmail.com")) (:maintainer "Davide Mastromatteo" . "mastro35@gmail.com"))]) + (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 ((:url . "https://github.com/chrisbarrett/skeletor.el") (:commit . "f6e560a0bfe459e0b8a268047920ce1148f2ebf6") (:revdesc . "f6e560a0bfe4") (: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 ((:url . "https://github.com/anonimitoraf/skerrick") (:commit . "015de8369b8b6be0d4d1e21c24239a037350e87e") (:revdesc . "015de8369b8b") (:keywords "languages" "javascript" "js" "repl" "repl-driven") (:authors ("Rafael Nicdao" . "https://github.com/anonimitoraf")) (:maintainers ("Rafael Nicdao" . "nicdaoraf@gmail.com")) (:maintainer "Rafael Nicdao" . "nicdaoraf@gmail.com"))]) + (sketch-themes . [(20230210 1507) ((emacs (26 1))) "Sketch color themes" tar ((:url . "https://github.com/dawranliou/sketch-themes/") (:commit . "5534254232f1a556ec20952c75b5506625573049") (:revdesc . "5534254232f1") (:keywords "faces") (:authors ("Daw-Ran Liou" . "hi@dawranliou.com")) (:maintainers ("Daw-Ran Liou" . "hi@dawranliou.com")) (:maintainer "Daw-Ran Liou" . "hi@dawranliou.com"))]) + (skewer-less . [(20210510 532) ((skewer-mode (1 5 3))) "Skewer support for live LESS stylesheet updates" tar ((:url . "https://github.com/purcell/skewer-less") (:commit . "baa973581c2ab7326db65803df97d1a7382b6564") (:revdesc . "baa973581c2a") (:keywords "languages" "tools") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (skewer-mode . [(20200304 1142) ((simple-httpd (1 4 0)) (js2-mode (20090723)) (emacs (24))) "Live browser JavaScript, CSS, and HTML interaction" tar ((:url . "https://github.com/skeeto/skewer-mode") (:commit . "e5bed351939c92a1f788f78398583c2f83f1bb3c") (:revdesc . "e5bed351939c") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (skewer-reload-stylesheets . [(20160725 1220) ((skewer-mode (1 5 3))) "Live-edit CSS, SCSS, Less, and friends" tar ((:url . "https://github.com/NateEag/skewer-reload-stylesheets") (:commit . "3207abca9551660407a6b009cb40fb32bbb550da") (:revdesc . "3207abca9551") (:authors ("Nate Eagleson" . "nate@nateeag.com")) (:maintainers ("Nate Eagleson" . "nate@nateeag.com")) (:maintainer "Nate Eagleson" . "nate@nateeag.com"))]) + (skype . [(20160711 824) nil "Skype UI for emacs users." tar ((:url . "https://github.com/kiwanami/emacs-skype") (:commit . "8e3b33e620ed355522aa36434ff41e3ced080629") (:revdesc . "8e3b33e620ed") (:keywords "skype" "chat") (:authors ("SAKURAI Masashi" . "m.sakurai@kiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakurai@kiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakurai@kiwanami.net"))]) + (sl . [(20161217 1404) ((cl-lib (0 5))) "An Emacs clone of sl(1)" tar ((:url . "https://github.com/xuchunyang/sl.el") (:commit . "0882117728be91276b815e18c2a66106bf9d69d3") (:revdesc . "0882117728be") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainers ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me"))]) + (slack . [(20251216 2218) ((websocket (1 12)) (request (0 3 2)) (circe (2 11)) (alert (1 2)) (emojify (1 2 1)) (emacs (25 1)) (dash (2 19 1)) (s (1 13 1)) (ts (0 3))) "Slack client" tar ((:url . "https://github.com/emacs-slack/emacs-slack") (:commit . "8a649a4ad9558c7dc1c5773871c1de9107b475f3") (:revdesc . "8a649a4ad955") (:keywords "tools") (:authors ("yuya.minami" . "yuya.minami@yuyaminami-no-MacBook-Pro.local")) (:maintainers ("yuya.minami" . "yuya.minami@yuyaminami-no-MacBook-Pro.local")) (:maintainer "yuya.minami" . "yuya.minami@yuyaminami-no-MacBook-Pro.local"))]) + (slideview . [(20250121 324) ((emacs (25 1))) "File slideshow" tar ((:url . "https://github.com/mhayashi1120/Emacs-slideview") (:commit . "4d7c8b91d339126b4c5a6365362aadb90ee0e7f9") (:revdesc . "4d7c8b91d339") (:keywords "files") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (slim-mode . [(20240513 2118) nil "Major mode for editing Slim files" tar ((:url . "http://github.com/slim-template/emacs-slim") (:commit . "8c92169817f2fa59255f547f0a9fb4fbb8309db9") (:revdesc . "8c92169817f2") (:keywords "markup" "language"))]) + (slime . [(20251222 1632) ((emacs (24 3)) (macrostep (0 9))) "Superior Lisp Interaction Mode for Emacs" tar ((:url . "https://github.com/slime/slime") (:commit . "8f6aaf56978f95fb029a9aeb6b601c163c3bcb99") (:revdesc . "8f6aaf56978f") (:keywords "languages" "lisp" "slime"))]) + (slime-company . [(20250815 757) ((emacs (24 4)) (slime (2 13)) (company (0 9 0))) "Slime completion backend for company mode" tar ((:url . "https://github.com/anwyn/slime-company") (:commit . "38ab03e4015029de74cc23d499bf29de60da9bad") (:revdesc . "38ab03e40150") (:keywords "convenience" "lisp" "abbrev") (:authors ("Ole Arndt" . "anwyn@sugarshark.com")) (:maintainers ("Ole Arndt" . "anwyn@sugarshark.com")) (:maintainer "Ole Arndt" . "anwyn@sugarshark.com"))]) + (slime-docker . [(20210426 1422) ((emacs (24 4)) (slime (2 16)) (docker-tramp (0 1))) "Integration of SLIME with Docker containers" tar ((:url . "https://gitlab.common-lisp.net/cl-docker-images/slime-docker") (:commit . "c7d073720f2bd8e9f72a20309fff2afa4c4e798d") (:revdesc . "c7d073720f2b") (:keywords "docker" "lisp" "slime"))]) + (slime-repl-ansi-color . [(20230214 1453) ((emacs (24)) (slime (2 3 1))) "Turn on ANSI colors in REPL output;" tar ((:url . "https://gitlab.com/augfab/slime-repl-ansi-color") (:commit . "9e8af90490332217e45d7568f1690df3f4e25d4b") (:revdesc . "9e8af9049033") (:keywords "lisp") (:authors ("Max Mikhanosha" . "max@openchat.com")) (:maintainers ("Augustin Fabre" . "augustin@augfab.fr")) (:maintainer "Augustin Fabre" . "augustin@augfab.fr"))]) + (slime-theme . [(20170808 1322) ((emacs (24 0))) "An Emacs 24 theme based on Slime (tmTheme)" tar ((:url . "https://github.com/emacsfodder/tmtheme-to-deftheme") (:commit . "8e5880ac69e0b6a079103001cc3a90bdb688998f") (:revdesc . "8e5880ac69e0"))]) + (slime-volleyball . [(20190701 1624) nil "An SVG Slime Volleyball Game" tar ((:url . "https://github.com/fitzsim/slime-volleyball") (:commit . "6c135ad18897c3566d4dadfe847061532600ba2e") (:revdesc . "6c135ad18897") (:keywords "games") (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) (:maintainers ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))]) + (slint-mode . [(20240429 1333) ((emacs (24 4))) "Major-mode for the Slint UI language" tar ((:url . "https://github.com/nilclass/slint-mode") (:commit . "168a6cfb90b5e36360074c83f80d5bbac2f0287e") (:revdesc . "168a6cfb90b5") (:keywords "languages") (:authors ("Niklas Cathor" . "niklas.cathor@gmx.de")) (:maintainers ("Niklas Cathor" . "niklas.cathor@gmx.de")) (:maintainer "Niklas Cathor" . "niklas.cathor@gmx.de"))]) + (slirm . [(20160201 1425) ((emacs (24 4))) "Systematic Literature Review Mode for Emacs" tar ((:url . "http://github.com/fbie/slirm") (:commit . "9adfbe1fc67580e7d0d90f7e927a25d63a797464") (:revdesc . "9adfbe1fc675") (:authors ("Florian Biermann" . "fbie@itu.dk")) (:maintainers ("Florian Biermann" . "fbie@itu.dk")) (:maintainer "Florian Biermann" . "fbie@itu.dk"))]) + (slothbar . [(20251124 353) ((all-the-icons (5 0 0)) (backlight (1 4)) (compat (29 1)) (dash (2 1 0)) (f (0 20 0)) (fontsloth (0 19 1)) (log4e (0 3 3)) (nerd-icons (0 1 0)) (s (1 12 0)) (volume (1 0)) (xelb (0 18)) (emacs (28 1))) "Emacs X window manager status bar" tar ((:url . "https://codeberg.org/agnes-li/slothbar") (:commit . "52010da65a4688b2b2f16427f81dfeedf4443077") (:revdesc . "52010da65a46") (:keywords "frames" "hardware") (:authors ("Jo Gay" . "jo.gay@mailfence.com") ("Agnes Li" . "agnes.li@mailfence.com")) (:maintainers ("Jo Gay" . "jo.gay@mailfence.com") ("Agnes Li" . "agnes.li@mailfence.com")) (:maintainer "Jo Gay" . "jo.gay@mailfence.com"))]) + (slovak-holidays . [(20211018 1754) nil "Adds a list of slovak holidays to Emacs calendar" tar ((:url . "https://github.com/Fuco1/slovak-holidays") (:commit . "bedd26dd45ca497c0028a11e94a905560fcdb2f1") (:revdesc . "bedd26dd45ca") (:keywords "calendar") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (slow-keys . [(20220807 1425) ((emacs (24 1))) "Slow keys mode to avoid RSI" tar ((:url . "https://github.com/manuel-uberti/slow-keys") (:commit . "b951ae4bdcea56ced03f227b82b28c3d91d15e61") (:revdesc . "b951ae4bdcea") (:keywords "convenience") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainers ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org"))]) + (slstats . [(20170823 849) ((cl-lib (0 5)) (emacs (24))) "Acquire and display stats about Second Life" tar ((:url . "https://github.com/davep/slstats.el") (:commit . "e9696066abf3f2b7b818a57c062530dfd9377033") (:revdesc . "e9696066abf3") (:keywords "games") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (slurm-mode . [(20210519 1109) nil "Interaction with the SLURM job scheduling system" tar ((:url . "https://github.com/ffevotte/slurm.el") (:commit . "4e6ac09245313cf4018b8e5784b2fca8604269d7") (:revdesc . "4e6ac0924531"))]) + (slurpbarf . [(20251018 2247) ((emacs (29 1))) "Commands for slurping and barfing" tar ((:url . "https://codeberg.org/vilij/slurpbarf-elcute") (:commit . "20f209035ab01a798645efa29650dfd67d50fad4") (:revdesc . "20f209035ab0") (:keywords "convenience" "lisp" "xml"))]) + (sly . [(20251212 0) ((emacs (24 5))) "Sylvester the Cat's Common Lisp IDE" tar ((:url . "https://github.com/joaotavora/sly") (:commit . "b01993cf1d6626d541998a77dd802483c9687789") (:revdesc . "b01993cf1d66") (:keywords "languages" "lisp" "sly"))]) + (sly-asdf . [(20221119 2235) ((emacs (24 3)) (sly (1 0 0 -2 2)) (popup (0 5 3))) "ASDF system support for SLY" tar ((:url . "https://github.com/mmgeorge/sly-asdf") (:commit . "6f9d751469bb82530db1673c22e7437ca6c95f45") (:revdesc . "6f9d751469bb") (:keywords "languages" "lisp" "sly" "asdf") (:maintainers ("Matt George" . "mmge93@gmail.com")) (:maintainer "Matt George" . "mmge93@gmail.com"))]) + (sly-hello-world . [(20200225 1755) ((sly (1 0 0 -2 2))) "A template SLY contrib" tar ((:url . "https://github.com/capitaomorte/sly-hello-world") (:commit . "be257e9ad354db690c7378e89899335597348a0d") (:revdesc . "be257e9ad354") (:keywords "languages" "lisp" "sly") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com"))]) + (sly-macrostep . [(20191211 1630) ((sly (1 0 0 -2 2)) (macrostep (0 9))) "Fancy macro-expansion via macrostep.el" tar ((:url . "https://github.com/capitaomorte/sly-macrostep") (:commit . "5113e4e926cd752b1d0bcc1508b3ebad5def5fad") (:revdesc . "5113e4e926cd") (:keywords "languages" "lisp" "sly"))]) + (sly-named-readtables . [(20191013 2138) ((sly (1 0 0 -2 2))) "Support named readtables in Common Lisp files" tar ((:url . "https://github.com/capitaomorte/sly-named-readtables") (:commit . "a5a42674ccffa97ccd5e4e9742beaf3ea719931f") (:revdesc . "a5a42674ccff") (:keywords "languages" "lisp" "sly") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com"))]) + (sly-overlay . [(20240828 910) ((emacs (24 4)) (sly (1 0))) "Overlay Common Lisp evaluation results" tar ((:url . "https://github.com/fosskers/sly-overlay") (:commit . "d62945059035f8097a6f222ed2700cfd99609d11") (:revdesc . "d62945059035") (:keywords "lisp") (:authors ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca"))]) + (sly-quicklisp . [(20211206 948) ((sly (1 0 0 -2 2))) "Quicklisp support for SLY" tar ((:url . "https://github.com/capitaomorte/sly-quicklisp") (:commit . "34c73d43dd9066262387c626c17a9b486db07b2d") (:revdesc . "34c73d43dd90") (:keywords "languages" "lisp" "sly") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainers ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com"))]) + (sly-repl-ansi-color . [(20171020 1516) ((sly (0)) (cl-lib (0 5))) "Add ANSI colors support to the sly mrepl" tar ((:url . "https://github.com/PuercoPop/sly-repl-ansi-color") (:commit . "b9cd52d1cf927bf7e08582d46ab0bcf1d4fb5048") (:revdesc . "b9cd52d1cf92") (:keywords "sly") (:authors ("Javier PuercoPop Olaechea" . "pirata@gmail.com")) (:maintainers ("Javier PuercoPop Olaechea" . "pirata@gmail.com")) (:maintainer "Javier PuercoPop Olaechea" . "pirata@gmail.com"))]) + (smart-backspace . [(20171014 526) nil "Intellj like backspace" tar ((:url . "https://github.com/itome/smart-backspace") (:commit . "acb390628a181a993aa0d137624f2e5283efa6d9") (:revdesc . "acb390628a18") (: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"))]) + (smart-comment . [(20160322 1839) nil "Smarter commenting" tar ((:url . "https://github.com/paldepind/smart-comment") (:commit . "ad4e0de29115dc010733b9060d3dab02836b15e1") (:revdesc . "ad4e0de29115") (:keywords "lisp") (:authors ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainers ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainer "Simon Friis Vindum" . "simon@vindum.io"))]) + (smart-compile . [(20251123 1819) nil "An interface to `compile'" tar ((:url . "https://github.com/zenitani/elisp") (:commit . "a306b00bdf64470c9256b7ec5a5920b708b2b17a") (:revdesc . "a306b00bdf64") (:keywords "tools" "unix") (:authors ("Seiji Zenitani" . "zenitani@gmail.com")) (:maintainers ("Seiji Zenitani" . "zenitani@gmail.com")) (:maintainer "Seiji Zenitani" . "zenitani@gmail.com"))]) + (smart-cursor-color . [(20201207 2228) nil "Change cursor color dynamically" tar ((:url . "https://github.com/7696122/smart-cursor-color/") (:commit . "d532f0b27e37cbd3bfc0be09d0b54aa38f1648f1") (:revdesc . "d532f0b27e37") (:keywords "cursor" "color" "face"))]) + (smart-dash . [(20250101 2011) nil "Smart-Dash minor mode" tar ((:url . "https://github.com/malsyned/smart-dash") (:commit . "98ea891a885fbe54a754a46730be3527dfe24af3") (:revdesc . "98ea891a885f") (: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 ((:url . "https://github.com/leodag/smart-delete") (:commit . "b1f90b9510caf21d87ba26e30d56dfbaec92d4e9") (:revdesc . "b1f90b9510ca") (:keywords "emulations" "wp"))]) + (smart-forward . [(20140430 713) ((expand-region (0 8 0))) "Semantic navigation" tar ((:url . "https://github.com/magnars/smart-forward.el") (:commit . "7b6dbfdbd4b646376a567c70e1a161545431b72b") (:revdesc . "7b6dbfdbd4b6") (:keywords "navigation") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (smart-hungry-delete . [(20220516 1538) ((emacs (24 3))) "Smart hungry deletion of whitespace" tar ((:url . "https://github.com/hrehfeld/emacs-smart-hungry-delete") (:commit . "e06525cc1841805ebe470c876d6b966de90bc275") (:revdesc . "e06525cc1841") (:keywords "convenience") (:authors ("Hauke Rehfeld" . "emacs@haukerehfeld.de")) (:maintainers ("Hauke Rehfeld" . "emacs@haukerehfeld.de")) (:maintainer "Hauke Rehfeld" . "emacs@haukerehfeld.de"))]) + (smart-indent-rigidly . [(20141206 15) nil "Smart rigid indenting" tar ((:url . "https://github.com/re5et/smart-indent-rigidly") (:commit . "323d1fe4d0b81e598249aad01bc44adb180ece0e") (:revdesc . "323d1fe4d0b8") (:keywords "indenting" "coffee-mode" "haml-mode" "sass-mode"))]) + (smart-jump . [(20210304 844) ((emacs (25 1))) "Smart go to definition" tar ((:url . "https://github.com/jojojames/smart-jump") (:commit . "3392eb35e3cde37e6f5f2a48dc0db15ca535143c") (:revdesc . "3392eb35e3cd") (:keywords "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (smart-mark . [(20241104 1311) nil "Restore point after C-g when mark" tar ((:url . "https://github.com/victorteokw/smart-mark") (:commit . "d326cc77495f57beb4bc85614804976f1ae06fb7") (:revdesc . "d326cc77495f") (:keywords "mark" "restore") (:authors ("Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Kai Yu" . "yeannylam@gmail.com"))]) + (smart-mode-line . [(20240924 2322) ((emacs (24 3)) (rich-minority (0 1 1))) "A color coded smart mode-line" tar ((:url . "http://github.com/Malabarba/smart-mode-line") (:commit . "bbed708eb8393697e01ab2474dfb54d7c5ea7905") (:revdesc . "bbed708eb839") (:keywords "mode-line" "faces" "themes") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (smart-mode-line-atom-one-dark-theme . [(20250103 1324) ((emacs (24 3)) (smart-mode-line (2 10))) "Atom-one-dark theme for smart-mode-line" tar ((:url . "https://github.com/daviderestivo/smart-mode-line-atom-one-dark-theme") (:commit . "318865f15d33c480216221baff4d1ef85e07552d") (:revdesc . "318865f15d33") (:keywords "mode-line" "themes" "faces") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainers ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it"))]) + (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 ((:url . "http://github.com/Bruce-Connor/smart-mode-line") (:commit . "abcb0ab6f7110a03d6c7428bae67cf8731496433") (:revdesc . "abcb0ab6f711") (:keywords "mode-line" "faces" "themes") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainers ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com"))]) + (smart-newline . [(20131208 340) nil "Provide smart newline for one keybind" tar ((:url . "https://github.com/ainame/smart-newline.el") (:commit . "c50ab035839b307c66d439083b6761cb7db5e972") (:revdesc . "c50ab035839b"))]) + (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 ((:url . "https://github.com/uk-ar/smart-region") (:commit . "5a8017fd8e8dc3483865951c4942cab3f96f69f6") (:revdesc . "5a8017fd8e8d") (:keywords "marking" "region") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainers ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com"))]) + (smart-semicolon . [(20200909 1412) ((emacs (26))) "Insert semicolon smartly" tar ((:url . "https://github.com/iquiw/smart-semicolon") (:commit . "dd52a3e1a7b043fb88f799827c7b3e39f60a14f1") (:revdesc . "dd52a3e1a7b0") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com"))]) + (smart-shift . [(20251125 1349) nil "Smart shift text left/right" tar ((:url . "https://github.com/hbin/smart-shift") (:commit . "b9958f042f974e09a7e9442431a1f9cbd8404f8a") (:revdesc . "b9958f042f97") (:keywords "convenience" "tools") (:authors ("Bin Huang" . "huangbin88@foxmail.com")) (:maintainers ("Bin Huang" . "huangbin88@foxmail.com")) (:maintainer "Bin Huang" . "huangbin88@foxmail.com"))]) + (smart-tab . [(20210530 1743) ((emacs (24 3))) "Intelligent tab completion and indentation" tar ((:url . "https://git.genehack.net/genehack/smart-tab") (:commit . "2f1b4073904805c8454ebc9bc967b23836a2d577") (:revdesc . "2f1b40739048") (:keywords "extensions") (: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"))]) + (smart-tabs-mode . [(20200907 2025) nil "Intelligently indent with tabs, align with spaces!" tar ((:url . "http://www.emacswiki.org/emacs/SmartTabs") (:commit . "1044c17e42479de943e69cdeb85e4d05ad9cca8c") (:revdesc . "1044c17e4247") (:keywords "languages") (: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"))]) + (smart-window . [(20160717 130) ((cl-lib (0 5))) "Vim-like window controlling plugin" tar ((:url . "https://github.com/dryman/smart-window.el") (:commit . "5996461b7cbc5ab4509ac48537916eb29a8e4c16") (:revdesc . "5996461b7cbc") (:keywords "window") (:authors ("Felix Chern" . "idryman@gmail.com")) (:maintainers ("Felix Chern" . "idryman@gmail.com")) (:maintainer "Felix Chern" . "idryman@gmail.com"))]) + (smartparens . [(20250612 1050) ((dash (2 13 0))) "Automatic insertion, wrapping and paredit-like navigation with user defined pairs" tar ((:url . "https://github.com/Fuco1/smartparens") (:commit . "b629b4e893ba21ba5a381f6c0054bb72f8e96df2") (:revdesc . "b629b4e893ba") (:keywords "abbrev" "convenience" "editing") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (smartrep . [(20240416 2148) nil "Support sequential operation which omitted prefix keys" tar ((:url . "https://github.com/myuhe/smartrep.el") (:commit . "fdf135e3781b286174b5de4d613f12c318d2023c") (:revdesc . "fdf135e3781b") (:keywords "convenience") (:authors ("myuhe" . "yuhei.maeda_at_gmail.com")))]) + (smartscan . [(20170211 2033) nil "Jumps between other symbols found at point" tar ((:url . "https://github.com/mickeynp/smart-scan") (:commit . "234e077145710a174c20742de792b97ed2f965f6") (:revdesc . "234e07714571") (:keywords "extensions") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainers ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org"))]) + (smarty-mode . [(20100703 1158) nil "Major mode for editing smarty templates" tar ((:url . "none yet") (:commit . "3dfdfe1571f5e9ef55a29c51e5a80046d4cb7568") (:revdesc . "3dfdfe1571f5") (:keywords "smarty" "php" "languages" "templates"))]) + (smbc . [(20171229 1808) nil "View SMBC from Emacs" tar ((:url . "https://github.com/sakshamsharma/emacs-smbc") (:commit . "10538e3d575ba6ef3c94d555af2744b42dfd36c7") (:revdesc . "10538e3d575b") (:keywords "smbc" "webcomic") (:authors ("Saksham Sharma" . "saksham0808@gmail.com")) (:maintainers ("Saksham Sharma" . "saksham0808@gmail.com")) (:maintainer "Saksham Sharma" . "saksham0808@gmail.com"))]) + (smblog . [(20200424 938) ((emacs (24 3))) "Samba log viewer" tar ((:url . "http://github.com/aaptel/smblog-mode") (:commit . "fc949cff7051b31f0dbc7169774144533a27b92f") (:revdesc . "fc949cff7051") (:authors ("Aurélien Aptel" . "aaptel@suse.com")) (:maintainers ("Aurélien Aptel" . "aaptel@suse.com")) (:maintainer "Aurélien Aptel" . "aaptel@suse.com"))]) + (smeargle . [(20200323 533) ((emacs (24 3))) "Highlighting region by last updated time" tar ((:url . "https://github.com/emacsorphanage/smeargle") (:commit . "1c5c1e1d66aa96b818fbfcdf9fbec84e509b87be") (:revdesc . "1c5c1e1d66aa") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com"))]) + (smex . [(20151212 2209) ((emacs (24))) "M-x interface with Ido-style fuzzy matching" tar ((:url . "http://github.com/nonsequitur/smex/") (:commit . "55aaebe3d793c2c990b39a302eb26c184281c42c") (:revdesc . "55aaebe3d793") (:keywords "convenience" "usability") (:authors ("Cornelius Mika and contributors" . "cornelius.mika@gmail.com")) (:maintainers ("Cornelius Mika and contributors" . "cornelius.mika@gmail.com")) (:maintainer "Cornelius Mika and contributors" . "cornelius.mika@gmail.com"))]) + (smilefjes . [(20240826 2107) ((emacs (24 4)) (request (0 3 2)) (ht (2 3)) (dash (2 19 1)) (helm (3 8 6))) "View Norwegian Food Safety Authority restaurant ratings" tar ((:url . "https://github.com/themkat/smilefjes.el") (:commit . "c7e4ebb06215e67e8bdd8299b4cc7405fc861f5b") (:revdesc . "c7e4ebb06215"))]) + (smiles-mode . [(20220210 1413) nil "Major mode for SMILES" tar ((:url . "https://repo.or.cz/smiles-mode.git") (:commit . "950a8b3224f8f069c82faeb0282d041f872d5550") (:revdesc . "950a8b3224f8") (:keywords "smiles") (:authors (nil . "JohnKitchinjkitchin@andrew.cmu.edu")) (:maintainers (nil . "JohnKitchinjkitchin@andrew.cmu.edu")) (:maintainer nil . "JohnKitchinjkitchin@andrew.cmu.edu"))]) + (smithers . [(20210531 2232) ((emacs (26 1)) (dash (2 17 0)) (org (9 4 5))) "A startup message featuring Mr C.M. Burns" tar ((:url . "https://gitlab.com/mtekman/smithers.el") (:commit . "db9ed12a8d2c131b6d37b4e7aff01b8e3cec81a6") (:revdesc . "db9ed12a8d2c") (:keywords "games"))]) + (smithy-mode . [(20220619 1304) ((emacs (26 1))) "Major mode for editing Smithy IDL files" tar ((:url . "http://github.com/mnemitz/smithy-mode") (:commit . "7dff0e7a497a055577226c7ae7ecdeaf7078b4c1") (:revdesc . "7dff0e7a497a") (:keywords "tools" "languages" "smithy" "idl" "amazon") (:authors ("Matt Nemitz" . "matt.nemitz@gmail.com")) (:maintainers ("Matt Nemitz" . "matt.nemitz@gmail.com")) (:maintainer "Matt Nemitz" . "matt.nemitz@gmail.com"))]) + (sml-basis . [(20210518 2040) ((emacs (24 5))) "Standard ML Basis Library lookup" tar ((:url . "https://github.com/lassik/emacs-sml-basis") (:commit . "c048d575e30a20ec825fd0c5eb9c8a4428a43298") (:revdesc . "c048d575e30a") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (sml-modeline . [(20170614 2111) nil "Show position in a scrollbar like way in mode-line" tar ((:url . "http://bazaar.launchpad.net/~nxhtml/nxhtml/main/annotate/head%3A/util/sml-modeline.el") (:commit . "d2f9f70174c4cf68c67eb3bb8088235735e34d9a") (:revdesc . "d2f9f70174c4"))]) + (sml-ts-mode . [(20241015 632) ((emacs (29 1)) (sml-mode (6 12))) "SML major-mode using tree-sitter" tar ((:url . "https://github.com/nverno/sml-ts-mode") (:commit . "d2dabcc9d8f91eeee7048641e4c80fabb3583194") (:revdesc . "d2dabcc9d8f9") (:keywords "sml" "languages" "tree-sitter") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (smlfmt . [(20231102 853) ((emacs (24)) (reformatter (0 4))) "Format SML source code using the \"smlfmt\" program" tar ((:url . "https://github.com/diku-dk/smlfmt.el") (:commit . "7a70cce029a7c37c5e976ab6b426f62561e4e352") (:revdesc . "7a70cce029a7") (:keywords "files" "tools") (:authors ("Troels Henriksen" . "athas@sigkill")) (:maintainers ("Troels Henriksen" . "athas@sigkill")) (:maintainer "Troels Henriksen" . "athas@sigkill"))]) + (smmry . [(20240718 947) nil "SMMRY client" tar ((:url . "https://github.com/microamp/smmry.el") (:commit . "d3473b139430d221b4c4587dae685cd67a02c099") (:revdesc . "d3473b139430") (:keywords "api" "smmry") (:authors ("Sangho Na" . "sangho@nsh.nz")) (:maintainers ("Sangho Na" . "sangho@nsh.nz")) (:maintainer "Sangho Na" . "sangho@nsh.nz"))]) + (smog . [(20230530 843) ((emacs (24 1)) (org (8 1))) "Analyse the writing style, word use and readability of prose" tar ((:url . "https://github.com/zzkt/smog") (:commit . "2fc5fef0f5000027b3550495259a65966c68ec52") (:revdesc . "2fc5fef0f500") (:keywords "tools" "style" "readability" "prose") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainers ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am"))]) + (smooth-scroll . [(20240914 415) nil "Minor mode for smooth scrolling and in-place scrolling" tar ((:url . "http://www.emacswiki.org/emacs/download/smooth-scroll.el") (:commit . "d7b276fdb906708c26dccfdb520021f9b0eb9c6b") (:revdesc . "d7b276fdb906") (:keywords "convenience" "emulations" "frames") (:authors ("K-talo Miyazaki" . "KeitarodotMiyazakiatgmaildotcom")) (:maintainers ("K-talo Miyazaki" . "KeitarodotMiyazakiatgmaildotcom")) (:maintainer "K-talo Miyazaki" . "KeitarodotMiyazakiatgmaildotcom"))]) + (smooth-scrolling . [(20161002 1949) nil "Make emacs scroll smoothly" tar ((:url . "http://github.com/aspiers/smooth-scrolling/") (:commit . "2462c13640aa4c75ab3ddad443fedc29acf68f84") (:revdesc . "2462c13640aa") (:keywords "convenience") (: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"))]) + (smotitah . [(20150218 1030) nil "Modular emacs configuration framework" tar ((:url . "https://github.com/laynor/smotitah") (:commit . "f9ab562128a5460549d016913533778e8c94bcf3") (:revdesc . "f9ab562128a5") (:keywords "configuration") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainers ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))]) + (smtpmail-multi . [(20160218 2349) nil "Use different smtp servers for sending mail" tar ((:url . "https://github.com/vapniks/smtpmail-multi") (:commit . "81eabfe56f620ee044ff9dd52fa8b6148d0a9f30") (:revdesc . "81eabfe56f62") (:keywords "comm") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (smudge . [(20251224 1549) ((emacs (27 1)) (simple-httpd (1 5 1)) (request (0 3)) (oauth2 (0 18))) "Control the Spotify app" tar ((:url . "https://github.com/danielfm/smudge") (:commit . "dcca1b9ac15886060788df83c7da63faa5ae027f") (:revdesc . "dcca1b9ac158") (:keywords "multimedia" "music" "spotify" "smudge"))]) + (smyx-theme . [(20240914 1200) nil "Smyx Color Theme" tar ((:url . "https://github.com/tacit7/smyx") (:commit . "ce6dc4b1c25ff8c1d6c9b9015e0199355c46be4d") (:revdesc . "ce6dc4b1c25f") (:keywords "color" "theme" "smyx") (:authors ("Uriel G Maldonado" . "uriel781@gmail.com")) (:maintainers ("Uriel G Maldonado" . "uriel781@gmail.com")) (:maintainer "Uriel G Maldonado" . "uriel781@gmail.com"))]) + (snakemake-mode . [(20250204 207) ((emacs (27 1)) (transient (0 3 0))) "Major mode for editing Snakemake files" tar ((:url . "https://git.kyleam.com/snakemake-mode/about") (:commit . "e4751a951a53c4d4610b2eb17469a21177cab6bc") (:revdesc . "e4751a951a53") (:keywords "tools") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainers ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com"))]) + (snap-indent . [(20230704 1833) ((emacs (24 1))) "Simple automatic indentation" tar ((:url . "https://github.com/jeffvalk/snap-indent") (:commit . "c4e49295aa1a2678c0e9232c12448fd944aced8e") (:revdesc . "c4e49295aa1a") (:keywords "indent" "tools" "convenience") (:authors ("Jeff Valk" . "jv@jeffvalk.com")) (:maintainers ("Jeff Valk" . "jv@jeffvalk.com")) (:maintainer "Jeff Valk" . "jv@jeffvalk.com"))]) + (snapshot-timemachine . [(20250612 1320) ((emacs (28 1))) "Step through (Btrfs, ZFS, ...) snapshots of files" tar ((:url . "https://github.com/mrBliss/snapshot-timemachine") (:commit . "88af8c045e5274b06ddd6ca5e8c6a746cef776e0") (:revdesc . "88af8c045e52") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainers ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com"))]) + (snapshot-timemachine-rsnapshot . [(20170324 1213) ((snapshot-timemachine (20160222 132)) (seq (2 19))) "Rsnapshot backend for snapshot-timemachine" tar ((:url . "https://github.com/NicolasPetton/snapshot-timemachine-rsnapshot") (:commit . "72b0b700d80f1a0442e62bbbb6a0c8c59182f97f") (:revdesc . "72b0b700d80f") (: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 ((:url . "https://github.com/weijiangan/emacs-snazzy/") (:commit . "578d7ebc4ed91c0a630b652c4b6fdd54d9ae16cd") (:revdesc . "578d7ebc4ed9") (:keywords "faces" "theme" "color" "snazzy"))]) + (sniem . [(20250204 1138) ((emacs (27 1)) (s (2 12 0)) (dash (1 12 0))) "Hands-eased united editing method" tar ((:url . "https://github.com/SpringHan/sniem.git") (:commit . "89161d8b3c19ffba8b52411de36f28aec1e401f2") (:revdesc . "89161d8b3c19") (:keywords "convenience" "united-editing-method"))]) + (snitch . [(20210202 1730) ((emacs (27 1))) "An Emacs firewall" tar ((:url . "https://github.com/mrmekon/snitch-el") (:commit . "3b3e7f1bf612c4624764d1ec4b1a96e4d2850b05") (:revdesc . "3b3e7f1bf612") (:keywords "processes" "comm") (:authors ("Trevor Bentley" . "snitch.el@x.mrmekon.com")) (:maintainers ("Trevor Bentley" . "snitch.el@x.mrmekon.com")) (:maintainer "Trevor Bentley" . "snitch.el@x.mrmekon.com"))]) + (snoopy . [(20171008 2004) ((emacs (24)) (cl-lib (0 6))) "Minor mode for number row unshifted character insertion" tar ((:url . "https://github.com/anmonteiro/snoopy-mode") (:commit . "ec4123bdebfe0bb7bf4feaac2dc02b59caffe386") (:revdesc . "ec4123bdebfe") (:keywords "lisp") (:authors ("António Nuno Monteiro" . "anmonteiro@gmail.com")) (:maintainers ("António Nuno Monteiro" . "anmonteiro@gmail.com")) (:maintainer "António Nuno Monteiro" . "anmonteiro@gmail.com"))]) + (snow . [(20221226 2238) ((emacs (26 3))) "Let it snow in Emacs!" tar ((:url . "https://github.com/alphapapa/snow.el") (:commit . "be17977677fa29709a726715a1a1cba1bd299f68") (:revdesc . "be17977677fa") (:keywords "games") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (soar-mode . [(20190503 1843) nil "A major mode for the Soar language" tar ((:url . "https://github.com/adeschamps/soar-mode") (:commit . "ebb79789cd35530aea2c6d0eb4f4b280e97107d4") (:revdesc . "ebb79789cd35") (:keywords "languages" "soar"))]) + (soccer . [(20231108 1633) ((emacs (26 1)) (dash (2 19 1))) "Fixtures, results, table etc for soccer" tar ((:url . "https://github.com/md-arif-shaikh/soccer") (:commit . "96dd98a34238c8019d48507071df5d2b199360cd") (:revdesc . "96dd98a34238") (:keywords "games" "soccer" "football") (:authors ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainers ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainer "Md Arif Shaikh" . "arifshaikh.astro@gmail.com"))]) + (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 ((:url . "https://github.com/nlamirault/socyl") (:commit . "1ef2da42f66f3ab31a34131e51648f352416f0ba") (:revdesc . "1ef2da42f66f") (:keywords "ripgrep" "sift" "ack" "pt" "ag" "grep" "search") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (soft-charcoal-theme . [(20140420 1643) nil "Dark charcoal theme with soft colors" tar ((:url . "http://github.com/mswift42/soft-charcoal-theme") (:commit . "5607ab977fae6638e78b1495e02da8955c9ba19f") (:revdesc . "5607ab977fae"))]) + (soft-morning-theme . [(20150918 2041) nil "Emacs24 theme with a light background" tar ((:url . "http://github.com/mswift42/soft-morning-theme") (:commit . "c0f9c70c97ef2be2a093cf839c4bfe27740a111c") (:revdesc . "c0f9c70c97ef"))]) + (soft-stone-theme . [(20140614 835) ((emacs (24))) "Emacs 24 theme with a light background" tar ((:url . "http://github.com/mswift42/soft-stone-theme") (:commit . "fb475514cfb02cf30ce358a61c48e46614344d48") (:revdesc . "fb475514cfb0"))]) + (sol-mode . [(20250805 2103) ((emacs (30 1))) "Major mode for editing Solidity code" tar ((:url . "https://codeberg.org/nlordell/sol-mode") (:commit . "1379290f360fb3fea98ae397996b08d32372d77d") (:revdesc . "1379290f360f") (:keywords "solidity" "languages") (:authors ("Nicholas Rodrigues Lordello" . "n@lordello.net")) (:maintainers ("Nicholas Rodrigues Lordello" . "n@lordello.net")) (:maintainer "Nicholas Rodrigues Lordello" . "n@lordello.net"))]) + (solaire-mode . [(20251224 423) ((emacs (25 1)) (cl-lib (0 5))) "Make certain buffers grossly incandescent" tar ((:url . "https://github.com/hlissner/emacs-solaire-mode") (:commit . "e44f11a1ff7489ea7173119d62de99b88e29c918") (:revdesc . "e44f11a1ff74") (:keywords "dim" "bright" "window" "buffer" "faces") (:authors ("Henrik Lissner" . "http://github/hlissner")) (:maintainers ("Henrik Lissner" . "contact@henrik.io")) (:maintainer "Henrik Lissner" . "contact@henrik.io"))]) + (solarized-gruvbox-theme . [(20250305 936) ((emacs (24 1))) "Solarized Gruvbox theme" tar ((:url . "https://github.com/madara123pain/unique-emacs-theme-pack") (:commit . "43afeb68b3ba0394f8cc925ebb90e9a6620b4b28") (:revdesc . "43afeb68b3ba") (:keywords "faces" "theme" "solarized" "gruvbox" "dark"))]) + (solarized-theme . [(20250913 451) ((emacs (24 1))) "The Solarized color theme" tar ((:url . "http://github.com/bbatsov/solarized-emacs") (:commit . "65f6772119462f2e91a9d70f0c4e1085bddd29c9") (:revdesc . "65f677211946") (:keywords "convenience" "themes" "solarized") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev"))]) + (solidity-flycheck . [(20221024 220) ((flycheck (32 -4)) (solidity-mode (0 1 9)) (dash (2 17 0))) "Flycheck integration for solidity emacs mode" tar ((:url . "https://github.com/ethereum/emacs-solidity") (:commit . "8cb8ac6d1311f5bc893cd72ee96e3e335ee8b2a1") (:revdesc . "8cb8ac6d1311") (:keywords "languages" "solidity" "flycheck") (:authors ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainers ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas" . "lefteris@refu.co"))]) + (solidity-mode . [(20230628 1637) nil "Major mode for ethereum's solidity language" tar ((:url . "https://github.com/ethereum/emacs-solidity") (:commit . "8ba549e429e86778a0e079648f3bc3463fcb15f6") (:revdesc . "8ba549e429e8") (:keywords "languages" "solidity") (:authors ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainers ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas" . "lefteris@refu.co"))]) + (solo-jazz-theme . [(20220117 2009) ((emacs (24 1))) "The Solo-Jazz color theme" tar ((:url . "https://github.com/cstby/solo-jazz-emacs-theme") (:commit . "51d63d8a2c855f4ea79eef9fc9c8a5c9702642c4") (:revdesc . "51d63d8a2c85"))]) + (somafm . [(20250316 2337) ((emacs (26 1)) (dash (2 12 0)) (request (0 3 2)) (cl-lib (0 6 1))) "A simple soma.fm interface" tar ((:url . "https://github.com/artenator/somafm.el") (:commit . "549fea7df8f7bb3c70939275c04f88ff84e0b5a8") (:revdesc . "549fea7df8f7") (:keywords "multimedia") (:authors ("Arte Ebrahimi" . "")) (:maintainers ("Arte Ebrahimi" . "")) (:maintainer "Arte Ebrahimi" . ""))]) + (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 ((:url . "http://www.github.com/repl-electric/sonic-pi.el") (:commit . "9ae16d0fd4cba77ae0bedac83f2cb46569be6ade") (:revdesc . "9ae16d0fd4cb") (:keywords "sonicpi" "ruby") (:authors ("Joseph Wilk" . "joe@josephwilk.net")) (:maintainers ("Joseph Wilk" . "joe@josephwilk.net")) (:maintainer "Joseph Wilk" . "joe@josephwilk.net"))]) + (soong-mode . [(20221217 1243) ((emacs (27 1))) "Major mode for editing Soong build files" tar ((:url . "https://github.com/bobrofon/soong-mode") (:commit . "bf3dc1070b368b413958f54fbe9bcc2aaf77b56f") (:revdesc . "bf3dc1070b36") (:keywords "languages") (:authors ("Sergey Bobrenok" . "bobrofon@gmail.com")) (:maintainers ("Sergey Bobrenok" . "bobrofon@gmail.com")) (:maintainer "Sergey Bobrenok" . "bobrofon@gmail.com"))]) + (soothe-theme . [(20240415 837) ((emacs (24 3)) (autothemer (0 2))) "A dark colorful theme" tar ((:url . "https://github.com/emacsfodder/emacs-soothe-theme") (:commit . "a8d3d964cfe9fc2157f45d2d26647a450ed9161a") (:revdesc . "a8d3d964cfe9") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainers ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (sops . [(20251102 57) ((emacs (28 1))) "SOPS encrypt and decrypt without leaving the editor" tar ((:url . "http://github.com/djgoku/sops") (:commit . "7cce0d6800eff1e9c21ab43fffe1918bcc006e7d") (:revdesc . "7cce0d6800ef") (:keywords "convenience" "programming") (:authors ("Jonathan Carroll Otsuka" . "pitas.axioms0c@icloud.com")) (:maintainers ("Jonathan Carroll Otsuka" . "pitas.axioms0c@icloud.com")) (:maintainer "Jonathan Carroll Otsuka" . "pitas.axioms0c@icloud.com"))]) + (sorcery-theme . [(20210101 1352) ((autothemer (0 2))) "A D&D (Dark and Dusty) Theme" tar ((:url . "http://github.com/vxid/emacs-theme-sorcery") (:commit . "5a1c4445b9e6e09589a299a9962a6973272a0c2f") (:revdesc . "5a1c4445b9e6") (:authors ("Maxime Tréca" . "maxime@gmail.com")) (:maintainers ("Maxime Tréca" . "maxime@gmail.com")) (:maintainer "Maxime Tréca" . "maxime@gmail.com"))]) + (soria-theme . [(20250703 508) ((emacs (25 1))) "A xoria256 theme with some colors from openSUSE" tar ((:url . "https://github.com/mssola/soria") (:commit . "65581530155b097fc314a19b2851a7dffcfd3790") (:revdesc . "65581530155b") (:keywords "faces") (:authors ("Miquel Sabaté Solà" . "mikisabate@gmail.com")) (:maintainers ("Miquel Sabaté Solà" . "mikisabate@gmail.com")) (:maintainer "Miquel Sabaté Solà" . "mikisabate@gmail.com"))]) + (sort-words . [(20160929 1335) nil "Sort words in a selected region" tar ((:url . "http://github.org/dotemacs/sort-words.el") (:commit . "7b6e108f80237363faf7ec28b2c58dec270b8601") (:revdesc . "7b6e108f8023") (:keywords "tools") (:authors ("Aleksandar Simic" . "asimic@gmail.com")) (:maintainers ("Aleksandar Simic" . "asimic@gmail.com")) (:maintainer "Aleksandar Simic" . "asimic@gmail.com"))]) + (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 ((:url . "https://github.com/Malabarba/speed-of-thought-clojure") (:commit . "ceac82aa691e8d98946471be6aaff9c9a4603c32") (:revdesc . "ceac82aa691e") (:keywords "convenience" "clojure") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (sotlisp . [(20220909 803) ((emacs (24 1))) "Write lisp at the speed of thought" tar ((:url . "https://github.com/Malabarba/speed-of-thought-lisp") (:commit . "04186129f2dccf48e288639b78adeb9c0e94be54") (:revdesc . "04186129f2dc") (:keywords "convenience" "lisp") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainers ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (sound-wav . [(20240925 753) ((deferred (0 3 1)) (cl-lib (0 5))) "Play wav file" tar ((:url . "https://github.com/syohex/emacs-sound-wav") (:commit . "cf206c3b5b6e3f1531e3486aa9e214d11b638c4d") (:revdesc . "cf206c3b5b6e") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (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 ((:url . "https://github.com/thieman/soundcloud.el") (:commit . "f998d4276ea90258909c698f6a5a51fccb667c08") (:revdesc . "f998d4276ea9") (:keywords "soundcloud" "music" "audio") (:authors ("Travis Thieman" . "travis.thieman@gmail.com")) (:maintainers ("Travis Thieman" . "travis.thieman@gmail.com")) (:maintainer "Travis Thieman" . "travis.thieman@gmail.com"))]) + (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 ((:url . "https://github.com/r0man/soundklaus.el") (:commit . "15ce6e7f24a45e4f202d83cca9fa3bfdd94ca592") (:revdesc . "15ce6e7f24a4") (:keywords "soundcloud" "music" "emms") (:authors ("r0man" . "roman@burningswell.com")) (:maintainers ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com"))]) + (sourcekit . [(20210430 2155) ((emacs (24 3)) (dash (2 18 0)) (request (0 2 0))) "Library to interact with sourcekittendaemon" tar ((:url . "https://github.com/nathankot/company-sourcekit") (:commit . "a1860ad4dd3a542acd2fa0dfac2a388cbdf4af0c") (:revdesc . "a1860ad4dd3a") (:keywords "tools" "processes") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainers ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com"))]) + (sourcemap . [(20200315 1037) ((emacs (24 3))) "Sourcemap parser" tar ((:url . "https://github.com/syohex/emacs-sourcemap") (:commit . "bb2a56b2feb62b0c77d7f03ef2acd94f91be6b3f") (:revdesc . "bb2a56b2feb6") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (sourcepawn-mode . [(20230628 1821) nil "SourcePawn major mode" tar ((:url . "http://gammalevel.com/teamfortress2/sourcepawn-mode") (:commit . "1f100431f34b51c5374ea0dd71146c870555ea82") (:revdesc . "1f100431f34b") (:authors ("Aaron Griffith" . "aargri@gmail.com")) (:maintainers ("Aaron Griffith" . "aargri@gmail.com")) (:maintainer "Aaron Griffith" . "aargri@gmail.com"))]) + (sourcerer-theme . [(20161014 1625) nil "A version of sourcerer by xero" tar ((:url . "http://github.com/gilbertw1/sourcerer-emacs") (:commit . "c7f8e665d53bb48fb72f95f706710d53d24bd407") (:revdesc . "c7f8e665d53b") (:keywords "themes") (:authors ("Bryan Gilbert" . "gilbertw1@gmail.com")) (:maintainers ("Bryan Gilbert" . "gilbertw1@gmail.com")) (:maintainer "Bryan Gilbert" . "gilbertw1@gmail.com"))]) + (sozluk . [(20230730 1749) ((emacs (27 1)) (dash (2 11 0))) "An online Turkish dictionary" tar ((:url . "https://github.com/isamert/sozluk.el") (:commit . "420ace999fa0d27fbc6aa6011313488c8664a925") (:revdesc . "420ace999fa0") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com"))]) + (space-theming . [(20200502 1032) ((emacs (24))) "Easilly override theme faces" tar ((:url . "https://github.com/p3r7/space-theming") (:commit . "31dca6954df643255175f7df68a86892aa3c71a7") (:revdesc . "31dca6954df6") (:keywords "faces"))]) + (spacebar . [(20190719 334) ((eyebrowse (0 7 7)) (emacs (25 4 0))) "Workspaces Bar" tar ((:url . "https://github.com/matthias-margush/spacebar") (:commit . "2b2cd0e786877273103f048e62a06b0027deca2d") (:revdesc . "2b2cd0e78687") (:keywords "convenience") (:authors ("Matthias Margush" . "matthias.margush@gmail.com")) (:maintainers ("Matthias Margush" . "matthias.margush@gmail.com")) (:maintainer "Matthias Margush" . "matthias.margush@gmail.com"))]) + (spacegray-theme . [(20150719 1931) ((emacs (24 1))) "A Hyperminimal UI Theme" tar ((:url . "http://github.com/bruce/emacs-spacegray-theme") (:commit . "7f70ee36297e5ccf9bc90b1f81472024f5a7a749") (:revdesc . "7f70ee36297e") (:keywords "themes") (:authors ("Bruce Williams" . "brwcodes@gmail.com")) (:maintainers ("Bruce Williams" . "brwcodes@gmail.com")) (:maintainer "Bruce Williams" . "brwcodes@gmail.com"))]) + (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 ((:url . "https://github.com/TheBB/spaceline") (:commit . "086420d16e526c79b67fc1edec4c2ae1e699f372") (:revdesc . "086420d16e52") (:keywords "mode-line" "powerline" "spacemacs") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainers ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com"))]) + (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 ((:url . "https://github.com/domtronn/spaceline-all-the-icons.el") (:commit . "5afd48c10f1bd42d9b9648c5e64596b72f3e9042") (:revdesc . "5afd48c10f1b") (:keywords "convenience" "lisp" "tools") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainers ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com"))]) + (spacemacs-theme . [(20251221 1656) nil "Color theme with a dark and light versions" tar ((:url . "https://github.com/nashamri/spacemacs-theme") (:commit . "5635d6bbc76e6f06b99fa5dac6e6fd6675459ca6") (:revdesc . "5635d6bbc76e") (:keywords "color" "theme"))]) + (spaces . [(20170809 2208) nil "Create and switch between named window configurations" tar ((:url . "https://github.com/chumpage/chumpy-windows") (:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:revdesc . "6bdb51e9a346") (:keywords "frames" "convenience"))]) + (spanish-holidays . [(20241209 1141) nil "Spain holidays for calendar" tar ((:url . "https://gitlab.com/gnuhack/spanish-holidays") (:commit . "a596ec68f26c06063718dc83132e2843107cfe5c") (:revdesc . "a596ec68f26c") (:keywords "calendar") (:authors ("Carlos Pajuelo" . "carlospajuelo_@hotmail.com")) (:maintainers ("Carlos Pajuelo" . "carlospajuelo_@hotmail.com")) (:maintainer "Carlos Pajuelo" . "carlospajuelo_@hotmail.com"))]) + (spark . [(20230406 2307) ((emacs (24 3))) "Sparkline generation" tar ((:url . "https://github.com/alvinfrancis/spark") (:commit . "0e58e5122cbb46fb6d850e3b72487431a3696861") (:revdesc . "0e58e5122cbb") (:keywords "lisp" "data"))]) + (sparkline . [(20150101 1319) ((cl-lib (0 3))) "Make sparkline images from a list of numbers" tar ((:url . "https://github.com/woudshoo/sparkline") (:commit . "a2b5d817d272d6363b67ed8f8cc75499a19fa8d2") (:revdesc . "a2b5d817d272") (:keywords "extensions") (:authors ("Willem Rein Oudshoorn" . "woudshoo@xs4all.nl")) (:maintainers ("Willem Rein Oudshoorn" . "woudshoo@xs4all.nl")) (:maintainer "Willem Rein Oudshoorn" . "woudshoo@xs4all.nl"))]) + (sparkweather . [(20251218 1343) ((emacs (29 1))) "Weather forecasts with sparklines" tar ((:url . "https://github.com/aglet/sparkweather") (:commit . "88af2ea78f7a6d6c48fb24a298de24a36d88c94f") (:revdesc . "88af2ea78f7a") (:keywords "convenience" "weather") (:authors ("Robin Stephenson" . "robin@aglet.net")) (:maintainers ("Robin Stephenson" . "robin@aglet.net")) (:maintainer "Robin Stephenson" . "robin@aglet.net"))]) + (sparql-mode . [(20250508 1044) ((cl-lib (0 5)) (emacs (24 3))) "Edit and interactively evaluate SPARQL queries" tar ((:url . "https://github.com/ljos/sparql-mode") (:commit . "be606dc08d808e7d996e531d2878ce5a27ad37f4") (:revdesc . "be606dc08d80") (:authors ("Craig Andera" . "canderaatwangderadotcom")) (:maintainers ("Bjarte Johansen" . "BjartedotJohansenatgmaildotcom")) (:maintainer "Bjarte Johansen" . "BjartedotJohansenatgmaildotcom"))]) + (spatial-navigate . [(20251126 513) ((emacs (29 1))) "Directional navigation between white-space blocks" tar ((:url . "https://codeberg.org/ideasman42/emacs-spatial-navigate") (:commit . "51aee2673323bfe8afe3de30f81da860310b8d73") (:revdesc . "51aee2673323") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (spdx . [(20251204 102) ((emacs (24 4))) "Insert SPDX license and copyright headers" tar ((:url . "https://github.com/condy0919/spdx.el") (:commit . "ceda651cb18106404d7d8abfe10f2aa149ed19be") (:revdesc . "ceda651cb181") (:keywords "license" "tools") (:authors ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainers ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainer "Zhiwei Chen" . "condy0919@gmail.com"))]) + (speech-tagger . [(20170728 1829) ((cl-lib (0 5))) "Tag parts of speech using coreNLP" tar ((:url . "https://github.com/cosmicexplorer/speech-tagger") (:commit . "61955b40d4e8b09e66a3e8033e82893f81657c06") (:revdesc . "61955b40d4e8") (:keywords "speech" "tag" "nlp" "language" "corenlp" "parsing" "natural") (:authors ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainers ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Danny McClanahan" . "danieldmcclanahan@gmail.com"))]) + (speechd-el . [(20250118 1141) nil "Client to speech synthesizers and Braille displays" tar ((:url . "https://github.com/brailcom/speechd-el") (:commit . "0e509d392c7f82ca2451a59b97d551382136d2d5") (:revdesc . "0e509d392c7f") (:authors ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainers ("Milan Zamazal" . "pdm@zamazal.org")) (:maintainer "Milan Zamazal" . "pdm@zamazal.org"))]) + (speed-type . [(20251223 2332) ((emacs (27 1)) (compat (29 1 3))) "Practice touch and speed typing" tar ((:url . "https://github.com/dakra/speed-type") (:commit . "b87d8d50bbe247e804d3b9a92bb0fc698770e486") (:revdesc . "b87d8d50bbe2") (:keywords "games") (:maintainers ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my"))]) + (speedbar-git-respect . [(20200901 246) ((f (0 8 0)) (emacs (25 1))) "Particular respect git repo in speedbar" tar ((:url . "https://github.com/ukari/speedbar-git-respect") (:commit . "dd8f0849fc1dd21b42380e1a8c28a9a29acd9511") (:revdesc . "dd8f0849fc1d") (:authors ("Muromi Ukari" . "chendianbuji@gmail.com")) (:maintainers ("Muromi Ukari" . "chendianbuji@gmail.com")) (:maintainer "Muromi Ukari" . "chendianbuji@gmail.com"))]) + (speeddating . [(20180319 723) ((emacs (25))) "Increase date and time at point" tar ((:url . "https://github.com/xuchunyang/emacs-speeddating") (:commit . "eeaf90cd10e376bff5a295590a3d5f7fd1402523") (:revdesc . "eeaf90cd10e3") (:keywords "date" "time") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (spell-fu . [(20251126 529) ((emacs (29 1))) "Fast & light spelling highlighter" tar ((:url . "https://codeberg.org/ideasman42/emacs-spell-fu") (:commit . "437f594615c590c87cfb040b669cba7ca66e1f91") (:revdesc . "437f594615c5") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (sphinx-doc . [(20210213 1250) ((s (1 9 0)) (cl-lib (0 5)) (dash (2 10 0))) "Sphinx friendly docstrings for Python functions" tar ((:url . "https://github.com/naiquevin/sphinx-doc.el") (:commit . "1eda612a44ef027e5229895daa77db99a21b8801") (:revdesc . "1eda612a44ef") (:keywords "sphinx" "python") (:authors ("Vineet Naik" . "naikvin@gmail.com")) (:maintainers ("Vineet Naik" . "naikvin@gmail.com")) (:maintainer "Vineet Naik" . "naikvin@gmail.com"))]) + (sphinx-frontend . [(20161025 758) nil "Launch build process for rst documents via sphinx" tar ((:url . "https://github.com/kostafey/sphinx-frontend") (:commit . "0cbb03361c245382d3e679dded30c4fc1713c252") (:revdesc . "0cbb03361c24") (:keywords "compile" "sphinx" "restructuredtext") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com"))]) + (sphinx-mode . [(20250511 2023) ((dash (2 14 1)) (f (0 20))) "Minor mode providing sphinx support" tar ((:url . "https://github.com/Fuco1/sphinx-mode") (:commit . "038a9195b00636d38aa2fc3cf6cbff5cf84e0561") (:revdesc . "038a9195b006") (:keywords "languages") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (spice-mode . [(20220210 1414) ((emacs (24 3))) "Major mode for SPICE" tar ((:url . "https://repo.or.cz/spice-mode.git") (:commit . "f55c2b6dd35caace0ec7250b5c7b5d119235a23d") (:revdesc . "f55c2b6dd35c") (:keywords "spice" "spice2g6" "spice3" "eldo" "hspice" "layla" "mondriaan" "fasthenry" "cdl" "spectre compatibility" "netlist editing") (:authors ("Geert A. M. Van der Plas 1999-" . "geert_vanderplas@email.com") ("Emmanuel Rouat 1997-" . "emmanuel.rouat@wanadoo.fr") ("MIT AI Lab 1994" . "cvieri@ai.mit.edu")) (:maintainers ("Geert A. M. Van der Plas" . "geert_vanderplas@email.com")) (:maintainer "Geert A. M. Van der Plas" . "geert_vanderplas@email.com"))]) + (spider-man-theme . [(20250305 936) ((emacs (24 1))) "A Vibrant Spider-Man Inspired Theme" tar ((:url . "https://github.com/madara123pain/unique-emacs-theme-pack") (:commit . "43afeb68b3ba0394f8cc925ebb90e9a6620b4b28") (:revdesc . "43afeb68b3ba") (:keywords "faces" "theme" "spiderman" "dark" "red" "blue"))]) + (splitjoin . [(20150505 1432) ((cl-lib (0 5))) "Transition between multiline and single-line code" tar ((:url . "https://github.com/syohex/emacs-splitjoin") (:commit . "39a77f1c6c7406e79095eb0385667097172a770c") (:revdesc . "39a77f1c6c74") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (splitter . [(20170809 2208) nil "Manage window splits" tar ((:url . "https://github.com/chumpage/chumpy-windows") (:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:revdesc . "6bdb51e9a346") (:keywords "frames" "convenience"))]) + (splunk-mode . [(20241002 1040) ((emacs (27 1))) "Major Mode for editing Splunk SPL source code" tar ((:url . "https://github.com/jakewilliami/splunk-mode/") (:commit . "bc0ad3ed26e2f6d46c430a3f1ab86c93c4483403") (:revdesc . "bc0ad3ed26e2") (:keywords "languages" "splunk" "mode" "query") (:authors ("Jake Ireland" . "jakewilliami@icloud.com")) (:maintainers ("Jake Ireland" . "jakewilliami@icloud.com")) (:maintainer "Jake Ireland" . "jakewilliami@icloud.com"))]) + (spotify . [(20250106 1015) ((cl-lib (0 5))) "Control the spotify application from emacs" tar ((:url . "https://codeberg.org/rwv/spotify-el") (:commit . "d918b5187638e0c44a2a2584f3980244b6aae3fa") (:revdesc . "d918b5187638") (:keywords "convenience"))]) + (spotlight . [(20200109 2137) ((emacs (24 1)) (swiper (0 6 0)) (counsel (0 6 0))) "Search files with Mac OS X spotlight" tar ((:url . "http://www.pragmaticemacs.com") (:commit . "ea71f4fd380c51e50c47bb25855af4f40e4d8da0") (:revdesc . "ea71f4fd380c") (:keywords "search" "external") (:authors ("Ben Maughan" . "benmaughan@gmail.com")) (:maintainers ("Ben Maughan" . "benmaughan@gmail.com")) (:maintainer "Ben Maughan" . "benmaughan@gmail.com"))]) + (spray . [(20160304 2220) nil "A speed reading mode" tar ((:url . "https://github.com/ian-kelling/spray") (:commit . "69fe48e7bb079e3011476b9f4eb6ac9ae94d6d9b") (:revdesc . "69fe48e7bb07") (:keywords "convenience") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainers ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org"))]) + (springboard . [(20170106 755) ((helm (1 6 9))) "Temporarily change default-directory for one command" tar ((:url . "https://github.com/jwiegley/springboard") (:commit . "263a8cd4582c81bfc29d7db37d5267e2488b148c") (:revdesc . "263a8cd4582c") (:keywords "helm") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainers ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com"))]) + (sprintly-mode . [(20121006 534) ((furl (0 0 2))) "Major mode for dealing with sprint.ly" tar ((:url . "https://github.com/sprintly/sprintly-mode") (:commit . "6695892bae5860b5268bf3ae62be990ee9b63c11") (:revdesc . "6695892bae58") (:authors ("Justin Lilly" . "justin@justinlilly.com")) (:maintainers ("Justin Lilly" . "justin@justinlilly.com")) (:maintainer "Justin Lilly" . "justin@justinlilly.com"))]) + (sproto-mode . [(20151115 1805) nil "Major mode for editing sproto" tar ((:url . "https://github.com/m2q1n9/sproto-mode") (:commit . "1753277d9f2163fb3bc58b983a9892831cf9874b") (:revdesc . "1753277d9f21") (:keywords "sproto"))]) + (sprunge . [(20160301 243) ((request (0 2 0)) (cl-lib (0 5))) "Upload pastes to sprunge.us" tar ((:url . "https://github.com/tomjakubowski/sprunge.el") (:commit . "0fd386b8b29c4175022a04ad70ea5643185b6726") (:revdesc . "0fd386b8b29c") (:keywords "tools"))]) + (spu . [(20161214 324) ((emacs (24 4)) (signal (1 0)) (timp (1 2 0))) "Silently upgrade package in the background" tar ((:url . "https://github.com/mola-T/spu") (:commit . "41eec86b595816e3852e8ad1a8e07e51a27fd065") (:revdesc . "41eec86b5958") (:keywords "convenience" "package") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainers ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz"))]) + (sq . [(20250522 1012) ((emacs (24 1))) "Bindings for Sequoia PGP's cli" tar ((:url . "https://gitlab.com/sequoia-pgp/sqel") (:commit . "2871a8d0680ceb1d8de28a52bd8b2241d0691c02") (:revdesc . "2871a8d0680c") (:keywords "tools" "data" "mail") (:authors ("Justus Winter" . "justus@sequoia-pgp.org")) (:maintainers ("Justus Winter" . "justus@sequoia-pgp.org")) (:maintainer "Justus Winter" . "justus@sequoia-pgp.org"))]) + (sql-clickhouse . [(20191209 1443) ((emacs (24))) "Support ClickHouse as SQL interpreter" tar ((:url . "https://github.com/leethargo/sql-clickhouse") (:commit . "8403a4a5d332dbb6459b7fbce6ea95c36d390a5b") (:revdesc . "8403a4a5d332") (:authors ("Robert Schwarz" . "mail@rschwarz.net")) (:maintainers ("Robert Schwarz" . "mail@rschwarz.net")) (:maintainer "Robert Schwarz" . "mail@rschwarz.net"))]) + (sql-impala . [(20250616 110) nil "Comint support for Cloudera Impala" tar ((:url . "https://github.com/jterk/sql-impala") (:commit . "8968be95e493da3a3cc445e44a852186fa37df6b") (:revdesc . "8968be95e493") (:keywords "sql" "impala") (:authors ("Jason Terk" . "jason@goterkyourself.com")) (:maintainers ("Jason Terk" . "jason@goterkyourself.com")) (:maintainer "Jason Terk" . "jason@goterkyourself.com"))]) + (sql-presto . [(20190113 1742) ((emacs (24 4))) "[No description available]" tar ((:url . "https://github.com/kat-co/sql-prestodb") (:commit . "bcda455e300a1af75c7bb805882329bc844703b2") (:revdesc . "bcda455e300a") (:keywords "sql" "presto" "database") (: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"))]) + (sql-sqlline . [(20231109 2111) ((emacs (24 4))) "Adds SQLLine support to SQLi mode" tar ((:url . "https://gitlab.com/matteoredaelli/sql-sqlline") (:commit . "3d540a8cc9c6f816b241913042008f09323455af") (:revdesc . "3d540a8cc9c6") (:keywords "languages") (:authors ("Matteo Redaelli" . "matteo.redaelli@gmail.com")) (:maintainers ("Matteo Redaelli" . "matteo.redaelli@gmail.com")) (:maintainer "Matteo Redaelli" . "matteo.redaelli@gmail.com"))]) + (sql-trino . [(20220826 632) ((emacs (24 4))) "Adds Trino support to SQLi mode" tar ((:url . "https://github.com/regadas/sql-trino") (:commit . "624a879ec0d03cae8a92f26d21d88c831e15eb41") (:revdesc . "624a879ec0d0") (:keywords "tools") (:authors ("Filipe Regadas" . "oss@regadas.email")) (:maintainers ("Filipe Regadas" . "oss@regadas.email")) (:maintainer "Filipe Regadas" . "oss@regadas.email"))]) + (sqlformat . [(20240325 1006) ((emacs (24 3)) (reformatter (0 3))) "Reformat SQL using sqlformat or pgformatter" tar ((:url . "https://github.com/purcell/sqlformat") (:commit . "f1c8f864f11f4af65551de445dcf65543be0583b") (:revdesc . "f1c8f864f11f") (:keywords "languages") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (sqlite-mode-extras . [(20250827 1317) ((emacs (29 1))) "Extensions for sqlite-mode" tar ((:url . "https://github.com/xenodium/sqlite-mode-extras") (:commit . "83881ac1298eb15aaded2d579b59d7d9d25e403b") (:revdesc . "83881ac1298e"))]) + (sqlite3 . [(20251014 536) ((emacs (25 1))) "Direct access to the core SQLite3 API" tar ((:url . "https://github.com/pekingduck/emacs-sqlite3-api") (:commit . "a6376d769cf0749930b9bc00170e962029210406") (:revdesc . "a6376d769cf0") (:keywords "comm" "data" "sql") (:authors ("Y. N. Lo" . "elisp@fastmail.com")) (:maintainers ("Y. N. Lo" . "elisp@fastmail.com")) (:maintainer "Y. N. Lo" . "elisp@fastmail.com"))]) + (sqlup-mode . [(20170610 1537) nil "Upcase SQL words for you" tar ((:url . "https://github.com/trevoke/sqlup-mode.el") (:commit . "04970977b4abb4d44301651618bbf1cdb0b263dd") (:revdesc . "04970977b4ab") (:keywords "sql" "tools" "redis" "upcase") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainers ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com"))]) + (squirrel-mode . [(20221227 232) ((emacs (24 3))) "A major mode for the Squirrel programming language" tar ((:url . "https://github.com/thechampagne/squirrel-mode") (:commit . "1af79dfe70c4c8e6f0f144bfd2eb65c077aca785") (:revdesc . "1af79dfe70c4") (:keywords "files" "squirrel"))]) + (sr-speedbar . [(20220705 1231) nil "Same frame speedbar" tar ((:url . "http://www.emacswiki.org/emacs/download/sr-speedbar.el") (:commit . "73ecfc21cf38f0cb1dfbbebebdc3cf573eccf7d2") (:revdesc . "73ecfc21cf38") (:keywords "speedbar" "sr-speedbar.el") (:authors ("Sebastian Rose" . "sebastian_rose@gmx.de")) (:maintainers ("Sebastian Rose" . "sebastian_rose@gmx.de") ("Peter Lunicks" . "plunix@users.sourceforge.net")) (:maintainer "Sebastian Rose" . "sebastian_rose@gmx.de"))]) + (srcery-theme . [(20250901 1751) ((emacs (24))) "Dark color theme" tar ((:url . "https://github.com/srcery-colors/srcery-emacs") (:commit . "eee86865bb7baa8f015ab57a42d9c12e51b8b6fb") (:revdesc . "eee86865bb7b") (:keywords "faces"))]) + (srefactor . [(20230504 617) ((emacs (24 4))) "A refactoring tool based on Semantic parser framework" tar ((:url . "https://github.com/tuhdo/semantic-refactor") (:commit . "95c70a94b5aad4c85b35569e2f2325047791153a") (:revdesc . "95c70a94b5aa") (:keywords "c" "languages" "tools") (:authors ("Do Hoang" . "tuhdo1710@gmail.com")))]) + (srfi . [(20251223 141) ((emacs (25 1))) "Scheme Requests for Implementation browser" tar ((:url . "https://github.com/srfi-explorations/emacs-srfi") (:commit . "3cc3a7aad81b0114d5fb0c4cc945bd47ef406e40") (:revdesc . "3cc3a7aad81b") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (srv . [(20180715 1959) ((emacs (24 3))) "Perform SRV DNS requests" tar ((:url . "https://github.com/legoscia/srv.el") (:commit . "714387d5a5cf34d8d8cd96bdb1f9cb8ded823ff7") (:revdesc . "714387d5a5cf") (:keywords "comm") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainers ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com"))]) + (ssass-mode . [(20200211 132) ((emacs (24 3))) "Edit Sass without a Turing Machine" tar ((:url . "http://github.com/AdamNiederer/ssass-mode") (:commit . "96f557887ad97a0066a60c54f92b7234b8407016") (:revdesc . "96f557887ad9") (:keywords "languages" "sass") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com"))]) + (ssh . [(20120904 2042) nil "Support for remote logins using ssh" tar ((:url . "https://codeberg.org/emacs-weirdware-abandoned/ssh") (:commit . "c17cf5b43df8ac4662a0580f85898e1f078df0d1") (:revdesc . "c17cf5b43df8") (:keywords "unix" "comm") (:authors ("Noah Friedman" . "friedman@splode.com")) (:maintainers ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com"))]) + (ssh-agency . [(20251103 1834) ((emacs (26 1))) "Manage ssh-agent from Emacs" tar ((:url . "https://github.com/magit/ssh-agency") (:commit . "2a6e1784b42b6179da11c6c1077faaa0eb484e0d") (:revdesc . "2a6e1784b42b") (:authors ("Noam Postavsky" . "npostavs@user.sourceforge.net")) (:maintainers ("Noam Postavsky" . "npostavs@user.sourceforge.net")) (:maintainer "Noam Postavsky" . "npostavs@user.sourceforge.net"))]) + (ssh-config-mode . [(20250101 820) ((emacs (24 3))) "Mode for fontification of ~/.ssh/config" tar ((:url . "https://github.com/peterhoeg/ssh-config-mode-el") (:commit . "d0596f5fbeab3d2c3c30eb83527316403bc5b2f7") (:revdesc . "d0596f5fbeab") (:keywords "comm" "files") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainers ("Peter Hoeg" . "peter@hoeg.com")) (:maintainer "Peter Hoeg" . "peter@hoeg.com"))]) + (ssh-tunnels . [(20220721 1242) ((cl-lib (0 5)) (emacs (24))) "Manage SSH tunnels" tar ((:url . "http://github.com/death/ssh-tunnels") (:commit . "5010d779edef33f869065231b99d74723c9c7eaf") (:revdesc . "5010d779edef") (:keywords "tools" "convenience") (:authors ("death" . "github.com/death")) (:maintainers ("death" . "github.com/death")) (:maintainer "death" . "github.com/death"))]) + (stan-mode . [(20211129 2051) ((emacs (24 4))) "Major mode for editing Stan files" tar ((:url . "https://github.com/stan-dev/stan-mode/tree/master/stan-mode") (:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:revdesc . "150bbbe5fd3a") (:keywords "languages" "c") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Daniel Lee" . "bearlee@alum.mit.edu") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainers ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu"))]) + (stan-snippets . [(20211129 2051) ((emacs (24 3)) (stan-mode (10 3 0)) (yasnippet (0 8 0))) "Yasnippets for Stan" tar ((:url . "https://github.com/stan-dev/stan-mode/tree/master/stan-snippets") (:commit . "150bbbe5fd3ad2b5a3dbfba9d291e66eeea1a581") (:revdesc . "150bbbe5fd3a") (:keywords "languages" "tools") (: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"))]) + (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 ((:url . "https://github.com/lafrenierejm/standard-dirs.el") (:commit . "e37b7e1c714c7798cd8e3a6569e4d71b96718a60") (:revdesc . "e37b7e1c714c") (:keywords "files") (:authors ("Joseph M LaFreniere" . "joseph@lafreniere.xyz")) (:maintainers ("Joseph M LaFreniere" . "joseph@lafreniere.xyz")) (:maintainer "Joseph M LaFreniere" . "joseph@lafreniere.xyz"))]) + (standoff-mode . [(20210810 1814) nil "Create stand-off markup, also called external markup" tar ((:url . "https://github.com/lueck/standoff-mode") (:commit . "5e603092410d9c393d19050bcbed3014a379f0e6") (:revdesc . "5e603092410d") (:keywords "text" "annotations" "ner" "humanities") (:authors ("Christian Lück" . "christian.lueck@ruhr-uni-bochum.de")) (:maintainers ("Christian Lück" . "christian.lueck@ruhr-uni-bochum.de")) (:maintainer "Christian Lück" . "christian.lueck@ruhr-uni-bochum.de"))]) + (starhugger . [(20250216 948) ((emacs (28 2)) (compat (29 1 4 0)) (dash (2 18 0)) (s (1 13 1)) (spinner (1 7 4)) (request (0 3 2))) "Hugging Face/AI-powered text & code completion client" tar ((:url . "https://gitlab.com/daanturo/starhugger.el") (:commit . "c9753808184eaa9328b6ada18bfe418150b92eac") (:revdesc . "c9753808184e") (:keywords "completion" "convenience" "languages"))]) + (starling . [(20251029 707) ((emacs (29 1)) (plz (0 7 2))) "Starling bank interaction" tar ((:url . "https://codeberg.org/draxil/starling-el") (:commit . "298186dc003052051cbcac08b270afb2b1f4f2b9") (:revdesc . "298186dc0030") (:keywords "data" "applications" "banking") (:authors ("Joe Higton" . "draxil@gmail.com")) (:maintainers ("Joe Higton" . "draxil@gmail.com")) (:maintainer "Joe Higton" . "draxil@gmail.com"))]) + (starlit-theme . [(20251221 2342) ((emacs (25 1))) "Deep blue dark theme with bright colors from the starlit sky" tar ((:url . "https://github.com/SFTtech/starlit-emacs") (:commit . "fe825da76006ba92ed5752f3d573c49014ab8107") (:revdesc . "fe825da76006") (:keywords "faces") (:authors ("Jonas Jelten" . "jj@sft.lol")) (:maintainers ("Jonas Jelten" . "jj@sft.lol")) (:maintainer "Jonas Jelten" . "jj@sft.lol"))]) + (start-menu . [(20160426 1225) ((cl-lib (0 5)) (config-parser (0 1))) "Start-menu for executing external program like in windows" tar ((:url . "https://github.com/lujun9972/el-start-menu") (:commit . "f7d33fed7ad2dc61156f1c1cff9e1805366fbd69") (:revdesc . "f7d33fed7ad2") (:keywords "convenience" "menu") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (stash . [(20151117 1427) nil "Lightweight persistent caching" tar ((:url . "https://www.github.com/vermiculus/stash.el/") (:commit . "c2e494d20c752b80ebbdffbf66687b3cdfc425ad") (:revdesc . "c2e494d20c75") (:keywords "extensions" "data" "internal" "lisp") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com"))]) + (state . [(20200727 1227) ((emacs (24))) "Quick navigation between workspaces" tar ((:url . "https://github.com/thisirs/state.git") (:commit . "8cd9210f17c1b134274a7352b996839aed9a7d8c") (:revdesc . "8cd9210f17c1") (:keywords "convenience" "workspaces") (:authors ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainers ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainer "Sylvain Rousseau" . "thisirsatgmaildotcom"))]) + (status . [(20151230 1408) nil "This package adds support for status icons to Emacs" tar ((:url . "https://github.com/tromey/emacs-status") (:commit . "b62c74bf272566f82a68622f29fb9edafea0f241") (:revdesc . "b62c74bf2725") (:keywords "frames" "multimedia") (:authors ("Tom Tromey" . "tom@tromey.com")) (:maintainers ("Tom Tromey" . "tom@tromey.com")) (:maintainer "Tom Tromey" . "tom@tromey.com"))]) + (steam . [(20220218 1707) ((cl-lib (0 5))) "Organize and launch Steam games" tar ((:url . "http://github.com/Kungsgeten/steam.el") (:commit . "20aa58c5ccd85f6c4f288a14e79adc66e691cd23") (:revdesc . "20aa58c5ccd8") (:keywords "games"))]) + (stem . [(20131102 1109) nil "Routines for stemming" tar ((:url . "https://github.com/yuutayamada/stem") (:commit . "dd704c3447bd5d3f5ac0a4840f8987d4f855d87e") (:revdesc . "dd704c3447bd") (:keywords "stemming") (: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"))]) + (stem-english . [(20180109 358) ((emacs (24 3))) "- routines for stemming English word" tar ((:url . "http://github.com/kawabata/stem-english") (:commit . "c9fc4c6ed6bf82382e479dae80912f4ae17d31f4") (:revdesc . "c9fc4c6ed6bf") (:keywords "text") (:authors ("Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (stem-reading-mode . [(20220522 1053) ((emacs (25 1))) "Highlight word stems for speed-reading" tar ((:url . "https://gitlab.com/wavexx/stem-reading-mode.el") (:commit . "6efc9962e3a19a452c7ab9636cf1e2566a51bd38") (:revdesc . "6efc9962e3a1") (:keywords "convenience" "wp") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainers ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (stgit . [(20251110 503) nil "Major mode for StGit interaction" tar ((:url . "http://stacked-git.github.io") (:commit . "020140581698f62d846c995ee6e3bebe0c20ff14") (:revdesc . "020140581698") (:authors ("David Kågedal" . "davidk@lysator.liu.se")) (:maintainers ("David Kågedal" . "davidk@lysator.liu.se")) (:maintainer "David Kågedal" . "davidk@lysator.liu.se"))]) + (sticky . [(20170926 36) nil "Sticky key for capital letters" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sticky.el") (:commit . "fec4e1af38f17f5cd80eca361d8e8ef8772db366") (:revdesc . "fec4e1af38f1") (:keywords "convenience") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (sticky-scroll-mode . [(20241213 1543) ((emacs (29 4))) "Sticky scrolling" tar ((:url . "https://github.com/jclasley/sticky-mode") (:commit . "a1acf1065f88a586770d0eeddec376907d8320c6") (:revdesc . "a1acf1065f88") (:keywords "convenience" "extensions" "tools") (:authors ("Jon Lasley" . "jon.lasley+sticky@gmail.com")) (:maintainers ("Jon Lasley" . "jon.lasley+sticky@gmail.com")) (:maintainer "Jon Lasley" . "jon.lasley+sticky@gmail.com"))]) + (sticky-shell . [(20240928 427) ((emacs (25 1))) "Minor mode to keep track of previous prompt in your shell" tar ((:url . "https://github.com/andyjda/sticky-shell") (:commit . "2aec19f60539faf21f567e89701a8e28492eccd1") (:revdesc . "2aec19f60539") (:keywords "processes" "terminals" "tools") (:authors ("Andrew De Angelis" . "bobodeangelis@gmail.com")) (:maintainers ("Andrew De Angelis" . "bobodeangelis@gmail.com")) (:maintainer "Andrew De Angelis" . "bobodeangelis@gmail.com"))]) + (stickyfunc-enhance . [(20150429 1814) ((emacs (24 3))) "An enhancement to stock `semantic-stickyfunc-mode'" tar ((:url . "https://github.com/tuhdo/semantic-stickyfunc-enhance") (:commit . "13bdba51fcd83ccbc3267959d23afc94d458dcb0") (:revdesc . "13bdba51fcd8") (:keywords "c" "languages" "tools") (:authors ("Do Hoang" . "tuhdo1710@gmail.com")))]) + (stillness-mode . [(20250307 1608) ((emacs (26 1)) (dash (2 18 0))) "Prevent windows from jumping on minibuffer activation" tar ((:url . "https://github.com/neeasade/stillness-mode.el") (:commit . "05029febdb451941ed218e6ddbef5294776e31d4") (:revdesc . "05029febdb45") (:keywords "convenience"))]) + (stimmung-themes . [(20250915 1420) ((emacs (25))) "Themes tuned to inner harmonies" tar ((:url . "https://github.com/motform/stimmung-themes") (:commit . "bb3410593bb7ecf3c4094396f488e5c64efdb051") (:revdesc . "bb3410593bb7") (:keywords "faces"))]) + (stock-ticker . [(20150204 1052) ((s (1 9 0)) (request (0 2 0))) "Show stock prices in mode line" tar ((:url . "https://github.com/hagleitn/stock-ticker") (:commit . "74251cc810604af75f48333d51133326c053dd16") (:revdesc . "74251cc81060") (:keywords "comms"))]) + (stock-tracker . [(20250206 814) ((emacs (27 1)) (dash (2 16 0)) (async (1 9 5))) "Track stock price" tar ((:url . "https://github.com/beacoder/stock-tracker") (:commit . "51963a654a1199ec23f0938c247b1411fee85c6f") (:revdesc . "51963a654a11") (:keywords "convenience" "stock" "finance") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainers ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com"))]) + (strace-mode . [(20171116 2039) nil "Strace output syntax highlighting" tar ((:url . "https://github.com/pkmoore/strace-mode") (:commit . "2901baa968d5180ab985ac40ca22cc20914d01f5") (:revdesc . "2901baa968d5") (:keywords "languages") (:authors ("Preston Moore" . "(prestonkmoore@gmail.com)")) (:maintainers ("Preston Moore" . "(prestonkmoore@gmail.com)")) (:maintainer "Preston Moore" . "(prestonkmoore@gmail.com)"))]) + (streak . [(20240106 2145) ((emacs (27 1))) "Track a daily streak in your Mode Line" tar ((:url . "https://github.com/fosskers/streak") (:commit . "2d56788cbbf6114e61c85dd57b05133f8f351ac6") (:revdesc . "2d56788cbbf6") (:keywords "calendar") (:authors ("Colin Woodbury" . "https://www.fosskers.ca")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca"))]) + (streamlink . [(20210811 1429) ((s (1 12 0))) "A major mode for streamlink output" tar ((:url . "https://github.com/BenediktBroich/streamlink") (:commit . "13dff15121ac0276f693696db9b04ae5820058d5") (:revdesc . "13dff15121ac") (:keywords "multimedia" "streamlink"))]) + (strie . [(20160211 2222) ((cl-lib (0 5))) "A simple trie data structure implementation" tar ((:url . "https://github.com/jcatw/strie.el") (:commit . "eb7efb0cccc127c414f6a64db11454869d9c10a8") (:revdesc . "eb7efb0cccc1") (: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 ((:url . "https://github.com/magnars/string-edit.el") (:commit . "87936d816ae24184dd83688136531b6b6f1943fe") (:revdesc . "87936d816ae2") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (string-inflection . [(20251114 1041) nil "Foo_bar => FOO_BAR => FooBar => fooBar => foo-bar => Foo_Bar => foo_bar conversion of names" tar ((:url . "https://github.com/akicho8/string-inflection") (:commit . "072f7dff43140570788d64ac0ec9d930c3c2a96b") (:revdesc . "072f7dff4314") (:keywords "elisp") (:authors ("akicho8" . "akicho8@gmail.com")) (:maintainers ("akicho8" . "akicho8@gmail.com")) (:maintainer "akicho8" . "akicho8@gmail.com"))]) + (string-utils . [(20140508 2041) ((list-utils (0 4 2))) "String-manipulation utilities" tar ((:url . "http://github.com/rolandwalker/string-utils") (:commit . "8b56e1f79d2de46d1e9b5e24d889e9f4c3cc85d4") (:revdesc . "8b56e1f79d2d") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (stripe-buffer . [(20141208 1508) ((cl-lib (1 0))) "Use a different background for even and odd lines" tar ((:url . "https://github.com/sabof/stripe-buffer") (:commit . "c252080f55cb78c951b19ebab9687f6d00237baf") (:revdesc . "c252080f55cb") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainers ("sabof" . "esabof@gmail.com")) (:maintainer "sabof" . "esabof@gmail.com"))]) + (stripes . [(20230402 1228) ((emacs (24 3))) "Highlight alternating lines differently" tar ((:url . "http://git.smrk.net/stripes.el") (:commit . "4683c9020da14bb1c1f74b90d27a4d9fdc7a9147") (:revdesc . "4683c9020da1") (:keywords "convenience" "faces") (:authors ("Michael Schierl" . "schierlm-public@gmx.de") ("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"))]) + (stripspace . [(20251103 1432) ((emacs (24 3))) "Auto remove trailing whitespace and restore column" tar ((:url . "https://github.com/jamescherti/stripspace.el") (:commit . "c403debb88691cf7839f86f4d6d4a2815c9eeddf") (:revdesc . "c403debb8869") (:keywords "convenience"))]) + (structurizr . [(20251124 1900) ((emacs (29 1))) "Major mode for Structurizr DSL" tar ((:url . "https://github.com/papadakis-k/structurizr.el") (:commit . "8ecf03c0cd911d72cae049bb01cf9142d6be02d8") (:revdesc . "8ecf03c0cd91") (:keywords "languages"))]) + (stumpwm-mode . [(20171027 214) nil "Special lisp mode for evaluating code into running stumpwm" tar ((:url . "https://github.com/stumpwm/stumpwm-contrib") (:commit . "333d210cacc7ebac76e14dfc8c0139f0e399c9a7") (:revdesc . "333d210cacc7") (:keywords "comm" "lisp" "tools"))]) + (stupid-indent-mode . [(20170525 1117) nil "Plain stupid indentation minor mode" tar ((:commit . "3295e7de5e2cfddc3bf0e462e852bf58972f5d70") (:revdesc . "3295e7de5e2c") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainers ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com"))]) + (stylefmt . [(20161025 824) nil "Stylefmt interface" tar ((:url . "https://github.com/KeenS/stylefmt.el") (:commit . "7a38f26bf8ff947215f34f0a064c7ca80575ccbc") (:revdesc . "7a38f26bf8ff") (:keywords "style" "code" "formatter"))]) + (stylus-mode . [(20211019 2113) nil "Major mode for editing .styl files" tar ((:url . "https://github.com/brianc/jade-mode") (:commit . "1ad7c51f3c6a6ae64550d9510c5e4e8470014375") (:revdesc . "1ad7c51f3c6a") (:keywords "languages"))]) + (su . [(20240320 1707) ((emacs (26 1))) "Automatically read and write files using su or sudo" tar ((:url . "https://github.com/PythonNut/su.el") (:commit . "e097f31b3bbb8581d045d0e684d3f129f90e8085") (:revdesc . "e097f31b3bbb") (:keywords "convenience" "helm" "fuzzy" "flx") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainers ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com"))]) + (subatomic-theme . [(20220128 1615) nil "Low contrast bluish color theme" tar ((:url . "https://github.com/cryon/subatomic") (:commit . "9d0ac6aa5272d0285965a48505eb35658c5472b0") (:revdesc . "9d0ac6aa5272") (:keywords "color-theme" "blue" "low contrast") (:authors ("John Olsson" . "john@cryon.se")) (:maintainers ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se"))]) + (subatomic256-theme . [(20130621 210) nil "Fork of subatomic-theme for terminals" tar ((:url . "https://github.com/cryon/subatomic256") (:commit . "326177d6f99cd2b1d30df695e67ee3bc441cd96f") (:revdesc . "326177d6f99c") (:authors ("John Olsson" . "john@cryon.se")) (:maintainers ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se"))]) + (subemacs . [(20170401 934) nil "Evaluating expressions in a fresh Emacs subprocess" tar ((:url . "https://github.com/kbauer/subemacs") (:commit . "18d53939fec8968c08dfc5aff7240ca07efb1aac") (:revdesc . "18d53939fec8") (:keywords "extensions" "lisp" "multiprocessing") (:authors ("Klaus-Dieter Bauer" . "bauer.klaus.dieter@gmail.com")) (:maintainers ("Klaus-Dieter Bauer" . "bauer.klaus.dieter@gmail.com")) (:maintainer "Klaus-Dieter Bauer" . "bauer.klaus.dieter@gmail.com"))]) + (sublime-themes . [(20170606 1844) nil "A collection of themes based on Sublime Text" tar ((:url . "https://github.com/owainlewis/emacs-color-themes") (:commit . "60ee40af82eb55b79d5ed4026f1911326311603f") (:revdesc . "60ee40af82eb") (:keywords "faces") (:authors ("Owain Lewis" . "owain@owainlewis.com")) (:maintainers ("Owain Lewis" . "owain@owainlewis.com")) (:maintainer "Owain Lewis" . "owain@owainlewis.com"))]) + (sublimity . [(20200905 1730) ((emacs (26 1))) "Smooth-scrolling, minimap and distraction-free mode" tar ((:url . "https://github.com/zk-phi/sublimity") (:commit . "8e2ffc4d62194106130014531e7b54fc9b4b9e6c") (:revdesc . "8e2ffc4d6219"))]) + (subsonic . [(20220826 748) ((emacs (27 1)) (transient (0 2))) "Browse and play music from subsonic servers with mpv" tar ((:url . "https://git.sr.ht/~amk/subsonic.el") (:commit . "011e58d434ed707a06a2cfa20509629ebb339c04") (:revdesc . "011e58d434ed") (:keywords "multimedia") (:authors ("Alex McGrath" . "amk@amk.ie")) (:maintainers ("Alex McGrath" . "amk@amk.ie")) (:maintainer "Alex McGrath" . "amk@amk.ie"))]) + (sudo-edit . [(20220801 1317) ((emacs (24)) (cl-lib (0 5))) "Open files as another user" tar ((:url . "https://github.com/nflath/sudo-edit") (:commit . "74eb1e6986461baed9a9269566ff838530b4379b") (:revdesc . "74eb1e698646") (:keywords "convenience") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainers ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com"))]) + (sudo-ext . [(20170126 1214) nil "Sudo support" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sudo-ext.el") (:commit . "9d4580f304121ce7b8104bd4bd3b64e4dfa3c9b3") (:revdesc . "9d4580f30412") (:keywords "unix") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (sudo-utils . [(20210119 1930) ((emacs (25 1))) "Sudo utilities" tar ((:url . "https://github.com/alpha-catharsis/sudo-utils") (:commit . "089f7833fa256f293284a6286bf9cb2b78eff40d") (:revdesc . "089f7833fa25") (:keywords "processes" "unix") (:authors ("Alpha Catharsis" . "alpha.catharsis@gmail.com")) (:maintainers ("Alpha Catharsis" . "alpha.catharsis@gmail.com")) (:maintainer "Alpha Catharsis" . "alpha.catharsis@gmail.com"))]) + (sudoku . [(20191015 1315) ((emacs (24 4))) "Simple sudoku game, can download puzzles" tar ((:url . "https://github.com/zevlg/sudoku.el") (:commit . "b1924fd244a5fa284de9d67b66fbd69164b37318") (:revdesc . "b1924fd244a5") (:keywords "games") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainers ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru"))]) + (suggest . [(20251128 933) ((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 ((:url . "https://github.com/Wilfred/suggest.el") (:commit . "d1395f18519527efc3b43a7b148ebb139017e9ae") (:revdesc . "d1395f185195") (:keywords "convenience") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (suggestion-box . [(20170830 807) ((emacs (25 1)) (popup (0 5 3))) "Show tooltip on the cursor" tar ((:url . "https://github.com/yuutayamada/suggestion-box-el") (:commit . "50af0776c8caf3c79c4d37fd51cbf304ea34b68e") (:revdesc . "50af0776c8ca") (:keywords "convenience") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (sumibi . [(20251206 718) ((emacs (29 0)) (popup (0 5 9)) (unicode-escape (1 1)) (deferred (0 5 1))) "Japanese input method powered by ChatGPT API" tar ((:url . "https://github.com/kiyoka/Sumibi") (:commit . "47ecde2e815e4540bbb110bee1c0d5c50569f6f8") (:revdesc . "47ecde2e815e") (:keywords "lisp" "ime" "japanese") (:authors ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainers ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainer "Kiyoka Nishiyama" . "kiyoka@sumibi.org"))]) + (sunburn-theme . [(20201216 1539) ((emacs (24))) "A low contrast color theme" tar ((:url . "http://github.com/mvarela/Sunburn-Theme") (:commit . "6b5c14c76dcdfdb099102ef7a388b2f0c6f1951d") (:revdesc . "6b5c14c76dcd") (:authors ("Martín Varela" . "(martin@varela.fi)")) (:maintainers ("Martín Varela" . "(martin@varela.fi)")) (:maintainer "Martín Varela" . "(martin@varela.fi)"))]) + (sunny-day-theme . [(20140413 2125) nil "Emacs24 theme with a light background" tar ((:url . "http://github.com/mswift42/sunny-day-theme") (:commit . "420e0a6eb33fcc9b75c2c9e88ab60a975d782a00") (:revdesc . "420e0a6eb33f"))]) + (sunshine . [(20200306 1711) ((cl-lib (0 5))) "Provide weather and forecast information" tar ((:url . "https://github.com/aaronbieber/sunshine.el") (:commit . "88256223539edcfe57017778a997a474c9c022f6") (:revdesc . "88256223539e") (:keywords "tools" "weather") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainers ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com"))]) + (suomalainen-kalenteri . [(20250103 1003) nil "Finnish national and Christian holidays for calendar" tar ((:url . "https://github.com/tlikonen/suomalainen-kalenteri") (:commit . "4b63a82c3145bfff2dc1f7b45ce2463824462da0") (:revdesc . "4b63a82c3145") (:keywords "calendar" "holidays" "finnish") (:authors ("Teemu Likonen" . "tlikonen@iki.fi")) (:maintainers ("Teemu Likonen" . "tlikonen@iki.fi")) (:maintainer "Teemu Likonen" . "tlikonen@iki.fi"))]) + (super-save . [(20231209 1044) ((emacs (25 1))) "Auto-save buffers, based on your activity" tar ((:url . "https://github.com/bbatsov/super-save") (:commit . "0298076ea20e5239d485f0029846fc85664ce47f") (:revdesc . "0298076ea20e") (:keywords "convenience") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com"))]) + (supergenpass . [(20130329 548) nil "SuperGenPass for Emacs" tar ((:url . "https://github.com/ober/sgpass") (:commit . "549072ef7b5b82913cadd4758e8a0a9926f0a04a") (:revdesc . "549072ef7b5b") (:keywords "supergenpass") (:authors ("Jaime Fournier" . "jaimef@linbsd.org")) (:maintainers ("Jaime Fournier" . "jaimef@linbsd.org")) (:maintainer "Jaime Fournier" . "jaimef@linbsd.org"))]) + (surround . [(20250725 511) ((emacs (24 3))) "Easily add/delete/change parens, quotes, and more" tar ((:url . "https://github.com/mkleehammer/surround") (:commit . "6807bf69be1591a419a009adf8a5071b1cdcc76e") (:revdesc . "6807bf69be15") (:authors ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainers ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainer "Michael Kleehammer" . "michael@kleehammer.com"))]) + (suscolors-theme . [(20190713 1009) nil "Colorful theme, inspired by Gruvbox" tar ((:url . "https://github.com/TheSuspiciousWombat/SusColors-emacs") (:commit . "b4a979ee23e26e255b9a63525b0a28e810fab9ae") (:revdesc . "b4a979ee23e2"))]) + (sv-kalender-namnsdagar . [(20240620 1416) ((emacs (24 3))) "Swedish name day calendar" tar ((:url . "https://github.com/matsl/sv-kalender-namnsdagar") (:commit . "743aa9eec1364fa4194e11f7f10c29688cdd636b") (:revdesc . "743aa9eec136") (:keywords "calendar" "swedish" "localization") (:authors ("Mats Lidell" . "mats.lidell@lidells.se")) (:maintainers ("Mats Lidell" . "mats.lidell@lidells.se")) (:maintainer "Mats Lidell" . "mats.lidell@lidells.se"))]) + (svelte-mode . [(20240920 609) ((emacs (26 1))) "Emacs major mode for Svelte" tar ((:url . "https://github.com/leafOfTree/svelte-mode") (:commit . "edfef1e0abbf92e18027f6f34f7b5a6f03c1a28a") (:revdesc . "edfef1e0abbf") (:keywords "wp" "languages") (:authors ("Leaf" . "leafvocation@gmail.com")) (:maintainers ("Leaf" . "leafvocation@gmail.com")) (:maintainer "Leaf" . "leafvocation@gmail.com"))]) + (svg-mode-line-themes . [(20150425 2006) ((xmlgen (0 4))) "SVG-based themes for mode-line" tar ((:url . "https://github.com/sabof/svg-mode-line-themes") (:commit . "80a0e01839cafbd66899202e7764c33231974259") (:revdesc . "80a0e01839ca"))]) + (svg-tag-mode . [(20241021 1341) ((emacs (27 1)) (svg-lib (0 2))) "Replace keywords with SVG tags" tar ((:url . "https://github.com/rougier/svg-tag-mode") (:commit . "13e888b8bd9a0664d060149a44a751b2113331b6") (:revdesc . "13e888b8bd9a") (:keywords "convenience") (:authors ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")) (:maintainers ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")) (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr"))]) + (svgo . [(20220525 2059) ((emacs (26 2))) "SVG optimization with SVGO" tar ((:url . "https://github.com/hupf/svgo.el/") (:commit . "9b01cc9eb1fdf2731cd2b931a7dfe1f601b70786") (:revdesc . "9b01cc9eb1fd") (:keywords "tools") (:authors ("Mathis Hofer" . "mathis@fsfe.org")) (:maintainers ("Mathis Hofer" . "mathis@fsfe.org")) (:maintainer "Mathis Hofer" . "mathis@fsfe.org"))]) + (svnwrapper . [(20180414 1843) ((e2ansi (0 1 1))) "Highlighting and paging for shell command `svn'" tar ((:url . "https://github.com/Lindydancer/svnwrapper") (:commit . "de5069f5784e5d9e87a0af0159ba5f28a3716583") (:revdesc . "de5069f5784e") (:keywords "faces"))]) + (swagg . [(20251110 2034) ((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 ((:url . "https://github.com/isamert/swagg.el") (:commit . "87bd1f698bc4c77a1c0d6b252e15f4ee345d2afa") (:revdesc . "87bd1f698bc4") (:keywords "tools" "convenience") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com"))]) + (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 ((:url . "https://github.com/ahungry/swagger-to-org") (:commit . "181357c71ea24bede263f5706d8781ad65e16877") (:revdesc . "181357c71ea2") (:keywords "ahungry" "emacs" "swagger" "openapi" "orgmode" "org" "export") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainers ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com"))]) + (swap-buffers . [(20150506 2139) nil "The quickest way to swap buffers between windows. Based on switch-window package" tar ((:url . "https://github.com/ekazakov/swap-buffers") (:commit . "46ab31359b70d935add6c6e9533443116dc51103") (:revdesc . "46ab31359b70") (:keywords "window" "swap" "buffer" "exchange") (:authors ("Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com")) (:maintainers ("Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com")) (:maintainer "Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com"))]) + (swap-regions . [(20180915 1346) ((emacs (24 3))) "Swap text in two regions" tar ((:url . "https://github.com/xuchunyang/swap-regions.el") (:commit . "f4fd9880cf690e003fcde88dcf2b46adbbbb03cd") (:revdesc . "f4fd9880cf69") (:keywords "convenience") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (sway . [(20231219 1842) ((emacs (28 1))) "Communication with the Sway window manager" tar ((:url . "https://github.com/thblt/sway.el") (:commit . "84eae5e16a643eb00b0a422ded751cceb17cc8f0") (:revdesc . "84eae5e16a64") (:keywords "frames") (:authors ("Thibault Polge" . "thibault@thb.lt")) (:maintainers ("Thibault Polge" . "thibault@thb.lt")) (:maintainer "Thibault Polge" . "thibault@thb.lt"))]) + (sway-lang-mode . [(20230320 507) ((emacs (25 1)) (lsp-mode (6 0)) (rust-mode (1 0 5))) "Major mode for sway" tar ((:url . "https://github.com/hhamud/sway-mode") (:commit . "1d4615cc99d57280fb4b301d8339f408d987d317") (:revdesc . "1d4615cc99d5") (:keywords "languages"))]) + (sweet-theme . [(20200708 1202) ((emacs (24 1))) "Sweet-looking theme" tar ((:url . "https://github.com/2bruh4me/sweet-theme") (:commit . "ccbfdb6a17e25ab18a0b64101675bc1dfef44006") (:revdesc . "ccbfdb6a17e2") (:keywords "faces"))]) + (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 ((:url . "https://www.github.com/CestDiego/sweetgreen.el") (:commit . "e933fe466b5ef0e976967e203f88bd7a012469d1") (:revdesc . "e933fe466b5e") (:keywords "salad" "food" "sweetgreen" "request") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainers ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com"))]) + (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 ((:url . "https://github.com/danielmartin/swift-helpful") (:commit . "b46c580e4b8f55761431ec677866de3fc66592e9") (:revdesc . "b46c580e4b8f") (:keywords "help" "swift") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainers ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es"))]) + (swift-mode . [(20251122 857) ((emacs (25 2))) "Major-mode for Apple's Swift programming language" tar ((:url . "https://github.com/swift-emacs/swift-mode") (:commit . "cfae3b85ad09bd293df941261afbc21e41bbb5f8") (:revdesc . "cfae3b85ad09") (:keywords "languages" "swift") (: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"))]) + (swift-ts-mode . [(20250915 759) ((emacs (29 1))) "Major mode for Swift based on tree-sitter" tar ((:url . "https://github.com/rechsteiner/swift-ts-mode") (:commit . "17806f6f56f09c86c5e70af239bea4313aaaf0b8") (:revdesc . "17806f6f56f0") (:keywords "swift" "languages" "tree-sitter"))]) + (swift3-mode . [(20160918 1250) ((emacs (24 4))) "Major-mode for Apple's Swift programming language" tar ((:url . "https://github.com/taku0/swift3-mode") (:commit . "ea34d46bf9a4293e75ffdac9500d34989316d9e9") (:revdesc . "ea34d46bf9a4") (:keywords "languages" "swift"))]) + (swiper . [(20250329 1401) ((emacs (24 5)) (ivy (0 15 1))) "Isearch with an overview. Oh, man!" tar ((:url . "https://github.com/abo-abo/swiper") (:commit . "e33b028ed4b1258a211c87fd5fe801bed25de429") (:revdesc . "e33b028ed4b1") (:keywords "matching") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Basil L. Contovounesios" . "basil@contovou.net")) (:maintainer "Basil L. Contovounesios" . "basil@contovou.net"))]) + (swiper-helm . [(20180131 1744) ((emacs (24 1)) (swiper (0 1 0)) (helm (1 5 3))) "Helm version of Swiper" tar ((:url . "https://github.com/abo-abo/swiper-helm") (:commit . "93fb6db87bc6a5967898b5fd3286954cc72a0008") (:revdesc . "93fb6db87bc6") (:keywords "matching") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (swiss-holidays . [(20200526 822) nil "Swiss holidays for the calendar" tar ((:url . "https://github.com/egli/swiss-holidays") (:commit . "0995c9685033a09466f5b2dceb7316362bde997a") (:revdesc . "0995c9685033") (:keywords "calendar") (:authors ("Christian Egli" . "christian.egli@alumni.ethz.ch")) (:maintainers ("Christian Egli" . "christian.egli@alumni.ethz.ch")) (:maintainer "Christian Egli" . "christian.egli@alumni.ethz.ch"))]) + (switch-buffer-functions . [(20200127 409) nil "Hook run when current buffer changed" tar ((:url . "https://github.com/10sr/switch-buffer-functions-el") (:commit . "40cb0c9e2c84b30e1c5c7458a795cda1bd8ad8fa") (:revdesc . "40cb0c9e2c84") (:keywords "hook" "utility") (:authors ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainers ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainer "10sr" . "8slashes+el[at]gmail[dot]com"))]) + (switch-window . [(20250401 839) ((emacs (24))) "A *visual* way to switch window" tar ((:url . "https://github.com/dimitri/switch-window") (:commit . "8f771b571a1e60fac2d2a9845c0a5a52d5b440df") (:revdesc . "8f771b571a1e") (:keywords "convenience") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org") ("Feng Shu" . "tumashu@163.com")) (:maintainers ("Dimitri Fontaine" . "dim@tapoueh.org") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org"))]) + (swoop . [(20200618 905) ((emacs (24 3)) (ht (2 0)) (pcre2el (1 5)) (async (1 1))) "Peculiar buffer navigation" tar ((:url . "https://github.com/ShingoFukuyama/emacs-swoop") (:commit . "828ae0f17f3beaea50ee66d06c500f4847ccc7dd") (:revdesc . "828ae0f17f3b") (:keywords "tools" "swoop" "inner" "buffer" "search" "navigation"))]) + (sws-mode . [(20210908 2121) nil "(S)ignificant (W)hite(S)pace mode" tar ((:url . "https://github.com/brianc/jade-mode") (:commit . "111460b056838854e470a6383041a99f843b93ee") (:revdesc . "111460b05683") (:keywords "languages"))]) + (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 ((:url . "https://github.com/vermiculus/sx.el/") (:commit . "8c1c28f33d714fc8869e49f5642e1a585c8c85af") (:revdesc . "8c1c28f33d71") (:keywords "help" "hypermedia" "tools") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainers ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com"))]) + (sxiv . [(20220530 14) ((dash (2 16 0)) (emacs (25 1))) "Run the Simple X Image Viewer, with Dired integration" tar ((:url . "https://tildegit.org/contrapunctus/sxiv") (:commit . "47f5b2fbb94c569dc5e71cbe4de9c6eabbbc69e8") (:revdesc . "47f5b2fbb94c") (:keywords "multimedia") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainers ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabber.fr"))]) + (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 ((:url . "https://github.com/bgwines/symbol-navigation-hydra") (:commit . "b3b1257e676514d93cd2d71a10a485bf00b5375f") (:revdesc . "b3b1257e6765") (:keywords "highlight" "face" "match" "convenience" "hydra" "symbol") (:authors ("Brett Wines" . "bgwines@cs.stanford.edu")) (:maintainers ("Brett Wines" . "bgwines@cs.stanford.edu")) (:maintainer "Brett Wines" . "bgwines@cs.stanford.edu"))]) + (symbol-overlay . [(20240913 1624) ((emacs (24 3)) (seq (2 2))) "Highlight symbols with keymap-enabled overlays" tar ((:url . "https://github.com/wolray/symbol-overlay/") (:commit . "6151f4279bd94b5960149596b202cdcb45cacec2") (:revdesc . "6151f4279bd9") (:keywords "faces" "matching") (:authors ("wolray" . "wolray@foxmail.com")) (:maintainers ("wolray" . "wolray@foxmail.com")) (:maintainer "wolray" . "wolray@foxmail.com"))]) + (symbol-overlay-mc . [(20241216 1436) ((emacs (28 1)) (multiple-cursors (1 4 0)) (symbol-overlay (4 1))) "Mark highlighted symbols with multiple cursors" tar ((:url . "https://github.com/xenodium/symbol-overlay-mc") (:commit . "188fa07fe5cc142dbabcd2b4a102a9ec5f132839") (:revdesc . "188fa07fe5cc") (:keywords "convenience"))]) + (symbolist . [(20211107 1615) ((emacs (24 5))) "List and interactively unbind Emacs Lisp symbols" tar ((:url . "https://github.com/lassik/emacs-symbolist") (:commit . "92b712734941a45da7d47fd61b95e4013ff53481") (:revdesc . "92b712734941") (:keywords "lisp" "maint") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (symbols-outline . [(20250728 1231) ((emacs (27 1))) "Display symbols (functions, variables, etc) in outline view" tar ((:url . "https://github.com/liushihao456/symbols-outline.el") (:commit . "ee595d395d6137ce7d31da6bb4d6391ad9f6883c") (:revdesc . "ee595d395d61") (:keywords "outlines"))]) + (symbolword-mode . [(20180401 1427) ((emacs (24)) (f (0 19 0))) "Modify word split" tar ((:url . "https://github.com/ncaq/symbolword-mode") (:commit . "920e57f4c2b09b28c5a0c8fe9ebdba9961822163") (:revdesc . "920e57f4c2b0") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainers ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net"))]) + (symon . [(20170224 833) nil "Tiny graphical system monitor" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "76461679dfe13a5dccd3c8735fb6f58b26b46733") (:revdesc . "76461679dfe1"))]) + (symon-lingr . [(20150719 1342) ((symon (1 1 2)) (cl-lib (0 5))) "A notification-based Lingr client powered by symon.el" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "056d1a473e36992ff5881e5ce6fdc331cead975f") (:revdesc . "056d1a473e36"))]) + (sync-recentf . [(20160326 2001) nil "Synchronize the recent files list between Emacs instances" tar ((:url . "https://github.com/ffevotte/sync-recentf") (:commit . "0052561d5c5b5c2684faedc3eead776aec06c3ed") (:revdesc . "0052561d5c5b") (:keywords "recentf") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainers ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com"))]) + (syncthing . [(20250612 206) ((emacs (27 1))) "Client for Syncthing" tar ((:url . "https://github.com/KeyWeeUsr/emacs-syncthing") (:commit . "eac37ecf5458b6d554544b1ddb76e3c6fbe3cb2f") (:revdesc . "eac37ecf5458") (:keywords "convenience" "syncthing" "sync" "client" "view") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (synonymous . [(20180325 1817) ((emacs (24)) (cl-lib (0 5)) (request (0 2 0))) "A thesaurus at your fingertips" tar ((:url . "http://github.com/toroidal-code/synonymous.el") (:commit . "2cb9a674d84fddf3f1b00c9d6b13a853576acb87") (:revdesc . "2cb9a674d84f") (:keywords "utility") (:authors ("Katherine Whitlock" . "toroidalcode@gmail.com") ("authored by Manuel Serrano" . "Manuel.Serrano@inria.fr")) (:maintainers ("Katherine Whitlock" . "toroidalcode@gmail.com") ("authored by Manuel Serrano" . "Manuel.Serrano@inria.fr")) (:maintainer "Katherine Whitlock" . "toroidalcode@gmail.com"))]) + (synosaurus . [(20250113 2057) ((cl-lib (0 5))) "An Emacs frontend for thesauri" tar ((:url . "https://github.com/hpdeifel/synosaurus") (:commit . "690755ce88a50e65ab0441ce9aabe6341aae3964") (:revdesc . "690755ce88a5") (:keywords "wp") (:authors ("Hans-Peter Deifel" . "hpd@hpdeifel.de")) (:maintainers ("Hans-Peter Deifel" . "hpd@hpdeifel.de")) (:maintainer "Hans-Peter Deifel" . "hpd@hpdeifel.de"))]) + (synquid . [(20160930 1550) ((flycheck (27)) (emacs (24 3))) "Major mode for editing Synquid files" tar ((:url . "https://github.com/cpitclaudel/synquid-mode") (:commit . "28701ce1a15437202f53ab93a14bcba1de83fd2c") (:revdesc . "28701ce1a154") (:keywords "languages") (: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"))]) + (syntactic-close . [(20250530 1921) ((emacs (24)) (cl-lib (0 5))) "Insert closing delimiter" tar ((:url . "https://github.com/emacs-berlin/syntactic-close") (:commit . "2c7d5e1841937e13fd1a2a2cb41ef5b636f497e3") (:revdesc . "2c7d5e184193") (:keywords "languages" "convenience") (: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") ("Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org")) (:maintainer "Andreas Röhler" . "andreas.roehler@online.de"))]) + (syntactic-sugar . [(20140508 2041) nil "Effect-free forms such as if/then/else" tar ((:url . "http://github.com/rolandwalker/syntactic-sugar") (:commit . "b6a49df4b6056e2619eea9ca554c105ae67e115f") (:revdesc . "b6a49df4b605") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (syntax-subword . [(20160205 2154) nil "Make operations on words more fine-grained" tar ((:url . "https://github.com/jpkotta/syntax-subword") (:commit . "9aa9b3f846bfe2474370642458a693ac4760d9fe") (:revdesc . "9aa9b3f846bf") (: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 ((:url . "https://github.com/enricoflor/syntree") (:commit . "7bbbd4904b0ffe452ec39630042dbc85a7a0b233") (:revdesc . "7bbbd4904b0f") (:authors ("Enrico Flor" . "enrico@eflor.net")) (:maintainers ("Enrico Flor" . "enrico@eflor.net")) (:maintainer "Enrico Flor" . "enrico@eflor.net"))]) + (sysctl . [(20200615 1824) ((emacs (26))) "Manage sysctl though org-mode" tar ((:url . "https://github.com/dantecatalfamo/sysctl.el") (:commit . "d8c2e18de1d7a3b2999a4d5054c0bbf30cb10fed") (:revdesc . "d8c2e18de1d7") (:keywords "sysctl" "tools" "unix"))]) + (syslog-mode . [(20250905 2333) ((hide-lines (20130623)) (ov (20150311)) (hsluv (20181127))) "Major-mode for viewing log files & strace output" tar ((:url . "https://github.com/vapniks/syslog-mode") (:commit . "f167635feae7365574755a7d61a27079c6b40aef") (:revdesc . "f167635feae7") (:keywords "unix") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainers ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com"))]) + (system-specific-settings . [(20140818 1457) nil "Apply settings only on certain systems" tar ((:url . "https://github.com/DarwinAwardWinner/emacs-system-specific-settings") (:commit . "0050d85b2175095aa5ecf580a2fe43c069b0eef3") (:revdesc . "0050d85b2175") (:keywords "configuration"))]) + (systemd . [(20230201 302) ((emacs (24 4))) "Major mode for editing systemd units" tar ((:url . "https://github.com/holomorph/systemd-mode") (:commit . "8742607120fbc440821acbc351fda1e8e68a8806") (:revdesc . "8742607120fb") (:keywords "tools" "unix") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainers ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu"))]) + (systemtap-mode . [(20151122 1940) nil "A mode for SystemTap" tar ((:url . "https://github.com/ruediger/systemtap-mode") (:commit . "8b5086d6b0050a12bb37e33c24c24d1f420afd3b") (:revdesc . "8b5086d6b005") (:keywords "tools" "languages") (:maintainers (nil . "ruediger@c-plusplus.de")) (:maintainer nil . "ruediger@c-plusplus.de"))]) + (ta . [(20160619 1645) ((emacs (24 3)) (cl-lib (0 5))) "A tool to deal with Chinese homophonic characters" tar ((:url . "http://github.com/kuanyui/ta.el") (:commit . "668ad41e71f374f8c32c8d0532f3d8485b355d35") (:revdesc . "668ad41e71f3") (:keywords "tools") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainers ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com"))]) + (tab-bar-buffers . [(20240227 2037) ((emacs (28 1))) "Use tab-bar-mode as a buffer manager" tar ((:url . "https://github.com/ajrosen/tab-bar-buffers") (:commit . "08a3f39c0b1673e3cad34e1f0e83fb56c903586c") (:revdesc . "08a3f39c0b16") (:keywords "convenience" "frames") (:authors ("Andy Rosen" . "ajr@corp.mlfs.org")) (:maintainers ("Andy Rosen" . "ajr@corp.mlfs.org")) (:maintainer "Andy Rosen" . "ajr@corp.mlfs.org"))]) + (tab-bar-echo-area . [(20240809 1442) ((emacs (27 1))) "Display tab names of the tab bar in the echo area" tar ((:url . "https://github.com/fritzgrabo/tab-bar-echo-area") (:commit . "9ccff3b93385796bec1cd435674807c3907436dd") (:revdesc . "9ccff3b93385") (:keywords "convenience") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (tab-bar-groups . [(20211013 2012) ((emacs (27 1)) (s (1 12 0))) "Tab groups for the tab bar" tar ((:url . "https://github.com/fritzgrabo/tab-bar-groups") (:commit . "a0389d87d2e793055dd74ae85b4593aa1d2720fd") (:revdesc . "a0389d87d2e7") (:keywords "convenience") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (tab-bar-lost-commands . [(20211013 1945) ((emacs (27 1))) "The \"lost commands\" of the tab bar" tar ((:url . "https://github.com/fritzgrabo/tab-bar-lost-commands") (:commit . "989e03dc3d1057264b21b9a5d241fcba86cd297a") (:revdesc . "989e03dc3d10") (:keywords "convenience") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainers ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com"))]) + (tab-bar-notch . [(20241224 109) ((emacs (27 1))) "Adjust tab-bar height for MacBook Pro notch" tar ((:url . "https://github.com/jimeh/tab-bar-notch") (:commit . "49a0f4948bc3dc51ae36b026dec89698b26c0cb2") (:revdesc . "49a0f4948bc3") (:keywords "convenience" "hardware") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainers ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me"))]) + (tab-group . [(20140306 1450) nil "Grouped tabs and their tabbar" tar ((:url . "http://github.com/tarao/tab-group-el") (:commit . "5a290ec2608e4100fb188fd60ecb77affcc3465b") (:revdesc . "5a290ec2608e") (:keywords "convenience" "tabs") (:authors ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainers ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainer "INA Lintaro" . "tarao.gnnatgmail.com"))]) + (tab-jump-out . [(20251215 247) ((emacs (24 4))) "Use tab to jump out of delimiter pairs" tar ((:url . "https://github.com/mkleehammer/tab-jump-out") (:commit . "6287177b67cec1dc5c938841ce8f97c86f48ef5e") (:revdesc . "6287177b67ce") (:keywords "convenience") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainers ("Michael Kleehammer" . "michael@kleehammer.com")) (:maintainer "Michael Kleehammer" . "michael@kleehammer.com"))]) + (tab-line-nerd-icons . [(20250208 1059) ((emacs (28 1)) (nerd-icons (0 1))) "Add icons to tab-line tabs" tar ((:url . "https://github.com/lucius-martius/tab-line-nerd-icons") (:commit . "902a7bef60c64b58da9c6af028a0cb89f70b7684") (:revdesc . "902a7bef60c6") (:keywords "lisp") (:authors ("Lucius Martius" . "lucius-martius@dorsai.eu")) (:maintainers ("Lucius Martius" . "lucius-martius@dorsai.eu")) (:maintainer "Lucius Martius" . "lucius-martius@dorsai.eu"))]) + (tabbar . [(20180726 1735) nil "Display a tab bar in the header line" tar ((:url . "https://github.com/dholm/tabbar") (:commit . "82bbda31cbe8ef367dd6501c3aa14b7f2c835910") (:revdesc . "82bbda31cbe8") (:keywords "convenience") (:authors ("David Ponce" . "david@dponce.com")) (:maintainers ("David Ponce" . "david@dponce.com")) (:maintainer "David Ponce" . "david@dponce.com"))]) + (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 ((:url . "http://github.com/mlf176f2/tabbar-ruler.el") (:commit . "535568189aa12a3eff7f977d2783e57b6a65ab6a") (:revdesc . "535568189aa1") (:keywords "tabbar" "ruler mode" "menu" "tool bar."))]) + (tabby-mode . [(20240107 2124) ((emacs (25 1))) "Minor mode for the Tabby AI coding assistant" tar ((:url . "https://github.com/ragnard/tabby-mode") (:commit . "b656727247c5fc78690827fecf232edc1945a331") (:revdesc . "b656727247c5") (:keywords "tools" "convenience") (:authors ("Ragnar Dahlén" . "r.dahlen@gmail.com")) (:maintainers ("Ragnar Dahlén" . "r.dahlen@gmail.com")) (:maintainer "Ragnar Dahlén" . "r.dahlen@gmail.com"))]) + (tabbymacs . [(20251007 1441) ((emacs (27 1))) "Inline AI code completions via Tabby LSP" tar ((:url . "https://github.com/Bastillan/tabbymacs") (:commit . "b88bac22c923bebbbc7e52f10a25669a7680698c") (:revdesc . "b88bac22c923") (:keywords "tools" "languages" "inline completions" "tabby" "llm") (:authors ("Jędrzej Kędzierski" . "kedzierski.jedrzej@gmail.com")) (:maintainers ("Jędrzej Kędzierski" . "kedzierski.jedrzej@gmail.com")) (:maintainer "Jędrzej Kędzierski" . "kedzierski.jedrzej@gmail.com"))]) + (tabgo . [(20250103 1740) ((emacs (27 1))) "Jump to tabs, avy style" tar ((:url . "https://github.com/isamert/tabgo.el") (:commit . "23b6397fd61db31689feacb4b7df2b1f64e69572") (:revdesc . "23b6397fd61d") (:authors ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainers ("Isa Mert Gurbuz" . "isamertgurbuz@gmail.com")) (:maintainer "Isa Mert Gurbuz" . "isamertgurbuz@gmail.com"))]) + (tablist . [(20231019 1126) ((emacs (24 3))) "Extended tabulated-list-mode" tar ((:url . "https://github.com/emacsorphanage/tablist") (:commit . "fcd37147121fabdf003a70279cf86fbe08cfac6f") (:revdesc . "fcd37147121f") (:keywords "extensions" "lisp") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainers ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "Andreas Politz" . "politza@fh-trier.de"))]) + (tabnine . [(20250102 1608) ((emacs (27 1)) (dash (2 16 0)) (s (1 12 0)) (editorconfig (0 9 1)) (language-id (0 5 1)) (transient (0 4 0))) "An unofficial TabNine package with TabNine Chat supported" tar ((:url . "https://github.com/shuxiao9058/tabnine/") (:commit . "7c103aa9e1dd46e8507d341fee42ce30417e69f5") (:revdesc . "7c103aa9e1dd") (:keywords "convenience") (:authors ("Aaron Ji" . "shuxiao9058@gmail.com") ("Tommy Xiang" . "tommyx058@gmail.com") ("John Gong" . "gjtzone@hotmail.com")) (:maintainers ("Aaron Ji" . "shuxiao9058@gmail.com") ("Tommy Xiang" . "tommyx058@gmail.com") ("John Gong" . "gjtzone@hotmail.com")) (:maintainer "Aaron Ji" . "shuxiao9058@gmail.com"))]) + (tabspaces . [(20251108 1927) ((emacs (27 1)) (project (0 8 1))) "Leverage tab-bar and project for buffer-isolated workspaces" tar ((:url . "https://github.com/mclear-tools/tabspaces") (:commit . "8873c46da96cbabe31056cd5c5e85731f4abf07e") (:revdesc . "8873c46da96c") (:keywords "convenience" "frames") (:authors ("Colin McLear" . "mclear@fastmail.com")))]) + (tabula-rasa . [(20141216 547) ((emacs (24 4))) "Distraction free writing mode" tar ((:url . "https://github.com/idomagal/Tabula-Rasa/blob/master/tabula-rasa.el") (:commit . "e85fff9de18dc31bc6a7aca726e34a95cc5459f5") (:revdesc . "e85fff9de18d") (:keywords "distraction free" "writing") (:authors ("Ido Magal" . "misc@satans.church")) (:maintainers ("Ido Magal" . "misc@satans.church")) (:maintainer "Ido Magal" . "misc@satans.church"))]) + (tagedit . [(20161121 855) ((s (1 3 1)) (dash (1 0 3))) "Some paredit-like features for html-mode" tar ((:url . "https://github.com/magnars/tagedit") (:commit . "b3a70101a0dcf85498c92b7fcfa7fdbac869746c") (:revdesc . "b3a70101a0dc") (:keywords "convenience") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainers ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (take-off . [(20140531 917) ((emacs (24 3)) (web-server (0 1 0))) "Emacs remote web access" tar ((:url . "https://github.com/tburette/take-off") (:commit . "aa9ea45566fc74febbb6ee9c409ecc4b59246215") (:revdesc . "aa9ea45566fc") (:authors ("Thomas Burette" . "burettethomas@gmail.com")) (:maintainers ("Thomas Burette" . "burettethomas@gmail.com")) (:maintainer "Thomas Burette" . "burettethomas@gmail.com"))]) + (talonscript-mode . [(20231015 2358) ((emacs (24 3))) "Major mode for Talon Voice's .talon files" tar ((:url . "https://github.com/jcaw/talonscript-mode") (:commit . "b5e78b7866c9dee5f8bc5ce3924e1916c46e2b9b") (:revdesc . "b5e78b7866c9") (:keywords "languages") (:authors ("Jcaw" . "toastedjcaw@gmail.com")) (:maintainers ("Jcaw" . "toastedjcaw@gmail.com")) (:maintainer "Jcaw" . "toastedjcaw@gmail.com"))]) + (tango-2-theme . [(20120312 2025) nil "Tango 2 color theme for GNU Emacs 24" tar ((:commit . "64e44c98e41ebbe3b827d54280e3b9615787daaa") (:revdesc . "64e44c98e41e"))]) + (tango-plus-theme . [(20250813 1242) nil "A color theme based on the tango palette" tar ((:url . "https://github.com/tmalsburg/tango-plus-theme") (:commit . "6c57ae3745ab66c75d4ebb336d3403d90537206a") (:revdesc . "6c57ae3745ab") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de"))]) + (tangonov-theme . [(20250416 340) ((emacs (27 1))) "A 256 color dark theme featuring bright pastels" tar ((:url . "https://codeberg.org/trevdev/tangonov-theme") (:commit . "cb62069f84c5a475b466e2cc1c252f655c673259") (:revdesc . "cb62069f84c5") (:keywords "faces" "theme" "dark" "fringe") (:authors ("Trevor Richards" . "trev@trevdev.ca")) (:maintainers ("Trevor Richards" . "trev@trevdev.ca")) (:maintainer "Trevor Richards" . "trev@trevdev.ca"))]) + (tangotango-theme . [(20241117 1143) nil "Tango Palette color theme for Emacs 24" tar ((:url . "https://github.com/juba/color-theme-tangotango") (:commit . "897c1643bd2cfd3c0b265a5f7599d1d04de0c304") (:revdesc . "897c1643bd2c") (:keywords "tango" "palette" "color" "theme" "emacs") (:authors ("Julien Barnier" . "julien@nozav.org")) (:maintainers ("Julien Barnier" . "julien@nozav.org")) (:maintainer "Julien Barnier" . "julien@nozav.org"))]) + (tao-theme . [(20250717 347) nil "This package provides two parametrized uncoloured color themes for Emacs: tao-yin and tao-yang" tar ((:url . "http://github.com/11111000000/tao-theme-emacs") (:commit . "33c0d44048afe444e7a8aee30fbc101a00453799") (:revdesc . "33c0d44048af") (:authors ("Peter Kosov" . "11111000000@email.com")) (:maintainers ("Peter Kosov" . "11111000000@email.com")) (:maintainer "Peter Kosov" . "11111000000@email.com"))]) + (tardis-theme . [(20230212 2152) ((emacs (25 1))) "Quantum Country Theme" tar ((:url . "https://github.com/antonhibl/tardis-theme") (:commit . "352b1579d13e99cff9367b08208c1e241d76c89e") (:revdesc . "352b1579d13e") (:keywords "convenience") (:authors ("Anton Hibl" . "antonhibl11@gmail.com")) (:maintainers ("Anton Hibl" . "antonhibl11@gmail.com")) (:maintainer "Anton Hibl" . "antonhibl11@gmail.com"))]) + (taskpaper-mode . [(20250823 1538) ((emacs (25 1))) "Major mode for TaskPaper files" tar ((:url . "https://github.com/saf-dmitry/taskpaper-mode") (:commit . "208e6832ca68b33263440c472386ca033ba2735c") (:revdesc . "208e6832ca68") (:keywords "outlines" "notetaking" "task management" "productivity" "taskpaper") (:authors ("Dmitry Safronov" . "saf.dmitry@gmail.com")) (:maintainers ("Dmitry Safronov" . "saf.dmitry@gmail.com")) (:maintainer "Dmitry Safronov" . "saf.dmitry@gmail.com"))]) + (taskrunner . [(20190916 1608) ((emacs (25 1)) (projectile (2 0 0)) (async (1 9 3))) "Retrieve build system/taskrunner tasks" tar ((:url . "https://github.com/emacs-taskrunner/emacs-taskrunner") (:commit . "716323aff410b4d864d137c9ebe4bbb5b8587f5e") (:revdesc . "716323aff410") (:keywords "build-system" "taskrunner" "build" "task-runner" "tasks" "convenience") (:authors ("Yavor Konstantinov" . "ykonstantinov1ATgmailDOTcom")) (:maintainers ("Yavor Konstantinov" . "ykonstantinov1ATgmailDOTcom")) (:maintainer "Yavor Konstantinov" . "ykonstantinov1ATgmailDOTcom"))]) + (tawny-mode . [(20241104 1432) ((cider (0 12)) (emacs (25))) "Ontology Editing with Tawny-OWL" tar ((:url . "https://github.com/phillord/tawny-owl") (:commit . "0baa9c3e9aea40bcf9c11c9a009f0e26efbc366f") (:revdesc . "0baa9c3e9aea") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainers ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (tbindent . [(20251201 2003) ((emacs (24 3))) "Edit space-indented file in tab-indented buffer" tar ((:url . "https://github.com/pierre-rouleau/tab-based-indent") (:commit . "473e3bd7e13f7d5868688e3dc274b96e705c279f") (:revdesc . "473e3bd7e13f") (:keywords "convenience" "languages") (:authors ("Pierre Rouleau" . "prouleau001@gmail.com")) (:maintainers ("Pierre Rouleau" . "prouleau001@gmail.com")) (:maintainer "Pierre Rouleau" . "prouleau001@gmail.com"))]) + (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 ((:url . "https://github.com/Yuki-Inoue/tblui.el") (:commit . "62ab5f62982c061a902fd3e54d94a68a4706572c") (:revdesc . "62ab5f62982c") (:authors ("Yuki Inoue" . "inouetakahiroki_at_gmail.com")) (:maintainers ("Yuki Inoue" . "inouetakahiroki_at_gmail.com")) (:maintainer "Yuki Inoue" . "inouetakahiroki_at_gmail.com"))]) + (tbx2org . [(20140224 1559) ((dash (2 5 0)) (s (1 8 0)) (cl-lib (0 4))) "Tinderbox to org-mode conversion" tar ((:url . "https://github.com/istib/tbx2org") (:commit . "08e9816ba6066f56936050b58d07ceb2187ae6f7") (:revdesc . "08e9816ba606") (:keywords "org-mode"))]) + (tc . [(20251202 751) nil "A Japanese input method with T-Code on Emacs" tar ((:url . "https://github.com/kanchoku/tc") (:commit . "4b7ed91922f3af55c56a986f6776cad153762254") (:revdesc . "4b7ed91922f3") (:authors ("Kaoru Maeda" . "maeda@src.ricoh.co.jp") ("Yasushi Saito" . "yasushi@cs.washington.edu") ("KITAJIMA Akira" . "kitajima@isc.osakac.ac.jp")))]) + (tco . [(20191129 2040) ((dash (1 2 0)) (emacs (24 3))) "Tail-call optimisation for Emacs lisp" tar ((:url . "https://github.com/Wilfred/tco.el") (:commit . "d82478d56568f60b3a82fd010b3ca0bab2ef5dc9") (:revdesc . "d82478d56568") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (tea-time . [(20120331 820) nil "Simple timer package, useful to make perfect tea" tar ((:url . "https://github.com/konzeptual/tea-time") (:commit . "1f6cf0bdd27c5eb3508989c5095427781f858eca") (:revdesc . "1f6cf0bdd27c") (:keywords "timer" "tea-time") (:authors ("konsty" . "antipin.konstantin@googlemail.com")) (:maintainers ("Gabriel Saldana" . "gsaldana@gmail.com")) (:maintainer "Gabriel Saldana" . "gsaldana@gmail.com"))]) + (teacode-expand . [(20181231 640) ((emacs (24 4))) "Expansion of text by TeaCode program" tar ((:url . "https://github.com/raguay/TeaCode-Expand") (:commit . "7df6f9ec95da1fb47bbae489bb3f2c27ed3a9b3a") (:revdesc . "7df6f9ec95da") (:keywords "lisp") (:authors ("Richard Guay" . "raguay@customct.com")) (:maintainers ("Richard Guay" . "raguay@customct.com")) (:maintainer "Richard Guay" . "raguay@customct.com"))]) + (teco . [(20200707 2309) nil "Teco interpreter" tar ((:url . "https://github.com/mtk/teco.git") (:commit . "2529eb0f7f35c526c1b6fca5250399718ff5138a") (:revdesc . "2529eb0f7f35") (:keywords "convenience" "emulations" "files") (:authors ("Dale R. Worley" . "worley@alum.mit.edu")) (:maintainers ("Mark T. Kennedy" . "mtk@acm.org")) (:maintainer "Mark T. Kennedy" . "mtk@acm.org"))]) + (telega . [(20251128 658) ((emacs (27 1)) (visual-fill-column (1 9)) (transient (0 3 0))) "Telegram client (unofficial)" tar ((:url . "https://github.com/zevlg/telega.el") (:commit . "55f01587e534feede0875aa0d94ffc5a4c6671af") (:revdesc . "55f01587e534") (:keywords "comm") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainers ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru"))]) + (telepathy . [(20131209 1258) nil "Access Telepathy from Emacs" tar ((:url . "https://github.com/NicolasPetton/telepathy.el") (:commit . "211d785b02a29ddc254422fdcc3db45262582f8c") (:revdesc . "211d785b02a2") (:keywords "telepathy" "tools") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainers ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com"))]) + (telephone-line . [(20240109 2021) ((emacs (24 4)) (cl-lib (0 5)) (cl-generic (0 2)) (seq (1 8))) "Rewrite of Powerline" tar ((:url . "https://github.com/dbordak/telephone-line") (:commit . "6016418a5e1e8e006cc202eff50ff28b594eeca4") (:revdesc . "6016418a5e1e") (:keywords "mode-line") (:authors ("Daniel Bordak" . "dbordak@fastmail.fm")) (:maintainers ("Daniel Bordak" . "dbordak@fastmail.fm")) (:maintainer "Daniel Bordak" . "dbordak@fastmail.fm"))]) + (teleport . [(20251118 1056) ((emacs (28 1)) (dash (2 18 0))) "Integration for tsh (goteleport.com)" tar ((:url . "https://github.com/caramelhooves/teleport.el") (:commit . "0ff615c4b2f19019c9438075c75e0f94b4cec53c") (:revdesc . "0ff615c4b2f1") (:keywords "tools") (:authors ("Caramel Hooves" . "caramel.hooves@protonmail.com")) (:maintainers ("Caramel Hooves" . "caramel.hooves@protonmail.com")) (:maintainer "Caramel Hooves" . "caramel.hooves@protonmail.com"))]) + (teletext . [(20231215 1524) ((emacs (24 3))) "Teletext broadcast viewer" tar ((:url . "https://github.com/lassik/emacs-teletext") (:commit . "d59ae5f9b79007646815a38f31882a114ca8aee0") (:revdesc . "d59ae5f9b790") (:keywords "comm" "help" "hypermedia") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (teletext-yle . [(20231215 1609) ((emacs (24 3)) (teletext (0 1))) "Teletext provider for Finnish national network YLE" tar ((:url . "https://github.com/lassik/emacs-teletext-yle") (:commit . "59a287c26571db07e191ac86cdf0be312fec1964") (:revdesc . "59a287c26571") (:keywords "comm" "help" "hypermedia") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (tempel . [(20251130 847) ((emacs (29 1)) (compat (30))) "Tempo templates/snippets with in-buffer field editing" tar ((:url . "https://github.com/minad/tempel") (:commit . "506a8d570c145f4df63a18921e34bac6bef3ebe0") (:revdesc . "506a8d570c14") (:keywords "abbrev" "languages" "tools" "text") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (tempel-collection . [(20250410 1607) ((tempel (0 5)) (emacs (29 1))) "Collection of templates for Tempel" tar ((:url . "https://github.com/Crandel/tempel-collection") (:commit . "5cb6bc6b5856c70806ff6b2f952814ff702137c6") (:revdesc . "5cb6bc6b5856") (:keywords "tools") (:authors ("Vitalii Drevenchuk" . "cradlemann@gmail.com") ("Max Penet" . "mpenetr@s-exp.com") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Vitalii Drevenchuk" . "cradlemann@gmail.com") ("Max Penet" . "mpenetr@s-exp.com") ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Vitalii Drevenchuk" . "cradlemann@gmail.com"))]) + (templ-ts-mode . [(20250223 2347) ((emacs (29 1))) "Major mode for editing Templ files" tar ((:url . "https://github.com/danderson/templ-ts-mode") (:commit . "ddf13c1a08ed3d05d9701b1a2e8bb4b9febad57b") (:revdesc . "ddf13c1a08ed") (:keywords "languages") (:authors ("David Anderson" . "dave@natulte.net")) (:maintainers ("David Anderson" . "dave@natulte.net")) (:maintainer "David Anderson" . "dave@natulte.net"))]) + (template-dumper . [(20240630 2236) ((emacs (28 1)) (yasnippet (0 14 0)) (f (0 20 0))) "Create files from yasnippet templates" tar ((:url . "https://resultsmotivated.com/") (:commit . "92fb170d572f044aaedaa2535990eba556347dfe") (:revdesc . "92fb170d572f") (:keywords "yasnippet" "templating" "convenience" "tools"))]) + (template-overlays . [(20180706 1132) ((emacs (24 4)) (ov (1 0 6))) "Display template regions using overlays" tar ((:url . "http://www.github.com/mmontone/template-overlays") (:commit . "3cbc9a4882dcbbddf9b168883d119a6af0848784") (:revdesc . "3cbc9a4882dc") (:keywords "faces" "convenience" "templates" "overlays") (:authors ("Mariano Montone" . "marianomontone@gmail.com")) (:maintainers ("Mariano Montone" . "marianomontone@gmail.com")) (:maintainer "Mariano Montone" . "marianomontone@gmail.com"))]) + (templatel . [(20210902 228) ((emacs (25 1))) "Templating language;" tar ((:url . "https://clarete.li/templatel") (:commit . "e1ccb88cdc4b482b078276960f810b82ba3b7847") (:revdesc . "e1ccb88cdc4b") (:authors ("Lincoln Clarete" . "lincoln@clarete.li")) (:maintainers ("Lincoln Clarete" . "lincoln@clarete.li")) (:maintainer "Lincoln Clarete" . "lincoln@clarete.li"))]) + (temporary-persistent . [(20230115 1425) ((emacs (24 3)) (names (20151201 0)) (dash (2 12 1)) (s (1 10 0))) "Keep temp notes buffers persistent" tar ((:url . "https://github.com/kostafey/temporary-persistent") (:commit . "edbde738769e79ac212ae84ae7898ffd5f19e0f1") (:revdesc . "edbde738769e") (:keywords "temp" "buffers" "notes") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainers ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com"))]) + (ten-hundred-mode . [(20161028 2236) ((cl-lib (0 5))) "Use only the ten hundred most usual words" tar ((:url . "https://github.com/aaron-em/ten-hundred-mode.el") (:commit . "bdcfda49b1819e82d61fe90947e50bb948cf7933") (:revdesc . "bdcfda49b181"))]) + (term+ . [(20170509 17) ((emacs (24)) (cl-lib (0 5))) "Term-mode enhancement" tar ((:url . "https://github.com/tarao/term-plus-el") (:commit . "c3c9239b339c127231860de43abfa08c44c0201a") (:revdesc . "c3c9239b339c") (:keywords "terminal" "emulation") (:authors ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainers ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainer "INA Lintaro" . "tarao.gnnatgmail.com"))]) + (term+key-intercept . [(20140211 750) ((term+ (0 1)) (key-intercept (0 1))) "Term+ intercept key mapping" tar ((:url . "http://github.com/tarao/term+-el") (:commit . "fd0771fd66b8c7a909aaac972194485c79ba48c4") (:revdesc . "fd0771fd66b8") (:keywords "terminal" "emulation") (:authors ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainers ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainer "INA Lintaro" . "tarao.gnnatgmail.com"))]) + (term+mux . [(20140211 749) ((term+ (0 1)) (tab-group (0 1))) "Term+ terminal multiplexer and session management" tar ((:url . "http://github.com/tarao/term+-el") (:commit . "81b60e80cf008472bfd7fad9233af2ef722c208a") (:revdesc . "81b60e80cf00") (:keywords "terminal" "emulation") (:authors ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainers ("INA Lintaro" . "tarao.gnnatgmail.com")) (:maintainer "INA Lintaro" . "tarao.gnnatgmail.com"))]) + (term-alert . [(20230407 1715) ((emacs (24 0)) (term-cmd (1 1)) (alert (1 1)) (f (0 18 2))) "Notifications when commands complete in term.el" tar ((:url . "https://github.com/calliecameron/term-alert") (:commit . "8e7e744773e41355bcd9f5c911001be08bc79bec") (:revdesc . "8e7e744773e4") (:keywords "notifications" "processes") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainers ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com"))]) + (term-cmd . [(20230407 1704) ((emacs (27 2)) (dash (2 12 0)) (f (0 18 2))) "Send commands from programs running in term.el" tar ((:url . "https://github.com/calliecameron/term-cmd") (:commit . "26c5a8cb6b55ac0d6c6bc08f6ea1b1e53f6e2654") (:revdesc . "26c5a8cb6b55") (:keywords "processes") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainers ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com"))]) + (term-manager . [(20240811 2337) ((dash (2 12 0)) (emacs (24 4))) "Contextual terminal management" tar ((:url . "https://www.github.com/IvanMalison/term-manager") (:commit . "fbf64768902cded6d75261515bd4aafe7cf56111") (:revdesc . "fbf64768902c") (:keywords "terminals" "tools") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (term-project . [(20240602 2356) ((emacs (28 1)) (term-manager (0 1 0))) "Terminal management for project.el" tar ((:url . "https://www.github.com/IvanMalison/term-manager") (:commit . "25353734c65cd5cc952e4893b552629ca1d0d37f") (:revdesc . "25353734c65c") (:keywords "project" "tools" "terminals" "vc") (:authors ("Ivan Malison" . "IvanMalison@gmail.com") ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com") ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (term-projectile . [(20240602 2356) ((emacs (24)) (term-manager (0 1 0)) (projectile (0 13 0))) "Projectile terminal management" tar ((:url . "https://www.github.com/IvanMalison/term-manager") (:commit . "25353734c65cd5cc952e4893b552629ca1d0d37f") (:revdesc . "25353734c65c") (:keywords "projectile" "tools" "terminals" "vc") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (term-run . [(20200128 702) nil "Run arbitrary command in terminal buffer" tar ((:url . "https://github.com/10sr/term-run-el") (:commit . "0fd135d55fcf864598b1fb8dd880833a1a322910") (:revdesc . "0fd135d55fcf") (:keywords "utility" "shell" "command" "term-mode") (:authors ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainers ("10sr" . "8slashes+el[at]gmail[dot]com")) (:maintainer "10sr" . "8slashes+el[at]gmail[dot]com"))]) + (termbright-theme . [(20151031 235) ((emacs (24 1))) "A more usable theme for white-on-black terminals" tar ((:url . "https://github.com/bmastenbrook/termbright-theme-el") (:commit . "bec6ab14336c0611e85f45486276004f16d20607") (:revdesc . "bec6ab14336c") (:keywords "themes") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainers ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net"))]) + (terminal-here . [(20250706 1136) ((emacs (25 1))) "Run an external terminal in current directory" tar ((:url . "https://github.com/davidshepherd7/terminal-here") (:commit . "bcdd467b8689001be3c2249859a68a8784f2db74") (:revdesc . "bcdd467b8689") (:keywords "tools" "frames") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainers ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com"))]) + (terminal-toggle . [(20190226 1510) ((emacs (24)) (popwin (1 0 0))) "Simple pop-up terminal" tar ((:url . "https://github.com/mtekman/terminal-toggle.el") (:commit . "f824d634aef3600cb7a8e2ddf9e8444c6607c160") (:revdesc . "f824d634aef3") (:keywords "outlines"))]) + (termint . [(20251216 434) ((emacs (29 1))) "Run REPLs in a terminal backend" tar ((:url . "https://github.com/milanglacier/termint.el") (:commit . "d70d34745499d30490c7b31d014cb544ce086533") (:revdesc . "d70d34745499") (:authors ("Milan Glacier" . "dev@milanglacier.com")) (:maintainers ("Milan Glacier" . "dev@milanglacier.com")) (:maintainer "Milan Glacier" . "dev@milanglacier.com"))]) + (tern . [(20191227 950) ((json (1 2)) (cl-lib (0 5)) (emacs (24))) "Tern-powered JavaScript integration" tar ((:url . "http://ternjs.net/") (:commit . "0d19800db70a6348c627a69f444b91d21ad89629") (:revdesc . "0d19800db70a"))]) + (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 ((:url . "https://github.com/ternjs/tern") (:commit . "0d19800db70a6348c627a69f444b91d21ad89629") (:revdesc . "0d19800db70a") (:authors (nil . "m.sakuraiatkiwanami.net")) (:maintainers (nil . "m.sakuraiatkiwanami.net")) (:maintainer nil . "m.sakuraiatkiwanami.net"))]) + (tern-context-coloring . [(20170102 2253) ((emacs (24 3)) (context-coloring (8 1 0)) (tern (0 0 1))) "Use Tern for context coloring" tar ((:url . "https://github.com/jacksonrayhamilton/tern-context-coloring") (:commit . "3a8e979d6cc83aabcb3dda3f5f31a6422532efba") (:revdesc . "3a8e979d6cc8") (:keywords "convenience" "faces" "tools") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainers ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com"))]) + (terraform-doc . [(20240714 418) ((emacs (25 1)) (request (0 3 0)) (promise (1 1)) (org (9 2))) "Look up terraform documentation on the fly" tar ((:url . "https://github.com/TxGVNN/terraform-doc") (:commit . "26a6674fcf6f16e4865ff5e6600bb273fdc77779") (:revdesc . "26a6674fcf6f") (:keywords "comm" "docs" "tools" "terraform") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainers ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com"))]) + (terraform-docs . [(20241216 649) ((emacs (27 1))) "Generate Terraform modules documentation with terraform-docs" tar ((:url . "https://github.com/loispostula/terraform-docs.el") (:commit . "c70d19c4007d81244b276b9d150cdfe3c2e7b8dd") (:revdesc . "c70d19c4007d") (:keywords "terraform" "tools" "docs") (:authors ("Lois Postula" . "lois@postu.la")) (:maintainers ("Lois Postula" . "lois@postu.la")) (:maintainer "Lois Postula" . "lois@postu.la"))]) + (terraform-mode . [(20251115 2210) ((emacs (24 3)) (hcl-mode (0 3)) (dash (2 17 0))) "Major mode for terraform configuration file" tar ((:url . "https://github.com/syohex/emacs-terraform-mode") (:commit . "01635df3625c0cec2bb4613a6f920b8569d41009") (:revdesc . "01635df3625c") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com"))]) + (tesouro . [(20221003 1303) ((request (0 3 2)) (emacs (24 4))) "Brazilian Portuguese synonym search in dicio.com.br" tar ((:url . "https://github.com/rberaldo/tesouro.el") (:commit . "3dbfc49209237215163be1ea338dea099ddc0795") (:revdesc . "3dbfc4920923"))]) + (test-c . [(20180423 1720) ((emacs (24 3))) "Quickly test c code" tar ((:url . "http://github.com/aaptel/test-c") (:commit . "761a576f62c7021ba941f178f153c51289df1553") (:revdesc . "761a576f62c7") (:authors ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainers ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainer "Aurélien Aptel" . "aurelien.aptel@gmail.com"))]) + (test-case-mode . [(20130525 1434) ((fringe-helper (0 1 1))) "Unit test front-end" tar ((:url . "http://nschum.de/src/emacs/test-case-mode/") (:commit . "26e397c0f930b7eb0be413ef7dd257b1da052bec") (:revdesc . "26e397c0f930") (:keywords "tools") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainer "Nikolaj Schumacher" . "bugs*nschumde"))]) + (test-cockpit . [(20250615 1258) ((emacs (28 1)) (projectile (2 7)) (toml (20230411 1449))) "A command center to run tests of a software project" tar ((:url . "https://github.com/johannes-mueller/test-cockpit.el") (:commit . "6a8527a495fb4611d569c85d06eb06154f8cfe5e") (:revdesc . "6a8527a495fb") (:authors ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainers ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainer "Johannes Mueller" . "github@johannes-mueller.org"))]) + (test-simple . [(20251030 2148) ((cl-lib (0))) "Simple Unit Test Framework for Emacs Lisp" tar ((:url . "https://github.com/rocky/emacs-test-simple") (:commit . "da8ddb6fecb820c8e0809ac0892374e755e4efec") (:revdesc . "da8ddb6fecb8") (:keywords "unit-test") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainers ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org"))]) + (tex-smart-umlauts . [(20230416 2051) nil "Smart umlaut conversion for TeX" tar ((:url . "http://hub.darcs.net/lyro/tex-smart-umlauts") (:commit . "b28bac71990e0442616157fdb64494179df5575e") (:revdesc . "b28bac71990e") (:keywords "tex" "wp") (:authors ("Frank Fischer" . "frank-fischeratshadow-soft.de")) (:maintainers ("Frank Fischer" . "frank-fischeratshadow-soft.de")) (:maintainer "Frank Fischer" . "frank-fischeratshadow-soft.de"))]) + (texfrag . [(20240415 1043) ((emacs (25)) (auctex (11 90 2))) "Preview LaTeX fragments in alien major modes" tar ((:url . "https://github.com/TobiasZawada/texfrag") (:commit . "d4d78e9ba4ae14cc554c31bb641dea38ab38babb") (:revdesc . "d4d78e9ba4ae") (:keywords "tex" "languages" "wp") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainers ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de"))]) + (text-categories . [(20240921 824) ((emacs (26 2)) (dash (2 19 1))) "Assign text categories to a buffer for mass deletion" tar ((:url . "https://github.com/Dspil/text-categories") (:commit . "ac1a5900c80a967572b80045b0dbc2a1cc3437f2") (:revdesc . "ac1a5900c80a") (:keywords "lisp") (:authors ("Dionisios Spiliopoulos" . "dennisspiliopoylos@gmail.com")) (:maintainers ("Dionisios Spiliopoulos" . "dennisspiliopoylos@gmail.com")) (:maintainer "Dionisios Spiliopoulos" . "dennisspiliopoylos@gmail.com"))]) + (textile-mode . [(20240212 1755) nil "Textile markup editing major mode" tar ((:url . "https://github.com/juba/textile-mode") (:commit . "2ad90cb6ed2560ee147417a3ec65222cc2ad33f1") (:revdesc . "2ad90cb6ed25") (:keywords "wp" "languages") (:authors ("Julien Barnier" . "julien@nozav.org")) (:maintainers ("Julien Barnier" . "julien@nozav.org")) (:maintainer "Julien Barnier" . "julien@nozav.org"))]) + (textmate . [(20110816 2146) nil "TextMate minor mode for Emacs" tar ((:url . "https://github.com/defunkt/textmate.el") (:commit . "350918b070148f0ace6d9d3cd4ebcaf15c1a8781") (:revdesc . "350918b07014") (:keywords "textmate" "osx" "mac") (:authors ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainers ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainer "Chris Wanstrath" . "chris@ozmm.org"))]) + (textmate-to-yas . [(20160409 1708) nil "Import Textmate macros into yasnippet syntax" tar ((:url . "https://github.com/mlf176f2/textmate-to-yas.el/") (:commit . "be3a768b7ac4c2e24b9d4aa6e9ac1d916cdc5a73") (:revdesc . "be3a768b7ac4") (:keywords "yasnippet" "textmate"))]) + (textsize . [(20251120 1819) ((emacs (26 1))) "Configure frame text size automatically" tar ((:url . "https://github.com/WJCFerguson/textsize") (:commit . "cfcc4d6a351c43692f408e5f0fd68de2974fcb9f") (:revdesc . "cfcc4d6a351c") (:keywords "convenience") (:authors ("James Ferguson" . "james@faff.org")) (:maintainers ("James Ferguson" . "james@faff.org")) (:maintainer "James Ferguson" . "james@faff.org"))]) + (textx-mode . [(20230324 2020) ((emacs (24 3))) "Major mode for editing TextX files" tar ((:url . "https://github.com/novakboskov/textx-mode") (:commit . "ecf90abec508cfd82d5da68474e976be907d9a77") (:revdesc . "ecf90abec508") (:keywords "textx") (:authors ("Novak Boškov" . "gnovak.boskov@gmail.com")) (:maintainers ("Novak Boškov" . "gnovak.boskov@gmail.com")) (:maintainer "Novak Boškov" . "gnovak.boskov@gmail.com"))]) + (tf2-conf-mode . [(20161209 1620) nil "TF2 Configuration files syntax highlighting" tar ((:url . "https://github.com/wynro/emacs-tf2-conf-mode") (:commit . "94c971da4a78d55da2848d1e76d513e5e0a8f7eb") (:revdesc . "94c971da4a78") (:keywords "languages") (:authors ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainers ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainer "Guillermo Robles" . "guillerobles1995@gmail.com"))]) + (tfsmacs . [(20180911 2114) ((emacs (25)) (tablist (0 70))) "MS TFS source control interaction" tar ((:url . "http://github.com/sebasmonia/tfsmacs/") (:commit . "13ee3f528ff616880611f563a68d921250692ef8") (:revdesc . "13ee3f528ff6") (:keywords "tfs" "vc") (:authors ("Dino Chiesa" . "dpchiesa@outlook.com") ("Sebastian Monia" . "smonia@outlook.com")) (:maintainers ("Dino Chiesa" . "dpchiesa@outlook.com") ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Dino Chiesa" . "dpchiesa@outlook.com"))]) + (thankful-eyes-theme . [(20251010 1114) ((emacs (24 1))) "Theme for color blindness and visual impairments" tar ((:url . "https://github.com/tanrax/thankful-eyes-theme.el") (:commit . "2fdb4271ecb91c75408993b324e1edf8dd13702e") (:revdesc . "2fdb4271ecb9") (:keywords "faces") (:authors ("Andros Fenollosa" . "hi@andros.dev")) (:maintainers ("Andros Fenollosa" . "hi@andros.dev")) (:maintainer "Andros Fenollosa" . "hi@andros.dev"))]) + (thanks . [(20250907 1400) ((emacs (25 1)) (gh (1 0 1))) "Say thanks to the authors of all your installed packages" tar ((:url . "https://github.com/FrostyX/thanks") (:commit . "7dcc186ea754695694f1ce7159ab8b6a2d663f3c") (:revdesc . "7dcc186ea754") (:keywords "tools") (:authors ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainers ("Jakub Kadlčík" . "frostyx@email.cz")) (:maintainer "Jakub Kadlčík" . "frostyx@email.cz"))]) + (the-matrix-theme . [(20251103 1021) ((emacs (26 1))) "Green-on-black dark theme inspired by \"The Matrix\" movie" tar ((:url . "https://github.com/monkeyjunglejuice/matrix-emacs-theme") (:commit . "ff0d3ba077d7d48c46a00b724de8eb4ce163fab9") (:revdesc . "ff0d3ba077d7") (:keywords "faces" "theme") (:authors ("Dan Dee" . "monkeyjunglejuice@pm.me")) (:maintainers ("Dan Dee" . "monkeyjunglejuice@pm.me")) (:maintainer "Dan Dee" . "monkeyjunglejuice@pm.me"))]) + (theme-anchor . [(20250620 13) ((emacs (26))) "Apply theme in current buffer only" tar ((:url . "https://github.com/GongYiLiao/theme-anchor") (:commit . "a9143dbd6a073a6538f011d4095432152de127b7") (:revdesc . "a9143dbd6a07") (:keywords "extensions" "lisp" "theme") (:authors ("Kiong-Gē" . "gliao.tw@pm.me")) (:maintainers ("Kiong-Gē" . "gliao.tw@pm.me")) (:maintainer "Kiong-Gē" . "gliao.tw@pm.me"))]) + (theme-changer . [(20230904 1706) ((cl-lib (0))) "Sunrise/Sunset Theme Changer for Emacs" tar ((:url . "https://github.com/hadronzoo/theme-changer") (:commit . "7febd7632451bb99a5d92f24623432c4de035ff1") (:revdesc . "7febd7632451") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (theme-looper . [(20210827 424) ((emacs (24)) (cl-lib (0 5))) "A package for switching themes in Emacs interactively" tar ((:url . "http://ismail.teamfluxion.com") (:commit . "e6e8efd740df0b68db89805ba72492818dba61ab") (:revdesc . "e6e8efd740df") (:keywords "convenience" "color-themes") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainers ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com"))]) + (theme-magic . [(20190711 2034) ((emacs (25)) (seq (1 8))) "Apply your Emacs theme to the rest of Linux" tar ((:url . "https://github.com/jcaw/theme-magic.el") (:commit . "844c4311bd26ebafd4b6a1d72ddcc65d87f074e3") (:revdesc . "844c4311bd26") (:keywords "unix" "faces" "terminals" "extensions") (: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"))]) + (therapy . [(20151113 1953) ((emacs (24))) "Hooks for managing multiple Python major versions" tar ((:url . "https://github.com/abingham/therapy") (:commit . "775a92bb7b6b0fcc5b38c0b5198a9d0a1bef788a") (:revdesc . "775a92bb7b6b") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (thingopt . [(20160520 2318) nil "Thing at Point optional utilities" tar ((:url . "https://github.com/emacsorphanage/thingopt") (:commit . "5679815852652479f3b3c9f3a98affc927384b2c") (:revdesc . "567981585265") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))]) + (thinks . [(20170802 1128) ((cl-lib (0 5))) "Insert text in a think bubble" tar ((:url . "https://github.com/davep/thinks.el") (:commit . "15e0437f5b635bdcf738ca092e26aa6d8ecdba36") (:revdesc . "15e0437f5b63") (:keywords "convenience" "quoting") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (third-time . [(20240207 1621) ((emacs (27 1))) "Third Time: A Better Way to Work" tar ((:url . "https://git.sr.ht/~swflint/third-time") (:commit . "093b74be860fac389fb173caef5fabf61e417eef") (:revdesc . "093b74be860f") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (thread-dump . [(20170816 1850) nil "Java thread dump viewer" tar ((:url . "http://github.com/nd/thread-dump.el") (:commit . "204c9600242756d4b514bb5ff6293e052bf4b49d") (:revdesc . "204c96002427"))]) + (threes . [(20160820 1242) ((emacs (24)) (seq (1 11))) "A clone of Threes (a tiny puzzle game)" tar ((:url . "https://github.com/xuchunyang/threes.el") (:commit . "6981acb30b856c77cba6aba63fefbf102cbdfbb2") (:revdesc . "6981acb30b85") (:keywords "games") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com"))]) + (thrift . [(20251221 1731) ((emacs (24))) "Major mode for fbthrift and Apache Thrift files" tar ((:url . "https://github.com/facebook/fbthrift") (:commit . "2ea32ee5220488d7395e3a20f7dab37ee2b4dca1") (:revdesc . "2ea32ee52204") (:keywords "languages"))]) + (thumb-through . [(20120119 534) nil "Plain text reader of HTML documents" tar ((:url . "https://github.com/apg/thumb-through") (:commit . "08d8fb720f93c6172653e035191a8fa9c3305e63") (:revdesc . "08d8fb720f93") (:keywords "html"))]) + (tickscript-mode . [(20171219 203) ((emacs (24 1))) "A major mode for Tickscript files" tar ((:url . "https://github.com/msherry/tickscript-mode") (:commit . "f0579f38ff14954df5002ce30ae6d4a2c978d461") (:revdesc . "f0579f38ff14") (:keywords "languages") (:authors ("Marc Sherry" . "msherry@gmail.com")) (:maintainers ("Marc Sherry" . "msherry@gmail.com")) (:maintainer "Marc Sherry" . "msherry@gmail.com"))]) + (ticktick . [(20251205 1345) ((emacs (27 1)) (request (0 3 0)) (simple-httpd (1 5 0))) "Sync Org Mode tasks with TickTick" tar ((:url . "https://github.com/polhuang/ticktick.el") (:commit . "83692995ff14cf61b97ec7f68693c214c56b566b") (:revdesc . "83692995ff14") (:keywords "tools" "ticktick" "org" "tasks" "todo"))]) + (tidal . [(20250711 1955) ((haskell-mode (16)) (emacs (25 1))) "Interact with TidalCycles for live coding patterns" tar ((:url . "https://codeberg.org/uzu/tidal") (:commit . "660ac746ec5c89da7ead100c0c46bf67e4037f41") (:revdesc . "660ac746ec5c") (:keywords "tools") (:authors (nil . "alex@slab.org")) (:maintainers (nil . "alex@slab.org")) (:maintainer nil . "alex@slab.org"))]) + (tide . [(20241019 2101) ((emacs (25 1)) (dash (2 10 0)) (s (1 11 0)) (flycheck (27)) (cl-lib (0 5))) "Typescript Interactive Development Environment" tar ((:url . "http://github.com/ananthakumaran/tide") (:commit . "6a35fe355f1442da34b976bf2decf008d6e4f991") (:revdesc . "6a35fe355f14") (:keywords "typescript") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainers ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com"))]) + (tiktoken . [(20240103 340) ((emacs (28 0)) (f (0 20 0))) "Count BPE Tokens" tar ((:url . "https://github.com/zkry/tiktoken.el") (:commit . "1dec1547024c10f32cd49129f937fa1d3ee39d01") (:revdesc . "1dec1547024c") (:keywords "tools"))]) + (tikz . [(20220526 521) ((emacs (24 1))) "A minor mode to edit TikZ pictures" tar ((:url . "https://github.com/emiliotorres/tikz") (:commit . "4b205afc5c88f050639135d1d57f1276db323842") (:revdesc . "4b205afc5c88") (:keywords "tex") (:authors ("Emilio Torres-Manzanera" . "torres@uniovi.es")) (:maintainers ("Emilio Torres-Manzanera" . "torres@uniovi.es")) (:maintainer "Emilio Torres-Manzanera" . "torres@uniovi.es"))]) + (tile . [(20161225 357) ((emacs (25 1)) (s (1 9 0)) (dash (2 12 0)) (stream (2 2 3))) "Tile windows with layouts" tar ((:url . "https://github.com/IvanMalison/tile") (:commit . "22660f21f6e95de5aba55cd5d293d4841e9a4661") (:revdesc . "22660f21f6e9") (:keywords "tile" "tiling" "window" "manager" "dynamic" "frames") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainers ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com"))]) + (time-block . [(20230511 1434) ((emacs (25 1)) (ts (0 1))) "Block running commands using time" tar ((:url . "https://git.sr.ht/~swflint/time-block-command") (:commit . "0fdb488c3fa3da2934ee486613f5bf46712b97d6") (:revdesc . "0fdb488c3fa3") (:keywords "tools" "productivity" "convenience") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (time-ext . [(20170126 1215) nil "More function for time/date" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/time-ext.el") (:commit . "d128becf660fe3f30178eb1b05cd266741f4784a") (:revdesc . "d128becf660f") (:keywords "lisp") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (time-uuid-mode . [(20240112 1005) ((emacs (24 3))) "Minor mode for previewing time uuids as an overlay" tar ((:url . "https://github.com/RobertPlant/time-uuid-mode") (:commit . "e30f50229c617bdd31a1edcd849cba1f3423fea1") (:revdesc . "e30f50229c61") (:keywords "extensions" "convenience" "data" "tools") (:authors ("Robert Plant" . "rob@robertplant.io")) (:maintainers ("Robert Plant" . "rob@robertplant.io")) (:maintainer "Robert Plant" . "rob@robertplant.io"))]) + (time-zones . [(20251103 936) ((emacs (28 1))) "Time zone lookups" tar ((:url . "https://github.com/xenodium/time-zones") (:commit . "23c866db6a3aecac5e860cda6010d9afc847e5c6") (:revdesc . "23c866db6a3a"))]) + (timecop . [(20240105 2100) ((emacs (26 3)) (datetime-format (0 0 1))) "Freeze Time for testing" tar ((:url . "https://github.com/emacs-php/emacs-datetime") (:commit . "090bfff5c28fa0a6cb629512003c49b3f43ed72d") (:revdesc . "090bfff5c28f") (:keywords "lisp" "datetime" "testing") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (timeout . [(20251210 758) ((emacs (24 4))) "Throttle or debounce Elisp functions" tar ((:url . "https://github.com/karthink/timeout") (:commit . "a5e661de4d3c1d5ac25c449011fe99059fc55920") (:revdesc . "a5e661de4d3c") (:keywords "convenience" "extensions") (:authors ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainers ("Karthik Chikmagalur" . "karthikchikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthikchikmagalur@gmail.com"))]) + (timer-revert . [(20150122 2032) nil "Minor mode to revert buffer for a given time interval" tar ((:url . "http://github.com/yyr/timer-revert") (:commit . "615c91dec8b440d2b9b7c725dd733d7432564e45") (:revdesc . "615c91dec8b4") (:keywords "timer" "revert" "auto-revert.") (:maintainers (nil . "hi@yagnesh.org")) (:maintainer nil . "hi@yagnesh.org"))]) + (timesheet . [(20221004 1702) ((s (1)) (org (9))) "Timesheet management add-on for org-mode" tar ((:url . "https://github.com/tmarble/timesheet.el") (:commit . "511751b239c84d7619ec1c61d7f108b732b64442") (:revdesc . "511751b239c8") (:keywords "org" "timesheet"))]) + (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 ((:url . "https://github.com/nlamirault/timonier") (:commit . "3460a878269424c8d19b7d5d8e04749d0a8bf203") (:revdesc . "3460a8782694") (:keywords "kubernetes" "docker") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (timp . [(20160618 803) ((emacs (24 4)) (cl-lib (0 5)) (fifo-class (1 0)) (signal (1 0))) "Multithreading library" tar ((:url . "https://github.com/mola-T/timp") (:commit . "59657bf603904635d88c3fe4ff1ce45ee6572428") (:revdesc . "59657bf60390") (:keywords "internal" "lisp" "processes" "tools") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainers ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz"))]) + (timu-caribbean-theme . [(20250411 23) ((emacs (27 1))) "Color theme with cyan/coral as a dominant color" tar ((:url . "https://gitlab.com/aimebertrand/timu-caribbean-theme") (:commit . "ae8fbab1c3fbb14ca797b0207c45d723d7d25b22") (:revdesc . "ae8fbab1c3fb") (:keywords "faces" "themes") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club"))]) + (timu-line . [(20250228 2053) ((emacs (29 1))) "Custom and simple mode line" tar ((:url . "https://gitlab.com/aimebertrand/timu-line") (:commit . "b57cc4716ca9ced3ebd8df3e689f6b1a21816f7d") (:revdesc . "b57cc4716ca9") (:keywords "modeline" "frames" "ui") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club"))]) + (timu-macos-theme . [(20251102 1635) ((emacs (27 1))) "Color theme inspired by the macOS UI" tar ((:url . "https://gitlab.com/aimebertrand/timu-macos-theme") (:commit . "20f0a64549209457045602b16097e4630f56691d") (:revdesc . "20f0a6454920") (:keywords "faces" "themes") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club"))]) + (timu-rouge-theme . [(20250411 36) ((emacs (27 1))) "Color theme inspired by the Rouge Theme for VSCode" tar ((:url . "https://gitlab.com/aimebertrand/timu-rouge-theme") (:commit . "a9f396ee77c18c1df79b52389e203850446fce56") (:revdesc . "a9f396ee77c1") (:keywords "faces" "themes") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club"))]) + (timu-spacegrey-theme . [(20250410 2248) ((emacs (26 1))) "Color theme inspired by the Spacegray theme in Sublime Text" tar ((:url . "https://gitlab.com/aimebertrand/timu-spacegrey-theme") (:commit . "a90616ae0b110920c8be134cb7ffacee75552ac7") (:revdesc . "a90616ae0b11") (:keywords "faces" "themes") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainers ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club"))]) + (tinkerer . [(20200914 1756) ((s (1 2 0))) "Elisp wrapper for Tinkerer Blogging Engine" tar ((:url . "https://github.com/yyr/tinkerer.el") (:commit . "7cedeb264a44cd62bcd9c778dca52316d09e07e5") (:revdesc . "7cedeb264a44") (:keywords "tinkerer" "blog" "wrapper") (:authors ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainers ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainer "Yagnesh Raghava Yakkala" . "hi@yagnesh.org"))]) + (tintin-mode . [(20251001 2003) ((emacs (24 3))) "Major mode for editing TinTin++ config files" tar ((:url . "https://github.com/lesharris/tintin-mode") (:commit . "7820fd9f15bfd0a492b03973621abd81c370babf") (:revdesc . "7820fd9f15bf") (:authors ("Les Harris" . "les@lesharris.com")) (:maintainers ("Les Harris" . "les@lesharris.com")) (:maintainer "Les Harris" . "les@lesharris.com"))]) + (tiny . [(20220910 1929) nil "Quickly generate linear ranges in Emacs" tar ((:url . "https://github.com/abo-abo/tiny") (:commit . "c107480fca7e42737c51b2afaa33ac31e92a7290") (:revdesc . "c107480fca7e") (:keywords "convenience") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (tiny-menu . [(20220725 1748) ((emacs (24 4))) "Display tiny menus" tar ((:url . "https://github.com/aaronbieber/tiny-menu.el") (:commit . "17eacfd1d44cd4d5482d32eac63229230c3cd3fc") (:revdesc . "17eacfd1d44c") (:keywords "menu" "tools") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainers ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com"))]) + (tinypng . [(20200306 911) ((emacs (25 1))) "Compress PNG and JPEG with TinyPNG.com API" tar ((:url . "https://github.com/xuchunyang/tinypng.el") (:commit . "f7632e073ce13ef5ce30ae5584cb482a8bb9ffff") (:revdesc . "f7632e073ce1") (:keywords "multimedia") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (tinysegmenter . [(20141124 1013) ((cl-lib (0 5))) "Super compact Japanese tokenizer in Javascript ported to emacs lisp" tar ((:url . "https://github.com/myuhe/tinysegmenter.el") (:commit . "872134704bd25c13a4c59552433da4c6881b5230") (:revdesc . "872134704bd2") (:keywords "convenience") (:authors ("lugecy" . "lugecy@gmail.com")))]) + (titlecase . [(20230714 323) ((emacs (25 1))) "Title-case phrases" tar ((:url . "https://codeberg.org/acdw/titlecase.el") (:commit . "eb8d23925fb8ccbd3b2e3804fb0a312ee227610b") (:revdesc . "eb8d23925fb8") (:authors ("Case Duckworth" . "acdw@acdw.net")) (:maintainers ("Case Duckworth" . "acdw@acdw.net")) (:maintainer "Case Duckworth" . "acdw@acdw.net"))]) + (tj3-mode . [(20180519 1228) nil "Major mode for editing TaskJuggler 3 files" tar ((:url . "https://github.com/csrhodes/tj3-mode") (:commit . "1d98eb23f1606392f34ef1b80517cfc940fb9950") (:revdesc . "1d98eb23f160") (:authors ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainers ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainer "Christophe Rhodes" . "christophe@rhodes.io"))]) + (tldr . [(20230301 136) ((emacs (24 3))) "Tldr client for Emacs" tar ((:url . "https://github.com/kuanyui/tldr.el") (:commit . "1b09d2032491d3904bd7ee9bf5ba7c7503db6593") (:revdesc . "1b09d2032491") (:keywords "tools" "docs") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainers ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com"))]) + (tmmofl . [(20121025 1101) nil "Calls functions dependant on font lock highlighting at point" tar ((:url . "https://github.com/phillord/tmmofl") (:commit . "532aa6978e994e2b069ffe37aaf9a0011a07dadc") (:revdesc . "532aa6978e99") (:keywords "minor mode" "font lock" "toggling.") (: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"))]) + (tmsu . [(20241230 2209) ((emacs (28 1))) "A basic TMSU interface" tar ((:url . "https://github.com/vifon/tmsu.el") (:commit . "c75ae9bed8f3bb2229e873fcc85fe62701e47974") (:revdesc . "c75ae9bed8f3") (:keywords "files"))]) + (tmux-mode . [(20231130 1249) ((emacs (26 1))) "Major mode for tmux configuration" tar ((:url . "https://github.com/nverno/tmux-mode") (:commit . "ee50d02721600c4b31cdafbb9f2ecc5becf1a5f6") (:revdesc . "ee50d0272160") (:keywords "languages" "tmux" "config") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (tmux-pane . [(20240106 131) ((names (0 5)) (emacs (24)) (s (0))) "Provide integration between emacs window and tmux pane" tar ((:url . "https://github.com/laishulu/emacs-tmux-pane") (:commit . "0ab0d40b497e984a589189358e04e322b8165985") (:revdesc . "0ab0d40b497e") (:keywords "convenience" "terminals" "tmux" "window" "pane" "navigation" "integration"))]) + (toc-mode . [(20220926 530) ((emacs (26 1))) "Manage outlines/table of contents of pdf and djvu documents" tar ((:url . "https://github.com/dalanicolai/toc-mode") (:commit . "448a0ac00c110802f3124bbf9c5a72bdfc3c3c28") (:revdesc . "448a0ac00c11") (:keywords "tools" "outlines" "convenience") (:authors ("Daniel Laurens Nicolai" . "dalanicolai@gmail.com")) (:maintainers ("Daniel Laurens Nicolai" . "dalanicolai@gmail.com")) (:maintainer "Daniel Laurens Nicolai" . "dalanicolai@gmail.com"))]) + (toc-org . [(20220110 1452) nil "Add table of contents to org-mode files (formerly, org-toc)" tar ((:url . "https://github.com/snosov1/toc-org") (:commit . "bf2e4b358efbd860ecafe6e74776de0885d9d100") (:revdesc . "bf2e4b358efb") (:keywords "org-mode" "org-toc" "toc-org" "org" "toc" "table" "of" "contents") (:authors ("Sergei Nosov" . "sergei.nosov[at]gmail.com")) (:maintainers ("Sergei Nosov" . "sergei.nosov[at]gmail.com")) (:maintainer "Sergei Nosov" . "sergei.nosov[at]gmail.com"))]) + (todoist . [(20240624 1512) ((dash (2 15 0)) (transient (0 1 0)) (org (8 3 5)) (emacs (25 3))) "Extension for interacting and managing todoist tasks" tar ((:url . "https://github.com/abrochard/emacs-todoist") (:commit . "205c730a4615dec20ea71ccd0a09479a420cb974") (:revdesc . "205c730a4615") (:keywords "todoist" "task" "todo" "comm"))]) + (todotxt . [(20220204 1903) nil "A major mode for editing todo.txt files" tar ((:url . "https://github.com/rpdillon/todotxt.el") (:commit . "ddb25fb931b4bbc1af14c4c712d412af454794c4") (:revdesc . "ddb25fb931b4") (:keywords "todo.txt" "todotxt" "todotxt.el") (:authors ("Rick Dillon" . "rpdillon@killring.org")) (:maintainers ("Rick Dillon" . "rpdillon@killring.org")) (:maintainer "Rick Dillon" . "rpdillon@killring.org"))]) + (todotxt-mode . [(20240802 604) nil "Major mode for editing todo.txt files" tar ((:url . "https://github.com/avillafiorita/todotxt-mode") (:commit . "ca4310cfcce4d1f3a6670b31412a9b56462e5b5d") (:revdesc . "ca4310cfcce4") (:keywords "wp" "files") (:authors ("Adolfo Villafiorita" . "adolfo.villafiorita@me.com")) (:maintainers ("Adolfo Villafiorita" . "adolfo.villafiorita@me.com")) (:maintainer "Adolfo Villafiorita" . "adolfo.villafiorita@me.com"))]) + (togetherly . [(20170426 616) ((cl-lib (0 3))) "Allow multiple clients to edit a single buffer online" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "65072b1d5e04c7098c318ebf1af279f596039ef9") (:revdesc . "65072b1d5e04"))]) + (toggle-quotes . [(20140710 926) nil "Toggle between single and double quoted string" tar ((:url . "https://github.com/toctan/toggle-quotes.el") (:commit . "33abc221d6887f0518337851318065cd86c34b03") (:revdesc . "33abc221d688") (:keywords "convenience" "quotes") (:authors ("Jim Tian" . "tianjin.sc@gmail.com")) (:maintainers ("Jim Tian" . "tianjin.sc@gmail.com")) (:maintainer "Jim Tian" . "tianjin.sc@gmail.com"))]) + (toggle-term . [(20241112 635) ((emacs (25 1))) "Quickly toggle persistent term and shell buffers" tar ((:url . "https://github.com/justinlime/toggle-term.el") (:commit . "64f7022d214d5701c6babfe4a975baa60ec999c8") (:revdesc . "64f7022d214d") (:keywords "frames" "convenience" "terminals"))]) + (toggle-test . [(20140723 537) nil "Toggle between source and test files in various programming languages" tar ((:url . "https://github.com/rags/toggle-test") (:commit . "a0b64834101c2b8b24da365baea1d36e57b069b5") (:revdesc . "a0b64834101c") (:keywords "tdd" "test" "toggle" "productivity") (:authors ("Raghunandan Rao" . "r.raghunandan@gmail.com")) (:maintainers ("Raghunandan Rao" . "r.raghunandan@gmail.com")) (:maintainer "Raghunandan Rao" . "r.raghunandan@gmail.com"))]) + (toggle-window . [(20141207 1548) nil "Toggle current window size between half and full" tar ((:url . "https://github.com/deadghost/toggle-window") (:commit . "e82c60e543933880402ede11e9423e48a17dde53") (:revdesc . "e82c60e54393") (:keywords "hide" "window"))]) + (tok-theme . [(20251010 2231) ((emacs (27 0))) "Minimal monochromatic theme with restrained color highlights" tar ((:url . "https://github.com/topikettunen/tok-theme") (:commit . "2fcfa85cbfbe46198e7f126fd4ecd32c0cecee70") (:revdesc . "2fcfa85cbfbe") (:authors ("Topi Kettunen" . "topi@topikettunen.com")) (:maintainers ("Topi Kettunen" . "topi@topikettunen.com")) (:maintainer "Topi Kettunen" . "topi@topikettunen.com"))]) + (tokei . [(20250621 1500) ((emacs (27 1)) (magit-section (3 3 0))) "Display codebase statistics" tar ((:url . "https://github.com/nagy/tokei.el") (:commit . "b16b05c9bbddd046300725d0eb4f45b38677b2fb") (:revdesc . "b16b05c9bbdd") (:authors ("Daniel Nagy" . "https://github.com/nagy")) (:maintainers ("Daniel Nagy" . "danielnagy@posteo.de")) (:maintainer "Daniel Nagy" . "danielnagy@posteo.de"))]) + (tomatinho . [(20180621 1748) nil "Simple and beautiful pomodoro timer" tar ((:url . "https://github.com/konr/tomatinho") (:commit . "b53354b9b9f496c0388d6a573b06b7d6fc53d0bd") (:revdesc . "b53354b9b9f4") (:keywords "time" "productivity" "pomodoro technique") (:authors ("Konrad Scorciapino" . "scorciapino@gmail.com")) (:maintainers ("Konrad Scorciapino" . "scorciapino@gmail.com")) (:maintainer "Konrad Scorciapino" . "scorciapino@gmail.com"))]) + (toml . [(20250729 635) nil "TOML (Tom's Obvious, Minimal Language) parser" tar ((:url . "https://github.com/gongo/emacs-toml") (:commit . "8d8cefa2a0590ed4b68064a7a55a552c0a16a68a") (:revdesc . "8d8cefa2a059") (:keywords "toml" "parser") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainers ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com"))]) + (toml-mode . [(20161107 1800) ((emacs (24)) (cl-lib (0 5))) "Major mode for editing TOML files" tar ((:url . "https://github.com/dryman/toml-mode.el") (:commit . "f6c61817b00f9c4a3cab1bae9c309e0fc45cdd06") (:revdesc . "f6c61817b00f") (:keywords "data" "toml") (:authors ("Felix Chern" . "idryman@gmail.com")) (:maintainers ("Felix Chern" . "idryman@gmail.com")) (:maintainer "Felix Chern" . "idryman@gmail.com"))]) + (tomlparse . [(20250512 1937) ((emacs (29 1))) "A straight-forward tree sitter based parser for toml data" tar ((:url . "https://github.com/johannes-mueller/tomlparse.el") (:commit . "637acb0a1e410b4db9ebe91598fb782c8e6c5ee9") (:revdesc . "637acb0a1e41") (:authors ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainers ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainer "Johannes Mueller" . "github@johannes-mueller.org"))]) + (tommyh-theme . [(20131004 2330) nil "A bright, bold-colored theme for emacs" tar ((:url . "https://github.com/wglass/tommyh-theme") (:commit . "46d1c69ee0a1ca7c67b569b891a2f28fed89e7d5") (:revdesc . "46d1c69ee0a1") (:authors ("William Glass" . "william.glass@gmail.com")) (:maintainers ("William Glass" . "william.glass@gmail.com")) (:maintainer "William Glass" . "william.glass@gmail.com"))]) + (tomorrow-night-deepblue-theme . [(20251015 1359) ((emacs (26 1))) "The Tomorrow Night Deepblue color theme" tar ((:url . "https://github.com/jamescherti/tomorrow-night-deepblue-theme.el") (:commit . "85084ded2c4f792aaed4a4a1687dadea0347c858") (:revdesc . "85084ded2c4f") (:keywords "faces" "themes"))]) + (tongbu . [(20200414 507) ((emacs (25 1)) (web-server (0 1 2))) "A web server to share text or files between two devices" tar ((:url . "https://github.com/xuchunyang/tongbu.el") (:commit . "6f6e5c5446f0c5735357ab520b249ab97295653e") (:revdesc . "6f6e5c5446f0") (:keywords "tools"))]) + (too-wide-minibuffer-mode . [(20250525 1932) ((emacs (30 1))) "Shrink minibuffer if the frame is too wide" tar ((:url . "https://github.com/hron/too-wide-minibuffer-mode") (:commit . "cde6da647ecd980644c02bf676923cd952cfeaf3") (:revdesc . "cde6da647ecd") (:keywords "convenience") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainers ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com"))]) + (topspace . [(20220824 134) ((emacs (25 1))) "Recenter line 1 with scrollable upper margin/padding" tar ((:url . "https://github.com/trevorpogue/topspace") (:commit . "33c2a6f0a11d1d88cdb2065c5a897e33507f4c86") (:revdesc . "33c2a6f0a11d") (:keywords "convenience" "scrolling" "center" "cursor" "margin" "padding") (:authors ("Trevor Edwin Pogue" . "trevor.pogue@gmail.com")) (:maintainers ("Trevor Edwin Pogue" . "trevor.pogue@gmail.com")) (:maintainer "Trevor Edwin Pogue" . "trevor.pogue@gmail.com"))]) + (topsy . [(20231214 843) ((emacs (26 3)) (compat (29 1))) "Simple sticky header" tar ((:url . "https://github.com/alphapapa/topsy.el") (:commit . "8b6c6d5026ac72b4c3704ed7bb8fafe1ea343699") (:revdesc . "8b6c6d5026ac") (:keywords "convenience") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (tornado-template-mode . [(20141128 1008) nil "A major mode for editing tornado templates" tar ((:url . "https://github.com/paradoxxxzero/tornado-template-mode") (:commit . "667c0663dbbd279b6c345446b9f2bc50eb52b747") (:revdesc . "667c0663dbbd"))]) + (torrent-mode . [(20250813 1529) ((emacs (26 1)) (tablist (1 0)) (bencoding (1 0))) "Display torrent files in a tabulated view" tar ((:url . "https://github.com/sarg/torrent-mode.el") (:commit . "5dbb59c60c0c2db24d3d138eb003c66c3578b7b4") (:revdesc . "5dbb59c60c0c") (:authors ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainers ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainer "Sergey Trofimov" . "sarg@sarg.org.ru"))]) + (torus . [(20190325 753) ((emacs (26))) "A buffer groups manager" tar ((:url . "https://github.com/chimay/torus") (:commit . "863886f10db77f3d1b16815d77561b6c81d88352") (:revdesc . "863886f10db7") (:keywords "files" "buffers" "groups" "persistent" "history" "layout" "tabs"))]) + (total-lines . [(20171227 1239) ((emacs (24 3))) "Keep track of a buffer's total number of lines" tar ((:url . "https://github.com/hinrik/total-lines") (:commit . "c762f08d039c8103f71c747e00304f209c2254f4") (:revdesc . "c762f08d039c") (:keywords "convenience" "mode-line"))]) + (total-recall . [(20250622 1434) ((emacs (29 4))) "Spaced repetition system" tar ((:url . "https://github.com/phf-1/total-recall") (:commit . "dba59b6f10829d5a3373f1ad6fc4b4a73134180b") (:revdesc . "dba59b6f1082") (:authors ("Pierre-Henry FRÖHRING" . "contact@phfrohring.com")) (:maintainers ("Pierre-Henry FRÖHRING" . "contact@phfrohring.com")) (:maintainer "Pierre-Henry FRÖHRING" . "contact@phfrohring.com"))]) + (totd . [(20150519 1440) ((s (1 9 0)) (cl-lib (0 5))) "Display a random daily emacs command" tar ((:url . "https://gitlab.com/egh/emacs-totd") (:commit . "a715f7f2df416b8a6c827a9493ce7004180a3a4f") (:revdesc . "a715f7f2df41") (:keywords "help") (:authors ("Erik Hetzner" . "egh@e6h.org")) (:maintainers ("Erik Hetzner" . "egh@e6h.org")) (:maintainer "Erik Hetzner" . "egh@e6h.org"))]) + (totp . [(20240102 1721) ((emacs (27 1))) "Time-based One-time Password (TOTP)" tar ((:url . "https://github.com/juergenhoetzel/emacs-totp") (:commit . "fe05ce6130ff1e9a76fc2aca289083475f70fd52") (:revdesc . "fe05ce6130ff") (:keywords "tools" "pass" "password") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainers ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info"))]) + (totp-auth . [(20250312 2000) ((emacs (27 1)) (base32 (0 1))) "RFC6238 TOTP" tar ((:url . "https://gitlab.com/fledermaus/totp.el") (:commit . "6acb5f3cdac840fc2d1e5c4b73a90f4c035d7116") (:revdesc . "6acb5f3cdac8") (:keywords "2fa" "two-factor" "totp" "otp" "password" "comm") (:authors ("Vivek Das Mohapatra" . "vivek@etla.org")) (:maintainers ("Vivek Das Mohapatra" . "vivek@etla.org")) (:maintainer "Vivek Das Mohapatra" . "vivek@etla.org"))]) + (tox . [(20250216 1042) ((emacs (25 1))) "Run Python tests with tox" tar ((:url . "https://github.com/chmouel/tox.el") (:commit . "831521fdfdd0b903c50616c6d675e63279c8b4aa") (:revdesc . "831521fdfdd0") (:keywords "convenience" "tools" "python" "testing") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainers ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com"))]) + (toxi-theme . [(20160424 2126) ((emacs (24))) "A dark color theme by toxi" tar ((:url . "http://bitbucket.org/postspectacular/toxi-theme/") (:commit . "9e572c6e149249b96f64722cf6f86c3aaf5f2ede") (:revdesc . "9e572c6e1492") (:authors ("Karsten Schmidt" . "info@postspectacular.com")) (:maintainers ("Karsten Schmidt" . "info@postspectacular.com")) (:maintainer "Karsten Schmidt" . "info@postspectacular.com"))]) + (tp . [(20250206 812) ((emacs (28 1)) (transient (0 5 0))) "Utilities for transient menus that POST to an API" tar ((:url . "https://codeberg.org/martianh/tp.el") (:commit . "cce2dfe0ec2b5c070cb13a7bdf95695eeb6e3caf") (:revdesc . "cce2dfe0ec2b") (:keywords "convenience" "api" "requests") (:authors ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainers ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainer "Marty Hiatt" . "mousebot@disroot.org"))]) + (tql-mode . [(20170724 254) ((emacs (24))) "TQL mode" tar ((:url . "https://github.com/tiros-dev/tql-mode") (:commit . "488add79eb3fc8ec02aedaa997fe1ed9e5c3e638") (:revdesc . "488add79eb3f") (:keywords "languages" "tql") (:authors ("Sean McLaughlin" . "seanmcl@gmail.com")) (:maintainers ("Sean McLaughlin" . "seanmcl@gmail.com")) (:maintainer "Sean McLaughlin" . "seanmcl@gmail.com"))]) + (tr-ime . [(20220604 1107) ((emacs (27 1)) (w32-ime (0 0 1))) "Emulator of IME patch for Windows" tar ((:url . "https://github.com/trueroad/tr-emacs-ime-module") (:commit . "87f0677220b755f947fe5f373b6a34e1afb82f3c") (:revdesc . "87f0677220b7") (:authors ("Masamichi Hosoda" . "trueroad@trueroad.jp")) (:maintainers ("Masamichi Hosoda" . "trueroad@trueroad.jp")) (:maintainer "Masamichi Hosoda" . "trueroad@trueroad.jp"))]) + (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 ((:url . "https://github.com/abingham/traad") (:commit . "98e23363b7e8a590a2f55976123a8c3da75c87a5") (:revdesc . "98e23363b7e8") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainers ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com"))]) + (tracking . [(20250831 39) nil "Buffer modification tracking" tar ((:url . "https://github.com/emacs-circe/circe/wiki/Tracking") (:commit . "254814886cb4fdeba0ab1a9df33f7cbcdc1900cf") (:revdesc . "254814886cb4") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx"))]) + (tracwiki-mode . [(20150119 1621) ((xml-rpc (1 6 8))) "Emacs Major mode for working with Trac" tar ((:url . "https://github.com/merickson/tracwiki-mode") (:commit . "6a620444d59b438f42383b48cd4c19c03105dba6") (:revdesc . "6a620444d59b") (:keywords "trac" "wiki" "tickets") (:authors ("Matthew Erickson" . "peawee@peawee.net")) (:maintainers ("Matthew Erickson" . "peawee@peawee.net")) (:maintainer "Matthew Erickson" . "peawee@peawee.net"))]) + (trailing-newline-indicator . [(20251115 2242) ((emacs (26 1))) "Show an indicator for the trailing newline" tar ((:url . "https://github.com/saulotoledo/trailing-newline-indicator") (:commit . "9d4d8cba8ae20301458b9f9a4399c72951c70471") (:revdesc . "9d4d8cba8ae2") (:keywords "convenience" "display" "editing") (:authors ("Saulo S. de Toledo" . "saulotoledo@gmail.com")) (:maintainers ("Saulo S. de Toledo" . "saulotoledo@gmail.com")) (:maintainer "Saulo S. de Toledo" . "saulotoledo@gmail.com"))]) + (tramp-auto-auth . [(20191027 1419) ((emacs (24 4)) (tramp (0 0))) "TRAMP automatic authentication library" tar ((:url . "https://github.com/oitofelix/tramp-auto-auth") (:commit . "f15a12dfab651aff60f4a9d70f868030a12344ac") (:revdesc . "f15a12dfab65") (:keywords "comm" "processes") (: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"))]) + (tramp-hdfs . [(20210526 339) ((emacs (24 4))) "Tramp extension to access hadoop/hdfs file system in Emacs" tar ((:url . "https://github.com/raghavgautam/tramp-hdfs") (:commit . "aa93bdbb3d5619c262ce53af1981edcd2a0705e5") (:revdesc . "aa93bdbb3d56") (:keywords "tramp" "emacs" "hdfs" "hadoop" "webhdfs" "rest") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainers ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainer "Raghav Kumar Gautam" . "raghav@apache.org"))]) + (tramp-term . [(20250628 823) nil "Automatic setup of directory tracking in ssh sessions" tar ((:url . "https://github.com/randymorris/tramp-term.el") (:commit . "4af42a379bfdbb6549d52a7c3460ba59264f19da") (:revdesc . "4af42a379bfd") (:keywords "comm" "terminals") (:authors ("Randy Morris" . "randy.morris@archlinux.us")) (:maintainers ("Randy Morris" . "randy.morris@archlinux.us")) (:maintainer "Randy Morris" . "randy.morris@archlinux.us"))]) + (transducers . [(20251118 2154) ((emacs (28 1))) "Ergonomic, efficient data processing" tar ((:url . "https://github.com/fosskers/transducers.el") (:commit . "7d36c9cdbd2179479314e4c277ecaa8020481078") (:revdesc . "7d36c9cdbd21") (:keywords "lisp") (:authors ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainers ("Colin Woodbury" . "colin@fosskers.ca")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca"))]) + (transfer-sh . [(20200601 1708) ((emacs (24 3)) (async (1 0))) "Simple interface for sending buffer contents to transfer.sh" tar ((:url . "https://gitlab.com/tuedachu/transfer-sh.el") (:commit . "0621a66d00ec91a209a542c10b158095088bd44d") (:revdesc . "0621a66d00ec") (:keywords "comm" "convenience" "files"))]) + (transform-symbol-at-point . [(20241202 1802) ((emacs (24)) (s (1 12 0)) (transient (0 3 7))) "Transforming your symbols at point" tar ((:url . "https://github.com/waymondo/transform-symbol-at-point") (:commit . "57911a5065a694bf0b404bde2ebf64b8ee8f5d89") (:revdesc . "57911a5065a6") (:keywords "convenience" "tools"))]) + (transient . [(20251215 2209) ((emacs (28 1)) (compat (30 1)) (cond-let (0 2)) (seq (2 24))) "Transient commands" tar ((:url . "https://github.com/magit/transient") (:commit . "066b985b19afbcc8f2f344cebb8d2f4c626b1bdc") (:revdesc . "066b985b19af") (:keywords "extensions") (:authors ("Jonas Bernoulli" . "emacs.transient@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.transient@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.transient@jonas.bernoulli.dev"))]) + (transient-dwim . [(20251006 339) ((emacs (26 1)) (transient (0 1))) "Useful preset transient commands" tar ((:url . "https://github.com/conao3/transient-dwim.el") (:commit . "65985faf00f5a0e5e725c4f3f9f4118d19b8ee5a") (:revdesc . "65985faf00f5") (:keywords "tools") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com"))]) + (transient-extras . [(20230721 839) ((emacs (28 1))) "Extra features for transient" tar ((:url . "https://github.com/haji-ali/transient-extras.git") (:commit . "ca0d5c597382615f0ee8300ff8718f54f8214359") (:revdesc . "ca0d5c597382") (:keywords "convenience") (:authors ("Al Haji-Ali" . "abdo.haji.ali@gmail.com") ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Al Haji-Ali" . "abdo.haji.ali@gmail.com") ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Al Haji-Ali" . "abdo.haji.ali@gmail.com"))]) + (transient-extras-a2ps . [(20230303 1511) ((emacs (28 1)) (transient-extras (1 0 0))) "A transient interface to a2ps" tar ((:url . "https://git.sr.ht/~swflint/transient-extras-a2ps") (:commit . "e91a1cddb1f0cb8b99d2bd30db64d467e5fa7ea8") (:revdesc . "e91a1cddb1f0") (:keywords "convenience") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainers ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org"))]) + (transient-extras-lp . [(20230418 1112) ((emacs (28 1)) (transient-extras (1 0 0))) "A transient interface to lp" tar ((:url . "https://github.com/haji-ali/transient-extras.git") (:commit . "00a4b22882399c0355a2026b1a1c98974e669e62") (:revdesc . "00a4b2288239") (:keywords "convenience") (:authors ("Al Haji-Ali" . "abdo.haji.ali@gmail.com")) (:maintainers ("Al Haji-Ali" . "abdo.haji.ali@gmail.com")) (:maintainer "Al Haji-Ali" . "abdo.haji.ali@gmail.com"))]) + (transient-posframe . [(20241212 940) ((emacs (26 1)) (posframe (1 4 4)) (transient (0 8 2))) "Using posframe to show transient" tar ((:url . "https://github.com/yanghaoxie/transient-posframe") (:commit . "1eb4ed61ad9f0272a887e05f00708f85f2d9efc5") (:revdesc . "1eb4ed61ad9f") (:keywords "convenience" "bindings" "tooltip") (:maintainers ("Yanghao Xie" . "yhaoxie@gmail.com")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com"))]) + (translate-mode . [(20220511 1357) ((emacs (24 3))) "Paragraph-oriented side-by-side doc translation workflow" tar ((:url . "https://github.com/rayw000/translate-mode") (:commit . "e1940b333241a4d0c224b7b875962736ca2b693b") (:revdesc . "e1940b333241") (:keywords "translate" "convenience" "editing") (:authors ("Ray Wang" . "rayw.public@gmail.com")) (:maintainers ("Ray Wang" . "rayw.public@gmail.com")) (:maintainer "Ray Wang" . "rayw.public@gmail.com"))]) + (transmission . [(20250524 340) ((emacs (24 4)) (let-alist (1 0 5))) "Interface to a Transmission session" tar ((:url . "https://github.com/holomorph/transmission") (:commit . "ae36637fe63e530c7b8baa59bf566a99e40fbfe4") (:revdesc . "ae36637fe63e") (:keywords "comm" "tools") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainers ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu"))]) + (transpose-frame . [(20221109 2053) nil "Transpose windows arrangement in a frame" tar ((:url . "https://github.com/emacsorphanage/transpose-frame") (:commit . "94c87794d53883a2358d13da264ad8dab9a52daa") (:revdesc . "94c87794d538") (:keywords "window"))]) + (transpose-mark . [(20150405 716) nil "Transpose data using the Emacs mark" tar ((:url . "https://github.com/kwrooijen/transpose-mark") (:commit . "667327602004794de97214cf336ac61650ef75b7") (:revdesc . "667327602004") (:keywords "transpose" "convenience") (: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"))]) + (transwin . [(20250101 1013) ((emacs (24 3))) "Make window/frame transparent" tar ((:url . "https://github.com/jcs-elpa/transwin") (:commit . "bcf4cc2e83ab771dcec43973106951c643637a91") (:revdesc . "bcf4cc2e83ab") (:keywords "frames" "window" "transparent") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (trashed . [(20230811 157) ((emacs (25 1))) "Viewing/editing system trash can" tar ((:url . "https://github.com/shingo256/trashed") (:commit . "52a52a363ce53855790e7a59aed6976eec18c9ea") (:revdesc . "52a52a363ce5") (:keywords "files" "convenience" "unix") (:authors ("Shingo Tanaka" . "shingo.fg8@gmail.com")) (:maintainers ("Shingo Tanaka" . "shingo.fg8@gmail.com")) (:maintainer "Shingo Tanaka" . "shingo.fg8@gmail.com"))]) + (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 ((:url . "https://github.com/nlamirault/emacs-travis") (:commit . "c8769d3db10ed4604969049e3bd276afa0a0138e") (:revdesc . "c8769d3db10e") (:keywords "travis") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainers ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com"))]) + (tray . [(20251130 2326) ((emacs (28 1)) (compat (30 1)) (transient (0 10))) "Various transient menus" tar ((:url . "https://github.com/tarsius/tray") (:commit . "e9133190502b5923859f590abf6e18e198b878ef") (:revdesc . "e9133190502b") (:keywords "convenience") (:authors ("Jonas Bernoulli" . "emacs.tray@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.tray@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.tray@jonas.bernoulli.dev"))]) + (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 ((:url . "https://github.com/ethan-leba/tree-edit") (:commit . "3e71d276e7369ff4525f0e2b84356a31fe6b7782") (:revdesc . "3e71d276e736") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainers ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com"))]) + (tree-mode . [(20151104 1331) nil "A mode to manage tree widgets" tar ((:url . "https://github.com/emacsorphanage/tree-mode") (:commit . "b06078826d5875d74b0e7b7ac47b0d0917610534") (:revdesc . "b06078826d58") (:keywords "help" "convenience" "widget") (:authors (nil . "wenbinye@163.com")) (:maintainers (nil . "wenbinye@163.com")) (:maintainer nil . "wenbinye@163.com"))]) + (tree-sitter . [(20251222 1802) ((emacs (27 1)) (tsc (0 19 3))) "Incremental parsing system" tar ((:url . "https://github.com/emacs-tree-sitter/elisp-tree-sitter") (:commit . "d12aff8ee91dcd643da0a65a3bcee7be9a3cac68") (:revdesc . "d12aff8ee91d") (:keywords "languages" "tools" "parsers" "tree-sitter") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (tree-sitter-ess-r . [(20250729 1500) ((emacs (26 1)) (ess (18 10 1)) (tree-sitter (0 12 1)) (tree-sitter-langs (0 12 0))) "R with tree-sitter" tar ((:url . "https://github.com/ShuguangSun/tree-sitter-ess-r") (:commit . "205b105c72220ae0db5e1cbbb1c54756c7492761") (:revdesc . "205b105c7222") (:keywords "tools") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainers ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com"))]) + (tree-sitter-indent . [(20220411 1439) ((emacs (26 1)) (tree-sitter (0 12 1)) (seq (2 20))) "Provide indentation with a Tree-sitter backend" tar ((:url . "https://codeberg.org/FelipeLema/tree-sitter-indent.el") (:commit . "4ef246db3e4ff99f672fe5e4b416c890f885c09e") (:revdesc . "4ef246db3e4f") (:keywords "convenience" "internal") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainers ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org"))]) + (tree-sitter-ispell . [(20240610 2252) ((emacs (26 1)) (tree-sitter (0 15 0))) "Run ispell on tree-sitter text nodes" tar ((:url . "https://github.com/erickgnavar/tree-sitter-ispell.el") (:commit . "a06eff00affff85992d2a8ad0019034747ffeb70") (:revdesc . "a06eff00afff") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io"))]) + (tree-sitter-langs . [(20251225 1727) ((emacs (26 1)) (tree-sitter (0 15 0))) "Grammar bundle for tree-sitter" tar ((:url . "https://github.com/emacs-tree-sitter/tree-sitter-langs") (:commit . "2910a597598f1741245ebbb9e16d8f9030a2caf4") (:revdesc . "2910a597598f") (:keywords "languages" "tools" "parsers" "tree-sitter") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (treebundel . [(20250515 2241) ((emacs (27 1)) (compat (29 1 4 2))) "Bundle related git-worktrees together" tar ((:url . "https://github.com/purplg/treebundel") (:commit . "5c98d9aac3b3859bdfb490436dd8225aaa6f5ae9") (:revdesc . "5c98d9aac3b3") (:keywords "convenience" "vc"))]) + (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 ((:url . "https://github.com/cyberthal/treefactor") (:commit . "75357757022a4399ab772ff0d92065bd114dabe9") (:revdesc . "75357757022a") (:keywords "outlines" "files" "convenience") (:authors ("Leo Littlebook" . "Leo.Littlebook@gmail.com")) (:maintainers ("Leo Littlebook" . "Leo.Littlebook@gmail.com")) (:maintainer "Leo Littlebook" . "Leo.Littlebook@gmail.com"))]) + (treemacs . [(20251226 1307) ((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 ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "2ab5a3c89fa01bbbd99de9b8986908b2bc5a7b49") (:revdesc . "2ab5a3c89fa0") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (treemacs-all-the-icons . [(20250320 2145) ((emacs (26 1)) (all-the-icons (4 0 1)) (treemacs (0 0))) "All-the-icons integration for treemacs" tar ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "55079b017fb821a34ace398cd3d8c5b556a22f6d") (:revdesc . "55079b017fb8") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainers ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com"))]) + (treemacs-evil . [(20250320 2145) ((emacs (26 1)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" tar ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "55079b017fb821a34ace398cd3d8c5b556a22f6d") (:revdesc . "55079b017fb8") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (treemacs-icons-dired . [(20250320 2145) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" tar ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "55079b017fb821a34ace398cd3d8c5b556a22f6d") (:revdesc . "55079b017fb8") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (treemacs-magit . [(20250726 2233) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" tar ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "68e444e066a30d70a201fb162c8cf3d472226853") (:revdesc . "68e444e066a3") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (treemacs-nerd-icons . [(20251024 1914) ((emacs (24 3)) (nerd-icons (0 0 1)) (treemacs (0 0))) "Emacs Nerd Font Icons theme for treemacs" tar ((:url . "https://github.com/rainstormstudio/treemacs-nerd-icons") (:commit . "0c5ddcb978da639f01ddb023febc40fc755171e5") (:revdesc . "0c5ddcb978da") (:keywords "lisp") (:authors ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainers ("Hongyu Ding" . "rainstormstudio@yahoo.com")) (:maintainer "Hongyu Ding" . "rainstormstudio@yahoo.com"))]) + (treemacs-persp . [(20250320 2145) ((emacs (26 1)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" tar ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "55079b017fb821a34ace398cd3d8c5b556a22f6d") (:revdesc . "55079b017fb8") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (treemacs-perspective . [(20250320 2145) ((emacs (26 1)) (treemacs (0 0)) (perspective (2 8)) (dash (2 11 0))) "Perspective integration for treemacs" tar ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "55079b017fb821a34ace398cd3d8c5b556a22f6d") (:revdesc . "55079b017fb8") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainers ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (treemacs-projectile . [(20250320 2206) ((emacs (26 1)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" tar ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "f80a309319c2374585babcb3e00ea6f3314160f3") (:revdesc . "f80a309319c2") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainers ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (treemacs-tab-bar . [(20250320 2145) ((emacs (27 1)) (treemacs (0 0)) (dash (2 11 0))) "Tab bar integration for treemacs" tar ((:url . "https://github.com/Alexander-Miller/treemacs") (:commit . "55079b017fb821a34ace398cd3d8c5b556a22f6d") (:revdesc . "55079b017fb8") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org") ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainers ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org") ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Alexander Miller" . "alexanderm@web.de"))]) + (treepy . [(20240930 728) ((emacs (25 1))) "Generic tree traversal tools" tar ((:url . "https://github.com/volrath/treepy.el") (:commit . "651e2634f01f346da9ec8a64613c51f54b444bc3") (:revdesc . "651e2634f01f") (:keywords "lisp" "maint" "tools") (:authors ("Daniel Barreto" . "daniel.barreto.n@gmail.com")) (:maintainers ("Daniel Barreto" . "daniel.barreto.n@gmail.com")) (:maintainer "Daniel Barreto" . "daniel.barreto.n@gmail.com"))]) + (treesit-auto . [(20240511 1425) ((emacs (29 0))) "Automatically use tree-sitter enhanced major modes" tar ((:url . "https://github.com/renzmann/treesit-auto.git") (:commit . "016bd286a1ba4628f833a626f8b9d497882ecdf3") (:revdesc . "016bd286a1ba") (:keywords "treesitter" "auto" "automatic" "major" "mode" "fallback" "convenience") (:authors ("Robb Enzmann" . "robbenzmann@gmail.com")) (:maintainers ("Robb Enzmann" . "robbenzmann@gmail.com")) (:maintainer "Robb Enzmann" . "robbenzmann@gmail.com"))]) + (treesit-ispell . [(20241104 1520) ((emacs (29 1))) "Run ispell on tree-sitter text nodes" tar ((:url . "https://github.com/erickgnavar/treesit-ispell.el") (:commit . "fd1598fb16fe99dc8d8245974641c3e474dc31d1") (:revdesc . "fd1598fb16fe") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainers ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io"))]) + (treeview . [(20241101 115) ((emacs (25 1))) "A generic tree navigation library" tar ((:url . "https://github.com/tilmanrassy/emacs-treeview") (:commit . "9a1a16f84fc3c368443641f7a71aa2407ad91d38") (:revdesc . "9a1a16f84fc3") (:keywords "lisp" "tools" "internal" "convenience") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainers ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com"))]) + (trident-mode . [(20190410 2036) ((emacs (24)) (slime (20130526)) (skewer-mode (1 5 0)) (dash (1 0 3))) "Live Parenscript interaction" tar ((:url . "https://github.com/johnmastro/trident-mode.el") (:commit . "109a1bc10bd0c4b47679a6ca5c4cd27c7c8d4ccb") (:revdesc . "109a1bc10bd0") (:keywords "languages" "lisp" "processes" "tools") (:authors ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainers ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com"))]) + (trimspace-mode . [(20240629 1843) ((emacs (24 3))) "A minor mode to trim trailing whitespace and newlines" tar ((:url . "https://git.sr.ht/~bkhl/trimspace-mode") (:commit . "68fb627ba552644ddee0cf9048b2fefd722a59fb") (:revdesc . "68fb627ba552") (:keywords "files" "convenience") (:authors ("Björn Lindström" . "bkhl@elektrubadur.se")) (:maintainers ("Björn Lindström" . "bkhl@elektrubadur.se")) (:maintainer "Björn Lindström" . "bkhl@elektrubadur.se"))]) + (trinary . [(20230301 2044) ((emacs (24))) "Trinary logic" tar ((:url . "https://github.com/emacs-elsa/trinary-logic") (:commit . "d4869d260f22d13a9a71327a6d40edc6980d022e") (:revdesc . "d4869d260f22") (:keywords "languages") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com"))]) + (tron-legacy-theme . [(20230506 1037) nil "An original retro-futuristic theme inspired by Tron: Legacy" tar ((:url . "https://github.com/ianpan870102/tron-legacy-emacs-theme") (:commit . "44996469041a9b7f54c2a42ad2a3c16ac9579d77") (:revdesc . "44996469041a"))]) + (trope-mode . [(20250120 2029) ((emacs (29 1))) "Major mode to edit TV Tropes format \".trp\" files" tar ((:url . "https://github.com/TriAttack238/trope-mode") (:commit . "50ff6d4181a01115aa5a483eb16bc7bfc4b1aaa9") (:revdesc . "50ff6d4181a0") (:keywords "tv tropes" "trope" "wp") (:authors ("Sean Vo" . "triattack238@gmail.com")) (:maintainers ("Sean Vo" . "triattack238@gmail.com")) (:maintainer "Sean Vo" . "triattack238@gmail.com"))]) + (trr . [(20191019 1403) nil "A type-writing training program on GNU Emacs" tar ((:url . "https://github.com/kawabata/emacs-trr") (:commit . "f841173e11213ac6916b2d3394b28fb202543871") (:revdesc . "f841173e1121") (:keywords "games" "faces") (:authors ("YAMAMOTO Hirotaka" . "ymmt@is.s.u-tokyo.ac.jp") ("KATO Kenji" . "kato@suri.co.jp") ("INAMURA You" . "inamura@icot.or.jp")) (:maintainers ("YAMAMOTO Hirotaka" . "ymmt@is.s.u-tokyo.ac.jp") ("KATO Kenji" . "kato@suri.co.jp") ("INAMURA You" . "inamura@icot.or.jp")) (:maintainer "YAMAMOTO Hirotaka" . "ymmt@is.s.u-tokyo.ac.jp"))]) + (truthy . [(20140508 2041) ((list-utils (0 4 2))) "Test the content of a value" tar ((:url . "http://github.com/rolandwalker/truthy") (:commit . "782cee08fbb13f9be71ce8e88d980ec14db24a0f") (:revdesc . "782cee08fbb1") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (try . [(20181204 236) ((emacs (24))) "Try out Emacs packages" tar ((:url . "http://github.com/larstvei/try") (:commit . "8831ded1784df43a2bd56c25ad3d0650cdb9df1d") (:revdesc . "8831ded1784d") (:keywords "packages") (:authors ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainers ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainer "Lars Tveito" . "larstvei@ifi.uio.no"))]) + (ts . [(20220822 2313) ((emacs (26 1)) (dash (2 14 1)) (s (1 12 0))) "Timestamp and date/time library" tar ((:url . "http://github.com/alphapapa/ts.el") (:commit . "552936017cfdec89f7fc20c254ae6b37c3f22c5b") (:revdesc . "552936017cfd") (:keywords "calendar" "lisp") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (ts-comint . [(20181219 719) nil "Run a Typescript interpreter in an inferior process window" tar ((:url . "https://github.com/josteink/ts-comint") (:commit . "b280cfe9fe5ecec9d5970043b6b2866f644b39ad") (:revdesc . "b280cfe9fe5e") (:keywords "typescript" "node" "inferior-mode" "convenience") (:authors ("Paul Huff" . "paul.huff@gmail.com") ("Stefano Mazzucco" . "MYFIRSTNAME-AT-CURSO-DOT-RE")) (:maintainers ("Paul Huff" . "paul.huff@gmail.com") ("Stefano Mazzucco" . "MYFIRSTNAME-AT-CURSO-DOT-RE")) (:maintainer "Paul Huff" . "paul.huff@gmail.com"))]) + (tsc . [(20251222 1802) ((emacs (27 1))) "Core Tree-sitter APIs" tar ((:url . "https://github.com/emacs-tree-sitter/elisp-tree-sitter") (:commit . "d12aff8ee91dcd643da0a65a3bcee7be9a3cac68") (:revdesc . "d12aff8ee91d") (:keywords "languages" "tools" "parsers" "dynamic-modules" "tree-sitter") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") ("Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx")) (:maintainers ("Jen-Chieh Shen" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com"))]) + (tsort . [(20240417 120) ((emacs (24 4)) (compat (29 1 4 2))) "Topological sort for Emacs Lisp" tar ((:url . "https://github.com/ehawkvu/tsort.el") (:commit . "32e4f5b7b6de6f012a51f3d7ec151579d7b3e4a7") (:revdesc . "32e4f5b7b6de") (:keywords "algorithm" "tools") (:authors ("Ethan Hawk" . "ethan.hawk@valpo.edu")) (:maintainers ("Ethan Hawk" . "ethan.hawk@valpo.edu")) (:maintainer "Ethan Hawk" . "ethan.hawk@valpo.edu"))]) + (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 ((:url . "https://github.com/aki2o/emacs-tss") (:commit . "81ac6351a2ae258fd0ebf916dae9bd5a179fefd0") (:revdesc . "81ac6351a2ae") (:keywords "typescript" "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (tt-mode . [(20130804 1110) nil "Emacs major mode for editing Template Toolkit files" tar ((:url . "https://github.com/davorg/tt-mode") (:commit . "85ed3832e7eef391f7879d9990d59c7a3493c15e") (:revdesc . "85ed3832e7ee") (: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 ((:url . "https://github.com/nxg/ttl-mode") (:commit . "b4084667f92afbfe5916d1307916acbd68c52e5e") (:revdesc . "b4084667f92a"))]) + (tts . [(20251019 1853) ((emacs (29 1))) "Text-to-Speech (TTS)" tar ((:url . "https://github.com/DiogoDoreto/emacs-tts") (:commit . "e270fec575c35a24a52b762b67ef12651ebbf435") (:revdesc . "e270fec575c3") (:keywords "convenience" "languages" "multimedia" "tools") (:authors ("Diogo Doreto" . "diogo@doreto.com.br")) (:maintainers ("Diogo Doreto" . "diogo@doreto.com.br")) (:maintainer "Diogo Doreto" . "diogo@doreto.com.br"))]) + (tuareg . [(20250909 1604) ((emacs (26 3)) (caml (4 8))) "OCaml mode" tar ((:url . "https://github.com/ocaml/tuareg") (:commit . "de9572f537b71c5e67b6ad676e1f7e42e8180878") (:revdesc . "de9572f537b7") (:keywords "ocaml" "languages") (: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") ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:maintainer "Christophe Troestler" . "Christophe.Troestler@umons.ac.be"))]) + (tubestatus . [(20250112 1642) ((emacs (26 1)) (request (0 3 2))) "Get the London Tube service status" tar ((:url . "https://github.com/smallwat3r/tubestatus.el") (:commit . "3d7bcfb12823c0084190b1a02bbeed3768db2bff") (:revdesc . "3d7bcfb12823") (:authors ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainers ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainer "Matthieu Petiteau" . "matt@smallwat3r.com"))]) + (tumble . [(20160112 729) ((http-post-simple (0)) (cl-lib (0 5))) "An Tumblr mode for Emacs" tar ((:url . "https://github.com/febuiles/tumble") (:commit . "e8fd7643cccf2b6ea4170f0c5f1f87d007e7fa00") (:revdesc . "e8fd7643cccf") (:keywords "tumblr") (:authors ("Federico Builes" . "federico.builes@gmail.com")) (:maintainers ("Federico Builes" . "federico.builes@gmail.com")) (:maintainer "Federico Builes" . "federico.builes@gmail.com"))]) + (tumblesocks . [(20250109 547) ((htmlize (1 39)) (oauth (1 0 3)) (markdown-mode (1 8 1))) "An Emacs tumblr client" tar ((:url . "http://github.com/gcr/tumblesocks") (:commit . "4e72482b21750f495bffa6785b873d86743e9c0a") (:revdesc . "4e72482b2175") (:authors ("gcr" . "gcr@sneakygcr.net")) (:maintainers ("gcr" . "gcr@sneakygcr.net")) (:maintainer "gcr" . "gcr@sneakygcr.net"))]) + (turing-machine . [(20180222 438) ((emacs (24 4))) "Single-tape Turing machine simulator" tar ((:url . "http://github.com/therockmandolinist/turing-machine") (:commit . "ad1dccc9c445f9e4465e1c67cbbfea9583153047") (:revdesc . "ad1dccc9c445") (:keywords "turing" "machine" "simulation") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainers ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com"))]) + (turkish . [(20170910 1511) nil "Convert to Turkish characters on-the-fly" tar ((:url . "http://www.denizyuret.com/2006/11/emacs-turkish-mode.html") (:commit . "9831a316c176bb21a1b91226323ea4133163e00c") (:revdesc . "9831a316c176") (:keywords "turkish" "languages" "automatic" "conversion") (:maintainers ("Emre Sevinç" . "emre.sevinc@gmail.com")) (:maintainer "Emre Sevinç" . "emre.sevinc@gmail.com"))]) + (turnip . [(20150309 629) ((dash (2 6 0)) (s (1 9 0))) "Interacting with tmux from Emacs" tar ((:url . "https://github.com/kljohann/turnip.el") (:commit . "2fd32562fc6fc1cda6d91aa939cfb29f9b16e9de") (:revdesc . "2fd32562fc6f") (:keywords "terminals" "tools") (:authors ("Johann Klähn" . "kljohann@gmail.com")) (:maintainers ("Johann Klähn" . "kljohann@gmail.com")) (:maintainer "Johann Klähn" . "kljohann@gmail.com"))]) + (turtles . [(20250315 1650) ((emacs (26 1)) (compat (30 0 1 0))) "Screen-grabbing test utility" tar ((:url . "http://github.com/szermatt/turtles") (:commit . "7dca66a67173c63b27d5c6d8aa3e0248fd7f8b83") (:revdesc . "7dca66a67173") (:keywords "testing" "unix") (:authors ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainers ("Stephane Zermatten" . "szermatt@gmail.com")) (:maintainer "Stephane Zermatten" . "szermatt@gmail.com"))]) + (twig-mode . [(20130220 1850) nil "A major mode for twig" tar ((:url . "https://github.com/moljac024/twig-mode") (:commit . "51bcd41666a234119a855b9fd348d3dae7832de1") (:revdesc . "51bcd41666a2"))]) + (twilight-anti-bright-theme . [(20160622 848) nil "A soothing Emacs 24 light-on-dark theme" tar ((:url . "https://github.com/jimeh/twilight-anti-bright-theme.el") (:commit . "523b95fcdbf4a6a6483af314ad05354a3d80f23f") (:revdesc . "523b95fcdbf4") (:keywords "themes") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainers ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me"))]) + (twilight-bright-theme . [(20130605 843) nil "A Emacs 24 faces port of the TextMate theme" tar ((:url . "https://github.com/jimeh/twilight-bright-theme.el") (:commit . "9859474333fee9f907474dbd8763f617e8bfd89c") (:revdesc . "9859474333fe") (:keywords "themes") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainers ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me"))]) + (twilight-theme . [(20120412 1303) nil "Twilight theme for GNU Emacs 24 (deftheme)" tar ((:url . "https://github.com/developernotes/twilight-theme") (:commit . "77c4741cb3dcf16e53d06d6c2ffdc660c40afb5b") (:revdesc . "77c4741cb3dc") (:authors ("Nick Parker" . "nickp@developernotes.com")) (:maintainers ("Nick Parker" . "nickp@developernotes.com")) (:maintainer "Nick Parker" . "nickp@developernotes.com"))]) + (twitch-api . [(20220420 1547) ((emacs (27 1)) (dash (2 19 0))) "An elisp interface for the Twitch.tv API" tar ((:url . "https://github.com/BenediktBroich/twitch-api") (:commit . "181681097d1fc8d7b78928f8a5b38c61d0e20ef5") (:revdesc . "181681097d1f") (:keywords "multimedia" "twitch-api"))]) + (twtxt . [(20250604 516) ((emacs (25 1)) (request (0 2 0)) (visual-fill-column (2 4))) "A twtxt client for Emacs" tar ((:url . "https://codeberg.org/deadblackclover/twtxt-el") (:commit . "290d81bb944a20784f0c466fc4eebafb0b34dbe3") (:revdesc . "290d81bb944a") (:authors ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainers ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainer "DEADBLACKCLOVER" . "deadblackclover@protonmail.com"))]) + (txl . [(20250709 1113) ((request (0 3 2)) (guess-language (0 0 1)) (emacs (24 4))) "Provides machine translation via DeepL's REST API" tar ((:url . "https://github.com/tmalsburg/txl.el") (:commit . "ad0ff6b9b66465457709c9f79d881b7e0ddbd352") (:revdesc . "ad0ff6b9b664") (:keywords "wp") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainers ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de"))]) + (typescript-mode . [(20250118 2056) ((emacs (24 3))) "Major mode for editing typescript" tar ((:url . "http://github.com/ananthakumaran/typescript.el") (:commit . "481df3ad2cdf569d8e6697679669ff6206fbd2f9") (:revdesc . "481df3ad2cdf") (:keywords "typescript" "languages"))]) + (typespec-ts-mode . [(20250127 834) ((emacs (29 1))) "Major mode for TypeSpec (using tree-sitter)" tar ((:url . "https://github.com/pradyuman/typespec-ts-mode") (:commit . "92f9a9e18876069cb176011d05854c6934cf5143") (:revdesc . "92f9a9e18876") (:keywords "languages" "tree-sitter" "typespec") (:authors ("Pradyuman Vig" . "me@pmn.co")) (:maintainers ("Pradyuman Vig" . "me@pmn.co")) (:maintainer "Pradyuman Vig" . "me@pmn.co"))]) + (typewriter-roll-mode . [(20250718 2028) ((emacs (24 1))) "Aid for distraction-free writing" tar ((:url . "https://github.com/KeyWeeUsr/typewriter-roll-mode") (:commit . "dd6738e86db6492c945e3a9238e0cfbe154ad98b") (:revdesc . "dd6738e86db6") (:keywords "convenience" "line" "carriage" "writing" "distraction" "cr" "rewind") (:authors ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainers ("Peter Badida" . "keyweeusr@gmail.com")) (:maintainer "Peter Badida" . "keyweeusr@gmail.com"))]) + (typing . [(20180830 2203) nil "The Typing Of Emacs" tar ((:url . "http://www.emacswiki.org/emacs/TypingOfEmacs") (:commit . "a2ef25dde2d8eb91bd9c0c6164cb5208208647fa") (:revdesc . "a2ef25dde2d8") (:keywords "games") (:authors ("Alex Schroeder" . "alex@gnu.org")) (:maintainers ("Alex Schroeder" . "alex@gnu.org")) (:maintainer "Alex Schroeder" . "alex@gnu.org"))]) + (typit . [(20220909 1233) ((emacs (24 4)) (f (0 18)) (mmt (0 1 1))) "Typing game similar to tests on 10 fast fingers" tar ((:url . "https://github.com/mrkkrp/typit") (:commit . "6ad0d5a106c4a4428fd131653bbe7c0aab4b5f60") (:revdesc . "6ad0d5a106c4") (:keywords "games") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))]) + (typo . [(20200706 1714) nil "Minor mode for typographic editing" tar ((:url . "https://github.com/jorgenschaefer/typoel") (:commit . "173ebe4fc7ac38f344b16e6eaf41f79e38f20d57") (:revdesc . "173ebe4fc7ac") (:keywords "convenience" "wp") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx"))]) + (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 ((:url . "https://github.com/kadircancetin/typo-suggest") (:commit . "3014d18ae2f0b6b857bb613f373e034c743f4d2e") (:revdesc . "3014d18ae2f0") (:keywords "convenience" "wp") (:authors ("Kadir Can etin" . "kadircancetin@gmail.com")) (:maintainers ("Kadir Can etin" . "kadircancetin@gmail.com")) (:maintainer "Kadir Can etin" . "kadircancetin@gmail.com"))]) + (typst-preview . [(20251110 824) ((emacs (28 1)) (websocket (1 15)) (compat (30 1))) "Live preview of typst" tar ((:url . "https://github.com/havarddj/typst-preview.el") (:commit . "c685857f2d61133fc268509b39796b2718728f29") (:revdesc . "c685857f2d61") (:keywords "convenience" "languages" "tools") (:authors ("Håvard Damm-Johnsen" . "havard-dj@proton.me")) (:maintainers ("Håvard Damm-Johnsen" . "havard-dj@proton.me")) (:maintainer "Håvard Damm-Johnsen" . "havard-dj@proton.me"))]) + (tzc . [(20240403 332) ((emacs (28 1))) "Converts time between different time zones" tar ((:url . "https://github.com/md-arif-shaikh/tzc") (:commit . "8f425cd6f020b5082445be9547e9308be73c6adf") (:revdesc . "8f425cd6f020") (:keywords "convenience") (:authors ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainers ("Md Arif Shaikh" . "arifshaikh.astro@gmail.com")) (:maintainer "Md Arif Shaikh" . "arifshaikh.astro@gmail.com"))]) + (ubuntu-theme . [(20150805 1506) nil "A theme inspired by the default terminal colors in Ubuntu" tar ((:url . "http://github.com/rocher/ubuntu-theme") (:commit . "88b0eefc75d4cbcde103057e1c5968d4c3052f69") (:revdesc . "88b0eefc75d4") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainers ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com"))]) + (uci-mode . [(20210626 1956) ((emacs (25 1))) "Major-mode for chess engine interaction" tar ((:url . "https://github.com/dwcoates/uci-mode") (:commit . "2cdf4de5af96d56108a0a5716416ef3c8ac7bb7c") (:revdesc . "2cdf4de5af96") (:keywords "data" "games" "chess"))]) + (ucs-utils . [(20230119 2237) ((emacs (24 3)) (persistent-soft (0 8 10)) (pcache (0 5 1)) (list-utils (0 4 6))) "Utilities for Unicode characters" tar ((:url . "http://github.com/rolandwalker/ucs-utils") (:commit . "91b9e0207fff5883383fd39c45ad5522e9b90e65") (:revdesc . "91b9e0207fff") (:keywords "i18n" "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (udev-mode . [(20200702 1536) ((emacs (24))) "Major mode for editing udev rules files" tar ((:url . "https://github.com/benley/emacs-udev-mode") (:commit . "5ca236980662141518603672ebdbdf863756da5a") (:revdesc . "5ca236980662") (:keywords "languages" "unix") (:authors ("Benjamin Staffin" . "benley@gmail.com")) (:maintainers ("Benjamin Staffin" . "benley@gmail.com")) (:maintainer "Benjamin Staffin" . "benley@gmail.com"))]) + (ue . [(20210929 1301) ((emacs (26 1)) (projectile (2 5 0))) "Minor mode for Unreal Engine projects" tar ((:url . "https://gitlab.com/unrealemacs/ue.el") (:commit . "7819d5b78e5b52a09b36c634ce404dc8bc3711ef") (:revdesc . "7819d5b78e5b") (:keywords "unreal engine" "languages" "tools") (:authors ("Oleksandr Manenko" . "seidfzehsd@use.startmail.com")) (:maintainers ("Oleksandr Manenko" . "seidfzehsd@use.startmail.com")) (:maintainer "Oleksandr Manenko" . "seidfzehsd@use.startmail.com"))]) + (uimage . [(20160901 1221) nil "An iimage like mode with the ability to display url images" tar ((:url . "https://github.com/lujun9972/uimage") (:commit . "9893d09160ef7e8c0ecdcd74fca99ffeb5f9d70d") (:revdesc . "9893d09160ef") (:keywords "lisp" "url" "image") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (uiua-mode . [(20240930 1206) ((emacs (27 1)) (reformatter (0 8))) "Uiua integration" tar ((:url . "https://github.com/crmsnbleyd/uiua-mode") (:commit . "5627ac4450d5a5d2c657befc63c7594939c5ff4c") (:revdesc . "5627ac4450d5") (:keywords "languages" "uiua"))]) + (uiua-ts-mode . [(20231215 2007) ((emacs (29 1)) (uiua-mode (0 0 5))) "Uiua treesiter mode" tar ((:url . "https://github.com/crmsnbleyd/uiua-ts-mode") (:commit . "1d9b2d4929094e7df7dd23aa1204b4a47c654cc4") (:revdesc . "1d9b2d492909") (:keywords "languages" "uiua"))]) + (ujelly-theme . [(20241111 822) nil "Ujelly theme for GNU Emacs 24 (deftheme)" tar ((:url . "http://github.com/marktran/color-theme-ujelly") (:commit . "7345ab821739aafa2ec079a71fa7de350a869f0e") (:revdesc . "7345ab821739") (:authors ("Mark Tran" . "mark.tran@gmail.com")) (:maintainers ("Mark Tran" . "mark.tran@gmail.com")) (:maintainer "Mark Tran" . "mark.tran@gmail.com"))]) + (ukrainian-holidays . [(20130720 1349) nil "Ukrainian holidays for Emacs calendar" tar ((:url . "https://github.com/abo-abo/ukrainian-holidays") (:commit . "e52b0c92843e9f4d0415a7ba3b8559785497d23d") (:revdesc . "e52b0c92843e") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (ulisp-mode . [(20240807 1000) ((emacs (25 1))) "Major mode for editing and evaluate uLisp" tar ((:url . "https://codeberg.org/deadblackclover/ulisp-mode") (:commit . "7f52f030e5bf6e98ba9eee75631a6e2b95f90583") (:revdesc . "7f52f030e5bf") (:keywords "languages") (:authors ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainers ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainer "DEADBLACKCLOVER" . "deadblackclover@protonmail.com"))]) + (ultra-scroll . [(20251216 59) ((emacs (29 1))) "Fast and smooth scrolling" tar ((:url . "https://github.com/jdtsmith/ultra-scroll") (:commit . "21c568b1a26e597714ad65b40f246dd6e9f71fdd") (:revdesc . "21c568b1a26e") (:keywords "convenience"))]) + (uml-mode . [(20200129 1147) ((emacs (24 4)) (seq (0))) "Minor mode for ascii uml sequence diagrams" tar ((:url . "http://github.com/ianxm/emacs-uml") (:commit . "0ef88c74b48b5400d83ab93e3e089bbe45538fd7") (:revdesc . "0ef88c74b48b") (:keywords "docs") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainers ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu"))]) + (uncrustify-mode . [(20130707 1359) nil "Minor mode to automatically uncrustify" tar ((:url . "https://github.com/koko1000ban/emacs-uncrustify-mode") (:commit . "2c00d5cf2d1868a5955347438746f4dd82b3b9fc") (:revdesc . "2c00d5cf2d18") (:keywords "uncrustify") (:authors ("Tabito Ohtani" . "koko1000ban@gmail.com")) (:maintainers ("Tabito Ohtani" . "koko1000ban@gmail.com")) (:maintainer "Tabito Ohtani" . "koko1000ban@gmail.com"))]) + (undercover . [(20210602 2119) ((emacs (24)) (dash (2 0 0)) (shut-up (0 3 2))) "Test coverage library for Emacs Lisp" tar ((:url . "https://github.com/sviridov/undercover.el") (:commit . "1d3587f1fad66a747688f36636b67b33b73447d3") (:revdesc . "1d3587f1fad6") (:keywords "lisp" "tests" "coverage" "tools") (:authors ("Sviridov Alexander" . "sviridov.vmi@gmail.com")) (:maintainers ("Sviridov Alexander" . "sviridov.vmi@gmail.com")) (:maintainer "Sviridov Alexander" . "sviridov.vmi@gmail.com"))]) + (underline-with-char . [(20191128 2309) ((emacs (24))) "Underline with a char" tar ((:url . "https://gitlab.com/marcowahl/underline-with-char") (:commit . "36577e72aa4fbfa7f1abad01842359209f543751") (:revdesc . "36577e72aa4f") (:keywords "convenience") (:maintainers (nil . "marcowahlsoft@gmail.com")) (:maintainer nil . "marcowahlsoft@gmail.com"))]) + (undersea-theme . [(20240101 1006) ((emacs (24 3))) "Theme styled after undersea imagery" tar ((:url . "https://github.com/jcs-elpa/undersea-theme") (:commit . "0730e21187367003c533e67cdb676a423a8dccd0") (:revdesc . "0730e2118736") (:keywords "theme" "sea") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (underwater-theme . [(20131118 2) nil "A gentle, deep blue color theme" tar ((:url . "https://github.com/jmdeldin/underwater-theme.el") (:commit . "1fbd4ecd4538256c6c46f9638f883072c73ac927") (:revdesc . "1fbd4ecd4538") (:keywords "faces") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainers ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com"))]) + (undo-fu . [(20251223 519) ((emacs (25 1))) "Undo helper with redo" tar ((:url . "https://codeberg.org/ideasman42/emacs-undo-fu") (:commit . "ac67233b93a5e47088a760d6b15c254507010a2a") (:revdesc . "ac67233b93a5") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (undo-fu-session . [(20251210 2129) ((emacs (28 1))) "Persistent undo, available between sessions" tar ((:url . "https://codeberg.org/ideasman42/emacs-undo-fu-session") (:commit . "6b9ac96b6932a4ae10737caffd39a84d4e11d683") (:revdesc . "6b9ac96b6932") (:keywords "convenience") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (undo-propose . [(20210207 45) ((emacs (24 3))) "Simple and safe undo navigation" tar ((:url . "https://github.com/jackkamm/undo-propose.el") (:commit . "91a1dfe516d90dab69c368f6669bacb2458ec5e9") (:revdesc . "91a1dfe516d9") (:keywords "convenience" "files" "undo" "redo" "history"))]) + (undohist . [(20240925 754) ((cl-lib (1 0))) "Persistent undo history for GNU Emacs" tar ((:url . "https://github.com/emacsorphanage/undohist") (:commit . "fd11900663f307958dc7e1d7ea1b0004f6cdb4d0") (:revdesc . "fd11900663f3") (:keywords "convenience") (:authors ("MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (unfill . [(20230227 1349) ((emacs (24 1))) "Do the opposite of fill-paragraph or fill-region" tar ((:url . "https://github.com/purcell/unfill") (:commit . "075052ce0b4451d7d3ede013ce5a77e6a7a92360") (:revdesc . "075052ce0b44") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (unicad . [(20230903 1356) ((emacs (24)) (nadvice (0 3))) "An elisp port of Mozilla Universal Charset Auto Detector" tar ((:url . "https://github.com/ukari/unicad") (:commit . "fcc220703798d140c86711e2feeb299fd765b5b5") (:revdesc . "fcc220703798") (:keywords "i18n") (:authors ("Qichen Huang" . "unicad.el@gmail.com")) (:maintainers ("Qichen Huang" . "unicad.el@gmail.com")) (:maintainer "Qichen Huang" . "unicad.el@gmail.com"))]) + (unicode-emoticons . [(20150204 1108) nil "Shortcuts for common unicode emoticons" tar ((:url . "https://github.com/hagleitn/unicode-emoticons") (:commit . "52a09955c2afc1807c0f37f1467ccfc1e1da690a") (:revdesc . "52a09955c2af") (:keywords "games" "entertainment" "comms"))]) + (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 ((:url . "http://github.com/rolandwalker/unicode-enbox") (:commit . "4e8ac89b0460eaba6d6eaa8c463eb069660218fa") (:revdesc . "4e8ac89b0460") (:keywords "extensions" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (unicode-escape . [(20230109 1222) ((emacs (24)) (names (20151201 0)) (dash (2 12 1))) "Escape/Unescape unicode notations" tar ((:url . "https://github.com/kosh04/unicode-escape.el") (:commit . "afbb09c774571eefd4e639fc6163280476484363") (:revdesc . "afbb09c77457") (:keywords "i18n" "unicode") (:authors ("KOBAYASHI Shigeru" . "shigeru.kb@gmail.com")) (:maintainers ("KOBAYASHI Shigeru" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru" . "shigeru.kb@gmail.com"))]) + (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 ((:url . "http://github.com/rolandwalker/unicode-fonts") (:commit . "6245b97d8ddaeaf1de4dbe2cd85ca0f3b20ef81b") (:revdesc . "6245b97d8dda") (:keywords "i18n" "faces" "frames" "wp" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (unicode-math-input . [(20251012 953) ((emacs (25))) "Insert Unicode math symbols using TeX notation" tar ((:url . "https://github.com/astoff/unicode-math-input.el") (:commit . "d7ee1a963f140acd5650b86e808129077c6a7828") (:revdesc . "d7ee1a963f14"))]) + (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 ((:url . "http://github.com/rolandwalker/unicode-progress-reporter") (:commit . "17415a96144506e5ffa49377d4c814023e06f425") (:revdesc . "17415a961445") (:keywords "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (unicode-troll-stopper . [(20190209 411) nil "Minor mode for Highlighting Unicode homoglyphs" tar ((:url . "https://github.com/camsaul/emacs-unicode-troll-stopper") (:commit . "5e8be35a7bf6382384a701663f7438ee27e4b67c") (:revdesc . "5e8be35a7bf6") (:keywords "unicode") (:authors ("Cam Saül" . "cammsaul@gmail.com")) (:maintainers ("Cam Saül" . "cammsaul@gmail.com")) (:maintainer "Cam Saül" . "cammsaul@gmail.com"))]) + (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 ((:url . "http://github.com/rolandwalker/unicode-whitespace") (:commit . "b0cbfe4f9998a2c1eb4cba031efcb785ef518916") (:revdesc . "b0cbfe4f9998") (:keywords "faces" "wp" "interface") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (unidecode . [(20201213 1449) nil "Transliterate Unicode to ASCII" tar ((:url . "https://github.com/sindikat/unidecode") (:commit . "525b51b38f5b0435642005957740fe22ecb2a53c") (:revdesc . "525b51b38f5b") (:authors ("sindikat" . "sindikatatmail36dotnet")) (:maintainers ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com"))]) + (unifdef . [(20250102 1047) nil "Delete code guarded by processor directives" tar ((:url . "https://github.com/Lindydancer/unifdef") (:commit . "4a428d544893e91835b625fab38fdac964dcff88") (:revdesc . "4a428d544893") (:keywords "convenience" "languages"))]) + (unify-opening . [(20230903 844) ((emacs (24 4))) "Unify the mechanism to open files" tar ((:url . "https://github.com/DamienCassou/unify-opening") (:commit . "282ce0e35ecebbe602bec6f8d64f0192d8a18342") (:revdesc . "282ce0e35ece") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainers ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com"))]) + (uniline . [(20251223 1848) ((emacs (29 1)) (hydra (0 15 0))) "Add▶ ■─UNICODE based diagrams─■ to▶ ■─text files─■" tar ((:url . "https://github.com/tbanel/uniline") (:commit . "4fe0ac75d1d19f2c56f58834338603bd4e2b23ab") (:revdesc . "4fe0ac75d1d1") (:keywords "convenience" "text"))]) + (unipoint . [(20140113 2224) nil "A simple way to insert unicode characters by TeX name" tar ((:url . "https://github.com/apgwoz/unipoint") (:commit . "5da04aebac35a5c9e1d8704f2231808d42f4b36a") (:revdesc . "5da04aebac35") (:authors ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainers ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainer "Andrew Gwozdziewycz" . "git@apgwoz.com"))]) + (unison . [(20160704 740) ((emacs (24 1))) "Sync with Unison" tar ((:url . "http://github.com/unhammer/unison.el") (:commit . "a78a04c0d1398d00f75a1bd4799622a65bcb0f28") (:revdesc . "a78a04c0d139") (:keywords "sync") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainers ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org"))]) + (unison-mode . [(20160513 1501) nil "Syntax highlighting for unison file synchronization program" tar ((:url . "https://github.com/impaktor/unison-mode") (:commit . "0bd6a65c0d12f87fcf7bdff15fe54444959b93bf") (:revdesc . "0bd6a65c0d12") (:keywords "symchronization" "unison") (:authors ("Karl Fogelmark" . "karlfogel@gmail.com")) (:maintainers ("Karl Fogelmark" . "karlfogel@gmail.com")) (:maintainer "Karl Fogelmark" . "karlfogel@gmail.com"))]) + (unison-ts-mode . [(20251209 856) ((emacs (29 1))) "Tree-sitter support for Unison" tar ((:url . "https://github.com/fmguerreiro/unison-ts-mode") (:commit . "f8d291e8be9b2a3259d59e2d469660465a3d5deb") (:revdesc . "f8d291e8be9b") (:keywords "languages" "unison" "tree-sitter") (:authors ("Filipe Guerreiro" . "filipe.m.guerreiro@gmail.com")) (:maintainers ("Filipe Guerreiro" . "filipe.m.guerreiro@gmail.com")) (:maintainer "Filipe Guerreiro" . "filipe.m.guerreiro@gmail.com"))]) + (unisonlang-mode . [(20200803 808) ((emacs (25 1))) "Simple major mode for editing Unison" tar ((:url . "https://github.com/dariooddenino/unison-mode-emacs") (:commit . "b8da68fc2a6a62a255a6089b0c6794bfa2370f34") (:revdesc . "b8da68fc2a6a") (:keywords "languages"))]) + (units-mode . [(20221027 303) ((emacs (24 4))) "Mode for conversion between different units" tar ((:url . "https://github.com/Atreyagaurav/units-mode") (:commit . "10c8de24180f87b1a8a3b0a9b3fbb29eec925417") (:revdesc . "10c8de24180f") (:keywords "units" "unit-conversion" "convenience") (:authors ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainers ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainer "Gaurav Atreya" . "allmanpride@gmail.com"))]) + (universal-emotions-emoticons . [(20180729 1941) ((emacs (24 4))) "Emoticons For The Six Universal Expressions" tar ((:url . "https://github.com/grettke/universal-emotions-emoticons") (:commit . "9cedd09ee65cb9fa71f27b0ab46a8353bdc00902") (:revdesc . "9cedd09ee65c") (:keywords "convenience" "docs" "languages") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainers (nil . "gcr@wisdomandwonder.com")) (:maintainer nil . "gcr@wisdomandwonder.com"))]) + (universal-sidecar . [(20251029 1934) ((emacs (26 1)) (magit-section (3 0 0))) "A universal sidecar buffer" tar ((:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar") (:commit . "01b12aecca0ce66f5427e7fe65012d37e7e128b2") (:revdesc . "01b12aecca0c") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (universal-sidecar-citeproc . [(20251029 1934) ((emacs (28 1)) (citeproc (0 9 4))) "Centralise Citeproc Support for Universal Sidecar" tar ((:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar") (:commit . "01b12aecca0ce66f5427e7fe65012d37e7e128b2") (:revdesc . "01b12aecca0c") (:keywords "bib" "convenience") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (universal-sidecar-elfeed-related . [(20251029 1934) ((emacs (25 1)) (universal-sidecar (1 0 0)) (bibtex-completion (1 0 0)) (elfeed (3 4 1))) "Related Papers Sidecar Section for Elfeed" tar ((:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar") (:commit . "01b12aecca0ce66f5427e7fe65012d37e7e128b2") (:revdesc . "01b12aecca0c") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (universal-sidecar-elfeed-score . [(20251029 1934) ((emacs (25 1)) (universal-sidecar (1 0 0)) (elfeed (3 4 1)) (elfeed-score (1 2 6))) "Show Elfeed Score information in sidecar" tar ((:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar") (:commit . "01b12aecca0ce66f5427e7fe65012d37e7e128b2") (:revdesc . "01b12aecca0c") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (universal-sidecar-roam . [(20251029 1934) ((emacs (26 1)) (universal-sidecar (1 0 0)) (org-roam (2 0 0))) "Integrate universal-sidecar and org-roam" tar ((:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar") (:commit . "01b12aecca0ce66f5427e7fe65012d37e7e128b2") (:revdesc . "01b12aecca0c") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (unkillable-scratch . [(20221015 1323) ((emacs (24))) "Disallow the \\*scratch\\* buffer from being killed" tar ((:url . "https://github.com/EricCrosson/unkillable-scratch") (:commit . "6c752e4cd4762bb4bcde2b0b96f2e83740efd104") (:revdesc . "6c752e4cd476") (:keywords "convenience") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainers ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.com"))]) + (unmodified-buffer . [(20220129 2022) ((emacs (24 1))) "Auto revert modified buffer state" tar ((:url . "https://github.com/arthurcgusmao/unmodified-buffer") (:commit . "9095a3f870aa570804a11d75aba0952294199715") (:revdesc . "9095a3f870aa"))]) + (unobtrusive-magit-theme . [(20200411 1349) ((emacs (24 1))) "An unobtrusive Magit theme" tar ((:url . "https://github.com/tee3/unobtrusive-magit-theme") (:commit . "aede357009655d19d4468320b2b61b0f26a47593") (:revdesc . "aede35700965") (:keywords "faces" "vc" "magit") (:authors ("Thomas A. Brown" . "tabsoftwareconsulting@gmail.com")) (:maintainers ("Thomas A. Brown" . "tabsoftwareconsulting@gmail.com")) (:maintainer "Thomas A. Brown" . "tabsoftwareconsulting@gmail.com"))]) + (unspecified-theme . [(20251203 2130) ((emacs (25)) (most-faces (0 0 3))) "Theme that unspecifies all attributes of all faces" tar ((:url . "https://codeberg.org/mekeor/unspecified-theme") (:commit . "f403d8f304d319729466fe019a74402d526ab0ee") (:revdesc . "f403d8f304d3") (:keywords "faces" "theme") (:authors ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainers ("Mekeor Melire" . "mekeor@posteo.de")) (:maintainer "Mekeor Melire" . "mekeor@posteo.de"))]) + (untappd . [(20250112 1604) ((emacs (26 1)) (request (0 3 2)) (emojify (1 2 1))) "Display your latest Untappd feed" tar ((:url . "https://github.com/smallwat3r/untappd.el") (:commit . "78b9b30e42135917ac68c9b3caab4984b3f491e2") (:revdesc . "78b9b30e4213") (:authors ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainers ("Matthieu Petiteau" . "matt@smallwat3r.com")) (:maintainer "Matthieu Petiteau" . "matt@smallwat3r.com"))]) + (untitled-new-buffer . [(20161212 1508) ((emacs (24 4)) (magic-filetype (0 2 0))) "Open untitled new buffer like other text editors" tar ((:url . "https://github.com/zonuexe/untitled-new-buffer.el") (:commit . "e359ae63bc6310e315b7c25157858f9b9796ed3d") (:revdesc . "e359ae63bc63") (:keywords "files" "convenience") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (upbo . [(20180422 822) ((dash (2 12 0)) (emacs (24 4))) "Karma Test Runner Integration" tar ((:url . "http://github.com/shiren") (:commit . "63514c484e70cd6eeae828f7e58216e1a3429184") (:revdesc . "63514c484e70") (:keywords "javascript" "js" "test" "karma"))]) + (uptimes . [(20231015 1458) ((cl-lib (0 5)) (emacs (24))) "Track and display session uptimes" tar ((:url . "https://github.com/davep/uptimes.el") (:commit . "84407aba479117344080ebf373e3e9186a96f05c") (:revdesc . "84407aba4791") (:keywords "processes" "uptime") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainers ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org"))]) + (url-shortener . [(20170805 242) nil "Shorten long url and expand tinyurl" tar ((:url . "https://github.com/yuyang0/url-shortener") (:commit . "06db8270213b9e352d6c335b0663059a1353d05e") (:revdesc . "06db8270213b") (:authors ("Yu Yang" . "yy2012cn@NOSPAM.gmail.com")) (:maintainers ("Yu Yang" . "yy2012cn@NOSPAM.gmail.com")) (:maintainer "Yu Yang" . "yy2012cn@NOSPAM.gmail.com"))]) + (urlenc . [(20140116 1456) nil "URL encoding/decoding utility for Emacs" tar ((:url . "https://github.com/buzztaiki/urlenc-el") (:commit . "835a6dcb783bbe84714bae87a3464aa0b128bfac") (:revdesc . "835a6dcb783b") (:keywords "url") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com"))]) + (ursa-ts-mode . [(20250407 1303) ((emacs (29 1))) "Major mode for Ursa, using tree-sitter" tar ((:url . "https://github.com/ursalang/ursa-ts-mode") (:commit . "25dd8c309ad9433a5bb57b47b947447c420efb77") (:revdesc . "25dd8c309ad9") (:keywords "ursalang" "languages" "tree-sitter") (:authors ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainers ("Reuben Thomas" . "rrt@sc3d.org")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org"))]) + (urscript-mode . [(20190219 1604) ((emacs (24 4))) "Major mode for editing URScript" tar ((:url . "https://github.com/guidoschmidt/urscript-mode") (:commit . "b341f96b129ead8fb74d680cb4f546985bf110a9") (:revdesc . "b341f96b129e") (:keywords "languages") (:authors ("Guido Schmidt" . "(git@guidoschmidt.cc)")) (:maintainers ("Guido Schmidt" . "(git@guidoschmidt.cc)")) (:maintainer "Guido Schmidt" . "(git@guidoschmidt.cc)"))]) + (usage-memo . [(20170926 37) nil "Integration of Emacs help system and memo" tar ((:url . "http://www.emacswiki.org/cgi-bin/wiki/download/usage-memo.el") (:commit . "88e15a9942a3e0a6e36e9c3e51e3edb746067b1a") (:revdesc . "88e15a9942a3") (:keywords "convenience" "languages" "lisp" "help" "tools" "docs") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (use-package-chords . [(20250330 1852) ((use-package (2 1)) (bind-key (1 0)) (bind-chord (0 2 2)) (key-chord (0 6))) "Key-chord keyword for use-package" tar ((:url . "https://github.com/jwiegley/use-package") (:commit . "0793b50e2bf1ec8bfc532b10baeef716c5aa947a") (:revdesc . "0793b50e2bf1") (:keywords "convenience" "tools" "extensions") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainers ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com"))]) + (use-package-hydra . [(20181228 745) ((emacs (24 3)) (use-package (2 4))) "Adds :hydra keyword to use-package macro" tar ((:url . "https://gitlab.com/to1ne/use-package-hydra") (:commit . "8cd55a1128fbdf6327bb38a199d206225896d146") (:revdesc . "8cd55a1128fb") (:keywords "convenience" "extensions" "tools") (:authors ("Toon Claes" . "toon@iotcl.com")) (:maintainers ("Toon Claes" . "toon@iotcl.com")) (:maintainer "Toon Claes" . "toon@iotcl.com"))]) + (use-proxy . [(20201209 853) ((exec-path-from-shell (1 12)) (emacs (26 2))) "Enable/Disable proxies respecting your HTTP/HTTPS env" tar ((:url . "https://github.com/rayw000/use-proxy") (:commit . "43499194224483b27628fdf99f6f9ff6e731d844") (:revdesc . "434991942244") (:keywords "proxy" "comm") (:authors ("Ray Wang" . "ray.hackmylife@gmail.com")) (:maintainers ("Ray Wang" . "ray.hackmylife@gmail.com")) (:maintainer "Ray Wang" . "ray.hackmylife@gmail.com"))]) + (use-ttf . [(20250624 1031) ((emacs (26 1))) "Keep font consistency across different OSs" tar ((:url . "https://github.com/jcs-elpa/use-ttf") (:commit . "762a10f270430b278d48fd290100f0b899e5b9f5") (:revdesc . "762a10f27043") (:keywords "convenience" "customize" "font" "install" "ttf") (:authors ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (ushin-shapes . [(20241022 522) ((emacs (27 1)) (svg-tag-mode (0 3 3)) (svg-lib (0 3)) (compat (30 0 0 0))) "USHIN shapes in org-mode" tar ((:url . "https://git.sr.ht/~ushin/ushin-shapes.el") (:commit . "fd2c4289c7d336528f1f855eb9378615417f4483") (:revdesc . "fd2c4289c7d3") (:keywords "convenience") (:authors ("Joseph Turner" . "joseph@ushin.org")) (:maintainers ("Joseph Turner" . "joseph@ushin.org")) (:maintainer "Joseph Turner" . "joseph@ushin.org"))]) + (utimeclock . [(20251224 54) ((emacs (29 1))) "Simple utility for manual time tracking" tar ((:url . "https://codeberg.org/ideasman42/emacs-utimeclock") (:commit . "1e071c7c57a56a2d2fe2c0be7f048c4de35c4f6d") (:revdesc . "1e071c7c57a5") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (utop . [(20250722 1319) ((emacs (26)) (tuareg (2 2 0))) "Universal toplevel for OCaml" tar ((:url . "https://github.com/ocaml-community/utop") (:commit . "bd6a1546e5c73c7a626e456fac5e81027106e4d6") (:revdesc . "bd6a1546e5c7") (:keywords "ocaml" "languages") (:authors ("Jeremie Dimino" . "jeremie@dimino.org")) (:maintainers ("Jeremie Dimino" . "jeremie@dimino.org")) (:maintainer "Jeremie Dimino" . "jeremie@dimino.org"))]) + (uuid . [(20120910 851) nil "UUID's for EmacsLisp" tar ((:url . "https://github.com/nicferrier/emacs-uuid") (:commit . "1519bfeb0e31602b840bc8dd35d7c7e732c159fe") (:revdesc . "1519bfeb0e31") (:keywords "lisp") (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (uuidgen . [(20240201 2318) nil "Provides various UUID generating functions" tar ((:url . "https://github.com/kanru/uuidgen-el") (:commit . "cebbe09d27c63abe61fe8c2e2248587d90265b59") (:revdesc . "cebbe09d27c6") (:keywords "extensions" "lisp" "tools") (:authors ("Kan-Ru Chen" . "kanru@kanru.info")) (:maintainers ("Kan-Ru Chen" . "kanru@kanru.info")) (:maintainer "Kan-Ru Chen" . "kanru@kanru.info"))]) + (uv-mode . [(20250703 1540) ((emacs (25 1)) (pythonic (0 1 0))) "Integrate uv with python-mode" tar ((:url . "https://github.com/z80dev/uv-mode") (:commit . "7e7f9b90832210b65823c3d58e3255cd164394b7") (:revdesc . "7e7f9b908322") (:authors ("z80" . "z80@ophy.xyz")) (:maintainers ("z80" . "z80@ophy.xyz")) (:maintainer "z80" . "z80@ophy.xyz"))]) + (uwu-theme . [(20250902 202) ((emacs (24 1))) "An awesome dark color scheme" tar ((:url . "https://github.com/kborling/uwu-theme") (:commit . "430e06214e8230357bea8252e8a56c5c1aa8f3eb") (:revdesc . "430e06214e82") (:keywords "custom themes" "dark" "faces"))]) + (uxntal-mode . [(20240327 153) ((emacs (27 1))) "Major mode for Uxntal assembly" tar ((:url . "https://github.com/non/uxntal-mode") (:commit . "1b114d97069a8c004f0ca58e0c69d61d897cef75") (:revdesc . "1b114d97069a") (:authors ("d_m" . "d_m@plastic-idolatry.com")) (:maintainers ("d_m" . "d_m@plastic-idolatry.com")) (:maintainer "d_m" . "d_m@plastic-idolatry.com"))]) + (v-mode . [(20221007 635) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the V programming language" tar ((:url . "https://github.com/damon-kwok/v-mode") (:commit . "84f26ab0f0f5b23133292674da9fa4558207c33d") (:revdesc . "84f26ab0f0f5") (:keywords "languages" "programming"))]) + (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 ((:url . "https://github.com/aborn/v2ex-mode") (:commit . "b7d19bb594b43ea3824a6f215dd1e5d1d4c0e8ad") (:revdesc . "b7d19bb594b4") (:keywords "v2ex" "v2ex.com") (:authors ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainers ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainer "Aborn Jiang" . "aborn.jiang@gmail.com"))]) + (vagrant . [(20220730 302) nil "Manage a vagrant box from emacs" tar ((:url . "https://github.com/ottbot/vagrant.el") (:commit . "eb4ec2053955eda1ac9e5ff92ded88f1919e13f2") (:revdesc . "eb4ec2053955") (:keywords "vagrant" "chef") (:authors ("Robert Crim" . "rob@servermilk.com")) (:maintainers ("Robert Crim" . "rob@servermilk.com")) (:maintainer "Robert Crim" . "rob@servermilk.com"))]) + (vagrant-tramp . [(20220508 52) ((dash (2 12 0))) "Vagrant method for TRAMP" tar ((:url . "https://github.com/dougm/vagrant-tramp") (:commit . "2b7a4fabd328961384da06e0e302250cd97edc47") (:revdesc . "2b7a4fabd328") (:keywords "vagrant") (:authors ("Doug MacEachern" . "dougm@vmware.com") ("Ryan Prior" . "ryanprior@gmail.com")) (:maintainers ("Doug MacEachern" . "dougm@vmware.com") ("Ryan Prior" . "ryanprior@gmail.com")) (:maintainer "Doug MacEachern" . "dougm@vmware.com"))]) + (vala-mode . [(20201218 2109) nil "Vala mode derived mode" tar ((:url . "https://github.com/rrthomas/vala-mode") (:commit . "d696a8177e94c81ea557ad364a3b3dcc3abbc50f") (:revdesc . "d696a8177e94") (:keywords "vala" "languages" "oop") (:maintainers ("tienne BERSAC" . "bersace03@laposte.net")) (:maintainer "tienne BERSAC" . "bersace03@laposte.net"))]) + (vala-snippets . [(20150429 352) ((yasnippet (0 8 0))) "Yasnippets for Vala" tar ((:url . "https://github.com/gopar/vala-snippets") (:commit . "671439501060449bd100b9fffd524a86064fbfbb") (:revdesc . "671439501060"))]) + (vale-mode . [(20190725 125) ((emacs (25))) "Major mode for writing Vale vaf files" tar ((:url . "https://github.com/jaybosamiya/vale-mode.el") (:commit . "48bbc4b4ee5bf0b1b73e52705c0fbc112b255cd0") (:revdesc . "48bbc4b4ee5b") (:keywords "convenience" "languages") (:authors ("Jay Bosamiya" . "jaybosamiya@gmail.com")) (:maintainers ("Jay Bosamiya" . "jaybosamiya@gmail.com")) (:maintainer "Jay Bosamiya" . "jaybosamiya@gmail.com"))]) + (validate-html . [(20241023 2029) ((emacs (25 1))) "Compilation mode for W3C HTML Validator" tar ((:url . "https://github.com/arthurgleckler/validate-html") (:commit . "4285c492d8a28025ffce7ee717e2aefc905bea66") (:revdesc . "4285c492d8a2") (:keywords "languages" "tools") (:authors ("Arthur A. Gleckler" . "melpa4aag@speechcode.com")) (:maintainers ("Arthur A. Gleckler" . "melpa4aag@speechcode.com")) (:maintainer "Arthur A. Gleckler" . "melpa4aag@speechcode.com"))]) + (varuga . [(20250618 2103) ((emacs (27 1))) "Send ical calendar invites by email" tar ((:url . "https://git.systemreboot.net/varuga") (:commit . "f055e8572b2e4d7a700392b8a71bacbfdc8e442a") (:revdesc . "f055e8572b2e") (:authors ("Arun Isaac" . "arunisaac@systemreboot.net")) (:maintainers ("Arun Isaac" . "arunisaac@systemreboot.net")) (:maintainer "Arun Isaac" . "arunisaac@systemreboot.net"))]) + (vbasense . [(20140221 2353) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 1))) "Provide a environment like Visual Basic Editor" tar ((:url . "https://github.com/aki2o/emacs-vbasense") (:commit . "8c61a492d7c15218ae1a96e2aebfe6f78bfff6db") (:revdesc . "8c61a492d7c1") (:keywords "vba" "completion") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (vc-auto-commit . [(20210216 1517) nil "Auto-committing feature for your repository" tar ((:url . "http://github.com/thisirs/vc-auto-commit.git") (:commit . "56f478016a541b395092a9d3cdc0da84a37b30a1") (:revdesc . "56f478016a54") (:keywords "vc" "convenience") (:authors ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainers ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainer "Sylvain Rousseau" . "thisirsatgmaildotcom"))]) + (vc-check-status . [(20210216 1525) nil "Warn you when quitting emacs and leaving repo dirty" tar ((:url . "https://github.com/thisirs/vc-check-status") (:commit . "d95ef8f0799cd3dd83726ffa9b01b076f378ce34") (:revdesc . "d95ef8f0799c") (:keywords "vc" "convenience") (:authors ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainers ("Sylvain Rousseau" . "thisirsatgmaildotcom")) (:maintainer "Sylvain Rousseau" . "thisirsatgmaildotcom"))]) + (vc-darcs . [(20230319 1149) ((emacs (24))) "A VC backend for darcs" tar ((:url . "https://github.com/velkyel/vc-darcs") (:commit . "097e03f119b4fedb0186fd45d730a1c5acac10dc") (:revdesc . "097e03f119b4") (:keywords "vc") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx") ("Juliusz Chroboczek" . "jch@pps.univ-paris-diderot.fr")) (:maintainers ("Libor apák" . "capak@inputwish.com")) (:maintainer "Libor apák" . "capak@inputwish.com"))]) + (vc-defer . [(20201116 701) ((emacs (25 1))) "Defer non-essential vc.el work" tar ((:url . "https://github.com/google/vc-defer") (:commit . "aeafc419c1788b3ac4f0590c635374eefd7c220c") (:revdesc . "aeafc419c178") (:keywords "vc" "tools") (:authors ("Matt Armstrong" . "marmstrong@google.com")) (:maintainers ("Tom Fitzhenry" . "tomfitzhenry@google.com")) (:maintainer "Tom Fitzhenry" . "tomfitzhenry@google.com"))]) + (vc-fossil . [(20230504 1626) nil "VC backend for the fossil sofware configuraiton management system" tar ((:url . "https://github.com/venks1/emacs-fossil") (:commit . "4a4a3e4df83ba2f1ea8bfd8aa7e9f9b2c1c32ca9") (:revdesc . "4a4a3e4df83b") (:authors ("Venkat Iyer" . "venkat@comit.com")) (:maintainers ("Alfred M. Szmidt" . "ams@gnu.org")) (:maintainer "Alfred M. Szmidt" . "ams@gnu.org"))]) + (vc-hgcmd . [(20211021 1704) ((emacs (25 1))) "VC mercurial backend that uses hg command server" tar ((:url . "https://github.com/muffinmad/emacs-vc-hgcmd") (:commit . "d044448965d31ca8214f8bca48487e4d9b9d9a0f") (:revdesc . "d044448965d3") (:keywords "vc") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainers ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com"))]) + (vc-msg . [(20250218 237) ((emacs (24 4)) (popup (0 5 0))) "Show commit information of current line" tar ((:url . "http://github.com/redguardtoo/vc-msg") (:commit . "d55a128616a876936f085e5af486924062e57d66") (:revdesc . "d55a128616a8") (:keywords "git" "vc" "svn" "hg" "messenger") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (vc-osc . [(20190402 2349) nil "Non-resident support for osc version-control" tar ((:url . "https://github.com/aspiers/vc-osc") (:commit . "bf5a515ed85f7d7cdfe66ed5bf4ef7554f8561e5") (:revdesc . "bf5a515ed85f") (:maintainers ("Adam Spiers" . "aspiers@suse.com")) (:maintainer "Adam Spiers" . "aspiers@suse.com"))]) + (vcomp . [(20240302 2255) ((emacs (25 1))) "Compare version strings" tar ((:url . "https://github.com/tarsius/vcomp") (:commit . "99831d234481a61488aca4b96b842b63a79c732a") (:revdesc . "99831d234481") (:keywords "versions") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainers ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li"))]) + (vcsh . [(20230402 1229) ((emacs (25 1))) "Vcsh integration" tar ((:url . "http://git.smrk.net/vcsh.el") (:commit . "b9c0109a8c77446980de668785e6af1e46bdcdcd") (:revdesc . "b9c0109a8c77") (:keywords "vc" "files") (: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"))]) + (vdf-mode . [(20210303 714) ((emacs (24 3))) "Major mode for editing Valve VDF files" tar ((:url . "https://github.com/plapadoo/vdf-mode") (:commit . "0910d4f847e9c817eb8da5434b3879048ec4ac92") (:revdesc . "0910d4f847e9"))]) + (vdiff . [(20230621 201) ((emacs (24 4)) (hydra (0 13 0))) "A diff tool similar to vimdiff" tar ((:url . "https://github.com/justbur/emacs-vdiff") (:commit . "170e968c6a46a572b30c52c1b038232d418734cc") (:revdesc . "170e968c6a46") (:keywords "diff") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc"))]) + (vdiff-magit . [(20250308 1214) ((emacs (24 4)) (vdiff (0 2 4)) (magit (2 10 0)) (transient (0 1 0))) "Magit integration for vdiff" tar ((:url . "https://github.com/justbur/emacs-vdiff-magit") (:commit . "cc9e2dbd81d7f717381981501472808b7a4c6d79") (:revdesc . "cc9e2dbd81d7") (:keywords "diff") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainers ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc"))]) + (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 ((:url . "https://github.com/DamienCassou/vdirel") (:commit . "d60439f0b2b55f2e220241fe73f7f79af80aaad8") (:revdesc . "d60439f0b2b5") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainers ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me"))]) + (vdm-comint . [(20181127 2023) ((emacs (25)) (vdm-mode (0 0 4))) "REPL support for vdm-mode" tar ((:url . "https://github.com/peterwvj/vdm-mode") (:commit . "e131edb0d35de28bd47d6128dd70d9a6fc46e0fa") (:revdesc . "e131edb0d35d") (:keywords "languages") (: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"))]) + (vdm-mode . [(20190328 1408) ((emacs (25))) "Major mode for the Vienna Development Method" tar ((:url . "https://github.com/peterwvj/vdm-mode") (:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:revdesc . "89e7db6ee1a8") (:keywords "languages") (: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"))]) + (vdm-snippets . [(20190313 1122) ((emacs (24)) (yasnippet (0 13 0))) "YASnippets for VDM mode" tar ((:url . "https://github.com/peterwvj/vdm-mode") (:commit . "dc1756dd151752b3f538d68326059f8861e4ac66") (:revdesc . "dc1756dd1517") (:keywords "languages") (: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"))]) + (vector-utils . [(20140508 2041) nil "Vector-manipulation utility functions" tar ((:url . "http://github.com/rolandwalker/vector-utils") (:commit . "5f9ced3960a318d611c3d20ffdc9ca74054fa8b7") (:revdesc . "5f9ced3960a3") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (vega-view . [(20250327 1716) ((emacs (25)) (cider (0 24 0)) (parseedn (0 1))) "Vega visualization viewer" tar ((:url . "https://www.github.com/applied-science/emacs-vega-view") (:commit . "36e7cc84b25e67b50c5ca677d5ca0f7b7c27469f") (:revdesc . "36e7cc84b25e") (:keywords "multimedia") (:authors ("Jack Rusher" . "jack@appliedscience.studio")) (:maintainers ("Jack Rusher" . "jack@appliedscience.studio")) (:maintainer "Jack Rusher" . "jack@appliedscience.studio"))]) + (vegetative-theme . [(20220822 353) ((autothemer (0 2)) (emacs (24))) "A Theme based on green CRT terminals" tar ((:url . "http://github.com/emacsfodder/emacs-theme-vegetative") (:commit . "db60ce0fe327ae7e4371545179ed94483b1132a8") (:revdesc . "db60ce0fe327"))]) + (verb . [(20251222 2151) ((emacs (26 3))) "Organize and send HTTP requests" tar ((:url . "https://github.com/federicotdn/verb") (:commit . "f45e31b2bcdea2a859bb28cbb1819469978457c9") (:revdesc . "f45e31b2bcde") (:keywords "tools") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainers ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com"))]) + (veri-kompass . [(20200213 934) ((emacs (25)) (cl-lib (0 5)) (org (8 2 0))) "Verilog codebase navigation facility" tar ((:url . "https://gitlab.com/koral/veri-kompass") (:commit . "271903cdf92db05898ee7cffb65641f30fa08280") (:revdesc . "271903cdf92d") (:keywords "languages" "extensions" "verilog" "hardware" "rtl") (:maintainers (nil . "andrea_corallo@yahoo.it")) (:maintainer nil . "andrea_corallo@yahoo.it"))]) + (verify-url . [(20160426 1228) ((cl-lib (0 5))) "Find out invalid urls in the buffer or region" tar ((:url . "https://github.com/lujun9972/verify-url") (:commit . "d6f3623cda8cd526a2d198619b137059cb1ba1ab") (:revdesc . "d6f3623cda8c") (:keywords "convenience" "usability" "url") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainers ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com"))]) + (verilog-ext . [(20251121 1445) ((emacs (29 1)) (verilog-mode (2024 3 1 121933719)) (verilog-ts-mode (0 5 0)) (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)) (async (1 9 7))) "SystemVerilog Extensions" tar ((:url . "https://github.com/gmlarumbe/verilog-ext") (:commit . "541e031ca391960aaaa41f774d83ed55a90f6767") (:revdesc . "541e031ca391") (:keywords "verilog" "ide" "tools") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com"))]) + (verilog-ts-mode . [(20251008 2041) ((emacs (29 1)) (verilog-mode (2024 3 1 121933719))) "Verilog Tree-sitter major mode" tar ((:url . "https://github.com/gmlarumbe/verilog-ts-mode") (:commit . "b71a15e1677060bc0a3e7dc180a11a82074a2157") (:revdesc . "b71a15e16770") (:keywords "systemverilog" "ide" "tools") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com"))]) + (verona-mode . [(20200823 536) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the Verona programming language" tar ((:url . "https://github.com/damon-kwok/verona-mode") (:commit . "72dd31ef847344d79409503f3c42169041eb3da4") (:revdesc . "72dd31ef8473") (:keywords "languages" "programming"))]) + (verse-mode . [(20250910 2354) ((emacs (26 1))) "Major mode for Verse" tar ((:url . "https://github.com/sness23/verse-mode") (:commit . "d5facb02832e812d47c4354b26c60d2f73097165") (:revdesc . "d5facb02832e") (:keywords "languages" "tools") (:authors ("Steven Ness" . "sness@sness.net")) (:maintainers ("Steven Ness" . "sness@sness.net")) (:maintainer "Steven Ness" . "sness@sness.net"))]) + (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 ((:url . "https://github.com/mihaiolteanu/versuri/") (:commit . "c8ea562304194f3379ed8f9c6a785ce8ee72898e") (:revdesc . "c8ea56230419") (:keywords "multimedia") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm"))]) + (vertica . [(20131217 1511) ((sql (3 0))) "Vertica SQL mode extension" tar ((:url . "https://github.com/r0man/vertica-el") (:commit . "3c9647b425c5c13c30bf0cba483646af18196588") (:revdesc . "3c9647b425c5") (:keywords "sql" "vertica") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainers ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com"))]) + (vertica-snippets . [(20250314 927) ((yasnippet (0 6 1))) "Yasnippets for Vertica" tar ((:url . "https://github.com/baron42bba/vertica-snippets") (:commit . "5a77be72074c196cc419852d58c14703ff5ba55a") (:revdesc . "5a77be72074c") (:keywords "convenience" "snippets") (:authors ("Andreas Gerler" . "baron@bundesbrandschatzamt.de")) (:maintainers ("Andreas Gerler" . "baron@bundesbrandschatzamt.de")) (:maintainer "Andreas Gerler" . "baron@bundesbrandschatzamt.de"))]) + (vertico . [(20251115 1826) ((emacs (29 1)) (compat (30))) "VERTical Interactive COmpletion" tar ((:url . "https://github.com/minad/vertico") (:commit . "8cff876a15203d24c42e19585fe6dcce8f735bbe") (:revdesc . "8cff876a1520") (:keywords "convenience" "files" "matching" "completion") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainers ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de"))]) + (vertico-prescient . [(20250816 19) ((emacs (27 1)) (prescient (6 1 0)) (vertico (0 28)) (compat (29 1))) "Prescient.el + Vertico" tar ((:url . "https://github.com/radian-software/prescient.el") (:commit . "87e2d2f2ddf24f591a5f70cc90d2afb4537caa18") (:revdesc . "87e2d2f2ddf2") (:keywords "extensions") (:authors ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainers ("Radian LLC" . "contact+prescient@radian.codes")) (:maintainer "Radian LLC" . "contact+prescient@radian.codes"))]) + (vertigo . [(20211224 1256) ((dash (2 11 0))) "Jump across lines using the home row" tar ((:url . "https://github.com/noctuid/vertigo.el") (:commit . "280b30518529242ee36cd436bd2349c34c35abb0") (:revdesc . "280b30518529") (:keywords "vim" "vertigo") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainers ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net"))]) + (vhdl-capf . [(20160221 1734) nil "Completion at point function (capf) for vhdl-mode" tar ((:url . "https://github.com/sh-ow/vhdl-capf") (:commit . "290abe217050f33532bc9ccb04f894123402f414") (:revdesc . "290abe217050") (:keywords "convenience" "usability" "vhdl" "completion") (: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"))]) + (vhdl-ext . [(20251118 1340) ((emacs (29 1)) (vhdl-ts-mode (0 3 2)) (lsp-mode (8 0 0)) (ag (0 48)) (ripgrep (0 4 0)) (hydra (0 15 0)) (flycheck (32)) (async (1 9 7))) "VHDL Extensions" tar ((:url . "https://github.com/gmlarumbe/vhdl-ext") (:commit . "19b5be6e3b794e848b2554ffc6f03dfb35c75c8e") (:revdesc . "19b5be6e3b79") (:keywords "vhdl" "ide" "tools") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com"))]) + (vhdl-ts-mode . [(20251008 2052) ((emacs (29 1))) "VHDL Tree-sitter major mode" tar ((:url . "https://github.com/gmlarumbe/vhdl-ts-mode") (:commit . "9da613a72aa7caaa32b11f4de6f2e778bfb9376c") (:revdesc . "9da613a72aa7") (:keywords "vhdl" "ide" "tools") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com"))]) + (vi-tilde-fringe . [(20141028 242) ((emacs (24))) "Displays tildes in the fringe on empty lines a la Vi" tar ((:url . "https://github.com/syl20bnr/vi-tilde-fringe") (:commit . "e6e15638e8c45a5e68d0874d5d8c9a46c4f38a54") (:revdesc . "e6e15638e8c4") (:keywords "emulation") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainers ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com"))]) + (viewer . [(20170107 202) nil "View-mode extension" tar ((:url . "http://github.com/rubikitch/viewer/") (:commit . "6c8db025bf4021428f7f2c3ef9d74fb13f5d267a") (:revdesc . "6c8db025bf40") (:keywords "view" "extensions") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainers ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org"))]) + (viking-mode . [(20251218 802) nil "Kill first, ask later" tar ((:url . "https://codeberg.org/scip/viking-mode") (:commit . "de712eb6e7bb3958055868d73fe3dca1d639016b") (:revdesc . "de712eb6e7bb") (:keywords "kill" "delete") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainers ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org"))]) + (vim-empty-lines-mode . [(20150111 426) ((emacs (23))) "Vim-like empty line indicator at end of files" tar ((:url . "https://github.com/jmickelin/vim-empty-lines-mode") (:commit . "442a29b0ba1635a3b352c9dd1faf9ce99656d048") (:revdesc . "442a29b0ba16") (:keywords "emulations") (:authors ("Jonne Mickelin" . "jonne@ljhms.com")) (:maintainers ("Jonne Mickelin" . "jonne@ljhms.com")) (:maintainer "Jonne Mickelin" . "jonne@ljhms.com"))]) + (vim-region . [(20140329 1624) ((expand-region (20140127))) "Select region as vim" tar ((:url . "https://github.com/ongaeshi/emacs-vim-region") (:commit . "7c4a99ce3678fee40c83ab88e8ad075d2a935fdf") (:revdesc . "7c4a99ce3678") (:authors ("ongaeshi" . "ongaeshi0621@gmail.com")) (:maintainers ("ongaeshi" . "ongaeshi0621@gmail.com")) (:maintainer "ongaeshi" . "ongaeshi0621@gmail.com"))]) + (vim-tab-bar . [(20251223 1533) ((emacs (28 1))) "Vim-like tab bar" tar ((:url . "https://github.com/jamescherti/vim-tab-bar.el") (:commit . "41f57f059bd89c8209a405afa2914482c9e9b306") (:revdesc . "41f57f059bd8") (:keywords "frames"))]) + (vimgolf . [(20200205 1420) nil "VimGolf interface for the One True Editor" tar ((:url . "https://github.com/timvisher/vimgolf.el") (:commit . "f565447ed294898588a19438d56c116555d8c628") (:revdesc . "f565447ed294") (:keywords "games" "vimgolf" "vim") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainers ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com"))]) + (vimish-fold . [(20251023 1551) ((emacs (26 1)) (cl-lib (0 5)) (f (0 18 0))) "Fold text like in Vim" tar ((:url . "https://github.com/mrkkrp/vimish-fold") (:commit . "f71f374d28a83e5f15612fa64aac1b2e78be2dcd") (:revdesc . "f71f374d28a8") (:keywords "convenience") (:authors ("Sergey Matsievskiy" . "matsievskiysv@gmail.com")) (:maintainers ("Sergey Matsievskiy" . "matsievskiysv@gmail.com")) (:maintainer "Sergey Matsievskiy" . "matsievskiysv@gmail.com"))]) + (vimrc-mode . [(20250128 635) ((emacs (24 3))) "Major mode for vimrc files" tar ((:url . "https://github.com/mcandre/vimrc-mode") (:commit . "f594392a0834193a1fe1522d007e1c8ce5b68e43") (:revdesc . "f594392a0834") (:keywords "languages" "vim"))]) + (vimscript-ts-mode . [(20241020 7) ((emacs (29 1))) "Vim-script major mode using tree-sitter" tar ((:url . "https://github.com/nverno/vimscript-ts-mode") (:commit . "8ebe7746172caaa88d463c58e0bfe76ec7fc971a") (:revdesc . "8ebe7746172c") (:keywords "languages" "vim" "tree-sitter") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (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 ((:url . "https://github.com/luisgerhorst/virtual-auto-fill") (:commit . "a3991ce02d9a6a1624a3f04da80f4ac966a44092") (:revdesc . "a3991ce02d9a") (:keywords "convenience" "mail" "outlines" "files" "wp") (:authors ("Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de")) (:maintainers ("Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de")) (:maintainer "Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de"))]) + (virtual-comment . [(20220921 221) ((emacs (26 1))) "Virtual Comments" tar ((:url . "https://github.com/thanhvg/emacs-virtual-comment") (:commit . "b0c2ac4a9d625b5f4f329bbab879ad86cd7056bd") (:revdesc . "b0c2ac4a9d62") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainers ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com"))]) + (virtual-ring . [(20250920 1541) ((emacs (25 1))) "Fixed size rings with virtual rotation" tar ((:url . "https://github.com/countvajhula/virtual-ring") (:commit . "2d53ba23ecdca94801cc88085c7df7346d98e514") (:revdesc . "2d53ba23ecdc") (:authors ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainers ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com"))]) + (virtualenv . [(20140220 2301) nil "Virtualenv for Python" tar ((:url . "https://github.com/aculich/virtualenv.el") (:commit . "cc82856b6316d5e78073de717f0d5d1a4ee35fa6") (:revdesc . "cc82856b6316") (:keywords "python" "virtualenv") (:authors ("Aaron Culich" . "aculich@gmail.com")) (:maintainers ("Aaron Culich" . "aculich@gmail.com")) (:maintainer "Aaron Culich" . "aculich@gmail.com"))]) + (virtualenvwrapper . [(20190223 1919) ((dash (1 5 0)) (s (1 6 1))) "A featureful virtualenv tool for Emacs" tar ((:url . "http://github.com/porterjamesj/virtualenvwrapper.el") (:commit . "f753e5ad91c2ff5d11bec424aa8cec141efa6925") (:revdesc . "f753e5ad91c2") (:keywords "python" "virtualenv" "virtualenvwrapper") (:authors ("James J Porter" . "porterjamesj@gmail.com")) (:maintainers ("James J Porter" . "porterjamesj@gmail.com")) (:maintainer "James J Porter" . "porterjamesj@gmail.com"))]) + (visible-mark . [(20251126 345) ((emacs (28 1))) "Make marks visible" tar ((:url . "https://codeberg.org/ideasman42/emacs-visible-mark") (:commit . "af4e38bb919e1d5aaaa9bb10877530a96038342f") (:revdesc . "af4e38bb919e") (:keywords "marking" "color" "faces") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (visual-ascii-mode . [(20150129 1046) nil "Visualize ascii code (small integer) on buffer" tar ((:url . "https://github.com/Dewdrops/visual-ascii-mode") (:commit . "99285a099a17472ddd9f1b4f74e9d092dd8c5947") (:revdesc . "99285a099a17") (:keywords "presentation") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainers ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com"))]) + (visual-fill-column . [(20251110 1039) ((emacs (25 1))) "Fill-column for visual-line-mode" tar ((:url . "https://codeberg.org/joostkremers/visual-fill-column") (:commit . "9c0ecc2af21d3024a2a838c30d574e86265a52be") (:revdesc . "9c0ecc2af21d") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm"))]) + (visual-regexp . [(20210502 2019) ((cl-lib (0 2))) "A regexp/replace command for Emacs with interactive visual feedback" tar ((:url . "https://github.com/benma/visual-regexp.el/") (:commit . "48457d42a5e0fe10fa3a9c15854f1f127ade09b5") (:revdesc . "48457d42a5e0") (:keywords "regexp" "replace" "visual" "feedback") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainers ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com"))]) + (visual-regexp-steroids . [(20170222 253) ((visual-regexp (1 1))) "Extends visual-regexp to support other regexp engines" tar ((:url . "https://github.com/benma/visual-regexp-steroids.el/") (:commit . "a6420b25ec0fbba43bf57875827092e1196d8a9e") (:revdesc . "a6420b25ec0f") (:keywords "external" "foreign" "regexp" "replace" "python" "visual" "feedback") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainers ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com"))]) + (visual-replace . [(20250913 2103) ((emacs (26 1))) "A prompt for replace-string and query-replace" tar ((:url . "http://github.com/szermatt/visual-replace") (:commit . "cf6a02fae01d9962862920a6cfe2488df2f76684") (:revdesc . "cf6a02fae01d") (:keywords "convenience" "matching" "replace") (:authors ("Stephane Zermatten" . "szermatt@gmail.com")) (:maintainers ("Stephane Zermatten" . "szermatt@gmail.com")) (:maintainer "Stephane Zermatten" . "szermatt@gmail.com"))]) + (vlc . [(20200328 1143) ((emacs (25 1))) "VideoLAN VLC Media Player Control" tar ((:url . "https://github.com/xuchunyang/vlc.el") (:commit . "07c4a12904f2700fb8420c4e71395fd59a5e6faa") (:revdesc . "07c4a12904f2") (:keywords "tools"))]) + (vline . [(20210805 1528) ((emacs (24 3))) "Column highlighting (vertical line displaying) mode" tar ((:url . "https://www.emacswiki.org/emacs/VlineMode") (:commit . "f5d7b5743dceca75b81c8c95287cd5b0341debf9") (:revdesc . "f5d7b5743dce") (:keywords "faces" "editing" "emulating") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainers ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com"))]) + (vmd-mode . [(20210524 27) ((emacs (24 3))) "Fast Github-flavored Markdown preview using a vmd subprocess" tar ((:url . "https://github.com/blak3mill3r/vmd-mode") (:commit . "b2bdf2ab54f8fc37780e6b473e4ad69c0e9ff4a6") (:revdesc . "b2bdf2ab54f8") (:keywords "markdown" "preview" "live" "vmd") (:authors ("Blake Miller" . "blak3mill3r@gmail.com")) (:maintainers ("Blake Miller" . "blak3mill3r@gmail.com")) (:maintainer "Blake Miller" . "blak3mill3r@gmail.com"))]) + (voca-builder . [(20161101 1645) ((popup (0 5 2))) "Helps you build up your vocabulary" tar ((:url . "https://github.com/yitang/voca-builder") (:commit . "51573beec8cd8308477b0faf453aad93e17f57c5") (:revdesc . "51573beec8cd") (:keywords "english" "vocabulary") (:authors ("Yi Tang" . "yi.tang.uk@me.com")) (:maintainers ("Yi Tang" . "yi.tang.uk@me.com")) (:maintainer "Yi Tang" . "yi.tang.uk@me.com"))]) + (volatile-highlights . [(20250924 1215) ((emacs (24 4))) "Transient visual feedback for edits" tar ((:url . "https://github.com/k-talo/volatile-highlights.el") (:commit . "b1e7754d7b502ef6583a13f2662e515a654f944d") (:revdesc . "b1e7754d7b50") (:keywords "editing" "emulations" "convenience" "wp") (:authors ("K-talo Miyazaki" . "Keitaro.Miyazaki@gmail.com")) (:maintainers ("K-talo Miyazaki" . "Keitaro.Miyazaki@gmail.com")) (:maintainer "K-talo Miyazaki" . "Keitaro.Miyazaki@gmail.com"))]) + (volume . [(20220904 1727) nil "Tweak your sound card volume from Emacs" tar ((:url . "http://www.brockman.se/software/volume-el/") (:commit . "050d3e6d2543a6771a13f95612055864679b6301") (:revdesc . "050d3e6d2543") (:authors ("Daniel Brockman" . "daniel@brockman.se")) (:maintainers ("Daniel Brockman" . "daniel@brockman.se")) (:maintainer "Daniel Brockman" . "daniel@brockman.se"))]) + (vs-dark-theme . [(20251224 1531) ((emacs (24 1))) "Visual Studio IDE dark theme" tar ((:url . "https://github.com/emacs-vs/vs-dark-theme") (:commit . "95f042c1521ef253171301bccd668e85761d8776") (:revdesc . "95f042c1521e") (:keywords "faces"))]) + (vs-light-theme . [(20251224 1531) ((emacs (24 1))) "Visual Studio IDE light theme" tar ((:url . "https://github.com/emacs-vs/vs-light-theme") (:commit . "3ff00e11be497ae841c2c58de2ca5dbb983795cf") (:revdesc . "3ff00e11be49") (:keywords "faces"))]) + (vscdark-theme . [(20191212 107) ((emacs (24 1))) "VS Code Dark+ like theme" tar ((:url . "https://github.com/abelikoff/vscdark-theme") (:commit . "f419553e2a2f091a8bc257fb5ab520326e93ddd4") (:revdesc . "f419553e2a2f"))]) + (vscode-dark-plus-theme . [(20230725 1703) nil "Default Visual Studio Code Dark+ theme" tar ((:url . "https://github.com/ianpan870102/vscode-dark-plus-emacs-theme") (:commit . "65420ca73b543e1e7955905bea1a8d7e5fe6c5ff") (:revdesc . "65420ca73b54"))]) + (vscode-icon . [(20241201 2200) ((emacs (25 1))) "Utility package to provide Vscode style icons" tar ((:url . "https://github.com/jojojames/vscode-icon-emacs") (:commit . "27cbf4f178924de1e2a09b4d87f87b5fa67c8cf4") (:revdesc . "27cbf4f17892") (:keywords "files" "tools") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainers ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com"))]) + (vsh-mode . [(20250901 1658) ((emacs (30 0))) "Alternate PTY interface for complex terminal sessions" tar ((:url . "https://github.com/hardenedapple/vsh") (:commit . "47c35e3062a20418340c8150c8d5ad41c1e7d6b4") (:revdesc . "47c35e3062a2") (:keywords "processes") (:authors ("Matthew Malcomson" . "hardenedapple@gmail.com")) (:maintainers ("Matthew Malcomson" . "hardenedapple@gmail.com")) (:maintainer "Matthew Malcomson" . "hardenedapple@gmail.com"))]) + (vterm . [(20251119 1653) ((emacs (25 1))) "Fully-featured terminal emulator" tar ((:url . "https://github.com/akermu/emacs-libvterm") (:commit . "a01a2894a1c1e81a39527835a9169e35b7ec5dec") (:revdesc . "a01a2894a1c1") (:keywords "terminals") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainers ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org"))]) + (vterm-hotkey . [(20240702 1445) ((emacs (29 4)) (vterm (0 0))) "Control vterm buffers with hotkeys" tar ((:url . "https://github.com/rootatpixel/vterm-hotkey") (:commit . "039033a4c30dabca625d6924d1796bb9e13d85c7") (:revdesc . "039033a4c30d") (:keywords "terminals" "processes" "hotkeys"))]) + (vterm-toggle . [(20230912 246) ((emacs (25 1)) (vterm (0 0 1))) "Toggles between the vterm buffer and other buffers" tar ((:url . "https://github.com/jixiuf/vterm-toggle") (:commit . "06cb4f3c565e46470a3c4505c11e26066d869715") (:revdesc . "06cb4f3c565e") (:keywords "vterm" "terminals") (:authors (nil . "jixiufjixiuf@qq.com")) (:maintainers (nil . "jixiufjixiuf@qq.com")) (:maintainer nil . "jixiufjixiuf@qq.com"))]) + (vtm . [(20200921 338) nil "Manages vterm buffers with configuration files" tar ((:url . "https://github.com/laishulu/emacs-vterm-manager") (:commit . "d770fd8cff7c24688199392ad93c01485c6a9569") (:revdesc . "d770fd8cff7c") (:keywords "convenience"))]) + (vue-html-mode . [(20180428 2035) nil "Major mode for editing Vue.js templates" tar ((:url . "http://github.com/AdamNiederer/vue-html-mode") (:commit . "361a9fa117f044c3072dc5a7344ff7be31725849") (:revdesc . "361a9fa117f0") (:keywords "languages" "vue" "template") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainers ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com"))]) + (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 ((:url . "https://github.com/AdamNiederer/vue-mode") (:commit . "3a8056bc6ea6458265efb91067c7467860d2c118") (:revdesc . "3a8056bc6ea6") (:keywords "languages") (:authors ("codefalling" . "code.falling@gmail.com")) (:maintainers ("codefalling" . "code.falling@gmail.com")) (:maintainer "codefalling" . "code.falling@gmail.com"))]) + (vue3-mode . [(20250331 1625) ((emacs (29 1)) (polymode (0 2 2)) (vue-html-mode (0 2))) "Syntax highlighting for modern Vue.js 3" tar ((:url . "https://github.com/vsalvino/vue3-mode") (:commit . "a1ad84c0cc5ea100dd11aeae9b52669918830730") (:revdesc . "a1ad84c0cc5e") (:keywords "languages" "vue") (:authors ("Vince Salvino" . "mvsalvino@gmail.com")) (:maintainers ("Vince Salvino" . "mvsalvino@gmail.com")) (:maintainer "Vince Salvino" . "mvsalvino@gmail.com"))]) + (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 ((:url . "https://github.com/mihaiolteanu/vuiet") (:commit . "25d79860b165f04d7d39395138ed4f23e982132f") (:revdesc . "25d79860b165") (:keywords "multimedia") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainers ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm"))]) + (vulpea . [(20251223 959) ((emacs (27 2)) (org (9 4 4)) (emacsql (4 3 0)) (s (1 12)) (dash (2 19))) "A collection of note-taking functions" tar ((:url . "https://github.com/d12frosted/vulpea") (:commit . "68367db8f7ae67d57b265b624560ff8a3575eed9") (:revdesc . "68367db8f7ae") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainers ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io"))]) + (vunit-mode . [(20250714 523) ((hydra (0 14 0)) (emacs (24 3))) "VUnit Runner Interface" tar ((:url . "https://github.com/embed-me") (:commit . "b26ecc46464a57eb00bf62b15c0d717774ec804e") (:revdesc . "b26ecc46464a") (:keywords "vunit" "python" "tools") (:authors ("Lukas Lichtl" . "support@embed-me.com")) (:maintainers ("Lukas Lichtl" . "support@embed-me.com")) (:maintainer "Lukas Lichtl" . "support@embed-me.com"))]) + (vyper-mode . [(20180707 1935) ((emacs (24 3))) "Major mode for the Vyper programming language" tar ((:url . "https://github.com/ralexstokes/vyper-mode") (:commit . "323dfddfc38f0b11697e9ebaf04d1b53297e54e5") (:revdesc . "323dfddfc38f") (:keywords "languages") (:authors ("Alex Stokes" . "r.alex.stokes@gmail.com")) (:maintainers ("Alex Stokes" . "r.alex.stokes@gmail.com")) (:maintainer "Alex Stokes" . "r.alex.stokes@gmail.com"))]) + (w32-browser . [(20170101 1954) nil "Run Windows application associated with a file" tar ((:url . "http://www.emacswiki.org/w32-browser.el") (:commit . "e5c60eafd8f8d3546a0fa295ad5af2414d36b4e6") (:revdesc . "e5c60eafd8f8") (:keywords "mouse" "dired" "w32" "explorer") (:maintainers ("Drew Adams (concat \"drew.adams\" \"oracle\" \".com\"" . "\"@\" ")) (:maintainer "Drew Adams (concat \"drew.adams\" \"oracle\" \".com\"" . "\"@\" "))]) + (w32-ime . [(20201107 143) ((emacs (24 4))) "Windows IME UI/UX controler" tar ((:url . "https://github.com/trueroad/w32-ime.el") (:commit . "9c62273dce0ba685a591577885b1e216ba832ec1") (:revdesc . "9c62273dce0b") (:authors ("Masamichi Hosoda" . "trueroad@trueroad.jp") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainers ("Masamichi Hosoda" . "trueroad@trueroad.jp")) (:maintainer "Masamichi Hosoda" . "trueroad@trueroad.jp"))]) + (w3m . [(20251201 129) nil "An Emacs interface to w3m" tar ((:url . "https://github.com/emacs-w3m/emacs-w3m") (:commit . "87cacb2a0e59db00b8deb3f40a2a9f8141f3217b") (:revdesc . "87cacb2a0e59") (:keywords "w3m" "www" "hypermedia"))]) + (wacspace . [(20180311 2350) ((dash (1 2 0)) (cl-lib (0 2))) "The WACky WorkSPACE manager for emACS" tar ((:url . "http://github.com/shosti/wacspace.el") (:commit . "54d19aab6fd2bc5945b7ffc58104e695064927e2") (:revdesc . "54d19aab6fd2") (:keywords "workspace") (:authors ("Emanuel Evans" . "emanuel.evans@gmail.com")) (:maintainers ("Emanuel Evans" . "emanuel.evans@gmail.com")) (:maintainer "Emanuel Evans" . "emanuel.evans@gmail.com"))]) + (waf-mode . [(20170403 1940) nil "Waf integration for Emacs" tar ((:url . "https://bitbucket.org/dvalchuk/waf-mode") (:commit . "91c761336aa137b85b88b53b3f0cc60786d70800") (:revdesc . "91c761336aa1") (:authors ("Denys Valchuk" . "dvalchuk@gmail.com")) (:maintainers ("Denys Valchuk" . "dvalchuk@gmail.com")) (:maintainer "Denys Valchuk" . "dvalchuk@gmail.com"))]) + (waher-theme . [(20141115 1230) ((emacs (24 1))) "Emacs 24 theme based on waher for st2 by dduckster" tar ((:url . "https://github.com/jasonm23/emacs-waher-theme") (:commit . "60d31519fcfd8e797723d47961b255ae2f2e2c0a") (:revdesc . "60d31519fcfd") (:authors ("Jasonm23" . "jasonm23@gmail.com")) (:maintainers ("Jasonm23" . "jasonm23@gmail.com")) (:maintainer "Jasonm23" . "jasonm23@gmail.com"))]) + (wakatime-mode . [(20240623 653) nil "Automatic time tracking extension for WakaTime" tar ((:url . "https://github.com/wakatime/wakatime-mode") (:commit . "1c5b2254dd72f2ff504d6a6189a8c10be03a98d1") (:revdesc . "1c5b2254dd72") (:keywords "calendar" "comm") (:authors ("Gabor Torok" . "gabor@20y.hu")) (:maintainers ("Alan Hamlett" . "alan@wakatime.com")) (:maintainer "Alan Hamlett" . "alan@wakatime.com"))]) + (wakib-keys . [(20250405 1416) ((emacs (24 4))) "Minor Mode for Modern Keybindings" tar ((:url . "https://github.com/darkstego/wakib-keys/") (:commit . "07258b0293c9f31ba11bd89298b9f90eb232a94c") (:revdesc . "07258b0293c9") (:keywords "convenience" "keybindings" "keys"))]) + (wal-mode . [(20220409 1214) ((emacs (25 1))) "A major mode for the WAL programming language" tar ((:url . "https://github.com/LucasKl/wal-major-mode") (:commit . "16733847f04af1929e590ff3e41f554baa3ba640") (:revdesc . "16733847f04a") (:keywords "languages") (:authors ("Lucas Klemmer" . "lucas.klemmer@jku.at")) (:maintainers ("Lucas Klemmer" . "lucas.klemmer@jku.at")) (:maintainer "Lucas Klemmer" . "lucas.klemmer@jku.at"))]) + (walkclj . [(20220719 1610) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0)) (a (1 0 0))) "Manipulate Clojure parse trees" tar ((:url . "https://github.com/plexus/walkclj") (:commit . "875ee7a350f5141f425c4b5350a630e1ee1795e8") (:revdesc . "875ee7a350f5") (:keywords "languages"))]) + (walkman . [(20241204 2234) ((transient (0 1 0)) (org (8 3 5)) (json-mode (1 6 0)) (emacs (26 3))) "Write HTTP requests in Org mode" tar ((:url . "https://github.com/abrochard/walkman") (:commit . "b8260b6c1c6bdc8878c6f8cbeeea05040ac92b65") (:revdesc . "b8260b6c1c6b") (:keywords "walkman" "http" "curl" "org" "comm"))]) + (wallabag . [(20251226 1223) ((emacs (27 1)) (request (0 3 3)) (s (1 12 0)) (emacsql (3 0 0)) (gptel (0 8 6))) "Save and manage articles with wallabag" tar ((:url . "https://github.com/chenyanming/wallabag.el") (:commit . "ff44e102ab467dd5abf021b3e3581be0c4358d18") (:revdesc . "ff44e102ab46") (:keywords "tools") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainers ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com"))]) + (wallpaper . [(20201019 2123) ((emacs (25 1))) "Setting the wallpaper" tar ((:url . "https://github.com/farlado/emacs-wallpaper") (:commit . "cc0101726dd2fa2b4eda06924c7abfae54f663e2") (:revdesc . "cc0101726dd2") (:keywords "unix" "wallpaper" "extensions") (:authors ("Farlado" . "farlado@sdf.org")) (:maintainers ("Farlado" . "farlado@sdf.org")) (:maintainer "Farlado" . "farlado@sdf.org"))]) + (wallpreview . [(20220703 1108) ((emacs (24 4))) "Set wallpapers with image-dired" tar ((:url . "https://github.com/nryotaro/wallpreview") (:commit . "6eae0549afdfe725b453ca4fb0878c728735892d") (:revdesc . "6eae0549afdf"))]) + (wand . [(20220519 1214) nil "Magic wand for Emacs - Select and execute" tar ((:url . "https://github.com/cmpitg/wand") (:commit . "e4afc0469c818e7ce73ef31c38d911477947d72e") (:revdesc . "e4afc0469c81") (:keywords "extensions" "tools") (:authors ("Ha-Duong Nguyen" . "cmpitgATgmail")) (:maintainers ("Ha-Duong Nguyen" . "cmpitgATgmail")) (:maintainer "Ha-Duong Nguyen" . "cmpitgATgmail"))]) + (wandbox . [(20170603 1231) ((emacs (24)) (request (0 3 0)) (s (1 10 0))) "Wandbox client" tar ((:url . "https://github.com/kosh04/emacs-wandbox") (:commit . "e002fe41f2cd9b4ce2b1dc80b83301176e9117f1") (:revdesc . "e002fe41f2cd") (:keywords "tools") (:authors ("KOBAYASHI Shigeru" . "shigeru.kb@gmail.com")) (:maintainers ("KOBAYASHI Shigeru" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru" . "shigeru.kb@gmail.com"))]) + (wanderlust . [(20251102 2110) ((emacs (24 5)) (apel (0)) (flim (0)) (semi (0))) "Yet Another Message Interface on Emacsen" tar ((:url . "https://github.com/emacsmirror/wanderlust") (:commit . "9414fc386945870913e5183817593596315eddd8") (:revdesc . "9414fc386945") (:keywords "mail" "net news") (:authors ("Yuuichi Teranishi" . "teranisi@gohome.org") ("Masahiro MURATA" . "muse@ba2.so-net.ne.jp")) (:maintainers ("Yuuichi Teranishi" . "teranisi@gohome.org") ("Masahiro MURATA" . "muse@ba2.so-net.ne.jp")) (:maintainer "Yuuichi Teranishi" . "teranisi@gohome.org"))]) + (warm-night-theme . [(20161101 1428) ((emacs (24))) "Emacs 24 theme with a dark background" tar ((:url . "https://github.com/mswift42/warm-night-theme") (:commit . "020f084d23409b5035150508ba6e57c2509edd64") (:revdesc . "020f084d2340"))]) + (wasp-mode . [(20230424 1307) ((emacs (24 3))) "A major mode for the Wasp programming language" tar ((:url . "https://github.com/thechampagne/wasp-mode") (:commit . "76198cdd5f0ece3770c3a586115caea3ea613169") (:revdesc . "76198cdd5f0e") (:keywords "files" "wasp"))]) + (wat-ts-mode . [(20231006 223) ((emacs (29 1))) "Major modes for webassembly text formats using tree sitter" tar ((:url . "https://github.com/nverno/wat-ts-mode") (:commit . "d2bbd7dbb57482dc0407574d61b2dcad31b96204") (:revdesc . "d2bbd7dbb574") (:keywords "wasm" "wat" "wast" "languages" "tree-sitter") (:authors ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainers ("Noah Peart" . "noah.v.peart@gmail.com")) (:maintainer "Noah Peart" . "noah.v.peart@gmail.com"))]) + (watch-buffer . [(20120331 2044) nil "Run a shell command when saving a buffer" tar ((:url . "https://github.com/mjsteger/watch-buffer") (:commit . "a01cf15608c5bf91df253104053041ca1afdf411") (:revdesc . "a01cf15608c5") (:keywords "automation" "convenience") (:authors ("Michael Steger" . "mjsteger1@gmail.com")) (:maintainers ("Michael Steger" . "mjsteger1@gmail.com")) (:maintainer "Michael Steger" . "mjsteger1@gmail.com"))]) + (wavedrom-mode . [(20250720 1337) ((emacs (29 1))) "WaveDrom Integration" tar ((:url . "https://github.com/gmlarumbe/wavedrom-mode") (:commit . "159767bc9e1726035c9e21ac50f2d0f7fe315fa8") (:revdesc . "159767bc9e17") (:keywords "fpga" "asic" "tools") (:authors ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainers ("Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com")) (:maintainer "Gonzalo Larumbe" . "gonzalomlarumbe@gmail.com"))]) + (wavefront-obj-mode . [(20170808 1716) nil "Major mode for Wavefront obj files" tar ((:url . "http://github.com/abend/wavefront-obj-mode") (:commit . "34027915de6496460d8e68b5991dd24d47d54859") (:revdesc . "34027915de64") (:authors ("Sasha Kovar" . "sasha-emacs@arcocene.org")) (:maintainers ("Sasha Kovar" . "sasha-emacs@arcocene.org")) (:maintainer "Sasha Kovar" . "sasha-emacs@arcocene.org"))]) + (wc-goal-mode . [(20140829 1359) nil "Running word count with goals (minor mode)" tar ((:url . "https://github.com/bnbeckwith/wc-goal-mode") (:commit . "bf21ab9c5a449bcc20dd207a4915dcec218d2699") (:revdesc . "bf21ab9c5a44"))]) + (wc-mode . [(20210418 47) ((emacs (24 1))) "Running word count with goals (minor mode)" tar ((:url . "https://github.com/bnbeckwith/wc-mode") (:commit . "63be1433b8a63cdc3239cc751e36360429c42b51") (:revdesc . "63be1433b8a6"))]) + (wdl-mode . [(20180831 1946) nil "WDL (Workflow Definition Language) major mode" tar ((:url . "http://github.com/zhanxw/wdl-mode") (:commit . "cef86e5afc136ae5ad9324cd6e6d6f860b889bcf") (:revdesc . "cef86e5afc13") (:keywords "languages") (:authors ("Xiaowei Zhan" . "zhanxw@gmail.com")) (:maintainers ("Xiaowei Zhan" . "zhanxw@gmail.com")) (:maintainer "Xiaowei Zhan" . "zhanxw@gmail.com"))]) + (weak-ref . [(20200217 2200) ((emacs (24 3))) "Weak references for Emacs Lisp" tar ((:url . "https://github.com/skeeto/elisp-weak-ref") (:commit . "24e8c37da6465e65ce9f866267bd3fa53c8899c6") (:revdesc . "24e8c37da646") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (weather-metno . [(20250727 1642) ((emacs (24)) (cl-lib (0 3))) "Weather data from met.no in Emacs" tar ((:url . "https://github.com/ruediger/weather-metno-el") (:commit . "00eab9a9486e192917238145a4f2505d17fad77a") (:revdesc . "00eab9a9486e") (:keywords "comm") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainers ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de"))]) + (weather-scout . [(20250427 2030) ((emacs (27 1)) (persist (0 6 1))) "Display weather forecast from MET Norway" tar ((:url . "https://github.com/hsolg/emacs-weather-scout") (:commit . "11c749204d6720a3265fe0a32dcf81777fd18455") (:revdesc . "11c749204d67") (:authors ("Henrik Solgaard" . "henrik.solgaard@gmail.com")) (:maintainers ("Henrik Solgaard" . "henrik.solgaard@gmail.com")) (:maintainer "Henrik Solgaard" . "henrik.solgaard@gmail.com"))]) + (web . [(20141231 2001) ((dash (2 9 0)) (s (1 5 0))) "Useful HTTP client" tar ((:url . "http://github.com/nicferrier/emacs-web") (:commit . "483188dac4bc6b409b985c9dae45f3324a425efd") (:revdesc . "483188dac4bc") (:keywords "lisp" "http" "hypermedia") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (web-beautify . [(20161115 2247) nil "Format HTML, CSS and JavaScript/JSON" tar ((:url . "https://github.com/yasuyk/web-beautify") (:commit . "e1b45321d8c11b404b12c8e55afe55eaa7c84ee9") (:revdesc . "e1b45321d8c1") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainers ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com"))]) + (web-completion-data . [(20160318 848) nil "Shared completion data for ac-html and company-web" tar ((:url . "https://github.com/osv/web-completion-data") (:commit . "c272c94e8a71b779c29653a532f619acad433a4f") (:revdesc . "c272c94e8a71") (:keywords "html" "auto-complete" "company") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainers ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com"))]) + (web-mode . [(20251214 1728) ((emacs (23 1))) "Major mode for editing web templates" tar ((:url . "https://web-mode.org") (:commit . "1e7694aee87722f9e51b6e39c35d175d83a1fb2c") (:revdesc . "1e7694aee877") (:keywords "languages") (:maintainers ("François-Xavier Bois" . "fxbois@gmail.com")) (:maintainer "François-Xavier Bois" . "fxbois@gmail.com"))]) + (web-mode-edit-element . [(20190531 852) ((emacs (24 4)) (web-mode (14))) "Helper-functions for attribute- and element-handling" tar ((:url . "https://github.com/jtkDvlp/web-mode-edit-element") (:commit . "ad5d7e4dc2420bdd00ce65d9adffbd38a5904afa") (:revdesc . "ad5d7e4dc242") (:keywords "languages" "convenience") (:authors ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainers ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainer "Julian T. Knabenschuh" . "jtkdevelopments@gmail.com"))]) + (web-narrow-mode . [(20170407 210) ((web-mode (14 0 27))) "Quick narrow code block in web-mode" tar ((:url . "https://github.com/Qquanwei/web-narrow-mode") (:commit . "b25fae07844875d5b62d14b98442c88817b7e139") (:revdesc . "b25fae078448") (:keywords "web-mode" "react" "narrow" "web") (:authors ("Qquanwei" . "quanwei9958@126.com")) (:maintainers ("Johan Andersson" . "quanwei9958@126.com")) (:maintainer "Johan Andersson" . "quanwei9958@126.com"))]) + (web-search . [(20190620 602) ((emacs (24 3))) "Open a web search" tar ((:url . "https://github.com/xuchunyang/web-search.el") (:commit . "a22cbdc663a1895d5a5b69de91e1e3b9eb64b92f") (:revdesc . "a22cbdc663a1") (:keywords "web" "search") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainers ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me"))]) + (web-server . [(20210708 2242) ((emacs (24 1)) (cl-lib (0 6))) "Emacs Web Server" tar ((:url . "https://github.com/eschulte/emacs-web-server") (:commit . "6357a1c2d1718778503f7ee0909585094117525b") (:revdesc . "6357a1c2d171") (:keywords "http" "server" "network") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainers ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com"))]) + (webdriver . [(20250224 2303) ((emacs (27 1))) "WebDriver local end implementation" tar ((:url . "https://gitlab.com/mauroaranda/emacs-webdriver") (:commit . "dfe26adc9482d50c7c6ca765916443bd74cf548d") (:revdesc . "dfe26adc9482") (:keywords "tools") (:authors ("Mauro Aranda" . "maurooaranda@gmail.com")) (:maintainers ("Mauro Aranda" . "maurooaranda@gmail.com")) (:maintainer "Mauro Aranda" . "maurooaranda@gmail.com"))]) + (webkit-color-picker . [(20180325 736) ((emacs (26 0)) (posframe (0 1 0))) "Insert and adjust colors using Webkit Widgets" tar ((:url . "https://github.com/osener/emacs-webkit-color-picker") (:commit . "765cac80144cad4bc0bf59025ea0199f0486f737") (:revdesc . "765cac80144c") (:keywords "tools") (:authors ("Ozan Sener" . "hi@ozan.email")) (:maintainers ("Ozan Sener" . "hi@ozan.email")) (:maintainer "Ozan Sener" . "hi@ozan.email"))]) + (weblio . [(20250928 1117) ((request (0 3 3)) (emacs (25 1))) "Look up Japanese words on Weblio.jp" tar ((:url . "https://github.com/pzel/weblio") (:commit . "86adae50e51a74149d9805c0446edf10a7f5c3f7") (:revdesc . "86adae50e51a") (:keywords "langauges" "i18n"))]) + (weblogger . [(20110926 1618) ((xml-rpc (1 6 8))) "Weblog maintenance via XML-RPC APIs" tar ((:url . "http://launchpad.net/weblogger-el") (:commit . "40cfbfc69be6a619173804441db2f407e3fa1731") (:revdesc . "40cfbfc69be6") (:keywords "weblog" "blogger" "cms" "movable" "type" "openweblog" "blog"))]) + (weblorg . [(20240711 940) ((templatel (0 1 6)) (emacs (26 1))) "Static Site Generator for org-mode" tar ((:url . "https://emacs.love/weblorg") (:commit . "0db218bd6b2e083546d3a69a022dfb1a08900acd") (:revdesc . "0db218bd6b2e") (:authors ("Lincoln Clarete" . "lincoln@clarete.li")) (:maintainers ("Lincoln Clarete" . "lincoln@clarete.li")) (:maintainer "Lincoln Clarete" . "lincoln@clarete.li"))]) + (webpaste . [(20241125 1418) ((emacs (24 4)) (request (0 2 0)) (cl-lib (0 5))) "Paste to pastebin-like services" tar ((:url . "https://github.com/etu/webpaste.el") (:commit . "e2a41530257f04b7ad2198d333adcf247a05277c") (:revdesc . "e2a41530257f") (:keywords "convenience" "comm" "paste") (:authors ("Elis etu Hirwing" . "elis@hirwing.se")) (:maintainers ("Elis etu Hirwing" . "elis@hirwing.se")) (:maintainer "Elis etu Hirwing" . "elis@hirwing.se"))]) + (websearch . [(20251225 1437) ((emacs (24 4))) "Query search engines" tar ((:url . "https://gitlab.com/xgqt/xgqt-elisp-lib-websearch") (:commit . "d3403903f54d0ff5dd88d6675dae9bc9d738a32b") (:revdesc . "d3403903f54d") (:keywords "convenience" "hypermedia") (:authors ("Maciej Barć" . "xgqt@xgqt.org")) (:maintainers ("Maciej Barć" . "xgqt@xgqt.org")) (:maintainer "Maciej Barć" . "xgqt@xgqt.org"))]) + (websocket . [(20230809 305) ((cl-lib (0 5))) "Emacs WebSocket client and server" tar ((:url . "https://github.com/ahyatt/emacs-websocket") (:commit . "40c208eaab99999d7c1e4bea883648da24c03be3") (:revdesc . "40c208eaab99") (:keywords "communication" "websocket" "server") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainers ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com"))]) + (wedge-ws . [(20140714 2149) nil "Wedge whitespace between columns in text" tar ((:url . "https://github.com/aes/wedge-ws") (:commit . "4669115f02d9c6fee067cc5369bb38c0f9db88b2") (:revdesc . "4669115f02d9") (:keywords "formatting" "indentation") (:authors ("Anders Eurenius" . "aes@spotify.com")) (:maintainers ("Anders Eurenius" . "aes@spotify.com")) (:maintainer "Anders Eurenius" . "aes@spotify.com"))]) + (weibo . [(20150307 2242) ((cl-lib (0 5))) "Weibo client for Emacs" tar ((:url . "https://github.com/austin-----/weibo.emacs") (:commit . "a8abb50b7602fe15fe2bc6400ac29780e956b390") (:revdesc . "a8abb50b7602") (:keywords "weibo") (:authors ("Austin" . "austiny.cn@gmail.com")) (:maintainers ("Austin" . "austiny.cn@gmail.com")) (:maintainer "Austin" . "austiny.cn@gmail.com"))]) + (weyland-yutani-theme . [(20210802 2251) ((emacs (24 1))) "Emacs theme based off Alien movie franchise" tar ((:url . "https://github.com/jstaursky/weyland-yutani-theme") (:commit . "e89a63a62e071180c9cdd9067679fadc3f7bf796") (:revdesc . "e89a63a62e07"))]) + (wfnames . [(20240820 906) ((emacs (24 4))) "Edit filenames" tar ((:url . "https://github.com/thierryvolpiatto/wfnames") (:commit . "3652cbd131b23df541e306b9c20a65111f05806d") (:revdesc . "3652cbd131b2") (:keywords "wfnames" "convenience" "files" "editing" "helm") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainers ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net"))]) + (wgrep . [(20230203 1214) ((emacs (25 1))) "Writable grep buffer" tar ((:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep.el") (:commit . "b4d69280d8a6a5ded1597e02afbaa811a160383b") (:revdesc . "b4d69280d8a6") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (wgrep-ack . [(20230207 1125) ((emacs (25 1)) (wgrep (3 0 0))) "Writable ack-and-a-half buffer" tar ((:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-ack.el") (:commit . "edf768732a56840db6879706b64c5773c316d619") (:revdesc . "edf768732a56") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (wgrep-ag . [(20230202 315) ((emacs (25 1)) (wgrep (3 0 0))) "Writable ag buffer" tar ((:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-ag.el") (:commit . "ff3cf631b6842432daa59bf604049ca916cce73b") (:revdesc . "ff3cf631b684") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (wgrep-deadgrep . [(20231215 1145) ((wgrep (2 3 0)) (emacs (25 1))) "Writable deadgrep buffer and apply the changes to files" tar ((:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-deadgrep.el") (:commit . "07cd02dddefd99bd4128100579ecaca929a57d6e") (:revdesc . "07cd02dddefd") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com") ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com") ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (wgrep-helm . [(20230202 315) ((emacs (25 1)) (wgrep (3 0 0))) "Writable helm-grep-mode buffer" tar ((:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-helm.el") (:commit . "ff3cf631b6842432daa59bf604049ca916cce73b") (:revdesc . "ff3cf631b684") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (wgrep-pt . [(20230207 1125) ((emacs (25 1)) (wgrep (3 0 0))) "Writable pt buffer" tar ((:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-pt.el") (:commit . "edf768732a56840db6879706b64c5773c316d619") (:revdesc . "edf768732a56") (:keywords "grep" "edit" "extensions") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com") ("Bailey Ling" . "bling@live.ca")) (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com") ("Bailey Ling" . "bling@live.ca")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (wgsl-mode . [(20231118 1944) ((emacs (24))) "Syntax highlighting for the WebGPU Shading Language" tar ((:url . "https://github.com/acowley/wgsl-mode") (:commit . "003a4e99491fa2a0b777f74658e6ffc70fd3a8c2") (:revdesc . "003a4e99491f") (:keywords "wgsl" "c"))]) + (whaler . [(20250310 1131) ((emacs (25 1)) (f (0 20 0)) (dash (2 19 1))) "Minimalistic and customizable project manager" tar ((:url . "https://github.com/salorak/whaler.el") (:commit . "9237c4c01b33dd3a6609372def616ae548fd49fc") (:revdesc . "9237c4c01b33") (:keywords "tools") (:authors ("Hector Salorak Alarcon" . "salorack@protonmail.com")) (:maintainers ("Hector Salorak Alarcon" . "salorack@protonmail.com")) (:maintainer "Hector Salorak Alarcon" . "salorack@protonmail.com"))]) + (what-the-commit . [(20150901 1316) nil "Random commit message generator" tar ((:url . "http://barbarito.me/") (:commit . "42604410cfd5be715c8aa730aef4673773454e8b") (:revdesc . "42604410cfd5") (:keywords "git" "commit" "message") (:authors ("Dan Barbarito" . "dan@barbarito.me")) (:maintainers ("Dan Barbarito" . "dan@barbarito.me")) (:maintainer "Dan Barbarito" . "dan@barbarito.me"))]) + (which-key . [(20240620 2145) ((emacs (25 1))) "Display available keybindings in popup" tar ((:url . "https://github.com/justbur/emacs-which-key") (:commit . "ed389312170df955aaf10c2e120cc533ed5c509e") (:revdesc . "ed389312170d") (: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 ((:url . "https://github.com/emacsorphanage/which-key-posframe") (:commit . "e4a9ce9a1b20de550fca51f14d055821980d534a") (:revdesc . "e4a9ce9a1b20") (:keywords "convenience" "bindings" "tooltip") (:authors ("Yanghao Xie" . "yhaoxie@gmail.com")) (:maintainers ("Yanghao Xie" . "yhaoxie@gmail.com")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com"))]) + (whiley-mode . [(20220501 2219) ((emacs (24 1))) "Major mode for Whiley language" tar ((:url . "http://github.com/Whiley/WhileyEmacsMode") (:commit . "e7cc4759d46be589d421a2235af6771bcde9ae33") (:revdesc . "e7cc4759d46b") (:keywords "languages") (:authors ("David J. Pearce" . "dave01001110@gmail.com")) (:maintainers ("David J. Pearce" . "dave01001110@gmail.com")) (:maintainer "David J. Pearce" . "dave01001110@gmail.com"))]) + (whisper . [(20251219 342) ((emacs (26 1))) "Speech-to-text using Whisper.cpp" tar ((:url . "https://github.com/emacselements/whisper") (:commit . "e956feabced9c9081779dd89ff366e25e4d64fd9") (:revdesc . "e956feabced9") (:keywords "convenience" "speech" "whisper" "transcription"))]) + (whitaker . [(20210203 1149) ((emacs (25))) "Comint interface for Whitaker's Words" tar ((:url . "https://github.com/Fuco1/whitaker") (:commit . "a6fda24ccb69a18c0706633326d5cc4fcfaed83a") (:revdesc . "a6fda24ccb69") (:keywords "processes") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainers ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com"))]) + (white-sand-theme . [(20210131 813) ((emacs (24))) "Emacs theme with a light background" tar ((:url . "https://github.com/mswift42/white-sand-theme") (:commit . "729dd52cc1936250183d6761eed406c4be514a71") (:revdesc . "729dd52cc193"))]) + (white-theme . [(20250921 2105) ((emacs (24))) "Minimalistic light color theme inspired by basic-theme" tar ((:url . "http://github.com/nullvec/white-theme.el") (:commit . "7c42cb08425ac7f7e33e8d947a950a55dee3fadf") (:revdesc . "7c42cb08425a") (:keywords "color" "theme" "minimal" "basic" "simple" "white") (:authors ("A. Hdez" . "trefoil_chilled_7k@icloud.com")) (:maintainers ("A. Hdez" . "trefoil_chilled_7k@icloud.com")) (:maintainer "A. Hdez" . "trefoil_chilled_7k@icloud.com"))]) + (whitespace-cleanup-mode . [(20210510 533) ((emacs (24 1))) "Intelligently call whitespace-cleanup on save" tar ((:url . "https://github.com/purcell/whitespace-cleanup-mode") (:commit . "b108b73ddf8f7e747d5a20a681560171e02ad037") (:revdesc . "b108b73ddf8f") (:keywords "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (whizzml-mode . [(20201013 239) ((emacs (24 4))) "Programming mode for editing WhizzML files" tar ((:url . "https://github.com/whizzml/whizzml-mode") (:commit . "3dce3be0c32b9b2d259e462b4b27c530af47466a") (:revdesc . "3dce3be0c32b") (:keywords "languages" "lisp") (:authors ("Jose Antonio Ortega Ruiz" . "jao@bigml.com")) (:maintainers ("Jose Antonio Ortega Ruiz" . "jao@bigml.com")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@bigml.com"))]) + (whois . [(20240315 1929) ((emacs (24))) "Syntax highlighted domain name queries using system whois" tar ((:url . "https://github.com/lassik/emacs-whois") (:commit . "d4466b296721fa94b2ceab1c51bc9bfd8bbf4e0a") (:revdesc . "d4466b296721") (:keywords "network" "comm") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainers ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io"))]) + (whole-line-or-region . [(20240630 804) ((emacs (24 4))) "Operate on current line if region undefined" tar ((:url . "https://github.com/purcell/whole-line-or-region") (:commit . "f39fd03cf563ffdf57144a7586a5e845969fc641") (:revdesc . "f39fd03cf563") (:keywords "convenience" "wp") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (why-this . [(20221129 817) ((emacs (27 1))) "Why is this line here? Ask version control" tar ((:url . "https://codeberg.org/akib/emacs-why-this") (:commit . "5203d9379afaf6703746823a580c804e1dd98e08") (:revdesc . "5203d9379afa") (:keywords "tools" "convenience" "vc") (:authors ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainers ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainer "Akib Azmain Turja" . "akib@disroot.org"))]) + (wide-column . [(20170925 1613) nil "Calls functions dependant on column position" tar ((:url . "https://github.com/phillord/wide-column") (:commit . "ce9ef4675485a7bea381077866368ef875226b10") (:revdesc . "ce9ef4675485") (:keywords "minor mode" "cursor colour" "column width") (:authors ("Phillip Lord" . "p.lord@russet.org.uk")) (:maintainers ("Phillip Lord" . "p.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "p.lord@russet.org.uk"))]) + (widget-mvc . [(20150102 406) nil "MVC framework for the emacs widgets" tar ((:url . "https://github.com/kiwanami/emacs-widget-mvc") (:commit . "2576e6f0c35d8dedfa9c2cd6ea4fb4c14cb72b63") (:revdesc . "2576e6f0c35d") (:keywords "lisp" "widget") (:authors ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatkiwanami.net"))]) + (wiki-nav . [(20230304 2212) ((button-lock (1 0 2)) (nav-flash (1 0 0))) "Simple file navigation using [[WikiStrings]]" tar ((:url . "http://github.com/rolandwalker/button-lock") (:commit . "1f7a89ca05b6167af7d1337ad23a5d923486caac") (:revdesc . "1f7a89ca05b6") (:keywords "mouse" "button" "hypermedia" "navigation") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (wiki-summary . [(20181010 1824) ((emacs (24))) "View Wikipedia summaries in Emacs easily" tar ((:url . "https://github.com/jozefg/wiki-summary.el") (:commit . "fa41ab6e50b3b80e54148af9d4bac18fd0405000") (:revdesc . "fa41ab6e50b3") (:keywords "wikipedia" "utility"))]) + (wikinfo . [(20220906 1709) ((emacs (27 1))) "Scrape Wikipedia Infoboxes" tar ((:url . "https://github.com/progfolio/wikinfo") (:commit . "bf395c9aaf6be7fda371be611005737d52417fec") (:revdesc . "bf395c9aaf6b") (:keywords "org" "convenience") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainers ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com"))]) + (wikinforg . [(20250809 56) ((emacs (27 1)) (wikinfo (0 0 0)) (org (9 3))) "Org-mode wikinfo integration" tar ((:url . "https://github.com/progfolio/wikinforg") (:commit . "edf2fc770e32e82a9ffa226ce602dbb9636d9ac5") (:revdesc . "edf2fc770e32") (:keywords "org" "convenience") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainers ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com"))]) + (wiktionary-bro . [(20251218 2021) ((emacs (30 1)) (request (0 3 3))) "Lookup Wiktionary entries" tar ((:url . "https://github.com/agzam/wiktionary-bro.el") (:commit . "def5f3cb1486077cb090da48d77f790b858e7886") (:revdesc . "def5f3cb1486") (:keywords "convenience" "multimedia") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com"))]) + (wildcharm-light-theme . [(20231127 537) ((emacs (24 1))) "Port of vim-wildcharm (light) colorscheme" tar ((:url . "https://github.com/habamax/wildcharm-theme") (:commit . "58662e13c179106ea7780e71bd3ef3c1cf74e929") (:revdesc . "58662e13c179") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com"))]) + (wildcharm-theme . [(20231127 537) ((emacs (24 1))) "Port of vim-wildcharm colorscheme" tar ((:url . "https://github.com/habamax/wildcharm-theme") (:commit . "58662e13c179106ea7780e71bd3ef3c1cf74e929") (:revdesc . "58662e13c179") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainers ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com"))]) + (wilt . [(20180220 854) ((emacs (24 3)) (dash (2 12 0)) (s (1 10 0))) "An extensions for calculating WILT in a buffer" tar ((:url . "https://github.com/sixty-north/emacs-wilt") (:commit . "04dbe37fa35d0b24c791421785d2c97a8cbfe2cc") (:revdesc . "04dbe37fa35d") (:authors ("Austin Bingham" . "austin@sixty-north.com")) (:maintainers ("Austin Bingham" . "austin@sixty-north.com")) (:maintainer "Austin Bingham" . "austin@sixty-north.com"))]) + (win-switch . [(20161009 1627) nil "Fast, dynamic bindings for window-switching/resizing" tar ((:url . "http://www.stat.cmu.edu/~genovese/emacs/win-switch/") (:commit . "954eb5e4c5737f0c06368c42a7f1c3dd374d782f") (:revdesc . "954eb5e4c573") (:keywords "window" "switch" "key bindings" "ergonomic" "efficient") (:authors ("Christopher Genovese" . "genovese@cmu.edu")) (:maintainers ("Christopher R. Genovese" . "genovese@cmu.edu")) (:maintainer "Christopher R. Genovese" . "genovese@cmu.edu"))]) + (windata . [(20090830 1040) nil "Convert window configuration to list" tar ((:url . "https://github.com/emacsorphanage/windata") (:commit . "a723fc446ceaec23d5f29ecc8245d94c99d91625") (:revdesc . "a723fc446cea") (:keywords "convenience" "frames") (:authors (nil . "wenbinye@gmail.com")) (:maintainers (nil . "wenbinye@gmail.com")) (:maintainer nil . "wenbinye@gmail.com"))]) + (window-end-visible . [(20140508 2041) nil "Find the last visible point in a window" tar ((:url . "http://github.com/rolandwalker/window-end-visible") (:commit . "f0ed55aa5f7875634fb4c8b6fbaa93633bc57d85") (:revdesc . "f0ed55aa5f78") (:keywords "extensions") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainers ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com"))]) + (window-jump . [(20170809 2208) nil "Move left/right/up/down through your windows" tar ((:url . "https://github.com/chumpage/chumpy-windows") (:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:revdesc . "6bdb51e9a346") (:keywords "frames" "convenience"))]) + (window-layout . [(20241104 900) nil "Window layout manager" tar ((:url . "https://github.com/kiwanami/emacs-window-layout") (:commit . "277d0a8247adf13707703574cbbc16ddcff7c5fd") (:revdesc . "277d0a8247ad") (:keywords "window" "layout") (:authors ("SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net")) (:maintainers ("SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakuraiatmarkkiwanami.net"))]) + (window-number . [(20170801 151) nil "Select windows by numbers" tar ((:url . "https://github.com/nikolas/window-number") (:commit . "d41722de646ffeb3f70d26e4a86a5a1ba5c6be87") (:revdesc . "d41722de646f") (:keywords "windows") (:authors ("Johann Myrkraverk Oskarsson" . "myrkraverk@users.sourceforge.net")) (:maintainers ("Nik Nyby" . "niknyby@riseup.net") ("Johann Myrkraverk Oskarsson" . "myrkraverk@users.sourceforge.net") ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "Nik Nyby" . "niknyby@riseup.net"))]) + (window-numbering . [(20160809 1810) nil "Numbered window shortcuts" tar ((:url . "http://nschum.de/src/emacs/window-numbering-mode/") (:commit . "10809b3993a97c7b544240bf5d7ce9b1110a1b89") (:revdesc . "10809b3993a9") (:keywords "faces" "matching") (:authors ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainers ("Nikolaj Schumacher" . "bugs*nschumde")) (:maintainer "Nikolaj Schumacher" . "bugs*nschumde"))]) + (window-purpose . [(20241207 148) ((emacs (25 1)) (let-alist (1 0 3)) (imenu-list (0 1))) "Purpose-based window management for Emacs" tar ((:url . "https://github.com/bmag/emacs-purpose") (:commit . "c827f45cd9b278b3eb9c2f4bcb55ef2fca5d3048") (:revdesc . "c827f45cd9b2") (:keywords "frames"))]) + (winds . [(20201121 123) ((emacs (25 1))) "Window configuration switcher grouped by workspaces" tar ((:url . "https://github.com/Javyre/winds.el") (:commit . "5827e890059d0ce67ebb4779da63c15afccf0973") (:revdesc . "5827e890059d") (:keywords "convenience") (:authors ("Javier A. Pollak" . "javi.po.123@gmail.com")) (:maintainers ("Javier A. Pollak" . "javi.po.123@gmail.com")) (:maintainer "Javier A. Pollak" . "javi.po.123@gmail.com"))]) + (windsize . [(20181029 2257) nil "Simple, intuitive window resizing" tar ((:url . "http://github.com/grammati/windsize") (:commit . "62c2846bbe95b0a73e996c75e4a644d05f57aaaa") (:revdesc . "62c2846bbe95") (:keywords "window" "resizing" "convenience") (:authors ("Chris Perkins" . "chrisperkins99@gmail.com")) (:maintainers ("Chris Perkins" . "chrisperkins99@gmail.com")) (:maintainer "Chris Perkins" . "chrisperkins99@gmail.com"))]) + (windswap . [(20200722 411) ((emacs (24 3))) "Like windmove, but swaps buffers while moving point" tar ((:url . "https://github.com/purcell/windswap") (:commit . "1a334f6543e0a30c55ea1e6071e9732d948f9e4b") (:revdesc . "1a334f6543e0") (:keywords "frames" "convenience") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainers ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (windwow . [(20170816 148) ((dash (2 11 0)) (cl-lib (0 6 1)) (emacs (24))) "Simple workspace management" tar ((:url . "github.com/vijumathew/windwow") (:commit . "77bad26f651744b68d31b389389147014d250f23") (:revdesc . "77bad26f6517") (:keywords "frames") (:authors ("Viju Mathew" . "viju.jm@gmail.com")) (:maintainers ("Viju Mathew" . "viju.jm@gmail.com")) (:maintainer "Viju Mathew" . "viju.jm@gmail.com"))]) + (winnow . [(20250502 1745) ((emacs (24))) "Winnow ag/grep results by matching/excluding lines" tar ((:url . "https://github.com/dgtized/winnow.el") (:commit . "858e74314c06c060596d6e6119471deef759be4d") (:revdesc . "858e74314c06") (:keywords "matching") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainers ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com"))]) + (winpoint . [(20131023 1713) nil "Remember buffer positions per-window, not per buffer" tar ((:url . "https://github.com/jorgenschaefer/winpoint") (:commit . "b32ab55f7b8797b9b042a8a89d89d6f79bc356a9") (:revdesc . "b32ab55f7b87") (:keywords "convenience") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainers ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx"))]) + (winring . [(20251122 112) nil "Window configuration rings" tar ((:url . "https://gitlab.com/warsaw/winring") (:commit . "286bd61536396e262295a442b7a5ed49cbcc81d9") (:revdesc . "286bd6153639") (:keywords "frames" "tools"))]) + (winum . [(20190911 1607) ((cl-lib (0 5)) (dash (2 13 0))) "Navigate windows and frames using numbers" tar ((:url . "http://github.com/deb0ch/winum.el") (:commit . "098249c65042ee0308b8236d1ee838c8da8fdf25") (:revdesc . "098249c65042") (:keywords "convenience" "frames" "windows" "multi-screen") (: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"))]) + (wisp-mode . [(20251108 2318) ((emacs (24 4))) "Tools for wisp: the Whitespace-to-Lisp preprocessor" tar ((:url . "http://www.draketo.de/english/wisp") (:commit . "cfebcd5f097f2f7bbb0f5b0c3730584313c93bac") (:revdesc . "cfebcd5f097f") (:keywords "languages" "lisp" "scheme") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainers ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de"))]) + (wispjs-mode . [(20170720 1919) ((clojure-mode (0))) "Major mode for Wisp code" tar ((:url . "https://github.com/krisajenkins/wispjs-mode") (:commit . "60f9f5fd9d1556e2d008939f67eb1b1d0f325fa8") (:revdesc . "60f9f5fd9d15") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainers ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com"))]) + (with-editor . [(20251101 2100) ((emacs (26 1)) (compat (30 1))) "Use the Emacsclient as $EDITOR" tar ((:url . "https://github.com/magit/with-editor") (:commit . "dbc694406c2fd8e9d3e6ffbc4f8aff4e8c28029f") (:revdesc . "dbc694406c2f") (:keywords "processes" "terminals") (:authors ("Jonas Bernoulli" . "emacs.with-editor@jonas.bernoulli.dev")) (:maintainers ("Jonas Bernoulli" . "emacs.with-editor@jonas.bernoulli.dev")) (:maintainer "Jonas Bernoulli" . "emacs.with-editor@jonas.bernoulli.dev"))]) + (with-emacs . [(20220814 444) ((emacs (24 4))) "Evaluate Emacs Lisp expressions in a separate Emacs process" tar ((:url . "https://github.com/twlz0ne/with-emacs.el") (:commit . "fb9ef454a4bb2d6de3415807b4858a20a9cc0dad") (:revdesc . "fb9ef454a4bb") (:keywords "tools") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com"))]) + (with-namespace . [(20130407 1822) ((dash (1 1 0)) (loop (1 1))) "Interoperable elisp namespaces" tar ((:url . "https://github.com/Wilfred/with-namespace.el") (:commit . "36828a40428c8e53c117f2df830b2f7a59ddd306") (:revdesc . "36828a40428c") (:keywords "namespaces") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainers ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (with-proxy . [(20200510 414) ((emacs (24 4))) "Evaluate expressions with proxy" tar ((:url . "https://github.com/twlz0ne/with-proxy.el") (:commit . "93b1ed2f3060f305009fa71f4fb5bb10173a10e3") (:revdesc . "93b1ed2f3060") (:keywords "comm") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainers ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com"))]) + (with-shell-interpreter . [(20230916 1420) ((emacs (25 1)) (cl-lib (0 6 1))) "Helper for shell command APIs" tar ((:url . "https://github.com/p3r7/with-shell-interpreter") (:commit . "bef977d8058d26d82ab11a7227c88b3011edd127") (:revdesc . "bef977d8058d") (:keywords "processes" "terminals"))]) + (with-simulated-input . [(20210527 2337) ((emacs (24 4))) "A macro to simulate user input non-interactively" tar ((:url . "https://github.com/DarwinAwardWinner/with-simulated-input") (:commit . "ee4d2b75fd99bac3de40675b0a0e03529718f59f") (:revdesc . "ee4d2b75fd99") (:keywords "lisp" "tools" "extensions") (: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"))]) + (with-venv . [(20210925 2336) ((cl-lib (0 5)) (emacs (24 4))) "Execute with Python virtual environment activated" tar ((:url . "https://github.com/10sr/with-venv-el") (:commit . "773192d892ec0341e023d8b5e80639f8eb79f2a5") (:revdesc . "773192d892ec") (:keywords "processes" "python" "venv") (:authors ("10sr" . "8.slashes[at]gmail[dot]com")) (:maintainers ("10sr" . "8.slashes[at]gmail[dot]com")) (:maintainer "10sr" . "8.slashes[at]gmail[dot]com"))]) + (wiz . [(20250107 2133) ((emacs (29 1)) (exec-path-from-shell (2 1))) "Macros to simplify startup initialization" tar ((:url . "https://github.com/zonuexe/emacs-wiz") (:commit . "1b8b8d54e011dd989a52cde9596e077aa09e5894") (:revdesc . "1b8b8d54e011") (:keywords "convenience" "lisp") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainers ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me"))]) + (wn-mode . [(20151110 552) ((emacs (24))) "Numeric window switching shortcuts" tar ((:url . "https://github.com/luismbo/wn-mode") (:commit . "f05c3151523e529af5a0a3fa8c948b61fb369f6e") (:revdesc . "f05c3151523e") (:keywords "buffers" "windows" "switching-windows") (:maintainers ("Luís Oliveira" . "luismbo@gmail.com")) (:maintainer "Luís Oliveira" . "luismbo@gmail.com"))]) + (wolfram . [(20231220 1950) nil "Wolfram Alpha Integration" tar ((:url . "https://github.com/hsjunnesson/wolfram.el") (:commit . "743c92f88bb3b6a77bc84ac2221adc6222cebb94") (:revdesc . "743c92f88bb3") (:keywords "math") (:authors ("Hans Sjunnesson" . "hans.sjunnesson@gmail.com")) (:maintainers ("Hans Sjunnesson" . "hans.sjunnesson@gmail.com")) (:maintainer "Hans Sjunnesson" . "hans.sjunnesson@gmail.com"))]) + (wolfram-mode . [(20180307 13) ((emacs (24 3))) "Mathematica editing and inferior mode" tar ((:url . "https://github.com/kawabata/wolfram-mode/") (:commit . "be680190cac6ccf579dbce107deaae495928d1b3") (:revdesc . "be680190cac6") (:keywords "languages" "processes" "tools") (:authors ("Daichi Mochihashi" . "daichiatcslab.kecl.ntt.co.jp")) (:maintainers ("Daichi Mochihashi" . "daichiatcslab.kecl.ntt.co.jp")) (:maintainer "Daichi Mochihashi" . "daichiatcslab.kecl.ntt.co.jp"))]) + (wollok-mode . [(20241012 1950) ((emacs (24 4))) "Major mode for the Wollok programming language" tar ((:url . "https://github.com/tralph3/wollok-mode") (:commit . "bd52ad66d7c43d7e46f7edd6693619e47aeceef9") (:revdesc . "bd52ad66d7c4") (:keywords "wollok" "languages"))]) + (wonderland . [(20130913 119) ((dash (2 0 0)) (dash-functional (1 0 0)) (multi (2 0 0)) (emacs (24))) "Declarative configuration for Emacsen" tar ((:url . "http://github.com/kurisuwhyte/emacs-wonderland") (:commit . "28cf6b37000c395ece9519db53147fb826a42bc4") (:revdesc . "28cf6b37000c") (:keywords "configuration" "profile" "wonderland") (:authors ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainers ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainer "Christina Whyte" . "kurisu.whyte@gmail.com"))]) + (wordcount-section . [(20251029 1934) ((emacs (28 1)) (compat (29 1)) (universal-sidecar (1 5 1))) "Universal Sidecar Section to show Word Counts" tar ((:url . "https://git.sr.ht/~swflint/emacs-universal-sidecar") (:commit . "01b12aecca0ce66f5427e7fe65012d37e7e128b2") (:revdesc . "01b12aecca0c") (:keywords "text" "convenience") (:authors ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainers ("Samuel W. Flint" . "me@samuelwflint.com")) (:maintainer "Samuel W. Flint" . "me@samuelwflint.com"))]) + (wordel . [(20250803 2033) ((emacs (27 1))) "An Elisp implementation of \"Wordle\" (aka \"Lingo\")" tar ((:url . "https://github.com/progfolio/wordel") (:commit . "e1686812cc72467df2845407b1ffd6cf55e49743") (:revdesc . "e1686812cc72") (:keywords "games") (:authors ("Nicholas Vollmer" . "iarchivedmywholelife@gmail.com")) (:maintainers ("Nicholas Vollmer" . "iarchivedmywholelife@gmail.com")) (:maintainer "Nicholas Vollmer" . "iarchivedmywholelife@gmail.com"))]) + (wordgen . [(20170803 1820) ((emacs (24)) (cl-lib (0 5))) "Random word generator" tar ((:url . "https://github.com/Fanael/wordgen.el") (:commit . "aacad928ae99a953e034a831dfd0ebdf7d52ac1d") (:revdesc . "aacad928ae99") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainers ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com"))]) + (wordnut . [(20241229 739) ((emacs (24 4))) "[No description available]" tar ((:url . "https://github.com/gromnitsky/wordnut") (:commit . "dffc75a455d0d4458b7555f4c051c51d71c8e18a") (:revdesc . "dffc75a455d0"))]) + (wordreference . [(20241203 1648) ((emacs (28 1))) "Interface for wordreference.com" tar ((:url . "https://codeberg.org/martianh/wordreference.el") (:commit . "4f68d155ceb3328c3263faee86cfb82d50402f05") (:revdesc . "4f68d155ceb3") (:keywords "convenience" "translate" "wp" "dictionary") (:authors ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainers ("Marty Hiatt" . "mousebot@disroot.org")) (:maintainer "Marty Hiatt" . "mousebot@disroot.org"))]) + (wordsmith-mode . [(20210715 1517) nil "Syntax analysis and NLP text-processing in Emacs (OSX-only)" tar ((:url . "https://github.com/emacsattic/wordsmith-mode") (:commit . "5d40ceaa2b8d41ab3634ca377ceb6a74deeb2287") (:revdesc . "5d40ceaa2b8d") (: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 ((:url . "https://github.com/abo-abo/worf") (:commit . "8681241e118585824cd256e5b026978bf06c7e58") (:revdesc . "8681241e1185") (:keywords "lisp") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (workgroups . [(20110726 1641) nil "Workgroups for windows (for Emacs)" tar ((:url . "https://github.com/tlh/workgroups.el") (:commit . "9572b3492ee09054dc329f64ed846c962b395e39") (:revdesc . "9572b3492ee0") (:keywords "session" "management" "window-configuration" "persistence") (:authors ("tlh" . "thunkout@gmail.com")) (:maintainers ("tlh" . "thunkout@gmail.com")) (:maintainer "tlh" . "thunkout@gmail.com"))]) + (workgroups2 . [(20230328 1331) ((emacs (25 1))) "Save&load multiple named workspaces (or \"workgroups\")" tar ((:url . "https://github.com/pashinin/workgroups2") (:commit . "aff9d76b7be5eed33f30be2fabf111818749cbd5") (:revdesc . "aff9d76b7be5") (:keywords "session" "management" "window-configuration" "persistence") (:authors ("Sergey Pashinin" . "sergeyatpashinindotcom")) (:maintainers ("Sergey Pashinin" . "sergeyatpashinindotcom")) (:maintainer "Sergey Pashinin" . "sergeyatpashinindotcom"))]) + (workroom . [(20230926 1631) ((emacs (25 1)) (project (0 3 0)) (compat (28 1 2 2))) "Named rooms for work without irrelevant distracting buffers" tar ((:url . "https://codeberg.org/akib/emacs-workroom") (:commit . "cb8654191b23c9b02a79660c3d8c969709c6fcbe") (:revdesc . "cb8654191b23") (:keywords "tools" "convenience") (:authors ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainers ("Akib Azmain Turja" . "akib@disroot.org")) (:maintainer "Akib Azmain Turja" . "akib@disroot.org"))]) + (world-time-mode . [(20140627 807) nil "Show whole days of world-time diffs" tar ((:url . "https://github.com/nicferrier/emacs-world-time-mode") (:commit . "ce7a3b45c87eb24cfe61eee453175d64f741d7cc") (:revdesc . "ce7a3b45c87e") (:keywords "tools" "calendar") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainers ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))]) + (wotd . [(20170328 1948) ((emacs (24 4)) (org (8 2 10))) "Fetch word-of-the-day from multiple online sources" tar ((:url . "https://github.com/cute-jumper/emacs-word-of-the-day") (:commit . "d2937a3d91e014f8028a1f33d21c18cc0b065a64") (:revdesc . "d2937a3d91e0") (:keywords "extensions") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainers ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com"))]) + (wrap-region . [(20140117 720) ((dash (1 0 3))) "Wrap text with punctation or tag" tar ((:url . "http://github.com/rejeep/wrap-region") (:commit . "5a910ad23ebb0649e644bf62ad042587341da5da") (:revdesc . "5a910ad23ebb") (:keywords "speed" "convenience") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainers ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com"))]) + (wren-mode . [(20221227 227) ((emacs (24 3))) "A major mode for the Wren programming language" tar ((:url . "https://github.com/thechampagne/wren-mode") (:commit . "70b1b89f565679a15c8c9c1a9bda98b0d163e83e") (:revdesc . "70b1b89f5656") (:keywords "files" "wren"))]) + (writefreely . [(20241222 1909) ((emacs (24 3)) (org (9 0)) (ox-hugo (0 12)) (request (0 3))) "Push your Org files as markdown to a writefreely instance" tar ((:url . "https://github.com/dangom/writefreely.el") (:commit . "cfcd21b82dc4a4543efb6209fc0a4f4bc3c78e4a") (:revdesc . "cfcd21b82dc4") (:keywords "convenience") (:authors ("Daniel Gomez" . "d.gomezatposteodotorg")) (:maintainers ("Daniel Gomez" . "d.gomezatposteodotorg")) (:maintainer "Daniel Gomez" . "d.gomezatposteodotorg"))]) + (writegood-mode . [(20220511 2109) nil "Polish up poor writing on the fly" tar ((:url . "http://github.com/bnbeckwith/writegood-mode") (:commit . "d54eadeedb8bf3aa0e0a584c0a7373c69644f4b8") (:revdesc . "d54eadeedb8b") (:keywords "writing" "weasel-words" "grammar"))]) + (writeroom-mode . [(20250204 2335) ((emacs (25 1)) (visual-fill-column (2 2))) "Minor mode for distraction-free writing" tar ((:url . "https://github.com/joostkremers/writeroom-mode") (:commit . "cca2b4b3cfcfea1919e1870519d79ed1a69aa5e2") (:revdesc . "cca2b4b3cfcf") (:keywords "text") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainers ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm"))]) + (ws-butler . [(20250310 205) ((emacs (24 1))) "Unobtrusively remove trailing whitespace" tar ((:url . "https://elpa.nongnu.org/nongnu/ws-butler.html") (:commit . "9ee5a7657a22e836618813c2e2b64a548d27d2ff") (:revdesc . "9ee5a7657a22") (:keywords "text") (:authors ("Le Wang" . "l26wang@gmail.com")) (:maintainers ("Sean Whitton" . "spwhitton@spwhitton.name")) (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name"))]) + (wsd-mode . [(20191031 1211) nil "Emacs major-mode for www.websequencediagrams.com" tar ((:url . "https://github.com/josteink/wsd-mode") (:commit . "44aac55afb57cb540559aa1015f9ad2d770dd5c8") (:revdesc . "44aac55afb57") (:keywords "wsd" "diagrams" "design" "process" "modelling" "uml") (:authors ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainers ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com"))]) + (wttrin . [(20251113 2014) ((emacs (24 4)) (xterm-color (1 0))) "Emacs Frontend for Service wttr.in" tar ((:url . "https://github.com/cjennings/emacs-wttrin") (:commit . "bf989bb594680eb2e3b69f55752353aa33cb47bb") (:revdesc . "bf989bb59468") (:keywords "weather" "wttrin" "games") (:maintainers ("Craig Jennings" . "c@cjennings.net")) (:maintainer "Craig Jennings" . "c@cjennings.net"))]) + (wucuo . [(20240929 610) ((emacs (25 1))) "Fastest solution to spell check camel case code or plain text" tar ((:url . "http://github.com/redguardtoo/wucuo") (:commit . "351997d1cfa02375ce8efd3414802a3507a73b76") (:revdesc . "351997d1cfa0") (:keywords "convenience") (:authors ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainers ("Chen Bin" . "chenbinDOTshATgmailDOTcom")) (:maintainer "Chen Bin" . "chenbinDOTshATgmailDOTcom"))]) + (wwg . [(20210614 1527) ((emacs (25 1))) "Writer word goals" tar ((:url . "https://github.com/ag91/writer-word-goals") (:commit . "46c8a7c71275ced2c662c1222d4b85319f80dd83") (:revdesc . "46c8a7c71275") (:keywords "wp") (:authors (nil . "Andreaandrea-dev@hotmail.com")) (:maintainers (nil . "Andreaandrea-dev@hotmail.com")) (:maintainer nil . "Andreaandrea-dev@hotmail.com"))]) + (wwtime . [(20151122 1610) nil "Insert a time of day with appropriate world-wide localization" tar ((:url . "https://github.com/ndw/wwtime") (:commit . "d04d8fa814b5d3644efaeb28f25520ada69acbbd") (:revdesc . "d04d8fa814b5") (:keywords "time") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainers ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com"))]) + (www-synonyms . [(20170128 2251) ((request (0 2 0)) (cl-lib (0 5))) "Insert synonym for a word" tar ((:url . "https://github.com/spebern/www-synonyms") (:commit . "7e37ea35064ff31c9945f0198a653647d408c936") (:revdesc . "7e37ea35064f") (:keywords "lisp") (:authors ("Bernhard Specht" . "bernhard@specht.net")) (:maintainers ("Bernhard Specht" . "bernhard@specht.net")) (:maintainer "Bernhard Specht" . "bernhard@specht.net"))]) + (x-path-walker . [(20220714 1056) ((helm-core (3 6 0))) "Navigation feature for JSON/XML/HTML based on path (imenu like)" tar ((:url . "https://github.com/Lompik/x-path-walker") (:commit . "c91deaaba0d5cc9018008a39c96222deacba3868") (:revdesc . "c91deaaba0d5") (:keywords "convenience") (:authors (nil . "lompik@ArchOrion")) (:maintainers (nil . "lompik@ArchOrion")) (:maintainer nil . "lompik@ArchOrion"))]) + (x509-mode . [(20251105 1853) ((emacs (25 1)) (compat (29 1))) "View certificates, CRLs and keys using OpenSSL" tar ((:url . "https://github.com/jobbflykt/x509-mode") (:commit . "02e62ebd857946de629e45bff6a7de533f9022bc") (:revdesc . "02e62ebd8579") (:authors ("Fredrik Axelsson" . "f.axelsson@gmail.com")) (:maintainers ("Fredrik Axelsson" . "f.axelsson@gmail.com")) (:maintainer "Fredrik Axelsson" . "f.axelsson@gmail.com"))]) + (x86-lookup . [(20240823 1135) ((emacs (24 3)) (cl-lib (0 3))) "Jump to x86 instruction documentation" tar ((:url . "https://github.com/skeeto/x86-lookup") (:commit . "0a6e4faceb3c313c3ee0ac4b086326a7553c1d8b") (:revdesc . "0a6e4faceb3c") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainers ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com"))]) + (xbm-life . [(20210508 1640) ((emacs (24 1))) "A XBM version of Conway's Game of Life" tar ((:url . "https://depp.brause.cc/xbm-life") (:commit . "ec6abb0182068294a379cb49ad5346b1d757457d") (:revdesc . "ec6abb018206") (:keywords "games") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (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 ((:url . "https://github.com/nicklanasa/xcode-mode") (:commit . "5b5f0a4f505d44840a4924b24e3ef73b8528d98b") (:revdesc . "5b5f0a4f505d") (:keywords "conveniences") (:authors ("Nickolas Lanasa" . "nick@nytekproductions.com")) (:maintainers ("Nickolas Lanasa" . "nick@nytekproductions.com")) (:maintainer "Nickolas Lanasa" . "nick@nytekproductions.com"))]) + (xcode-project . [(20200810 2010) ((emacs (25))) "A package for reading Xcode project files" tar ((:url . "https://github.com/nhojb/xcode-project.git") (:commit . "90aef198df5b51dfdb9ad205aa5b412c471fd418") (:revdesc . "90aef198df5b") (:keywords "languages" "tools") (:authors ("John Buckley" . "john@olivetoast.com")) (:maintainers ("John Buckley" . "john@olivetoast.com")) (:maintainer "John Buckley" . "john@olivetoast.com"))]) + (xcscope . [(20230626 2109) nil "Cscope interface for (X)Emacs" tar ((:url . "https://github.com/dkogan/xcscope.el") (:commit . "2f35b26428dd82c016941744f03aad97df80c47b") (:revdesc . "2f35b26428dd") (:keywords "languages" "c") (:authors ("Darryl Okahata" . "darrylo@sonic.net") ("Dima Kogan" . "dima@secretsauce.net")) (:maintainers ("Dima Kogan" . "dima@secretsauce.net")) (:maintainer "Dima Kogan" . "dima@secretsauce.net"))]) + (xenops . [(20250318 1613) ((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 ((:url . "https://github.com/dandavison/xenops") (:commit . "de8bce9af99476b58742679a77ac09bdb7ea0c76") (:revdesc . "de8bce9af994") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainers ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com"))]) + (xhair . [(20210801 222) ((emacs (24 3)) (vline (1 0))) "Highlight the current line and column" tar ((:url . "https://github.com/Boruch-Baum/emacs-xhair") (:commit . "c7bd7c501c3545aa99dadac386c882fe7c5edd9c") (:revdesc . "c7bd7c501c35") (:keywords "convenience" "faces" "maint"))]) + (xkb-mode . [(20250421 840) ((emacs (25 1))) "Major mode for editing X Keyboard Extension (XKB) files" tar ((:url . "https://github.com/captainflasmr/xkb-mode") (:commit . "0e317a08dd665bfa8d1bbfbe23c7ca3ae0975519") (:revdesc . "0e317a08dd66") (:keywords "convenience") (:authors ("James Dyer" . "captainflasmr@gmail.com")) (:maintainers ("James Dyer" . "captainflasmr@gmail.com")) (:maintainer "James Dyer" . "captainflasmr@gmail.com"))]) + (xkcd . [(20220503 1109) ((json (1 3))) "View xkcd from Emacs" tar ((:url . "https://github.com/vibhavp/emacs-xkcd") (:commit . "80011da2e7def8f65233d4e0d790ca60d287081d") (:revdesc . "80011da2e7de") (:keywords "xkcd" "webcomic") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainers ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com"))]) + (xmind-org . [(20240723 1455) ((emacs (27 1)) (org-ml (5 3)) (dash (2 12))) "Import XMind mindmaps into Org" tar ((:url . "https://github.com/akirak/xmind-org-el") (:commit . "01055f0b9a53d40c9ce6a7b1c259a3a73b4ff413") (:revdesc . "01055f0b9a53") (:keywords "outlines" "wp" "files") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainers ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com"))]) + (xml+ . [(20170727 2351) ((emacs (24 4)) (dash (2 12 0))) "Utilities for xml and html trees" tar ((:url . "https://github.com/bddean/xml-plus") (:commit . "232fa863c08fc159b21dd58c39ea45dce3334895") (:revdesc . "232fa863c08f") (:keywords "xml" "html") (:authors ("Ben Dean" . "bendean837@gmail.com")) (:maintainers ("Ben Dean" . "bendean837@gmail.com")) (:maintainer "Ben Dean" . "bendean837@gmail.com"))]) + (xml-format . [(20191011 1159) ((emacs (25)) (reformatter (0 4))) "XML reformatter using xmllint" tar ((:url . "https://github.com/wbolster/emacs-xml-format") (:commit . "2861c4e33e18b077112efa072316b031bca4236c") (:revdesc . "2861c4e33e18") (:keywords "languages") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainers ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee"))]) + (xml-quotes . [(20200301 1222) nil "Read quotations from an XML document" tar ((:url . "https://github.com/ndw/xml-quotes") (:commit . "8fc21e43b45f9a50b24642412f05afcc3a316a1f") (:revdesc . "8fc21e43b45f") (:keywords "xml" "quotations") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainers ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com"))]) + (xml-rpc . [(20231009 1432) ((emacs (24 1))) "An elisp implementation of clientside XML-RPC" tar ((:url . "http://github.com/xml-rpc-el/xml-rpc-el") (:commit . "fb6183597be1361be02f46c9a53257ac1dd9715e") (:revdesc . "fb6183597be1") (:keywords "xml" "rpc" "network" "comm") (:maintainers ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org"))]) + (xmlgen . [(20170411 1317) nil "A DSL for generating XML" tar ((:url . "https://github.com/philjackson/xmlgen") (:commit . "dba66681f0c5e621a9e70e8afb34903c9ffe93c4") (:revdesc . "dba66681f0c5") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainers ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))]) + (xmltokf . [(20250126 656) ((emacs (25 1))) "Functional wrappers around xmltok" tar ((:url . "https://github.com/paddymcall/xmltokf.el") (:commit . "b241550af98c7c367803d0fa34735c7aa0eb352c") (:revdesc . "b241550af98c") (:keywords "text" "hypermedia" "languages" "xml"))]) + (xmlunicode . [(20230820 814) nil "Unicode support for XML" tar ((:url . "https://github.com/ndw/xmlunicode") (:commit . "5f1c3e48b90588eb56cec67d3efc869a4e95b03a") (:revdesc . "5f1c3e48b905") (:keywords "utf-8" "unicode" "xml" "characters") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainers ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com"))]) + (xo . [(20160403 646) nil "XO linter integration with compilation mode" tar ((:url . "https://github.com/j-em/xo-emacs") (:commit . "72fcd867cfa332fdb82f732925cf8977e690af78") (:revdesc . "72fcd867cfa3") (:keywords "processes") (:authors ("J.A" . "jer.github@gmail.com")) (:maintainers ("J.A" . "jer.github@gmail.com")) (:maintainer "J.A" . "jer.github@gmail.com"))]) + (xonsh-mode . [(20201020 52) ((emacs (24 3))) "Major mode for editing xonshrc files" tar ((:url . "https://github.com/seanfarley/xonsh-mode") (:commit . "7fa581524533a9b6b770426e4445e571a69e469d") (:revdesc . "7fa581524533") (:keywords "languages") (:authors ("Sean Farley" . "sean@farley.io")) (:maintainers ("Sean Farley" . "sean@farley.io")) (:maintainer "Sean Farley" . "sean@farley.io"))]) + (xquery-mode . [(20170214 1119) ((cl-lib (0 5))) "A simple mode for editing xquery programs" tar ((:url . "https://github.com/xquery-mode/xquery-mode") (:commit . "19e6f9553ce05380843582b879712de00679e4ab") (:revdesc . "19e6f9553ce0"))]) + (xquery-tool . [(20200907 811) nil "A simple interface to saxonb's xquery" tar ((:url . "https://github.com/paddymcall/xquery-tool.el") (:commit . "bd48e0f56b58e36309f7966dcf67db69d65100a4") (:revdesc . "bd48e0f56b58") (:keywords "xml" "xquery" "emacs") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainers ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org"))]) + (xref-js2 . [(20240504 1449) ((emacs (25 1)) (js2-mode (20150909))) "Jump to references/definitions using ag & js2-mode's AST" tar ((:url . "https://github.com/NicolasPetton/xref-js2") (:commit . "e215af9eedac69b40942fff9d5514704f9f4d43e") (:revdesc . "e215af9eedac") (:keywords "javascript" "convenience" "tools") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (xref-rst . [(20251126 344) ((emacs (29 1))) "Lookup reStructuredText symbols" tar ((:url . "https://codeberg.org/ideasman42/emacs-xref-rst") (:commit . "b21455d2b9949c6ae2787d31d2c3f2703ec8688f") (:revdesc . "b21455d2b994") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainers ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com"))]) + (xresources-theme . [(20221208 2015) nil "Use your .Xresources as your emacs theme" tar ((:url . "https://github.com/martenlienen/xresources-theme") (:commit . "76532fc4330e9e31accc580708514b83b15d70a7") (:revdesc . "76532fc4330e") (:keywords "xresources" "theme") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainers ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com"))]) + (xterm-color . [(20251128 1842) ((emacs (24 4))) "ANSI, XTERM 256 and Truecolor support" tar ((:url . "https://github.com/atomontage/xterm-color") (:commit . "ce82e87ea3d277c7e4fc48ce390d540fbd78f6d1") (:revdesc . "ce82e87ea3d2") (:keywords "faces") (:authors ("xristos" . "xristos@sdf.org")) (:maintainers ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org"))]) + (xterm-keybinder . [(20160523 56) ((emacs (24 3)) (cl-lib (0 5)) (let-alist (1 0 1))) "Let you extra keybinds in xterm/urxvt" tar ((:url . "https://github.com/yuutayamada/xterm-keybinder-el") (:commit . "b29c4f700b0fa0c9f627f6725b36462b8fab06d6") (:revdesc . "b29c4f700b0f") (:keywords "convenient") (:authors ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainers ("Yuta Yamada" . "cokesboy\"at\"gmail.com")) (:maintainer "Yuta Yamada" . "cokesboy\"at\"gmail.com"))]) + (xtest . [(20141214 1706) ((cl-lib (0 5))) "Simple Testing with Emacs & ERT" tar ((:url . "https://github.com/promethial/xtest") (:commit . "8099be9c2d856f98489834ddb20a01c6fd8922f1") (:revdesc . "8099be9c2d85") (:keywords "testing" "ert"))]) + (xwidgete . [(20171118 2116) ((emacs (25))) "Enhances usability of current xwidget browser" tar ((:url . "https://github.com/tuhdo/xwidgete") (:commit . "e4e8410fe32176df85b46234717824519443fb04") (:revdesc . "e4e8410fe321") (:keywords "xwidgete" "tools") (:authors ("Do Hoang" . "tuhdo1710@gmail.com")))]) + (xwidgets-reuse . [(20240331 1644) ((emacs (26 1))) "Reuse xwidgets sessions to reduce resource consumption" tar ((:url . "https://github.com/lordpretzel/xwidgets-reuse") (:commit . "5653c8a3ac13615d171599b3ada87512bd1a6fb9") (:revdesc . "5653c8a3ac13") (:keywords "hypermedia") (:authors ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainers ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainer "Boris Glavic" . "lordpretzel@gmail.com"))]) + (xwiki-mode . [(20211112 511) ((emacs (27 1))) "Major mode for xwiki-formatted text" tar ((:url . "https://github.com/ackerleytng/xwiki-mode") (:commit . "8b6f2caead8ec804e8d7d37d87eb3b46aa96b6e8") (:revdesc . "8b6f2caead8e") (:keywords "languages" "convenience" "tools") (:authors ("Ackerley Tng" . "ackerleytng@gmail.com")) (:maintainers ("Ackerley Tng" . "ackerleytng@gmail.com")) (:maintainer "Ackerley Tng" . "ackerleytng@gmail.com"))]) + (xwwp . [(20240701 1040) ((emacs (26 1))) "Enhance xwidget webkit browser" tar ((:url . "https://github.com/canatella/xwwp") (:commit . "0c875e460d1c0637766204dc289ffbd0f2284194") (:revdesc . "0c875e460d1c") (:keywords "convenience"))]) + (xwwp-follow-link-helm . [(20200917 642) ((emacs (26 1)) (xwwp (0 1))) "Link navigation in `xwidget-webkit' sessions using `helm'" tar ((:url . "https://github.com/canatella/xwwp") (:commit . "99670ec37e2083eada9691a342441d2fa4589002") (:revdesc . "99670ec37e20") (:keywords "convenience"))]) + (xwwp-follow-link-ivy . [(20200917 642) ((emacs (26 1)) (xwwp (0 1))) "Link navigation in `xwidget-webkit' sessions using `ivy'" tar ((:url . "https://github.com/canatella/xwwp") (:commit . "1f1646feaf3328568da40200cc218337fbbabc1a") (:revdesc . "1f1646feaf33") (:keywords "convenience"))]) + (yabaki-theme . [(20231004 2023) ((emacs (27 1))) "Yabaki, the cast shadow" tar ((:url . "https://codeberg.org/seahorse/yabaki-theme") (:commit . "209f2be321509dac00631fff1b0f7ea01ba382de") (:revdesc . "209f2be32150") (:authors ("David Goudou" . "david.goudou@gmail.com")) (:maintainers ("David Goudou" . "david.goudou@gmail.com")) (:maintainer "David Goudou" . "david.goudou@gmail.com"))]) + (yabin . [(20140206 351) nil "Yet Another Bignum package (A thin wrapper of calc.el)" tar ((:url . "https://github.com/d5884/yabin") (:commit . "db8c404507560ef9147fcce2b94cd706fbfa03b5") (:revdesc . "db8c40450756") (:keywords "data") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainers ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com"))]) + (yafolding . [(20250601 2133) ((emacs (28 1))) "Folding code blocks based on indentation" tar ((:url . "https://github.com/emacsorphanage/yafolding") (:commit . "77d36147a07d82a558788b180e4f0a983a3ed906") (:revdesc . "77d36147a07d") (:keywords "folding") (:authors ("Zeno Zeng" . "zenoofzeng@gmail.com")) (:maintainers ("Zeno Zeng" . "zenoofzeng@gmail.com")) (:maintainer "Zeno Zeng" . "zenoofzeng@gmail.com"))]) + (yagist . [(20160418 508) ((cl-lib (0 3))) "Yet Another Emacs integration for gist.github.com" tar ((:url . "https://github.com/mhayashi1120/yagist.el") (:commit . "10da4baa272ff0f7052f17debecc340764c7003f") (:revdesc . "10da4baa272f") (:keywords "tools") (:maintainers ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com"))]) + (yahtzee . [(20220221 803) ((emacs (24 3))) "The yahtzee game" tar ((:url . "https://github.com/drdv/yahtzee") (:commit . "9b42ba4612d3043464414c08a3d60f6ad594566c") (:revdesc . "9b42ba4612d3") (:keywords "games") (:authors ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainers ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainer "Dimitar Dimitrov" . "mail.mitko@gmail.com"))]) + (yalinum . [(20130217 1043) nil "Yet another display line numbers" tar ((:url . "https://github.com/tm8st/emacs-yalinum") (:commit . "d3e0cbe3f4f5ca311e3298e684901d6fea3ad973") (:revdesc . "d3e0cbe3f4f5") (:keywords "convenience" "tools") (:authors ("tm8st" . "tm8st@hotmail.co.jp")) (:maintainers ("tm8st" . "tm8st@hotmail.co.jp")) (:maintainer "tm8st" . "tm8st@hotmail.co.jp"))]) + (yaml . [(20251029 2056) ((emacs (25 1))) "YAML parser for Elisp" tar ((:url . "https://github.com/zkry/yaml.el") (:commit . "3fbeaee97dce3c76a18b02a28c58777cbcdadf2f") (:revdesc . "3fbeaee97dce") (:keywords "tools") (:authors ("Zachary Romero" . "zkry@posteo.org")) (:maintainers ("Zachary Romero" . "zkry@posteo.org")) (:maintainer "Zachary Romero" . "zkry@posteo.org"))]) + (yaml-imenu . [(20250818 1432) ((emacs (27 1)) (yaml-mode (0))) "Enhancement of the imenu support in yaml-mode" tar ((:url . "https://github.com/knu/yaml-imenu.el") (:commit . "c2f32557c11cbd402853104da8f644df4ee88434") (:revdesc . "c2f32557c11c") (:keywords "outlining" "convenience" "imenu") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainers ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org"))]) + (yaml-mode . [(20241003 153) ((emacs (24 1))) "Major mode for editing YAML files" tar ((:url . "https://github.com/yoshiki/yaml-mode") (:commit . "d91f878729312a6beed77e6637c60497c5786efa") (:revdesc . "d91f87872931") (:keywords "data" "yaml") (:authors ("Yoshiki Kurihara" . "clouder@gmail.com") ("Marshall T. Vandegrift" . "llasram@gmail.com")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (yaml-pro . [(20250817 452) ((emacs (26 1)) (yaml (0 5 1))) "Parser-aided YAML editing features" tar ((:url . "https://github.com/zkry/yaml-pro") (:commit . "9b9509188e5b88bb933e98ab36ab992519b9554b") (:revdesc . "9b9509188e5b") (:keywords "tools"))]) + (yaml-tomato . [(20151123 753) ((s (1 9))) "Copy or show the yaml path currently under cursor" tar ((:url . "https://github.com/RadekMolenda/yaml-tomato") (:commit . "1272c502fac6ce6b0f8b7f8a9beb353f0b35e13c") (:revdesc . "1272c502fac6") (:keywords "yaml"))]) + (yang-mode . [(20250202 1003) nil "Emacs major mode for editing YANG files" tar ((:url . "https://github.com/mbj4668/yang-mode") (:commit . "b7a4c1734a60f70d80d5752ae058232df0b18336") (:revdesc . "b7a4c1734a60") (:authors ("Martin Bjorklund" . "mbj4668@gmail.com")) (:maintainers ("Martin Bjorklund" . "mbj4668@gmail.com")) (:maintainer "Martin Bjorklund" . "mbj4668@gmail.com"))]) + (yankpad . [(20250609 1121) ((emacs (25 1))) "Paste snippets from an org-mode file" tar ((:url . "http://github.com/Kungsgeten/yankpad") (:commit . "55891dde4c9d83b86f94764e7a1990084e66ee53") (:revdesc . "55891dde4c9d") (:keywords "abbrev" "convenience"))]) + (yapfify . [(20210914 634) nil "(automatically) format python buffers using YAPF" tar ((:url . "https://github.com/JorisE/yapfify") (:commit . "c9347e3b1dec5fc8d34883e206fcdc8500d22368") (:revdesc . "c9347e3b1dec") (:authors ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainers ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainer "Joris Engbers" . "info@jorisengbers.nl"))]) + (yara-mode . [(20220317 935) ((emacs (24))) "Major mode for editing yara rule file" tar ((:url . "not distributed yet") (:commit . "4c959b300ce52665c92e04e524dda5ed051c34f3") (:revdesc . "4c959b300ce5") (:keywords "yara") (:authors (nil . "binjo.cn@gmail.com")) (:maintainers (nil . "binjo.cn@gmail.com")) (:maintainer nil . "binjo.cn@gmail.com"))]) + (yard-mode . [(20230505 1950) nil "Minor mode for Ruby YARD comments" tar ((:url . "https://github.com/pd/yard-mode.el") (:commit . "de1701753a64544c3376b015805f3661136d8038") (:revdesc . "de1701753a64"))]) + (yari . [(20250120 851) nil "Yet Another RI interface for Emacs" tar ((:url . "https://github.com/hron/yari.el") (:commit . "de61285ceb21f56c29f4be12e2e65b2aa2bccf56") (:revdesc . "de61285ceb21") (:keywords "tools") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainers ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com"))]) + (yarn-mode . [(20200208 2332) ((emacs (24 3))) "Major mode for yarn.lock files" tar ((:url . "https://github.com/anachronic/yarn-mode") (:commit . "8239d4dc7d8a52fa1e3fa81bd32c904a359fcfc1") (:revdesc . "8239d4dc7d8a") (:keywords "convenience") (:authors ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainers ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainer "Nicolás Salas V." . "nikosalas@gmail.com"))]) + (yascroll . [(20240925 750) ((emacs (26 1))) "Yet Another Scroll Bar Mode" tar ((:url . "https://github.com/emacsorphanage/yascroll") (:commit . "9e02ac558eccb2a911640762f5df81c89230e81d") (:revdesc . "9e02ac558ecc") (:keywords "convenience") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (yasnippet . [(20250602 1342) ((cl-lib (0 5)) (emacs (24 4))) "Yet another snippet extension for Emacs" tar ((:url . "http://github.com/joaotavora/yasnippet") (:commit . "dd570a6b22364212fff9769cbf4376bdbd7a63c5") (:revdesc . "dd570a6b2236") (:keywords "convenience" "emulation") (:maintainers ("Noam Postavsky" . "npostavs@gmail.com")) (:maintainer "Noam Postavsky" . "npostavs@gmail.com"))]) + (yasnippet-capf . [(20250520 1105) ((emacs (25 1)) (yasnippet (0 14 0))) "Yasnippet Completion At Point Function" tar ((:url . "https://github.com/elken/yasnippet-capf") (:commit . "f53c42a996b86fc95b96bdc2deeb58581f48c666") (:revdesc . "f53c42a996b8") (:authors ("Ellis Kenyő" . "me@elken.dev")) (:maintainers ("Ellis Kenyő" . "me@elken.dev")) (:maintainer "Ellis Kenyő" . "me@elken.dev"))]) + (yasnippet-snippets . [(20251215 1231) ((yasnippet (0 8 0))) "Collection of yasnippet snippets" tar ((:url . "https://github.com/AndreaCrotti/yasnippet-snippets") (:commit . "606ee926df6839243098de6d71332a697518cb86") (:revdesc . "606ee926df68") (:keywords "snippets") (:authors ("Andrea Crotti" . "andrea.crotti.0@gmail.com")) (:maintainers ("Andrea Crotti" . "andrea.crotti.0@gmail.com")) (:maintainer "Andrea Crotti" . "andrea.crotti.0@gmail.com"))]) + (yatemplate . [(20211115 1208) ((yasnippet (0 8 1)) (emacs (24 3))) "File templates with yasnippet" tar ((:url . "https://github.com/mineo/yatemplate") (:commit . "275745ce1482edc08efb0b7807bc86d832bcc734") (:revdesc . "275745ce1482") (:keywords "files" "convenience") (:authors ("Wieland Hoffmann" . "themineo+yatemplate@gmail.com")) (:maintainers ("Wieland Hoffmann" . "themineo+yatemplate@gmail.com")) (:maintainer "Wieland Hoffmann" . "themineo+yatemplate@gmail.com"))]) + (yatex . [(20250224 1034) nil "Yet Another tex-mode for emacs //野鳥//" tar ((:commit . "b00018b5a0b487be347d1abf944f8ae165c5a50b") (:revdesc . "b00018b5a0b4"))]) + (yaxception . [(20240107 504) ((emacs (28)) (dash (2 19 1))) "Provide framework about exception like Java for Elisp" tar ((:url . "https://github.com/aki2o/yaxception") (:commit . "5941de88b19752c14e0dce0d2bf562b1288055a0") (:revdesc . "5941de88b197") (:keywords "exception" "error" "signal") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainers ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com"))]) + (ycm . [(20150822 1836) nil "Emacs client for the YouCompleteMe auto-completion server" tar ((:url . "https://github.com/neuromage/ycm.el") (:commit . "4da8a14abcd0f4fa3235042ade2e12b5068c0601") (:revdesc . "4da8a14abcd0") (:keywords "c" "abbrev") (:authors ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainers ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainer "Ajay Gopinathan" . "ajay@gopinathan.net"))]) + (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 ((:url . "https://github.com/abingham/emacs-ycmd") (:commit . "6f4f7384b82203cccf208e3ec09252eb079439f9") (:revdesc . "6f4f7384b822"))]) + (ydk-mode . [(20170114 223) nil "Language support for Yu-Gi-Oh! deck files" tar ((:url . "https://github.com/jacksonrayhamilton/ydk-mode") (:commit . "f3f125b29408e0b0a34fec27dcb7c02c5dbfd04e") (:revdesc . "f3f125b29408") (:keywords "faces" "games" "languages" "ydk" "yugioh" "yu-gi-oh") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainers ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com"))]) + (year-1984-theme . [(20250902 1120) ((emacs (27 1))) "A retro-futuristic theme" tar ((:url . "https://github.com/mastro35/year-1984-theme") (:commit . "d04b9b267085bb3606426dab2e26ea6489b31de3") (:revdesc . "d04b9b267085") (:keywords "themes" "faces" "colors" "apple" "beige" "light" "pastel" "vintage") (:authors ("Davide Mastromatteo" . "mastro35@gmail.com")) (:maintainers ("Davide Mastromatteo" . "mastro35@gmail.com")) (:maintainer "Davide Mastromatteo" . "mastro35@gmail.com"))]) + (yeetube . [(20251219 2333) ((emacs (27 2)) (compat (29 1 4 2))) "Scrape YouTube, Play with mpv & Download with yt-dlp" tar ((:url . "https://thanosapollo.org/projects/yeetube/") (:commit . "b1093c75ab1729efbfd5bb92864ad8eab734eec6") (:revdesc . "b1093c75ab17") (:keywords "extensions" "youtube" "videos") (:authors ("Thanos Apollo" . "public@thanosapollo.org")) (:maintainers ("Thanos Apollo" . "public@thanosapollo.org")) (:maintainer "Thanos Apollo" . "public@thanosapollo.org"))]) + (yequake . [(20200219 2323) ((emacs (25 2)) (dash (2 14 1))) "Drop-down frames, like Yakuake" tar ((:url . "http://github.com/alphapapa/yequake") (:commit . "d18166e597414350117d0b82a29e509fc53c636d") (:revdesc . "d18166e59741") (:keywords "convenience" "window-system" "frames") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainers ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net"))]) + (yesql-ghosts . [(20150220 1237) ((s (1 9 0)) (dash (2 10 0)) (cider (0 8 0))) "Display ghostly yesql defqueries inline" tar ((:url . "https://github.com/magnars/yesql-ghosts") (:commit . "416198cdc4f316b0912af5e413410937b9b8432b") (:revdesc . "416198cdc4f3") (: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 ((:url . "http://github.com/sje30/yesterbox") (:commit . "7d890ab3f012b1a48a0e8e437f5fcaeba9825fdc") (:revdesc . "7d890ab3f012") (:keywords "mail") (:authors ("Stephen J. Eglen" . "sje30@cam.ac.uk")) (:maintainers ("Stephen J. Eglen" . "sje30@cam.ac.uk")) (:maintainer "Stephen J. Eglen" . "sje30@cam.ac.uk"))]) + (ynab . [(20200607 2008) ((emacs (26 3)) (cl-lib (0 5)) (ts (0 2))) "Major mode for YNAB (you need a budget)" tar ((:url . "https://github.com/janders223/ynab.el") (:commit . "2c6beb4d2c4996017f6b3c62c26db52a61e5c479") (:revdesc . "2c6beb4d2c49") (:keywords "ynab" "budget" "convenience") (:authors ("Jim Anders" . "https://github.com/janders223")) (:maintainers ("Jim Anders" . "jimanders223@gmail.com")) (:maintainer "Jim Anders" . "jimanders223@gmail.com"))]) + (yoficator . [(20190509 1620) nil "Interactively yoficate Russian texts" tar ((:url . "https://gitlab.com/link2xt/yoficator") (:commit . "fa914f9648515bca54b5e558ca57d2b65fa57491") (:revdesc . "fa914f964851") (:authors ("Eugene Minkovskii" . "emin@mccme.ru") ("Alexander Krotov" . "ilabdsf@gmail.com")) (:maintainers ("Eugene Minkovskii" . "emin@mccme.ru") ("Alexander Krotov" . "ilabdsf@gmail.com")) (:maintainer "Eugene Minkovskii" . "emin@mccme.ru"))]) + (yoshi-theme . [(20230801 1741) nil "Theme named after my cat" tar ((:url . "http://projects.ryuslash.org/yoshi-theme/") (:commit . "61e4250ae32744e5434c8faef7d059c7b157f81a") (:revdesc . "61e4250ae327") (:keywords "faces") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainers ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org"))]) + (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 ((:url . "https://github.com/xuchunyang/youdao-dictionary.el") (:commit . "eae8efb1efd3fc82cfe87a357fe8f764116d94ef") (:revdesc . "eae8efb1efd3") (:keywords "convenience" "chinese" "dictionary") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainers ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com"))]) + (youdotcom . [(20240207 1853) ((emacs (25 1))) "You.com search package" tar ((:url . "https://github.com/SamuelVanie/youdotcom.el") (:commit . "0b835f143e88c3321006a3e48ac5190d071b872c") (:revdesc . "0b835f143e88") (:keywords "ai" "tools") (:authors ("Samuel Michael Vanié" . "samuelmichaelvanie@gmail.com")) (:maintainers ("Samuel Michael Vanié" . "samuelmichaelvanie@gmail.com")) (:maintainer "Samuel Michael Vanié" . "samuelmichaelvanie@gmail.com"))]) + (youtube-sub-extractor . [(20221116 653) ((emacs (27 1))) "Extract YouTube video subtitles" tar ((:url . "https://github.com/agzam/youtube-sub-extractor.el") (:commit . "d69f732299fdf256504e15767c1d7e5de771220e") (:revdesc . "d69f732299fd") (:keywords "convenience" "multimedia") (:authors ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainers ("Ag Ibragimov" . "agzam.ibragimov@gmail.com")) (:maintainer "Ag Ibragimov" . "agzam.ibragimov@gmail.com"))]) + (ytdious . [(20210228 2111) ((emacs (25 3))) "Query / Preview YouTube via Invidious" tar ((:url . "https://github.com/spiderbit/ytdious") (:commit . "941460b51e43ef6764e15e2b9c4af54c3e56115f") (:revdesc . "941460b51e43") (:keywords "youtube" "matching" "multimedia"))]) + (ytdl . [(20241025 1913) ((emacs (26 1)) (async (1 9 4)) (transient (0 2 0)) (dash (2 17 0))) "Emacs Interface for youtube-dl" tar ((:url . "https://gitlab.com/tuedachu/ytdl") (:commit . "309ad5ce95368ad2e35d1c1701a1f3c0043415a3") (:revdesc . "309ad5ce9536") (:keywords "comm" "multimedia") (:authors ("Arnaud Hoffmann" . "tuedachu@gmail.com")) (:maintainers ("Arnaud Hoffmann" . "tuedachu@gmail.com")) (:maintainer "Arnaud Hoffmann" . "tuedachu@gmail.com"))]) + (yuck-mode . [(20230113 2304) ((emacs (25 1))) "Major mode for the yuck configuration language" tar ((:url . "https://github.com/mmcjimsey26/yuck-mode") (:commit . "e084416fa3e7f91bb429edbf7ff1585aa5674367") (:revdesc . "e084416fa3e7") (:keywords "languages" "yuck" "eww" "widgets"))]) + (yul-mode . [(20220927 338) nil "Major mode for editing Ethereum Yul intermediate code" tar ((:url . "https://github.com/taquangtrung/emacs-yul-mode") (:commit . "56cba05549873fcf1b66e304969011dc1a1ad228") (:revdesc . "56cba0554987") (:keywords "languages"))]) + (z3-mode . [(20211116 138) ((flycheck (0 23)) (emacs (24))) "A z3/SMTLIBv2 interactive development environment" tar ((:url . "https://github.com/zv/z3-mode") (:commit . "0356cbe1e1e2b780ba0ddb4aaa055fa246a67931") (:revdesc . "0356cbe1e1e2") (:keywords "z3" "yices" "mathsat" "smt" "beaver") (:authors ("Zephyr Pellerin" . "zephyr.pellerin@gmail.com")) (:maintainers ("Zephyr Pellerin" . "zephyr.pellerin@gmail.com")) (:maintainer "Zephyr Pellerin" . "zephyr.pellerin@gmail.com"))]) + (zathura . [(20250728 1208) ((emacs (24 3))) "Summary" tar ((:url . "https://codeberg.org/treflip/zathura.el") (:commit . "947b8332f25810105d35e350f604cdad4e32ee6f") (:revdesc . "947b8332f258") (:keywords "convenience"))]) + (zeal-at-point . [(20180131 2354) nil "Search the word at point with Zeal" tar ((:url . "https://github.com/jinzhu/zeal-at-point") (:commit . "0fc3263f44e95acd3e9d91057677621ce4d297ee") (:revdesc . "0fc3263f44e9") (:authors ("Jinzhu" . "wosmvp@gmail.com")) (:maintainers ("Jinzhu" . "wosmvp@gmail.com")) (:maintainer "Jinzhu" . "wosmvp@gmail.com"))]) + (zen-and-art-theme . [(20120622 1437) nil "Zen and art color theme for GNU Emacs 24" tar ((:url . "https://github.com/developernotes/zen-and-art-theme") (:commit . "a7226cbce0bca2501d69a620cb2aeabfc396c232") (:revdesc . "a7226cbce0bc"))]) + (zen-mode . [(20200609 822) ((emacs (24 3))) "A major mode for the Zen programming language" tar ((:url . "https://github.com/zenlang/zen-mode") (:commit . "c1b1806358f3cce6c04b30699987d82dc7d42559") (:revdesc . "c1b1806358f3") (:keywords "zen" "languages") (:authors ("Andrea Orru" . "andreaorru1991@gmail.com") ("Andrew Kelley" . "superjoe30@gmail.com") ("kristopher tate" . "kt@connectfree.co.jp") ("Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp")) (:maintainers ("Andrea Orru" . "andreaorru1991@gmail.com") ("Andrew Kelley" . "superjoe30@gmail.com") ("kristopher tate" . "kt@connectfree.co.jp") ("Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp")) (:maintainer "Andrea Orru" . "andreaorru1991@gmail.com"))]) + (zenburn-theme . [(20251028 1226) nil "A low contrast color theme for Emacs" tar ((:url . "http://github.com/bbatsov/zenburn-emacs") (:commit . "d9557cf5ab9c03dc70693e3892f5ffdc5d345d22") (:revdesc . "d9557cf5ab9c") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainers ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com"))]) + (zencoding-mode . [(20140213 822) nil "Unfold CSS-selector-like expressions to markup" tar ((:url . "https://github.com/rooney/zencoding") (:commit . "58e42af182c98cb9941d27cd042d227fbf4e146c") (:revdesc . "58e42af182c9") (:keywords "convenience") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainers ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com"))]) + (zenity-color-picker . [(20160302 1154) ((emacs (24 4))) "Insert and adjust colors using Zenity" tar ((:url . "https://bitbucket.org/Soft/zenity-color-picker.el") (:commit . "bdece51052ef7037e0a3481fc1f487939f57777e") (:revdesc . "bdece51052ef") (:keywords "colors") (:authors ("Samuel Laurén" . "samuel.lauren@iki.fi")) (:maintainers ("Samuel Laurén" . "samuel.lauren@iki.fi")) (:maintainer "Samuel Laurén" . "samuel.lauren@iki.fi"))]) + (zeno-theme . [(20211205 2148) ((emacs (24))) "A dark theme using different shades of blue" tar ((:url . "https://github.com/jbharat/zeno-theme") (:commit . "70fa7b7442f24ea25eab538b5a22da690745fef5") (:revdesc . "70fa7b7442f2") (:keywords "faces" "theme" "dark" "blue") (:authors ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainers ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainer "Bharat Joshi" . "jbharat@outlook.com"))]) + (zenscript-mode . [(20210102 1350) ((emacs (25 1))) "Major mode for ZenScript" tar ((:url . "https://github.com/eutropius225/zenscript-mode") (:commit . "c33b4525502459fe60dd76b383e19919d450aeb8") (:revdesc . "c33b45255024"))]) + (zephir-mode . [(20200417 830) ((cl-lib (0 5)) (pkg-info (0 4)) (emacs (25 1))) "Major mode for editing Zephir code" tar ((:url . "https://github.com/zephir-lang/zephir-mode") (:commit . "4e9618b77dff67c1c7b6fff78605a62311db88b8") (:revdesc . "4e9618b77dff") (:keywords "languages") (:authors ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainers ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch"))]) + (zero-input . [(20240527 728) ((emacs (24 4)) (s (1 2 0))) "Zero Chinese input method framework" tar ((:url . "https://gitlab.emacsos.com/sylecn/zero-el") (:commit . "e87bbf24c1475a784ad9d1ba8447e038824d796b") (:revdesc . "e87bbf24c147"))]) + (zero-input-panel-posframe . [(20240526 1604) ((emacs (24 4)) (zero-input (2 9 0)) (posframe (1 4 3))) "Posframe based zero-input panel implementation" tar ((:url . "https://gitlab.emacsos.com/sylecn/zero-el") (:commit . "714102090ba87b75a06b87792df696f6f48c2ea8") (:revdesc . "714102090ba8"))]) + (zerodark-theme . [(20211115 841) ((all-the-icons (2 0 0))) "A dark, medium contrast theme for Emacs" tar ((:url . "https://github.com/NicolasPetton/zerodark-theme") (:commit . "b463528704f6eb00684c0ee003fbd8e42901cde0") (:revdesc . "b463528704f6") (:keywords "themes") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainers ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (zetteldeft . [(20221006 731) ((emacs (25 1)) (deft (0 8)) (ace-window (0 7 0))) "Turn deft into a zettelkasten system" tar ((:url . "https://efls.github.io/zetteldeft/") (:commit . "63be6478751376f04d36c6ea52fe65acd69f0927") (:revdesc . "63be64787513") (:keywords "deft" "zettelkasten" "zetteldeft" "wp" "files") (:authors ("EFLS" . "EliasStorms")) (:maintainers ("EFLS" . "EliasStorms")) (:maintainer "EFLS" . "EliasStorms"))]) + (zetteldesk . [(20250405 1601) ((emacs (27 1)) (org-roam (2 0))) "A revision and outlining tool for org-roam" tar ((:url . "https://github.com/Vidianos-Giannitsis/zetteldesk.el") (:commit . "0196835c5d6df65d46a4f642b716e6901ad0f4c1") (:revdesc . "0196835c5d6d") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainers ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com"))]) + (zetteldesk-info . [(20250405 1601) ((zetteldesk (0 4)) (emacs (27 1))) "A zetteldesk extension for interacting with the info program" tar ((:url . "https://github.com/Vidianos-Giannitsis/zetteldesk-info.el") (:commit . "0196835c5d6df65d46a4f642b716e6901ad0f4c1") (:revdesc . "0196835c5d6d") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainers ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com"))]) + (zetteldesk-kb . [(20250405 1601) ((zetteldesk (1 0 1)) (hydra (0 15)) (major-mode-hydra (0 2)) (emacs (24 1))) "Keybindings for zetteldesk.el" tar ((:url . "https://github.com/Vidianos-Giannitsis/zetteldesk-kb.el") (:commit . "0196835c5d6df65d46a4f642b716e6901ad0f4c1") (:revdesc . "0196835c5d6d") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainers ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com"))]) + (zetteldesk-ref . [(20250405 1601) ((zetteldesk (1 0)) (bibtex-completion (1 0)) (emacs (26 1))) "A zetteldesk extension for interfacing with literature nodes" tar ((:url . "https://github.com/Vidianos-Giannitsis/zetteldesk-ref.el") (:commit . "0196835c5d6df65d46a4f642b716e6901ad0f4c1") (:revdesc . "0196835c5d6d") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainers ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com"))]) + (zetteldesk-remark . [(20250405 1601) ((zetteldesk (1 0)) (org-remark (1 0)) (emacs (27 2))) "Org-Remark integration for zetteldesk.el" tar ((:url . "https://github.com/Vidianos-Giannitsis/zetteldesk-remark.el") (:commit . "0196835c5d6df65d46a4f642b716e6901ad0f4c1") (:revdesc . "0196835c5d6d") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainers ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com"))]) + (zettelkasten . [(20240517 1319) ((emacs (25 1)) (s (1 10 0))) "Helper functions to organise notes in a Zettelkasten style" tar ((:url . "https://github.com/ymherklotz/emacs-zettelkasten") (:commit . "6a33faf7b4231b03d056099a1aff40bbeee6e720") (:revdesc . "6a33faf7b423") (:keywords "files" "hypermedia" "notes") (:authors ("Yann Herklotz" . "yann@ymhg.org")) (:maintainers ("Yann Herklotz" . "yann@ymhg.org")) (:maintainer "Yann Herklotz" . "yann@ymhg.org"))]) + (zetz-mode . [(20200823 536) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the ZetZ programming language" tar ((:url . "https://github.com/damon-kwok/zetz-mode") (:commit . "04da33f4ffa9db5b3556f423276f4fd1db13ec67") (:revdesc . "04da33f4ffa9") (:keywords "languages" "programming"))]) + (zig-mode . [(20251128 256) ((emacs (26 1)) (reformatter (0 6))) "A major mode for the Zig programming language" tar ((:url . "https://codeberg.org/ziglang/zig-mode") (:commit . "20e395f940afe1e19e965050b0284ec418d6a9d5") (:revdesc . "20e395f940af") (:keywords "zig" "languages") (:authors ("Andrea Orru" . "andreaorru1991@gmail.com") ("Andrew Kelley" . "superjoe30@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (zig-ts-mode . [(20251221 1517) ((emacs (29 1))) "Tree Sitter support for Zig" tar ((:url . "https://codeberg.org/meow_king/zig-ts-mode") (:commit . "e0fcb1b115ad334513caa6975f15eb54bca239db") (:revdesc . "e0fcb1b115ad") (:keywords "zig" "languages" "tree-sitter") (:authors ("meowking" . "mr.meowking@tutamail.com")) (:maintainers ("meowking" . "mr.meowking@tutamail.com")) (:maintainer "meowking" . "mr.meowking@tutamail.com"))]) + (ziggy-mode . [(20251017 527) ((emacs (29 1)) (reformatter (0 6))) "Major mode for Ziggy, a data serialization language" tar ((:url . "https://github.com/dcolazin/ziggy-mode") (:commit . "5b42008a022ae1d9221add6f57ce65715d7f9947") (:revdesc . "5b42008a022a") (:authors ("2024 Robbie Lyman" . "rb.lymn@gmail.com")) (:maintainers ("Davide Colazingari" . "dcolazin@gmail.com")) (:maintainer "Davide Colazingari" . "dcolazin@gmail.com"))]) + (zim-wiki-mode . [(20250824 157) ((emacs (25 1)) (dokuwiki-mode (0 1 1)) (helm-projectile (0 14 0)) (link-hint (0 1)) (pretty-hydra (0 2 2))) "Zim Desktop Wiki edit mode" tar ((:url . "https://github.com/WillForan/zim-wiki-mode") (:commit . "d376b456b275975946e03a393ce16b122962195d") (:revdesc . "d376b456b275") (:keywords "outlines") (: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"))]) + (zimports . [(20211011 2059) ((emacs (26 1)) (projectile (2 1 0))) "Reformat python imports with zimports" tar ((:url . "https://github.com/schmir/zimports.el") (:commit . "76cf76bdc871cb0454a6fc555aeb1aa94f1b6e57") (:revdesc . "76cf76bdc871"))]) + (zine-mode . [(20251022 2145) ((emacs (29 1)) (reformatter (0 6)) (markdown-mode (2 8 -3)) (ziggy-mode (0 0 2))) "Major mode for zine, the static site generator" tar ((:url . "https://github.com/dcolazin/zine-mode") (:commit . "e54a3bde1f8ea5ed00b91c7bf038329a9b0da174") (:revdesc . "e54a3bde1f8e") (:authors ("2024 Robbie Lyman" . "rb.lymn@gmail.com")) (:maintainers ("Davide Colazingari" . "dcolazin@gmail.com")) (:maintainer "Davide Colazingari" . "dcolazin@gmail.com"))]) + (zk . [(20250908 1240) ((emacs (28 1))) "Functions for working with Zettelkasten-style linked notes" tar ((:url . "https://github.com/localauthor/zk") (:commit . "302e494324066d63f317b54c4db75d173914c521") (:revdesc . "302e49432406") (:authors ("Grant Rosson" . "https://github.com/localauthor")) (:maintainers ("Grant Rosson" . "https://github.com/localauthor")) (:maintainer "Grant Rosson" . "https://github.com/localauthor"))]) + (zk-consult . [(20251215 1140) ((emacs (27 1)) (zk (0 4)) (consult (0 14))) "Consult integration for zk" tar ((:url . "https://github.com/localauthor/zk") (:commit . "5b7fcbdd7bcfd0903e3844d0b4b28826bfb7ef5d") (:revdesc . "5b7fcbdd7bcf") (:authors ("Grant Rosson" . "https://github.com/localauthor")) (:maintainers ("Grant Rosson" . "https://github.com/localauthor")) (:maintainer "Grant Rosson" . "https://github.com/localauthor"))]) + (zk-desktop . [(20250905 1921) ((emacs (27 1)) (zk (0 6)) (zk-index (0 9))) "Desktop environment for zk" tar ((:url . "https://github.com/localauthor/zk") (:commit . "a634b6ec7af4f16a1ceed9271d2a0dbd9bca8501") (:revdesc . "a634b6ec7af4") (:authors ("Grant Rosson" . "https://github.com/localauthor")) (:maintainers ("Grant Rosson" . "https://github.com/localauthor")) (:maintainer "Grant Rosson" . "https://github.com/localauthor"))]) + (zk-index . [(20250908 1240) ((emacs (28 1)) (zk (0 9))) "Index for zk" tar ((:url . "https://github.com/localauthor/zk") (:commit . "302e494324066d63f317b54c4db75d173914c521") (:revdesc . "302e49432406") (:authors ("Grant Rosson" . "https://github.com/localauthor")) (:maintainers ("Grant Rosson" . "https://github.com/localauthor")) (:maintainer "Grant Rosson" . "https://github.com/localauthor"))]) + (zk-luhmann . [(20250406 844) ((emacs (25 1)) (zk (0 7)) (zk-index (0 10))) "Support for Luhmann-style IDs in zk" tar ((:url . "https://github.com/localauthor/zk-luhmann") (:commit . "1fe0d9053b603037898530ae8aa6361c4e409e46") (:revdesc . "1fe0d9053b60") (:authors ("Grant Rosson" . "https://github.com/localauthor")) (:maintainers ("Grant Rosson" . "https://github.com/localauthor")) (:maintainer "Grant Rosson" . "https://github.com/localauthor"))]) + (zlc . [(20151011 157) nil "Provides zsh like completion system to Emacs" tar ((:url . "https://github.com/mooz/emacs-zlc") (:commit . "4dd2ba267ecdeac845a7cbb3147294ee7daa25f4") (:revdesc . "4dd2ba267ecd") (:keywords "matching" "convenience") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainers ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com"))]) + (zmq . [(20241006 1857) ((cl-lib (0 5)) (emacs (26))) "ZMQ bindings in Emacs-Lisp" tar ((:url . "https://github.com/nnicandro/emacs-zmq") (:commit . "fe856c43286674aa6770d95a81d915363f5df399") (:revdesc . "fe856c432866") (:keywords "comm") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainers ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com"))]) + (znc . [(20210803 159) ((cl-lib (0 2))) "ZNC + ERC" tar ((:url . "https://github.com/sshirokov/ZNC.el") (:commit . "2605f78e37a8a759067dc14fa25a82824ba1bacc") (:revdesc . "2605f78e37a8"))]) + (zombie . [(20141222 1616) nil "Major mode for editing ZOMBIE programs" tar ((:url . "http://hins11.yu-yake.com/") (:commit . "ff8cd1b4cdbb4b0b9b8fd1ec8f6fb93eba249345") (:revdesc . "ff8cd1b4cdbb"))]) + (zombie-trellys-mode . [(20150304 1702) ((emacs (24)) (cl-lib (0 5)) (haskell-mode (1 5))) "A minor mode for interaction with Zombie Trellys" tar ((:url . "https://github.com/david-christiansen/zombie-trellys-mode") (:commit . "9e99d444a387dd1634cab62ef802683f5bf5d907") (:revdesc . "9e99d444a387") (:keywords "languages") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainers ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk"))]) + (zone-nyan . [(20210508 1642) ((emacs (24 3)) (esxml (0 3 1))) "Zone out with nyan cat" tar ((:url . "https://depp.brause.cc/zone-nyan") (:commit . "38b6e9f1f5871e9166b00a1db44680caa56773be") (:revdesc . "38b6e9f1f587") (:keywords "games") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (zone-rainbow . [(20160120 1334) ((emacs (24 3))) "Zone out with rainbow" tar ((:url . "https://github.com/kawabata/zone-rainbow") (:commit . "2ba4f1a87c69c4712124ebf12c1f3ea171e1af36") (:revdesc . "2ba4f1a87c69") (:keywords "games") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (zone-select . [(20160118 1419) ((emacs (24 3)) (dash (2 8))) "Select zone programs" tar ((:url . "https://github.com/kawabata/zone-select") (:commit . "bf30da12f1625fe6563448fccf3c506acad10af7") (:revdesc . "bf30da12f162") (:keywords "games") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (zone-sl . [(20160201 1210) ((emacs (24 3))) "Zone out with steam locomotives" tar ((:url . "https://github.com/kawabata/zone-sl") (:commit . "737b21b4b35c28a487ad8a31598e745bc183b209") (:revdesc . "737b21b4b35c") (:keywords "games") (:authors ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainers ("Taichi" . "kawabata.taichi_at_gmail.com")) (:maintainer "Taichi" . "kawabata.taichi_at_gmail.com"))]) + (zone-tmux-clock . [(20230507 2043) ((emacs (24 3))) "Zone out with a tmux style clock" tar ((:url . "https://depp.brause.cc/zone-tmux-clock") (:commit . "f8158aad57730e1611a3994cf921037770753d72") (:revdesc . "f8158aad5773") (:keywords "games") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainers ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de"))]) + (zoom . [(20250214 1251) ((emacs (24 4))) "Fixed and automatic balanced window layout" tar ((:url . "https://github.com/cyrus-and/zoom") (:commit . "36f9db90941b10d34bac976aee35dfe25242cd03") (:revdesc . "36f9db90941b") (:keywords "frames") (:authors ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainers ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainer "Andrea Cardaci" . "cyrus.and@gmail.com"))]) + (zoom-window . [(20240925 754) ((emacs (24 3))) "Zoom window like tmux" tar ((:url . "https://github.com/syohex/emacs-zoom-window") (:commit . "fca88b971aea55e3d3944050213c3a1243178c8b") (:revdesc . "fca88b971aea") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainers ("Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Jen-Chieh" . "jcs090218@gmail.com"))]) + (zop-to-char . [(20160212 1554) ((cl-lib (0 5))) "A replacement of zap-to-char" tar ((:url . "https://github.com/thierryvolpiatto/zop-to-char") (:commit . "816ea90337db0545a2f0a5079f4d7b3a2822af7d") (:revdesc . "816ea90337db") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainers ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))]) + (zotelo . [(20160602 949) ((cl-lib (0 5))) "Manage Zotero collections from emacs" tar ((:url . "https://github.com/vitoshka/zotelo") (:commit . "d9dc089b9adfcc70a63f2a84269a12eb7cb4c748") (:revdesc . "d9dc089b9adf") (:keywords "zotero" "emacs" "reftex" "bibtex" "mozrepl" "bibliography manager"))]) + (zotero . [(20240112 2111) ((emacs (27 1)) (ht (2 2)) (oauth (1 11)) (s (1 12 0))) "Library for the Zotero API" tar ((:url . "https://gitlab.com/fvdbeek/emacs-zotero") (:commit . "eef5080e6a2ed0cae12c3d21580864f4b394cd5f") (:revdesc . "eef5080e6a2e") (:keywords "zotero" "hypermedia") (:authors ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainers ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainer "Folkert van der Beek" . "folkertvanderbeek@gmail.com"))]) + (zotra . [(20231014 2139) ((emacs (27 1))) "Import bibliographic data from (almost) everywhere" tar ((:url . "https://github.com/mpedramfar/zotra") (:commit . "fe9093b226a1678fc6c2fadd31a09d5a22ecdcf1") (:revdesc . "fe9093b226a1") (:authors ("Mohammad Pedramfar" . "https://github.com/mpedramfar")) (:maintainers ("Mohammad Pedramfar" . "https://github.com/mpedramfar")) (:maintainer "Mohammad Pedramfar" . "https://github.com/mpedramfar"))]) + (zotxt . [(20250820 438) ((emacs (24 3)) (deferred (0 5 1)) (request (0 3 2))) "Interface emacs with Zotero via the zotxt extension" tar ((:url . "https://gitlab.com/egh/zotxt-emacs") (:commit . "b433f46b518574d5fe25f38c9c3afed542122d8b") (:revdesc . "b433f46b5185") (:keywords "bib") (:authors ("Erik Hetzner" . "egh@e6h.org")) (:maintainers ("Erik Hetzner" . "egh@e6h.org")) (:maintainer "Erik Hetzner" . "egh@e6h.org"))]) + (zoutline . [(20220102 835) nil "Simple outline library" tar ((:url . "https://github.com/abo-abo/zoutline") (:commit . "32857c6c4b9b0bcbed14d825a10b91a98d5fed0a") (:revdesc . "32857c6c4b9b") (:keywords "outline") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainers ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com"))]) + (zoxide . [(20241003 1103) ((emacs (25 1))) "Find file by zoxide" tar ((:url . "https://gitlab.com/Vonfry/zoxide.el") (:commit . "6de851de46db51253350edd67f329dbc0587b97c") (:revdesc . "6de851de46db") (:keywords "converience" "matching") (:authors ("Ruoyu Feng" . "emacs@vonfry.name")) (:maintainers ("Ruoyu Feng" . "emacs@vonfry.name")) (:maintainer "Ruoyu Feng" . "emacs@vonfry.name"))]) + (zpl-mode . [(20180906 1059) ((emacs (24 3))) "ZIMPL major mode" tar ((:url . "https://github.com/ax487/zpl-mode.git") (:commit . "35e7e23c6baf31b5e65dd7405c8ab9b13c70637e") (:revdesc . "35e7e23c6baf"))]) + (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 ((:url . "https://hg.sr.ht/~zck/zpresent") (:commit . "341d1a4a91a8acff5be6b81f95695e17c79c5309") (:revdesc . "341d1a4a91a8") (:keywords "comm"))]) + (zprint-format . [(20210602 146) ((emacs (24)) (reformatter (0 3))) "Reformat Clojure code using zprint" tar ((:url . "http://www.github.com/dpassen/zprint-format") (:commit . "fa575c17a40033189f2f23f1a5b27b88c399d200") (:revdesc . "fa575c17a400") (:keywords "clojure" "zprint" "tools" "languages") (:authors ("Derek Passen" . "dpassen1@gmail.com")) (:maintainers ("Derek Passen" . "dpassen1@gmail.com")) (:maintainer "Derek Passen" . "dpassen1@gmail.com"))]) + (zprint-mode . [(20240619 1639) ((emacs (24 3))) "Reformat Clojure(Script) code using zprint" tar ((:url . "https://github.com/pesterhazy/zprint-mode.el") (:commit . "ac3b25e250c83aedc49d1eab508142e3060e3833") (:revdesc . "ac3b25e250c8") (:keywords "tools") (:authors ("Paulus Esterhazy" . "(pesterhazy@gmail.com)")) (:maintainers ("Paulus Esterhazy" . "(pesterhazy@gmail.com)")) (:maintainer "Paulus Esterhazy" . "(pesterhazy@gmail.com)"))]) + (ztree . [(20250209 1933) ((cl-lib (0))) "Text mode directory tree" tar ((:url . "https://github.com/fourier/ztree") (:commit . "9905f1be006fe02417fc6598be4990746053bbec") (:revdesc . "9905f1be006f") (:keywords "files" "tools") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainers ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com"))]) + (zygospore . [(20140703 852) nil "Reversible C-x 1 (delete-other-windows)" tar ((:url . "https://github.com/louiskottmann/zygospore.el") (:commit . "1af5ee663f5a7aa08d96a77cacff834dcdf55ea8") (:revdesc . "1af5ee663f5a") (:authors ("Louis Kottmann" . "louis.kottmann@gmail.com")) (:maintainers ("Louis Kottmann" . "louis.kottmann@gmail.com")) (:maintainer "Louis Kottmann" . "louis.kottmann@gmail.com"))]) + (zzz-to-char . [(20230704 1306) ((emacs (24 4)) (avy (0 3 0))) "Fancy version of `zap-to-char' command" tar ((:url . "https://github.com/mrkkrp/zzz-to-char") (:commit . "5945432d74feb2d1cd3520b185b3ab5dca35e0eb") (:revdesc . "5945432d74fe") (:keywords "convenience") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainers ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com"))])) diff --git a/.packages/cond-let-20251101.1942/cond-let-autoloads.el b/.packages/cond-let-20251101.1942/cond-let-autoloads.el new file mode 100644 index 0000000..889b2af --- /dev/null +++ b/.packages/cond-let-20251101.1942/cond-let-autoloads.el @@ -0,0 +1,28 @@ +;;; cond-let-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 cond-let.el + +(register-definition-prefixes "cond-let" '("cond-let")) + +;;; End of scraped data + +(provide 'cond-let-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; cond-let-autoloads.el ends here diff --git a/.packages/cond-let-20251101.1942/cond-let-pkg.el b/.packages/cond-let-20251101.1942/cond-let-pkg.el new file mode 100644 index 0000000..82aeaf1 --- /dev/null +++ b/.packages/cond-let-20251101.1942/cond-let-pkg.el @@ -0,0 +1,8 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "cond-let" "20251101.1942" + "Additional and improved binding conditionals." + '((emacs "28.1")) + :url "https://github.com/tarsius/cond-let" + :commit "288b7d36563223ebaf64cb220a3b270bdffb63f1" + :revdesc "288b7d365632" + :keywords '("extensions")) diff --git a/.packages/cond-let-20251101.1942/cond-let.el b/.packages/cond-let-20251101.1942/cond-let.el new file mode 100644 index 0000000..4c0b417 --- /dev/null +++ b/.packages/cond-let-20251101.1942/cond-let.el @@ -0,0 +1,534 @@ +;;; cond-let.el --- Additional and improved binding conditionals -*- lexical-binding:t -*- + +;; Copyright (C) 2025 Jonas Bernoulli + +;; May contain traces of Emacs, which is +;; Copyright (C) 1985-2025 Free Software Foundation, Inc. + +;; Authors: Jonas Bernoulli +;; Homepage: https://github.com/tarsius/cond-let +;; Keywords: extensions + +;; Package-Version: 20251101.1942 +;; Package-Revision: 288b7d365632 +;; Package-Requires: ((emacs "28.1")) + +;; SPDX-License-Identifier: GPL-3.0-or-later + +;; This file 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 file 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 file. If not, see . + +;;; Commentary: + +;; This is an ALPHA release! +;; Breaking changes are possible! + +;; Emacs provides the binding conditionals `if-let', `if-let*', +;; `when-let', `when-let*', `and-let*' and `while-let'. + +;; This package implements the missing `and-let' and `while-let*', +;; and the original `cond-let', `cond-let*', `and$' and `and>'. + +;; This package additionally provides more consistent and improved +;; implementations of the binding conditionals already provided by +;; Emacs. Merely loading this library does not shadow the built-in +;; implementations; this can optionally be done in the context of +;; an individual library, as described below. + +;; `cond-let' and `cond-let*' are provided exactly under these names. +;; The names of all other macros implemented by this package begin +;; with `cond-let--', the package's prefix for private symbol. + +;; Users of this package are not expected to use these unwieldy +;; names. Instead one should use Emacs' shorthand feature to use +;; all or some of these macros by their conceptual names. E.g., if +;; you want to use all of the available macros, add this at the end +;; of a library. + +;; Local Variables: +;; read-symbol-shorthands: ( +;; ("and$" . "cond-let--and$") +;; ("and>" . "cond-let--and>") +;; ("and-let" . "cond-let--and-let") +;; ("if-let" . "cond-let--if-let") +;; ("when-let" . "cond-let--when-let") +;; ("while-let" . "cond-let--while-let")) +;; End: + +;; You can think of these file-local settings as import statements of +;; sorts. If you do this, then this package's implementations shadow +;; the built-in implementations. Doing so does not affect any other +;; libraries, which continue to use the built-in implementations. + +;; Due to limitations of the shorthand implementation this has to be +;; done for each individual library. "dir-locals.el" cannot be used. + +;; If you use `and$' and `and>', you might want to add this to your +;; configuration: + +;; (with-eval-after-load 'cond-let +;; (font-lock-add-keywords 'emacs-lisp-mode +;; cond-let-font-lock-keywords t)) + +;; For information about the individual macros, please refer to their +;; docstrings. + +;; See also https://github.com/tarsius/cond-let/wiki. + +;;; Code: +;;; Cond + +(defun cond-let--prepare-clauses (tag sequential clauses) + "Used by macros `cond-let*' and `cond-let'." + (let (body) + (dolist (clause (nreverse clauses)) + (cond + ((vectorp clause) + (setq body + `((,(if (and sequential (length> clause 1)) 'let* 'let) + ,(mapcar (lambda (vec) (append vec nil)) clause) + ,@body)))) + ((let (varlist) + (while (vectorp (car clause)) + (push (append (pop clause) nil) varlist)) + (push (cond + (varlist + `(,(pcase (list (and body t) + (and sequential (length> varlist 1))) + ('(t t ) 'cond-let--when-let*) + (`(t ,_) 'cond-let--when-let) + ('(nil t ) 'cond-let--and-let*) + (`(nil ,_) 'cond-let--and-let)) + ,(nreverse varlist) + ,(if body + `(throw ',tag ,(macroexp-progn clause)) + (macroexp-progn clause)))) + ((length= clause 1) + (if body + (let ((a (gensym "anon"))) + `(let ((,a ,(car clause))) + (when ,a (throw ',tag ,a)))) + (car clause))) + ((and (eq (car clause) t) (not body)) + (macroexp-progn (cdr clause))) + (t + `(when ,(pop clause) + (throw ',tag ,(macroexp-progn clause))))) + body))))) + body)) + +(defmacro cond-let* (&rest clauses) + "Try each clause until one succeeds. + +Each clause has one of these forms: +- a plain clause (CONDITION BODY...) +- a binding clause ([SYMBOL VALUEFORM]... BODY...) +- a binding vector [[SYMBOL VALUEFORM]...] + +A (CONDITION BODY...) clause works as for `cond'. Evaluate CONDITION, +and if it yields non-nil, the clause succeeds. Then evaluate BODY forms +sequentially and return the value of the last; or if there are no BODY +forms, return the value of CONDITION. If CONDITION yields nil, do not +evaluate the BODY forms and instead proceed to the next clause. + +A ([SYMBOL VALUEFORM]... BODY...) clause begins with one or more binding +vectors, followed by one or more BODY forms. Bind SYMBOL to the value +of VALUEFORM. Each VALUEFORM can refer to symbols already bound by this +VARLIST (as for `let*'). + +If all VALUEFORMs yield non-nil, evaluate BODY forms sequentially, with +VARLIST's bindings in effect, and return the value of the last form. + +If any VALUEFORM yields nil, evaluate neither the remaining VALUEFORMs +nor the BODY forms, and proceed to the next clause. + +A [[SYMBOL VALUEFORM]...] form creates bindings, which extend to all +remaining clauses and binding vectors. Unlike for the previous form, +always bind all SYMBOLs, even if a VALUEFORM yields nil. Always proceed +to the next clause." + (declare (indent 0) + (debug (&rest [&or + (vector &rest (vector symbolp form)) + ([&rest (vector symbolp form)] body) + (form body)]))) + (let ((tag (gensym ":cond-let*"))) + `(catch ',tag + ,@(cond-let--prepare-clauses tag t clauses)))) + +(defmacro cond-let (&rest clauses) + "Try each clause until one succeeds. + +Each clause has one of these forms: +- a plain clause (CONDITION BODY...) +- a binding clause ([SYMBOL VALUEFORM]... BODY...) +- a binding vector [[SYMBOL VALUEFORM]...] + +A (CONDITION BODY...) clause works as for `cond'. Evaluate CONDITION, +and if it yields non-nil, the clause succeeds. Then evaluate BODY forms +sequentially and return the value of the last; or if there are no BODY +forms, return the value of CONDITION. If CONDITION yields nil, do not +evaluate the BODY forms and instead proceed to the next clause. + +A ([SYMBOL VALUEFORM]... BODY...) clause begins with one or more binding +vectors, followed by one or more BODY forms. Bind SYMBOL to the value +of VALUEFORM. Evaluate all VALUEFORMs before binding their respective +SYMBOLs (as for `let'). + +If all VALUEFORMs yield non-nil, evaluate BODY forms sequentially, with +VARLIST's bindings in effect, and return the value of the last form. + +If any VALUEFORM yields nil, evaluate neither the remaining VALUEFORMs +nor the BODY forms, and proceed to the next clause. + +A [[SYMBOL VALUEFORM]...] form creates bindings, which extend to all +remaining clauses and binding vectors. Evaluate all VALUEFORMs before +binding their respective SYMBOLs. Unlike for the previous form, bind +all SYMBOLs, even if a VALUEFORM yields nil. Always proceed to the +next clause." + (declare (indent 0) (debug cond-let*)) + (let ((tag (gensym ":cond-let"))) + `(catch ',tag + ,@(cond-let--prepare-clauses tag nil clauses)))) + +;;; Common + +(defun cond-let--prepare-varlist (varlist) + "Used by Cond-Let's `when-let*', `and-let*' and `while-let*'. +Also used by other macros via `cond-let--prepare-varforms'. +Return (VARLIST LASTVAR)." + (let (prevvar) + (list (mapcar (lambda (binding) + (unless (length= binding 2) + (signal 'error (cons "Invalid binding" binding))) + (pcase-let ((`(,var ,form) binding)) + (when (string-prefix-p "_" (symbol-name var)) + (setq var (gensym "anon"))) + (prog1 (if prevvar + `(,var (and ,prevvar ,form)) + (list var form)) + (setq prevvar var)))) + varlist) + prevvar))) + +(defun cond-let--prepare-varforms (varlist &optional if-let) + "Used by Cond-Let's `when-let', `and-let', `while-let' and `if-let'. +Return (ANON-VARLIST ANON-SETQ VARLIST LASTVAR), or if the length of +VARLIST is 1 and IF-LET is nil, return (nil nil VARLIST LASTVAR)." + (if (and (not if-let) + (length= varlist 1)) + `(nil nil ,@(cond-let--prepare-varlist varlist)) + (let ((triples + (mapcar (lambda (binding) + (unless (length= binding 2) + (signal 'error (cons "Invalid binding" binding))) + (pcase-let ((`(,var ,form) binding)) + (when (string-prefix-p "_" (symbol-name var)) + (setq var nil)) + (list (and var (gensym "anon")) + var + form))) + varlist))) + (list (mapcan (pcase-lambda (`(,anon ,_ ,_)) + (and anon (list anon))) + triples) + (mapcar (pcase-lambda (`(,anon ,_ ,form)) + (if anon + `(setq ,anon ,form) + form)) + triples) + (mapcan (pcase-lambda (`(,anon ,var ,_)) + (and var `((,var ,anon)))) + triples) + (cadr (car (last triples))))))) + +;;; And + +(defmacro cond-let--and-let* (varlist &optional bodyform) + "Bind according to VARLIST until one yields nil, else evaluate BODYFORM. + +Each element of VARLIST is a list (SYMBOL VALUEFORM), which binds SYMBOL +to the value of VALUEFORM. Each VALUEFORM can refer to symbols already +bound by this VARLIST (as for `let*'). + +Evaluate VALUEFORMs until on of them yields nil. If that happens return +nil, and evaluate neither the remaining VALUEFORMs nor BODYFORM. If all +VALUEFORMs yield non-nil, evaluate BODYFORM with the bindings in effect, +and return its value; or if there is no BODYFORM, the value of the last +VALUEFORM." + (declare (indent 1) + (debug ((&rest (symbolp form)) form))) + (pcase-let ((`(,varlist ,lastvar) + (cond-let--prepare-varlist varlist))) + `(let* ,varlist + ,(if bodyform + `(and ,lastvar ,bodyform) + lastvar)))) + +(defmacro cond-let--and-let (varlist &optional bodyform) + "Bind according to VARLIST until one yields nil, else evaluate BODYFORM. + +Each element of VARLIST is a list (SYMBOL VALUEFORM), which binds SYMBOL +to the value of VALUEFORM. Evaluate all VALUEFORMs before binding their +respective SYMBOLs (as for `let'). + +Evaluate VALUEFORMs until on of them yields nil. If that happens return +nil, and evaluate neither the remaining VALUEFORMs nor BODYFORM. If all +VALUEFORMs yield non-nil, evaluate BODYFORM with the bindings in effect, +and return its value; or if there is no BODYFORM, the value of the last +VALUEFORM." + (declare (indent 1) (debug cond-let--and-let*)) + (pcase-let ((`(,anon ,set ,bind ,lastvar) + (cond-let--prepare-varforms varlist))) + (cond (anon + `(let ,anon + (and ,@set + (let ,bind + ,(or bodyform lastvar))))) + (t + `(let ,bind + ,(if bodyform + `(and ,lastvar ,bodyform) + lastvar)))))) + +(defmacro cond-let--and$ (varform bodyform) + "Bind variable `$' to value of VARFORM and conditionally evaluate BODYFORM. + +If VARFORM yields a non-nil value, bind the symbol `$' to that value, +evaluate BODYFORM with that binding in effect, and return the value of +BODYFORM. If VARFORM yields nil, do not evaluate BODYFORM, and return +nil." + (declare (debug (form form))) + `(let (($ ,varform)) + (and $ ,bodyform))) + +(defmacro cond-let--and> (form form2 &rest forms) + "Bind variables according to each VARFORM until one of them yields nil. + +Evaluate the first FORM and if that yields a non-nil value, bind the +symbol `$' to that value, and evaluate the next FORM with that binding +in effect. Repeat this process with subsequent FORMs until one yields +nil, then return nil without evaluate the remaining FORMs. If all +FORMs yield non-nil, return the value of the last FORM. + +\(fn FORM FORM...)" + (declare (debug (form form body))) + `(,(if forms 'let* 'let) + (($ ,form) + ,@(and forms + (mapcar (lambda (form) + `($ (and $ ,form))) + (cons form2 (butlast forms))))) + (and $ + ,(or (car (last forms)) + form2)))) + +;;; If + +(defmacro cond-let--if-let* (varlist then &rest else) + "Bind variables according to VARLIST and evaluate THEN or ELSE. + +Each element of VARLIST is a list (SYMBOL VALUEFORM), which binds SYMBOL +to the value of VALUEFORM. Each VALUEFORM can refer to symbols already +bound by this VARLIST (as for `let*'). + +If all VALUEFORMs yield non-nil, evaluate THEN with VARLIST's bindings +in effect, and return its value. THEN must be one expression. + +If any VALUEFORM yields nil, evaluate ELSE sequentially and return the +value of the last form; or if there are no ELSE forms return nil. The +bindings from VARLIST do _not_ extend to the ELSE forms. + +\(fn VARLIST THEN [ELSE...])" + (declare (indent 2) + (debug ((&rest (symbolp form)) form body))) + (pcase-let ((`(,varlist ,lastvar) + (cond-let--prepare-varlist varlist)) + (tag (gensym ":if-let*"))) + `(catch ',tag + (let* ,varlist + (when ,lastvar + (throw ',tag ,then))) + ,@else))) + +(defmacro cond-let--if-let (varlist then &rest else) + "Bind variables according to VARLIST and evaluate THEN or ELSE. + +Each element of VARLIST is a list (SYMBOL VALUEFORM), which binds SYMBOL +to the value of VALUEFORM. Evaluate all VALUEFORMs before binding their +respective SYMBOLs (as for `let'). + +If all VALUEFORMs yield non-nil, evaluate THEN with VARLIST's bindings +in effect, and return its value. THEN must be one expression. + +If any VALUEFORM yields nil, evaluate ELSE sequentially and return the +value of the last form; or if there are no ELSE forms return nil. The +bindings from VARLIST do _not_ extend to the ELSE forms. + +\(fn VARLIST THEN [ELSE...])" + (declare (indent 2) (debug cond-let--if-let*)) + (pcase-let* ((`(,anon ,set ,bind ,_) + (cond-let--prepare-varforms varlist t)) + (set (if (length= set 1) (car set) (cons 'and set)))) + `(let ,anon + (if ,set + (let ,bind + ,then) + ,@else)))) + +;;; When + +(defmacro cond-let--when-let* (varlist bodyform &rest body) + "Bind variables according to VARLIST and conditionally evaluate BODY. + +Each element of VARLIST is a list (SYMBOL VALUEFORM), which binds SYMBOL +to the value of VALUEFORM. Each VALUEFORM can refer to symbols already +bound by this VARLIST (as for `let*'). + +If all VALUEFORMs yield non-nil, evaluate BODY forms sequentially, with +VARLIST's bindings in effect, and return the value of the last form. + +If any VALUEFORM yields nil, evaluate neither the remaining VALUEFORMs +nor the BODY forms, and instead return nil. + +BODY must be one or more expressions. If VARLIST is empty, do nothing +and return nil. + +\(fn VARLIST BODY...)" + (declare (indent 1) + (debug ((&rest (symbolp form)) form body))) + (pcase-let ((`(,varlist ,lastvar) + (cond-let--prepare-varlist varlist))) + `(let* ,varlist + (when ,lastvar + ,bodyform ,@body)))) + +(defmacro cond-let--when-let (varlist bodyform &rest body) + "Bind variables according to VARLIST and conditionally evaluate BODY. + +Each element of VARLIST is a list (SYMBOL VALUEFORM), which binds SYMBOL +to the value of VALUEFORM. Evaluate all VALUEFORMs before binding their +respective SYMBOLs (as for `let'). + +If all VALUEFORMs yield non-nil, evaluate BODY forms sequentially, with +VARLIST's bindings in effect, and return the value of the last form. + +If any VALUEFORM yields nil, evaluate neither the remaining VALUEFORMs +nor the BODY forms, and instead return nil. + +BODY must be one or more expressions. If VARLIST is empty, do nothing +and return nil. + +\(fn VARLIST BODY...)" + (declare (indent 1) (debug cond-let--when-let*)) + (pcase-let ((`(,anon ,set ,bind ,lastvar) + (cond-let--prepare-varforms varlist))) + (cond (anon + `(let ,anon + (when (and ,@set) + (let ,bind + ,bodyform ,@body)))) + (t + `(let ,bind + (when ,lastvar + ,bodyform ,@body)))))) + +(defmacro cond-let--when$ (varform bodyform &rest body) + "Bind variable `$' to value of VARFORM and conditionally evaluate BODY. + +If VARFORM yields a non-nil value, bind the symbol `$' to that value, +evaluate BODY with that binding in effect, and return the value of the +last form. If VARFORM yields nil, do not evaluate BODY, and return nil. +BODY must be one or more expressions. If VARLIST is empty, do nothing +and return nil. + +\(fn VARLIST BODY...)" + (declare (debug (form form))) + `(let (($ ,varform)) + (when $ + ,bodyform ,@body))) + +;;; While + +(defmacro cond-let--while-let* (varlist &rest body) + "Bind variables according to VARLIST, conditionally evaluate BODY, and repeat. + +Each element of VARLIST is a list (SYMBOL VALUEFORM), which binds SYMBOL +to the value of VALUEFORM. Each VALUEFORM can refer to symbols already +bound by this VARLIST (as for `let*'). + +If all VALUEFORMs yield non-nil, evaluate BODY forms sequentially, with +VARLIST's bindings in effect, and repeat the loop. + +If any VALUEFORM yields nil, evaluate neither the remaining VALUEFORMs +nor the BODY forms, and instead return, always yielding nil. + +BODY can be zero or more expressions. + +\(fn VARLIST [BODY...])" + (declare (indent 1) (debug cond-let--if-let*)) + (pcase-let ((`(,varlist ,lastvar) + (cond-let--prepare-varlist varlist)) + (tag (gensym ":while-let*"))) + `(catch ',tag + (while t + (let* ,varlist + (if ,lastvar + ,(macroexp-progn body) + (throw ',tag nil))))))) + +(defmacro cond-let--while-let (varlist bodyform &rest body) + "Bind variables according to VARLIST, conditionally evaluate BODY, and repeat. + +Each element of VARLIST is a list (SYMBOL VALUEFORM), which binds SYMBOL +to the value of VALUEFORM. Evaluate all VALUEFORMs before binding their +respective SYMBOLs (as for `let'). + +If all VALUEFORMs yield non-nil, evaluate BODY forms sequentially, with +VARLIST's bindings in effect, and repeat the loop. + +If any VALUEFORM yields nil, evaluate neither the remaining VALUEFORMs +nor the BODY forms, and instead return, always yielding nil. + +BODY can be one or more expressions. + +\(fn VARLIST BODY...)" + (declare (indent 1) (debug cond-let--if-let*)) + (pcase-let ((`(,anon ,set ,bind ,lastvar) + (cond-let--prepare-varforms varlist)) + (tag (gensym ":while-let"))) + (cond (anon + `(catch ',tag + (while t + (let ,anon + (if (and ,@set) + (let ,bind + ,bodyform ,@body) + (throw ',tag nil)))))) + (t + `(catch ',tag + (while t + (let ,bind + (if ,lastvar + ,(macroexp-progn (cons bodyform body)) + (throw ',tag nil))))))))) + +;;; Font-Lock + +(defvar cond-let-font-lock-keywords + '(("\\_<\\$\\_>" 0 'font-lock-variable-name-face)) + "Highlight `$' using `font-lock-variable-name-face'. +To add these keywords, add this to your configuration: +\(font-lock-add-keywords \\='emacs-lisp-mode cond-let-font-lock-keywords t)") + +(provide 'cond-let) +;;; cond-let.el ends here diff --git a/.packages/cond-let-20251101.1942/cond-let.elc b/.packages/cond-let-20251101.1942/cond-let.elc new file mode 100644 index 0000000..7f19be7 Binary files /dev/null and b/.packages/cond-let-20251101.1942/cond-let.elc differ diff --git a/.packages/dash-20250312.1307/dash-autoloads.el b/.packages/dash-20250312.1307/dash-autoloads.el new file mode 100644 index 0000000..3d8c46f --- /dev/null +++ b/.packages/dash-20250312.1307/dash-autoloads.el @@ -0,0 +1,83 @@ +;;; 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 (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; 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. + +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 the variable `dash-fontify-mode'. + +The mode's hook is called both when the mode is enabled and when it is +disabled. + +(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 +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; +otherwise, disable it. + +If called from Lisp, toggle the mode if ARG is `toggle'. +Enable the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +Dash-Fontify mode is enabled in all buffers where +`dash--turn-on-fontify-mode' would do it. + +See `dash-fontify-mode' for more information on Dash-Fontify mode. + +(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) +(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-")) + +;;; End of scraped data + +(provide 'dash-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; dash-autoloads.el ends here diff --git a/.packages/dash-20250312.1307/dash-pkg.el b/.packages/dash-20250312.1307/dash-pkg.el new file mode 100644 index 0000000..3fd56b1 --- /dev/null +++ b/.packages/dash-20250312.1307/dash-pkg.el @@ -0,0 +1,10 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "dash" "20250312.1307" + "A modern list library for Emacs." + '((emacs "24")) + :url "https://github.com/magnars/dash.el" + :commit "fcb5d831fc08a43f984242c7509870f30983c27c" + :revdesc "fcb5d831fc08" + :keywords '("extensions" "lisp") + :authors '(("Magnar Sveen" . "magnars@gmail.com")) + :maintainers '(("Basil L. Contovounesios" . "basil@contovou.net"))) diff --git a/.packages/dash-20250312.1307/dash.el b/.packages/dash-20250312.1307/dash.el new file mode 100644 index 0000000..b23ffcf --- /dev/null +++ b/.packages/dash-20250312.1307/dash.el @@ -0,0 +1,4165 @@ +;;; dash.el --- A modern list library for Emacs -*- lexical-binding: t -*- + +;; Copyright (C) 2012-2025 Free Software Foundation, Inc. + +;; Author: Magnar Sveen +;; Maintainer: Basil L. Contovounesios +;; Package-Version: 20250312.1307 +;; Package-Revision: fcb5d831fc08 +;; Package-Requires: ((emacs "24")) +;; Keywords: extensions, lisp +;; URL: https://github.com/magnars/dash.el + +;; 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: + +;; A modern list API for Emacs. +;; +;; See its overview at https://github.com/magnars/dash.el#functions. + +;;; Code: + +(eval-when-compile + (unless (fboundp 'static-if) + (defmacro static-if (condition then-form &rest else-forms) + "Expand to THEN-FORM or ELSE-FORMS based on compile-time CONDITION. +Polyfill for Emacs 30 `static-if'." + (declare (debug (sexp sexp &rest sexp)) (indent 2)) + (if (eval condition lexical-binding) + then-form + (cons 'progn else-forms)))) + + ;; TODO: Emacs 24.3 first introduced `gv', so remove this and all + ;; calls to `defsetf' when support for earlier versions is dropped. + (unless (fboundp 'gv-define-setter) + (require 'cl)) + + ;; - 24.3 started complaining about unknown `declare' props. + ;; - 25 introduced `pure' and `side-effect-free'. + ;; - 30 introduced `important-return-value'. + (when (boundp 'defun-declarations-alist) + (dolist (prop '(important-return-value pure side-effect-free)) + (unless (assq prop defun-declarations-alist) + (push (list prop #'ignore) defun-declarations-alist))))) + +(defgroup dash () + "Customize group for Dash, a modern list library." + :group 'extensions + :group 'lisp + :prefix "dash-") + +(defmacro !cons (car cdr) + "Destructive: Set CDR to the cons of CAR and CDR." + (declare (debug (form symbolp))) + `(setq ,cdr (cons ,car ,cdr))) + +(defmacro !cdr (list) + "Destructive: Set LIST to the cdr of LIST." + (declare (debug (symbolp))) + `(setq ,list (cdr ,list))) + +(defmacro --each (list &rest body) + "Evaluate BODY for each element of LIST and return nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating BODY. +This is the anaphoric counterpart to `-each'." + (declare (debug (form body)) (indent 1)) + (let ((l (make-symbol "list")) + (i (make-symbol "i"))) + `(let ((,l ,list) + (,i 0)) + (while ,l + (let ((it (pop ,l)) (it-index ,i)) + (ignore it it-index) + ,@body) + (setq ,i (1+ ,i)))))) + +(defun -each (list fn) + "Call FN on each element of LIST. +Return nil; this function is intended for side effects. + +Its anaphoric counterpart is `--each'. + +For access to the current element's index in LIST, see +`-each-indexed'." + (declare (indent 1)) + (ignore (mapc fn list))) + +(defalias '--each-indexed '--each) + +(defun -each-indexed (list fn) + "Call FN on each index and element of LIST. +For each ITEM at INDEX in LIST, call (funcall FN INDEX ITEM). +Return nil; this function is intended for side effects. + +See also: `-map-indexed'." + (declare (indent 1)) + (--each list (funcall fn it-index it))) + +(defmacro --each-while (list pred &rest body) + "Evaluate BODY for each item in LIST, while PRED evaluates to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating PRED or BODY. Once +an element is reached for which PRED evaluates to nil, no further +BODY is evaluated. The return value is always nil. +This is the anaphoric counterpart to `-each-while'." + (declare (debug (form form body)) (indent 2)) + (let ((l (make-symbol "list")) + (i (make-symbol "i")) + (elt (make-symbol "elt"))) + `(let ((,l ,list) + (,i 0) + ,elt) + (while (when ,l + (setq ,elt (car-safe ,l)) + (let ((it ,elt) (it-index ,i)) + (ignore it it-index) + ,pred)) + (let ((it ,elt) (it-index ,i)) + (ignore it it-index) + ,@body) + (setq ,i (1+ ,i) ,l (cdr ,l)))))) + +(defun -each-while (list pred fn) + "Call FN on each ITEM in LIST, while (PRED ITEM) is non-nil. +Once an ITEM is reached for which PRED returns nil, FN is no +longer called. Return nil; this function is intended for side +effects. + +Its anaphoric counterpart is `--each-while'." + (declare (indent 2)) + (--each-while list (funcall pred it) (funcall fn it))) + +(defmacro --each-r (list &rest body) + "Evaluate BODY for each element of LIST in reversed order. +Each element of LIST in turn, starting at its end, is bound to +`it' and its index within LIST to `it-index' before evaluating +BODY. The return value is always nil. +This is the anaphoric counterpart to `-each-r'." + (declare (debug (form body)) (indent 1)) + (let ((v (make-symbol "vector")) + (i (make-symbol "i"))) + ;; Implementation note: building a vector is considerably faster + ;; than building a reversed list (vector takes less memory, so + ;; there is less GC), plus `length' comes naturally. In-place + ;; `nreverse' would be faster still, but BODY would be able to see + ;; that, even if the modification was undone before we return. + `(let* ((,v (vconcat ,list)) + (,i (length ,v)) + it it-index) + (ignore it it-index) + (while (> ,i 0) + (setq ,i (1- ,i) it-index ,i it (aref ,v ,i)) + ,@body)))) + +(defun -each-r (list fn) + "Call FN on each element of LIST in reversed order. +Return nil; this function is intended for side effects. + +Its anaphoric counterpart is `--each-r'." + (--each-r list (funcall fn it))) + +(defmacro --each-r-while (list pred &rest body) + "Eval BODY for each item in reversed LIST, while PRED evals to non-nil. +Each element of LIST in turn, starting at its end, is bound to +`it' and its index within LIST to `it-index' before evaluating +PRED or BODY. Once an element is reached for which PRED +evaluates to nil, no further BODY is evaluated. The return value +is always nil. +This is the anaphoric counterpart to `-each-r-while'." + (declare (debug (form form body)) (indent 2)) + (let ((v (make-symbol "vector")) + (i (make-symbol "i")) + (elt (make-symbol "elt"))) + `(let* ((,v (vconcat ,list)) + (,i (length ,v)) + ,elt it it-index) + (ignore it it-index) + (while (when (> ,i 0) + (setq ,i (1- ,i) it-index ,i) + (setq ,elt (aref ,v ,i) it ,elt) + ,pred) + (setq it-index ,i it ,elt) + ,@body)))) + +(defun -each-r-while (list pred fn) + "Call FN on each ITEM in reversed LIST, while (PRED ITEM) is non-nil. +Once an ITEM is reached for which PRED returns nil, FN is no +longer called. Return nil; this function is intended for side +effects. + +Its anaphoric counterpart is `--each-r-while'." + (--each-r-while list (funcall pred it) (funcall fn it))) + +(defmacro --dotimes (num &rest body) + "Evaluate BODY NUM times, presumably for side effects. +BODY is evaluated with the local variable `it' temporarily bound +to successive integers running from 0, inclusive, to NUM, +exclusive. BODY is not evaluated if NUM is less than 1. +This is the anaphoric counterpart to `-dotimes'." + (declare (debug (form body)) (indent 1)) + (let ((n (make-symbol "num")) + (i (make-symbol "i"))) + `(let ((,n ,num) + (,i 0) + it) + (ignore it) + (while (< ,i ,n) + (setq it ,i ,i (1+ ,i)) + ,@body)))) + +(defun -dotimes (num fn) + "Call FN NUM times, presumably for side effects. +FN is called with a single argument on successive integers +running from 0, inclusive, to NUM, exclusive. FN is not called +if NUM is less than 1. + +This function's anaphoric counterpart is `--dotimes'." + (declare (indent 1)) + (--dotimes num (funcall fn it))) + +(defun -map (fn list) + "Apply FN to each item in LIST and return the list of results. + +This function's anaphoric counterpart is `--map'." + (declare (important-return-value t)) + (mapcar fn list)) + +(defmacro --map (form list) + "Eval FORM for each item in LIST and return the list of results. +Each element of LIST in turn is bound to `it' before evaluating +FORM. +This is the anaphoric counterpart to `-map'." + (declare (debug (def-form form))) + `(mapcar (lambda (it) (ignore it) ,form) ,list)) + +(defmacro --reduce-from (form init list) + "Accumulate a value by evaluating FORM across LIST. +This macro is like `--each' (which see), but it additionally +provides an accumulator variable `acc' which it successively +binds to the result of evaluating FORM for the current LIST +element before processing the next element. For the first +element, `acc' is initialized with the result of evaluating INIT. +The return value is the resulting value of `acc'. If LIST is +empty, FORM is not evaluated, and the return value is the result +of INIT. +This is the anaphoric counterpart to `-reduce-from'." + (declare (debug (form form form))) + `(let ((acc ,init)) + (--each ,list (setq acc ,form)) + acc)) + +(defun -reduce-from (fn init list) + "Reduce the function FN across LIST, starting with INIT. +Return the result of applying FN to INIT and the first element of +LIST, then applying FN to that result and the second element, +etc. If LIST is empty, return INIT without calling FN. + +This function's anaphoric counterpart is `--reduce-from'. + +For other folds, see also `-reduce' and `-reduce-r'." + (declare (important-return-value t)) + (--reduce-from (funcall fn acc it) init list)) + +(defmacro --reduce (form list) + "Accumulate a value by evaluating FORM across LIST. +This macro is like `--reduce-from' (which see), except the first +element of LIST is taken as INIT. Thus if LIST contains a single +item, it is returned without evaluating FORM. If LIST is empty, +FORM is evaluated with `it' and `acc' bound to nil. +This is the anaphoric counterpart to `-reduce'." + (declare (debug (form form))) + (let ((lv (make-symbol "list-value"))) + `(let ((,lv ,list)) + (if ,lv + (--reduce-from ,form (car ,lv) (cdr ,lv)) + ;; Explicit nil binding pacifies lexical "variable left uninitialized" + ;; warning. See issue #377 and upstream https://bugs.gnu.org/47080. + (let ((acc nil) (it nil)) + (ignore acc it) + ,form))))) + +(defun -reduce (fn list) + "Reduce the function FN across LIST. +Return the result of applying FN to the first two elements of +LIST, then applying FN to that result and the third element, etc. +If LIST contains a single element, return it without calling FN. +If LIST is empty, return the result of calling FN with no +arguments. + +This function's anaphoric counterpart is `--reduce'. + +For other folds, see also `-reduce-from' and `-reduce-r'." + (declare (important-return-value t)) + (if list + (-reduce-from fn (car list) (cdr list)) + (funcall fn))) + +(defmacro --reduce-r-from (form init list) + "Accumulate a value by evaluating FORM across LIST in reverse. +This macro is like `--reduce-from', except it starts from the end +of LIST. +This is the anaphoric counterpart to `-reduce-r-from'." + (declare (debug (form form form))) + `(let ((acc ,init)) + (--each-r ,list (setq acc ,form)) + acc)) + +(defun -reduce-r-from (fn init list) + "Reduce the function FN across LIST in reverse, starting with INIT. +Return the result of applying FN to the last element of LIST and +INIT, then applying FN to the second-to-last element and the +previous result of FN, etc. That is, the first argument of FN is +the current element, and its second argument the accumulated +value. If LIST is empty, return INIT without calling FN. + +This function is like `-reduce-from' but the operation associates +from the right rather than left. In other words, it starts from +the end of LIST and flips the arguments to FN. Conceptually, it +is like replacing the conses in LIST with applications of FN, and +its last link with INIT, and evaluating the resulting expression. + +This function's anaphoric counterpart is `--reduce-r-from'. + +For other folds, see also `-reduce-r' and `-reduce'." + (declare (important-return-value t)) + (--reduce-r-from (funcall fn it acc) init list)) + +(defmacro --reduce-r (form list) + "Accumulate a value by evaluating FORM across LIST in reverse order. +This macro is like `--reduce', except it starts from the end of +LIST. +This is the anaphoric counterpart to `-reduce-r'." + (declare (debug (form form))) + `(--reduce ,form (reverse ,list))) + +(defun -reduce-r (fn list) + "Reduce the function FN across LIST in reverse. +Return the result of applying FN to the last two elements of +LIST, then applying FN to the third-to-last element and the +previous result of FN, etc. That is, the first argument of FN is +the current element, and its second argument the accumulated +value. If LIST contains a single element, return it without +calling FN. If LIST is empty, return the result of calling FN +with no arguments. + +This function is like `-reduce' but the operation associates from +the right rather than left. In other words, it starts from the +end of LIST and flips the arguments to FN. Conceptually, it is +like replacing the conses in LIST with applications of FN, +ignoring its last link, and evaluating the resulting expression. + +This function's anaphoric counterpart is `--reduce-r'. + +For other folds, see also `-reduce-r-from' and `-reduce'." + (declare (important-return-value t)) + (if list + (--reduce-r (funcall fn it acc) list) + (funcall fn))) + +(defmacro --reductions-from (form init list) + "Return a list of FORM's intermediate reductions across LIST. +That is, a list of the intermediate values of the accumulator +when `--reduce-from' (which see) is called with the same +arguments. +This is the anaphoric counterpart to `-reductions-from'." + (declare (debug (form form form))) + `(nreverse + (--reduce-from (cons (let ((acc (car acc))) (ignore acc) ,form) acc) + (list ,init) + ,list))) + +(defun -reductions-from (fn init list) + "Return a list of FN's intermediate reductions across LIST. +That is, a list of the intermediate values of the accumulator +when `-reduce-from' (which see) is called with the same +arguments. + +This function's anaphoric counterpart is `--reductions-from'. + +For other folds, see also `-reductions' and `-reductions-r'." + (declare (important-return-value t)) + (--reductions-from (funcall fn acc it) init list)) + +(defmacro --reductions (form list) + "Return a list of FORM's intermediate reductions across LIST. +That is, a list of the intermediate values of the accumulator +when `--reduce' (which see) is called with the same arguments. +This is the anaphoric counterpart to `-reductions'." + (declare (debug (form form))) + (let ((lv (make-symbol "list-value"))) + `(let ((,lv ,list)) + (if ,lv + (--reductions-from ,form (car ,lv) (cdr ,lv)) + ;; Explicit nil binding pacifies lexical "variable left uninitialized" + ;; warning. See issue #377 and upstream https://bugs.gnu.org/47080. + (let ((acc nil) (it nil)) + (ignore acc it) + (list ,form)))))) + +(defun -reductions (fn list) + "Return a list of FN's intermediate reductions across LIST. +That is, a list of the intermediate values of the accumulator +when `-reduce' (which see) is called with the same arguments. + +This function's anaphoric counterpart is `--reductions'. + +For other folds, see also `-reductions' and `-reductions-r'." + (declare (important-return-value t)) + (if list + (--reductions-from (funcall fn acc it) (car list) (cdr list)) + (list (funcall fn)))) + +(defmacro --reductions-r-from (form init list) + "Return a list of FORM's intermediate reductions across reversed LIST. +That is, a list of the intermediate values of the accumulator +when `--reduce-r-from' (which see) is called with the same +arguments. +This is the anaphoric counterpart to `-reductions-r-from'." + (declare (debug (form form form))) + `(--reduce-r-from (cons (let ((acc (car acc))) (ignore acc) ,form) acc) + (list ,init) + ,list)) + +(defun -reductions-r-from (fn init list) + "Return a list of FN's intermediate reductions across reversed LIST. +That is, a list of the intermediate values of the accumulator +when `-reduce-r-from' (which see) is called with the same +arguments. + +This function's anaphoric counterpart is `--reductions-r-from'. + +For other folds, see also `-reductions' and `-reductions-r'." + (declare (important-return-value t)) + (--reductions-r-from (funcall fn it acc) init list)) + +(defmacro --reductions-r (form list) + "Return a list of FORM's intermediate reductions across reversed LIST. +That is, a list of the intermediate values of the accumulator +when `--reduce-re' (which see) is called with the same arguments. +This is the anaphoric counterpart to `-reductions-r'." + (declare (debug (form list))) + (let ((lv (make-symbol "list-value"))) + `(let ((,lv (reverse ,list))) + (if ,lv + (--reduce-from (cons (let ((acc (car acc))) (ignore acc) ,form) acc) + (list (car ,lv)) + (cdr ,lv)) + ;; Explicit nil binding pacifies lexical "variable left uninitialized" + ;; warning. See issue #377 and upstream https://bugs.gnu.org/47080. + (let ((acc nil) (it nil)) + (ignore acc it) + (list ,form)))))) + +(defun -reductions-r (fn list) + "Return a list of FN's intermediate reductions across reversed LIST. +That is, a list of the intermediate values of the accumulator +when `-reduce-r' (which see) is called with the same arguments. + +This function's anaphoric counterpart is `--reductions-r'. + +For other folds, see also `-reductions-r-from' and +`-reductions'." + (declare (important-return-value t)) + (if list + (--reductions-r (funcall fn it acc) list) + (list (funcall fn)))) + +(defmacro --filter (form list) + "Return a new list of the items in LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-filter'. +For the opposite operation, see also `--remove'." + (declare (debug (form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each ,list (when ,form (push it ,r))) + (nreverse ,r)))) + +(defun -filter (pred list) + "Return a new list of the items in LIST for which PRED returns non-nil. + +Alias: `-select'. + +This function's anaphoric counterpart is `--filter'. + +For similar operations, see also `-keep' and `-remove'." + (declare (important-return-value t)) + (--filter (funcall pred it) list)) + +(defalias '-select '-filter) +(defalias '--select '--filter) + +(defmacro --remove (form list) + "Return a new list of the items in LIST for which FORM evals to nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-remove'. +For the opposite operation, see also `--filter'." + (declare (debug (form form))) + `(--filter (not ,form) ,list)) + +(defun -remove (pred list) + "Return a new list of the items in LIST for which PRED returns nil. + +Alias: `-reject'. + +This function's anaphoric counterpart is `--remove'. + +For similar operations, see also `-keep' and `-filter'." + (declare (important-return-value t)) + (--remove (funcall pred it) list)) + +(defalias '-reject '-remove) +(defalias '--reject '--remove) + +(defmacro --remove-first (form list) + "Remove the first item from LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. This is a +non-destructive operation, but only the front of LIST leading up +to the removed item is a copy; the rest is LIST's original tail. +If no item is removed, then the result is a complete copy. +This is the anaphoric counterpart to `-remove-first'." + (declare (debug (form form))) + (let ((front (make-symbol "front")) + (tail (make-symbol "tail"))) + `(let ((,tail ,list) ,front) + (--each-while ,tail (not ,form) + (push (pop ,tail) ,front)) + (if ,tail + (nconc (nreverse ,front) (cdr ,tail)) + (nreverse ,front))))) + +(defun -remove-first (pred list) + "Remove the first item from LIST for which PRED returns non-nil. +This is a non-destructive operation, but only the front of LIST +leading up to the removed item is a copy; the rest is LIST's +original tail. If no item is removed, then the result is a +complete copy. + +Alias: `-reject-first'. + +This function's anaphoric counterpart is `--remove-first'. + +See also `-map-first', `-remove-item', and `-remove-last'." + (declare (important-return-value t)) + (--remove-first (funcall pred it) list)) + +;; TODO: #'-quoting the macro upsets Emacs 24. +(defalias '-reject-first #'-remove-first) +(defalias '--reject-first '--remove-first) + +(defmacro --remove-last (form list) + "Remove the last item from LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' before evaluating +FORM. The result is a copy of LIST regardless of whether an +element is removed. +This is the anaphoric counterpart to `-remove-last'." + (declare (debug (form form))) + `(nreverse (--remove-first ,form (reverse ,list)))) + +(defun -remove-last (pred list) + "Remove the last item from LIST for which PRED returns non-nil. +The result is a copy of LIST regardless of whether an element is +removed. + +Alias: `-reject-last'. + +This function's anaphoric counterpart is `--remove-last'. + +See also `-map-last', `-remove-item', and `-remove-first'." + (declare (important-return-value t)) + (--remove-last (funcall pred it) list)) + +(defalias '-reject-last '-remove-last) +(defalias '--reject-last '--remove-last) + +(defalias '-remove-item #'remove + "Return a copy of LIST with all occurrences of ITEM removed. +The comparison is done with `equal'. +\n(fn ITEM LIST)") + +(defmacro --keep (form list) + "Eval FORM for each item in LIST and return the non-nil results. +Like `--filter', but returns the non-nil results of FORM instead +of the corresponding elements of LIST. Each element of LIST in +turn is bound to `it' and its index within LIST to `it-index' +before evaluating FORM. +This is the anaphoric counterpart to `-keep'." + (declare (debug (form form))) + (let ((r (make-symbol "result")) + (m (make-symbol "mapped"))) + `(let (,r) + (--each ,list (let ((,m ,form)) (when ,m (push ,m ,r)))) + (nreverse ,r)))) + +(defun -keep (fn list) + "Return a new list of the non-nil results of applying FN to each item in LIST. +Like `-filter', but returns the non-nil results of FN instead of +the corresponding elements of LIST. + +Its anaphoric counterpart is `--keep'." + (declare (important-return-value t)) + (--keep (funcall fn it) list)) + +(defun -non-nil (list) + "Return a copy of LIST with all nil items removed." + (declare (side-effect-free t)) + (--filter it list)) + +(defmacro --map-indexed (form list) + "Eval FORM for each item in LIST and return the list of results. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. This is like +`--map', but additionally makes `it-index' available to FORM. + +This is the anaphoric counterpart to `-map-indexed'." + (declare (debug (form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each ,list + (push ,form ,r)) + (nreverse ,r)))) + +(defun -map-indexed (fn list) + "Apply FN to each index and item in LIST and return the list of results. +This is like `-map', but FN takes two arguments: the index of the +current element within LIST, and the element itself. + +This function's anaphoric counterpart is `--map-indexed'. + +For a side-effecting variant, see also `-each-indexed'." + (declare (important-return-value t)) + (--map-indexed (funcall fn it-index it) list)) + +(defmacro --map-when (pred rep list) + "Anaphoric form of `-map-when'." + (declare (debug (form form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each ,list (!cons (if ,pred ,rep it) ,r)) + (nreverse ,r)))) + +(defun -map-when (pred rep list) + "Use PRED to conditionally apply REP to each item in LIST. +Return a copy of LIST where the items for which PRED returns nil +are unchanged, and the rest are mapped through the REP function. + +Alias: `-replace-where' + +See also: `-update-at'" + (declare (important-return-value t)) + (--map-when (funcall pred it) (funcall rep it) list)) + +(defalias '-replace-where '-map-when) +(defalias '--replace-where '--map-when) + +(defun -map-first (pred rep list) + "Use PRED to determine the first item in LIST to call REP on. +Return a copy of LIST where the first item for which PRED returns +non-nil is replaced with the result of calling REP on that item. + +See also: `-map-when', `-replace-first'" + (declare (important-return-value t)) + (let (front) + (while (and list (not (funcall pred (car list)))) + (push (car list) front) + (!cdr list)) + (if list + (-concat (nreverse front) (cons (funcall rep (car list)) (cdr list))) + (nreverse front)))) + +(defmacro --map-first (pred rep list) + "Anaphoric form of `-map-first'." + (declare (debug (def-form def-form form))) + `(-map-first (lambda (it) (ignore it) ,pred) + (lambda (it) (ignore it) ,rep) + ,list)) + +(defun -map-last (pred rep list) + "Use PRED to determine the last item in LIST to call REP on. +Return a copy of LIST where the last item for which PRED returns +non-nil is replaced with the result of calling REP on that item. + +See also: `-map-when', `-replace-last'" + (declare (important-return-value t)) + (nreverse (-map-first pred rep (reverse list)))) + +(defmacro --map-last (pred rep list) + "Anaphoric form of `-map-last'." + (declare (debug (def-form def-form form))) + `(-map-last (lambda (it) (ignore it) ,pred) + (lambda (it) (ignore it) ,rep) + ,list)) + +(defun -replace (old new list) + "Replace all OLD items in LIST with NEW. + +Elements are compared using `equal'. + +See also: `-replace-at'" + (declare (pure t) (side-effect-free t)) + (--map-when (equal it old) new list)) + +(defun -replace-first (old new list) + "Replace the first occurrence of OLD with NEW in LIST. + +Elements are compared using `equal'. + +See also: `-map-first'" + (declare (pure t) (side-effect-free t)) + (--map-first (equal old it) new list)) + +(defun -replace-last (old new list) + "Replace the last occurrence of OLD with NEW in LIST. + +Elements are compared using `equal'. + +See also: `-map-last'" + (declare (pure t) (side-effect-free t)) + (--map-last (equal old it) new list)) + +(defmacro --mapcat (form list) + "Anaphoric form of `-mapcat'." + (declare (debug (form form))) + `(apply #'append (--map ,form ,list))) + +(defun -mapcat (fn list) + "Return the concatenation of the result of mapping FN over LIST. +Thus function FN should return a list." + (declare (important-return-value t)) + (--mapcat (funcall fn it) list)) + +(defmacro --iterate (form init n) + "Anaphoric version of `-iterate'." + (declare (debug (form form form))) + (let ((res (make-symbol "result")) + (len (make-symbol "n"))) + `(let ((,len ,n)) + (when (> ,len 0) + (let* ((it ,init) + (,res (list it))) + (dotimes (_ (1- ,len)) + (push (setq it ,form) ,res)) + (nreverse ,res)))))) + +(defun -iterate (fun init n) + "Return a list of iterated applications of FUN to INIT. + +This means a list of the form: + + (INIT (FUN INIT) (FUN (FUN INIT)) ...) + +N is the length of the returned list." + (declare (important-return-value t)) + (--iterate (funcall fun it) init n)) + +(defun -flatten (l) + "Take a nested list L and return its contents as a single, flat list. + +Note that because nil represents a list of zero elements (an +empty list), any mention of nil in L will disappear after +flattening. If you need to preserve nils, consider `-flatten-n' +or map them to some unique symbol and then map them back. + +Conses of two atoms are considered \"terminals\", that is, they +aren't flattened further. + +See also: `-flatten-n'" + (declare (pure t) (side-effect-free t)) + (if (and (listp l) (listp (cdr l))) + (-mapcat '-flatten l) + (list l))) + +(defun -flatten-n (num list) + "Flatten NUM levels of a nested LIST. + +See also: `-flatten'" + (declare (pure t) (side-effect-free t)) + (dotimes (_ num) + (setq list (apply #'append (mapcar #'-list list)))) + list) + +(defalias '-concat #'append + "Concatenate all SEQUENCES and make the result a list. +The result is a list whose elements are the elements of all the arguments. +Each argument may be a list, vector or string. + +All arguments except the last argument are copied. The last argument +is just used as the tail of the new list. If the last argument is not +a list, this results in a dotted list. + +As an exception, if all the arguments except the last are nil, and the +last argument is not a list, the return value is that last argument +unaltered, not a list. + +\(fn &rest SEQUENCES)") + +(defalias '-copy #'copy-sequence + "Create a shallow copy of LIST. +The elements of LIST are not copied; they are shared with the original. +\n(fn LIST)") + +(defmacro --splice (pred form list) + "Splice lists generated by FORM in place of items satisfying PRED in LIST. + +Evaluate PRED for each element of LIST in turn bound to `it'. +Whenever the result of PRED is nil, leave that `it' is-is. +Otherwise, evaluate FORM with the same `it' binding still in +place. The result should be a (possibly empty) list of items to +splice in place of `it' in LIST. + +This can be useful as an alternative to the `,@' construct in a +`\\=`' structure, in case you need to splice several lists at +marked positions (for example with keywords). + +This is the anaphoric counterpart to `-splice'." + (declare (debug (form form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each ,list + (if ,pred + (--each ,form (push it ,r)) + (push it ,r))) + (nreverse ,r)))) + +(defun -splice (pred fun list) + "Splice lists generated by FUN in place of items satisfying PRED in LIST. + +Call PRED on each element of LIST. Whenever the result of PRED +is nil, leave that `it' as-is. Otherwise, call FUN on the same +`it' that satisfied PRED. The result should be a (possibly +empty) list of items to splice in place of `it' in LIST. + +This can be useful as an alternative to the `,@' construct in a +`\\=`' structure, in case you need to splice several lists at +marked positions (for example with keywords). + +This function's anaphoric counterpart is `--splice'. + +See also: `-splice-list', `-insert-at'." + (declare (important-return-value t)) + (--splice (funcall pred it) (funcall fun it) list)) + +(defun -splice-list (pred new-list list) + "Splice NEW-LIST in place of elements matching PRED in LIST. + +See also: `-splice', `-insert-at'" + (declare (important-return-value t)) + (-splice pred (lambda (_) new-list) list)) + +(defmacro --splice-list (pred new-list list) + "Anaphoric form of `-splice-list'." + (declare (debug (def-form form form))) + `(-splice-list (lambda (it) (ignore it) ,pred) ,new-list ,list)) + +(defun -cons* (&rest args) + "Make a new list from the elements of ARGS. +The last 2 elements of ARGS are used as the final cons of the +result, so if the final element of ARGS is not a list, the result +is a dotted list. With no ARGS, return nil." + (declare (side-effect-free t)) + (let* ((len (length args)) + (tail (nthcdr (- len 2) args)) + (last (cdr tail))) + (if (null last) + (car args) + (setcdr tail (car last)) + args))) + +(defun -snoc (list elem &rest elements) + "Append ELEM to the end of the list. + +This is like `cons', but operates on the end of list. + +If any ELEMENTS are given, append them to the list as well." + (declare (side-effect-free t)) + (-concat list (list elem) elements)) + +(defmacro --first (form list) + "Return the first item in LIST for which FORM evals to non-nil. +Return nil if no such element is found. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-first'." + (declare (debug (form form))) + (let ((n (make-symbol "needle"))) + `(let (,n) + (--each-while ,list (or (not ,form) + (ignore (setq ,n it)))) + ,n))) + +(defun -first (pred list) + "Return the first item in LIST for which PRED returns non-nil. +Return nil if no such element is found. + +To get the first item in the list no questions asked, +use `-first-item'. + +Alias: `-find'. + +This function's anaphoric counterpart is `--first'." + (declare (important-return-value t)) + (--first (funcall pred it) list)) + +(defalias '-find #'-first) +(defalias '--find '--first) + +(defmacro --some (form list) + "Return non-nil if FORM evals to non-nil for at least one item in LIST. +If so, return the first such result of FORM. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-some'." + (declare (debug (form form))) + (let ((n (make-symbol "needle"))) + `(let (,n) + (--each-while ,list (not (setq ,n ,form))) + ,n))) + +(defun -some (pred list) + "Return (PRED x) for the first LIST item where (PRED x) is non-nil, else nil. + +Alias: `-any'. + +This function's anaphoric counterpart is `--some'." + (declare (important-return-value t)) + (--some (funcall pred it) list)) + +(defalias '-any '-some) +(defalias '--any '--some) + +(defmacro --every (form list) + "Return non-nil if FORM evals to non-nil for all items in LIST. +If so, return the last such result of FORM. Otherwise, once an +item is reached for which FORM yields nil, return nil without +evaluating FORM for any further LIST elements. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. + +This macro is like `--every-p', but on success returns the last +non-nil result of FORM instead of just t. + +This is the anaphoric counterpart to `-every'." + (declare (debug (form form))) + (let ((a (make-symbol "all"))) + `(let ((,a t)) + (--each-while ,list (setq ,a ,form)) + ,a))) + +(defun -every (pred list) + "Return non-nil if PRED returns non-nil for all items in LIST. +If so, return the last such result of PRED. Otherwise, once an +item is reached for which PRED returns nil, return nil without +calling PRED on any further LIST elements. + +This function is like `-every-p', but on success returns the last +non-nil result of PRED instead of just t. + +This function's anaphoric counterpart is `--every'." + (declare (important-return-value t)) + (--every (funcall pred it) list)) + +(defmacro --last (form list) + "Anaphoric form of `-last'." + (declare (debug (form form))) + (let ((n (make-symbol "needle"))) + `(let (,n) + (--each ,list + (when ,form (setq ,n it))) + ,n))) + +(defun -last (pred list) + "Return the last x in LIST where (PRED x) is non-nil, else nil." + (declare (important-return-value t)) + (--last (funcall pred it) list)) + +(defalias '-first-item #'car + "Return the first item of LIST, or nil on an empty list. + +See also: `-second-item', `-last-item', etc. + +\(fn LIST)") + +;; Ensure that calls to `-first-item' are compiled to a single opcode, +;; just like `car'. +(put '-first-item 'byte-opcode 'byte-car) +(put '-first-item 'byte-compile 'byte-compile-one-arg) +(put '-first-item 'pure t) +(put '-first-item 'side-effect-free t) + +(defalias '-second-item #'cadr + "Return the second item of LIST, or nil if LIST is too short. + +See also: `-first-item', `-third-item', etc. + +\(fn LIST)") + +(put '-second-item 'pure t) +(put '-second-item 'side-effect-free t) + +(defalias '-third-item + (if (fboundp 'caddr) + #'caddr + (lambda (list) (car (cddr list)))) + "Return the third item of LIST, or nil if LIST is too short. + +See also: `-second-item', `-fourth-item', etc. + +\(fn LIST)") + +(put '-third-item 'pure t) +(put '-third-item 'side-effect-free t) + +(defalias '-fourth-item + (if (fboundp 'cadddr) + #'cadddr + (lambda (list) (cadr (cddr list)))) + "Return the fourth item of LIST, or nil if LIST is too short. + +See also: `-third-item', `-fifth-item', etc. + +\(fn LIST)") + +(put '-fourth-item 'pure t) +(put '-fourth-item 'side-effect-free t) + +(defun -fifth-item (list) + "Return the fifth item of LIST, or nil if LIST is too short. + +See also: `-fourth-item', `-last-item', etc." + (declare (pure t) (side-effect-free t)) + (car (cddr (cddr list)))) + +(defun -last-item (list) + "Return the last item of LIST, or nil on an empty list. + +See also: `-first-item', etc." + (declare (pure t) (side-effect-free t)) + (car (last list))) + +(static-if (fboundp 'gv-define-setter) + (gv-define-setter -last-item (val x) `(setcar (last ,x) ,val)) + (defsetf -last-item (x) (val) `(setcar (last ,x) ,val))) + +(defun -butlast (list) + "Return a list of all items in list except for the last." + ;; no alias as we don't want magic optional argument + (declare (pure t) (side-effect-free t)) + (butlast list)) + +(defmacro --count (pred list) + "Anaphoric form of `-count'." + (declare (debug (form form))) + (let ((r (make-symbol "result"))) + `(let ((,r 0)) + (--each ,list (when ,pred (setq ,r (1+ ,r)))) + ,r))) + +(defun -count (pred list) + "Counts the number of items in LIST where (PRED item) is non-nil." + (declare (important-return-value t)) + (--count (funcall pred it) list)) + +(defun ---truthy? (obj) + "Return OBJ as a boolean value (t or nil)." + (declare (pure t) (side-effect-free error-free)) + (and obj t)) + +(defmacro --any? (form list) + "Anaphoric form of `-any?'." + (declare (debug (form form))) + `(and (--some ,form ,list) t)) + +(defun -any? (pred list) + "Return t if (PRED X) is non-nil for any X in LIST, else nil. + +Alias: `-any-p', `-some?', `-some-p'" + (declare (important-return-value t)) + (--any? (funcall pred it) list)) + +(defalias '-some? '-any?) +(defalias '--some? '--any?) +(defalias '-any-p '-any?) +(defalias '--any-p '--any?) +(defalias '-some-p '-any?) +(defalias '--some-p '--any?) + +(defmacro --all? (form list) + "Return t if FORM evals to non-nil for all items in LIST. +Otherwise, once an item is reached for which FORM yields nil, +return nil without evaluating FORM for any further LIST elements. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. + +The similar macro `--every' is more widely useful, since it +returns the last non-nil result of FORM instead of just t on +success. + +Alias: `--all-p', `--every-p', `--every?'. + +This is the anaphoric counterpart to `-all?'." + (declare (debug (form form))) + `(and (--every ,form ,list) t)) + +(defun -all? (pred list) + "Return t if (PRED X) is non-nil for all X in LIST, else nil. +In the latter case, stop after the first X for which (PRED X) is +nil, without calling PRED on any subsequent elements of LIST. + +The similar function `-every' is more widely useful, since it +returns the last non-nil result of PRED instead of just t on +success. + +Alias: `-all-p', `-every-p', `-every?'. + +This function's anaphoric counterpart is `--all?'." + (declare (important-return-value t)) + (--all? (funcall pred it) list)) + +(defalias '-every? '-all?) +(defalias '--every? '--all?) +(defalias '-all-p '-all?) +(defalias '--all-p '--all?) +(defalias '-every-p '-all?) +(defalias '--every-p '--all?) + +(defmacro --none? (form list) + "Anaphoric form of `-none?'." + (declare (debug (form form))) + `(--all? (not ,form) ,list)) + +(defun -none? (pred list) + "Return t if (PRED X) is nil for all X in LIST, else nil. + +Alias: `-none-p'" + (declare (important-return-value t)) + (--none? (funcall pred it) list)) + +(defalias '-none-p '-none?) +(defalias '--none-p '--none?) + +(defmacro --only-some? (form list) + "Anaphoric form of `-only-some?'." + (declare (debug (form form))) + (let ((y (make-symbol "yes")) + (n (make-symbol "no"))) + `(let (,y ,n) + (--each-while ,list (not (and ,y ,n)) + (if ,form (setq ,y t) (setq ,n t))) + (---truthy? (and ,y ,n))))) + +(defun -only-some? (pred list) + "Return t if different LIST items both satisfy and do not satisfy PRED. +That is, if PRED returns both nil for at least one item, and +non-nil for at least one other item in LIST. Return nil if all +items satisfy the predicate or none of them do. + +Alias: `-only-some-p'" + (declare (important-return-value t)) + (--only-some? (funcall pred it) list)) + +(defalias '-only-some-p '-only-some?) +(defalias '--only-some-p '--only-some?) + +(defun -slice (list from &optional to step) + "Return copy of LIST, starting from index FROM to index TO. + +FROM or TO may be negative. These values are then interpreted +modulo the length of the list. + +If STEP is a number, only each STEPth item in the resulting +section is returned. Defaults to 1." + (declare (side-effect-free t)) + (let ((length (length list)) + (new-list nil)) + ;; to defaults to the end of the list + (setq to (or to length)) + (setq step (or step 1)) + ;; handle negative indices + (when (< from 0) + (setq from (mod from length))) + (when (< to 0) + (setq to (mod to length))) + + ;; iterate through the list, keeping the elements we want + (--each-while list (< it-index to) + (when (and (>= it-index from) + (= (mod (- from it-index) step) 0)) + (push it new-list))) + (nreverse new-list))) + +(defmacro --take-while (form list) + "Take successive items from LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. Return a new +list of the successive elements from the start of LIST for which +FORM evaluates to non-nil. +This is the anaphoric counterpart to `-take-while'." + (declare (debug (form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each-while ,list ,form (push it ,r)) + (nreverse ,r)))) + +(defun -take-while (pred list) + "Take successive items from LIST for which PRED returns non-nil. +PRED is a function of one argument. Return a new list of the +successive elements from the start of LIST for which PRED returns +non-nil. + +This function's anaphoric counterpart is `--take-while'. + +For another variant, see also `-drop-while'." + (declare (important-return-value t)) + (--take-while (funcall pred it) list)) + +(defmacro --drop-while (form list) + "Drop successive items from LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. Return the +tail (not a copy) of LIST starting from its first element for +which FORM evaluates to nil. +This is the anaphoric counterpart to `-drop-while'." + (declare (debug (form form))) + (let ((l (make-symbol "list"))) + `(let ((,l ,list)) + (--each-while ,l ,form (pop ,l)) + ,l))) + +(defun -drop-while (pred list) + "Drop successive items from LIST for which PRED returns non-nil. +PRED is a function of one argument. Return the tail (not a copy) +of LIST starting from its first element for which PRED returns +nil. + +This function's anaphoric counterpart is `--drop-while'. + +For another variant, see also `-take-while'." + (declare (important-return-value t)) + (--drop-while (funcall pred it) list)) + +;; Added in Emacs 29. +(static-if (fboundp 'take) + (defun dash--take (n list) + "Return the first N elements of LIST. +Like `take', but ensure result is fresh." + (let ((prefix (take n list))) + (if (eq prefix list) + ;; If same list is returned, make a copy. + (copy-sequence prefix) + prefix)))) + +(defun -take (n list) + "Return a copy of the first N items in LIST. +Return a copy of LIST if it contains N items or fewer. +Return nil if N is zero or less. + +See also: `-take-last'." + (declare (side-effect-free t)) + (static-if (fboundp 'dash--take) + (dash--take n list) + (--take-while (< it-index n) list))) + +(defun -take-last (n list) + "Return a copy of the last N items of LIST in order. +Return a copy of LIST if it contains N items or fewer. +Return nil if N is zero or less. + +See also: `-take'." + (declare (side-effect-free t)) + (copy-sequence (last list n))) + +(defalias '-drop #'nthcdr + "Return the tail (not a copy) of LIST without the first N items. +Return nil if LIST contains N items or fewer. +Return LIST if N is zero or less. + +For another variant, see also `-drop-last'. +\n(fn N LIST)") + +(defun -drop-last (n list) + "Return a copy of LIST without its last N items. +Return a copy of LIST if N is zero or less. +Return nil if LIST contains N items or fewer. + +See also: `-drop'." + (declare (side-effect-free t)) + (static-if (fboundp 'dash--take) + (dash--take (- (length list) n) list) + (nbutlast (copy-sequence list) n))) + +(defun -split-at (n list) + "Split LIST into two sublists after the Nth element. +The result is a list of two elements (TAKE DROP) where TAKE is a +new list of the first N elements of LIST, and DROP is the +remaining elements of LIST (not a copy). TAKE and DROP are like +the results of `-take' and `-drop', respectively, but the split +is done in a single list traversal." + (declare (side-effect-free t)) + (let (result) + (--each-while list (< it-index n) + (push (pop list) result)) + (list (nreverse result) list))) + +(defun -rotate (n list) + "Rotate LIST N places to the right (left if N is negative). +The time complexity is O(n)." + (declare (pure t) (side-effect-free t)) + (cond ((null list) ()) + ((zerop n) (copy-sequence list)) + ((let* ((len (length list)) + (n-mod-len (mod n len)) + (new-tail-len (- len n-mod-len))) + (append (nthcdr new-tail-len list) (-take new-tail-len list)))))) + +(defun -insert-at (n x list) + "Return a list with X inserted into LIST at position N. + +See also: `-splice', `-splice-list'" + (declare (pure t) (side-effect-free t)) + (let ((split-list (-split-at n list))) + (nconc (car split-list) (cons x (cadr split-list))))) + +(defun -replace-at (n x list) + "Return a list with element at Nth position in LIST replaced with X. + +See also: `-replace'" + (declare (pure t) (side-effect-free t)) + (let ((split-list (-split-at n list))) + (nconc (car split-list) (cons x (cdr (cadr split-list)))))) + +(defun -update-at (n func list) + "Use FUNC to update the Nth element of LIST. +Return a copy of LIST where the Nth element is replaced with the +result of calling FUNC on it. + +See also: `-map-when'" + (declare (important-return-value t)) + (let ((split-list (-split-at n list))) + (nconc (car split-list) + (cons (funcall func (car (cadr split-list))) + (cdr (cadr split-list)))))) + +(defmacro --update-at (n form list) + "Anaphoric version of `-update-at'." + (declare (debug (form def-form form))) + `(-update-at ,n (lambda (it) (ignore it) ,form) ,list)) + +(defun -remove-at (n list) + "Return LIST with its element at index N removed. +That is, remove any element selected as (nth N LIST) from LIST +and return the result. + +This is a non-destructive operation: parts of LIST (but not +necessarily all of it) are copied as needed to avoid +destructively modifying it. + +See also: `-remove-at-indices', `-remove'." + (declare (pure t) (side-effect-free t)) + (if (zerop n) + (cdr list) + (--remove-first (= it-index n) list))) + +(defun -remove-at-indices (indices list) + "Return LIST with its elements at INDICES removed. +That is, for each index I in INDICES, remove any element selected +as (nth I LIST) from LIST. + +This is a non-destructive operation: parts of LIST (but not +necessarily all of it) are copied as needed to avoid +destructively modifying it. + +See also: `-remove-at', `-remove'." + (declare (pure t) (side-effect-free t)) + (setq indices (--drop-while (< it 0) (-sort #'< indices))) + (let ((i (pop indices)) res) + (--each-while list i + (pop list) + (if (/= it-index i) + (push it res) + (while (and indices (= (car indices) i)) + (pop indices)) + (setq i (pop indices)))) + (nconc (nreverse res) list))) + +(defmacro --split-with (pred list) + "Anaphoric form of `-split-with'." + (declare (debug (form form))) + (let ((l (make-symbol "list")) + (r (make-symbol "result")) + (c (make-symbol "continue"))) + `(let ((,l ,list) + (,r nil) + (,c t)) + (while (and ,l ,c) + (let ((it (car ,l))) + (if (not ,pred) + (setq ,c nil) + (!cons it ,r) + (!cdr ,l)))) + (list (nreverse ,r) ,l)))) + +(defun -split-with (pred list) + "Split LIST into a prefix satisfying PRED, and the rest. +The first sublist is the prefix of LIST with successive elements +satisfying PRED, and the second sublist is the remaining elements +that do not. The result is like performing + + ((-take-while PRED LIST) (-drop-while PRED LIST)) + +but in no more than a single pass through LIST." + (declare (important-return-value t)) + (--split-with (funcall pred it) list)) + +(defmacro -split-on (item list) + "Split the LIST each time ITEM is found. + +Unlike `-partition-by', the ITEM is discarded from the results. +Empty lists are also removed from the result. + +Comparison is done by `equal'. + +See also `-split-when'" + (declare (debug (def-form form))) + `(-split-when (lambda (it) (equal it ,item)) ,list)) + +(defmacro --split-when (form list) + "Anaphoric version of `-split-when'." + (declare (debug (def-form form))) + `(-split-when (lambda (it) (ignore it) ,form) ,list)) + +(defun -split-when (fn list) + "Split the LIST on each element where FN returns non-nil. + +Unlike `-partition-by', the \"matched\" element is discarded from +the results. Empty lists are also removed from the result. + +This function can be thought of as a generalization of +`split-string'." + (declare (important-return-value t)) + (let (r s) + (while list + (if (not (funcall fn (car list))) + (push (car list) s) + (when s (push (nreverse s) r)) + (setq s nil)) + (!cdr list)) + (when s (push (nreverse s) r)) + (nreverse r))) + +(defmacro --separate (form list) + "Anaphoric form of `-separate'." + (declare (debug (form form))) + (let ((y (make-symbol "yes")) + (n (make-symbol "no"))) + `(let (,y ,n) + (--each ,list (if ,form (!cons it ,y) (!cons it ,n))) + (list (nreverse ,y) (nreverse ,n))))) + +(defun -separate (pred list) + "Split LIST into two sublists based on whether items satisfy PRED. +The result is like performing + + ((-filter PRED LIST) (-remove PRED LIST)) + +but in a single pass through LIST." + (declare (important-return-value t)) + (--separate (funcall pred it) list)) + +(defun dash--partition-all-in-steps-reversed (n step list) + "Like `-partition-all-in-steps', but the result is reversed." + (when (< step 1) + (signal 'wrong-type-argument + `("Step size < 1 results in juicy infinite loops" ,step))) + (let (result) + (while list + (push (-take n list) result) + (setq list (nthcdr step list))) + result)) + +(defun -partition-all-in-steps (n step list) + "Partition LIST into sublists of length N that are STEP items apart. +Adjacent groups may overlap if N exceeds the STEP stride. +Trailing groups may contain less than N items." + (declare (pure t) (side-effect-free t)) + (nreverse (dash--partition-all-in-steps-reversed n step list))) + +(defun -partition-in-steps (n step list) + "Partition LIST into sublists of length N that are STEP items apart. +Like `-partition-all-in-steps', but if there are not enough items +to make the last group N-sized, those items are discarded." + (declare (pure t) (side-effect-free t)) + (let ((result (dash--partition-all-in-steps-reversed n step list))) + (while (and result (< (length (car result)) n)) + (pop result)) + (nreverse result))) + +(defun -partition-all (n list) + "Return a new list with the items in LIST grouped into N-sized sublists. +The last group may contain less than N items." + (declare (pure t) (side-effect-free t)) + (-partition-all-in-steps n n list)) + +(defun -partition (n list) + "Return a new list with the items in LIST grouped into N-sized sublists. +If there are not enough items to make the last group N-sized, +those items are discarded." + (declare (pure t) (side-effect-free t)) + (-partition-in-steps n n list)) + +(defmacro --partition-by (form list) + "Anaphoric form of `-partition-by'." + (declare (debug (form form))) + (let ((r (make-symbol "result")) + (s (make-symbol "sublist")) + (v (make-symbol "value")) + (n (make-symbol "new-value")) + (l (make-symbol "list"))) + `(let ((,l ,list)) + (when ,l + (let* ((,r nil) + (it (car ,l)) + (,s (list it)) + (,v ,form) + (,l (cdr ,l))) + (while ,l + (let* ((it (car ,l)) + (,n ,form)) + (unless (equal ,v ,n) + (!cons (nreverse ,s) ,r) + (setq ,s nil) + (setq ,v ,n)) + (!cons it ,s) + (!cdr ,l))) + (!cons (nreverse ,s) ,r) + (nreverse ,r)))))) + +(defun -partition-by (fn list) + "Apply FN to each item in LIST, splitting it each time FN returns a new value." + (declare (important-return-value t)) + (--partition-by (funcall fn it) list)) + +(defmacro --partition-by-header (form list) + "Anaphoric form of `-partition-by-header'." + (declare (debug (form form))) + (let ((r (make-symbol "result")) + (s (make-symbol "sublist")) + (h (make-symbol "header-value")) + (b (make-symbol "seen-body?")) + (n (make-symbol "new-value")) + (l (make-symbol "list"))) + `(let ((,l ,list)) + (when ,l + (let* ((,r nil) + (it (car ,l)) + (,s (list it)) + (,h ,form) + (,b nil) + (,l (cdr ,l))) + (while ,l + (let* ((it (car ,l)) + (,n ,form)) + (if (equal ,h ,n) + (when ,b + (!cons (nreverse ,s) ,r) + (setq ,s nil) + (setq ,b nil)) + (setq ,b t)) + (!cons it ,s) + (!cdr ,l))) + (!cons (nreverse ,s) ,r) + (nreverse ,r)))))) + +(defun -partition-by-header (fn list) + "Apply FN to the first item in LIST. That is the header +value. Apply FN to each item in LIST, splitting it each time FN +returns the header value, but only after seeing at least one +other value (the body)." + (declare (important-return-value t)) + (--partition-by-header (funcall fn it) list)) + +(defmacro --partition-after-pred (form list) + "Partition LIST after each element for which FORM evaluates to non-nil. +Each element of LIST in turn is bound to `it' before evaluating +FORM. + +This is the anaphoric counterpart to `-partition-after-pred'." + (let ((l (make-symbol "list")) + (r (make-symbol "result")) + (s (make-symbol "sublist"))) + `(let ((,l ,list) ,r ,s) + (when ,l + (--each ,l + (push it ,s) + (when ,form + (push (nreverse ,s) ,r) + (setq ,s ()))) + (when ,s + (push (nreverse ,s) ,r)) + (nreverse ,r))))) + +(defun -partition-after-pred (pred list) + "Partition LIST after each element for which PRED returns non-nil. + +This function's anaphoric counterpart is `--partition-after-pred'." + (declare (important-return-value t)) + (--partition-after-pred (funcall pred it) list)) + +(defun -partition-before-pred (pred list) + "Partition directly before each time PRED is true on an element of LIST." + (declare (important-return-value t)) + (nreverse (-map #'reverse + (-partition-after-pred pred (reverse list))))) + +(defun -partition-after-item (item list) + "Partition directly after each time ITEM appears in LIST." + (declare (pure t) (side-effect-free t)) + (-partition-after-pred (lambda (ele) (equal ele item)) + list)) + +(defun -partition-before-item (item list) + "Partition directly before each time ITEM appears in LIST." + (declare (pure t) (side-effect-free t)) + (-partition-before-pred (lambda (ele) (equal ele item)) + list)) + +(defmacro --group-by (form list) + "Anaphoric form of `-group-by'." + (declare (debug t)) + (let ((n (make-symbol "n")) + (k (make-symbol "k")) + (grp (make-symbol "grp"))) + `(nreverse + (-map + (lambda (,n) + (cons (car ,n) + (nreverse (cdr ,n)))) + (--reduce-from + (let* ((,k (,@form)) + (,grp (assoc ,k acc))) + (if ,grp + (setcdr ,grp (cons it (cdr ,grp))) + (push + (list ,k it) + acc)) + acc) + nil ,list))))) + +(defun -group-by (fn list) + "Separate LIST into an alist whose keys are FN applied to the +elements of LIST. Keys are compared by `equal'." + (declare (important-return-value t)) + (--group-by (funcall fn it) list)) + +(defun -interpose (sep list) + "Return a new list of all elements in LIST separated by SEP." + (declare (side-effect-free t)) + (let (result) + (when list + (!cons (car list) result) + (!cdr list)) + (while list + (setq result (cons (car list) (cons sep result))) + (!cdr list)) + (nreverse result))) + +(defun -interleave (&rest lists) + "Return a new list of the first item in each list, then the second etc." + (declare (side-effect-free t)) + (when lists + (let (result) + (while (-none? 'null lists) + (--each lists (!cons (car it) result)) + (setq lists (-map 'cdr lists))) + (nreverse result)))) + +(defmacro --zip-with (form list1 list2) + "Zip LIST1 and LIST2 into a new list according to FORM. +That is, evaluate FORM for each item pair from the two lists, and +return the list of results. The result is as long as the shorter +list. + +Each element of LIST1 and each element of LIST2 in turn are bound +pairwise to `it' and `other', respectively, and their index +within the list to `it-index', before evaluating FORM. + +This is the anaphoric counterpart to `-zip-with'." + (declare (debug (form form form))) + (let ((r (make-symbol "result")) + (l2 (make-symbol "list2"))) + `(let ((,l2 ,list2) ,r) + (--each-while ,list1 ,l2 + (let ((other (pop ,l2))) + (ignore other) + (push ,form ,r))) + (nreverse ,r)))) + +(defun -zip-with (fn list1 list2) + "Zip LIST1 and LIST2 into a new list using the function FN. +That is, apply FN pairwise taking as first argument the next +element of LIST1 and as second argument the next element of LIST2 +at the corresponding position. The result is as long as the +shorter list. + +This function's anaphoric counterpart is `--zip-with'. + +For other zips, see also `-zip-lists' and `-zip-fill'." + (declare (important-return-value t)) + (--zip-with (funcall fn it other) list1 list2)) + +(defun -zip-lists (&rest lists) + "Zip LISTS together. + +Group the head of each list, followed by the second element of +each list, and so on. The number of returned groupings is equal +to the length of the shortest input list, and the length of each +grouping is equal to the number of input LISTS. + +The return value is always a list of proper lists, in contrast to +`-zip' which returns a list of dotted pairs when only two input +LISTS are provided. + +See also: `-zip-pair'." + (declare (pure t) (side-effect-free t)) + (when lists + (let (results) + (while (--every it lists) + (push (mapcar #'car lists) results) + (setq lists (mapcar #'cdr lists))) + (nreverse results)))) + +(defun -zip-lists-fill (fill-value &rest lists) + "Zip LISTS together, padding shorter lists with FILL-VALUE. +This is like `-zip-lists' (which see), except it retains all +elements at positions beyond the end of the shortest list. The +number of returned groupings is equal to the length of the +longest input list, and the length of each grouping is equal to +the number of input LISTS." + (declare (pure t) (side-effect-free t)) + (when lists + (let (results) + (while (--some it lists) + (push (--map (if it (car it) fill-value) lists) results) + (setq lists (mapcar #'cdr lists))) + (nreverse results)))) + +(defun -unzip-lists (lists) + "Unzip LISTS. + +This works just like `-zip-lists' (which see), but takes a list +of lists instead of a variable number of arguments, such that + + (-unzip-lists (-zip-lists ARGS...)) + +is identity (given that the lists comprising ARGS are of the same +length)." + (declare (pure t) (side-effect-free t)) + (apply #'-zip-lists lists)) + +(defalias 'dash--length= + (if (fboundp 'length=) + #'length= + (lambda (list length) + (cond ((< length 0) nil) + ((zerop length) (null list)) + ((let ((last (nthcdr (1- length) list))) + (and last (null (cdr last)))))))) + "Return non-nil if LIST is of LENGTH. +This is a compatibility shim for `length=' in Emacs 28. +\n(fn LIST LENGTH)") + +(defun dash--zip-lists-or-pair (_form &rest lists) + "Return a form equivalent to applying `-zip' to LISTS. +This `compiler-macro' warns about discouraged `-zip' usage and +delegates to `-zip-lists' or `-zip-pair' depending on the number +of LISTS." + (if (not (dash--length= lists 2)) + (cons #'-zip-lists lists) + (let ((pair (cons #'-zip-pair lists)) + (msg "Use -zip-pair instead of -zip to get a list of pairs")) + (if (fboundp 'macroexp-warn-and-return) + (macroexp-warn-and-return msg pair) + (message msg) + pair)))) + +(defun -zip (&rest lists) + "Zip LISTS together. + +Group the head of each list, followed by the second element of +each list, and so on. The number of returned groupings is equal +to the length of the shortest input list, and the number of items +in each grouping is equal to the number of input LISTS. + +If only two LISTS are provided as arguments, return the groupings +as a list of dotted pairs. Otherwise, return the groupings as a +list of proper lists. + +Since the return value changes form depending on the number of +arguments, it is generally recommended to use `-zip-lists' +instead, or `-zip-pair' if a list of dotted pairs is desired. + +See also: `-unzip'." + (declare (compiler-macro dash--zip-lists-or-pair) + (pure t) (side-effect-free t)) + ;; For backward compatibility, return a list of dotted pairs if two + ;; arguments were provided. + (apply (if (dash--length= lists 2) #'-zip-pair #'-zip-lists) lists)) + +(defun -zip-pair (&rest lists) + "Zip LIST1 and LIST2 together. + +Make a pair with the head of each list, followed by a pair with +the second element of each list, and so on. The number of pairs +returned is equal to the length of the shorter input list. + +See also: `-zip-lists'." + (declare (advertised-calling-convention (list1 list2) "2.20.0") + (pure t) (side-effect-free t)) + (if (dash--length= lists 2) + (--zip-with (cons it other) (car lists) (cadr lists)) + (apply #'-zip-lists lists))) + +(defun -zip-fill (fill-value &rest lists) + "Zip LISTS together, padding shorter lists with FILL-VALUE. +This is like `-zip' (which see), except it retains all elements +at positions beyond the end of the shortest list. The number of +returned groupings is equal to the length of the longest input +list, and the length of each grouping is equal to the number of +input LISTS. + +Since the return value changes form depending on the number of +arguments, it is generally recommended to use `-zip-lists-fill' +instead, unless a list of dotted pairs is explicitly desired." + (declare (pure t) (side-effect-free t)) + (cond ((null lists) ()) + ((dash--length= lists 2) + (let ((list1 (car lists)) + (list2 (cadr lists)) + results) + (while (or list1 list2) + (push (cons (if list1 (pop list1) fill-value) + (if list2 (pop list2) fill-value)) + results)) + (nreverse results))) + ((apply #'-zip-lists-fill fill-value lists)))) + +(defun -unzip (lists) + "Unzip LISTS. + +This works just like `-zip' (which see), but takes a list of +lists instead of a variable number of arguments, such that + + (-unzip (-zip L1 L2 L3 ...)) + +is identity (given that the lists are of the same length, and +that `-zip' is not called with two arguments, because of the +caveat described in its docstring). + +Note in particular that calling `-unzip' on a list of two lists +will return a list of dotted pairs. + +Since the return value changes form depending on the number of +LISTS, it is generally recommended to use `-unzip-lists' instead." + (declare (pure t) (side-effect-free t)) + (apply #'-zip lists)) + +(defun -cycle (list) + "Return an infinite circular copy of LIST. +The returned list cycles through the elements of LIST and repeats +from the beginning." + (declare (pure t) (side-effect-free t)) + ;; Also works with sequences that aren't lists. + (let ((newlist (append list ()))) + (nconc newlist newlist))) + +(defun -pad (fill-value &rest lists) + "Pad each of LISTS with FILL-VALUE until they all have equal lengths. + +Ensure all LISTS are as long as the longest one by repeatedly +appending FILL-VALUE to the shorter lists, and return the +resulting LISTS." + (declare (pure t) (side-effect-free t)) + (let* ((lens (mapcar #'length lists)) + (maxlen (apply #'max 0 lens))) + (--map (append it (make-list (- maxlen (pop lens)) fill-value)) lists))) + +(defmacro --annotate (form list) + "Pair each item in LIST with the result of evaluating FORM. + +Return an alist of (RESULT . ITEM), where each ITEM is the +corresponding element of LIST, and RESULT is the value obtained +by evaluating FORM with ITEM bound to `it'. + +This is the anaphoric counterpart to `-annotate'." + (declare (debug (form form))) + `(--map (cons ,form it) ,list)) + +(defun -annotate (fn list) + "Pair each item in LIST with the result of passing it to FN. + +Return an alist of (RESULT . ITEM), where each ITEM is the +corresponding element of LIST, and RESULT is the value obtained +by calling FN on ITEM. + +This function's anaphoric counterpart is `--annotate'." + (declare (important-return-value t)) + (--annotate (funcall fn it) list)) + +(defun dash--table-carry (lists restore-lists &optional re) + "Helper for `-table' and `-table-flat'. + +If a list overflows, carry to the right and reset the list." + (while (not (or (car lists) + (equal lists '(nil)))) + (setcar lists (car restore-lists)) + (pop (cadr lists)) + (!cdr lists) + (!cdr restore-lists) + (when re + (push (nreverse (car re)) (cadr re)) + (setcar re nil) + (!cdr re)))) + +(defun -table (fn &rest lists) + "Compute outer product of LISTS using function FN. + +The function FN should have the same arity as the number of +supplied lists. + +The outer product is computed by applying fn to all possible +combinations created by taking one element from each list in +order. The dimension of the result is (length lists). + +See also: `-table-flat'" + (declare (important-return-value t)) + (let ((restore-lists (copy-sequence lists)) + (last-list (last lists)) + (re (make-list (length lists) nil))) + (while (car last-list) + (let ((item (apply fn (-map 'car lists)))) + (push item (car re)) + (setcar lists (cdar lists)) ;; silence byte compiler + (dash--table-carry lists restore-lists re))) + (nreverse (car (last re))))) + +(defun -table-flat (fn &rest lists) + "Compute flat outer product of LISTS using function FN. + +The function FN should have the same arity as the number of +supplied lists. + +The outer product is computed by applying fn to all possible +combinations created by taking one element from each list in +order. The results are flattened, ignoring the tensor structure +of the result. This is equivalent to calling: + + (-flatten-n (1- (length lists)) (apply \\='-table fn lists)) + +but the implementation here is much more efficient. + +See also: `-flatten-n', `-table'" + (declare (important-return-value t)) + (let ((restore-lists (copy-sequence lists)) + (last-list (last lists)) + re) + (while (car last-list) + (let ((item (apply fn (-map 'car lists)))) + (push item re) + (setcar lists (cdar lists)) ;; silence byte compiler + (dash--table-carry lists restore-lists))) + (nreverse re))) + +(defmacro --find-index (form list) + "Return the first index in LIST for which FORM evals to non-nil. +Return nil if no such index is found. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-find-index'." + (declare (debug (form form))) + `(--some (and ,form it-index) ,list)) + +(defun -find-index (pred list) + "Return the index of the first item satisfying PRED in LIST. +Return nil if no such item is found. + +PRED is called with one argument, the current list element, until +it returns non-nil, at which point the search terminates. + +This function's anaphoric counterpart is `--find-index'. + +See also: `-first', `-find-last-index'." + (declare (important-return-value t)) + (--find-index (funcall pred it) list)) + +(defun -elem-index (elem list) + "Return the first index of ELEM in LIST. +That is, the index within LIST of the first element that is +`equal' to ELEM. Return nil if there is no such element. + +See also: `-find-index'." + (declare (pure t) (side-effect-free t)) + (--find-index (equal elem it) list)) + +(defmacro --find-indices (form list) + "Return the list of indices in LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-find-indices'." + (declare (debug (form form))) + `(--keep (and ,form it-index) ,list)) + +(defun -find-indices (pred list) + "Return the list of indices in LIST satisfying PRED. + +Each element of LIST in turn is passed to PRED. If the result is +non-nil, the index of that element in LIST is included in the +result. The returned indices are in ascending order, i.e., in +the same order as they appear in LIST. + +This function's anaphoric counterpart is `--find-indices'. + +See also: `-find-index', `-elem-indices'." + (declare (important-return-value t)) + (--find-indices (funcall pred it) list)) + +(defun -elem-indices (elem list) + "Return the list of indices at which ELEM appears in LIST. +That is, the indices of all elements of LIST `equal' to ELEM, in +the same ascending order as they appear in LIST." + (declare (pure t) (side-effect-free t)) + (--find-indices (equal elem it) list)) + +(defmacro --find-last-index (form list) + "Return the last index in LIST for which FORM evals to non-nil. +Return nil if no such index is found. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-find-last-index'." + (declare (debug (form form))) + (let ((i (make-symbol "index"))) + `(let (,i) + (--each ,list + (when ,form (setq ,i it-index))) + ,i))) + +(defun -find-last-index (pred list) + "Return the index of the last item satisfying PRED in LIST. +Return nil if no such item is found. + +Predicate PRED is called with one argument each time, namely the +current list element. + +This function's anaphoric counterpart is `--find-last-index'. + +See also: `-last', `-find-index'." + (declare (important-return-value t)) + (--find-last-index (funcall pred it) list)) + +(defun -select-by-indices (indices list) + "Return a list whose elements are elements from LIST selected +as `(nth i list)` for all i from INDICES." + (declare (pure t) (side-effect-free t)) + (let (r) + (--each indices + (!cons (nth it list) r)) + (nreverse r))) + +(defun -select-columns (columns table) + "Select COLUMNS from TABLE. + +TABLE is a list of lists where each element represents one row. +It is assumed each row has the same length. + +Each row is transformed such that only the specified COLUMNS are +selected. + +See also: `-select-column', `-select-by-indices'" + (declare (pure t) (side-effect-free t)) + (--map (-select-by-indices columns it) table)) + +(defun -select-column (column table) + "Select COLUMN from TABLE. + +TABLE is a list of lists where each element represents one row. +It is assumed each row has the same length. + +The single selected column is returned as a list. + +See also: `-select-columns', `-select-by-indices'" + (declare (pure t) (side-effect-free t)) + (--mapcat (-select-by-indices (list column) it) table)) + +(defmacro -> (x &optional form &rest more) + "Thread the expr through the forms. Insert X as the second item +in the first form, making a list of it if it is not a list +already. If there are more forms, insert the first form as the +second item in second form, etc." + (declare (debug (form &rest [&or symbolp (sexp &rest form)]))) + (cond + ((null form) x) + ((null more) (if (listp form) + `(,(car form) ,x ,@(cdr form)) + (list form x))) + (:else `(-> (-> ,x ,form) ,@more)))) + +(defmacro ->> (x &optional form &rest more) + "Thread the expr through the forms. Insert X as the last item +in the first form, making a list of it if it is not a list +already. If there are more forms, insert the first form as the +last item in second form, etc." + (declare (debug ->)) + (cond + ((null form) x) + ((null more) (if (listp form) + `(,@form ,x) + (list form x))) + (:else `(->> (->> ,x ,form) ,@more)))) + +(defmacro --> (x &rest forms) + "Starting with the value of X, thread each expression through FORMS. + +Insert X at the position signified by the symbol `it' in the first +form. If there are more forms, insert the first form at the position +signified by `it' in the second form, etc." + (declare (debug (form body))) + `(-as-> ,x it ,@forms)) + +(defmacro -as-> (value variable &rest forms) + "Starting with VALUE, thread VARIABLE through FORMS. + +In the first form, bind VARIABLE to VALUE. In the second form, bind +VARIABLE to the result of the first form, and so forth." + (declare (debug (form symbolp body))) + (if (null forms) + `,value + `(let ((,variable ,value)) + (-as-> ,(if (symbolp (car forms)) + (list (car forms) variable) + (car forms)) + ,variable + ,@(cdr forms))))) + +(defmacro -some-> (x &optional form &rest more) + "When expr is non-nil, thread it through the first form (via `->'), +and when that result is non-nil, through the next form, etc." + (declare (debug ->) + (indent 1)) + (if (null form) x + (let ((result (make-symbol "result"))) + `(-some-> (-when-let (,result ,x) + (-> ,result ,form)) + ,@more)))) + +(defmacro -some->> (x &optional form &rest more) + "When expr is non-nil, thread it through the first form (via `->>'), +and when that result is non-nil, through the next form, etc." + (declare (debug ->) + (indent 1)) + (if (null form) x + (let ((result (make-symbol "result"))) + `(-some->> (-when-let (,result ,x) + (->> ,result ,form)) + ,@more)))) + +(defmacro -some--> (expr &rest forms) + "Thread EXPR through FORMS via `-->', while the result is non-nil. +When EXPR evaluates to non-nil, thread the result through the +first of FORMS, and when that result is non-nil, thread it +through the next form, etc." + (declare (debug (form &rest &or symbolp consp)) (indent 1)) + (if (null forms) expr + (let ((result (make-symbol "result"))) + `(-some--> (-when-let (,result ,expr) + (--> ,result ,(car forms))) + ,@(cdr forms))))) + +(defmacro -doto (init &rest forms) + "Evaluate INIT and pass it as argument to FORMS with `->'. +The RESULT of evaluating INIT is threaded through each of FORMS +individually using `->', which see. The return value is RESULT, +which FORMS may have modified by side effect." + (declare (debug (form &rest &or symbolp consp)) (indent 1)) + (let ((retval (make-symbol "result"))) + `(let ((,retval ,init)) + ,@(mapcar (lambda (form) `(-> ,retval ,form)) forms) + ,retval))) + +(defmacro --doto (init &rest forms) + "Anaphoric form of `-doto'. +This just evaluates INIT, binds the result to `it', evaluates +FORMS, and returns the final value of `it'. +Note: `it' need not be used in each form." + (declare (debug (form body)) (indent 1)) + `(let ((it ,init)) + ,@forms + it)) + +(defun -grade-up (comparator list) + "Grade elements of LIST using COMPARATOR relation. +This yields a permutation vector such that applying this +permutation to LIST sorts it in ascending order." + (declare (important-return-value t)) + (->> (--map-indexed (cons it it-index) list) + (-sort (lambda (it other) (funcall comparator (car it) (car other)))) + (mapcar #'cdr))) + +(defun -grade-down (comparator list) + "Grade elements of LIST using COMPARATOR relation. +This yields a permutation vector such that applying this +permutation to LIST sorts it in descending order." + (declare (important-return-value t)) + (->> (--map-indexed (cons it it-index) list) + (-sort (lambda (it other) (funcall comparator (car other) (car it)))) + (mapcar #'cdr))) + +(defvar dash--source-counter 0 + "Monotonic counter for generated symbols.") + +(defun dash--match-make-source-symbol () + "Generate a new dash-source symbol. + +All returned symbols are guaranteed to be unique." + (prog1 (make-symbol (format "--dash-source-%d--" dash--source-counter)) + (setq dash--source-counter (1+ dash--source-counter)))) + +(defun dash--match-ignore-place-p (symbol) + "Return non-nil if SYMBOL is a symbol and starts with _." + (and (symbolp symbol) + (eq (aref (symbol-name symbol) 0) ?_))) + +(defun dash--match-cons-skip-cdr (skip-cdr source) + "Helper function generating idiomatic shifting code." + (cond + ((= skip-cdr 0) + `(pop ,source)) + (t + `(prog1 ,(dash--match-cons-get-car skip-cdr source) + (setq ,source ,(dash--match-cons-get-cdr (1+ skip-cdr) source)))))) + +(defun dash--match-cons-get-car (skip-cdr source) + "Helper function generating idiomatic code to get nth car." + (cond + ((= skip-cdr 0) + `(car ,source)) + ((= skip-cdr 1) + `(cadr ,source)) + (t + `(nth ,skip-cdr ,source)))) + +(defun dash--match-cons-get-cdr (skip-cdr source) + "Helper function generating idiomatic code to get nth cdr." + (cond + ((= skip-cdr 0) + source) + ((= skip-cdr 1) + `(cdr ,source)) + (t + `(nthcdr ,skip-cdr ,source)))) + +(defun dash--match-cons (match-form source) + "Setup a cons matching environment and call the real matcher." + (let ((s (dash--match-make-source-symbol)) + (n 0) + (m match-form)) + (while (and (consp m) + (dash--match-ignore-place-p (car m))) + (setq n (1+ n)) (!cdr m)) + (cond + ;; when we only have one pattern in the list, we don't have to + ;; create a temporary binding (--dash-source--) for the source + ;; and just use the input directly + ((and (consp m) + (not (cdr m))) + (dash--match (car m) (dash--match-cons-get-car n source))) + ;; handle other special types + ((> n 0) + (dash--match m (dash--match-cons-get-cdr n source))) + ;; this is the only entry-point for dash--match-cons-1, that's + ;; why we can't simply use the above branch, it would produce + ;; infinite recursion + (t + (cons (list s source) (dash--match-cons-1 match-form s)))))) + +(defun dash--get-expand-function (type) + "Get expand function name for TYPE." + (intern-soft (format "dash-expand:%s" type))) + +(defun dash--match-cons-1 (match-form source &optional props) + "Match MATCH-FORM against SOURCE. + +MATCH-FORM is a proper or improper list. Each element of +MATCH-FORM is either a symbol, which gets bound to the respective +value in source or another match form which gets destructured +recursively. + +If the cdr of last cons cell in the list is nil, matching stops +there. + +SOURCE is a proper or improper list." + (let ((skip-cdr (or (plist-get props :skip-cdr) 0))) + (cond + ((consp match-form) + (cond + ((cdr match-form) + (cond + ((and (symbolp (car match-form)) + (functionp (dash--get-expand-function (car match-form)))) + (dash--match-kv (dash--match-kv-normalize-match-form match-form) (dash--match-cons-get-cdr skip-cdr source))) + ((dash--match-ignore-place-p (car match-form)) + (dash--match-cons-1 (cdr match-form) source + (plist-put props :skip-cdr (1+ skip-cdr)))) + (t + (-concat (dash--match (car match-form) (dash--match-cons-skip-cdr skip-cdr source)) + (dash--match-cons-1 (cdr match-form) source))))) + (t ;; Last matching place, no need for shift + (dash--match (car match-form) (dash--match-cons-get-car skip-cdr source))))) + ((eq match-form nil) + nil) + (t ;; Handle improper lists. Last matching place, no need for shift + (dash--match match-form (dash--match-cons-get-cdr skip-cdr source)))))) + +(defun dash--match-vector (match-form source) + "Setup a vector matching environment and call the real matcher." + (let ((s (dash--match-make-source-symbol))) + (cond + ;; don't bind `s' if we only have one sub-pattern + ((= (length match-form) 1) + (dash--match (aref match-form 0) `(aref ,source 0))) + ;; if the source is a symbol, we don't need to re-bind it + ((symbolp source) + (dash--match-vector-1 match-form source)) + ;; don't bind `s' if we only have one sub-pattern which is not ignored + ((let* ((ignored-places (mapcar 'dash--match-ignore-place-p match-form)) + (ignored-places-n (length (-remove 'null ignored-places)))) + (when (= ignored-places-n (1- (length match-form))) + (let ((n (-find-index 'null ignored-places))) + (dash--match (aref match-form n) `(aref ,source ,n)))))) + (t + (cons (list s source) (dash--match-vector-1 match-form s)))))) + +(defun dash--match-vector-1 (match-form source) + "Match MATCH-FORM against SOURCE. + +MATCH-FORM is a vector. Each element of MATCH-FORM is either a +symbol, which gets bound to the respective value in source or +another match form which gets destructured recursively. + +If second-from-last place in MATCH-FORM is the symbol &rest, the +next element of the MATCH-FORM is matched against the tail of +SOURCE, starting at index of the &rest symbol. This is +conceptually the same as the (head . tail) match for improper +lists, where dot plays the role of &rest. + +SOURCE is a vector. + +If the MATCH-FORM vector is shorter than SOURCE vector, only +the (length MATCH-FORM) places are bound, the rest of the SOURCE +is discarded." + (let ((i 0) + (l (length match-form)) + (re)) + (while (< i l) + (let ((m (aref match-form i))) + (push (cond + ((and (symbolp m) + (eq m '&rest)) + (prog1 (dash--match + (aref match-form (1+ i)) + `(substring ,source ,i)) + (setq i l))) + ((and (symbolp m) + ;; do not match symbols starting with _ + (not (eq (aref (symbol-name m) 0) ?_))) + (list (list m `(aref ,source ,i)))) + ((not (symbolp m)) + (dash--match m `(aref ,source ,i)))) + re) + (setq i (1+ i)))) + (-flatten-n 1 (nreverse re)))) + +(defun dash--match-kv-normalize-match-form (pattern) + "Normalize kv PATTERN. + +This method normalizes PATTERN to the format expected by +`dash--match-kv'. See `-let' for the specification." + (let ((normalized (list (car pattern))) + (skip nil) + (fill-placeholder (make-symbol "--dash-fill-placeholder--"))) + (-each (-zip-fill fill-placeholder (cdr pattern) (cddr pattern)) + (lambda (pair) + (let ((current (car pair)) + (next (cdr pair))) + (if skip + (setq skip nil) + (if (or (eq fill-placeholder next) + (not (or (and (symbolp next) + (not (keywordp next)) + (not (eq next t)) + (not (eq next nil))) + (and (consp next) + (not (eq (car next) 'quote))) + (vectorp next)))) + (progn + (cond + ((keywordp current) + (push current normalized) + (push (intern (substring (symbol-name current) 1)) normalized)) + ((stringp current) + (push current normalized) + (push (intern current) normalized)) + ((and (consp current) + (eq (car current) 'quote)) + (push current normalized) + (push (cadr current) normalized)) + (t (error "-let: found key `%s' in kv destructuring but its pattern `%s' is invalid and can not be derived from the key" current next))) + (setq skip nil)) + (push current normalized) + (push next normalized) + (setq skip t)))))) + (nreverse normalized))) + +(defun dash--match-kv (match-form source) + "Setup a kv matching environment and call the real matcher. + +kv can be any key-value store, such as plist, alist or hash-table." + (let ((s (dash--match-make-source-symbol))) + (cond + ;; don't bind `s' if we only have one sub-pattern (&type key val) + ((= (length match-form) 3) + (dash--match-kv-1 (cdr match-form) source (car match-form))) + ;; if the source is a symbol, we don't need to re-bind it + ((symbolp source) + (dash--match-kv-1 (cdr match-form) source (car match-form))) + (t + (cons (list s source) (dash--match-kv-1 (cdr match-form) s (car match-form))))))) + +(defun dash-expand:&hash (key source) + "Generate extracting KEY from SOURCE for &hash destructuring." + `(gethash ,key ,source)) + +(defun dash-expand:&plist (key source) + "Generate extracting KEY from SOURCE for &plist destructuring." + `(plist-get ,source ,key)) + +(defun dash-expand:&alist (key source) + "Generate extracting KEY from SOURCE for &alist destructuring." + `(cdr (assoc ,key ,source))) + +(defun dash-expand:&hash? (key source) + "Generate extracting KEY from SOURCE for &hash? destructuring. +Similar to &hash but check whether the map is not nil." + (let ((src (make-symbol "src"))) + `(let ((,src ,source)) + (when ,src (gethash ,key ,src))))) + +(defalias 'dash-expand:&keys #'dash-expand:&plist) + +(defun dash--match-kv-1 (match-form source type) + "Match MATCH-FORM against SOURCE of type TYPE. + +MATCH-FORM is a proper list of the form (key1 place1 ... keyN +placeN). Each placeK is either a symbol, which gets bound to the +value of keyK retrieved from the key-value store, or another +match form which gets destructured recursively. + +SOURCE is a key-value store of type TYPE, which can be a plist, +an alist or a hash table. + +TYPE is a token specifying the type of the key-value store. +Valid values are &plist, &alist and &hash." + (-flatten-n 1 (-map + (lambda (kv) + (let* ((k (car kv)) + (v (cadr kv)) + (getter + (funcall (dash--get-expand-function type) k source))) + (cond + ((symbolp v) + (list (list v getter))) + (t (dash--match v getter))))) + (-partition 2 match-form)))) + +(defun dash--match-symbol (match-form source) + "Bind a symbol. + +This works just like `let', there is no destructuring." + (list (list match-form source))) + +(defun dash--match (match-form source) + "Match MATCH-FORM against SOURCE. + +This function tests the MATCH-FORM and dispatches to specific +matchers based on the type of the expression. + +Key-value stores are disambiguated by placing a token &plist, +&alist or &hash as a first item in the MATCH-FORM." + (cond + ((and (symbolp match-form) + ;; Don't bind things like &keys as if they were vars (#395). + (not (functionp (dash--get-expand-function match-form)))) + (dash--match-symbol match-form source)) + ((consp match-form) + (cond + ;; Handle the "x &as" bindings first. + ((and (consp (cdr match-form)) + (symbolp (car match-form)) + (eq '&as (cadr match-form))) + (let ((s (car match-form))) + (cons (list s source) + (dash--match (cddr match-form) s)))) + ((functionp (dash--get-expand-function (car match-form))) + (dash--match-kv (dash--match-kv-normalize-match-form match-form) source)) + (t (dash--match-cons match-form source)))) + ((vectorp match-form) + ;; We support the &as binding in vectors too + (cond + ((and (> (length match-form) 2) + (symbolp (aref match-form 0)) + (eq '&as (aref match-form 1))) + (let ((s (aref match-form 0))) + (cons (list s source) + (dash--match (substring match-form 2) s)))) + (t (dash--match-vector match-form source)))))) + +(defun dash--normalize-let-varlist (varlist) + "Normalize VARLIST so that every binding is a list. + +`let' allows specifying a binding which is not a list but simply +the place which is then automatically bound to nil, such that all +three of the following are identical and evaluate to nil. + + (let (a) a) + (let ((a)) a) + (let ((a nil)) a) + +This function normalizes all of these to the last form." + (--map (if (consp it) it (list it nil)) varlist)) + +(defmacro -let* (varlist &rest body) + "Bind variables according to VARLIST then eval BODY. + +VARLIST is a list of lists of the form (PATTERN SOURCE). Each +PATTERN is matched against the SOURCE structurally. SOURCE is +only evaluated once for each PATTERN. + +Each SOURCE can refer to the symbols already bound by this +VARLIST. This is useful if you want to destructure SOURCE +recursively but also want to name the intermediate structures. + +See `-let' for the list of all possible patterns." + (declare (debug ((&rest [&or (sexp form) sexp]) body)) + (indent 1)) + (let* ((varlist (dash--normalize-let-varlist varlist)) + (bindings (--mapcat (dash--match (car it) (cadr it)) varlist))) + `(let* ,bindings + ,@body))) + +(defmacro -let (varlist &rest body) + "Bind variables according to VARLIST then eval BODY. + +VARLIST is a list of lists of the form (PATTERN SOURCE). Each +PATTERN is matched against the SOURCE \"structurally\". SOURCE +is only evaluated once for each PATTERN. Each PATTERN is matched +recursively, and can therefore contain sub-patterns which are +matched against corresponding sub-expressions of SOURCE. + +All the SOURCEs are evalled before any symbols are +bound (i.e. \"in parallel\"). + +If VARLIST only contains one (PATTERN SOURCE) element, you can +optionally specify it using a vector and discarding the +outer-most parens. Thus + + (-let ((PATTERN SOURCE)) ...) + +becomes + + (-let [PATTERN SOURCE] ...). + +`-let' uses a convention of not binding places (symbols) starting +with _ whenever it's possible. You can use this to skip over +entries you don't care about. However, this is not *always* +possible (as a result of implementation) and these symbols might +get bound to undefined values. + +Following is the overview of supported patterns. Remember that +patterns can be matched recursively, so every a, b, aK in the +following can be a matching construct and not necessarily a +symbol/variable. + +Symbol: + + a - bind the SOURCE to A. This is just like regular `let'. + +Conses and lists: + + (a) - bind `car' of cons/list to A + + (a . b) - bind car of cons to A and `cdr' to B + + (a b) - bind car of list to A and `cadr' to B + + (a1 a2 a3 ...) - bind 0th car of list to A1, 1st to A2, 2nd to A3... + + (a1 a2 a3 ... aN . rest) - as above, but bind the Nth cdr to REST. + +Vectors: + + [a] - bind 0th element of a non-list sequence to A (works with + vectors, strings, bit arrays...) + + [a1 a2 a3 ...] - bind 0th element of non-list sequence to A0, 1st to + A1, 2nd to A2, ... + If the PATTERN is shorter than SOURCE, the values at + places not in PATTERN are ignored. + If the PATTERN is longer than SOURCE, an `error' is + thrown. + + [a1 a2 a3 ... &rest rest] - as above, but bind the rest of + the sequence to REST. This is + conceptually the same as improper list + matching (a1 a2 ... aN . rest) + +Key/value stores: + + (&plist key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE plist to aK. If the + value is not found, aK is nil. + Uses `plist-get' to fetch values. + + (&alist key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE alist to aK. If the + value is not found, aK is nil. + Uses `assoc' to fetch values. + + (&hash key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE hash table to aK. If the + value is not found, aK is nil. + Uses `gethash' to fetch values. + +Further, special keyword &keys supports \"inline\" matching of +plist-like key-value pairs, similarly to &keys keyword of +`cl-defun'. + + (a1 a2 ... aN &keys key1 b1 ... keyN bK) + +This binds N values from the list to a1 ... aN, then interprets +the cdr as a plist (see key/value matching above). + +A shorthand notation for kv-destructuring exists which allows the +patterns be optionally left out and derived from the key name in +the following fashion: + +- a key :foo is converted into `foo' pattern, +- a key \\='bar is converted into `bar' pattern, +- a key \"baz\" is converted into `baz' pattern. + +That is, the entire value under the key is bound to the derived +variable without any further destructuring. + +This is possible only when the form following the key is not a +valid pattern (i.e. not a symbol, a cons cell or a vector). +Otherwise the matching proceeds as usual and in case of an +invalid spec fails with an error. + +Thus the patterns are normalized as follows: + + ;; derive all the missing patterns + (&plist :foo \\='bar \"baz\") => (&plist :foo foo \\='bar bar \"baz\" baz) + + ;; we can specify some but not others + (&plist :foo \\='bar explicit-bar) => (&plist :foo foo \\='bar explicit-bar) + + ;; nothing happens, we store :foo in x + (&plist :foo x) => (&plist :foo x) + + ;; nothing happens, we match recursively + (&plist :foo (a b c)) => (&plist :foo (a b c)) + +You can name the source using the syntax SYMBOL &as PATTERN. +This syntax works with lists (proper or improper), vectors and +all types of maps. + + (list &as a b c) (list 1 2 3) + +binds A to 1, B to 2, C to 3 and LIST to (1 2 3). + +Similarly: + + (bounds &as beg . end) (cons 1 2) + +binds BEG to 1, END to 2 and BOUNDS to (1 . 2). + + (items &as first . rest) (list 1 2 3) + +binds FIRST to 1, REST to (2 3) and ITEMS to (1 2 3) + + [vect &as _ b c] [1 2 3] + +binds B to 2, C to 3 and VECT to [1 2 3] (_ avoids binding as usual). + + (plist &as &plist :b b) (list :a 1 :b 2 :c 3) + +binds B to 2 and PLIST to (:a 1 :b 2 :c 3). Same for &alist and &hash. + +This is especially useful when we want to capture the result of a +computation and destructure at the same time. Consider the +form (function-returning-complex-structure) returning a list of +two vectors with two items each. We want to capture this entire +result and pass it to another computation, but at the same time +we want to get the second item from each vector. We can achieve +it with pattern + + (result &as [_ a] [_ b]) (function-returning-complex-structure) + +Note: Clojure programmers may know this feature as the \":as +binding\". The difference is that we put the &as at the front +because we need to support improper list binding." + (declare (debug ([&or (&rest [&or (sexp form) sexp]) + (vector [&rest [sexp form]])] + body)) + (indent 1)) + (if (vectorp varlist) + `(let* ,(dash--match (aref varlist 0) (aref varlist 1)) + ,@body) + (let* ((varlist (dash--normalize-let-varlist varlist)) + (inputs (--map-indexed (list (make-symbol (format "input%d" it-index)) (cadr it)) varlist)) + (new-varlist (--zip-with (list (car it) (car other)) + varlist inputs))) + `(let ,inputs + (-let* ,new-varlist ,@body))))) + +(defmacro -lambda (match-form &rest body) + "Return a lambda which destructures its input as MATCH-FORM and executes BODY. + +Note that you have to enclose the MATCH-FORM in a pair of parens, +such that: + + (-lambda (x) body) + (-lambda (x y ...) body) + +has the usual semantics of `lambda'. Furthermore, these get +translated into normal `lambda', so there is no performance +penalty. + +See `-let' for a description of the destructuring mechanism." + (declare (doc-string 2) (indent defun) + (debug (&define sexp + [&optional stringp] + [&optional ("interactive" interactive)] + def-body))) + (cond + ((nlistp match-form) + (signal 'wrong-type-argument (list #'listp match-form))) + ;; No destructuring, so just return regular `lambda' for speed. + ((-all? #'symbolp match-form) + `(lambda ,match-form ,@body)) + ((let ((inputs (--map-indexed + (list it (make-symbol (format "input%d" it-index))) + match-form))) + ;; TODO: because inputs to the `lambda' are evaluated only once, + ;; `-let*' need not create the extra bindings to ensure that. + ;; We should find a way to optimize that. Not critical however. + `(lambda ,(mapcar #'cadr inputs) + (-let* ,inputs ,@body)))))) + +(defmacro -setq (&rest forms) + "Bind each MATCH-FORM to the value of its VAL. + +MATCH-FORM destructuring is done according to the rules of `-let'. + +This macro allows you to bind multiple variables by destructuring +the value, so for example: + + (-setq (a b) x + (&plist :c c) plist) + +expands roughly speaking to the following code + + (setq a (car x) + b (cadr x) + c (plist-get plist :c)) + +Care is taken to only evaluate each VAL once so that in case of +multiple assignments it does not cause unexpected side effects. + +\(fn [MATCH-FORM VAL]...)" + (declare (debug (&rest sexp form)) + (indent 1)) + (when (= (mod (length forms) 2) 1) + (signal 'wrong-number-of-arguments (list '-setq (1+ (length forms))))) + (let* ((forms-and-sources + ;; First get all the necessary mappings with all the + ;; intermediate bindings. + (-map (lambda (x) (dash--match (car x) (cadr x))) + (-partition 2 forms))) + ;; To preserve the logic of dynamic scoping we must ensure + ;; that we `setq' the variables outside of the `let*' form + ;; which holds the destructured intermediate values. For + ;; this we generate for each variable a placeholder which is + ;; bound to (lexically) the result of the destructuring. + ;; Then outside of the helper `let*' form we bind all the + ;; original variables to their respective placeholders. + ;; TODO: There is a lot of room for possible optimization, + ;; for start playing with `special-variable-p' to eliminate + ;; unnecessary re-binding. + (variables-to-placeholders + (-mapcat + (lambda (bindings) + (-map + (lambda (binding) + (let ((var (car binding))) + (list var (make-symbol (concat "--dash-binding-" (symbol-name var) "--"))))) + (--filter (not (string-prefix-p "--" (symbol-name (car it)))) bindings))) + forms-and-sources))) + `(let ,(-map 'cadr variables-to-placeholders) + (let* ,(-flatten-n 1 forms-and-sources) + (setq ,@(-flatten (-map 'reverse variables-to-placeholders)))) + (setq ,@(-flatten variables-to-placeholders))))) + +(defmacro -if-let* (vars-vals then &rest else) + "If all VALS evaluate to true, bind them to their corresponding +VARS and do THEN, otherwise do ELSE. VARS-VALS should be a list +of (VAR VAL) pairs. + +Note: binding is done according to `-let*'. VALS are evaluated +sequentially, and evaluation stops after the first nil VAL is +encountered." + (declare (debug ((&rest (sexp form)) form body)) + (indent 2)) + (->> vars-vals + (--mapcat (dash--match (car it) (cadr it))) + (--reduce-r-from + (let ((var (car it)) + (val (cadr it))) + `(let ((,var ,val)) + (if ,var ,acc ,@else))) + then))) + +(defmacro -if-let (var-val then &rest else) + "If VAL evaluates to non-nil, bind it to VAR and do THEN, +otherwise do ELSE. + +Note: binding is done according to `-let'. + +\(fn (VAR VAL) THEN &rest ELSE)" + (declare (debug ((sexp form) form body)) + (indent 2)) + `(-if-let* (,var-val) ,then ,@else)) + +(defmacro --if-let (val then &rest else) + "If VAL evaluates to non-nil, bind it to symbol `it' and do THEN, +otherwise do ELSE." + (declare (debug (form form body)) + (indent 2)) + `(-if-let (it ,val) ,then ,@else)) + +(defmacro -when-let* (vars-vals &rest body) + "If all VALS evaluate to true, bind them to their corresponding +VARS and execute body. VARS-VALS should be a list of (VAR VAL) +pairs. + +Note: binding is done according to `-let*'. VALS are evaluated +sequentially, and evaluation stops after the first nil VAL is +encountered." + (declare (debug ((&rest (sexp form)) body)) + (indent 1)) + `(-if-let* ,vars-vals (progn ,@body))) + +(defmacro -when-let (var-val &rest body) + "If VAL evaluates to non-nil, bind it to VAR and execute body. + +Note: binding is done according to `-let'. + +\(fn (VAR VAL) &rest BODY)" + (declare (debug ((sexp form) body)) + (indent 1)) + `(-if-let ,var-val (progn ,@body))) + +(defmacro --when-let (val &rest body) + "If VAL evaluates to non-nil, bind it to symbol `it' and +execute body." + (declare (debug (form body)) + (indent 1)) + `(--if-let ,val (progn ,@body))) + +;; TODO: Get rid of this dynamic variable, passing it as an argument +;; instead? +(defvar -compare-fn nil + "Tests for equality use this function, or `equal' if this is nil. + +As a dynamic variable, this should be temporarily bound around +the relevant operation, rather than permanently modified. For +example: + + (let ((-compare-fn #\\='=)) + (-union \\='(1 2 3) \\='(2 3 4)))") + +(defun dash--member-fn () + "Return the flavor of `member' that goes best with `-compare-fn'." + (declare (side-effect-free error-free)) + (let ((cmp -compare-fn)) + (cond ((memq cmp '(nil equal)) #'member) + ((eq cmp #'eq) #'memq) + ((eq cmp #'eql) #'memql) + ((lambda (elt list) + (while (and list (not (funcall cmp elt (car list)))) + (pop list)) + list))))) + +(defun dash--assoc-fn () + "Return the flavor of `assoc' that goes best with `-compare-fn'." + (declare (side-effect-free error-free)) + (let ((cmp -compare-fn)) + (cond ((memq cmp '(nil equal)) #'assoc) + ((eq cmp #'eq) #'assq) + ((lambda (key alist) + ;; Since Emacs 26, `assoc' accepts a custom `testfn'. + ;; Version testing would be simpler here, but feature + ;; testing gets more brownie points, I guess. + (static-if (condition-case nil + (assoc nil () #'eql) + (wrong-number-of-arguments t)) + (--first (and (consp it) (funcall cmp (car it) key)) alist) + (assoc key alist cmp))))))) + +(defun dash--hash-test-fn () + "Return the hash table test function corresponding to `-compare-fn'. +Return nil if `-compare-fn' is not a known test function." + (declare (side-effect-free error-free)) + ;; In theory this could also recognize values that are custom + ;; `hash-table-test's, but too often the :test name is different + ;; from the equality function, so it doesn't seem worthwhile. + (car (memq (or -compare-fn #'equal) '(equal eq eql)))) + +(defvar dash--short-list-length 32 + "Maximum list length considered short, for optimizations. +For example, the speedup afforded by hash table lookup may start +to outweigh its runtime and memory overhead for problem sizes +greater than this value. See also the discussion in PR #305.") + +(defun -distinct (list) + "Return a copy of LIST with all duplicate elements removed. + +The test for equality is done with `equal', or with `-compare-fn' +if that is non-nil. + +Alias: `-uniq'." + (declare (important-return-value t)) + (let (test len) + (cond ((null list) ()) + ;; Use a hash table if `-compare-fn' is a known hash table + ;; test function and the list is long enough. + ((and (setq test (dash--hash-test-fn)) + (> (setq len (length list)) dash--short-list-length)) + (let ((ht (make-hash-table :test test :size len))) + (--filter (unless (gethash it ht) (puthash it t ht)) list))) + ((let ((member (dash--member-fn)) uniq) + (--each list (unless (funcall member it uniq) (push it uniq))) + (nreverse uniq)))))) + +(defalias '-uniq #'-distinct) + +(defun dash--size+ (size1 size2) + "Return the sum of nonnegative fixnums SIZE1 and SIZE2. +Return `most-positive-fixnum' on overflow. This ensures the +result is a valid size, particularly for allocating hash tables, +even in the presence of bignum support." + (declare (side-effect-free t)) + (if (< size1 (- most-positive-fixnum size2)) + (+ size1 size2) + most-positive-fixnum)) + +(defun -union (list1 list2) + "Return a new list of distinct elements appearing in either LIST1 or LIST2. + +The test for equality is done with `equal', or with `-compare-fn' +if that is non-nil." + (declare (important-return-value t)) + (let ((lists (list list1 list2)) test len union) + (cond ((null (or list1 list2))) + ;; Use a hash table if `-compare-fn' is a known hash table + ;; test function and the lists are long enough. + ((and (setq test (dash--hash-test-fn)) + (> (setq len (dash--size+ (length list1) (length list2))) + dash--short-list-length)) + (let ((ht (make-hash-table :test test :size len))) + (dolist (l lists) + (--each l (unless (gethash it ht) + (puthash it t ht) + (push it union)))))) + ((let ((member (dash--member-fn))) + (dolist (l lists) + (--each l (unless (funcall member it union) (push it union))))))) + (nreverse union))) + +(defun -intersection (list1 list2) + "Return a new list of distinct elements appearing in both LIST1 and LIST2. + +The test for equality is done with `equal', or with `-compare-fn' +if that is non-nil." + (declare (important-return-value t)) + (let (test len) + (cond ((null (and list1 list2)) ()) + ;; Use a hash table if `-compare-fn' is a known hash table + ;; test function and either list is long enough. + ((and (setq test (dash--hash-test-fn)) + (> (setq len (length list2)) dash--short-list-length)) + (let ((ht (make-hash-table :test test :size len))) + (--each list2 (puthash it t ht)) + ;; Remove visited elements to avoid duplicates. + (--filter (when (gethash it ht) (remhash it ht) t) list1))) + ((let ((member (dash--member-fn)) intersection) + (--each list1 (and (funcall member it list2) + (not (funcall member it intersection)) + (push it intersection))) + (nreverse intersection)))))) + +(defun -difference (list1 list2) + "Return a new list with the distinct members of LIST1 that are not in LIST2. + +The test for equality is done with `equal', or with `-compare-fn' +if that is non-nil." + (declare (important-return-value t)) + (let (test len1 len2) + (cond ((null list1) ()) + ((null list2) (-distinct list1)) + ;; Use a hash table if `-compare-fn' is a known hash table + ;; test function and the subtrahend is long enough. + ((and (setq test (dash--hash-test-fn)) + (setq len1 (length list1)) + (setq len2 (length list2)) + (> (max len1 len2) dash--short-list-length)) + (let ((ht1 (make-hash-table :test test :size len1)) + (ht2 (make-hash-table :test test :size len2))) + (--each list2 (puthash it t ht2)) + ;; Avoid duplicates by tracking visited items in `ht1'. + (--filter (unless (or (gethash it ht2) (gethash it ht1)) + (puthash it t ht1)) + list1))) + ((let ((member (dash--member-fn)) difference) + (--each list1 + (unless (or (funcall member it list2) + (funcall member it difference)) + (push it difference))) + (nreverse difference)))))) + +(defun -powerset (list) + "Return the power set of LIST." + (declare (pure t) (side-effect-free t)) + (if (null list) (list ()) + (let ((last (-powerset (cdr list)))) + (nconc (mapcar (lambda (x) (cons (car list) x)) last) + last)))) + +(defun -frequencies (list) + "Count the occurrences of each distinct element of LIST. + +Return an alist of (ELEMENT . N), where each ELEMENT occurs N +times in LIST. + +The test for equality is done with `equal', or with `-compare-fn' +if that is non-nil. + +See also `-count' and `-group-by'." + (declare (important-return-value t)) + (let (test len freqs) + (cond ((null list)) + ((and (setq test (dash--hash-test-fn)) + (> (setq len (length list)) dash--short-list-length)) + (let ((ht (make-hash-table :test test :size len))) + ;; Share structure between hash table and returned list. + ;; This affords a single pass that preserves the input + ;; order, conses less garbage, and is faster than a + ;; second traversal (e.g., with `maphash'). + (--each list + (let ((freq (gethash it ht))) + (if freq + (setcdr freq (1+ (cdr freq))) + (push (puthash it (cons it 1) ht) freqs)))))) + ((let ((assoc (dash--assoc-fn))) + (--each list + (let ((freq (funcall assoc it freqs))) + (if freq + (setcdr freq (1+ (cdr freq))) + (push (cons it 1) freqs))))))) + (nreverse freqs))) + +(defun dash--numbers<= (nums) + "Return non-nil if NUMS is a list of non-decreasing numbers." + (declare (pure t) (side-effect-free t)) + (or (null nums) + (let ((prev (pop nums))) + (and (numberp prev) + (--every (and (numberp it) (<= prev (setq prev it))) nums))))) + +(defun dash--next-lex-perm (array n) + "Update ARRAY of N numbers with its next lexicographic permutation. +Return nil if there is no such successor. N should be nonzero. + +This implements the salient steps of Algorithm L (Lexicographic +permutation generation) as described in DE Knuth's The Art of +Computer Programming, Volume 4A / Combinatorial Algorithms, +Part I, Addison-Wesley, 2011, § 7.2.1.2, p. 319." + (setq n (1- n)) + (let* ((l n) + (j (1- n)) + (al (aref array n)) + (aj al)) + ;; L2. [Find j]. + ;; Decrement j until a[j] < a[j+1]. + (while (and (<= 0 j) + (<= aj (setq aj (aref array j)))) + (setq j (1- j))) + ;; Terminate algorithm if j not found. + (when (>= j 0) + ;; L3. [Increase a[j]]. + ;; Decrement l until a[j] < a[l]. + (while (>= aj al) + (setq l (1- l) al (aref array l))) + ;; Swap a[j] and a[l]. + (aset array j al) + (aset array l aj) + ;; L4. [Reverse a[j+1]...a[n]]. + (setq l n) + (while (< (setq j (1+ j)) l) + (setq aj (aref array j)) + (aset array j (aref array l)) + (aset array l aj) + (setq l (1- l))) + array))) + +(defun dash--lex-perms (vec &optional original) + "Return a list of permutations of VEC in lexicographic order. +Specifically, return only the successors of VEC in lexicographic +order. Each returned permutation is a list. VEC should comprise +one or more numbers, and may be destructively modified. + +If ORIGINAL is a vector, then VEC is interpreted as a set of +indices into ORIGINAL. In this case, the indices are permuted, +and the resulting index permutations are used to dereference +elements of ORIGINAL." + (let ((len (length vec)) perms) + (while vec + (push (if original + (--map (aref original it) vec) + (append vec ())) + perms) + (setq vec (dash--next-lex-perm vec len))) + (nreverse perms))) + +(defun dash--uniq-perms (list) + "Return a list of permutations of LIST. +LIST is treated as if all its elements are distinct." + (let* ((vec (vconcat list)) + (idxs (copy-sequence vec))) + ;; Just construct a vector of the list's indices and permute that. + (dotimes (i (length idxs)) + (aset idxs i i)) + (dash--lex-perms idxs vec))) + +(defun dash--multi-perms (list freqs) + "Return a list of permutations of the multiset LIST. +FREQS should be an alist describing the frequency of each element +in LIST, as returned by `-frequencies'." + (let (;; Distinct items in `list', aka the cars of `freqs'. + (uniq (make-vector (length freqs) nil)) + ;; Indices into `uniq'. + (idxs (make-vector (length list) nil)) + ;; Current index into `idxs'. + (i 0)) + (--each freqs + (aset uniq it-index (car it)) + ;; Populate `idxs' with as many copies of each `it-index' as + ;; there are corresponding duplicates. + (dotimes (_ (cdr it)) + (aset idxs i it-index) + (setq i (1+ i)))) + (dash--lex-perms idxs uniq))) + +(defun -permutations (list) + "Return the distinct permutations of LIST. + +Duplicate elements of LIST are determined by `equal', or by +`-compare-fn' if that is non-nil." + (declare (important-return-value t)) + (cond ((null list) (list ())) + ;; Optimization: a traversal of `list' is faster than the + ;; round trip via `dash--uniq-perms' or `dash--multi-perms'. + ((dash--numbers<= list) + (dash--lex-perms (vconcat list))) + ((let ((freqs (-frequencies list))) + ;; Is each element distinct? + (unless (--every (= (cdr it) 1) freqs) + (dash--multi-perms list freqs)))) + ((dash--uniq-perms list)))) + +(defun -inits (list) + "Return all prefixes of LIST." + (declare (pure t) (side-effect-free t)) + (let ((res (list list))) + (setq list (reverse list)) + (while list + (push (reverse (!cdr list)) res)) + res)) + +(defun -tails (list) + "Return all suffixes of LIST." + (declare (pure t) (side-effect-free t)) + (-reductions-r-from #'cons nil list)) + +(defun -common-prefix (&rest lists) + "Return the longest common prefix of LISTS." + (declare (pure t) (side-effect-free t)) + (--reduce (--take-while (and acc (equal (pop acc) it)) it) + lists)) + +(defun -common-suffix (&rest lists) + "Return the longest common suffix of LISTS." + (declare (pure t) (side-effect-free t)) + (nreverse (apply #'-common-prefix (mapcar #'reverse lists)))) + +(defun -contains? (list element) + "Return non-nil if LIST contains ELEMENT. + +The test for equality is done with `equal', or with `-compare-fn' +if that is non-nil. As with `member', the return value is +actually the tail of LIST whose car is ELEMENT. + +Alias: `-contains-p'." + (declare (important-return-value t)) + (funcall (dash--member-fn) element list)) + +(defalias '-contains-p #'-contains?) + +(defun -same-items? (list1 list2) + "Return non-nil if LIST1 and LIST2 have the same distinct elements. + +The order of the elements in the lists does not matter. The +lists may be of different lengths, i.e., contain duplicate +elements. The test for equality is done with `equal', or with +`-compare-fn' if that is non-nil. + +Alias: `-same-items-p'." + (declare (important-return-value t)) + (let (test len1 len2) + (cond ((null (or list1 list2))) + ((null (and list1 list2)) nil) + ;; Use a hash table if `-compare-fn' is a known hash table + ;; test function and either list is long enough. + ((and (setq test (dash--hash-test-fn)) + (setq len1 (length list1)) + (setq len2 (length list2)) + (> (max len1 len2) dash--short-list-length)) + (let ((ht1 (make-hash-table :test test :size len1)) + (ht2 (make-hash-table :test test :size len2))) + (--each list1 (puthash it t ht1)) + ;; Move visited elements from `ht1' to `ht2'. This way, + ;; if visiting all of `list2' leaves `ht1' empty, then + ;; all elements from both lists have been accounted for. + (and (--every (cond ((gethash it ht1) + (remhash it ht1) + (puthash it t ht2)) + ((gethash it ht2))) + list2) + (zerop (hash-table-count ht1))))) + ((let ((member (dash--member-fn))) + (and (--all? (funcall member it list2) list1) + (--all? (funcall member it list1) list2))))))) + +(defalias '-same-items-p #'-same-items?) + +(defun -is-prefix? (prefix list) + "Return non-nil if PREFIX is a prefix of LIST. + +Alias: `-is-prefix-p'." + (declare (pure t) (side-effect-free t)) + (--each-while list (and (equal (car prefix) it) + (!cdr prefix))) + (null prefix)) + +(defun -is-suffix? (suffix list) + "Return non-nil if SUFFIX is a suffix of LIST. + +Alias: `-is-suffix-p'." + (declare (pure t) (side-effect-free t)) + (equal suffix (last list (length suffix)))) + +(defun -is-infix? (infix list) + "Return non-nil if INFIX is infix of LIST. + +This operation runs in O(n^2) time + +Alias: `-is-infix-p'" + (declare (pure t) (side-effect-free t)) + (let (done) + (while (and (not done) list) + (setq done (-is-prefix? infix list)) + (!cdr list)) + done)) + +(defalias '-is-prefix-p '-is-prefix?) +(defalias '-is-suffix-p '-is-suffix?) +(defalias '-is-infix-p '-is-infix?) + +(defun -sort (comparator list) + "Sort LIST, stably, comparing elements using COMPARATOR. +Return the sorted list. LIST is NOT modified by side effects. +COMPARATOR is called with two elements of LIST, and should return non-nil +if the first element should sort before the second." + (declare (important-return-value t)) + (static-if (condition-case nil (sort []) (wrong-number-of-arguments)) + ;; Since Emacs 30. + (sort list :lessp comparator) + (sort (copy-sequence list) comparator))) + +(defmacro --sort (form list) + "Anaphoric form of `-sort'." + (declare (debug (def-form form))) + `(-sort (lambda (it other) (ignore it other) ,form) ,list)) + +(defun -list (&optional arg &rest args) + "Ensure ARG is a list. +If ARG is already a list, return it as is (not a copy). +Otherwise, return a new list with ARG as its only element. + +Another supported calling convention is (-list &rest ARGS). +In this case, if ARG is not a list, a new list with all of +ARGS as elements is returned. This use is supported for +backward compatibility and is otherwise deprecated." + (declare (advertised-calling-convention (arg) "2.18.0") + (pure t) (side-effect-free error-free)) + (if (listp arg) arg (cons arg args))) + +(defun -repeat (n x) + "Return a new list of length N with each element being X. +Return nil if N is less than 1." + (declare (side-effect-free t)) + (and (>= n 0) (make-list n x))) + +(defun -sum (list) + "Return the sum of LIST." + (declare (pure t) (side-effect-free t)) + (apply #'+ list)) + +(defun -running-sum (list) + "Return a list with running sums of items in LIST. +LIST must be non-empty." + (declare (pure t) (side-effect-free t)) + (or list (signal 'wrong-type-argument (list #'consp list))) + (-reductions #'+ list)) + +(defun -product (list) + "Return the product of LIST." + (declare (pure t) (side-effect-free t)) + (apply #'* list)) + +(defun -running-product (list) + "Return a list with running products of items in LIST. +LIST must be non-empty." + (declare (pure t) (side-effect-free t)) + (or list (signal 'wrong-type-argument (list #'consp list))) + (-reductions #'* list)) + +(defun -max (list) + "Return the largest value from LIST of numbers or markers." + (declare (pure t) (side-effect-free t)) + (apply #'max list)) + +(defun -min (list) + "Return the smallest value from LIST of numbers or markers." + (declare (pure t) (side-effect-free t)) + (apply #'min list)) + +(defun -max-by (comparator list) + "Take a comparison function COMPARATOR and a LIST and return +the greatest element of the list by the comparison function. + +See also combinator `-on' which can transform the values before +comparing them." + (declare (important-return-value t)) + (--reduce (if (funcall comparator it acc) it acc) list)) + +(defun -min-by (comparator list) + "Take a comparison function COMPARATOR and a LIST and return +the least element of the list by the comparison function. + +See also combinator `-on' which can transform the values before +comparing them." + (declare (important-return-value t)) + (--reduce (if (funcall comparator it acc) acc it) list)) + +(defmacro --max-by (form list) + "Anaphoric version of `-max-by'. + +The items for the comparator form are exposed as \"it\" and \"other\"." + (declare (debug (def-form form))) + `(-max-by (lambda (it other) (ignore it other) ,form) ,list)) + +(defmacro --min-by (form list) + "Anaphoric version of `-min-by'. + +The items for the comparator form are exposed as \"it\" and \"other\"." + (declare (debug (def-form form))) + `(-min-by (lambda (it other) (ignore it other) ,form) ,list)) + +(defun -iota (count &optional start step) + "Return a list containing COUNT numbers. +Starts from START and adds STEP each time. The default START is +zero, the default STEP is 1. +This function takes its name from the corresponding primitive in +the APL language." + (declare (side-effect-free t)) + (unless (natnump count) + (signal 'wrong-type-argument (list #'natnump count))) + (or start (setq start 0)) + (or step (setq step 1)) + (if (zerop step) + (make-list count start) + (--iterate (+ it step) start count))) + +(defun -fix (fn list) + "Compute the (least) fixpoint of FN with initial input LIST. + +FN is called at least once, results are compared with `equal'." + (declare (important-return-value t)) + (let ((re (funcall fn list))) + (while (not (equal list re)) + (setq list re) + (setq re (funcall fn re))) + re)) + +(defmacro --fix (form list) + "Anaphoric form of `-fix'." + (declare (debug (def-form form))) + `(-fix (lambda (it) (ignore it) ,form) ,list)) + +(defun -unfold (fun seed) + "Build a list from SEED using FUN. + +This is \"dual\" operation to `-reduce-r': while -reduce-r +consumes a list to produce a single value, `-unfold' takes a +seed value and builds a (potentially infinite!) list. + +FUN should return nil to stop the generating process, or a +cons (A . B), where A will be prepended to the result and B is +the new seed." + (declare (important-return-value t)) + (let ((last (funcall fun seed)) r) + (while last + (push (car last) r) + (setq last (funcall fun (cdr last)))) + (nreverse r))) + +(defmacro --unfold (form seed) + "Anaphoric version of `-unfold'." + (declare (debug (def-form form))) + `(-unfold (lambda (it) (ignore it) ,form) ,seed)) + +(defun -cons-pair? (obj) + "Return non-nil if OBJ is a true cons pair. +That is, a cons (A . B) where B is not a list. + +Alias: `-cons-pair-p'." + (declare (pure t) (side-effect-free error-free)) + (nlistp (cdr-safe obj))) + +(defalias '-cons-pair-p '-cons-pair?) + +(defun -cons-to-list (con) + "Convert a cons pair to a list with `car' and `cdr' of the pair respectively." + (declare (pure t) (side-effect-free t)) + (list (car con) (cdr con))) + +(defun -value-to-list (val) + "Convert a value to a list. + +If the value is a cons pair, make a list with two elements, `car' +and `cdr' of the pair respectively. + +If the value is anything else, wrap it in a list." + (declare (pure t) (side-effect-free t)) + (if (-cons-pair? val) (-cons-to-list val) (list val))) + +(defun -tree-mapreduce-from (fn folder init-value tree) + "Apply FN to each element of TREE, and make a list of the results. +If elements of TREE are lists themselves, apply FN recursively to +elements of these nested lists. + +Then reduce the resulting lists using FOLDER and initial value +INIT-VALUE. See `-reduce-r-from'. + +This is the same as calling `-tree-reduce-from' after `-tree-map' +but is twice as fast as it only traverse the structure once." + (declare (important-return-value t)) + (cond + ((null tree) ()) + ((-cons-pair? tree) (funcall fn tree)) + ((consp tree) + (-reduce-r-from + folder init-value + (mapcar (lambda (x) (-tree-mapreduce-from fn folder init-value x)) tree))) + ((funcall fn tree)))) + +(defmacro --tree-mapreduce-from (form folder init-value tree) + "Anaphoric form of `-tree-mapreduce-from'." + (declare (debug (def-form def-form form form))) + `(-tree-mapreduce-from (lambda (it) (ignore it) ,form) + (lambda (it acc) (ignore it acc) ,folder) + ,init-value + ,tree)) + +(defun -tree-mapreduce (fn folder tree) + "Apply FN to each element of TREE, and make a list of the results. +If elements of TREE are lists themselves, apply FN recursively to +elements of these nested lists. + +Then reduce the resulting lists using FOLDER and initial value +INIT-VALUE. See `-reduce-r-from'. + +This is the same as calling `-tree-reduce' after `-tree-map' +but is twice as fast as it only traverse the structure once." + (declare (important-return-value t)) + (cond + ((null tree) ()) + ((-cons-pair? tree) (funcall fn tree)) + ((consp tree) + (-reduce-r folder (mapcar (lambda (x) (-tree-mapreduce fn folder x)) tree))) + ((funcall fn tree)))) + +(defmacro --tree-mapreduce (form folder tree) + "Anaphoric form of `-tree-mapreduce'." + (declare (debug (def-form def-form form))) + `(-tree-mapreduce (lambda (it) (ignore it) ,form) + (lambda (it acc) (ignore it acc) ,folder) + ,tree)) + +(defun -tree-map (fn tree) + "Apply FN to each element of TREE while preserving the tree structure." + (declare (important-return-value t)) + (cond + ((null tree) ()) + ((-cons-pair? tree) (funcall fn tree)) + ((consp tree) + (mapcar (lambda (x) (-tree-map fn x)) tree)) + ((funcall fn tree)))) + +(defmacro --tree-map (form tree) + "Anaphoric form of `-tree-map'." + (declare (debug (def-form form))) + `(-tree-map (lambda (it) (ignore it) ,form) ,tree)) + +(defun -tree-reduce-from (fn init-value tree) + "Use FN to reduce elements of list TREE. +If elements of TREE are lists themselves, apply the reduction recursively. + +FN is first applied to INIT-VALUE and first element of the list, +then on this result and second element from the list etc. + +The initial value is ignored on cons pairs as they always contain +two elements." + (declare (important-return-value t)) + (cond + ((null tree) ()) + ((-cons-pair? tree) tree) + ((consp tree) + (-reduce-r-from + fn init-value + (mapcar (lambda (x) (-tree-reduce-from fn init-value x)) tree))) + (tree))) + +(defmacro --tree-reduce-from (form init-value tree) + "Anaphoric form of `-tree-reduce-from'." + (declare (debug (def-form form form))) + `(-tree-reduce-from (lambda (it acc) (ignore it acc) ,form) + ,init-value ,tree)) + +(defun -tree-reduce (fn tree) + "Use FN to reduce elements of list TREE. +If elements of TREE are lists themselves, apply the reduction recursively. + +FN is first applied to first element of the list and second +element, then on this result and third element from the list etc. + +See `-reduce-r' for how exactly are lists of zero or one element handled." + (declare (important-return-value t)) + (cond + ((null tree) ()) + ((-cons-pair? tree) tree) + ((consp tree) + (-reduce-r fn (mapcar (lambda (x) (-tree-reduce fn x)) tree))) + (tree))) + +(defmacro --tree-reduce (form tree) + "Anaphoric form of `-tree-reduce'." + (declare (debug (def-form form))) + `(-tree-reduce (lambda (it acc) (ignore it acc) ,form) ,tree)) + +(defun -tree-map-nodes (pred fun tree) + "Call FUN on each node of TREE that satisfies PRED. + +If PRED returns nil, continue descending down this node. If PRED +returns non-nil, apply FUN to this node and do not descend +further." + (cond ((funcall pred tree) (funcall fun tree)) + ((and (listp tree) (listp (cdr tree))) + (-map (lambda (x) (-tree-map-nodes pred fun x)) tree)) + (tree))) + +(defmacro --tree-map-nodes (pred form tree) + "Anaphoric form of `-tree-map-nodes'." + (declare (debug (def-form def-form form))) + `(-tree-map-nodes (lambda (it) (ignore it) ,pred) + (lambda (it) (ignore it) ,form) + ,tree)) + +(defun -tree-seq (branch children tree) + "Return a sequence of the nodes in TREE, in depth-first search order. + +BRANCH is a predicate of one argument that returns non-nil if the +passed argument is a branch, that is, a node that can have children. + +CHILDREN is a function of one argument that returns the children +of the passed branch node. + +Non-branch nodes are simply copied." + (declare (important-return-value t)) + (cons tree + (and (funcall branch tree) + (-mapcat (lambda (x) (-tree-seq branch children x)) + (funcall children tree))))) + +(defmacro --tree-seq (branch children tree) + "Anaphoric form of `-tree-seq'." + (declare (debug (def-form def-form form))) + `(-tree-seq (lambda (it) (ignore it) ,branch) + (lambda (it) (ignore it) ,children) + ,tree)) + +(defun -clone (list) + "Create a deep copy of LIST. +The new list has the same elements and structure but all cons are +replaced with new ones. This is useful when you need to clone a +structure such as plist or alist." + (declare (side-effect-free t)) + (-tree-map #'identity list)) + +;;; Combinators + +(defalias '-partial #'apply-partially + "Return a function that is a partial application of FUN to ARGS. +ARGS is a list of the first N arguments to pass to FUN. +The result is a new function which does the same as FUN, except that +the first N arguments are fixed at the values with which this function +was called. +\n(fn FUN &rest ARGS)") + +(defun -rpartial (fn &rest args) + "Return a function that is a partial application of FN to ARGS. +ARGS is a list of the last N arguments to pass to FN. The result +is a new function which does the same as FN, except that the last +N arguments are fixed at the values with which this function was +called. This is like `-partial', except the arguments are fixed +starting from the right rather than the left." + (declare (pure t) (side-effect-free error-free)) + (lambda (&rest args-before) (apply fn (append args-before args)))) + +(defun -juxt (&rest fns) + "Return a function that is the juxtaposition of FNS. +The returned function takes a variable number of ARGS, applies +each of FNS in turn to ARGS, and returns the list of results." + (declare (pure t) (side-effect-free error-free)) + (lambda (&rest args) (mapcar (lambda (x) (apply x args)) fns))) + +(defun -compose (&rest fns) + "Compose FNS into a single composite function. +Return a function that takes a variable number of ARGS, applies +the last function in FNS to ARGS, and returns the result of +calling each remaining function on the result of the previous +function, right-to-left. If no FNS are given, return a variadic +`identity' function." + (declare (pure t) (side-effect-free error-free)) + (let* ((fns (nreverse fns)) + (head (car fns)) + (tail (cdr fns))) + (cond (tail + (lambda (&rest args) + (--reduce-from (funcall it acc) (apply head args) tail))) + (fns head) + ((lambda (&optional arg &rest _) arg))))) + +(defun -applify (fn) + "Return a function that applies FN to a single list of args. +This changes the arity of FN from taking N distinct arguments to +taking 1 argument which is a list of N arguments." + (declare (pure t) (side-effect-free error-free)) + (lambda (args) (apply fn args))) + +(defun -on (op trans) + "Return a function that calls TRANS on each arg and OP on the results. +The returned function takes a variable number of arguments, calls +the function TRANS on each one in turn, and then passes those +results as the list of arguments to OP, in the same order. + +For example, the following pairs of expressions are morally +equivalent: + + (funcall (-on #\\='+ #\\='1+) 1 2 3) = (+ (1+ 1) (1+ 2) (1+ 3)) + (funcall (-on #\\='+ #\\='1+)) = (+)" + (declare (pure t) (side-effect-free error-free)) + (lambda (&rest args) + ;; This unrolling seems to be a relatively cheap way to keep the + ;; overhead of `mapcar' + `apply' in check. + (cond ((cddr args) + (apply op (mapcar trans args))) + ((cdr args) + (funcall op (funcall trans (car args)) (funcall trans (cadr args)))) + (args + (funcall op (funcall trans (car args)))) + ((funcall op))))) + +(defun -flip (fn) + "Return a function that calls FN with its arguments reversed. +The returned function takes the same number of arguments as FN. + +For example, the following two expressions are morally +equivalent: + + (funcall (-flip #\\='-) 1 2) = (- 2 1) + +See also: `-rotate-args'." + (declare (pure t) (side-effect-free error-free)) + (lambda (&rest args) ;; Open-code for speed. + (cond ((cddr args) (apply fn (nreverse args))) + ((cdr args) (funcall fn (cadr args) (car args))) + (args (funcall fn (car args))) + ((funcall fn))))) + +(defun -rotate-args (n fn) + "Return a function that calls FN with args rotated N places to the right. +The returned function takes the same number of arguments as FN, +rotates the list of arguments N places to the right (left if N is +negative) just like `-rotate', and applies FN to the result. + +See also: `-flip'." + (declare (pure t) (side-effect-free t)) + (if (zerop n) + fn + (let ((even (= (% n 2) 0))) + (lambda (&rest args) + (cond ((cddr args) ;; Open-code for speed. + (apply fn (-rotate n args))) + ((cdr args) + (let ((fst (car args)) + (snd (cadr args))) + (funcall fn (if even fst snd) (if even snd fst)))) + (args + (funcall fn (car args))) + ((funcall fn))))))) + +(defun -const (c) + "Return a function that returns C ignoring any additional arguments. + +In types: a -> b -> a" + (declare (pure t) (side-effect-free error-free)) + (lambda (&rest _) c)) + +(defmacro -cut (&rest params) + "Take n-ary function and n arguments and specialize some of them. +Arguments denoted by <> will be left unspecialized. + +See SRFI-26 for detailed description." + (declare (debug (&optional sexp &rest &or "<>" form))) + (let* ((i 0) + (args (--keep (when (eq it '<>) + (setq i (1+ i)) + (make-symbol (format "D%d" i))) + params))) + `(lambda ,args + ,(let ((body (--map (if (eq it '<>) (pop args) it) params))) + (if (eq (car params) '<>) + (cons #'funcall body) + body))))) + +(defun -not (pred) + "Return a predicate that negates the result of PRED. +The returned predicate passes its arguments to PRED. If PRED +returns nil, the result is non-nil; otherwise the result is nil. + +See also: `-andfn' and `-orfn'." + (declare (pure t) (side-effect-free error-free)) + (lambda (&rest args) (not (apply pred args)))) + +(defun -orfn (&rest preds) + "Return a predicate that returns the first non-nil result of PREDS. +The returned predicate takes a variable number of arguments, +passes them to each predicate in PREDS in turn until one of them +returns non-nil, and returns that non-nil result without calling +the remaining PREDS. If all PREDS return nil, or if no PREDS are +given, the returned predicate returns nil. + +See also: `-andfn' and `-not'." + (declare (pure t) (side-effect-free error-free)) + ;; Open-code for speed. + (cond ((cdr preds) (lambda (&rest args) (--some (apply it args) preds))) + (preds (car preds)) + (#'ignore))) + +(defun -andfn (&rest preds) + "Return a predicate that returns non-nil if all PREDS do so. +The returned predicate P takes a variable number of arguments and +passes them to each predicate in PREDS in turn. If any one of +PREDS returns nil, P also returns nil without calling the +remaining PREDS. If all PREDS return non-nil, P returns the last +such value. If no PREDS are given, P always returns non-nil. + +See also: `-orfn' and `-not'." + (declare (pure t) (side-effect-free error-free)) + ;; Open-code for speed. + (cond ((cdr preds) (lambda (&rest args) (--every (apply it args) preds))) + (preds (car preds)) + ((static-if (fboundp 'always) + #'always + (lambda (&rest _) t))))) + +(defun -iteratefn (fn n) + "Return a function FN composed N times with itself. + +FN is a unary function. If you need to use a function of higher +arity, use `-applify' first to turn it into a unary function. + +With n = 0, this acts as identity function. + +In types: (a -> a) -> Int -> a -> a. + +This function satisfies the following law: + + (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init (1+ n)))." + (declare (pure t) (side-effect-free error-free)) + (lambda (x) (--dotimes n (setq x (funcall fn x))) x)) + +(defun -counter (&optional beg end inc) + "Return a closure that counts from BEG to END, with increment INC. + +The closure will return the next value in the counting sequence +each time it is called, and nil after END is reached. BEG +defaults to 0, INC defaults to 1, and if END is nil, the counter +will increment indefinitely. + +The closure accepts any number of arguments, which are discarded." + (declare (pure t) (side-effect-free error-free)) + (let ((inc (or inc 1)) + (n (or beg 0))) + (lambda (&rest _) + (when (or (not end) (< n end)) + (prog1 n + (setq n (+ n inc))))))) + +(defvar -fixfn-max-iterations 1000 + "The default maximum number of iterations performed by `-fixfn' + unless otherwise specified.") + +(defun -fixfn (fn &optional equal-test halt-test) + "Return a function that computes the (least) fixpoint of FN. + +FN must be a unary function. The returned lambda takes a single +argument, X, the initial value for the fixpoint iteration. The +iteration halts when either of the following conditions is satisfied: + + 1. Iteration converges to the fixpoint, with equality being + tested using EQUAL-TEST. If EQUAL-TEST is not specified, + `equal' is used. For functions over the floating point + numbers, it may be necessary to provide an appropriate + approximate comparison test. + + 2. HALT-TEST returns a non-nil value. HALT-TEST defaults to a + simple counter that returns t after `-fixfn-max-iterations', + to guard against infinite iteration. Otherwise, HALT-TEST + must be a function that accepts a single argument, the + current value of X, and returns non-nil as long as iteration + should continue. In this way, a more sophisticated + convergence test may be supplied by the caller. + +The return value of the lambda is either the fixpoint or, if +iteration halted before converging, a cons with car `halted' and +cdr the final output from HALT-TEST. + +In types: (a -> a) -> a -> a." + (declare (important-return-value t)) + (let ((eqfn (or equal-test 'equal)) + (haltfn (or halt-test + (-not + (-counter 0 -fixfn-max-iterations))))) + (lambda (x) + (let ((re (funcall fn x)) + (halt? (funcall haltfn x))) + (while (and (not halt?) (not (funcall eqfn x re))) + (setq x re + re (funcall fn re) + halt? (funcall haltfn re))) + (if halt? (cons 'halted halt?) + re))))) + +(defun -prodfn (&rest fns) + "Return a function that applies each of FNS to each of a list of arguments. + +Takes a list of N functions and returns a function that takes a +list of length N, applying Ith function to Ith element of the +input list. Returns a list of length N. + +In types (for N=2): ((a -> b), (c -> d)) -> (a, c) -> (b, d) + +This function satisfies the following laws: + + (-compose (-prodfn f g ...) + (-prodfn f\\=' g\\=' ...)) + = (-prodfn (-compose f f\\=') + (-compose g g\\=') + ...) + + (-prodfn f g ...) + = (-juxt (-compose f (-partial #\\='nth 0)) + (-compose g (-partial #\\='nth 1)) + ...) + + (-compose (-prodfn f g ...) + (-juxt f\\=' g\\=' ...)) + = (-juxt (-compose f f\\=') + (-compose g g\\=') + ...) + + (-compose (-partial #\\='nth n) + (-prod f1 f2 ...)) + = (-compose fn (-partial #\\='nth n))" + (declare (pure t) (side-effect-free t)) + (lambda (x) (--zip-with (funcall it other) fns x))) + +;;; Font lock + +(defvar dash--keywords + `(;; TODO: Do not fontify the following automatic variables + ;; globally; detect and limit to their local anaphoric scope. + (,(rx symbol-start (| "acc" "it" "it-index" "other") symbol-end) + . 'font-lock-variable-name-face) + ;; Macros in dev/examples.el. Based on `lisp-mode-symbol-regexp'. + (,(rx ?\( (group (| "defexamples" "def-example-group")) symbol-end + (+ (in "\t ")) + (group (* (| (syntax word) (syntax symbol) (: ?\\ nonl))))) + (1 'font-lock-keyword-face) + (2 'font-lock-function-name-face)) + ;; Symbols in dev/examples.el. + ,(rx symbol-start (| "=>" "~>" "!!>") symbol-end) + ;; Elisp macro fontification was static prior to Emacs 25. + ,@(when (< emacs-major-version 25) + (let ((macs '("!cdr" + "!cons" + "-->" + "--all-p" + "--all?" + "--annotate" + "--any" + "--any-p" + "--any?" + "--count" + "--dotimes" + "--doto" + "--drop-while" + "--each" + "--each-indexed" + "--each-r" + "--each-r-while" + "--each-while" + "--every" + "--every-p" + "--every?" + "--filter" + "--find" + "--find-index" + "--find-indices" + "--find-last-index" + "--first" + "--fix" + "--group-by" + "--if-let" + "--iterate" + "--keep" + "--last" + "--map" + "--map-first" + "--map-indexed" + "--map-last" + "--map-when" + "--mapcat" + "--max-by" + "--min-by" + "--none-p" + "--none?" + "--only-some-p" + "--only-some?" + "--partition-after-pred" + "--partition-by" + "--partition-by-header" + "--reduce" + "--reduce-from" + "--reduce-r" + "--reduce-r-from" + "--reductions" + "--reductions-from" + "--reductions-r" + "--reductions-r-from" + "--reject" + "--reject-first" + "--reject-last" + "--remove" + "--remove-first" + "--remove-last" + "--replace-where" + "--select" + "--separate" + "--some" + "--some-p" + "--some?" + "--sort" + "--splice" + "--splice-list" + "--split-when" + "--split-with" + "--take-while" + "--tree-map" + "--tree-map-nodes" + "--tree-mapreduce" + "--tree-mapreduce-from" + "--tree-reduce" + "--tree-reduce-from" + "--tree-seq" + "--unfold" + "--update-at" + "--when-let" + "--zip-with" + "->" + "->>" + "-as->" + "-cut" + "-doto" + "-if-let" + "-if-let*" + "-lambda" + "-let" + "-let*" + "-setq" + "-some-->" + "-some->" + "-some->>" + "-split-on" + "-when-let" + "-when-let*"))) + `((,(concat "(" (regexp-opt macs 'symbols)) . 1))))) + "Font lock keywords for `dash-fontify-mode'.") + +(defcustom dash-fontify-mode-lighter nil + "Mode line lighter for `dash-fontify-mode'. +Either a string to display in the mode line when +`dash-fontify-mode' is on, or nil to display +nothing (the default)." + :package-version '(dash . "2.18.0") + :type '(choice (string :tag "Lighter" :value " Dash") + (const :tag "Nothing" nil))) + +;;;###autoload +(define-minor-mode dash-fontify-mode + "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'." + :lighter dash-fontify-mode-lighter + (if dash-fontify-mode + (font-lock-add-keywords nil dash--keywords t) + (font-lock-remove-keywords nil dash--keywords)) + (static-if (fboundp 'font-lock-flush) + ;; Added in Emacs 25. + (font-lock-flush) + (when font-lock-mode + ;; Unconditionally enables `font-lock-mode' and is marked + ;; `interactive-only' in later Emacs versions which have + ;; `font-lock-flush'. + (font-lock-fontify-buffer)))) + +(defun dash--turn-on-fontify-mode () + "Enable `dash-fontify-mode' if in an Emacs Lisp buffer." + (when (derived-mode-p #'emacs-lisp-mode) + (dash-fontify-mode))) + +;;;###autoload +(define-globalized-minor-mode global-dash-fontify-mode + dash-fontify-mode dash--turn-on-fontify-mode) + +(defcustom dash-enable-fontlock nil + "If non-nil, fontify Dash macro calls and special variables." + :set (lambda (sym val) + (set-default sym val) + (global-dash-fontify-mode (if val 1 0))) + :type 'boolean) + +(make-obsolete-variable + 'dash-enable-fontlock #'global-dash-fontify-mode "2.18.0") + +(define-obsolete-function-alias + 'dash-enable-font-lock #'global-dash-fontify-mode "2.18.0") + +;;; Info + +(defvar dash--info-doc-spec '("(dash) Index" nil "^ -+ .*: " "\\( \\|$\\)") + "The Dash :doc-spec entry for `info-lookup-alist'. +It is based on that for `emacs-lisp-mode'.") + +(defun dash--info-elisp-docs () + "Return the `emacs-lisp-mode' symbol docs from `info-lookup-alist'. +Specifically, return the cons containing their +`info-lookup->doc-spec' so that we can modify it." + (defvar info-lookup-alist) + (nthcdr 3 (assq #'emacs-lisp-mode (cdr (assq 'symbol info-lookup-alist))))) + +;;;###autoload +(defun dash-register-info-lookup () + "Register the Dash Info manual with `info-lookup-symbol'. +This allows Dash symbols to be looked up with \\[info-lookup-symbol]." + (interactive) + (require 'info-look) + (let ((docs (dash--info-elisp-docs))) + (setcar docs (append (car docs) (list dash--info-doc-spec))) + (info-lookup-reset))) + +(defun dash-unload-function () + "Remove Dash from `info-lookup-alist'. +Used by `unload-feature', which see." + (let ((docs (and (featurep 'info-look) + (dash--info-elisp-docs)))) + (when (member dash--info-doc-spec (car docs)) + (setcar docs (remove dash--info-doc-spec (car docs))) + (info-lookup-reset))) + nil) + +(provide 'dash) +;;; dash.el ends here diff --git a/.packages/dash-20250312.1307/dash.elc b/.packages/dash-20250312.1307/dash.elc new file mode 100644 index 0000000..a30324e Binary files /dev/null and b/.packages/dash-20250312.1307/dash.elc differ diff --git a/.packages/dash-20250312.1307/dash.info b/.packages/dash-20250312.1307/dash.info new file mode 100644 index 0000000..6c0ef89 --- /dev/null +++ b/.packages/dash-20250312.1307/dash.info @@ -0,0 +1,4954 @@ +This is dash.info, produced by makeinfo version 6.8 from dash.texi. + +This manual is for Dash version 2.20.0. + + Copyright © 2012–2025 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with the Invariant Sections being “GNU General Public + License,” and no Front-Cover Texts or Back-Cover Texts. A copy of + the license is included in the section entitled “GNU Free + Documentation License”. +INFO-DIR-SECTION Emacs +START-INFO-DIR-ENTRY +* Dash: (dash.info). A modern list library for GNU Emacs. +END-INFO-DIR-ENTRY + + +File: dash.info, Node: Top, Next: Installation, Up: (dir) + +Dash +**** + +This manual is for Dash version 2.20.0. + + Copyright © 2012–2025 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with the Invariant Sections being “GNU General Public + License,” and no Front-Cover Texts or Back-Cover Texts. A copy of + the license is included in the section entitled “GNU Free + Documentation License”. + +* Menu: + +* Installation:: Installing and configuring Dash. +* Functions:: Dash API reference. +* Development:: Contributing to Dash development. + +Appendices + +* FDL:: The license for this documentation. +* GPL:: Conditions for copying and changing Dash. +* Index:: Index including functions and macros. + + — The Detailed Node Listing — + +Installation + +* Using in a package:: Listing Dash as a package dependency. +* Fontification of special variables:: Font Lock of anaphoric macro variables. +* Info symbol lookup:: Looking up Dash symbols in this manual. + +Functions + +* Maps:: +* Sublist selection:: +* List to list:: +* Reductions:: +* Unfolding:: +* Predicates:: +* Partitioning:: +* Indexing:: +* Set operations:: +* Other list operations:: +* Tree operations:: +* Threading macros:: +* Binding:: +* Side effects:: +* Destructive operations:: +* Function combinators:: + +Development + +* Contribute:: How to contribute. +* Contributors:: List of contributors. + + +File: dash.info, Node: Installation, Next: Functions, Prev: Top, Up: Top + +1 Installation +************** + +Dash is available on GNU ELPA (https://elpa.gnu.org/), GNU-devel ELPA +(https://elpa.gnu.org/devel/), and MELPA (https://melpa.org/), and can +be installed with the standard command ‘package-install’ (*note +(emacs)Package Installation::). + +‘M-x package-install dash ’ + Install the Dash library. + + Alternatively, you can just dump ‘dash.el’ in your ‘load-path’ +somewhere (*note (emacs)Lisp Libraries::). + +* Menu: + +* Using in a package:: Listing Dash as a package dependency. +* Fontification of special variables:: Font Lock of anaphoric macro variables. +* Info symbol lookup:: Looking up Dash symbols in this manual. + + +File: dash.info, Node: Using in a package, Next: Fontification of special variables, Up: Installation + +1.1 Using in a package +====================== + +If you use Dash in your own package, be sure to list it as a dependency +in the library’s headers as follows (*note (elisp)Library Headers::). + + ;; Package-Requires: ((dash "2.20.0")) + + +File: dash.info, Node: Fontification of special variables, Next: Info symbol lookup, Prev: Using in a package, Up: Installation + +1.2 Fontification of special variables +====================================== + +The autoloaded minor mode ‘dash-fontify-mode’ is provided for optional +fontification of anaphoric Dash variables (‘it’, ‘acc’, etc.) in Emacs +Lisp buffers using search-based Font Lock (*note (emacs)Font Lock::). +In older Emacs versions which do not dynamically detect macros, the +minor mode also fontifies calls to Dash macros. + + To automatically enable the minor mode in all Emacs Lisp buffers, +just call its autoloaded global counterpart ‘global-dash-fontify-mode’, +either interactively or from your ‘user-init-file’: + + (global-dash-fontify-mode) + + +File: dash.info, Node: Info symbol lookup, Prev: Fontification of special variables, Up: Installation + +1.3 Info symbol lookup +====================== + +While editing Elisp files, you can use ‘C-h S’ (‘info-lookup-symbol’) to +look up Elisp symbols in the relevant Info manuals (*note (emacs)Info +Lookup::). To enable the same for Dash symbols, use the command +‘dash-register-info-lookup’. It can be called directly when needed, or +automatically from your ‘user-init-file’. For example: + + (with-eval-after-load 'info-look + (dash-register-info-lookup)) + + +File: dash.info, Node: Functions, Next: Development, Prev: Installation, Up: Top + +2 Functions +*********** + +This chapter contains reference documentation for the Dash API +(Application Programming Interface). The names of all public functions +defined in the library are prefixed with a dash character (‘-’). + + The library also provides anaphoric macro versions of functions where +that makes sense. The names of these macros are prefixed with two +dashes (‘--’) instead of one. + + For instance, while the function ‘-map’ applies a function to each +element of a list, its anaphoric counterpart ‘--map’ evaluates a form +with the local variable ‘it’ temporarily bound to the current list +element instead. + + ;; Normal version. + (-map (lambda (n) (* n n)) '(1 2 3 4)) + ⇒ (1 4 9 16) + + ;; Anaphoric version. + (--map (* it it) '(1 2 3 4)) + ⇒ (1 4 9 16) + + The normal version can, of course, also be written as in the +following example, which demonstrates the utility of both versions. + + (defun my-square (n) + "Return N multiplied by itself." + (* n n)) + + (-map #'my-square '(1 2 3 4)) + ⇒ (1 4 9 16) + +* Menu: + +* Maps:: +* Sublist selection:: +* List to list:: +* Reductions:: +* Unfolding:: +* Predicates:: +* Partitioning:: +* Indexing:: +* Set operations:: +* Other list operations:: +* Tree operations:: +* Threading macros:: +* Binding:: +* Side effects:: +* Destructive operations:: +* Function combinators:: + + +File: dash.info, Node: Maps, Next: Sublist selection, Up: Functions + +2.1 Maps +======== + +Functions in this category take a transforming function, which is then +applied sequentially to each or selected elements of the input list. +The results are collected in order and returned as a new list. + + -- Function: -map (fn list) + Apply FN to each item in LIST and return the list of results. + + This function’s anaphoric counterpart is ‘--map’. + + (-map (lambda (num) (* num num)) '(1 2 3 4)) + ⇒ (1 4 9 16) + (-map #'1+ '(1 2 3 4)) + ⇒ (2 3 4 5) + (--map (* it it) '(1 2 3 4)) + ⇒ (1 4 9 16) + + -- Function: -map-when (pred rep list) + Use PRED to conditionally apply REP to each item in LIST. Return a + copy of LIST where the items for which PRED returns ‘nil’ are + unchanged, and the rest are mapped through the REP function. + + Alias: ‘-replace-where’ + + See also: ‘-update-at’ (*note -update-at::) + + (-map-when 'even? 'square '(1 2 3 4)) + ⇒ (1 4 3 16) + (--map-when (> it 2) (* it it) '(1 2 3 4)) + ⇒ (1 2 9 16) + (--map-when (= it 2) 17 '(1 2 3 4)) + ⇒ (1 17 3 4) + + -- Function: -map-first (pred rep list) + Use PRED to determine the first item in LIST to call REP on. + Return a copy of LIST where the first item for which PRED returns + non-‘nil’ is replaced with the result of calling REP on that item. + + See also: ‘-map-when’ (*note -map-when::), ‘-replace-first’ (*note + -replace-first::) + + (-map-first 'even? 'square '(1 2 3 4)) + ⇒ (1 4 3 4) + (--map-first (> it 2) (* it it) '(1 2 3 4)) + ⇒ (1 2 9 4) + (--map-first (= it 2) 17 '(1 2 3 2)) + ⇒ (1 17 3 2) + + -- Function: -map-last (pred rep list) + Use PRED to determine the last item in LIST to call REP on. Return + a copy of LIST where the last item for which PRED returns non-‘nil’ + is replaced with the result of calling REP on that item. + + See also: ‘-map-when’ (*note -map-when::), ‘-replace-last’ (*note + -replace-last::) + + (-map-last 'even? 'square '(1 2 3 4)) + ⇒ (1 2 3 16) + (--map-last (> it 2) (* it it) '(1 2 3 4)) + ⇒ (1 2 3 16) + (--map-last (= it 2) 17 '(1 2 3 2)) + ⇒ (1 2 3 17) + + -- Function: -map-indexed (fn list) + Apply FN to each index and item in LIST and return the list of + results. This is like ‘-map’ (*note -map::), but FN takes two + arguments: the index of the current element within LIST, and the + element itself. + + This function’s anaphoric counterpart is ‘--map-indexed’. + + For a side-effecting variant, see also ‘-each-indexed’ (*note + -each-indexed::). + + (-map-indexed (lambda (index item) (- item index)) '(1 2 3 4)) + ⇒ (1 1 1 1) + (--map-indexed (- it it-index) '(1 2 3 4)) + ⇒ (1 1 1 1) + (-map-indexed #'* '(1 2 3 4)) + ⇒ (0 2 6 12) + + -- Function: -annotate (fn list) + Pair each item in LIST with the result of passing it to FN. + + Return an alist of (RESULT . ITEM), where each ITEM is the + corresponding element of LIST, and RESULT is the value obtained by + calling FN on ITEM. + + This function’s anaphoric counterpart is ‘--annotate’. + + (-annotate #'1+ '(1 2 3)) + ⇒ ((2 . 1) (3 . 2) (4 . 3)) + (-annotate #'length '((f o o) (bar baz))) + ⇒ ((3 f o o) (2 bar baz)) + (--annotate (> it 1) '(0 1 2 3)) + ⇒ ((nil . 0) (nil . 1) (t . 2) (t . 3)) + + -- Function: -splice (pred fun list) + Splice lists generated by FUN in place of items satisfying PRED in + LIST. + + Call PRED on each element of LIST. Whenever the result of PRED is + ‘nil’, leave that ‘it’ as-is. Otherwise, call FUN on the same ‘it’ + that satisfied PRED. The result should be a (possibly empty) list + of items to splice in place of ‘it’ in LIST. + + This can be useful as an alternative to the ‘,@’ construct in a ‘`’ + structure, in case you need to splice several lists at marked + positions (for example with keywords). + + This function’s anaphoric counterpart is ‘--splice’. + + See also: ‘-splice-list’ (*note -splice-list::), ‘-insert-at’ + (*note -insert-at::). + + (-splice #'numberp (lambda (n) (list n n)) '(a 1 b 2)) + ⇒ (a 1 1 b 2 2) + (--splice t (list it it) '(1 2 3 4)) + ⇒ (1 1 2 2 3 3 4 4) + (--splice (eq it :magic) '((magical) (code)) '((foo) :magic (bar))) + ⇒ ((foo) (magical) (code) (bar)) + + -- Function: -splice-list (pred new-list list) + Splice NEW-LIST in place of elements matching PRED in LIST. + + See also: ‘-splice’ (*note -splice::), ‘-insert-at’ (*note + -insert-at::) + + (-splice-list 'keywordp '(a b c) '(1 :foo 2)) + ⇒ (1 a b c 2) + (-splice-list 'keywordp nil '(1 :foo 2)) + ⇒ (1 2) + (--splice-list (keywordp it) '(a b c) '(1 :foo 2)) + ⇒ (1 a b c 2) + + -- Function: -mapcat (fn list) + Return the concatenation of the result of mapping FN over LIST. + Thus function FN should return a list. + + (-mapcat 'list '(1 2 3)) + ⇒ (1 2 3) + (-mapcat (lambda (item) (list 0 item)) '(1 2 3)) + ⇒ (0 1 0 2 0 3) + (--mapcat (list 0 it) '(1 2 3)) + ⇒ (0 1 0 2 0 3) + + -- Function: -copy (list) + Create a shallow copy of LIST. The elements of LIST are not + copied; they are shared with the original. + + (-copy '(1 2 3)) + ⇒ (1 2 3) + (let ((a '(1 2 3))) (eq a (-copy a))) + ⇒ nil + + +File: dash.info, Node: Sublist selection, Next: List to list, Prev: Maps, Up: Functions + +2.2 Sublist selection +===================== + +Functions returning a sublist of the original list. + + -- Function: -filter (pred list) + Return a new list of the items in LIST for which PRED returns + non-‘nil’. + + Alias: ‘-select’. + + This function’s anaphoric counterpart is ‘--filter’. + + For similar operations, see also ‘-keep’ (*note -keep::) and + ‘-remove’ (*note -remove::). + + (-filter (lambda (num) (= 0 (% num 2))) '(1 2 3 4)) + ⇒ (2 4) + (-filter #'natnump '(-2 -1 0 1 2)) + ⇒ (0 1 2) + (--filter (= 0 (% it 2)) '(1 2 3 4)) + ⇒ (2 4) + + -- Function: -remove (pred list) + Return a new list of the items in LIST for which PRED returns + ‘nil’. + + Alias: ‘-reject’. + + This function’s anaphoric counterpart is ‘--remove’. + + For similar operations, see also ‘-keep’ (*note -keep::) and + ‘-filter’ (*note -filter::). + + (-remove (lambda (num) (= 0 (% num 2))) '(1 2 3 4)) + ⇒ (1 3) + (-remove #'natnump '(-2 -1 0 1 2)) + ⇒ (-2 -1) + (--remove (= 0 (% it 2)) '(1 2 3 4)) + ⇒ (1 3) + + -- Function: -remove-first (pred list) + Remove the first item from LIST for which PRED returns non-‘nil’. + This is a non-destructive operation, but only the front of LIST + leading up to the removed item is a copy; the rest is LIST’s + original tail. If no item is removed, then the result is a + complete copy. + + Alias: ‘-reject-first’. + + This function’s anaphoric counterpart is ‘--remove-first’. + + See also ‘-map-first’ (*note -map-first::), ‘-remove-item’ (*note + -remove-item::), and ‘-remove-last’ (*note -remove-last::). + + (-remove-first #'natnump '(-2 -1 0 1 2)) + ⇒ (-2 -1 1 2) + (-remove-first #'stringp '(1 2 "first" "second")) + ⇒ (1 2 "second") + (--remove-first (> it 3) '(1 2 3 4 5 6)) + ⇒ (1 2 3 5 6) + + -- Function: -remove-last (pred list) + Remove the last item from LIST for which PRED returns non-‘nil’. + The result is a copy of LIST regardless of whether an element is + removed. + + Alias: ‘-reject-last’. + + This function’s anaphoric counterpart is ‘--remove-last’. + + See also ‘-map-last’ (*note -map-last::), ‘-remove-item’ (*note + -remove-item::), and ‘-remove-first’ (*note -remove-first::). + + (-remove-last #'natnump '(1 3 5 4 7 8 10 -11)) + ⇒ (1 3 5 4 7 8 -11) + (-remove-last #'stringp '(1 2 "last" "second")) + ⇒ (1 2 "last") + (--remove-last (> it 3) '(1 2 3 4 5 6 7 8 9 10)) + ⇒ (1 2 3 4 5 6 7 8 9) + + -- Function: -remove-item (item list) + Return a copy of LIST with all occurrences of ITEM removed. The + comparison is done with ‘equal’. + + (-remove-item 3 '(1 2 3 2 3 4 5 3)) + ⇒ (1 2 2 4 5) + (-remove-item 'foo '(foo bar baz foo)) + ⇒ (bar baz) + (-remove-item "bob" '("alice" "bob" "eve" "bob")) + ⇒ ("alice" "eve") + + -- Function: -non-nil (list) + Return a copy of LIST with all ‘nil’ items removed. + + (-non-nil '(nil 1 nil 2 nil nil 3 4 nil 5 nil)) + ⇒ (1 2 3 4 5) + (-non-nil '((nil))) + ⇒ ((nil)) + (-non-nil ()) + ⇒ () + + -- Function: -slice (list from &optional to step) + Return copy of LIST, starting from index FROM to index TO. + + FROM or TO may be negative. These values are then interpreted + modulo the length of the list. + + If STEP is a number, only each STEPth item in the resulting section + is returned. Defaults to 1. + + (-slice '(1 2 3 4 5) 1) + ⇒ (2 3 4 5) + (-slice '(1 2 3 4 5) 0 3) + ⇒ (1 2 3) + (-slice '(1 2 3 4 5 6 7 8 9) 1 -1 2) + ⇒ (2 4 6 8) + + -- Function: -take (n list) + Return a copy of the first N items in LIST. Return a copy of LIST + if it contains N items or fewer. Return ‘nil’ if N is zero or + less. + + See also: ‘-take-last’ (*note -take-last::). + + (-take 3 '(1 2 3 4 5)) + ⇒ (1 2 3) + (-take 17 '(1 2 3 4 5)) + ⇒ (1 2 3 4 5) + (-take 0 '(1 2 3 4 5)) + ⇒ () + + -- Function: -take-last (n list) + Return a copy of the last N items of LIST in order. Return a copy + of LIST if it contains N items or fewer. Return ‘nil’ if N is zero + or less. + + See also: ‘-take’ (*note -take::). + + (-take-last 3 '(1 2 3 4 5)) + ⇒ (3 4 5) + (-take-last 17 '(1 2 3 4 5)) + ⇒ (1 2 3 4 5) + (-take-last 1 '(1 2 3 4 5)) + ⇒ (5) + + -- Function: -drop (n list) + Return the tail (not a copy) of LIST without the first N items. + Return ‘nil’ if LIST contains N items or fewer. Return LIST if N + is zero or less. + + For another variant, see also ‘-drop-last’ (*note -drop-last::). + + (-drop 3 '(1 2 3 4 5)) + ⇒ (4 5) + (-drop 17 '(1 2 3 4 5)) + ⇒ () + (-drop 0 '(1 2 3 4 5)) + ⇒ (1 2 3 4 5) + + -- Function: -drop-last (n list) + Return a copy of LIST without its last N items. Return a copy of + LIST if N is zero or less. Return ‘nil’ if LIST contains N items + or fewer. + + See also: ‘-drop’ (*note -drop::). + + (-drop-last 3 '(1 2 3 4 5)) + ⇒ (1 2) + (-drop-last 17 '(1 2 3 4 5)) + ⇒ () + (-drop-last 0 '(1 2 3 4 5)) + ⇒ (1 2 3 4 5) + + -- Function: -take-while (pred list) + Take successive items from LIST for which PRED returns non-‘nil’. + PRED is a function of one argument. Return a new list of the + successive elements from the start of LIST for which PRED returns + non-‘nil’. + + This function’s anaphoric counterpart is ‘--take-while’. + + For another variant, see also ‘-drop-while’ (*note -drop-while::). + + (-take-while #'even? '(1 2 3 4)) + ⇒ () + (-take-while #'even? '(2 4 5 6)) + ⇒ (2 4) + (--take-while (< it 4) '(1 2 3 4 3 2 1)) + ⇒ (1 2 3) + + -- Function: -drop-while (pred list) + Drop successive items from LIST for which PRED returns non-‘nil’. + PRED is a function of one argument. Return the tail (not a copy) + of LIST starting from its first element for which PRED returns + ‘nil’. + + This function’s anaphoric counterpart is ‘--drop-while’. + + For another variant, see also ‘-take-while’ (*note -take-while::). + + (-drop-while #'even? '(1 2 3 4)) + ⇒ (1 2 3 4) + (-drop-while #'even? '(2 4 5 6)) + ⇒ (5 6) + (--drop-while (< it 4) '(1 2 3 4 3 2 1)) + ⇒ (4 3 2 1) + + -- Function: -select-by-indices (indices list) + Return a list whose elements are elements from LIST selected as + ‘(nth i list)‘ for all i from INDICES. + + (-select-by-indices '(4 10 2 3 6) '("v" "e" "l" "o" "c" "i" "r" "a" "p" "t" "o" "r")) + ⇒ ("c" "o" "l" "o" "r") + (-select-by-indices '(2 1 0) '("a" "b" "c")) + ⇒ ("c" "b" "a") + (-select-by-indices '(0 1 2 0 1 3 3 1) '("f" "a" "r" "l")) + ⇒ ("f" "a" "r" "f" "a" "l" "l" "a") + + -- Function: -select-columns (columns table) + Select COLUMNS from TABLE. + + TABLE is a list of lists where each element represents one row. It + is assumed each row has the same length. + + Each row is transformed such that only the specified COLUMNS are + selected. + + See also: ‘-select-column’ (*note -select-column::), + ‘-select-by-indices’ (*note -select-by-indices::) + + (-select-columns '(0 2) '((1 2 3) (a b c) (:a :b :c))) + ⇒ ((1 3) (a c) (:a :c)) + (-select-columns '(1) '((1 2 3) (a b c) (:a :b :c))) + ⇒ ((2) (b) (:b)) + (-select-columns nil '((1 2 3) (a b c) (:a :b :c))) + ⇒ (nil nil nil) + + -- Function: -select-column (column table) + Select COLUMN from TABLE. + + TABLE is a list of lists where each element represents one row. It + is assumed each row has the same length. + + The single selected column is returned as a list. + + See also: ‘-select-columns’ (*note -select-columns::), + ‘-select-by-indices’ (*note -select-by-indices::) + + (-select-column 1 '((1 2 3) (a b c) (:a :b :c))) + ⇒ (2 b :b) + + +File: dash.info, Node: List to list, Next: Reductions, Prev: Sublist selection, Up: Functions + +2.3 List to list +================ + +Functions returning a modified copy of the input list. + + -- Function: -keep (fn list) + Return a new list of the non-‘nil’ results of applying FN to each + item in LIST. Like ‘-filter’ (*note -filter::), but returns the + non-‘nil’ results of FN instead of the corresponding elements of + LIST. + + Its anaphoric counterpart is ‘--keep’. + + (-keep #'cdr '((1 2 3) (4 5) (6))) + ⇒ ((2 3) (5)) + (-keep (lambda (n) (and (> n 3) (* 10 n))) '(1 2 3 4 5 6)) + ⇒ (40 50 60) + (--keep (and (> it 3) (* 10 it)) '(1 2 3 4 5 6)) + ⇒ (40 50 60) + + -- Function: -concat (&rest sequences) + Concatenate all SEQUENCES and make the result a list. The result + is a list whose elements are the elements of all the arguments. + Each argument may be a list, vector or string. + + All arguments except the last argument are copied. The last + argument is just used as the tail of the new list. If the last + argument is not a list, this results in a dotted list. + + As an exception, if all the arguments except the last are ‘nil’, + and the last argument is not a list, the return value is that last + argument unaltered, not a list. + + (-concat '(1)) + ⇒ (1) + (-concat '(1) '(2)) + ⇒ (1 2) + (-concat '(1) '(2 3) '(4)) + ⇒ (1 2 3 4) + + -- Function: -flatten (l) + Take a nested list L and return its contents as a single, flat + list. + + Note that because ‘nil’ represents a list of zero elements (an + empty list), any mention of ‘nil’ in L will disappear after + flattening. If you need to preserve nils, consider ‘-flatten-n’ + (*note -flatten-n::) or map them to some unique symbol and then map + them back. + + Conses of two atoms are considered "terminals", that is, they + aren’t flattened further. + + See also: ‘-flatten-n’ (*note -flatten-n::) + + (-flatten '((1))) + ⇒ (1) + (-flatten '((1 (2 3) (((4 (5))))))) + ⇒ (1 2 3 4 5) + (-flatten '(1 2 (3 . 4))) + ⇒ (1 2 (3 . 4)) + + -- Function: -flatten-n (num list) + Flatten NUM levels of a nested LIST. + + See also: ‘-flatten’ (*note -flatten::) + + (-flatten-n 1 '((1 2) ((3 4) ((5 6))))) + ⇒ (1 2 (3 4) ((5 6))) + (-flatten-n 2 '((1 2) ((3 4) ((5 6))))) + ⇒ (1 2 3 4 (5 6)) + (-flatten-n 3 '((1 2) ((3 4) ((5 6))))) + ⇒ (1 2 3 4 5 6) + + -- Function: -replace (old new list) + Replace all OLD items in LIST with NEW. + + Elements are compared using ‘equal’. + + See also: ‘-replace-at’ (*note -replace-at::) + + (-replace 1 "1" '(1 2 3 4 3 2 1)) + ⇒ ("1" 2 3 4 3 2 "1") + (-replace "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) + ⇒ ("a" "nice" "bar" "sentence" "about" "bar") + (-replace 1 2 nil) + ⇒ nil + + -- Function: -replace-first (old new list) + Replace the first occurrence of OLD with NEW in LIST. + + Elements are compared using ‘equal’. + + See also: ‘-map-first’ (*note -map-first::) + + (-replace-first 1 "1" '(1 2 3 4 3 2 1)) + ⇒ ("1" 2 3 4 3 2 1) + (-replace-first "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) + ⇒ ("a" "nice" "bar" "sentence" "about" "foo") + (-replace-first 1 2 nil) + ⇒ nil + + -- Function: -replace-last (old new list) + Replace the last occurrence of OLD with NEW in LIST. + + Elements are compared using ‘equal’. + + See also: ‘-map-last’ (*note -map-last::) + + (-replace-last 1 "1" '(1 2 3 4 3 2 1)) + ⇒ (1 2 3 4 3 2 "1") + (-replace-last "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) + ⇒ ("a" "nice" "foo" "sentence" "about" "bar") + (-replace-last 1 2 nil) + ⇒ nil + + -- Function: -insert-at (n x list) + Return a list with X inserted into LIST at position N. + + See also: ‘-splice’ (*note -splice::), ‘-splice-list’ (*note + -splice-list::) + + (-insert-at 1 'x '(a b c)) + ⇒ (a x b c) + (-insert-at 12 'x '(a b c)) + ⇒ (a b c x) + + -- Function: -replace-at (n x list) + Return a list with element at Nth position in LIST replaced with X. + + See also: ‘-replace’ (*note -replace::) + + (-replace-at 0 9 '(0 1 2 3 4 5)) + ⇒ (9 1 2 3 4 5) + (-replace-at 1 9 '(0 1 2 3 4 5)) + ⇒ (0 9 2 3 4 5) + (-replace-at 4 9 '(0 1 2 3 4 5)) + ⇒ (0 1 2 3 9 5) + + -- Function: -update-at (n func list) + Use FUNC to update the Nth element of LIST. Return a copy of LIST + where the Nth element is replaced with the result of calling FUNC + on it. + + See also: ‘-map-when’ (*note -map-when::) + + (-update-at 0 (lambda (x) (+ x 9)) '(0 1 2 3 4 5)) + ⇒ (9 1 2 3 4 5) + (-update-at 1 (lambda (x) (+ x 8)) '(0 1 2 3 4 5)) + ⇒ (0 9 2 3 4 5) + (--update-at 2 (length it) '("foo" "bar" "baz" "quux")) + ⇒ ("foo" "bar" 3 "quux") + + -- Function: -remove-at (n list) + Return LIST with its element at index N removed. That is, remove + any element selected as (nth N LIST) from LIST and return the + result. + + This is a non-destructive operation: parts of LIST (but not + necessarily all of it) are copied as needed to avoid destructively + modifying it. + + See also: ‘-remove-at-indices’ (*note -remove-at-indices::), + ‘-remove’ (*note -remove::). + + (-remove-at 0 '(a b c)) + ⇒ (b c) + (-remove-at 1 '(a b c)) + ⇒ (a c) + (-remove-at 2 '(a b c)) + ⇒ (a b) + + -- Function: -remove-at-indices (indices list) + Return LIST with its elements at INDICES removed. That is, for + each index I in INDICES, remove any element selected as (nth I + LIST) from LIST. + + This is a non-destructive operation: parts of LIST (but not + necessarily all of it) are copied as needed to avoid destructively + modifying it. + + See also: ‘-remove-at’ (*note -remove-at::), ‘-remove’ (*note + -remove::). + + (-remove-at-indices '(0) '(a b c d e)) + ⇒ (b c d e) + (-remove-at-indices '(1 3) '(a b c d e)) + ⇒ (a c e) + (-remove-at-indices '(4 0 2) '(a b c d e)) + ⇒ (b d) + + +File: dash.info, Node: Reductions, Next: Unfolding, Prev: List to list, Up: Functions + +2.4 Reductions +============== + +Functions reducing lists to a single value (which may also be a list). + + -- Function: -reduce-from (fn init list) + Reduce the function FN across LIST, starting with INIT. Return the + result of applying FN to INIT and the first element of LIST, then + applying FN to that result and the second element, etc. If LIST is + empty, return INIT without calling FN. + + This function’s anaphoric counterpart is ‘--reduce-from’. + + For other folds, see also ‘-reduce’ (*note -reduce::) and + ‘-reduce-r’ (*note -reduce-r::). + + (-reduce-from #'- 10 '(1 2 3)) + ⇒ 4 + (-reduce-from #'list 10 '(1 2 3)) + ⇒ (((10 1) 2) 3) + (--reduce-from (concat acc " " it) "START" '("a" "b" "c")) + ⇒ "START a b c" + + -- Function: -reduce-r-from (fn init list) + Reduce the function FN across LIST in reverse, starting with INIT. + Return the result of applying FN to the last element of LIST and + INIT, then applying FN to the second-to-last element and the + previous result of FN, etc. That is, the first argument of FN is + the current element, and its second argument the accumulated value. + If LIST is empty, return INIT without calling FN. + + This function is like ‘-reduce-from’ (*note -reduce-from::) but the + operation associates from the right rather than left. In other + words, it starts from the end of LIST and flips the arguments to + FN. Conceptually, it is like replacing the conses in LIST with + applications of FN, and its last link with INIT, and evaluating the + resulting expression. + + This function’s anaphoric counterpart is ‘--reduce-r-from’. + + For other folds, see also ‘-reduce-r’ (*note -reduce-r::) and + ‘-reduce’ (*note -reduce::). + + (-reduce-r-from #'- 10 '(1 2 3)) + ⇒ -8 + (-reduce-r-from #'list 10 '(1 2 3)) + ⇒ (1 (2 (3 10))) + (--reduce-r-from (concat it " " acc) "END" '("a" "b" "c")) + ⇒ "a b c END" + + -- Function: -reduce (fn list) + Reduce the function FN across LIST. Return the result of applying + FN to the first two elements of LIST, then applying FN to that + result and the third element, etc. If LIST contains a single + element, return it without calling FN. If LIST is empty, return + the result of calling FN with no arguments. + + This function’s anaphoric counterpart is ‘--reduce’. + + For other folds, see also ‘-reduce-from’ (*note -reduce-from::) and + ‘-reduce-r’ (*note -reduce-r::). + + (-reduce #'- '(1 2 3 4)) + ⇒ -8 + (-reduce #'list '(1 2 3 4)) + ⇒ (((1 2) 3) 4) + (--reduce (format "%s-%d" acc it) '(1 2 3)) + ⇒ "1-2-3" + + -- Function: -reduce-r (fn list) + Reduce the function FN across LIST in reverse. Return the result + of applying FN to the last two elements of LIST, then applying FN + to the third-to-last element and the previous result of FN, etc. + That is, the first argument of FN is the current element, and its + second argument the accumulated value. If LIST contains a single + element, return it without calling FN. If LIST is empty, return + the result of calling FN with no arguments. + + This function is like ‘-reduce’ (*note -reduce::) but the operation + associates from the right rather than left. In other words, it + starts from the end of LIST and flips the arguments to FN. + Conceptually, it is like replacing the conses in LIST with + applications of FN, ignoring its last link, and evaluating the + resulting expression. + + This function’s anaphoric counterpart is ‘--reduce-r’. + + For other folds, see also ‘-reduce-r-from’ (*note -reduce-r-from::) + and ‘-reduce’ (*note -reduce::). + + (-reduce-r #'- '(1 2 3 4)) + ⇒ -2 + (-reduce-r #'list '(1 2 3 4)) + ⇒ (1 (2 (3 4))) + (--reduce-r (format "%s-%d" acc it) '(1 2 3)) + ⇒ "3-2-1" + + -- Function: -reductions-from (fn init list) + Return a list of FN’s intermediate reductions across LIST. That + is, a list of the intermediate values of the accumulator when + ‘-reduce-from’ (*note -reduce-from::) (which see) is called with + the same arguments. + + This function’s anaphoric counterpart is ‘--reductions-from’. + + For other folds, see also ‘-reductions’ (*note -reductions::) and + ‘-reductions-r’ (*note -reductions-r::). + + (-reductions-from #'max 0 '(2 1 4 3)) + ⇒ (0 2 2 4 4) + (-reductions-from #'* 1 '(1 2 3 4)) + ⇒ (1 1 2 6 24) + (--reductions-from (format "(FN %s %d)" acc it) "INIT" '(1 2 3)) + ⇒ ("INIT" "(FN INIT 1)" "(FN (FN INIT 1) 2)" "(FN (FN (FN INIT 1) 2) 3)") + + -- Function: -reductions-r-from (fn init list) + Return a list of FN’s intermediate reductions across reversed LIST. + That is, a list of the intermediate values of the accumulator when + ‘-reduce-r-from’ (*note -reduce-r-from::) (which see) is called + with the same arguments. + + This function’s anaphoric counterpart is ‘--reductions-r-from’. + + For other folds, see also ‘-reductions’ (*note -reductions::) and + ‘-reductions-r’ (*note -reductions-r::). + + (-reductions-r-from #'max 0 '(2 1 4 3)) + ⇒ (4 4 4 3 0) + (-reductions-r-from #'* 1 '(1 2 3 4)) + ⇒ (24 24 12 4 1) + (--reductions-r-from (format "(FN %d %s)" it acc) "INIT" '(1 2 3)) + ⇒ ("(FN 1 (FN 2 (FN 3 INIT)))" "(FN 2 (FN 3 INIT))" "(FN 3 INIT)" "INIT") + + -- Function: -reductions (fn list) + Return a list of FN’s intermediate reductions across LIST. That + is, a list of the intermediate values of the accumulator when + ‘-reduce’ (*note -reduce::) (which see) is called with the same + arguments. + + This function’s anaphoric counterpart is ‘--reductions’. + + For other folds, see also ‘-reductions’ (*note -reductions::) and + ‘-reductions-r’ (*note -reductions-r::). + + (-reductions #'+ '(1 2 3 4)) + ⇒ (1 3 6 10) + (-reductions #'* '(1 2 3 4)) + ⇒ (1 2 6 24) + (--reductions (format "(FN %s %d)" acc it) '(1 2 3)) + ⇒ (1 "(FN 1 2)" "(FN (FN 1 2) 3)") + + -- Function: -reductions-r (fn list) + Return a list of FN’s intermediate reductions across reversed LIST. + That is, a list of the intermediate values of the accumulator when + ‘-reduce-r’ (*note -reduce-r::) (which see) is called with the same + arguments. + + This function’s anaphoric counterpart is ‘--reductions-r’. + + For other folds, see also ‘-reductions-r-from’ (*note + -reductions-r-from::) and ‘-reductions’ (*note -reductions::). + + (-reductions-r #'+ '(1 2 3 4)) + ⇒ (10 9 7 4) + (-reductions-r #'* '(1 2 3 4)) + ⇒ (24 24 12 4) + (--reductions-r (format "(FN %d %s)" it acc) '(1 2 3)) + ⇒ ("(FN 1 (FN 2 3))" "(FN 2 3)" 3) + + -- Function: -count (pred list) + Counts the number of items in LIST where (PRED item) is non-‘nil’. + + (-count 'even? '(1 2 3 4 5)) + ⇒ 2 + (--count (< it 4) '(1 2 3 4)) + ⇒ 3 + + -- Function: -sum (list) + Return the sum of LIST. + + (-sum ()) + ⇒ 0 + (-sum '(1)) + ⇒ 1 + (-sum '(1 2 3 4)) + ⇒ 10 + + -- Function: -running-sum (list) + Return a list with running sums of items in LIST. LIST must be + non-empty. + + (-running-sum '(1 2 3 4)) + ⇒ (1 3 6 10) + (-running-sum '(1)) + ⇒ (1) + (-running-sum ()) + error→ Wrong type argument: consp, nil + + -- Function: -product (list) + Return the product of LIST. + + (-product ()) + ⇒ 1 + (-product '(1)) + ⇒ 1 + (-product '(1 2 3 4)) + ⇒ 24 + + -- Function: -running-product (list) + Return a list with running products of items in LIST. LIST must be + non-empty. + + (-running-product '(1 2 3 4)) + ⇒ (1 2 6 24) + (-running-product '(1)) + ⇒ (1) + (-running-product ()) + error→ Wrong type argument: consp, nil + + -- Function: -inits (list) + Return all prefixes of LIST. + + (-inits '(1 2 3 4)) + ⇒ (nil (1) (1 2) (1 2 3) (1 2 3 4)) + (-inits nil) + ⇒ (nil) + (-inits '(1)) + ⇒ (nil (1)) + + -- Function: -tails (list) + Return all suffixes of LIST. + + (-tails '(1 2 3 4)) + ⇒ ((1 2 3 4) (2 3 4) (3 4) (4) nil) + (-tails nil) + ⇒ (nil) + (-tails '(1)) + ⇒ ((1) nil) + + -- Function: -common-prefix (&rest lists) + Return the longest common prefix of LISTS. + + (-common-prefix '(1)) + ⇒ (1) + (-common-prefix '(1 2) '(3 4) '(1 2)) + ⇒ () + (-common-prefix '(1 2) '(1 2 3) '(1 2 3 4)) + ⇒ (1 2) + + -- Function: -common-suffix (&rest lists) + Return the longest common suffix of LISTS. + + (-common-suffix '(1)) + ⇒ (1) + (-common-suffix '(1 2) '(3 4) '(1 2)) + ⇒ () + (-common-suffix '(1 2 3 4) '(2 3 4) '(3 4)) + ⇒ (3 4) + + -- Function: -min (list) + Return the smallest value from LIST of numbers or markers. + + (-min '(0)) + ⇒ 0 + (-min '(3 2 1)) + ⇒ 1 + (-min '(1 2 3)) + ⇒ 1 + + -- Function: -min-by (comparator list) + Take a comparison function COMPARATOR and a LIST and return the + least element of the list by the comparison function. + + See also combinator ‘-on’ (*note -on::) which can transform the + values before comparing them. + + (-min-by '> '(4 3 6 1)) + ⇒ 1 + (--min-by (> (car it) (car other)) '((1 2 3) (2) (3 2))) + ⇒ (1 2 3) + (--min-by (> (length it) (length other)) '((1 2 3) (2) (3 2))) + ⇒ (2) + + -- Function: -max (list) + Return the largest value from LIST of numbers or markers. + + (-max '(0)) + ⇒ 0 + (-max '(3 2 1)) + ⇒ 3 + (-max '(1 2 3)) + ⇒ 3 + + -- Function: -max-by (comparator list) + Take a comparison function COMPARATOR and a LIST and return the + greatest element of the list by the comparison function. + + See also combinator ‘-on’ (*note -on::) which can transform the + values before comparing them. + + (-max-by '> '(4 3 6 1)) + ⇒ 6 + (--max-by (> (car it) (car other)) '((1 2 3) (2) (3 2))) + ⇒ (3 2) + (--max-by (> (length it) (length other)) '((1 2 3) (2) (3 2))) + ⇒ (1 2 3) + + -- Function: -frequencies (list) + Count the occurrences of each distinct element of LIST. + + Return an alist of (ELEMENT . N), where each ELEMENT occurs N + times in LIST. + + The test for equality is done with ‘equal’, or with ‘-compare-fn’ + if that is non-‘nil’. + + See also ‘-count’ (*note -count::) and ‘-group-by’ (*note + -group-by::). + + (-frequencies ()) + ⇒ () + (-frequencies '(1 2 3 1 2 1)) + ⇒ ((1 . 3) (2 . 2) (3 . 1)) + (let ((-compare-fn #'string=)) (-frequencies '(a "a"))) + ⇒ ((a . 2)) + + +File: dash.info, Node: Unfolding, Next: Predicates, Prev: Reductions, Up: Functions + +2.5 Unfolding +============= + +Operations dual to reductions, building lists from a seed value rather +than consuming a list to produce a single value. + + -- Function: -iterate (fun init n) + Return a list of iterated applications of FUN to INIT. + + This means a list of the form: + + (INIT (FUN INIT) (FUN (FUN INIT)) ...) + + N is the length of the returned list. + + (-iterate #'1+ 1 10) + ⇒ (1 2 3 4 5 6 7 8 9 10) + (-iterate (lambda (x) (+ x x)) 2 5) + ⇒ (2 4 8 16 32) + (--iterate (* it it) 2 5) + ⇒ (2 4 16 256 65536) + + -- Function: -unfold (fun seed) + Build a list from SEED using FUN. + + This is "dual" operation to ‘-reduce-r’ (*note -reduce-r::): while + -reduce-r consumes a list to produce a single value, ‘-unfold’ + (*note -unfold::) takes a seed value and builds a (potentially + infinite!) list. + + FUN should return ‘nil’ to stop the generating process, or a cons + (A . B), where A will be prepended to the result and B is the new + seed. + + (-unfold (lambda (x) (unless (= x 0) (cons x (1- x)))) 10) + ⇒ (10 9 8 7 6 5 4 3 2 1) + (--unfold (when it (cons it (cdr it))) '(1 2 3 4)) + ⇒ ((1 2 3 4) (2 3 4) (3 4) (4)) + (--unfold (when it (cons it (butlast it))) '(1 2 3 4)) + ⇒ ((1 2 3 4) (1 2 3) (1 2) (1)) + + -- Function: -repeat (n x) + Return a new list of length N with each element being X. Return + ‘nil’ if N is less than 1. + + (-repeat 3 :a) + ⇒ (:a :a :a) + (-repeat 1 :a) + ⇒ (:a) + (-repeat 0 :a) + ⇒ () + + -- Function: -cycle (list) + Return an infinite circular copy of LIST. The returned list cycles + through the elements of LIST and repeats from the beginning. + + (-take 5 (-cycle '(1 2 3))) + ⇒ (1 2 3 1 2) + (-take 7 (-cycle '(1 "and" 3))) + ⇒ (1 "and" 3 1 "and" 3 1) + (-zip-lists (-cycle '(3)) '(1 2)) + ⇒ ((3 1) (3 2)) + + +File: dash.info, Node: Predicates, Next: Partitioning, Prev: Unfolding, Up: Functions + +2.6 Predicates +============== + +Reductions of one or more lists to a boolean value. + + -- Function: -some (pred list) + Return (PRED x) for the first LIST item where (PRED x) is + non-‘nil’, else ‘nil’. + + Alias: ‘-any’. + + This function’s anaphoric counterpart is ‘--some’. + + (-some #'stringp '(1 "2" 3)) + ⇒ t + (--some (string-match-p "x" it) '("foo" "axe" "xor")) + ⇒ 1 + (--some (= it-index 3) '(0 1 2)) + ⇒ nil + + -- Function: -every (pred list) + Return non-‘nil’ if PRED returns non-‘nil’ for all items in LIST. + If so, return the last such result of PRED. Otherwise, once an + item is reached for which PRED returns ‘nil’, return ‘nil’ without + calling PRED on any further LIST elements. + + This function is like ‘-every-p’, but on success returns the last + non-‘nil’ result of PRED instead of just ‘t’. + + This function’s anaphoric counterpart is ‘--every’. + + (-every #'numberp '(1 2 3)) + ⇒ t + (--every (string-match-p "x" it) '("axe" "xor")) + ⇒ 0 + (--every (= it it-index) '(0 1 3)) + ⇒ nil + + -- Function: -any? (pred list) + Return ‘t’ if (PRED X) is non-‘nil’ for any X in LIST, else ‘nil’. + + Alias: ‘-any-p’, ‘-some?’, ‘-some-p’ + + (-any? #'numberp '(nil 0 t)) + ⇒ t + (-any? #'numberp '(nil t t)) + ⇒ nil + (-any? #'null '(1 3 5)) + ⇒ nil + + -- Function: -all? (pred list) + Return ‘t’ if (PRED X) is non-‘nil’ for all X in LIST, else ‘nil’. + In the latter case, stop after the first X for which (PRED X) is + ‘nil’, without calling PRED on any subsequent elements of LIST. + + The similar function ‘-every’ (*note -every::) is more widely + useful, since it returns the last non-‘nil’ result of PRED instead + of just ‘t’ on success. + + Alias: ‘-all-p’, ‘-every-p’, ‘-every?’. + + This function’s anaphoric counterpart is ‘--all?’. + + (-all? #'numberp '(1 2 3)) + ⇒ t + (-all? #'numberp '(2 t 6)) + ⇒ nil + (--all? (= 0 (% it 2)) '(2 4 6)) + ⇒ t + + -- Function: -none? (pred list) + Return ‘t’ if (PRED X) is ‘nil’ for all X in LIST, else ‘nil’. + + Alias: ‘-none-p’ + + (-none? 'even? '(1 2 3)) + ⇒ nil + (-none? 'even? '(1 3 5)) + ⇒ t + (--none? (= 0 (% it 2)) '(1 2 3)) + ⇒ nil + + -- Function: -only-some? (pred list) + Return ‘t’ if different LIST items both satisfy and do not satisfy + PRED. That is, if PRED returns both ‘nil’ for at least one item, + and non-‘nil’ for at least one other item in LIST. Return ‘nil’ if + all items satisfy the predicate or none of them do. + + Alias: ‘-only-some-p’ + + (-only-some? 'even? '(1 2 3)) + ⇒ t + (-only-some? 'even? '(1 3 5)) + ⇒ nil + (-only-some? 'even? '(2 4 6)) + ⇒ nil + + -- Function: -contains? (list element) + Return non-‘nil’ if LIST contains ELEMENT. + + The test for equality is done with ‘equal’, or with ‘-compare-fn’ + if that is non-‘nil’. As with ‘member’, the return value is + actually the tail of LIST whose car is ELEMENT. + + Alias: ‘-contains-p’. + + (-contains? '(1 2 3) 1) + ⇒ (1 2 3) + (-contains? '(1 2 3) 2) + ⇒ (2 3) + (-contains? '(1 2 3) 4) + ⇒ () + + -- Function: -is-prefix? (prefix list) + Return non-‘nil’ if PREFIX is a prefix of LIST. + + Alias: ‘-is-prefix-p’. + + (-is-prefix? '(1 2 3) '(1 2 3 4 5)) + ⇒ t + (-is-prefix? '(1 2 3 4 5) '(1 2 3)) + ⇒ nil + (-is-prefix? '(1 3) '(1 2 3 4 5)) + ⇒ nil + + -- Function: -is-suffix? (suffix list) + Return non-‘nil’ if SUFFIX is a suffix of LIST. + + Alias: ‘-is-suffix-p’. + + (-is-suffix? '(3 4 5) '(1 2 3 4 5)) + ⇒ t + (-is-suffix? '(1 2 3 4 5) '(3 4 5)) + ⇒ nil + (-is-suffix? '(3 5) '(1 2 3 4 5)) + ⇒ nil + + -- Function: -is-infix? (infix list) + Return non-‘nil’ if INFIX is infix of LIST. + + This operation runs in O(n^2) time + + Alias: ‘-is-infix-p’ + + (-is-infix? '(1 2 3) '(1 2 3 4 5)) + ⇒ t + (-is-infix? '(2 3 4) '(1 2 3 4 5)) + ⇒ t + (-is-infix? '(3 4 5) '(1 2 3 4 5)) + ⇒ t + + -- Function: -cons-pair? (obj) + Return non-‘nil’ if OBJ is a true cons pair. That is, a cons (A . + B) where B is not a list. + + Alias: ‘-cons-pair-p’. + + (-cons-pair? '(1 . 2)) + ⇒ t + (-cons-pair? '(1 2)) + ⇒ nil + (-cons-pair? '(1)) + ⇒ nil + + +File: dash.info, Node: Partitioning, Next: Indexing, Prev: Predicates, Up: Functions + +2.7 Partitioning +================ + +Functions partitioning the input list into a list of lists. + + -- Function: -split-at (n list) + Split LIST into two sublists after the Nth element. The result is + a list of two elements (TAKE DROP) where TAKE is a new list of the + first N elements of LIST, and DROP is the remaining elements of + LIST (not a copy). TAKE and DROP are like the results of ‘-take’ + (*note -take::) and ‘-drop’ (*note -drop::), respectively, but the + split is done in a single list traversal. + + (-split-at 3 '(1 2 3 4 5)) + ⇒ ((1 2 3) (4 5)) + (-split-at 17 '(1 2 3 4 5)) + ⇒ ((1 2 3 4 5) nil) + (-split-at 0 '(1 2 3 4 5)) + ⇒ (nil (1 2 3 4 5)) + + -- Function: -split-with (pred list) + Split LIST into a prefix satisfying PRED, and the rest. The first + sublist is the prefix of LIST with successive elements satisfying + PRED, and the second sublist is the remaining elements that do not. + The result is like performing + + ((-take-while PRED LIST) (-drop-while PRED LIST)) + + but in no more than a single pass through LIST. + + (-split-with 'even? '(1 2 3 4)) + ⇒ (nil (1 2 3 4)) + (-split-with 'even? '(2 4 5 6)) + ⇒ ((2 4) (5 6)) + (--split-with (< it 4) '(1 2 3 4 3 2 1)) + ⇒ ((1 2 3) (4 3 2 1)) + + -- Macro: -split-on (item list) + Split the LIST each time ITEM is found. + + Unlike ‘-partition-by’ (*note -partition-by::), the ITEM is + discarded from the results. Empty lists are also removed from the + result. + + Comparison is done by ‘equal’. + + See also ‘-split-when’ (*note -split-when::) + + (-split-on '| '(Nil | Leaf a | Node [Tree a])) + ⇒ ((Nil) (Leaf a) (Node [Tree a])) + (-split-on :endgroup '("a" "b" :endgroup "c" :endgroup "d" "e")) + ⇒ (("a" "b") ("c") ("d" "e")) + (-split-on :endgroup '("a" "b" :endgroup :endgroup "d" "e")) + ⇒ (("a" "b") ("d" "e")) + + -- Function: -split-when (fn list) + Split the LIST on each element where FN returns non-‘nil’. + + Unlike ‘-partition-by’ (*note -partition-by::), the "matched" + element is discarded from the results. Empty lists are also + removed from the result. + + This function can be thought of as a generalization of + ‘split-string’. + + (-split-when 'even? '(1 2 3 4 5 6)) + ⇒ ((1) (3) (5)) + (-split-when 'even? '(1 2 3 4 6 8 9)) + ⇒ ((1) (3) (9)) + (--split-when (memq it '(&optional &rest)) '(a b &optional c d &rest args)) + ⇒ ((a b) (c d) (args)) + + -- Function: -separate (pred list) + Split LIST into two sublists based on whether items satisfy PRED. + The result is like performing + + ((-filter PRED LIST) (-remove PRED LIST)) + + but in a single pass through LIST. + + (-separate (lambda (num) (= 0 (% num 2))) '(1 2 3 4 5 6 7)) + ⇒ ((2 4 6) (1 3 5 7)) + (--separate (< it 5) '(3 7 5 9 3 2 1 4 6)) + ⇒ ((3 3 2 1 4) (7 5 9 6)) + (-separate 'cdr '((1 2) (1) (1 2 3) (4))) + ⇒ (((1 2) (1 2 3)) ((1) (4))) + + -- Function: -partition (n list) + Return a new list with the items in LIST grouped into N-sized + sublists. If there are not enough items to make the last group + N-sized, those items are discarded. + + (-partition 2 '(1 2 3 4 5 6)) + ⇒ ((1 2) (3 4) (5 6)) + (-partition 2 '(1 2 3 4 5 6 7)) + ⇒ ((1 2) (3 4) (5 6)) + (-partition 3 '(1 2 3 4 5 6 7)) + ⇒ ((1 2 3) (4 5 6)) + + -- Function: -partition-all (n list) + Return a new list with the items in LIST grouped into N-sized + sublists. The last group may contain less than N items. + + (-partition-all 2 '(1 2 3 4 5 6)) + ⇒ ((1 2) (3 4) (5 6)) + (-partition-all 2 '(1 2 3 4 5 6 7)) + ⇒ ((1 2) (3 4) (5 6) (7)) + (-partition-all 3 '(1 2 3 4 5 6 7)) + ⇒ ((1 2 3) (4 5 6) (7)) + + -- Function: -partition-in-steps (n step list) + Partition LIST into sublists of length N that are STEP items apart. + Like ‘-partition-all-in-steps’ (*note -partition-all-in-steps::), + but if there are not enough items to make the last group N-sized, + those items are discarded. + + (-partition-in-steps 2 1 '(1 2 3 4)) + ⇒ ((1 2) (2 3) (3 4)) + (-partition-in-steps 3 2 '(1 2 3 4)) + ⇒ ((1 2 3)) + (-partition-in-steps 3 2 '(1 2 3 4 5)) + ⇒ ((1 2 3) (3 4 5)) + + -- Function: -partition-all-in-steps (n step list) + Partition LIST into sublists of length N that are STEP items apart. + Adjacent groups may overlap if N exceeds the STEP stride. Trailing + groups may contain less than N items. + + (-partition-all-in-steps 2 1 '(1 2 3 4)) + ⇒ ((1 2) (2 3) (3 4) (4)) + (-partition-all-in-steps 3 2 '(1 2 3 4)) + ⇒ ((1 2 3) (3 4)) + (-partition-all-in-steps 3 2 '(1 2 3 4 5)) + ⇒ ((1 2 3) (3 4 5) (5)) + + -- Function: -partition-by (fn list) + Apply FN to each item in LIST, splitting it each time FN returns a + new value. + + (-partition-by 'even? ()) + ⇒ () + (-partition-by 'even? '(1 1 2 2 2 3 4 6 8)) + ⇒ ((1 1) (2 2 2) (3) (4 6 8)) + (--partition-by (< it 3) '(1 2 3 4 3 2 1)) + ⇒ ((1 2) (3 4 3) (2 1)) + + -- Function: -partition-by-header (fn list) + Apply FN to the first item in LIST. That is the header value. + Apply FN to each item in LIST, splitting it each time FN returns + the header value, but only after seeing at least one other value + (the body). + + (--partition-by-header (= it 1) '(1 2 3 1 2 1 2 3 4)) + ⇒ ((1 2 3) (1 2) (1 2 3 4)) + (--partition-by-header (> it 0) '(1 2 0 1 0 1 2 3 0)) + ⇒ ((1 2 0) (1 0) (1 2 3 0)) + (-partition-by-header 'even? '(2 1 1 1 4 1 3 5 6 6 1)) + ⇒ ((2 1 1 1) (4 1 3 5) (6 6 1)) + + -- Function: -partition-after-pred (pred list) + Partition LIST after each element for which PRED returns non-‘nil’. + + This function’s anaphoric counterpart is ‘--partition-after-pred’. + + (-partition-after-pred #'booleanp ()) + ⇒ () + (-partition-after-pred #'booleanp '(t t)) + ⇒ ((t) (t)) + (-partition-after-pred #'booleanp '(0 0 t t 0 t)) + ⇒ ((0 0 t) (t) (0 t)) + + -- Function: -partition-before-pred (pred list) + Partition directly before each time PRED is true on an element of + LIST. + + (-partition-before-pred #'booleanp ()) + ⇒ () + (-partition-before-pred #'booleanp '(0 t)) + ⇒ ((0) (t)) + (-partition-before-pred #'booleanp '(0 0 t 0 t t)) + ⇒ ((0 0) (t 0) (t) (t)) + + -- Function: -partition-before-item (item list) + Partition directly before each time ITEM appears in LIST. + + (-partition-before-item 3 ()) + ⇒ () + (-partition-before-item 3 '(1)) + ⇒ ((1)) + (-partition-before-item 3 '(3)) + ⇒ ((3)) + + -- Function: -partition-after-item (item list) + Partition directly after each time ITEM appears in LIST. + + (-partition-after-item 3 ()) + ⇒ () + (-partition-after-item 3 '(1)) + ⇒ ((1)) + (-partition-after-item 3 '(3)) + ⇒ ((3)) + + -- Function: -group-by (fn list) + Separate LIST into an alist whose keys are FN applied to the + elements of LIST. Keys are compared by ‘equal’. + + (-group-by 'even? ()) + ⇒ () + (-group-by 'even? '(1 1 2 2 2 3 4 6 8)) + ⇒ ((nil 1 1 3) (t 2 2 2 4 6 8)) + (--group-by (car (split-string it "/")) '("a/b" "c/d" "a/e")) + ⇒ (("a" "a/b" "a/e") ("c" "c/d")) + + +File: dash.info, Node: Indexing, Next: Set operations, Prev: Partitioning, Up: Functions + +2.8 Indexing +============ + +Functions retrieving or sorting based on list indices and related +predicates. + + -- Function: -elem-index (elem list) + Return the first index of ELEM in LIST. That is, the index within + LIST of the first element that is ‘equal’ to ELEM. Return ‘nil’ if + there is no such element. + + See also: ‘-find-index’ (*note -find-index::). + + (-elem-index 2 '(6 7 8 3 4)) + ⇒ nil + (-elem-index "bar" '("foo" "bar" "baz")) + ⇒ 1 + (-elem-index '(1 2) '((3) (5 6) (1 2) nil)) + ⇒ 2 + + -- Function: -elem-indices (elem list) + Return the list of indices at which ELEM appears in LIST. That is, + the indices of all elements of LIST ‘equal’ to ELEM, in the same + ascending order as they appear in LIST. + + (-elem-indices 2 '(6 7 8 3 4 1)) + ⇒ () + (-elem-indices "bar" '("foo" "bar" "baz")) + ⇒ (1) + (-elem-indices '(1 2) '((3) (1 2) (5 6) (1 2) nil)) + ⇒ (1 3) + + -- Function: -find-index (pred list) + Return the index of the first item satisfying PRED in LIST. Return + ‘nil’ if no such item is found. + + PRED is called with one argument, the current list element, until + it returns non-‘nil’, at which point the search terminates. + + This function’s anaphoric counterpart is ‘--find-index’. + + See also: ‘-first’ (*note -first::), ‘-find-last-index’ (*note + -find-last-index::). + + (-find-index #'numberp '(a b c)) + ⇒ nil + (-find-index #'natnump '(1 0 -1)) + ⇒ 0 + (--find-index (> it 5) '(2 4 1 6 3 3 5 8)) + ⇒ 3 + + -- Function: -find-last-index (pred list) + Return the index of the last item satisfying PRED in LIST. Return + ‘nil’ if no such item is found. + + Predicate PRED is called with one argument each time, namely the + current list element. + + This function’s anaphoric counterpart is ‘--find-last-index’. + + See also: ‘-last’ (*note -last::), ‘-find-index’ (*note + -find-index::). + + (-find-last-index #'numberp '(a b c)) + ⇒ nil + (--find-last-index (> it 5) '(2 7 1 6 3 8 5 2)) + ⇒ 5 + (-find-last-index (-partial #'string< 'a) '(c b a)) + ⇒ 1 + + -- Function: -find-indices (pred list) + Return the list of indices in LIST satisfying PRED. + + Each element of LIST in turn is passed to PRED. If the result is + non-‘nil’, the index of that element in LIST is included in the + result. The returned indices are in ascending order, i.e., in the + same order as they appear in LIST. + + This function’s anaphoric counterpart is ‘--find-indices’. + + See also: ‘-find-index’ (*note -find-index::), ‘-elem-indices’ + (*note -elem-indices::). + + (-find-indices #'numberp '(a b c)) + ⇒ () + (-find-indices #'numberp '(8 1 d 2 b c a 3)) + ⇒ (0 1 3 7) + (--find-indices (> it 5) '(2 4 1 6 3 3 5 8)) + ⇒ (3 7) + + -- Function: -grade-up (comparator list) + Grade elements of LIST using COMPARATOR relation. This yields a + permutation vector such that applying this permutation to LIST + sorts it in ascending order. + + (-grade-up #'< '(3 1 4 2 1 3 3)) + ⇒ (1 4 3 0 5 6 2) + (let ((l '(3 1 4 2 1 3 3))) (-select-by-indices (-grade-up #'< l) l)) + ⇒ (1 1 2 3 3 3 4) + + -- Function: -grade-down (comparator list) + Grade elements of LIST using COMPARATOR relation. This yields a + permutation vector such that applying this permutation to LIST + sorts it in descending order. + + (-grade-down #'< '(3 1 4 2 1 3 3)) + ⇒ (2 0 5 6 3 1 4) + (let ((l '(3 1 4 2 1 3 3))) (-select-by-indices (-grade-down #'< l) l)) + ⇒ (4 3 3 3 2 1 1) + + +File: dash.info, Node: Set operations, Next: Other list operations, Prev: Indexing, Up: Functions + +2.9 Set operations +================== + +Operations pretending lists are sets. + + -- Function: -union (list1 list2) + Return a new list of distinct elements appearing in either LIST1 or + LIST2. + + The test for equality is done with ‘equal’, or with ‘-compare-fn’ + if that is non-‘nil’. + + (-union '(1 2 3) '(3 4 5)) + ⇒ (1 2 3 4 5) + (-union '(1 2 2 4) ()) + ⇒ (1 2 4) + (-union '(1 1 2 2) '(4 4 3 2 1)) + ⇒ (1 2 4 3) + + -- Function: -difference (list1 list2) + Return a new list with the distinct members of LIST1 that are not + in LIST2. + + The test for equality is done with ‘equal’, or with ‘-compare-fn’ + if that is non-‘nil’. + + (-difference () ()) + ⇒ () + (-difference '(1 2 3) '(4 5 6)) + ⇒ (1 2 3) + (-difference '(1 2 3 4) '(3 4 5 6)) + ⇒ (1 2) + + -- Function: -intersection (list1 list2) + Return a new list of distinct elements appearing in both LIST1 and + LIST2. + + The test for equality is done with ‘equal’, or with ‘-compare-fn’ + if that is non-‘nil’. + + (-intersection () ()) + ⇒ () + (-intersection '(1 2 3) '(4 5 6)) + ⇒ () + (-intersection '(1 2 2 3) '(4 3 3 2)) + ⇒ (2 3) + + -- Function: -powerset (list) + Return the power set of LIST. + + (-powerset ()) + ⇒ (nil) + (-powerset '(x y)) + ⇒ ((x y) (x) (y) nil) + (-powerset '(x y z)) + ⇒ ((x y z) (x y) (x z) (x) (y z) (y) (z) nil) + + -- Function: -permutations (list) + Return the distinct permutations of LIST. + + Duplicate elements of LIST are determined by ‘equal’, or by + ‘-compare-fn’ if that is non-‘nil’. + + (-permutations ()) + ⇒ (nil) + (-permutations '(a a b)) + ⇒ ((a a b) (a b a) (b a a)) + (-permutations '(a b c)) + ⇒ ((a b c) (a c b) (b a c) (b c a) (c a b) (c b a)) + + -- Function: -distinct (list) + Return a copy of LIST with all duplicate elements removed. + + The test for equality is done with ‘equal’, or with ‘-compare-fn’ + if that is non-‘nil’. + + Alias: ‘-uniq’. + + (-distinct ()) + ⇒ () + (-distinct '(1 1 2 3 3)) + ⇒ (1 2 3) + (-distinct '(t t t)) + ⇒ (t) + + -- Function: -same-items? (list1 list2) + Return non-‘nil’ if LIST1 and LIST2 have the same distinct + elements. + + The order of the elements in the lists does not matter. The lists + may be of different lengths, i.e., contain duplicate elements. The + test for equality is done with ‘equal’, or with ‘-compare-fn’ if + that is non-‘nil’. + + Alias: ‘-same-items-p’. + + (-same-items? '(1 2 3) '(1 2 3)) + ⇒ t + (-same-items? '(1 1 2 3) '(3 3 2 1)) + ⇒ t + (-same-items? '(1 2 3) '(1 2 3 4)) + ⇒ nil + + +File: dash.info, Node: Other list operations, Next: Tree operations, Prev: Set operations, Up: Functions + +2.10 Other list operations +========================== + +Other list functions not fit to be classified elsewhere. + + -- Function: -rotate (n list) + Rotate LIST N places to the right (left if N is negative). The + time complexity is O(n). + + (-rotate 3 '(1 2 3 4 5 6 7)) + ⇒ (5 6 7 1 2 3 4) + (-rotate -3 '(1 2 3 4 5 6 7)) + ⇒ (4 5 6 7 1 2 3) + (-rotate 16 '(1 2 3 4 5 6 7)) + ⇒ (6 7 1 2 3 4 5) + + -- Function: -cons* (&rest args) + Make a new list from the elements of ARGS. The last 2 elements of + ARGS are used as the final cons of the result, so if the final + element of ARGS is not a list, the result is a dotted list. With + no ARGS, return ‘nil’. + + (-cons* 1 2) + ⇒ (1 . 2) + (-cons* 1 2 3) + ⇒ (1 2 . 3) + (-cons* 1) + ⇒ 1 + + -- Function: -snoc (list elem &rest elements) + Append ELEM to the end of the list. + + This is like ‘cons’, but operates on the end of list. + + If any ELEMENTS are given, append them to the list as well. + + (-snoc '(1 2 3) 4) + ⇒ (1 2 3 4) + (-snoc '(1 2 3) 4 5 6) + ⇒ (1 2 3 4 5 6) + (-snoc '(1 2 3) '(4 5 6)) + ⇒ (1 2 3 (4 5 6)) + + -- Function: -interpose (sep list) + Return a new list of all elements in LIST separated by SEP. + + (-interpose "-" ()) + ⇒ () + (-interpose "-" '("a")) + ⇒ ("a") + (-interpose "-" '("a" "b" "c")) + ⇒ ("a" "-" "b" "-" "c") + + -- Function: -interleave (&rest lists) + Return a new list of the first item in each list, then the second + etc. + + (-interleave '(1 2) '("a" "b")) + ⇒ (1 "a" 2 "b") + (-interleave '(1 2) '("a" "b") '("A" "B")) + ⇒ (1 "a" "A" 2 "b" "B") + (-interleave '(1 2 3) '("a" "b")) + ⇒ (1 "a" 2 "b") + + -- Function: -iota (count &optional start step) + Return a list containing COUNT numbers. Starts from START and adds + STEP each time. The default START is zero, the default STEP is 1. + This function takes its name from the corresponding primitive in + the APL language. + + (-iota 6) + ⇒ (0 1 2 3 4 5) + (-iota 4 2.5 -2) + ⇒ (2.5 0.5 -1.5 -3.5) + (-iota -1) + error→ Wrong type argument: natnump, -1 + + -- Function: -zip-with (fn list1 list2) + Zip LIST1 and LIST2 into a new list using the function FN. That + is, apply FN pairwise taking as first argument the next element of + LIST1 and as second argument the next element of LIST2 at the + corresponding position. The result is as long as the shorter list. + + This function’s anaphoric counterpart is ‘--zip-with’. + + For other zips, see also ‘-zip-lists’ (*note -zip-lists::) and + ‘-zip-fill’ (*note -zip-fill::). + + (-zip-with #'+ '(1 2 3 4) '(5 6 7)) + ⇒ (6 8 10) + (-zip-with #'cons '(1 2 3) '(4 5 6 7)) + ⇒ ((1 . 4) (2 . 5) (3 . 6)) + (--zip-with (format "%s & %s" it other) '(Batman Jekyll) '(Robin Hyde)) + ⇒ ("Batman & Robin" "Jekyll & Hyde") + + -- Function: -zip-pair (list1 list2) + Zip LIST1 and LIST2 together. + + Make a pair with the head of each list, followed by a pair with the + second element of each list, and so on. The number of pairs + returned is equal to the length of the shorter input list. + + See also: ‘-zip-lists’ (*note -zip-lists::). + + (-zip-pair '(1 2 3 4) '(5 6 7)) + ⇒ ((1 . 5) (2 . 6) (3 . 7)) + (-zip-pair '(1 2 3) '(4 5 6)) + ⇒ ((1 . 4) (2 . 5) (3 . 6)) + (-zip-pair '(1 2) '(3)) + ⇒ ((1 . 3)) + + -- Function: -zip-lists (&rest lists) + Zip LISTS together. + + Group the head of each list, followed by the second element of each + list, and so on. The number of returned groupings is equal to the + length of the shortest input list, and the length of each grouping + is equal to the number of input LISTS. + + The return value is always a list of proper lists, in contrast to + ‘-zip’ (*note -zip::) which returns a list of dotted pairs when + only two input LISTS are provided. + + See also: ‘-zip-pair’ (*note -zip-pair::). + + (-zip-lists '(1 2 3) '(4 5 6)) + ⇒ ((1 4) (2 5) (3 6)) + (-zip-lists '(1 2 3) '(4 5 6 7)) + ⇒ ((1 4) (2 5) (3 6)) + (-zip-lists '(1 2) '(3 4 5) '(6)) + ⇒ ((1 3 6)) + + -- Function: -zip-lists-fill (fill-value &rest lists) + Zip LISTS together, padding shorter lists with FILL-VALUE. This is + like ‘-zip-lists’ (*note -zip-lists::) (which see), except it + retains all elements at positions beyond the end of the shortest + list. The number of returned groupings is equal to the length of + the longest input list, and the length of each grouping is equal to + the number of input LISTS. + + (-zip-lists-fill 0 '(1 2) '(3 4 5) '(6)) + ⇒ ((1 3 6) (2 4 0) (0 5 0)) + (-zip-lists-fill 0 '(1 2) '(3 4) '(5 6)) + ⇒ ((1 3 5) (2 4 6)) + (-zip-lists-fill 0 '(1 2 3) nil) + ⇒ ((1 0) (2 0) (3 0)) + + -- Function: -zip (&rest lists) + Zip LISTS together. + + Group the head of each list, followed by the second element of each + list, and so on. The number of returned groupings is equal to the + length of the shortest input list, and the number of items in each + grouping is equal to the number of input LISTS. + + If only two LISTS are provided as arguments, return the groupings + as a list of dotted pairs. Otherwise, return the groupings as a + list of proper lists. + + Since the return value changes form depending on the number of + arguments, it is generally recommended to use ‘-zip-lists’ (*note + -zip-lists::) instead, or ‘-zip-pair’ (*note -zip-pair::) if a list + of dotted pairs is desired. + + See also: ‘-unzip’ (*note -unzip::). + + (-zip '(1 2 3 4) '(5 6 7) '(8 9)) + ⇒ ((1 5 8) (2 6 9)) + (-zip '(1 2 3) '(4 5 6) '(7 8 9)) + ⇒ ((1 4 7) (2 5 8) (3 6 9)) + (-zip '(1 2 3)) + ⇒ ((1) (2) (3)) + + -- Function: -zip-fill (fill-value &rest lists) + Zip LISTS together, padding shorter lists with FILL-VALUE. This is + like ‘-zip’ (*note -zip::) (which see), except it retains all + elements at positions beyond the end of the shortest list. The + number of returned groupings is equal to the length of the longest + input list, and the length of each grouping is equal to the number + of input LISTS. + + Since the return value changes form depending on the number of + arguments, it is generally recommended to use ‘-zip-lists-fill’ + (*note -zip-lists-fill::) instead, unless a list of dotted pairs is + explicitly desired. + + (-zip-fill 0 '(1 2 3) '(4 5)) + ⇒ ((1 . 4) (2 . 5) (3 . 0)) + (-zip-fill 0 () '(1 2 3)) + ⇒ ((0 . 1) (0 . 2) (0 . 3)) + (-zip-fill 0 '(1 2) '(3 4) '(5 6)) + ⇒ ((1 3 5) (2 4 6)) + + -- Function: -unzip-lists (lists) + Unzip LISTS. + + This works just like ‘-zip-lists’ (*note -zip-lists::) (which see), + but takes a list of lists instead of a variable number of + arguments, such that + + (-unzip-lists (-zip-lists ARGS...)) + + is identity (given that the lists comprising ARGS are of the same + length). + + (-unzip-lists (-zip-lists '(1 2) '(3 4) '(5 6))) + ⇒ ((1 2) (3 4) (5 6)) + (-unzip-lists '((1 2 3) (4 5) (6 7) (8 9))) + ⇒ ((1 4 6 8) (2 5 7 9)) + (-unzip-lists '((1 2 3) (4 5 6))) + ⇒ ((1 4) (2 5) (3 6)) + + -- Function: -unzip (lists) + Unzip LISTS. + + This works just like ‘-zip’ (*note -zip::) (which see), but takes a + list of lists instead of a variable number of arguments, such that + + (-unzip (-zip L1 L2 L3 ...)) + + is identity (given that the lists are of the same length, and that + ‘-zip’ (*note -zip::) is not called with two arguments, because of + the caveat described in its docstring). + + Note in particular that calling ‘-unzip’ (*note -unzip::) on a list + of two lists will return a list of dotted pairs. + + Since the return value changes form depending on the number of + LISTS, it is generally recommended to use ‘-unzip-lists’ (*note + -unzip-lists::) instead. + + (-unzip (-zip '(1 2) '(3 4) '(5 6))) + ⇒ ((1 . 2) (3 . 4) (5 . 6)) + (-unzip '((1 2 3) (4 5 6))) + ⇒ ((1 . 4) (2 . 5) (3 . 6)) + (-unzip '((1 2 3) (4 5) (6 7) (8 9))) + ⇒ ((1 4 6 8) (2 5 7 9)) + + -- Function: -pad (fill-value &rest lists) + Pad each of LISTS with FILL-VALUE until they all have equal + lengths. + + Ensure all LISTS are as long as the longest one by repeatedly + appending FILL-VALUE to the shorter lists, and return the resulting + LISTS. + + (-pad 0 ()) + ⇒ (nil) + (-pad 0 '(1 2) '(3 4)) + ⇒ ((1 2) (3 4)) + (-pad 0 '(1 2) '(3 4 5 6) '(7 8 9)) + ⇒ ((1 2 0 0) (3 4 5 6) (7 8 9 0)) + + -- Function: -table (fn &rest lists) + Compute outer product of LISTS using function FN. + + The function FN should have the same arity as the number of + supplied lists. + + The outer product is computed by applying fn to all possible + combinations created by taking one element from each list in order. + The dimension of the result is (length lists). + + See also: ‘-table-flat’ (*note -table-flat::) + + (-table '* '(1 2 3) '(1 2 3)) + ⇒ ((1 2 3) (2 4 6) (3 6 9)) + (-table (lambda (a b) (-sum (-zip-with '* a b))) '((1 2) (3 4)) '((1 3) (2 4))) + ⇒ ((7 15) (10 22)) + (apply '-table 'list (-repeat 3 '(1 2))) + ⇒ ((((1 1 1) (2 1 1)) ((1 2 1) (2 2 1))) (((1 1 2) (2 1 2)) ((1 2 2) (2 2 2)))) + + -- Function: -table-flat (fn &rest lists) + Compute flat outer product of LISTS using function FN. + + The function FN should have the same arity as the number of + supplied lists. + + The outer product is computed by applying fn to all possible + combinations created by taking one element from each list in order. + The results are flattened, ignoring the tensor structure of the + result. This is equivalent to calling: + + (-flatten-n (1- (length lists)) (apply ’-table fn lists)) + + but the implementation here is much more efficient. + + See also: ‘-flatten-n’ (*note -flatten-n::), ‘-table’ (*note + -table::) + + (-table-flat 'list '(1 2 3) '(a b c)) + ⇒ ((1 a) (2 a) (3 a) (1 b) (2 b) (3 b) (1 c) (2 c) (3 c)) + (-table-flat '* '(1 2 3) '(1 2 3)) + ⇒ (1 2 3 2 4 6 3 6 9) + (apply '-table-flat 'list (-repeat 3 '(1 2))) + ⇒ ((1 1 1) (2 1 1) (1 2 1) (2 2 1) (1 1 2) (2 1 2) (1 2 2) (2 2 2)) + + -- Function: -first (pred list) + Return the first item in LIST for which PRED returns non-‘nil’. + Return ‘nil’ if no such element is found. + + To get the first item in the list no questions asked, use + ‘-first-item’ (*note -first-item::). + + Alias: ‘-find’. + + This function’s anaphoric counterpart is ‘--first’. + + (-first #'natnump '(-1 0 1)) + ⇒ 0 + (-first #'null '(1 2 3)) + ⇒ nil + (--first (> it 2) '(1 2 3)) + ⇒ 3 + + -- Function: -last (pred list) + Return the last x in LIST where (PRED x) is non-‘nil’, else ‘nil’. + + (-last 'even? '(1 2 3 4 5 6 3 3 3)) + ⇒ 6 + (-last 'even? '(1 3 7 5 9)) + ⇒ nil + (--last (> (length it) 3) '("a" "looong" "word" "and" "short" "one")) + ⇒ "short" + + -- Function: -first-item (list) + Return the first item of LIST, or ‘nil’ on an empty list. + + See also: ‘-second-item’ (*note -second-item::), ‘-last-item’ + (*note -last-item::), etc. + + (-first-item ()) + ⇒ () + (-first-item '(1 2 3 4 5)) + ⇒ 1 + (let ((list (list 1 2 3))) (setf (-first-item list) 5) list) + ⇒ (5 2 3) + + -- Function: -second-item (list) + Return the second item of LIST, or ‘nil’ if LIST is too short. + + See also: ‘-first-item’ (*note -first-item::), ‘-third-item’ (*note + -third-item::), etc. + + (-second-item ()) + ⇒ () + (-second-item '(1 2 3 4 5)) + ⇒ 2 + (let ((list (list 1 2))) (setf (-second-item list) 5) list) + ⇒ (1 5) + + -- Function: -third-item (list) + Return the third item of LIST, or ‘nil’ if LIST is too short. + + See also: ‘-second-item’ (*note -second-item::), ‘-fourth-item’ + (*note -fourth-item::), etc. + + (-third-item ()) + ⇒ () + (-third-item '(1 2)) + ⇒ () + (-third-item '(1 2 3 4 5)) + ⇒ 3 + + -- Function: -fourth-item (list) + Return the fourth item of LIST, or ‘nil’ if LIST is too short. + + See also: ‘-third-item’ (*note -third-item::), ‘-fifth-item’ (*note + -fifth-item::), etc. + + (-fourth-item ()) + ⇒ () + (-fourth-item '(1 2 3)) + ⇒ () + (-fourth-item '(1 2 3 4 5)) + ⇒ 4 + + -- Function: -fifth-item (list) + Return the fifth item of LIST, or ‘nil’ if LIST is too short. + + See also: ‘-fourth-item’ (*note -fourth-item::), ‘-last-item’ + (*note -last-item::), etc. + + (-fifth-item ()) + ⇒ () + (-fifth-item '(1 2 3 4)) + ⇒ () + (-fifth-item '(1 2 3 4 5)) + ⇒ 5 + + -- Function: -last-item (list) + Return the last item of LIST, or ‘nil’ on an empty list. + + See also: ‘-first-item’ (*note -first-item::), etc. + + (-last-item ()) + ⇒ () + (-last-item '(1 2 3 4 5)) + ⇒ 5 + (let ((list (list 1 2 3))) (setf (-last-item list) 5) list) + ⇒ (1 2 5) + + -- Function: -butlast (list) + Return a list of all items in list except for the last. + + (-butlast '(1 2 3)) + ⇒ (1 2) + (-butlast '(1 2)) + ⇒ (1) + (-butlast '(1)) + ⇒ nil + + -- Function: -sort (comparator list) + Sort LIST, stably, comparing elements using COMPARATOR. Return the + sorted list. LIST is NOT modified by side effects. COMPARATOR is + called with two elements of LIST, and should return non-‘nil’ if + the first element should sort before the second. + + (-sort #'< '(3 1 2)) + ⇒ (1 2 3) + (-sort #'> '(3 1 2)) + ⇒ (3 2 1) + (--sort (< it other) '(3 1 2)) + ⇒ (1 2 3) + + -- Function: -list (arg) + Ensure ARG is a list. If ARG is already a list, return it as is + (not a copy). Otherwise, return a new list with ARG as its only + element. + + Another supported calling convention is (-list &rest ARGS). In + this case, if ARG is not a list, a new list with all of ARGS as + elements is returned. This use is supported for backward + compatibility and is otherwise deprecated. + + (-list 1) + ⇒ (1) + (-list ()) + ⇒ () + (-list '(1 2 3)) + ⇒ (1 2 3) + + -- Function: -fix (fn list) + Compute the (least) fixpoint of FN with initial input LIST. + + FN is called at least once, results are compared with ‘equal’. + + (-fix (lambda (l) (-non-nil (--mapcat (-split-at (/ (length it) 2) it) l))) '((1 2 3))) + ⇒ ((1) (2) (3)) + (let ((l '((starwars scifi) (jedi starwars warrior)))) (--fix (-uniq (--mapcat (cons it (cdr (assq it l))) it)) '(jedi book))) + ⇒ (jedi starwars warrior scifi book) + + +File: dash.info, Node: Tree operations, Next: Threading macros, Prev: Other list operations, Up: Functions + +2.11 Tree operations +==================== + +Functions pretending lists are trees. + + -- Function: -tree-seq (branch children tree) + Return a sequence of the nodes in TREE, in depth-first search + order. + + BRANCH is a predicate of one argument that returns non-‘nil’ if the + passed argument is a branch, that is, a node that can have + children. + + CHILDREN is a function of one argument that returns the children of + the passed branch node. + + Non-branch nodes are simply copied. + + (-tree-seq 'listp 'identity '(1 (2 3) 4 (5 (6 7)))) + ⇒ ((1 (2 3) 4 (5 (6 7))) 1 (2 3) 2 3 4 (5 (6 7)) 5 (6 7) 6 7) + (-tree-seq 'listp 'reverse '(1 (2 3) 4 (5 (6 7)))) + ⇒ ((1 (2 3) 4 (5 (6 7))) (5 (6 7)) (6 7) 7 6 5 4 (2 3) 3 2 1) + (--tree-seq (vectorp it) (append it nil) [1 [2 3] 4 [5 [6 7]]]) + ⇒ ([1 [2 3] 4 [5 [6 7]]] 1 [2 3] 2 3 4 [5 [6 7]] 5 [6 7] 6 7) + + -- Function: -tree-map (fn tree) + Apply FN to each element of TREE while preserving the tree + structure. + + (-tree-map '1+ '(1 (2 3) (4 (5 6) 7))) + ⇒ (2 (3 4) (5 (6 7) 8)) + (-tree-map '(lambda (x) (cons x (expt 2 x))) '(1 (2 3) 4)) + ⇒ ((1 . 2) ((2 . 4) (3 . 8)) (4 . 16)) + (--tree-map (length it) '("" ("

" "text" "

") "")) + ⇒ (6 (3 4 4) 7) + + -- Function: -tree-map-nodes (pred fun tree) + Call FUN on each node of TREE that satisfies PRED. + + If PRED returns ‘nil’, continue descending down this node. If PRED + returns non-‘nil’, apply FUN to this node and do not descend + further. + + (-tree-map-nodes 'vectorp (lambda (x) (-sum (append x nil))) '(1 [2 3] 4 (5 [6 7] 8))) + ⇒ (1 5 4 (5 13 8)) + (-tree-map-nodes 'keywordp (lambda (x) (symbol-name x)) '(1 :foo 4 ((5 6 :bar) :baz 8))) + ⇒ (1 ":foo" 4 ((5 6 ":bar") ":baz" 8)) + (--tree-map-nodes (eq (car-safe it) 'add-mode) (-concat it (list :mode 'emacs-lisp-mode)) '(with-mode emacs-lisp-mode (foo bar) (add-mode a b) (baz (add-mode c d)))) + ⇒ (with-mode emacs-lisp-mode (foo bar) (add-mode a b :mode emacs-lisp-mode) (baz (add-mode c d :mode emacs-lisp-mode))) + + -- Function: -tree-reduce (fn tree) + Use FN to reduce elements of list TREE. If elements of TREE are + lists themselves, apply the reduction recursively. + + FN is first applied to first element of the list and second + element, then on this result and third element from the list etc. + + See ‘-reduce-r’ (*note -reduce-r::) for how exactly are lists of + zero or one element handled. + + (-tree-reduce '+ '(1 (2 3) (4 5))) + ⇒ 15 + (-tree-reduce 'concat '("strings" (" on" " various") ((" levels")))) + ⇒ "strings on various levels" + (--tree-reduce (cond ((stringp it) (concat it " " acc)) (t (let ((sn (symbol-name it))) (concat "<" sn ">" acc "")))) '(body (p "some words") (div "more" (b "bold") "words"))) + ⇒ "

some words

more bold words
" + + -- Function: -tree-reduce-from (fn init-value tree) + Use FN to reduce elements of list TREE. If elements of TREE are + lists themselves, apply the reduction recursively. + + FN is first applied to INIT-VALUE and first element of the list, + then on this result and second element from the list etc. + + The initial value is ignored on cons pairs as they always contain + two elements. + + (-tree-reduce-from '+ 1 '(1 (1 1) ((1)))) + ⇒ 8 + (--tree-reduce-from (-concat acc (list it)) nil '(1 (2 3 (4 5)) (6 7))) + ⇒ ((7 6) ((5 4) 3 2) 1) + + -- Function: -tree-mapreduce (fn folder tree) + Apply FN to each element of TREE, and make a list of the results. + If elements of TREE are lists themselves, apply FN recursively to + elements of these nested lists. + + Then reduce the resulting lists using FOLDER and initial value + INIT-VALUE. See ‘-reduce-r-from’ (*note -reduce-r-from::). + + This is the same as calling ‘-tree-reduce’ (*note -tree-reduce::) + after ‘-tree-map’ (*note -tree-map::) but is twice as fast as it + only traverse the structure once. + + (-tree-mapreduce 'list 'append '(1 (2 (3 4) (5 6)) (7 (8 9)))) + ⇒ (1 2 3 4 5 6 7 8 9) + (--tree-mapreduce 1 (+ it acc) '(1 (2 (4 9) (2 1)) (7 (4 3)))) + ⇒ 9 + (--tree-mapreduce 0 (max acc (1+ it)) '(1 (2 (4 9) (2 1)) (7 (4 3)))) + ⇒ 3 + + -- Function: -tree-mapreduce-from (fn folder init-value tree) + Apply FN to each element of TREE, and make a list of the results. + If elements of TREE are lists themselves, apply FN recursively to + elements of these nested lists. + + Then reduce the resulting lists using FOLDER and initial value + INIT-VALUE. See ‘-reduce-r-from’ (*note -reduce-r-from::). + + This is the same as calling ‘-tree-reduce-from’ (*note + -tree-reduce-from::) after ‘-tree-map’ (*note -tree-map::) but is + twice as fast as it only traverse the structure once. + + (-tree-mapreduce-from 'identity '* 1 '(1 (2 (3 4) (5 6)) (7 (8 9)))) + ⇒ 362880 + (--tree-mapreduce-from (+ it it) (cons it acc) nil '(1 (2 (4 9) (2 1)) (7 (4 3)))) + ⇒ (2 (4 (8 18) (4 2)) (14 (8 6))) + (concat "{" (--tree-mapreduce-from (cond ((-cons-pair? it) (concat (symbol-name (car it)) " -> " (symbol-name (cdr it)))) (t (concat (symbol-name it) " : {"))) (concat it (unless (or (equal acc "}") (equal (substring it (1- (length it))) "{")) ", ") acc) "}" '((elisp-mode (foo (bar . booze)) (baz . qux)) (c-mode (foo . bla) (bum . bam))))) + ⇒ "{elisp-mode : {foo : {bar -> booze}, baz -> qux}, c-mode : {foo -> bla, bum -> bam}}" + + -- Function: -clone (list) + Create a deep copy of LIST. The new list has the same elements and + structure but all cons are replaced with new ones. This is useful + when you need to clone a structure such as plist or alist. + + (let* ((a (list (list 1))) (b (-clone a))) (setcar (car a) 2) b) + ⇒ ((1)) + + +File: dash.info, Node: Threading macros, Next: Binding, Prev: Tree operations, Up: Functions + +2.12 Threading macros +===================== + +Macros that conditionally combine sequential forms for brevity or +readability. + + -- Macro: -> (x &optional form &rest more) + Thread the expr through the forms. Insert X as the second item in + the first form, making a list of it if it is not a list already. + If there are more forms, insert the first form as the second item + in second form, etc. + + (-> '(2 3 5)) + ⇒ (2 3 5) + (-> '(2 3 5) (append '(8 13))) + ⇒ (2 3 5 8 13) + (-> '(2 3 5) (append '(8 13)) (-slice 1 -1)) + ⇒ (3 5 8) + + -- Macro: ->> (x &optional form &rest more) + Thread the expr through the forms. Insert X as the last item in + the first form, making a list of it if it is not a list already. + If there are more forms, insert the first form as the last item in + second form, etc. + + (->> '(1 2 3) (-map 'square)) + ⇒ (1 4 9) + (->> '(1 2 3) (-map 'square) (-remove 'even?)) + ⇒ (1 9) + (->> '(1 2 3) (-map 'square) (-reduce '+)) + ⇒ 14 + + -- Macro: --> (x &rest forms) + Starting with the value of X, thread each expression through FORMS. + + Insert X at the position signified by the symbol ‘it’ in the first + form. If there are more forms, insert the first form at the + position signified by ‘it’ in the second form, etc. + + (--> "def" (concat "abc" it "ghi")) + ⇒ "abcdefghi" + (--> "def" (concat "abc" it "ghi") (upcase it)) + ⇒ "ABCDEFGHI" + (--> "def" (concat "abc" it "ghi") upcase) + ⇒ "ABCDEFGHI" + + -- Macro: -as-> (value variable &rest forms) + Starting with VALUE, thread VARIABLE through FORMS. + + In the first form, bind VARIABLE to VALUE. In the second form, + bind VARIABLE to the result of the first form, and so forth. + + (-as-> 3 my-var (1+ my-var) (list my-var) (mapcar (lambda (ele) (* 2 ele)) my-var)) + ⇒ (8) + (-as-> 3 my-var 1+) + ⇒ 4 + (-as-> 3 my-var) + ⇒ 3 + + -- Macro: -some-> (x &optional form &rest more) + When expr is non-‘nil’, thread it through the first form (via ‘->’ + (*note ->::)), and when that result is non-‘nil’, through the next + form, etc. + + (-some-> '(2 3 5)) + ⇒ (2 3 5) + (-some-> 5 square) + ⇒ 25 + (-some-> 5 even? square) + ⇒ nil + + -- Macro: -some->> (x &optional form &rest more) + When expr is non-‘nil’, thread it through the first form (via ‘->>’ + (*note ->>::)), and when that result is non-‘nil’, through the next + form, etc. + + (-some->> '(1 2 3) (-map 'square)) + ⇒ (1 4 9) + (-some->> '(1 3 5) (-last 'even?) (+ 100)) + ⇒ nil + (-some->> '(2 4 6) (-last 'even?) (+ 100)) + ⇒ 106 + + -- Macro: -some--> (expr &rest forms) + Thread EXPR through FORMS via ‘-->’ (*note -->::), while the result + is non-‘nil’. When EXPR evaluates to non-‘nil’, thread the result + through the first of FORMS, and when that result is non-‘nil’, + thread it through the next form, etc. + + (-some--> "def" (concat "abc" it "ghi")) + ⇒ "abcdefghi" + (-some--> nil (concat "abc" it "ghi")) + ⇒ nil + (-some--> '(0 1) (-remove #'natnump it) (append it it) (-map #'1+ it)) + ⇒ () + + -- Macro: -doto (init &rest forms) + Evaluate INIT and pass it as argument to FORMS with ‘->’ (*note + ->::). The RESULT of evaluating INIT is threaded through each of + FORMS individually using ‘->’ (*note ->::), which see. The return + value is RESULT, which FORMS may have modified by side effect. + + (-doto (list 1 2 3) pop pop) + ⇒ (3) + (-doto (cons 1 2) (setcar 3) (setcdr 4)) + ⇒ (3 . 4) + (gethash 'k (--doto (make-hash-table) (puthash 'k 'v it))) + ⇒ v + + +File: dash.info, Node: Binding, Next: Side effects, Prev: Threading macros, Up: Functions + +2.13 Binding +============ + +Macros that combine ‘let’ and ‘let*’ with destructuring and flow +control. + + -- Macro: -when-let ((var val) &rest body) + If VAL evaluates to non-‘nil’, bind it to VAR and execute body. + + Note: binding is done according to ‘-let’ (*note -let::). + + (-when-let (match-index (string-match "d" "abcd")) (+ match-index 2)) + ⇒ 5 + (-when-let ((&plist :foo foo) (list :foo "foo")) foo) + ⇒ "foo" + (-when-let ((&plist :foo foo) (list :bar "bar")) foo) + ⇒ nil + + -- Macro: -when-let* (vars-vals &rest body) + If all VALS evaluate to true, bind them to their corresponding VARS + and execute body. VARS-VALS should be a list of (VAR VAL) pairs. + + Note: binding is done according to ‘-let*’ (*note -let*::). VALS + are evaluated sequentially, and evaluation stops after the first + ‘nil’ VAL is encountered. + + (-when-let* ((x 5) (y 3) (z (+ y 4))) (+ x y z)) + ⇒ 15 + (-when-let* ((x 5) (y nil) (z 7)) (+ x y z)) + ⇒ nil + + -- Macro: -if-let ((var val) then &rest else) + If VAL evaluates to non-‘nil’, bind it to VAR and do THEN, + otherwise do ELSE. + + Note: binding is done according to ‘-let’ (*note -let::). + + (-if-let (match-index (string-match "d" "abc")) (+ match-index 3) 7) + ⇒ 7 + (--if-let (even? 4) it nil) + ⇒ t + + -- Macro: -if-let* (vars-vals then &rest else) + If all VALS evaluate to true, bind them to their corresponding VARS + and do THEN, otherwise do ELSE. VARS-VALS should be a list of (VAR + VAL) pairs. + + Note: binding is done according to ‘-let*’ (*note -let*::). VALS + are evaluated sequentially, and evaluation stops after the first + ‘nil’ VAL is encountered. + + (-if-let* ((x 5) (y 3) (z 7)) (+ x y z) "foo") + ⇒ 15 + (-if-let* ((x 5) (y nil) (z 7)) (+ x y z) "foo") + ⇒ "foo" + (-if-let* (((_ _ x) '(nil nil 7))) x) + ⇒ 7 + + -- Macro: -let (varlist &rest body) + Bind variables according to VARLIST then eval BODY. + + VARLIST is a list of lists of the form (PATTERN SOURCE). Each + PATTERN is matched against the SOURCE "structurally". SOURCE is + only evaluated once for each PATTERN. Each PATTERN is matched + recursively, and can therefore contain sub-patterns which are + matched against corresponding sub-expressions of SOURCE. + + All the SOURCEs are evalled before any symbols are bound (i.e. "in + parallel"). + + If VARLIST only contains one (PATTERN SOURCE) element, you can + optionally specify it using a vector and discarding the outer-most + parens. Thus + + (-let ((PATTERN SOURCE)) ...) + + becomes + + (-let [PATTERN SOURCE] ...). + + ‘-let’ (*note -let::) uses a convention of not binding places + (symbols) starting with _ whenever it’s possible. You can use this + to skip over entries you don’t care about. However, this is not + *always* possible (as a result of implementation) and these symbols + might get bound to undefined values. + + Following is the overview of supported patterns. Remember that + patterns can be matched recursively, so every a, b, aK in the + following can be a matching construct and not necessarily a + symbol/variable. + + Symbol: + + a - bind the SOURCE to A. This is just like regular ‘let’. + + Conses and lists: + + (a) - bind ‘car’ of cons/list to A + + (a . b) - bind car of cons to A and ‘cdr’ to B + + (a b) - bind car of list to A and ‘cadr’ to B + + (a1 a2 a3 ...) - bind 0th car of list to A1, 1st to A2, 2nd to + A3... + + (a1 a2 a3 ... aN . rest) - as above, but bind the Nth cdr to REST. + + Vectors: + + [a] - bind 0th element of a non-list sequence to A (works with + vectors, strings, bit arrays...) + + [a1 a2 a3 ...] - bind 0th element of non-list sequence to A0, 1st + to A1, 2nd to A2, ... If the PATTERN is shorter than SOURCE, the + values at places not in PATTERN are ignored. If the PATTERN is + longer than SOURCE, an ‘error’ is thrown. + + [a1 a2 a3 ... &rest rest] - as above, but bind the rest of the + sequence to REST. This is conceptually the same as improper list + matching (a1 a2 ... aN . rest) + + Key/value stores: + + (&plist key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE plist to aK. If the value is not found, aK is ‘nil’. Uses + ‘plist-get’ to fetch values. + + (&alist key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE alist to aK. If the value is not found, aK is ‘nil’. Uses + ‘assoc’ to fetch values. + + (&hash key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE hash table to aK. If the value is not found, aK is ‘nil’. + Uses ‘gethash’ to fetch values. + + Further, special keyword &keys supports "inline" matching of + plist-like key-value pairs, similarly to &keys keyword of + ‘cl-defun’. + + (a1 a2 ... aN &keys key1 b1 ... keyN bK) + + This binds N values from the list to a1 ... aN, then interprets the + cdr as a plist (see key/value matching above). + + A shorthand notation for kv-destructuring exists which allows the + patterns be optionally left out and derived from the key name in + the following fashion: + + - a key :foo is converted into ‘foo’ pattern, - a key ’bar is + converted into ‘bar’ pattern, - a key "baz" is converted into ‘baz’ + pattern. + + That is, the entire value under the key is bound to the derived + variable without any further destructuring. + + This is possible only when the form following the key is not a + valid pattern (i.e. not a symbol, a cons cell or a vector). + Otherwise the matching proceeds as usual and in case of an invalid + spec fails with an error. + + Thus the patterns are normalized as follows: + + ;; derive all the missing patterns (&plist :foo ’bar "baz") => + (&plist :foo foo ’bar bar "baz" baz) + + ;; we can specify some but not others (&plist :foo ’bar + explicit-bar) => (&plist :foo foo ’bar explicit-bar) + + ;; nothing happens, we store :foo in x (&plist :foo x) => (&plist + :foo x) + + ;; nothing happens, we match recursively (&plist :foo (a b c)) => + (&plist :foo (a b c)) + + You can name the source using the syntax SYMBOL &as PATTERN. This + syntax works with lists (proper or improper), vectors and all types + of maps. + + (list &as a b c) (list 1 2 3) + + binds A to 1, B to 2, C to 3 and LIST to (1 2 3). + + Similarly: + + (bounds &as beg . end) (cons 1 2) + + binds BEG to 1, END to 2 and BOUNDS to (1 . 2). + + (items &as first . rest) (list 1 2 3) + + binds FIRST to 1, REST to (2 3) and ITEMS to (1 2 3) + + [vect &as _ b c] [1 2 3] + + binds B to 2, C to 3 and VECT to [1 2 3] (_ avoids binding as + usual). + + (plist &as &plist :b b) (list :a 1 :b 2 :c 3) + + binds B to 2 and PLIST to (:a 1 :b 2 :c 3). Same for &alist and + &hash. + + This is especially useful when we want to capture the result of a + computation and destructure at the same time. Consider the form + (function-returning-complex-structure) returning a list of two + vectors with two items each. We want to capture this entire result + and pass it to another computation, but at the same time we want to + get the second item from each vector. We can achieve it with + pattern + + (result &as [_ a] [_ b]) (function-returning-complex-structure) + + Note: Clojure programmers may know this feature as the ":as + binding". The difference is that we put the &as at the front + because we need to support improper list binding. + + (-let (([a (b c) d] [1 (2 3) 4])) (list a b c d)) + ⇒ (1 2 3 4) + (-let [(a b c . d) (list 1 2 3 4 5 6)] (list a b c d)) + ⇒ (1 2 3 (4 5 6)) + (-let [(&plist :foo foo :bar bar) (list :baz 3 :foo 1 :qux 4 :bar 2)] (list foo bar)) + ⇒ (1 2) + + -- Macro: -let* (varlist &rest body) + Bind variables according to VARLIST then eval BODY. + + VARLIST is a list of lists of the form (PATTERN SOURCE). Each + PATTERN is matched against the SOURCE structurally. SOURCE is only + evaluated once for each PATTERN. + + Each SOURCE can refer to the symbols already bound by this VARLIST. + This is useful if you want to destructure SOURCE recursively but + also want to name the intermediate structures. + + See ‘-let’ (*note -let::) for the list of all possible patterns. + + (-let* (((a . b) (cons 1 2)) ((c . d) (cons 3 4))) (list a b c d)) + ⇒ (1 2 3 4) + (-let* (((a . b) (cons 1 (cons 2 3))) ((c . d) b)) (list a b c d)) + ⇒ (1 (2 . 3) 2 3) + (-let* (((&alist "foo" foo "bar" bar) (list (cons "foo" 1) (cons "bar" (list 'a 'b 'c)))) ((a b c) bar)) (list foo a b c bar)) + ⇒ (1 a b c (a b c)) + + -- Macro: -lambda (match-form &rest body) + Return a lambda which destructures its input as MATCH-FORM and + executes BODY. + + Note that you have to enclose the MATCH-FORM in a pair of parens, + such that: + + (-lambda (x) body) (-lambda (x y ...) body) + + has the usual semantics of ‘lambda’. Furthermore, these get + translated into normal ‘lambda’, so there is no performance + penalty. + + See ‘-let’ (*note -let::) for a description of the destructuring + mechanism. + + (-map (-lambda ((x y)) (+ x y)) '((1 2) (3 4) (5 6))) + ⇒ (3 7 11) + (-map (-lambda ([x y]) (+ x y)) '([1 2] [3 4] [5 6])) + ⇒ (3 7 11) + (funcall (-lambda ((_ . a) (_ . b)) (-concat a b)) '(1 2 3) '(4 5 6)) + ⇒ (2 3 5 6) + + -- Macro: -setq ([match-form val] ...) + Bind each MATCH-FORM to the value of its VAL. + + MATCH-FORM destructuring is done according to the rules of ‘-let’ + (*note -let::). + + This macro allows you to bind multiple variables by destructuring + the value, so for example: + + (-setq (a b) x (&plist :c c) plist) + + expands roughly speaking to the following code + + (setq a (car x) b (cadr x) c (plist-get plist :c)) + + Care is taken to only evaluate each VAL once so that in case of + multiple assignments it does not cause unexpected side effects. + + (let (a) (-setq a 1) a) + ⇒ 1 + (let (a b) (-setq (a b) (list 1 2)) (list a b)) + ⇒ (1 2) + (let (c) (-setq (&plist :c c) (list :c "c")) c) + ⇒ "c" + + +File: dash.info, Node: Side effects, Next: Destructive operations, Prev: Binding, Up: Functions + +2.14 Side effects +================= + +Functions iterating over lists for side effect only. + + -- Function: -each (list fn) + Call FN on each element of LIST. Return ‘nil’; this function is + intended for side effects. + + Its anaphoric counterpart is ‘--each’. + + For access to the current element’s index in LIST, see + ‘-each-indexed’ (*note -each-indexed::). + + (let (l) (-each '(1 2 3) (lambda (x) (push x l))) l) + ⇒ (3 2 1) + (let (l) (--each '(1 2 3) (push it l)) l) + ⇒ (3 2 1) + (-each '(1 2 3) #'identity) + ⇒ nil + + -- Function: -each-while (list pred fn) + Call FN on each ITEM in LIST, while (PRED ITEM) is non-‘nil’. Once + an ITEM is reached for which PRED returns ‘nil’, FN is no longer + called. Return ‘nil’; this function is intended for side effects. + + Its anaphoric counterpart is ‘--each-while’. + + (let (l) (-each-while '(2 4 5 6) #'even? (lambda (x) (push x l))) l) + ⇒ (4 2) + (let (l) (--each-while '(1 2 3 4) (< it 3) (push it l)) l) + ⇒ (2 1) + (let ((s 0)) (--each-while '(1 3 4 5) (< it 5) (setq s (+ s it))) s) + ⇒ 8 + + -- Function: -each-indexed (list fn) + Call FN on each index and element of LIST. For each ITEM at INDEX + in LIST, call (funcall FN INDEX ITEM). Return ‘nil’; this function + is intended for side effects. + + See also: ‘-map-indexed’ (*note -map-indexed::). + + (let (l) (-each-indexed '(a b c) (lambda (i x) (push (list x i) l))) l) + ⇒ ((c 2) (b 1) (a 0)) + (let (l) (--each-indexed '(a b c) (push (list it it-index) l)) l) + ⇒ ((c 2) (b 1) (a 0)) + (let (l) (--each-indexed () (push it l)) l) + ⇒ () + + -- Function: -each-r (list fn) + Call FN on each element of LIST in reversed order. Return ‘nil’; + this function is intended for side effects. + + Its anaphoric counterpart is ‘--each-r’. + + (let (l) (-each-r '(1 2 3) (lambda (x) (push x l))) l) + ⇒ (1 2 3) + (let (l) (--each-r '(1 2 3) (push it l)) l) + ⇒ (1 2 3) + (-each-r '(1 2 3) #'identity) + ⇒ nil + + -- Function: -each-r-while (list pred fn) + Call FN on each ITEM in reversed LIST, while (PRED ITEM) is + non-‘nil’. Once an ITEM is reached for which PRED returns ‘nil’, + FN is no longer called. Return ‘nil’; this function is intended + for side effects. + + Its anaphoric counterpart is ‘--each-r-while’. + + (let (l) (-each-r-while '(2 4 5 6) #'even? (lambda (x) (push x l))) l) + ⇒ (6) + (let (l) (--each-r-while '(1 2 3 4) (>= it 3) (push it l)) l) + ⇒ (3 4) + (let ((s 0)) (--each-r-while '(1 2 3 5) (> it 1) (setq s (+ s it))) s) + ⇒ 10 + + -- Function: -dotimes (num fn) + Call FN NUM times, presumably for side effects. FN is called with + a single argument on successive integers running from 0, inclusive, + to NUM, exclusive. FN is not called if NUM is less than 1. + + This function’s anaphoric counterpart is ‘--dotimes’. + + (let (s) (-dotimes 3 (lambda (n) (push n s))) s) + ⇒ (2 1 0) + (let (s) (-dotimes 0 (lambda (n) (push n s))) s) + ⇒ () + (let (s) (--dotimes 5 (push it s)) s) + ⇒ (4 3 2 1 0) + + +File: dash.info, Node: Destructive operations, Next: Function combinators, Prev: Side effects, Up: Functions + +2.15 Destructive operations +=========================== + +Macros that modify variables holding lists. + + -- Macro: !cons (car cdr) + Destructive: Set CDR to the cons of CAR and CDR. + + (let (l) (!cons 5 l) l) + ⇒ (5) + (let ((l '(3))) (!cons 5 l) l) + ⇒ (5 3) + + -- Macro: !cdr (list) + Destructive: Set LIST to the cdr of LIST. + + (let ((l '(3))) (!cdr l) l) + ⇒ () + (let ((l '(3 5))) (!cdr l) l) + ⇒ (5) + + +File: dash.info, Node: Function combinators, Prev: Destructive operations, Up: Functions + +2.16 Function combinators +========================= + +Functions that manipulate and compose other functions. + + -- Function: -partial (fun &rest args) + Return a function that is a partial application of FUN to ARGS. + ARGS is a list of the first N arguments to pass to FUN. The result + is a new function which does the same as FUN, except that the first + N arguments are fixed at the values with which this function was + called. + + (funcall (-partial #'+ 5)) + ⇒ 5 + (funcall (-partial #'- 5) 3) + ⇒ 2 + (funcall (-partial #'+ 5 2) 3) + ⇒ 10 + + -- Function: -rpartial (fn &rest args) + Return a function that is a partial application of FN to ARGS. + ARGS is a list of the last N arguments to pass to FN. The result + is a new function which does the same as FN, except that the last N + arguments are fixed at the values with which this function was + called. This is like ‘-partial’ (*note -partial::), except the + arguments are fixed starting from the right rather than the left. + + (funcall (-rpartial #'- 5)) + ⇒ -5 + (funcall (-rpartial #'- 5) 8) + ⇒ 3 + (funcall (-rpartial #'- 5 2) 10) + ⇒ 3 + + -- Function: -juxt (&rest fns) + Return a function that is the juxtaposition of FNS. The returned + function takes a variable number of ARGS, applies each of FNS in + turn to ARGS, and returns the list of results. + + (funcall (-juxt) 1 2) + ⇒ () + (funcall (-juxt #'+ #'- #'* #'/) 7 5) + ⇒ (12 2 35 1) + (mapcar (-juxt #'number-to-string #'1+) '(1 2)) + ⇒ (("1" 2) ("2" 3)) + + -- Function: -compose (&rest fns) + Compose FNS into a single composite function. Return a function + that takes a variable number of ARGS, applies the last function in + FNS to ARGS, and returns the result of calling each remaining + function on the result of the previous function, right-to-left. If + no FNS are given, return a variadic ‘identity’ function. + + (funcall (-compose #'- #'1+ #'+) 1 2 3) + ⇒ -7 + (funcall (-compose #'identity #'1+) 3) + ⇒ 4 + (mapcar (-compose #'not #'stringp) '(nil "")) + ⇒ (t nil) + + -- Function: -applify (fn) + Return a function that applies FN to a single list of args. This + changes the arity of FN from taking N distinct arguments to taking + 1 argument which is a list of N arguments. + + (funcall (-applify #'+) nil) + ⇒ 0 + (mapcar (-applify #'+) '((1 1 1) (1 2 3) (5 5 5))) + ⇒ (3 6 15) + (funcall (-applify #'<) '(3 6)) + ⇒ t + + -- Function: -on (op trans) + Return a function that calls TRANS on each arg and OP on the + results. The returned function takes a variable number of + arguments, calls the function TRANS on each one in turn, and then + passes those results as the list of arguments to OP, in the same + order. + + For example, the following pairs of expressions are morally + equivalent: + + (funcall (-on #’+ #’1+) 1 2 3) = (+ (1+ 1) (1+ 2) (1+ 3)) (funcall + (-on #’+ #’1+)) = (+) + + (-sort (-on #'< #'length) '((1 2 3) (1) (1 2))) + ⇒ ((1) (1 2) (1 2 3)) + (funcall (-on #'min #'string-to-number) "22" "2" "1" "12") + ⇒ 1 + (-min-by (-on #'> #'length) '((1 2 3) (4) (1 2))) + ⇒ (4) + + -- Function: -flip (fn) + Return a function that calls FN with its arguments reversed. The + returned function takes the same number of arguments as FN. + + For example, the following two expressions are morally equivalent: + + (funcall (-flip #’-) 1 2) = (- 2 1) + + See also: ‘-rotate-args’ (*note -rotate-args::). + + (-sort (-flip #'<) '(4 3 6 1)) + ⇒ (6 4 3 1) + (funcall (-flip #'-) 3 2 1 10) + ⇒ 4 + (funcall (-flip #'1+) 1) + ⇒ 2 + + -- Function: -rotate-args (n fn) + Return a function that calls FN with args rotated N places to the + right. The returned function takes the same number of arguments as + FN, rotates the list of arguments N places to the right (left if N + is negative) just like ‘-rotate’ (*note -rotate::), and applies FN + to the result. + + See also: ‘-flip’ (*note -flip::). + + (funcall (-rotate-args -1 #'list) 1 2 3 4) + ⇒ (2 3 4 1) + (funcall (-rotate-args 1 #'-) 1 10 100) + ⇒ 89 + (funcall (-rotate-args 2 #'list) 3 4 5 1 2) + ⇒ (1 2 3 4 5) + + -- Function: -const (c) + Return a function that returns C ignoring any additional arguments. + + In types: a -> b -> a + + (funcall (-const 2) 1 3 "foo") + ⇒ 2 + (mapcar (-const 1) '("a" "b" "c" "d")) + ⇒ (1 1 1 1) + (-sum (mapcar (-const 1) '("a" "b" "c" "d"))) + ⇒ 4 + + -- Macro: -cut (&rest params) + Take n-ary function and n arguments and specialize some of them. + Arguments denoted by <> will be left unspecialized. + + See SRFI-26 for detailed description. + + (funcall (-cut list 1 <> 3 <> 5) 2 4) + ⇒ (1 2 3 4 5) + (-map (-cut funcall <> 5) `(1+ 1- ,(lambda (x) (/ 1.0 x)))) + ⇒ (6 4 0.2) + (-map (-cut <> 1 2 3) '(list vector string)) + ⇒ ((1 2 3) [1 2 3] "\1\2\3") + + -- Function: -not (pred) + Return a predicate that negates the result of PRED. The returned + predicate passes its arguments to PRED. If PRED returns ‘nil’, the + result is non-‘nil’; otherwise the result is ‘nil’. + + See also: ‘-andfn’ (*note -andfn::) and ‘-orfn’ (*note -orfn::). + + (funcall (-not #'numberp) "5") + ⇒ t + (-sort (-not #'<) '(5 2 1 0 6)) + ⇒ (6 5 2 1 0) + (-filter (-not (-partial #'< 4)) '(1 2 3 4 5 6 7 8)) + ⇒ (1 2 3 4) + + -- Function: -orfn (&rest preds) + Return a predicate that returns the first non-‘nil’ result of + PREDS. The returned predicate takes a variable number of + arguments, passes them to each predicate in PREDS in turn until one + of them returns non-‘nil’, and returns that non-‘nil’ result + without calling the remaining PREDS. If all PREDS return ‘nil’, or + if no PREDS are given, the returned predicate returns ‘nil’. + + See also: ‘-andfn’ (*note -andfn::) and ‘-not’ (*note -not::). + + (-filter (-orfn #'natnump #'booleanp) '(1 nil "a" -4 b c t)) + ⇒ (1 nil t) + (funcall (-orfn #'symbolp (-cut string-match-p "x" <>)) "axe") + ⇒ 1 + (funcall (-orfn #'= #'+) 1 1) + ⇒ t + + -- Function: -andfn (&rest preds) + Return a predicate that returns non-‘nil’ if all PREDS do so. The + returned predicate P takes a variable number of arguments and + passes them to each predicate in PREDS in turn. If any one of + PREDS returns ‘nil’, P also returns ‘nil’ without calling the + remaining PREDS. If all PREDS return non-‘nil’, P returns the last + such value. If no PREDS are given, P always returns non-‘nil’. + + See also: ‘-orfn’ (*note -orfn::) and ‘-not’ (*note -not::). + + (-filter (-andfn #'numberp (-cut < <> 5)) '(a 1 b 6 c 2)) + ⇒ (1 2) + (mapcar (-andfn #'numberp #'1+) '(a 1 b 6)) + ⇒ (nil 2 nil 7) + (funcall (-andfn #'= #'+) 1 1) + ⇒ 2 + + -- Function: -iteratefn (fn n) + Return a function FN composed N times with itself. + + FN is a unary function. If you need to use a function of higher + arity, use ‘-applify’ (*note -applify::) first to turn it into a + unary function. + + With n = 0, this acts as identity function. + + In types: (a -> a) -> Int -> a -> a. + + This function satisfies the following law: + + (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init + (1+ n))). + + (funcall (-iteratefn (lambda (x) (* x x)) 3) 2) + ⇒ 256 + (funcall (-iteratefn '1+ 3) 1) + ⇒ 4 + (funcall (-iteratefn 'cdr 3) '(1 2 3 4 5)) + ⇒ (4 5) + + -- Function: -fixfn (fn &optional equal-test halt-test) + Return a function that computes the (least) fixpoint of FN. + + FN must be a unary function. The returned lambda takes a single + argument, X, the initial value for the fixpoint iteration. The + iteration halts when either of the following conditions is + satisfied: + + 1. Iteration converges to the fixpoint, with equality being tested + using EQUAL-TEST. If EQUAL-TEST is not specified, ‘equal’ is used. + For functions over the floating point numbers, it may be necessary + to provide an appropriate approximate comparison test. + + 2. HALT-TEST returns a non-‘nil’ value. HALT-TEST defaults to a + simple counter that returns ‘t’ after ‘-fixfn-max-iterations’, to + guard against infinite iteration. Otherwise, HALT-TEST must be a + function that accepts a single argument, the current value of X, + and returns non-‘nil’ as long as iteration should continue. In + this way, a more sophisticated convergence test may be supplied by + the caller. + + The return value of the lambda is either the fixpoint or, if + iteration halted before converging, a cons with car ‘halted’ and + cdr the final output from HALT-TEST. + + In types: (a -> a) -> a -> a. + + (funcall (-fixfn #'cos #'approx=) 0.7) + ⇒ 0.7390851332151607 + (funcall (-fixfn (lambda (x) (expt (+ x 10) 0.25))) 2.0) + ⇒ 1.8555845286409378 + (funcall (-fixfn #'sin #'approx=) 0.1) + ⇒ (halted . t) + + -- Function: -prodfn (&rest fns) + Return a function that applies each of FNS to each of a list of + arguments. + + Takes a list of N functions and returns a function that takes a + list of length N, applying Ith function to Ith element of the input + list. Returns a list of length N. + + In types (for N=2): ((a -> b), (c -> d)) -> (a, c) -> (b, d) + + This function satisfies the following laws: + + (-compose (-prodfn f g ...) (-prodfn f’ g’ ...)) = (-prodfn + (-compose f f’) (-compose g g’) ...) + + (-prodfn f g ...) = (-juxt (-compose f (-partial #’nth 0)) + (-compose g (-partial #’nth 1)) ...) + + (-compose (-prodfn f g ...) (-juxt f’ g’ ...)) = (-juxt (-compose f + f’) (-compose g g’) ...) + + (-compose (-partial #’nth n) (-prod f1 f2 ...)) = (-compose fn + (-partial #’nth n)) + + (funcall (-prodfn #'1+ #'1- #'number-to-string) '(1 2 3)) + ⇒ (2 1 "3") + (-map (-prodfn #'1- #'1+) '((1 2) (3 4) (5 6))) + ⇒ ((0 3) (2 5) (4 7)) + (apply #'+ (funcall (-prodfn #'length #'string-to-number) '((t) "5"))) + ⇒ 6 + + +File: dash.info, Node: Development, Next: FDL, Prev: Functions, Up: Top + +3 Development +************* + +The Dash repository is hosted on GitHub at +. + +* Menu: + +* Contribute:: How to contribute. +* Contributors:: List of contributors. + + +File: dash.info, Node: Contribute, Next: Contributors, Up: Development + +3.1 Contribute +============== + +Yes, please do. Pure functions in the list manipulation realm only, +please. There’s a suite of examples/tests in ‘dev/examples.el’, so +remember to add tests for your additions, or they may get broken later. + + Run the tests with ‘make check’. Regenerate the docs with ‘make +docs’. Contributors are encouraged to install these commands as a Git +pre-commit hook, so that the tests are always running and the docs are +always in sync: + + $ cp dev/pre-commit.sh .git/hooks/pre-commit + + Oh, and don’t edit ‘README.md’ or ‘dash.texi’ directly, as they are +auto-generated. Instead, change their respective templates +‘readme-template.md’ or ‘dash-template.texi’. + + To ensure that Dash can be distributed with GNU ELPA or Emacs, we +require that all contributors assign copyright to the Free Software +Foundation. For more on this, *note (emacs)Copyright Assignment::. + + +File: dash.info, Node: Contributors, Prev: Contribute, Up: Development + +3.2 Contributors +================ + + • Matus Goljer (https://github.com/Fuco1) contributed lots of + features and functions. + • Takafumi Arakaki (https://github.com/tkf) contributed ‘-group-by’. + • tali713 (https://github.com/tali713) is the author of ‘-applify’. + • Víctor M. Valenzuela (https://github.com/vemv) contributed + ‘-repeat’. + • Nic Ferrier (https://github.com/nicferrier) contributed ‘-cons*’. + • Wilfred Hughes (https://github.com/Wilfred) contributed ‘-slice’, + ‘-first-item’, and ‘-last-item’. + • Emanuel Evans (https://github.com/shosti) contributed ‘-if-let’, + ‘-when-let’, and ‘-insert-at’. + • Johan Andersson (https://github.com/rejeep) contributed ‘-sum’, + ‘-product’, and ‘-same-items?’. + • Christina Whyte (https://github.com/kurisuwhyte) contributed + ‘-compose’. + • Steve Lamb (https://github.com/steventlamb) contributed ‘-cycle’, + ‘-pad’, ‘-annotate’, ‘-zip-fill’, and a variadic version of ‘-zip’. + • Fredrik Bergroth (https://github.com/fbergroth) made the ‘-if-let’ + family use ‘-let’ destructuring and improved the script for + generating documentation. + • Mark Oteiza (https://github.com/holomorph) contributed ‘-iota’ and + the script to create an Info manual. + • Vasilij Schneidermann (https://github.com/wasamasa) contributed + ‘-some’. + • William West (https://github.com/occidens) made ‘-fixfn’ more + robust at handling floats. + • Cam Saul (https://github.com/camsaul) contributed ‘-some->’, + ‘-some->>’, and ‘-some-->’. + • Basil L. Contovounesios (https://github.com/basil-conto) + contributed ‘-common-prefix’, ‘-common-suffix’, and various other + improvements. + • Paul Pogonyshev (https://github.com/doublep) contributed ‘-each-r’ + and ‘-each-r-while’. + + Thanks! + + New contributors are very welcome. *Note Contribute::. + + +File: dash.info, Node: FDL, Next: GPL, Prev: Development, Up: Top + +Appendix A GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document “free” in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of “copyleft”, which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + “Document”, below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as “you”. You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A “Modified Version” of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A “Secondary Section” is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document’s overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The “Invariant Sections” are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The “Cover Texts” are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A “Transparent” copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + “Transparent” is called “Opaque”. + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The “Title Page” means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, “Title + Page” means the text near the most prominent appearance of the + work’s title, preceding the beginning of the body of the text. + + The “publisher” means any person or entity that distributes copies + of the Document to the public. + + A section “Entitled XYZ” means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) + To “Preserve the Title” of such a section when you modify the + Document means that it remains a section “Entitled XYZ” according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document’s license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document’s + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled “History”, Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled “History” in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + “History” section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled “Acknowledgements” or “Dedications”, + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled “Endorsements”. Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + “Endorsements” or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version’s + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled “Endorsements”, provided it contains + nothing but endorsements of your Modified Version by various + parties—for example, statements of peer review or that the text has + been approved by an organization as the authoritative definition of + a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + “History” in the various original documents, forming one section + Entitled “History”; likewise combine any sections Entitled + “Acknowledgements”, and any sections Entitled “Dedications”. You + must delete all sections Entitled “Endorsements.” + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an “aggregate” if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation’s users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document’s Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled “Acknowledgements”, + “Dedications”, or “History”, the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + . + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License “or any later version” applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy’s public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A “Massive Multiauthor Collaboration” (or “MMC”) contained in the + site means any set of copyrightable works thus published on the MMC + site. + + “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + “Incorporate” means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is “eligible for relicensing” if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the “with...Texts.” line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: dash.info, Node: GPL, Next: Index, Prev: FDL, Up: Top + +Appendix B GNU General Public License +************************************* + + Version 3, 29 June 2007 + + Copyright © 2007 Free Software Foundation, Inc. + + Everyone is permitted to copy and distribute verbatim copies of this + license document, but changing it is not allowed. + +Preamble +======== + +The GNU General Public License is a free, copyleft license for software +and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program—to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers’ and authors’ protection, the GPL clearly explains +that there is no warranty for this free software. For both users’ and +authors’ sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users’ freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS +==================== + + 0. Definitions. + + “This License” refers to version 3 of the GNU General Public + License. + + “Copyright” also means copyright-like laws that apply to other + kinds of works, such as semiconductor masks. + + “The Program” refers to any copyrightable work licensed under this + License. Each licensee is addressed as “you”. “Licensees” and + “recipients” may be individuals or organizations. + + To “modify” a work means to copy from or adapt all or part of the + work in a fashion requiring copyright permission, other than the + making of an exact copy. The resulting work is called a “modified + version” of the earlier work or a work “based on” the earlier work. + + A “covered work” means either the unmodified Program or a work + based on the Program. + + To “propagate” a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on + a computer or modifying a private copy. Propagation includes + copying, distribution (with or without modification), making + available to the public, and in some countries other activities as + well. + + To “convey” a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user + through a computer network, with no transfer of a copy, is not + conveying. + + An interactive user interface displays “Appropriate Legal Notices” + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to + the extent that warranties are provided), that licensees may convey + the work under this License, and how to view a copy of this + License. If the interface presents a list of user commands or + options, such as a menu, a prominent item in the list meets this + criterion. + + 1. Source Code. + + The “source code” for a work means the preferred form of the work + for making modifications to it. “Object code” means any non-source + form of a work. + + A “Standard Interface” means an interface that either is an + official standard defined by a recognized standards body, or, in + the case of interfaces specified for a particular programming + language, one that is widely used among developers working in that + language. + + The “System Libraries” of an executable work include anything, + other than the work as a whole, that (a) is included in the normal + form of packaging a Major Component, but which is not part of that + Major Component, and (b) serves only to enable use of the work with + that Major Component, or to implement a Standard Interface for + which an implementation is available to the public in source code + form. A “Major Component”, in this context, means a major + essential component (kernel, window system, and so on) of the + specific operating system (if any) on which the executable work + runs, or a compiler used to produce the work, or an object code + interpreter used to run it. + + The “Corresponding Source” for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts + to control those activities. However, it does not include the + work’s System Libraries, or general-purpose tools or generally + available free programs which are used unmodified in performing + those activities but which are not part of the work. For example, + Corresponding Source includes interface definition files associated + with source files for the work, and the source code for shared + libraries and dynamically linked subprograms that the work is + specifically designed to require, such as by intimate data + communication or control flow between those subprograms and other + parts of the work. + + The Corresponding Source need not include anything that users can + regenerate automatically from other parts of the Corresponding + Source. + + The Corresponding Source for a work in source code form is that + same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running + a covered work is covered by this License only if the output, given + its content, constitutes a covered work. This License acknowledges + your rights of fair use or other equivalent, as provided by + copyright law. + + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise + remains in force. You may convey covered works to others for the + sole purpose of having them make modifications exclusively for you, + or provide you with facilities for running those works, provided + that you comply with the terms of this License in conveying all + material for which you do not control copyright. Those thus making + or running the covered works for you must do so exclusively on your + behalf, under your direction and control, on terms that prohibit + them from making any copies of your copyrighted material outside + their relationship with you. + + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section + 10 makes it unnecessary. + + 3. Protecting Users’ Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under + article 11 of the WIPO copyright treaty adopted on 20 December + 1996, or similar laws prohibiting or restricting circumvention of + such measures. + + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such + circumvention is effected by exercising rights under this License + with respect to the covered work, and you disclaim any intention to + limit operation or modification of the work as a means of + enforcing, against the work’s users, your or third parties’ legal + rights to forbid circumvention of technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program’s source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the + code; keep intact all notices of the absence of any warranty; and + give all recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these + conditions: + + a. The work must carry prominent notices stating that you + modified it, and giving a relevant date. + + b. The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in + section 4 to “keep intact all notices”. + + c. You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable + section 7 additional terms, to the whole of the work, and all + its parts, regardless of how they are packaged. This License + gives no permission to license the work in any other way, but + it does not invalidate such permission if you have separately + received it. + + d. If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has + interactive interfaces that do not display Appropriate Legal + Notices, your work need not make them do so. + + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered + work, and which are not combined with it such as to form a larger + program, in or on a volume of a storage or distribution medium, is + called an “aggregate” if the compilation and its resulting + copyright are not used to limit the access or legal rights of the + compilation’s users beyond what the individual works permit. + Inclusion of a covered work in an aggregate does not cause this + License to apply to the other parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this + License, in one of these ways: + + a. Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b. Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that + product model, to give anyone who possesses the object code + either (1) a copy of the Corresponding Source for all the + software in the product that is covered by this License, on a + durable physical medium customarily used for software + interchange, for a price no more than your reasonable cost of + physically performing this conveying of source, or (2) access + to copy the Corresponding Source from a network server at no + charge. + + c. Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, + and only if you received the object code with such an offer, + in accord with subsection 6b. + + d. Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to + the Corresponding Source in the same way through the same + place at no further charge. You need not require recipients + to copy the Corresponding Source along with the object code. + If the place to copy the object code is a network server, the + Corresponding Source may be on a different server (operated by + you or a third party) that supports equivalent copying + facilities, provided you maintain clear directions next to the + object code saying where to find the Corresponding Source. + Regardless of what server hosts the Corresponding Source, you + remain obligated to ensure that it is available for as long as + needed to satisfy these requirements. + + e. Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the + general public at no charge under subsection 6d. + + A separable portion of the object code, whose source code is + excluded from the Corresponding Source as a System Library, need + not be included in conveying the object code work. + + A “User Product” is either (1) a “consumer product”, which means + any tangible personal property which is normally used for personal, + family, or household purposes, or (2) anything designed or sold for + incorporation into a dwelling. In determining whether a product is + a consumer product, doubtful cases shall be resolved in favor of + coverage. For a particular product received by a particular user, + “normally used” refers to a typical or common use of that class of + product, regardless of the status of the particular user or of the + way in which the particular user actually uses, or expects or is + expected to use, the product. A product is a consumer product + regardless of whether the product has substantial commercial, + industrial or non-consumer uses, unless such uses represent the + only significant mode of use of the product. + + “Installation Information” for a User Product means any methods, + procedures, authorization keys, or other information required to + install and execute modified versions of a covered work in that + User Product from a modified version of its Corresponding Source. + The information must suffice to ensure that the continued + functioning of the modified object code is in no case prevented or + interfered with solely because modification has been made. + + If you convey an object code work under this section in, or with, + or specifically for use in, a User Product, and the conveying + occurs as part of a transaction in which the right of possession + and use of the User Product is transferred to the recipient in + perpetuity or for a fixed term (regardless of how the transaction + is characterized), the Corresponding Source conveyed under this + section must be accompanied by the Installation Information. But + this requirement does not apply if neither you nor any third party + retains the ability to install modified object code on the User + Product (for example, the work has been installed in ROM). + + The requirement to provide Installation Information does not + include a requirement to continue to provide support service, + warranty, or updates for a work that has been modified or installed + by the recipient, or for the User Product in which it has been + modified or installed. Access to a network may be denied when the + modification itself materially and adversely affects the operation + of the network or violates the rules and protocols for + communication across the network. + + Corresponding Source conveyed, and Installation Information + provided, in accord with this section must be in a format that is + publicly documented (and with an implementation available to the + public in source code form), and must require no special password + or key for unpacking, reading or copying. + + 7. Additional Terms. + + “Additional permissions” are terms that supplement the terms of + this License by making exceptions from one or more of its + conditions. Additional permissions that are applicable to the + entire Program shall be treated as though they were included in + this License, to the extent that they are valid under applicable + law. If additional permissions apply only to part of the Program, + that part may be used separately under those permissions, but the + entire Program remains governed by this License without regard to + the additional permissions. + + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part + of it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material + you add to a covered work, you may (if authorized by the copyright + holders of that material) supplement the terms of this License with + terms: + + a. Disclaiming warranty or limiting liability differently from + the terms of sections 15 and 16 of this License; or + + b. Requiring preservation of specified reasonable legal notices + or author attributions in that material or in the Appropriate + Legal Notices displayed by works containing it; or + + c. Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked + in reasonable ways as different from the original version; or + + d. Limiting the use for publicity purposes of names of licensors + or authors of the material; or + + e. Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f. Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified + versions of it) with contractual assumptions of liability to + the recipient, for any liability that these contractual + assumptions directly impose on those licensors and authors. + + All other non-permissive additional terms are considered “further + restrictions” within the meaning of section 10. If the Program as + you received it, or any part of it, contains a notice stating that + it is governed by this License along with a term that is a further + restriction, you may remove that term. If a license document + contains a further restriction but permits relicensing or conveying + under this License, you may add to a covered work material governed + by the terms of that license document, provided that the further + restriction does not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in + the form of a separately written license, or stated as exceptions; + the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights + under this License (including any patent licenses granted under the + third paragraph of section 11). + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, you do not qualify to receive new licenses + for the same material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer + transmission to receive a copy likewise does not require + acceptance. However, nothing other than this License grants you + permission to propagate or modify any covered work. These actions + infringe copyright if you do not accept this License. Therefore, + by modifying or propagating a covered work, you indicate your + acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not + responsible for enforcing compliance by third parties with this + License. + + An “entity transaction” is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a + covered work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party’s predecessor in interest had or + could give under the previous paragraph, plus a right to possession + of the Corresponding Source of the work from the predecessor in + interest, if the predecessor has it or can get it with reasonable + efforts. + + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you + may not impose a license fee, royalty, or other charge for exercise + of rights granted under this License, and you may not initiate + litigation (including a cross-claim or counterclaim in a lawsuit) + alleging that any patent claim is infringed by making, using, + selling, offering for sale, or importing the Program or any portion + of it. + + 11. Patents. + + A “contributor” is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. + The work thus licensed is called the contributor’s “contributor + version”. + + A contributor’s “essential patent claims” are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, + permitted by this License, of making, using, or selling its + contributor version, but do not include claims that would be + infringed only as a consequence of further modification of the + contributor version. For purposes of this definition, “control” + includes the right to grant patent sublicenses in a manner + consistent with the requirements of this License. + + Each contributor grants you a non-exclusive, worldwide, + royalty-free patent license under the contributor’s essential + patent claims, to make, use, sell, offer for sale, import and + otherwise run, modify and propagate the contents of its contributor + version. + + In the following three paragraphs, a “patent license” is any + express agreement or commitment, however denominated, not to + enforce a patent (such as an express permission to practice a + patent or covenant not to sue for patent infringement). To “grant” + such a patent license to a party means to make such an agreement or + commitment not to enforce a patent against the party. + + If you convey a covered work, knowingly relying on a patent + license, and the Corresponding Source of the work is not available + for anyone to copy, free of charge and under the terms of this + License, through a publicly available network server or other + readily accessible means, then you must either (1) cause the + Corresponding Source to be so available, or (2) arrange to deprive + yourself of the benefit of the patent license for this particular + work, or (3) arrange, in a manner consistent with the requirements + of this License, to extend the patent license to downstream + recipients. “Knowingly relying” means you have actual knowledge + that, but for the patent license, your conveying the covered work + in a country, or your recipient’s use of the covered work in a + country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, + modify or convey a specific copy of the covered work, then the + patent license you grant is automatically extended to all + recipients of the covered work and works based on it. + + A patent license is “discriminatory” if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that + are specifically granted under this License. You may not convey a + covered work if you are a party to an arrangement with a third + party that is in the business of distributing software, under which + you make payment to the third party based on the extent of your + activity of conveying the work, and under which the third party + grants, to any of the parties who would receive the covered work + from you, a discriminatory patent license (a) in connection with + copies of the covered work conveyed by you (or copies made from + those copies), or (b) primarily for and in connection with specific + products or compilations that contain the covered work, unless you + entered into that arrangement, or that patent license was granted, + prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + + 12. No Surrender of Others’ Freedom. + + If conditions are imposed on you (whether by court order, agreement + or otherwise) that contradict the conditions of this License, they + do not excuse you from the conditions of this License. If you + cannot convey a covered work so as to satisfy simultaneously your + obligations under this License and any other pertinent obligations, + then as a consequence you may not convey it at all. For example, + if you agree to terms that obligate you to collect a royalty for + further conveying from those to whom you convey the Program, the + only way you could satisfy both those terms and this License would + be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU Affero General Public License into a + single combined work, and to convey the resulting work. The terms + of this License will continue to apply to the part which is the + covered work, but the special requirements of the GNU Affero + General Public License, section 13, concerning interaction through + a network will apply to the combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new + versions of the GNU General Public License from time to time. Such + new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU + General Public License “or any later version” applies to it, you + have the option of following the terms and conditions either of + that numbered version or of any later version published by the Free + Software Foundation. If the Program does not specify a version + number of the GNU General Public License, you may choose any + version ever published by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future + versions of the GNU General Public License can be used, that + proxy’s public statement of acceptance of a version permanently + authorizes you to choose that version for the Program. + + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE + COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE + RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL + NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES + AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR + DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE + THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA + BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF + THE POSSIBILITY OF SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely + approximates an absolute waiver of all civil liability in + connection with the Program, unless a warranty or assumption of + liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS +=========================== + +How to Apply These Terms to Your New Programs +============================================= + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least the +“copyright” line and a pointer to where the full notice is found. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YEAR NAME OF AUTHOR + + 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 . + + Also add information on how to contact you by electronic and paper +mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + PROGRAM Copyright (C) YEAR NAME OF AUTHOR + This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’. + This is free software, and you are welcome to redistribute it + under certain conditions; type ‘show c’ for details. + + The hypothetical commands ‘show w’ and ‘show c’ should show the +appropriate parts of the General Public License. Of course, your +program’s commands might be different; for a GUI interface, you would +use an “about box”. + + You should also get your employer (if you work as a programmer) or +school, if any, to sign a “copyright disclaimer” for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + + The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . + + +File: dash.info, Node: Index, Prev: GPL, Up: Top + +Index +***** + +[index] +* Menu: + +* !cdr: Destructive operations. + (line 16) +* !cons: Destructive operations. + (line 8) +* -->: Threading macros. (line 35) +* ->: Threading macros. (line 9) +* ->>: Threading macros. (line 22) +* -all?: Predicates. (line 53) +* -andfn: Function combinators. + (line 184) +* -annotate: Maps. (line 86) +* -any?: Predicates. (line 41) +* -applify: Function combinators. + (line 63) +* -as->: Threading macros. (line 49) +* -butlast: Other list operations. + (line 405) +* -clone: Tree operations. (line 123) +* -common-prefix: Reductions. (line 242) +* -common-suffix: Reductions. (line 252) +* -compose: Function combinators. + (line 49) +* -concat: List to list. (line 23) +* -cons*: Other list operations. + (line 19) +* -cons-pair?: Predicates. (line 154) +* -const: Function combinators. + (line 128) +* -contains?: Predicates. (line 100) +* -copy: Maps. (line 151) +* -count: Reductions. (line 172) +* -cut: Function combinators. + (line 140) +* -cycle: Unfolding. (line 55) +* -difference: Set operations. (line 22) +* -distinct: Set operations. (line 73) +* -dotimes: Side effects. (line 80) +* -doto: Threading macros. (line 99) +* -drop: Sublist selection. (line 149) +* -drop-last: Sublist selection. (line 163) +* -drop-while: Sublist selection. (line 194) +* -each: Side effects. (line 8) +* -each-indexed: Side effects. (line 38) +* -each-r: Side effects. (line 52) +* -each-r-while: Side effects. (line 65) +* -each-while: Side effects. (line 24) +* -elem-index: Indexing. (line 9) +* -elem-indices: Indexing. (line 23) +* -every: Predicates. (line 23) +* -fifth-item: Other list operations. + (line 380) +* -filter: Sublist selection. (line 8) +* -find-index: Indexing. (line 35) +* -find-indices: Indexing. (line 73) +* -find-last-index: Indexing. (line 54) +* -first: Other list operations. + (line 300) +* -first-item: Other list operations. + (line 328) +* -fix: Other list operations. + (line 445) +* -fixfn: Function combinators. + (line 224) +* -flatten: List to list. (line 43) +* -flatten-n: List to list. (line 65) +* -flip: Function combinators. + (line 95) +* -fourth-item: Other list operations. + (line 367) +* -frequencies: Reductions. (line 310) +* -grade-down: Indexing. (line 103) +* -grade-up: Indexing. (line 93) +* -group-by: Partitioning. (line 205) +* -if-let: Binding. (line 34) +* -if-let*: Binding. (line 45) +* -inits: Reductions. (line 222) +* -insert-at: List to list. (line 119) +* -interleave: Other list operations. + (line 56) +* -interpose: Other list operations. + (line 46) +* -intersection: Set operations. (line 36) +* -iota: Other list operations. + (line 67) +* -is-infix?: Predicates. (line 140) +* -is-prefix?: Predicates. (line 116) +* -is-suffix?: Predicates. (line 128) +* -iterate: Unfolding. (line 9) +* -iteratefn: Function combinators. + (line 201) +* -juxt: Function combinators. + (line 37) +* -keep: List to list. (line 8) +* -lambda: Binding. (line 247) +* -last: Other list operations. + (line 318) +* -last-item: Other list operations. + (line 393) +* -let: Binding. (line 61) +* -let*: Binding. (line 227) +* -list: Other list operations. + (line 428) +* -map: Maps. (line 10) +* -map-first: Maps. (line 38) +* -map-indexed: Maps. (line 68) +* -map-last: Maps. (line 53) +* -map-when: Maps. (line 22) +* -mapcat: Maps. (line 140) +* -max: Reductions. (line 286) +* -max-by: Reductions. (line 296) +* -min: Reductions. (line 262) +* -min-by: Reductions. (line 272) +* -non-nil: Sublist selection. (line 95) +* -none?: Predicates. (line 73) +* -not: Function combinators. + (line 153) +* -on: Function combinators. + (line 75) +* -only-some?: Predicates. (line 85) +* -orfn: Function combinators. + (line 167) +* -pad: Other list operations. + (line 241) +* -partial: Function combinators. + (line 8) +* -partition: Partitioning. (line 90) +* -partition-after-item: Partitioning. (line 195) +* -partition-after-pred: Partitioning. (line 162) +* -partition-all: Partitioning. (line 102) +* -partition-all-in-steps: Partitioning. (line 126) +* -partition-before-item: Partitioning. (line 185) +* -partition-before-pred: Partitioning. (line 174) +* -partition-by: Partitioning. (line 138) +* -partition-by-header: Partitioning. (line 149) +* -partition-in-steps: Partitioning. (line 113) +* -permutations: Set operations. (line 60) +* -powerset: Set operations. (line 50) +* -prodfn: Function combinators. + (line 258) +* -product: Reductions. (line 201) +* -reduce: Reductions. (line 53) +* -reduce-from: Reductions. (line 8) +* -reduce-r: Reductions. (line 72) +* -reduce-r-from: Reductions. (line 26) +* -reductions: Reductions. (line 136) +* -reductions-from: Reductions. (line 100) +* -reductions-r: Reductions. (line 154) +* -reductions-r-from: Reductions. (line 118) +* -remove: Sublist selection. (line 26) +* -remove-at: List to list. (line 156) +* -remove-at-indices: List to list. (line 175) +* -remove-first: Sublist selection. (line 44) +* -remove-item: Sublist selection. (line 84) +* -remove-last: Sublist selection. (line 65) +* -repeat: Unfolding. (line 44) +* -replace: List to list. (line 77) +* -replace-at: List to list. (line 130) +* -replace-first: List to list. (line 91) +* -replace-last: List to list. (line 105) +* -rotate: Other list operations. + (line 8) +* -rotate-args: Function combinators. + (line 112) +* -rpartial: Function combinators. + (line 22) +* -running-product: Reductions. (line 211) +* -running-sum: Reductions. (line 190) +* -same-items?: Set operations. (line 88) +* -second-item: Other list operations. + (line 341) +* -select-by-indices: Sublist selection. (line 211) +* -select-column: Sublist selection. (line 241) +* -select-columns: Sublist selection. (line 222) +* -separate: Partitioning. (line 75) +* -setq: Binding. (line 270) +* -slice: Sublist selection. (line 105) +* -snoc: Other list operations. + (line 32) +* -some: Predicates. (line 8) +* -some-->: Threading macros. (line 86) +* -some->: Threading macros. (line 62) +* -some->>: Threading macros. (line 74) +* -sort: Other list operations. + (line 415) +* -splice: Maps. (line 102) +* -splice-list: Maps. (line 127) +* -split-at: Partitioning. (line 8) +* -split-on: Partitioning. (line 40) +* -split-when: Partitioning. (line 58) +* -split-with: Partitioning. (line 23) +* -sum: Reductions. (line 180) +* -table: Other list operations. + (line 256) +* -table-flat: Other list operations. + (line 275) +* -tails: Reductions. (line 232) +* -take: Sublist selection. (line 121) +* -take-last: Sublist selection. (line 135) +* -take-while: Sublist selection. (line 177) +* -third-item: Other list operations. + (line 354) +* -tree-map: Tree operations. (line 28) +* -tree-map-nodes: Tree operations. (line 39) +* -tree-mapreduce: Tree operations. (line 85) +* -tree-mapreduce-from: Tree operations. (line 104) +* -tree-reduce: Tree operations. (line 53) +* -tree-reduce-from: Tree operations. (line 70) +* -tree-seq: Tree operations. (line 8) +* -unfold: Unfolding. (line 25) +* -union: Set operations. (line 8) +* -unzip: Other list operations. + (line 215) +* -unzip-lists: Other list operations. + (line 196) +* -update-at: List to list. (line 142) +* -when-let: Binding. (line 9) +* -when-let*: Binding. (line 21) +* -zip: Other list operations. + (line 150) +* -zip-fill: Other list operations. + (line 176) +* -zip-lists: Other list operations. + (line 114) +* -zip-lists-fill: Other list operations. + (line 135) +* -zip-pair: Other list operations. + (line 98) +* -zip-with: Other list operations. + (line 80) +* dash-fontify-mode: Fontification of special variables. + (line 6) +* dash-register-info-lookup: Info symbol lookup. (line 6) +* global-dash-fontify-mode: Fontification of special variables. + (line 12) + + + +Tag Table: +Node: Top742 +Node: Installation2397 +Node: Using in a package3159 +Node: Fontification of special variables3504 +Node: Info symbol lookup4294 +Node: Functions4877 +Node: Maps6361 +Ref: -map6658 +Ref: -map-when7031 +Ref: -map-first7605 +Ref: -map-last8200 +Ref: -map-indexed8790 +Ref: -annotate9476 +Ref: -splice10080 +Ref: -splice-list11155 +Ref: -mapcat11614 +Ref: -copy11987 +Node: Sublist selection12253 +Ref: -filter12446 +Ref: -remove12999 +Ref: -remove-first13548 +Ref: -remove-last14396 +Ref: -remove-item15126 +Ref: -non-nil15526 +Ref: -slice15808 +Ref: -take16337 +Ref: -take-last16755 +Ref: -drop17192 +Ref: -drop-last17639 +Ref: -take-while18071 +Ref: -drop-while18698 +Ref: -select-by-indices19331 +Ref: -select-columns19842 +Ref: -select-column20545 +Node: List to list21008 +Ref: -keep21200 +Ref: -concat21776 +Ref: -flatten22556 +Ref: -flatten-n23318 +Ref: -replace23702 +Ref: -replace-first24163 +Ref: -replace-last24658 +Ref: -insert-at25146 +Ref: -replace-at25471 +Ref: -update-at25858 +Ref: -remove-at26399 +Ref: -remove-at-indices27026 +Node: Reductions27716 +Ref: -reduce-from27912 +Ref: -reduce-r-from28636 +Ref: -reduce29899 +Ref: -reduce-r30650 +Ref: -reductions-from31928 +Ref: -reductions-r-from32734 +Ref: -reductions33564 +Ref: -reductions-r34275 +Ref: -count35020 +Ref: -sum35250 +Ref: -running-sum35438 +Ref: -product35759 +Ref: -running-product35967 +Ref: -inits36308 +Ref: -tails36553 +Ref: -common-prefix36798 +Ref: -common-suffix37092 +Ref: -min37386 +Ref: -min-by37612 +Ref: -max38133 +Ref: -max-by38358 +Ref: -frequencies38884 +Node: Unfolding39499 +Ref: -iterate39740 +Ref: -unfold40187 +Ref: -repeat40992 +Ref: -cycle41276 +Node: Predicates41673 +Ref: -some41850 +Ref: -every42279 +Ref: -any?42993 +Ref: -all?43342 +Ref: -none?44084 +Ref: -only-some?44404 +Ref: -contains?44949 +Ref: -is-prefix?45455 +Ref: -is-suffix?45787 +Ref: -is-infix?46119 +Ref: -cons-pair?46479 +Node: Partitioning46810 +Ref: -split-at46998 +Ref: -split-with47662 +Ref: -split-on48302 +Ref: -split-when48973 +Ref: -separate49616 +Ref: -partition50150 +Ref: -partition-all50599 +Ref: -partition-in-steps51024 +Ref: -partition-all-in-steps51570 +Ref: -partition-by52084 +Ref: -partition-by-header52462 +Ref: -partition-after-pred53063 +Ref: -partition-before-pred53516 +Ref: -partition-before-item53901 +Ref: -partition-after-item54208 +Ref: -group-by54510 +Node: Indexing54943 +Ref: -elem-index55145 +Ref: -elem-indices55632 +Ref: -find-index56091 +Ref: -find-last-index56760 +Ref: -find-indices57411 +Ref: -grade-up58173 +Ref: -grade-down58580 +Node: Set operations58994 +Ref: -union59177 +Ref: -difference59607 +Ref: -intersection60035 +Ref: -powerset60464 +Ref: -permutations60741 +Ref: -distinct61179 +Ref: -same-items?61573 +Node: Other list operations62182 +Ref: -rotate62407 +Ref: -cons*62760 +Ref: -snoc63182 +Ref: -interpose63594 +Ref: -interleave63888 +Ref: -iota64254 +Ref: -zip-with64737 +Ref: -zip-pair65545 +Ref: -zip-lists66111 +Ref: -zip-lists-fill66909 +Ref: -zip67619 +Ref: -zip-fill68646 +Ref: -unzip-lists69560 +Ref: -unzip70183 +Ref: -pad71176 +Ref: -table71661 +Ref: -table-flat72447 +Ref: -first73452 +Ref: -last73985 +Ref: -first-item74331 +Ref: -second-item74743 +Ref: -third-item75160 +Ref: -fourth-item75535 +Ref: -fifth-item75913 +Ref: -last-item76288 +Ref: -butlast76649 +Ref: -sort76894 +Ref: -list77388 +Ref: -fix77957 +Node: Tree operations78446 +Ref: -tree-seq78642 +Ref: -tree-map79503 +Ref: -tree-map-nodes79943 +Ref: -tree-reduce80807 +Ref: -tree-reduce-from81689 +Ref: -tree-mapreduce82289 +Ref: -tree-mapreduce-from83148 +Ref: -clone84433 +Node: Threading macros84771 +Ref: ->84996 +Ref: ->>85484 +Ref: -->85987 +Ref: -as->86544 +Ref: -some->86998 +Ref: -some->>87383 +Ref: -some-->87830 +Ref: -doto88397 +Node: Binding88950 +Ref: -when-let89157 +Ref: -when-let*89618 +Ref: -if-let90147 +Ref: -if-let*90513 +Ref: -let91136 +Ref: -let*97226 +Ref: -lambda98163 +Ref: -setq98969 +Node: Side effects99770 +Ref: -each99964 +Ref: -each-while100491 +Ref: -each-indexed101111 +Ref: -each-r101703 +Ref: -each-r-while102145 +Ref: -dotimes102789 +Node: Destructive operations103342 +Ref: !cons103560 +Ref: !cdr103764 +Node: Function combinators103957 +Ref: -partial104161 +Ref: -rpartial104679 +Ref: -juxt105327 +Ref: -compose105779 +Ref: -applify106386 +Ref: -on106816 +Ref: -flip107588 +Ref: -rotate-args108112 +Ref: -const108741 +Ref: -cut109083 +Ref: -not109563 +Ref: -orfn110107 +Ref: -andfn110900 +Ref: -iteratefn111687 +Ref: -fixfn112389 +Ref: -prodfn113963 +Node: Development115114 +Node: Contribute115403 +Node: Contributors116415 +Node: FDL118508 +Node: GPL143828 +Node: Index181577 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/.packages/dash-20250312.1307/dir b/.packages/dash-20250312.1307/dir new file mode 100644 index 0000000..7d473f4 --- /dev/null +++ b/.packages/dash-20250312.1307/dir @@ -0,0 +1,18 @@ +This is the file .../info/dir, which contains the +topmost node of the Info hierarchy, called (dir)Top. +The first time you invoke Info you start off looking at this node. + +File: dir, Node: Top This is the top of the INFO tree + + This (the Directory node) gives a menu of major topics. + Typing "q" exits, "H" lists all Info commands, "d" returns here, + "h" gives a primer for first-timers, + "mEmacs" visits the Emacs manual, etc. + + In Emacs, you can click mouse button 2 on a menu item or cross reference + to select it. + +* Menu: + +Emacs +* Dash: (dash.info). A modern list library for GNU Emacs. diff --git a/.packages/emacsql-20251130.1841/README.md b/.packages/emacsql-20251130.1841/README.md new file mode 100644 index 0000000..5a6e004 --- /dev/null +++ b/.packages/emacsql-20251130.1841/README.md @@ -0,0 +1,434 @@ +# EmacSQL + +EmacSQL is a high-level Emacs Lisp front-end for SQLite. + +PostgreSQL and MySQL are also supported, but use of these connectors +is not recommended. + +Any [readable lisp value][readable] can be stored as a value in +EmacSQL, including numbers, strings, symbols, lists, vectors, and +closures. EmacSQL has no concept of "TEXT" values; it's all just lisp +objects. The lisp object `nil` corresponds 1:1 with `NULL` in the +database. + +Requires Emacs 26 or later. + +[![Compile](https://github.com/magit/emacsql/actions/workflows/compile.yml/badge.svg)](https://github.com/magit/emacsql/actions/workflows/compile.yml) +[![Test](https://github.com/magit/emacsql/actions/workflows/test.yml/badge.svg)](https://github.com/magit/emacsql/actions/workflows/test.yml) +[![NonGNU ELPA](https://emacsair.me/assets/badges/nongnu-elpa.svg)](https://elpa.nongnu.org/nongnu-devel/emacsql.html) +[![MELPA Stable](https://stable.melpa.org/packages/emacsql-badge.svg)](https://stable.melpa.org/#/emacsql) +[![MELPA](https://melpa.org/packages/emacsql-badge.svg)](https://melpa.org/#/emacsql) + +### FAQ +#### Why are all values stored as strings? + +EmacSQL is not intended to interact with arbitrary databases, but to +be an ACID-compliant database for Emacs extensions. This means that +EmacSQL cannot be used with a regular SQL database used by other +non-Emacs clients. + +All database values must be s-expressions. When EmacSQL stores a +value — string, symbol, cons, etc. — it is printed and written to +the database in its printed form. Strings are wrapped in quotes +and escaped as necessary. That means "bare" symbols in the database +generally look like strings. The only exception is `nil`, which is +stored as `NULL`. + +#### Will EmacSQL ever support arbitrary databases? + +The author of EmacSQL [thinks][mistake] that it was probably a +design mistake to restrict it to Emacs by storing only printed values, +and that it would be a lot more useful if it just handled primitive +database types. + +However, EmacSQL is in maintenance mode and there are no plans to +make any fundamental changes, not least because they would break all +existing packages and databases that rely on the current EmacSQL +behavior. + +### Windows Issues + +Emacs `start-process-shell-command` function is not supported on +Windows. Since both `emacsql-mysql` and `emacsql-psql` rely on this +function, neither of these connection types are supported on Windows. + +## Example Usage + +```el +(defvar db (emacsql-sqlite-open "~/company.db")) + +;; Create a table. Table and column identifiers are symbols. +(emacsql db [:create-table people ([name id salary])]) + +;; Or optionally provide column constraints. +(emacsql db [:create-table people + ([name (id integer :primary-key) (salary float)])]) + +;; Insert some data: +(emacsql db [:insert :into people + :values (["Jeff" 1000 60000.0] ["Susan" 1001 64000.0])]) + +;; Query the database for results: +(emacsql db [:select [name id] + :from people + :where (> salary 62000)]) +;; => (("Susan" 1001)) + +;; Queries can be templates, using $1, $2, etc.: +(emacsql db [:select [name id] + :from people + :where (> salary $s1)] + 50000) +;; => (("Jeff" 1000) ("Susan" 1001)) +``` + +When editing these prepared SQL s-expression statements, the `M-x +emacsql-show-last-sql` command (think `eval-last-sexp`) is useful for +seeing what the actual SQL expression will become when compiled. + +## Schema + +A table schema is a list whose first element is a vector of column +specifications. The rest of the list specifies table constraints. A +column identifier is a symbol and a column's specification can either +be just this symbol or it can include constraints as a list. Because +EmacSQL stores entire lisp objects as values, the only relevant (and +allowed) types are `integer`, `float`, and `object` (default). + + ([() ...] ( ...) ...]) + +Dashes in identifiers are converted into underscores when compiled +into SQL. This allows for lisp-style identifiers to be used in SQL. +Constraints follow the compilation rules below. + +```el +;; No constraints schema with four columns: +([name id building room]) + +;; Add some column constraints: +([(name :unique) (id integer :primary-key) building room]) + +;; Add some table constraints: +([(name :unique) (id integer :primary-key) building room] + (:unique [building room]) + (:check (> id 0))) +``` + +Here's an example using foreign keys. + +```el +;; "subjects" table schema +([(id integer :primary-key) subject]) + +;; "tag" table references subjects +([(subject-id integer) tag] + (:foreign-key [subject-id] :references subjects [id] + :on-delete :cascade)) +``` + +Foreign key constraints are enabled by default in EmacSQL. + +## Operators + +Expressions are written lisp-style, with the operator first. If it +looks like an operator EmacSQL treats it like an operator. However, +several operators are special. + + <= >= funcall quote + +The `<=` and `>=` operators accept 2 or 3 operands, transforming into +a SQL `_ BETWEEN _ AND _` operator as appropriate. + +For function-like "operators" like `count` and `max` use the `funcall` +"operator." + +```el +[:select (funcall max age) :from people] +``` + +With `glob` and `like` SQL operators keep in mind that they're +matching the *printed* representations of these values, even if the +value is a string. + +The `||` concatenation operator is unsupported because concatenating +printed representations breaks an important constraint: all values must +remain readable within SQLite. + +## Quoting + +Inside expressions, EmacSQL cannot tell the difference between symbol +literals and column references. If you're talking about the symbol +itself, just quote it as you would in normal Elisp. Note that this +does not "escape" `$tn` parameter symbols. + +```el +(emacsql db [... :where (= category 'hiking)]) +``` + +Quoting a string makes EmacSQL handle it as a "raw string." These raw +strings are not printed when being assembled into a query. These are +intended for use in special circumstances like filenames (`ATTACH`) or +pattern matching (`LIKE`). It is vital that raw strings are not +returned as results. + +```el +(emacsql db [... :where (like name '"%foo%")]) +(emacsql db [:attach '"/path/to/foo.db" :as foo]) +``` + +Since template parameters include their type they never need to be +quoted. + +## Prepared Statements + +The database is interacted with via prepared SQL s-expression +statements. You shouldn't normally be concatenating strings on your +own. (And it leaves out any possibility of a SQL injection!) See the +"Usage" section above for examples. A statement is a vector of +keywords and other lisp object. + +Prepared EmacSQL s-expression statements are compiled into SQL +statements. The statement compiler is memorized so that using the same +statement multiple times is fast. To assist in this, the statement can +act as a template -- using `$i1`, `$s2`, etc. -- working like the +Elisp `format` function. + +### Compilation Rules + +Rather than the typical uppercase SQL keywords, keywords in a prepared +EmacSQL statement are literally just that: lisp keywords. EmacSQL only +understands a very small amount of SQL's syntax. The compiler follows +some simple rules to convert an s-expression into SQL. + +#### All prepared statements are vectors. + +A prepared s-expression statement is a vector beginning with a keyword +followed by a series of keywords and special values. This includes +most kinds of sub-queries. + +```el +[:select ... :from ...] +[:select tag :from tags + :where (in tag [:select ...])] +``` + +#### Keywords are split and capitalized. + +Dashes are converted into spaces and the keyword gets capitalized. For +example, `:if-not-exists` becomes `IF NOT EXISTS`. How you choose to +combine keywords is up to your personal taste (e.g., `:drop :table` vs. +`:drop-table`). + +#### Standalone symbols are identifiers. + +EmacSQL doesn't know what symbols refer to identifiers and what +symbols should be treated as values. Use quotes to mark a symbol as a +value. For example, `people` here will be treated as an identifier. + +```el +[:insert-into people :values ...] +``` + +#### Row-oriented information is always represented as vectors. + +This includes rows being inserted, and sets of columns in a query. If +you're talking about a row-like thing then put it in a vector. + +```el +[:select [id name] :from people] +``` + +Note that `*` is actually a SQL keyword, so don't put it in a vector. + +```el +[:select * :from ...] +``` + +#### Lists are treated as expressions. + +This is true even within row-oriented vectors. + +```el +[... :where (= name "Bob")] +[:select [(/ seconds 60) count] :from ...] +``` + +Some things that are traditionally keywords -- particularly those that +are mixed in with expressions -- have been converted into operators +(`AS`, `ASC`, `DESC`). + +```el +[... :order-by [(asc b), (desc a)]] ; "ORDER BY b ASC, a DESC" +[:select p:name :from (as people p)] ; "SELECT p.name FROM people AS p" +``` + +#### The `:values` keyword is special. + +What follows `:values` is always treated like a vector or list of +vectors. Normally this sort of thing would appear to be a column +reference. + +```el +[... :values [1 2 3]] +[... :values ([1 2 3] [4 5 6])] ; insert multiple rows +``` + +#### A list whose first element is a vector is a table schema. + +This is to distinguish schemata from everything else. With the +exception of what follows `:values`, nothing else is shaped like this. + +```el +[:create-table people ([(id :primary-key) name])] +``` + +### Templates + +To make statement compilation faster, and to avoid making you build up +statements dynamically, you can insert `$tn` parameters in place of +identifiers and values. These refer to the argument's type and its +argument position after the statement in the `emacsql` function, +one-indexed. + +```el +(emacsql db [:select * :from $i1 :where (> salary $s2)] 'employees 50000) + +(emacsql db [:select * :from employees :where (like name $r1)] "%Smith%") +``` + +The letter before the number is the type. + + * `i` : identifier + * `s` : scalar + * `v` : vector (or multiple vectors) + * `r` : raw, unprinted strings + * `S` : schema + +When combined with `:values`, the vector type can refer to lists of +rows. + +```el +(emacsql db [:insert-into favorite-characters :values $v1] + '([0 "Calvin"] [1 "Hobbes"] [3 "Susie"])) +``` + +This is why rows must be vectors and not lists. + +### Ignored Features + +EmacSQL doesn't cover all of SQLite's features. Here are a list of +things that aren't supported, and probably will never be. + + * Collating. SQLite has three built-in collation functions: BINARY + (default), NOCASE, and RTRIM. EmacSQL values never have right-hand + whitespace, so RTRIM won't be of any use. NOCASE is broken + (ASCII-only) and there's little reason to use it. + + * Text manipulation functions. Like collating this is incompatible + with EmacSQL s-expression storage. + + * Date and time. These are incompatible with the printed values + stored by EmacSQL and therefore have little use. + +## Limitations + +EmacSQL is *not* intended to play well with other programs accessing +the SQLite database. Non-numeric values are stored encoded as +s-expressions TEXT values. This avoids ambiguities in parsing output +from the command line and allows for storage of Emacs richer data +types. This is an efficient, ACID-compliant database specifically for +Emacs. + +## Emacs Lisp Indentation Annoyance + +By default, `emacs-lisp-mode` indents vectors as if they were regular +function calls. + +```el +;; Ugly indentation! +(emacsql db [:select * + :from people + :where (> age 60)]) +``` + +Calling the function `emacsql-fix-vector-indentation` (interactive) +advises the major mode to fix this annoyance. + +```el +;; Such indent! +(emacsql db [:select * + :from people + :where (> age 60)]) +``` + +## Contributing and Extending + +To run the test suite, clone the `pg` and `sqlite3` packages into +sibling directories. The Makefile will automatically put these paths on +the Emacs load path (override `LDFLAGS` if your situation is different). + +```shell +git clone https://github.com/emarsden/pg-el ../pg +git clone https://github.com/pekingduck/emacs-sqlite3-api ../sqlite3 +``` + +Or set `LOAD_PATH` to point at these packages elsewhere: + +```shell +make LOAD_PATH='-L path/to/pg -L path/to/sqlite3' +``` + +Then invoke make: + +```shell +make test +``` + +If the environment variable `PGDATABASE` is present then the unit +tests will also be run with PostgreSQL (emacsql-psql). Provide +`PGHOST`, `PGPORT`, and `PGUSER` if needed. If `PGUSER` is provided, +the pg.el back-end (emacsql-pg) will also be tested. + +If the environment variable `MYSQL_DBNAME` is present then the unit +tests will also be run with MySQL in the named database. Note that +this is not an official MySQL variable, just something made up for +EmacSQL. + +### Creating a New Front-end + +EmacSQL uses EIEIO so that interactions with a connection occur +through generic functions. You need to define a new class that +inherits from `emacsql-connection`. + + * Implement `emacsql-send-message`, `emacsql-waiting-p`, + `emacsql-parse`, and `emacsql-close`. + * Provide a constructor that initializes the connection and calls + `emacsql-register` (for automatic connection cleanup). + * Provide `emacsql-types` if needed (hint: use a class-allocated slot). + * Ensure that you properly read NULL as nil (hint: ask your back-end + to print it that way). + * Register all reserved words with `emacsql-register-reserved`. + * Preferably provide `emacsql-reconnect` if possible. + * Set the default isolation level to *serializable*. + * Enable autocommit mode by default. + * Prefer ANSI syntax (value escapes, identifier escapes, etc.). + * Enable foreign key constraints by default. + +The goal of the autocommit, isolation, parsing, and foreign key +configuration settings is to normalize the interface as much as +possible. The connection's user should have the option to be agnostic +about which back-end is actually in use. + +The provided implementations should serve as useful examples. If your +back-end outputs data in a clean, standard way you may be able to use +the emacsql-protocol-mixin class to do most of the work. + +## See Also + + * [SQLite Documentation](https://www.sqlite.org/docs.html) + +[readable]: http://nullprogram.com/blog/2013/12/30/#almost_everything_prints_readably +[mistake]: https://github.com/magit/emacsql/issues/35#issuecomment-346352439 + + + diff --git a/.packages/emacsql-20251130.1841/emacsql-autoloads.el b/.packages/emacsql-20251130.1841/emacsql-autoloads.el new file mode 100644 index 0000000..bae8de9 --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-autoloads.el @@ -0,0 +1,68 @@ +;;; emacsql-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 emacsql.el + +(autoload 'emacsql-show-last-sql "emacsql" "\ +Display the compiled SQL of the s-expression SQL expression before point. +A prefix argument causes the SQL to be printed into the current buffer. + +(fn &optional PREFIX)" t) +(register-definition-prefixes "emacsql" '("emacsql-")) + + +;;; Generated autoloads from emacsql-compiler.el + +(register-definition-prefixes "emacsql-compiler" '("emacsql-")) + + +;;; Generated autoloads from emacsql-mysql.el + +(register-definition-prefixes "emacsql-mysql" '("emacsql-mysql-")) + + +;;; Generated autoloads from emacsql-pg.el + +(register-definition-prefixes "emacsql-pg" '("emacsql-pg-connection")) + + +;;; Generated autoloads from emacsql-psql.el + +(register-definition-prefixes "emacsql-psql" '("emacsql-psql-")) + + +;;; Generated autoloads from emacsql-sqlite.el + +(register-definition-prefixes "emacsql-sqlite" '("emacsql-")) + + +;;; Generated autoloads from emacsql-sqlite-builtin.el + +(register-definition-prefixes "emacsql-sqlite-builtin" '("emacsql-sqlite-builtin-connection")) + + +;;; Generated autoloads from emacsql-sqlite-module.el + +(register-definition-prefixes "emacsql-sqlite-module" '("emacsql-sqlite-module-connection")) + +;;; End of scraped data + +(provide 'emacsql-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; emacsql-autoloads.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql-compiler.el b/.packages/emacsql-20251130.1841/emacsql-compiler.el new file mode 100644 index 0000000..575af47 --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-compiler.el @@ -0,0 +1,546 @@ +;;; emacsql-compiler.el --- S-expression SQL compiler -*- lexical-binding:t -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Christopher Wellons +;; Maintainer: Jonas Bernoulli + +;; SPDX-License-Identifier: Unlicense + +;;; Commentary: + +;; This library provides support for compiling S-expressions to SQL. + +;;; Code: + +(require 'cl-lib) + +(eval-when-compile (require 'subr-x)) + +;;; Error symbols + +(defmacro emacsql-deferror (symbol parents message) + "Defines a new error symbol for EmacSQL." + (declare (indent 2)) + (let ((conditions (cl-remove-duplicates + (append parents (list symbol 'emacsql-error 'error))))) + `(prog1 ',symbol + (put ',symbol 'error-conditions ',conditions) + (put ',symbol 'error-message ,message)))) + +(emacsql-deferror emacsql-error () ;; parent condition for all others + "EmacSQL had an unhandled condition") + +(emacsql-deferror emacsql-syntax () "Invalid SQL statement") +(emacsql-deferror emacsql-internal () "Internal error") +(emacsql-deferror emacsql-locked () "Database locked") +(emacsql-deferror emacsql-fatal () "Fatal error") +(emacsql-deferror emacsql-memory () "Out of memory") +(emacsql-deferror emacsql-corruption () "Database corrupted") +(emacsql-deferror emacsql-access () "Database access error") +(emacsql-deferror emacsql-timeout () "Query timeout error") +(emacsql-deferror emacsql-warning () "Warning message") + +(defun emacsql-error (format &rest args) + "Like `error', but signal an emacsql-syntax condition." + (signal 'emacsql-syntax (list (apply #'format format args)))) + +;;; Escaping functions + +(defvar emacsql-reserved (make-hash-table :test 'equal) + "Collection of all known reserved words, used for escaping.") + +(defun emacsql-register-reserved (seq) + "Register sequence of keywords as reserved words, returning SEQ." + (cl-loop for word being the elements of seq + do (setf (gethash (upcase (format "%s" word)) emacsql-reserved) t) + finally (cl-return seq))) + +(defun emacsql-reserved-p (name) + "Returns non-nil if string NAME is a SQL keyword." + (gethash (upcase name) emacsql-reserved)) + +(defun emacsql-quote-scalar (string) + "Single-quote (scalar) STRING for use in a SQL expression." + (with-temp-buffer + (insert string) + (goto-char (point-min)) + (while (re-search-forward "'" nil t) + (replace-match "''")) + (goto-char (point-min)) + (insert "'") + (goto-char (point-max)) + (insert "'") + (buffer-string))) + +(defun emacsql-quote-character (c) + "Single-quote character C for use in a SQL expression." + (if (char-equal c ?') + "''''" + (format "'%c'" c))) + +(defun emacsql-quote-identifier (string) + "Double-quote (identifier) STRING for use in a SQL expression." + (format "\"%s\"" (replace-regexp-in-string "\"" "\"\"" string))) + +(defun emacsql-escape-identifier (identifier) + "Escape an identifier, if needed, for SQL." + (when (or (null identifier) + (keywordp identifier) + (not (or (symbolp identifier) + (vectorp identifier)))) + (emacsql-error "Invalid identifier: %S" identifier)) + (cond + ((vectorp identifier) + (mapconcat #'emacsql-escape-identifier identifier ", ")) + ((eq identifier '*) "*") + (t + (let ((name (symbol-name identifier))) + (if (string-match-p ":" name) + (mapconcat #'emacsql-escape-identifier + (mapcar #'intern (split-string name ":")) ".") + (let ((print (replace-regexp-in-string "-" "_" (format "%S" identifier))) + (special "[]-\000-\040!\"#%&'()*+,./:;<=>?@[\\^`{|}~\177]")) + (if (or (string-match-p special print) + (string-match-p "^[0-9$]" print) + (emacsql-reserved-p print)) + (emacsql-quote-identifier print) + print))))))) + +(defvar print-escape-control-characters) + +(defun emacsql-escape-scalar (value) + "Escape VALUE for sending to SQLite." + (let ((print-escape-newlines t) + (print-escape-control-characters t)) + (cond ((null value) "NULL") + ((numberp value) (prin1-to-string value)) + ((emacsql-quote-scalar (prin1-to-string value)))))) + +(defun emacsql-escape-raw (value) + "Escape VALUE for sending to SQLite." + (cond ((null value) "NULL") + ((stringp value) (emacsql-quote-scalar value)) + ((error "Expected string or nil")))) + +(defun emacsql-escape-vector (vector) + "Encode VECTOR into a SQL vector scalar." + (cl-typecase vector + (null (emacsql-error "Empty SQL vector expression")) + (list (mapconcat #'emacsql-escape-vector vector ", ")) + (vector (concat "(" (mapconcat #'emacsql-escape-scalar vector ", ") ")")) + (otherwise (emacsql-error "Invalid vector %S" vector)))) + +(defun emacsql-escape-format (thing) + "Escape THING for use as a `format' spec." + (replace-regexp-in-string "%" "%%" thing)) + +;;; Schema compiler + +(defvar emacsql-type-map + '((integer "&INTEGER") + (float "&REAL") + (object "&TEXT") + (nil "&NONE")) + "An alist mapping EmacSQL types to SQL types.") + +(defun emacsql--from-keyword (keyword) + "Convert KEYWORD into SQL." + (let ((name (substring (symbol-name keyword) 1))) + (upcase (replace-regexp-in-string "-" " " name)))) + +(defun emacsql--prepare-constraints (constraints) + "Compile CONSTRAINTS into a partial SQL expression." + (mapconcat + #'identity + (cl-loop for constraint in constraints collect + (cl-typecase constraint + (null "NULL") + (keyword (emacsql--from-keyword constraint)) + (symbol (emacsql-escape-identifier constraint)) + (vector (format "(%s)" + (mapconcat + #'emacsql-escape-identifier + constraint + ", "))) + (list (format "(%s)" + (car (emacsql--*expr constraint)))) + (otherwise + (emacsql-escape-scalar constraint)))) + " ")) + +(defun emacsql--prepare-column (column) + "Convert COLUMN into a partial SQL string." + (mapconcat + #'identity + (cl-etypecase column + (symbol (list (emacsql-escape-identifier column) + (cadr (assoc nil emacsql-type-map)))) + (list (cl-destructuring-bind (name . constraints) column + (cl-delete-if + (lambda (s) (zerop (length s))) + (list (emacsql-escape-identifier name) + (if (member (car constraints) '(integer float object)) + (cadr (assoc (pop constraints) emacsql-type-map)) + (cadr (assoc nil emacsql-type-map))) + (emacsql--prepare-constraints constraints)))))) + " ")) + +(defun emacsql-prepare-schema (schema) + "Compile SCHEMA into a SQL string." + (if (vectorp schema) + (emacsql-prepare-schema (list schema)) + (cl-destructuring-bind (columns . constraints) schema + (mapconcat + #'identity + (nconc + (mapcar #'emacsql--prepare-column columns) + (mapcar #'emacsql--prepare-constraints constraints)) + ", ")))) + +;;; Statement compilation + +(defvar emacsql-prepare-cache (make-hash-table :test 'equal :weakness 'key) + "Cache used to memoize `emacsql-prepare'.") + +(defvar emacsql--vars () + "Used within `emacsql-with-params' to collect parameters.") + +(defun emacsql-sql-p (thing) + "Return non-nil if THING looks like a prepared statement." + (and (vectorp thing) (> (length thing) 0) (keywordp (aref thing 0)))) + +(defun emacsql-param (thing) + "Return the index and type of THING, or nil if THING is not a parameter. +A parameter is a symbol that looks like $i1, $s2, $v3, etc. The +letter refers to the type: identifier (i), scalar (s), +vector (v), raw string (r), schema (S)." + (and (symbolp thing) + (let ((name (symbol-name thing))) + (and (string-match-p "^\\$[isvrS][0-9]+$" name) + (cons (1- (read (substring name 2))) + (cl-ecase (aref name 1) + (?i :identifier) + (?s :scalar) + (?v :vector) + (?r :raw) + (?S :schema))))))) + +(defmacro emacsql-with-params (prefix &rest body) + "Evaluate BODY, collecting parameters. +Provided local functions: `param', `identifier', `scalar', `raw', +`svector', `expr', `subsql', and `combine'. BODY should return a +string, which will be combined with variable definitions." + (declare (indent 1)) + `(let ((emacsql--vars ())) + (cl-flet* ((combine (prepared) (emacsql--*combine prepared)) + (param (thing) (emacsql--!param thing)) + (identifier (thing) (emacsql--!param thing :identifier)) + (scalar (thing) (emacsql--!param thing :scalar)) + (raw (thing) (emacsql--!param thing :raw)) + (svector (thing) (combine (emacsql--*vector thing))) + (expr (thing) (combine (emacsql--*expr thing))) + (subsql (thing) + (format "(%s)" (combine (emacsql-prepare thing))))) + (cons (concat ,prefix (progn ,@body)) emacsql--vars)))) + +(defun emacsql--!param (thing &optional kind) + "Parse, escape, and store THING. +If optional KIND is not specified, then try to guess it. +Only use within `emacsql-with-params'!" + (cl-flet ((check (param) + (when (and kind (not (eq kind (cdr param)))) + (emacsql-error + "Invalid parameter type %s, expecting %s" thing kind)))) + (let ((param (emacsql-param thing))) + (if (null param) + (emacsql-escape-format + (if kind + (cl-case kind + (:identifier (emacsql-escape-identifier thing)) + (:scalar (emacsql-escape-scalar thing)) + (:vector (emacsql-escape-vector thing)) + (:raw (emacsql-escape-raw thing)) + (:schema (emacsql-prepare-schema thing))) + (if (and (not (null thing)) + (not (keywordp thing)) + (symbolp thing)) + (emacsql-escape-identifier thing) + (emacsql-escape-scalar thing)))) + (prog1 (if (eq (cdr param) :schema) "(%s)" "%s") + (check param) + (setq emacsql--vars (nconc emacsql--vars (list param)))))))) + +(defun emacsql--*vector (vector) + "Prepare VECTOR." + (emacsql-with-params "" + (cl-typecase vector + (symbol (emacsql--!param vector :vector)) + (list (mapconcat #'svector vector ", ")) + (vector (format "(%s)" (mapconcat #'scalar vector ", "))) + (otherwise (emacsql-error "Invalid vector: %S" vector))))) + +(defmacro emacsql--generate-op-lookup-defun (name operator-precedence-groups) + "Generate function to look up predefined SQL operator metadata. + +The generated function is bound to NAME and accepts two +arguments, OPERATOR-NAME and OPERATOR-ARGUMENT-COUNT. +OPERATOR-PRECEDENCE-GROUPS should be a number of lists containing +operators grouped by operator precedence (in order of precedence +from highest to lowest). A single operator is represented by a +list of at least two elements: operator name (symbol) and +operator arity (:unary or :binary). Optionally a custom +expression can be included, which defines how the operator is +expanded into an SQL expression (there are two defaults, one for +:unary and one for :binary operators). + +An example for OPERATOR-PRECEDENCE-GROUPS: +\(((+ :unary (\"+\" :operand)) (- :unary (\"-\" :operand))) + ((+ :binary) (- :binary)))" + `(defun ,name (operator-name operator-argument-count) + "Look up predefined SQL operator metadata. +See `emacsql--generate-op-lookup-defun' for details." + (cond + ,@(cl-loop + for precedence-value from 1 + for precedence-group in (reverse operator-precedence-groups) + append (cl-loop + for (op-name arity custom-expr) in precedence-group + for sql-name = (upcase (symbol-name op-name)) + for sql-expr = + (or custom-expr + (pcase arity + (:unary `(,sql-name " " :operand)) + (:binary `(:operand " " ,sql-name " " :operand)))) + + collect (list `(and (eq operator-name + (quote ,op-name)) + ,(if (eq arity :unary) + `(eql operator-argument-count 1) + `(>= operator-argument-count 2))) + `(list ',sql-expr ,arity ,precedence-value)))) + (t (list nil nil nil))))) + +(emacsql--generate-op-lookup-defun + emacsql--get-op + (((~ :unary ("~" :operand))) + ((collate :binary)) + ((|| :binary)) + ((* :binary) (/ :binary) (% :binary)) + ((+ :unary ("+" :operand)) (- :unary ("-" :operand))) + ((+ :binary) (- :binary)) + ((& :binary) (| :binary) (<< :binary) (>> :binary)) + ((escape :binary (:operand " ESCAPE " :operand))) + ((< :binary) (<= :binary) (> :binary) (>= :binary)) + + (;;TODO? (between :binary) (not-between :binary) + (is :binary) (is-not :binary (:operand " IS NOT " :operand)) + (match :binary) (not-match :binary (:operand " NOT MATCH " :operand)) + (like :binary) (not-like :binary (:operand " NOT LIKE " :operand)) + (in :binary) (not-in :binary (:operand " NOT IN " :operand)) + (isnull :unary (:operand " ISNULL")) + (notnull :unary (:operand " NOTNULL")) + (= :binary) (== :binary) + (!= :binary) (<> :binary) + (glob :binary) (not-glob :binary (:operand " NOT GLOB " :operand)) + (regexp :binary) (not-regexp :binary (:operand " NOT REGEXP " :operand))) + + ((not :unary)) + ((and :binary)) + ((or :binary)))) + +(defun emacsql--expand-format-string (op expr arity argument-count) + "Create format-string for an SQL operator. +The format-string returned is intended to be used with `format' +to create an SQL expression." + (and expr + (cl-labels ((replace-operand (x) (if (eq x :operand) "%s" x)) + (to-format-string (e) (mapconcat #'replace-operand e ""))) + (cond + ((and (eq arity :unary) (eql argument-count 1)) + (to-format-string expr)) + ((and (eq arity :binary) (>= argument-count 2)) + (let ((result (reverse expr))) + (dotimes (_ (- argument-count 2)) + (setq result (nconc (reverse expr) (cdr result)))) + (to-format-string (nreverse result)))) + (t (emacsql-error "Wrong number of operands for %s" op)))))) + +(defun emacsql--get-op-info (op argument-count parent-precedence-value) + "Lookup SQL operator information for generating an SQL expression. +Returns the following multiple values when an operator can be +identified: a format string (see `emacsql--expand-format-string') +and a precedence value. If PARENT-PRECEDENCE-VALUE is greater or +equal to the identified operator's precedence, then the format +string returned is wrapped with parentheses." + (cl-destructuring-bind (format-string arity precedence-value) + (emacsql--get-op op argument-count) + (let ((expanded-format-string + (emacsql--expand-format-string + op + format-string + arity + argument-count))) + (cl-values (cond + ((null format-string) nil) + ((>= parent-precedence-value + precedence-value) + (format "(%s)" expanded-format-string)) + (t expanded-format-string)) + precedence-value)))) + +(defun emacsql--*expr (expr &optional parent-precedence-value) + "Expand EXPR recursively." + (emacsql-with-params "" + (cond + ((emacsql-sql-p expr) (subsql expr)) + ((vectorp expr) (svector expr)) + ((atom expr) (param expr)) + ((cl-destructuring-bind (op . args) expr + (cl-multiple-value-bind (format-string precedence-value) + (emacsql--get-op-info op + (length args) + (or parent-precedence-value 0)) + (cl-flet ((recur (n) + (combine (emacsql--*expr (nth n args) + (or precedence-value 0)))) + (nops (op) + (emacsql-error "Wrong number of operands for %s" op))) + (cl-case op + ;; Special cases <= >= + ((<= >=) + (cl-case (length args) + (2 (format format-string (recur 0) (recur 1))) + (3 (format (if (>= (or parent-precedence-value 0) + precedence-value) + "(%s BETWEEN %s AND %s)" + "%s BETWEEN %s AND %s") + (recur 1) + (recur (if (eq op '>=) 2 0)) + (recur (if (eq op '>=) 0 2)))) + (otherwise (nops op)))) + ;; enforce second argument to be a character + ((escape) + (let ((second-arg (cadr args))) + (cond + ((not (= 2 (length args))) (nops op)) + ((not (characterp second-arg)) + (emacsql-error + "Second operand of escape has to be a character, got %s" + second-arg)) + (t (format format-string + (recur 0) + (emacsql-quote-character second-arg)))))) + ;; Ordering + ((asc desc) + (format "%s %s" (recur 0) (upcase (symbol-name op)))) + ;; Special case quote + ((quote) (let ((arg (nth 0 args))) + (if (stringp arg) + (raw arg) + (scalar arg)))) + ;; Special case funcall + ((funcall) + (format "%s(%s)" (recur 0) + (cond + ((and (= 2 (length args)) + (eq '* (nth 1 args))) + "*") + ((and (= 3 (length args)) + (eq :distinct (nth 1 args)) + (format "DISTINCT %s" (recur 2)))) + ((mapconcat + #'recur (cl-loop for i from 1 below (length args) + collect i) + ", "))))) + ;; Guess + (otherwise + (let ((arg-indices (cl-loop for i from 0 below (length args) collect i))) + (if format-string + (apply #'format format-string (mapcar #'recur arg-indices)) + (mapconcat + #'recur (cl-loop for i from 0 below (length args) collect i) + (format " %s " (upcase (symbol-name op))))))))))))))) + +(defun emacsql--*idents (idents) + "Read in a vector of IDENTS identifiers, or just an single identifier." + (emacsql-with-params "" + (mapconcat #'expr idents ", "))) + +(defun emacsql--*combine (prepared) + "Append parameters from PREPARED to `emacsql--vars', return the string. +Only use within `emacsql-with-params'!" + (cl-destructuring-bind (string . vars) prepared + (setq emacsql--vars (nconc emacsql--vars vars)) + string)) + +(defun emacsql-prepare--string (string) + "Create a prepared statement from STRING." + (emacsql-with-params "" + (replace-regexp-in-string + "\\$[isv][0-9]+" (lambda (v) (param (intern v))) string))) + +(defun emacsql-prepare--sexp (sexp) + "Create a prepared statement from SEXP." + (emacsql-with-params "" + (cl-loop with items = (cl-coerce sexp 'list) + and last = nil + while (not (null items)) + for item = (pop items) + collect + (cl-typecase item + (keyword (if (eq :values item) + (concat "VALUES " (svector (pop items))) + (emacsql--from-keyword item))) + (symbol (if (eq item '*) + "*" + (param item))) + (vector (if (emacsql-sql-p item) + (subsql item) + (let ((idents (combine + (emacsql--*idents item)))) + (if (keywordp last) + idents + (format "(%s)" idents))))) + (list (if (vectorp (car item)) + (emacsql-escape-format + (format "(%s)" + (emacsql-prepare-schema item))) + (combine (emacsql--*expr item)))) + (otherwise + (emacsql-escape-format + (emacsql-escape-scalar item)))) + into parts + do (setq last item) + finally (cl-return (string-join parts " "))))) + +(defun emacsql-prepare (sql) + "Expand SQL (string or sexp) into a prepared statement." + (let* ((cache emacsql-prepare-cache) + (key (cons emacsql-type-map sql))) + (or (gethash key cache) + (setf (gethash key cache) + (if (stringp sql) + (emacsql-prepare--string sql) + (emacsql-prepare--sexp sql)))))) + +(defun emacsql-format (expansion &rest args) + "Fill in the variables EXPANSION with ARGS." + (cl-destructuring-bind (format . vars) expansion + (let ((print-level nil) + (print-length nil)) + (apply #'format format + (cl-loop for (i . kind) in vars collect + (let ((thing (nth i args))) + (cl-case kind + (:identifier (emacsql-escape-identifier thing)) + (:scalar (emacsql-escape-scalar thing)) + (:vector (emacsql-escape-vector thing)) + (:raw (emacsql-escape-raw thing)) + (:schema (emacsql-prepare-schema thing)) + (otherwise + (emacsql-error "Invalid var type %S" kind))))))))) + +(provide 'emacsql-compiler) + +;;; emacsql-compiler.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql-compiler.elc b/.packages/emacsql-20251130.1841/emacsql-compiler.elc new file mode 100644 index 0000000..9abb207 Binary files /dev/null and b/.packages/emacsql-20251130.1841/emacsql-compiler.elc differ diff --git a/.packages/emacsql-20251130.1841/emacsql-mysql.el b/.packages/emacsql-20251130.1841/emacsql-mysql.el new file mode 100644 index 0000000..f8b9207 --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-mysql.el @@ -0,0 +1,132 @@ +;;; emacsql-mysql.el --- EmacSQL back-end for MySQL -*- lexical-binding:t -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Christopher Wellons +;; Maintainer: Jonas Bernoulli + +;; SPDX-License-Identifier: Unlicense + +;;; Commentary: + +;; This library provides an EmacSQL back-end for MySQL, which uses +;; the standard `msql' command line program. + +;;; Code: + +(require 'emacsql) + +(defvar emacsql-mysql-executable "mysql" + "Path to the mysql command line executable.") + +(defvar emacsql-mysql-sentinel "--------------\n\n--------------\n\n" + "What MySQL will print when it has completed its output.") + +(defconst emacsql-mysql-reserved + (emacsql-register-reserved + '( ACCESSIBLE ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE + BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE CASE CHANGE CHAR + CHARACTER CHECK COLLATE COLUMN CONDITION CONSTRAINT CONTINUE + CONVERT CREATE CROSS CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP + CURRENT_USER CURSOR DATABASE DATABASES DAY_HOUR DAY_MICROSECOND + DAY_MINUTE DAY_SECOND DEC DECIMAL DECLARE DEFAULT DELAYED DELETE + DESC DESCRIBE DETERMINISTIC DISTINCT DISTINCTROW DIV DOUBLE DROP + DUAL EACH ELSE ELSEIF ENCLOSED ESCAPED EXISTS EXIT EXPLAIN FALSE + FETCH FLOAT FLOAT4 FLOAT8 FOR FORCE FOREIGN FROM FULLTEXT GENERAL + GRANT GROUP HAVING HIGH_PRIORITY HOUR_MICROSECOND HOUR_MINUTE + HOUR_SECOND IF IGNORE IGNORE_SERVER_IDS IN INDEX INFILE INNER + INOUT INSENSITIVE INSERT INT INT1 INT2 INT3 INT4 INT8 INTEGER + INTERVAL INTO IS ITERATE JOIN KEY KEYS KILL LEADING LEAVE LEFT + LIKE LIMIT LINEAR LINES LOAD LOCALTIME LOCALTIMESTAMP LOCK LONG + LONGBLOB LONGTEXT LOOP LOW_PRIORITY MASTER_HEARTBEAT_PERIOD + MASTER_SSL_VERIFY_SERVER_CERT MATCH MAXVALUE MAXVALUE MEDIUMBLOB + MEDIUMINT MEDIUMTEXT MIDDLEINT MINUTE_MICROSECOND MINUTE_SECOND + MOD MODIFIES NATURAL NOT NO_WRITE_TO_BINLOG NULL NUMERIC ON + OPTIMIZE OPTION OPTIONALLY OR ORDER OUT OUTER OUTFILE PRECISION + PRIMARY PROCEDURE PURGE RANGE READ READS READ_WRITE REAL + REFERENCES REGEXP RELEASE RENAME REPEAT REPLACE REQUIRE RESIGNAL + RESIGNAL RESTRICT RETURN REVOKE RIGHT RLIKE SCHEMA SCHEMAS + SECOND_MICROSECOND SELECT SENSITIVE SEPARATOR SET SHOW SIGNAL + SIGNAL SLOW SMALLINT SPATIAL SPECIFIC SQL SQL_BIG_RESULT + SQL_CALC_FOUND_ROWS SQLEXCEPTION SQL_SMALL_RESULT SQLSTATE + SQLWARNING SSL STARTING STRAIGHT_JOIN TABLE TERMINATED THEN + TINYBLOB TINYINT TINYTEXT TO TRAILING TRIGGER TRUE UNDO UNION + UNIQUE UNLOCK UNSIGNED UPDATE USAGE USE USING UTC_DATE UTC_TIME + UTC_TIMESTAMP VALUES VARBINARY VARCHAR VARCHARACTER VARYING WHEN + WHERE WHILE WITH WRITE XOR YEAR_MONTH ZEROFILL)) + "List of all of MySQL's reserved words. +http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html") + +(defclass emacsql-mysql-connection (emacsql-connection) + ((dbname :reader emacsql-psql-dbname :initarg :dbname) + (types :allocation :class + :reader emacsql-types + :initform '((integer "BIGINT") + (float "DOUBLE") + (object "LONGTEXT") + (nil "LONGTEXT")))) + "A connection to a MySQL database.") + +(cl-defun emacsql-mysql (database &key user password host port debug) + "Connect to a MySQL server using the mysql command line program." + (let* ((mysql (or (executable-find emacsql-mysql-executable) + (error "No mysql binary available, aborting"))) + (command (list database "--skip-pager" "-rfBNL" mysql))) + (when user (push (format "--user=%s" user) command)) + (when password (push (format "--password=%s" password) command)) + (when host (push (format "--host=%s" host) command)) + (when port (push (format "--port=%s" port) command)) + (let* ((process-connection-type t) + (buffer (generate-new-buffer " *emacsql-mysql*")) + (command (mapconcat #'shell-quote-argument (nreverse command) " ")) + (process (start-process-shell-command + "emacsql-mysql" buffer (concat "stty raw &&" command))) + (connection (make-instance 'emacsql-mysql-connection + :handle process + :dbname database))) + (set-process-sentinel process + (lambda (proc _) (kill-buffer (process-buffer proc)))) + (set-process-query-on-exit-flag (oref connection handle) nil) + (when debug (emacsql-enable-debugging connection)) + (emacsql connection + [:set-session (= sql-mode 'NO_BACKSLASH_ESCAPES\,ANSI_QUOTES)]) + (emacsql connection + [:set-transaction-isolation-level :serializable]) + (emacsql-register connection)))) + +(cl-defmethod emacsql-close ((connection emacsql-mysql-connection)) + (let ((process (oref connection handle))) + (when (process-live-p process) + (process-send-eof process)))) + +(cl-defmethod emacsql-send-message ((connection emacsql-mysql-connection) message) + (let ((process (oref connection handle))) + (process-send-string process message) + (process-send-string process "\\c\\p\n"))) + +(cl-defmethod emacsql-waiting-p ((connection emacsql-mysql-connection)) + (let ((length (length emacsql-mysql-sentinel))) + (with-current-buffer (emacsql-buffer connection) + (and (>= (buffer-size) length) + (progn (goto-char (- (point-max) length)) + (looking-at emacsql-mysql-sentinel)))))) + +(cl-defmethod emacsql-parse ((connection emacsql-mysql-connection)) + (with-current-buffer (emacsql-buffer connection) + (let ((standard-input (current-buffer))) + (goto-char (point-min)) + (when (looking-at "ERROR") + (search-forward ": ") + (signal 'emacsql-error + (list (buffer-substring (point) (line-end-position))))) + (cl-loop until (looking-at emacsql-mysql-sentinel) + collect (read) into row + when (looking-at "\n") + collect row into rows + and do (setq row ()) + and do (forward-char) + finally (cl-return rows))))) + +(provide 'emacsql-mysql) + +;;; emacsql-mysql.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql-mysql.elc b/.packages/emacsql-20251130.1841/emacsql-mysql.elc new file mode 100644 index 0000000..59f54cd Binary files /dev/null and b/.packages/emacsql-20251130.1841/emacsql-mysql.elc differ diff --git a/.packages/emacsql-20251130.1841/emacsql-pg.el b/.packages/emacsql-20251130.1841/emacsql-pg.el new file mode 100644 index 0000000..649423f --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-pg.el @@ -0,0 +1,80 @@ +;;; emacsql-pg.el --- EmacSQL back-end for PostgreSQL via pg -*- lexical-binding:t -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Christopher Wellons +;; Maintainer: Jonas Bernoulli + +;; SPDX-License-Identifier: Unlicense + +;;; Commentary: + +;; This library provides an EmacSQL back-end for PostgreSQL, which +;; uses the `pg' package to directly speak to the database. This +;; library requires at least Emacs 28.1. + +;; (For an alternative back-end for PostgreSQL, see `emacsql-psql'.) + +;;; Code: + +(require 'emacsql) + +(if (>= emacs-major-version 28) + (require 'pg nil t) + (message "emacsql-pg.el requires Emacs 28.1 or later")) +(declare-function pg-connect "ext:pg" + ( dbname user &optional + (password "") (host "localhost") (port 5432) (tls nil))) +(declare-function pg-disconnect "ext:pg" (con)) +(declare-function pg-exec "ext:pg" (connection &rest args)) +(declare-function pg-result "ext:pg" (result what &rest arg)) + +(defclass emacsql-pg-connection (emacsql-connection) + ((pgcon :reader emacsql-pg-pgcon :initarg :pgcon) + (dbname :reader emacsql-pg-dbname :initarg :dbname) + (result :accessor emacsql-pg-result) + (types :allocation :class + :reader emacsql-types + :initform '((integer "BIGINT") + (float "DOUBLE PRECISION") + (object "TEXT") + (nil "TEXT")))) + "A connection to a PostgreSQL database via pg.el.") + +(cl-defun emacsql-pg (dbname user &key + (host "localhost") (password "") (port 5432) debug) + "Connect to a PostgreSQL server using pg.el." + (require 'pg) + (let* ((pgcon (pg-connect dbname user password host port)) + (connection (make-instance 'emacsql-pg-connection + :handle (and (fboundp 'pgcon-process) + (pgcon-process pgcon)) + :pgcon pgcon + :dbname dbname))) + (when debug (emacsql-enable-debugging connection)) + (emacsql connection [:set (= default-transaction-isolation 'SERIALIZABLE)]) + (emacsql-register connection))) + +(cl-defmethod emacsql-close ((connection emacsql-pg-connection)) + (ignore-errors (pg-disconnect (emacsql-pg-pgcon connection)))) + +(cl-defmethod emacsql-send-message ((connection emacsql-pg-connection) message) + (condition-case error + (setf (emacsql-pg-result connection) + (pg-exec (emacsql-pg-pgcon connection) message)) + (error (signal 'emacsql-error error)))) + +(cl-defmethod emacsql-waiting-p ((_connection emacsql-pg-connection)) + ;; pg-exec will block + t) + +(cl-defmethod emacsql-parse ((connection emacsql-pg-connection)) + (let ((tuples (pg-result (emacsql-pg-result connection) :tuples))) + (cl-loop for tuple in tuples collect + (cl-loop for value in tuple + when (stringp value) collect (read value) + else collect value)))) + +(provide 'emacsql-pg) + +;;; emacsql-pg.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql-pg.elc b/.packages/emacsql-20251130.1841/emacsql-pg.elc new file mode 100644 index 0000000..bd6d6d1 Binary files /dev/null and b/.packages/emacsql-20251130.1841/emacsql-pg.elc differ diff --git a/.packages/emacsql-20251130.1841/emacsql-pkg.el b/.packages/emacsql-20251130.1841/emacsql-pkg.el new file mode 100644 index 0000000..505c346 --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-pkg.el @@ -0,0 +1,9 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "emacsql" "20251130.1841" + "High-level SQL database front-end." + '((emacs "26.1")) + :url "https://github.com/magit/emacsql" + :commit "f177a41e93b92a4b1139a553eed5415ca33f439c" + :revdesc "f177a41e93b9" + :authors '(("Christopher Wellons" . "wellons@nullprogram.com")) + :maintainers '(("Jonas Bernoulli" . "emacs.emacsql@jonas.bernoulli.dev"))) diff --git a/.packages/emacsql-20251130.1841/emacsql-psql.el b/.packages/emacsql-20251130.1841/emacsql-psql.el new file mode 100644 index 0000000..ee74035 --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-psql.el @@ -0,0 +1,145 @@ +;;; emacsql-psql.el --- EmacSQL back-end for PostgreSQL via psql -*- lexical-binding:t -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Christopher Wellons +;; Maintainer: Jonas Bernoulli + +;; SPDX-License-Identifier: Unlicense + +;;; Commentary: + +;; This library provides an EmacSQL back-end for PostgreSQL, which +;; uses the standard `psql' command line program. + +;; (For an alternative back-end for PostgreSQL, see `emacsql-pg'.) + +;;; Code: + +(require 'emacsql) + +(defvar emacsql-psql-executable "psql" + "Path to the psql (PostgreSQL client) executable.") + +(defun emacsql-psql-unavailable-p () + "Return a reason if the psql executable is not available. +:no-executable -- cannot find the executable +:cannot-execute -- cannot run the executable +:old-version -- sqlite3 version is too old" + (let ((psql emacsql-psql-executable)) + (if (null (executable-find psql)) + :no-executable + (condition-case _ + (with-temp-buffer + (call-process psql nil (current-buffer) nil "--version") + (let ((version (cl-third (split-string (buffer-string))))) + (if (version< version "1.0.0") + :old-version + nil))) + (error :cannot-execute))))) + +(defconst emacsql-psql-reserved + (emacsql-register-reserved + '( ALL ANALYSE ANALYZE AND ANY AS ASC AUTHORIZATION BETWEEN BINARY + BOTH CASE CAST CHECK COLLATE COLUMN CONSTRAINT CREATE CROSS + CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER DEFAULT + DEFERRABLE DESC DISTINCT DO ELSE END EXCEPT FALSE FOR FOREIGN + FREEZE FROM FULL GRANT GROUP HAVING ILIKE IN INITIALLY INNER + INTERSECT INTO IS ISNULL JOIN LEADING LEFT LIKE LIMIT LOCALTIME + LOCALTIMESTAMP NATURAL NEW NOT NOTNULL NULL OFF OFFSET OLD ON + ONLY OR ORDER OUTER OVERLAPS PLACING PRIMARY REFERENCES RIGHT + SELECT SESSION_USER SIMILAR SOME TABLE THEN TO TRAILING TRUE + UNION UNIQUE USER USING VERBOSE WHEN WHERE)) + "List of all of PostgreSQL's reserved words. +http://www.postgresql.org/docs/7.3/static/sql-keywords-appendix.html") + +(defclass emacsql-psql-connection (emacsql-connection) + ((dbname :reader emacsql-psql-dbname :initarg :dbname) + (types :allocation :class + :reader emacsql-types + :initform '((integer "BIGINT") + (float "DOUBLE PRECISION") + (object "TEXT") + (nil "TEXT")))) + "A connection to a PostgreSQL database via psql.") + +(cl-defun emacsql-psql (dbname &key username hostname port debug) + "Connect to a PostgreSQL server using the psql command line program." + (let ((args (list dbname))) + (when username + (push username args)) + (push "-n" args) + (when port + (push "-p" args) + (push port args)) + (when hostname + (push "-h" args) + (push hostname args)) + (setq args (nreverse args)) + (let* ((buffer (generate-new-buffer " *emacsql-psql*")) + (psql emacsql-psql-executable) + (command (mapconcat #'shell-quote-argument (cons psql args) " ")) + (process (start-process-shell-command + "emacsql-psql" buffer (concat "stty raw && " command))) + (connection (make-instance 'emacsql-psql-connection + :handle process + :dbname dbname))) + (setf (process-sentinel process) + (lambda (proc _) (kill-buffer (process-buffer proc)))) + (set-process-query-on-exit-flag (oref connection handle) nil) + (when debug (emacsql-enable-debugging connection)) + (mapc (apply-partially #'emacsql-send-message connection) + '("\\pset pager off" + "\\pset null nil" + "\\a" + "\\t" + "\\f ' '" + "SET client_min_messages TO ERROR;" + "\\set PROMPT1 ]" + "EMACSQL;")) ; error message flush + (emacsql-wait connection) + (emacsql connection + [:set (= default-transaction-isolation 'SERIALIZABLE)]) + (emacsql-register connection)))) + +(cl-defmethod emacsql-close ((connection emacsql-psql-connection)) + (let ((process (oref connection handle))) + (when (process-live-p process) + (process-send-string process "\\q\n")))) + +(cl-defmethod emacsql-send-message ((connection emacsql-psql-connection) message) + (let ((process (oref connection handle))) + (process-send-string process message) + (process-send-string process "\n"))) + +(cl-defmethod emacsql-waiting-p ((connection emacsql-psql-connection)) + (with-current-buffer (emacsql-buffer connection) + (cond ((= (buffer-size) 1) (string= "]" (buffer-string))) + ((> (buffer-size) 1) (string= "\n]" (buffer-substring + (- (point-max) 2) + (point-max))))))) + +(cl-defmethod emacsql-check-error ((connection emacsql-psql-connection)) + (with-current-buffer (emacsql-buffer connection) + (let ((case-fold-search t)) + (goto-char (point-min)) + (when (looking-at "error:") + (let* ((beg (line-beginning-position)) + (end (line-end-position))) + (signal 'emacsql-error (list (buffer-substring beg end)))))))) + +(cl-defmethod emacsql-parse ((connection emacsql-psql-connection)) + (emacsql-check-error connection) + (with-current-buffer (emacsql-buffer connection) + (let ((standard-input (current-buffer))) + (goto-char (point-min)) + (cl-loop until (looking-at "]") + collect (read) into row + when (looking-at "\n") + collect row into rows + and do (progn (forward-char 1) (setq row ())) + finally (cl-return rows))))) + +(provide 'emacsql-psql) + +;;; emacsql-psql.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql-psql.elc b/.packages/emacsql-20251130.1841/emacsql-psql.elc new file mode 100644 index 0000000..2fcb8eb Binary files /dev/null and b/.packages/emacsql-20251130.1841/emacsql-psql.elc differ diff --git a/.packages/emacsql-20251130.1841/emacsql-sqlite-builtin.el b/.packages/emacsql-20251130.1841/emacsql-sqlite-builtin.el new file mode 100644 index 0000000..2a7bf7f --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-sqlite-builtin.el @@ -0,0 +1,87 @@ +;;; emacsql-sqlite-builtin.el --- EmacSQL back-end for SQLite using builtin support -*- lexical-binding:t -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Jonas Bernoulli +;; Maintainer: Jonas Bernoulli + +;; SPDX-License-Identifier: Unlicense + +;;; Commentary: + +;; This library provides an EmacSQL back-end for SQLite, which uses +;; the built-in SQLite support in Emacs 29 an later. + +;;; Code: + +(require 'emacsql-sqlite) + +(declare-function sqlite-open "sqlite.c") +(declare-function sqlite-select "sqlite.c") +(declare-function sqlite-close "sqlite.c") + +(emacsql-register-reserved emacsql-sqlite-reserved) + +(defclass emacsql-sqlite-builtin-connection (emacsql--sqlite-base) () + "A connection to a SQLite database using builtin support.") + +(cl-defmethod initialize-instance :after + ((connection emacsql-sqlite-builtin-connection) &rest _) + (oset connection handle + (sqlite-open (oref connection file))) + (emacsql-sqlite-set-busy-timeout connection) + (emacsql connection [:pragma (= foreign-keys on)]) + (emacsql-register connection)) + +(cl-defun emacsql-sqlite-builtin (file &key debug) + "Open a connected to database stored in FILE. +If FILE is nil use an in-memory database. + +:debug LOG -- When non-nil, log all SQLite commands to a log +buffer. This is for debugging purposes." + (let ((connection (make-instance #'emacsql-sqlite-builtin-connection + :file file))) + (when debug + (emacsql-enable-debugging connection)) + connection)) + +(cl-defmethod emacsql-live-p ((connection emacsql-sqlite-builtin-connection)) + (and (oref connection handle) t)) + +(cl-defmethod emacsql-close ((connection emacsql-sqlite-builtin-connection)) + (when (oref connection handle) + (sqlite-close (oref connection handle)) + (oset connection handle nil))) + +(cl-defmethod emacsql-send-message + ((connection emacsql-sqlite-builtin-connection) message) + (condition-case err + (let ((headerp emacsql-include-header)) + (mapcar (lambda (row) + (cond + (headerp (setq headerp nil) row) + ((mapcan (lambda (col) + (cond ((null col) (list nil)) + ((equal col "") (list "")) + ((numberp col) (list col)) + ((emacsql-sqlite-read-column col)))) + row)))) + (sqlite-select (oref connection handle) message nil + (and emacsql-include-header 'full)))) + ((sqlite-error sqlite-locked-error) + (if (stringp (cdr err)) + (signal 'emacsql-error (list (cdr err))) + (pcase-let* ((`(,_ ,errstr ,errmsg ,errcode ,ext-errcode) err) + (`(,_ ,_ ,signal ,_) + (assq errcode emacsql-sqlite-error-codes))) + (signal (or signal 'emacsql-error) + (list errmsg errcode ext-errcode errstr))))) + (error + (signal 'emacsql-error (cdr err))))) + +(cl-defmethod emacsql ((connection emacsql-sqlite-builtin-connection) sql &rest args) + (emacsql-send-message connection (apply #'emacsql-compile connection sql args))) + +(provide 'emacsql-sqlite-builtin) + +;;; emacsql-sqlite-builtin.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql-sqlite-builtin.elc b/.packages/emacsql-20251130.1841/emacsql-sqlite-builtin.elc new file mode 100644 index 0000000..485a40b Binary files /dev/null and b/.packages/emacsql-20251130.1841/emacsql-sqlite-builtin.elc differ diff --git a/.packages/emacsql-20251130.1841/emacsql-sqlite-module.el b/.packages/emacsql-20251130.1841/emacsql-sqlite-module.el new file mode 100644 index 0000000..be91b6b --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-sqlite-module.el @@ -0,0 +1,97 @@ +;;; emacsql-sqlite-module.el --- EmacSQL back-end for SQLite using a module -*- lexical-binding:t -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Jonas Bernoulli +;; Maintainer: Jonas Bernoulli + +;; SPDX-License-Identifier: Unlicense + +;;; Commentary: + +;; This library provides an EmacSQL back-end for SQLite, which uses +;; the Emacs module provided by the `sqlite3' package. + +;;; Code: + +(require 'emacsql-sqlite) + +(require 'sqlite3 nil t) +;; Prevent check-declare from finding the defining file but then making +;; noise because it fails to find the definition because it is a module. +(declare-function sqlite3-open "ext:module:sqlite3-api") +(declare-function sqlite3-exec "ext:module:sqlite3-api") +(declare-function sqlite3-close "ext:module:sqlite3-api") +(defvar sqlite-open-readwrite) +(defvar sqlite-open-create) + +(emacsql-register-reserved emacsql-sqlite-reserved) + +(defclass emacsql-sqlite-module-connection (emacsql--sqlite-base) () + "A connection to a SQLite database using a module.") + +(cl-defmethod initialize-instance :after + ((connection emacsql-sqlite-module-connection) &rest _) + (require (quote sqlite3)) + (oset connection handle + (sqlite3-open (or (oref connection file) ":memory:") + sqlite-open-readwrite + sqlite-open-create)) + (emacsql-sqlite-set-busy-timeout connection) + (emacsql connection [:pragma (= foreign-keys on)]) + (emacsql-register connection)) + +(cl-defun emacsql-sqlite-module (file &key debug) + "Open a connected to database stored in FILE. +If FILE is nil use an in-memory database. + +:debug LOG -- When non-nil, log all SQLite commands to a log +buffer. This is for debugging purposes." + (let ((connection (make-instance #'emacsql-sqlite-module-connection + :file file))) + (when debug + (emacsql-enable-debugging connection)) + connection)) + +(cl-defmethod emacsql-live-p ((connection emacsql-sqlite-module-connection)) + (and (oref connection handle) t)) + +(cl-defmethod emacsql-close ((connection emacsql-sqlite-module-connection)) + (when (oref connection handle) + (sqlite3-close (oref connection handle)) + (oset connection handle nil))) + +(cl-defmethod emacsql-send-message + ((connection emacsql-sqlite-module-connection) message) + (condition-case err + (let ((include-header emacsql-include-header) + (rows ())) + (sqlite3-exec (oref connection handle) + message + (lambda (_ row header) + (when include-header + (push header rows) + (setq include-header nil)) + (push (mapcan (lambda (col) + (cond + ((null col) (list nil)) + ((equal col "") (list "")) + ((emacsql-sqlite-read-column col)))) + row) + rows))) + (nreverse rows)) + ((db-error sql-error) + (pcase-let* ((`(,_ ,errmsg ,errcode) err) + (`(,_ ,_ ,signal ,errstr) + (assq errcode emacsql-sqlite-error-codes))) + (signal (or signal 'emacsql-error) + (list errmsg errcode nil errstr)))) + (error + (signal 'emacsql-error (cdr err))))) + +(cl-defmethod emacsql ((connection emacsql-sqlite-module-connection) sql &rest args) + (emacsql-send-message connection (apply #'emacsql-compile connection sql args))) + +(provide 'emacsql-sqlite-module) + +;;; emacsql-sqlite-module.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql-sqlite-module.elc b/.packages/emacsql-20251130.1841/emacsql-sqlite-module.elc new file mode 100644 index 0000000..21b3859 Binary files /dev/null and b/.packages/emacsql-20251130.1841/emacsql-sqlite-module.elc differ diff --git a/.packages/emacsql-20251130.1841/emacsql-sqlite.el b/.packages/emacsql-20251130.1841/emacsql-sqlite.el new file mode 100644 index 0000000..3add7ae --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql-sqlite.el @@ -0,0 +1,296 @@ +;;; emacsql-sqlite.el --- Code used by both SQLite back-ends -*- lexical-binding:t -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Jonas Bernoulli +;; Maintainer: Jonas Bernoulli + +;; SPDX-License-Identifier: Unlicense + +;;; Commentary: + +;; This library contains code that is used by both SQLite back-ends. + +;;; Code: + +(require 'emacsql) + +;;; Base class + +(defclass emacsql--sqlite-base (emacsql-connection) + ((file :initarg :file + :initform nil + :type (or null string) + :documentation "Database file name.") + (types :allocation :class + :reader emacsql-types + :initform '((integer "INTEGER") + (float "REAL") + (object "TEXT") + (nil nil)))) + :abstract t) + +;;; Constants + +(defconst emacsql-sqlite-reserved + '( ABORT ACTION ADD AFTER ALL ALTER ANALYZE AND AS ASC ATTACH + AUTOINCREMENT BEFORE BEGIN BETWEEN BY CASCADE CASE CAST CHECK + COLLATE COLUMN COMMIT CONFLICT CONSTRAINT CREATE CROSS + CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP DATABASE DEFAULT + DEFERRABLE DEFERRED DELETE DESC DETACH DISTINCT DROP EACH ELSE END + ESCAPE EXCEPT EXCLUSIVE EXISTS EXPLAIN FAIL FOR FOREIGN FROM FULL + GLOB GROUP HAVING IF IGNORE IMMEDIATE IN INDEX INDEXED INITIALLY + INNER INSERT INSTEAD INTERSECT INTO IS ISNULL JOIN KEY LEFT LIKE + LIMIT MATCH NATURAL NO NOT NOTNULL NULL OF OFFSET ON OR ORDER + OUTER PLAN PRAGMA PRIMARY QUERY RAISE RECURSIVE REFERENCES REGEXP + REINDEX RELEASE RENAME REPLACE RESTRICT RIGHT ROLLBACK ROW + SAVEPOINT SELECT SET TABLE TEMP TEMPORARY THEN TO TRANSACTION + TRIGGER UNION UNIQUE UPDATE USING VACUUM VALUES VIEW VIRTUAL WHEN + WHERE WITH WITHOUT) + "List of all of SQLite's reserved words. +Also see http://www.sqlite.org/lang_keywords.html.") + +(defconst emacsql-sqlite-error-codes + '((1 SQLITE_ERROR emacsql-error "SQL logic error") + (2 SQLITE_INTERNAL emacsql-internal nil) + (3 SQLITE_PERM emacsql-access "access permission denied") + (4 SQLITE_ABORT emacsql-error "query aborted") + (5 SQLITE_BUSY emacsql-locked "database is locked") + (6 SQLITE_LOCKED emacsql-locked "database table is locked") + (7 SQLITE_NOMEM emacsql-memory "out of memory") + (8 SQLITE_READONLY emacsql-access "attempt to write a readonly database") + (9 SQLITE_INTERRUPT emacsql-error "interrupted") + (10 SQLITE_IOERR emacsql-access "disk I/O error") + (11 SQLITE_CORRUPT emacsql-corruption "database disk image is malformed") + (12 SQLITE_NOTFOUND emacsql-error "unknown operation") + (13 SQLITE_FULL emacsql-access "database or disk is full") + (14 SQLITE_CANTOPEN emacsql-access "unable to open database file") + (15 SQLITE_PROTOCOL emacsql-access "locking protocol") + (16 SQLITE_EMPTY emacsql-corruption nil) + (17 SQLITE_SCHEMA emacsql-error "database schema has changed") + (18 SQLITE_TOOBIG emacsql-error "string or blob too big") + (19 SQLITE_CONSTRAINT emacsql-constraint "constraint failed") + (20 SQLITE_MISMATCH emacsql-error "datatype mismatch") + (21 SQLITE_MISUSE emacsql-error "bad parameter or other API misuse") + (22 SQLITE_NOLFS emacsql-error "large file support is disabled") + (23 SQLITE_AUTH emacsql-access "authorization denied") + (24 SQLITE_FORMAT emacsql-corruption nil) + (25 SQLITE_RANGE emacsql-error "column index out of range") + (26 SQLITE_NOTADB emacsql-corruption "file is not a database") + (27 SQLITE_NOTICE emacsql-warning "notification message") + (28 SQLITE_WARNING emacsql-warning "warning message")) + "Alist mapping SQLite error codes to EmacSQL conditions. +Elements have the form (ERRCODE SYMBOLIC-NAME EMACSQL-ERROR +ERRSTR). Also see https://www.sqlite.org/rescode.html.") + +;;; Variables + +(defvar emacsql-include-header nil + "Whether to include names of columns as an additional row. +Never enable this globally, only let-bind it around calls to `emacsql'. +Currently only supported by `emacsql-sqlite-builtin-connection' and +`emacsql-sqlite-module-connection'.") + +(defvar emacsql-sqlite-busy-timeout 20 + "Seconds to wait when trying to access a table blocked by another process. +See https://www.sqlite.org/c3ref/busy_timeout.html.") + +;;; Utilities + +(defun emacsql-sqlite-connection (variable file &optional setup use-module) + "Return the connection stored in VARIABLE to the database in FILE. + +If the value of VARIABLE is a live database connection, return that. + +Otherwise open a new connection to the database in FILE and store the +connection in VARIABLE, before returning it. If FILE is nil, use an +in-memory database. Always enable support for foreign key constrains. +If optional SETUP is non-nil, it must be a function, which takes the +connection as only argument. This function can be used to initialize +tables, for example. + +If optional USE-MODULE is non-nil, then use the external module even +when Emacs was built with SQLite support. This is intended for testing +purposes." + (or (let ((connection (symbol-value variable))) + (and connection (emacsql-live-p connection) connection)) + (set variable (emacsql-sqlite-open file nil setup use-module)))) + +(defun emacsql-sqlite-open (file &optional debug setup use-module) + "Open a connection to the database stored in FILE using an SQLite back-end. + +Automatically use the best available back-end, as returned by +`emacsql-sqlite-default-connection'. + +If FILE is nil, use an in-memory database. If optional DEBUG is +non-nil, log all SQLite commands to a log buffer, for debugging +purposes. Always enable support for foreign key constrains. + +If optional SETUP is non-nil, it must be a function, which takes the +connection as only argument. This function can be used to initialize +tables, for example. + +If optional USE-MODULE is non-nil, then use the external module even +when Emacs was built with SQLite support. This is intended for testing +purposes." + (when file + (make-directory (file-name-directory file) t)) + (let* ((class (emacsql-sqlite-default-connection use-module)) + (connection (make-instance class :file file))) + (when debug + (emacsql-enable-debugging connection)) + (emacsql connection [:pragma (= foreign-keys on)]) + (when setup + (funcall setup connection)) + connection)) + +(defun emacsql-sqlite-default-connection (&optional use-module) + "Determine and return the best SQLite connection class. + +Signal an error if none of the connection classes can be used. + +If optional USE-MODULE is non-nil, then use the external module even +when Emacs was built with SQLite support. This is intended for testing +purposes." + (or (and (not use-module) + (fboundp 'sqlite-available-p) + (sqlite-available-p) + (require 'emacsql-sqlite-builtin) + 'emacsql-sqlite-builtin-connection) + (and (boundp 'module-file-suffix) + module-file-suffix + (condition-case nil + ;; Failure modes: + ;; 1. `libsqlite' shared library isn't available. + ;; 2. User chooses to not compile `libsqlite'. + ;; 3. `libsqlite' compilation fails. + (and (require 'sqlite3) + (require 'emacsql-sqlite-module) + 'emacsql-sqlite-module-connection) + (error + (display-warning 'emacsql "\ +Since your Emacs does not come with +built-in SQLite support [1], but does support C modules, we can +use an EmacSQL backend that relies on the third-party `sqlite3' +package [2]. + +Please install the `sqlite3' Elisp package using your preferred +Emacs package manager, and install the SQLite shared library +using your distribution's package manager. That package should +be named something like `libsqlite3' [3] and NOT just `sqlite3'. + +The legacy backend, which uses a custom SQLite executable, has +been remove, so we can no longer fall back to that. + +[1]: Supported since Emacs 29.1, provided it was not disabled + with `--without-sqlite3'. +[2]: https://github.com/pekingduck/emacs-sqlite3-api +[3]: On Debian https://packages.debian.org/buster/libsqlite3-0") + ;; The buffer displaying the warning might immediately + ;; be replaced by another buffer, before the user gets + ;; a chance to see it. We cannot have that. + (let (fn) + (setq fn (lambda () + (remove-hook 'post-command-hook fn) + (pop-to-buffer (get-buffer "*Warnings*")))) + (add-hook 'post-command-hook fn)) + nil))) + (error "EmacSQL could not find or compile a back-end"))) + +(defun emacsql-sqlite-set-busy-timeout (connection) + (when emacsql-sqlite-busy-timeout + (emacsql connection [:pragma (= busy-timeout $s1)] + (* emacsql-sqlite-busy-timeout 1000)))) + +(defun emacsql-sqlite-read-column (string) + (let ((value nil) + (beg 0) + (end (length string))) + (while (< beg end) + (let ((v (read-from-string string beg))) + (push (car v) value) + (setq beg (cdr v)))) + (nreverse value))) + +(defun emacsql-sqlite-list-tables (connection) + "Return a list of symbols identifying tables in CONNECTION. +Tables whose names begin with \"sqlite_\", are not included +in the returned value." + (mapcar #'car + (emacsql connection + [:select name + ;; The new name is `sqlite-schema', but this name + ;; is supported by old and new SQLite versions. + ;; See https://www.sqlite.org/schematab.html. + :from sqlite-master + :where (and (= type 'table) + (not-like name "sqlite_%")) + :order-by [(asc name)]]))) + +(defun emacsql-sqlite-dump-database (connection &optional versionp) + "Dump the database specified by CONNECTION to a file. + +The dump file is placed in the same directory as the database +file and its name derives from the name of the database file. +The suffix is replaced with \".sql\" and if optional VERSIONP is +non-nil, then the database version (the `user_version' pragma) +and a timestamp are appended to the file name. + +Dumping is done using the official `sqlite3' binary. If that is +not available and VERSIONP is non-nil, then the database file is +copied instead." + (let* ((version (caar (emacsql connection [:pragma user-version]))) + (db (oref connection file)) + (db (if (symbolp db) (symbol-value db) db)) + (name (file-name-nondirectory db)) + (output (concat (file-name-sans-extension db) + (and versionp + (concat (format "-v%s" version) + (format-time-string "-%Y%m%d-%H%M"))) + ".sql"))) + (cond + ((locate-file "sqlite3" exec-path) + (when (and (file-exists-p output) versionp) + (error "Cannot dump database; %s already exists" output)) + (with-temp-file output + (message "Dumping %s database to %s..." name output) + (unless (zerop (save-excursion + (call-process "sqlite3" nil t nil db ".dump"))) + (error "Failed to dump %s" db)) + (when version + (insert (format "PRAGMA user_version=%s;\n" version))) + ;; The output contains "PRAGMA foreign_keys=OFF;". + ;; Change that to avoid alarming attentive users. + (when (re-search-forward "^PRAGMA foreign_keys=\\(OFF\\);" 1000 t) + (replace-match "ON" t t nil 1)) + (message "Dumping %s database to %s...done" name output))) + (versionp + (setq output (concat (file-name-sans-extension output) ".db")) + (message "Cannot dump database because sqlite3 binary cannot be found") + (when (and (file-exists-p output) versionp) + (error "Cannot copy database; %s already exists" output)) + (message "Copying %s database to %s..." name output) + (copy-file db output) + (message "Copying %s database to %s...done" name output)) + ((error "Cannot dump database; sqlite3 binary isn't available"))))) + +(defun emacsql-sqlite-restore-database (db dump) + "Restore database DB from DUMP. + +DUMP is a file containing SQL statements. DB can be the file +in which the database is to be stored, or it can be a database +connection. In the latter case the current database is first +dumped to a new file and the connection is closed. Then the +database is restored from DUMP. No connection to the new +database is created." + (unless (stringp db) + (emacsql-sqlite-dump-database db t) + (emacsql-close (prog1 db (setq db (oref db file))))) + (with-temp-buffer + (unless (zerop (call-process "sqlite3" nil t nil db + (format ".read %s" dump))) + (error "Failed to read %s: %s" dump (buffer-string))))) + +(provide 'emacsql-sqlite) + +;;; emacsql-sqlite.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql-sqlite.elc b/.packages/emacsql-20251130.1841/emacsql-sqlite.elc new file mode 100644 index 0000000..6f51896 Binary files /dev/null and b/.packages/emacsql-20251130.1841/emacsql-sqlite.elc differ diff --git a/.packages/emacsql-20251130.1841/emacsql.el b/.packages/emacsql-20251130.1841/emacsql.el new file mode 100644 index 0000000..74c4213 --- /dev/null +++ b/.packages/emacsql-20251130.1841/emacsql.el @@ -0,0 +1,384 @@ +;;; emacsql.el --- High-level SQL database front-end -*- lexical-binding:t -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Christopher Wellons +;; Maintainer: Jonas Bernoulli +;; Homepage: https://github.com/magit/emacsql + +;; Package-Version: 20251130.1841 +;; Package-Revision: f177a41e93b9 +;; Package-Requires: ((emacs "26.1")) + +;; SPDX-License-Identifier: Unlicense + +;;; Commentary: + +;; EmacSQL is a high-level Emacs Lisp front-end for SQLite. + +;; PostgreSQL and MySQL are also supported, but use of these connectors +;; is not recommended. + +;; Any readable lisp value can be stored as a value in EmacSQL, +;; including numbers, strings, symbols, lists, vectors, and closures. +;; EmacSQL has no concept of TEXT values; it's all just lisp objects. +;; The lisp object `nil' corresponds 1:1 with NULL in the database. + +;; See README.md for much more complete documentation. + +;;; Code: + +(require 'cl-lib) +(require 'cl-generic) +(require 'eieio) + +(require 'emacsql-compiler) + +(defgroup emacsql nil + "The EmacSQL SQL database front-end." + :group 'comm) + +(defconst emacsql-version "4.3.3") + +(defvar emacsql-global-timeout 30 + "Maximum number of seconds to wait before bailing out on a SQL command. +If nil, wait forever. This is used by the `mysql', `pg' and `psql'. It +is not being used by the `sqlite-builtin' and `sqlite-module' back-ends, +which respect `emacsql-sqlite-busy-timeout' instead.") + +;;; Database connection + +(defclass emacsql-connection () + ((handle :initarg :handle + :documentation "Internal connection handler. +The value is a record-like object and should not be accessed +directly. Depending on the concrete implementation, `type-of' +may return `process', `user-ptr' or `sqlite' for this value.") + (log-buffer :type (or null buffer) + :initarg :log-buffer + :initform nil + :documentation "Output log (debug).") + (finalizer :documentation "Object returned from `make-finalizer'.") + (types :allocation :class + :initform nil + :reader emacsql-types + :documentation "Maps EmacSQL types to SQL types.")) + "A connection to a SQL database." + :abstract t) + +(cl-defgeneric emacsql-close (connection) + "Close CONNECTION and free all resources.") + +(cl-defgeneric emacsql-reconnect (connection) + "Re-establish CONNECTION with the same parameters.") + +(cl-defmethod emacsql-live-p ((connection emacsql-connection)) + "Return non-nil if CONNECTION is still alive and ready." + (and (process-live-p (oref connection handle)) t)) + +(cl-defgeneric emacsql-types (connection) + "Return an alist mapping EmacSQL types to database types. +This will mask `emacsql-type-map' during expression compilation. +This alist should have four key symbols: integer, float, object, +nil (default type). The values are strings to be inserted into +a SQL expression.") + +(cl-defmethod emacsql-buffer ((connection emacsql-connection)) + "Get process buffer for CONNECTION." + (process-buffer (oref connection handle))) + +(cl-defmethod emacsql-enable-debugging ((connection emacsql-connection)) + "Enable debugging on CONNECTION." + (unless (buffer-live-p (oref connection log-buffer)) + (oset connection log-buffer (generate-new-buffer " *emacsql-log*")))) + +(cl-defmethod emacsql-log ((connection emacsql-connection) message) + "Log MESSAGE into CONNECTION's log. +MESSAGE should not have a newline on the end." + (let ((buffer (oref connection log-buffer))) + (when buffer + (unless (buffer-live-p buffer) + (setq buffer (emacsql-enable-debugging connection))) + (with-current-buffer buffer + (goto-char (point-max)) + (princ (concat message "\n") buffer))))) + +;;; Sending and receiving + +(cl-defgeneric emacsql-send-message (connection message) + "Send MESSAGE to CONNECTION.") + +(cl-defmethod emacsql-send-message :before + ((connection emacsql-connection) message) + (emacsql-log connection message)) + +(cl-defmethod emacsql-clear ((connection emacsql-connection)) + "Clear the connection buffer for CONNECTION-SPEC." + (let ((buffer (emacsql-buffer connection))) + (when (and buffer (buffer-live-p buffer)) + (with-current-buffer buffer + (erase-buffer))))) + +(cl-defgeneric emacsql-waiting-p (connection) + "Return non-nil if CONNECTION is ready for more input.") + +(cl-defmethod emacsql-wait ((connection emacsql-connection) &optional timeout) + "Block until CONNECTION is waiting for further input." + (let* ((real-timeout (or timeout emacsql-global-timeout)) + (end (and real-timeout (+ (float-time) real-timeout)))) + (while (and (or (null real-timeout) (< (float-time) end)) + (not (emacsql-waiting-p connection))) + (save-match-data + (accept-process-output (oref connection handle) real-timeout))) + (unless (emacsql-waiting-p connection) + (signal 'emacsql-timeout (list "Query timed out" real-timeout))))) + +(cl-defgeneric emacsql-parse (connection) + "Return the results of parsing the latest output or signal an error.") + +(defun emacsql-compile (connection sql &rest args) + "Compile s-expression SQL for CONNECTION into a string." + (let ((emacsql-type-map (or (and connection (emacsql-types connection)) + emacsql-type-map))) + (concat (apply #'emacsql-format (emacsql-prepare sql) args) ";"))) + +(cl-defgeneric emacsql (connection sql &rest args) + "Send SQL s-expression to CONNECTION and return the results.") + +(cl-defmethod emacsql ((connection emacsql-connection) sql &rest args) + (let ((sql-string (apply #'emacsql-compile connection sql args))) + (emacsql-clear connection) + (emacsql-send-message connection sql-string) + (emacsql-wait connection) + (emacsql-parse connection))) + +;;; Helper mixin class + +(defclass emacsql-protocol-mixin () () + "A mixin for back-ends following the EmacSQL protocol. +The back-end prompt must be a single \"]\" character. This prompt +value was chosen because it is unreadable. Output must have +exactly one row per line, fields separated by whitespace. NULL +must display as \"nil\"." + :abstract t) + +(cl-defmethod emacsql-waiting-p ((connection emacsql-protocol-mixin)) + "Return t if the end of the buffer has a properly-formatted prompt. +Also return t if the connection buffer has been killed." + (let ((buffer (emacsql-buffer connection))) + (or (not (buffer-live-p buffer)) + (with-current-buffer buffer + (and (>= (buffer-size) 2) + (string= "#\n" + (buffer-substring (- (point-max) 2) (point-max)))))))) + +(cl-defmethod emacsql-handle ((_ emacsql-protocol-mixin) code message) + "Signal a specific condition for CODE from CONNECTION. +Subclasses should override this method in order to provide more +specific error conditions." + (signal 'emacsql-error (list message code))) + +(cl-defmethod emacsql-parse ((connection emacsql-protocol-mixin)) + "Parse well-formed output into an s-expression." + (with-current-buffer (emacsql-buffer connection) + (goto-char (point-min)) + (let* ((standard-input (current-buffer)) + (value (read))) + (if (eq value 'error) + (emacsql-handle connection (read) (read)) + (prog1 value + (unless (eq (read) 'success) + (emacsql-handle connection (read) (read)))))))) + +;;; Automatic connection cleanup + +(defun emacsql-register (connection) + "Register CONNECTION for automatic cleanup and return CONNECTION." + (prog1 connection + (oset connection finalizer + (make-finalizer (lambda () (emacsql-close connection)))))) + +;;; Useful macros + +(defmacro emacsql-with-connection (connection-spec &rest body) + "Open an EmacSQL connection, evaluate BODY, and close the connection. +CONNECTION-SPEC establishes a single binding. + + (emacsql-with-connection (db (emacsql-sqlite \"company.db\")) + (emacsql db [:create-table foo [x]]) + (emacsql db [:insert :into foo :values ([1] [2] [3])]) + (emacsql db [:select * :from foo]))" + (declare (indent 1)) + `(let ((,(car connection-spec) ,(cadr connection-spec))) + (unwind-protect + (progn ,@body) + (emacsql-close ,(car connection-spec))))) + +(defvar emacsql--transaction-level 0 + "Keeps track of nested transactions in `emacsql-with-transaction'.") + +(defmacro emacsql-with-transaction (connection &rest body) + "Evaluate BODY inside a single transaction, issuing a rollback on error. +This macro can be nested indefinitely, wrapping everything in a +single transaction at the lowest level. + +Warning: BODY should *not* have any side effects besides making +changes to the database behind CONNECTION. Body may be evaluated +multiple times before the changes are committed." + (declare (indent 1)) + `(let ((emacsql--connection ,connection) + (emacsql--completed nil) + (emacsql--transaction-level (1+ emacsql--transaction-level)) + (emacsql--result)) + (unwind-protect + (while (not emacsql--completed) + (condition-case nil + (progn + (when (= 1 emacsql--transaction-level) + (emacsql emacsql--connection [:begin])) + (let ((result (progn ,@body))) + (setq emacsql--result result) + (when (= 1 emacsql--transaction-level) + (emacsql emacsql--connection [:commit])) + (setq emacsql--completed t))) + (emacsql-locked (emacsql emacsql--connection [:rollback]) + (sleep-for 0.05)))) + (when (and (= 1 emacsql--transaction-level) + (not emacsql--completed)) + (emacsql emacsql--connection [:rollback]))) + emacsql--result)) + +(defmacro emacsql-thread (connection &rest statements) + "Thread CONNECTION through STATEMENTS. +A statement can be a list, containing a statement with its arguments." + (declare (indent 1)) + `(let ((emacsql--conn ,connection)) + (emacsql-with-transaction emacsql--conn + ,@(cl-loop for statement in statements + when (vectorp statement) + collect (list 'emacsql 'emacsql--conn statement) + else + collect (append (list 'emacsql 'emacsql--conn) statement))))) + +(defmacro emacsql-with-bind (connection sql-and-args &rest body) + "For each result row bind the column names for each returned row. +Returns the result of the last evaluated BODY. + +All column names must be provided in the query ($ and * are not +allowed). Hint: all of the bound identifiers must be known at +compile time. For example, in the expression below the variables +`name' and `phone' will be bound for the body. + + (emacsql-with-bind db [:select [name phone] :from people] + (message \"Found %s with %s\" name phone)) + + (emacsql-with-bind db ([:select [name phone] + :from people + :where (= name $1)] my-name) + (message \"Found %s with %s\" name phone)) + +Each column must be a plain symbol, no expressions allowed here." + (declare (indent 2)) + (let ((sql (if (vectorp sql-and-args) sql-and-args (car sql-and-args))) + (args (and (not (vectorp sql-and-args)) (cdr sql-and-args)))) + (cl-assert (eq :select (elt sql 0))) + (let ((vars (elt sql 1))) + (when (eq vars '*) + (error "Must explicitly list columns in `emacsql-with-bind'")) + (cl-assert (cl-every #'symbolp vars)) + `(let ((emacsql--results (emacsql ,connection ,sql ,@args)) + (emacsql--final nil)) + (dolist (emacsql--result emacsql--results emacsql--final) + (setq emacsql--final + (cl-destructuring-bind ,(cl-coerce vars 'list) emacsql--result + ,@body))))))) + +;;; User interaction functions + +(defvar emacsql-show-buffer-name "*emacsql-show*" + "Name of the buffer for displaying intermediate SQL.") + +(defun emacsql--indent () + "Indent and wrap the SQL expression in the current buffer." + (save-excursion + (goto-char (point-min)) + (let ((case-fold-search nil)) + (while (search-forward-regexp " [A-Z]+" nil :no-error) + (when (> (current-column) (* fill-column 0.8)) + (backward-word) + (insert "\n ")))))) + +(defun emacsql-show-sql (string) + "Fontify and display the SQL expression in STRING." + (let ((fontified + (with-temp-buffer + (insert string) + (sql-mode) + (with-no-warnings ;; autoloaded by previous line + (sql-highlight-sqlite-keywords)) + (font-lock-ensure) + (emacsql--indent) + (buffer-string)))) + (with-current-buffer (get-buffer-create emacsql-show-buffer-name) + (if (< (length string) fill-column) + (message "%s" fontified) + (let ((buffer-read-only nil)) + (erase-buffer) + (insert fontified)) + (special-mode) + (visual-line-mode) + (pop-to-buffer (current-buffer)))))) + +(defun emacsql-flatten-sql (sql) + "Convert a s-expression SQL into a flat string for display." + (cl-destructuring-bind (string . vars) (emacsql-prepare sql) + (concat + (apply #'format string (cl-loop for i in (mapcar #'car vars) + collect (intern (format "$%d" (1+ i))))) + ";"))) + +;;;###autoload +(defun emacsql-show-last-sql (&optional prefix) + "Display the compiled SQL of the s-expression SQL expression before point. +A prefix argument causes the SQL to be printed into the current buffer." + (interactive "P") + (let ((sexp (if (fboundp 'elisp--preceding-sexp) + (elisp--preceding-sexp) + (with-no-warnings + (preceding-sexp))))) + (if (emacsql-sql-p sexp) + (let ((sql (emacsql-flatten-sql sexp))) + (if prefix + (insert sql) + (emacsql-show-sql sql))) + (user-error "Invalid SQL: %S" sexp)))) + +;;; Fix Emacs' broken vector indentation + +(defun emacsql--inside-vector-p () + "Return non-nil if point is inside a vector expression." + (let ((start (point))) + (save-excursion + (beginning-of-defun) + (let ((containing-sexp (elt (parse-partial-sexp (point) start) 1))) + (and containing-sexp + (progn (goto-char containing-sexp) + (looking-at "\\["))))))) + +(defun emacsql--calculate-vector-indent (fn &optional parse-start) + "Don't indent vectors in `emacs-lisp-mode' like lists." + (if (save-excursion (beginning-of-line) (emacsql--inside-vector-p)) + (let ((lisp-indent-offset 1)) + (funcall fn parse-start)) + (funcall fn parse-start))) + +(defun emacsql-fix-vector-indentation () + "When called, advise `calculate-lisp-indent' to stop indenting vectors. +Once activated, vector contents no longer indent like lists." + (interactive) + (advice-add 'calculate-lisp-indent :around + #'emacsql--calculate-vector-indent)) + +(provide 'emacsql) + +;;; emacsql.el ends here diff --git a/.packages/emacsql-20251130.1841/emacsql.elc b/.packages/emacsql-20251130.1841/emacsql.elc new file mode 100644 index 0000000..a138dd5 Binary files /dev/null and b/.packages/emacsql-20251130.1841/emacsql.elc differ diff --git a/.packages/llama-20251101.2002/.dir-locals.el b/.packages/llama-20251101.2002/.dir-locals.el new file mode 100644 index 0000000..7c6424f --- /dev/null +++ b/.packages/llama-20251101.2002/.dir-locals.el @@ -0,0 +1,6 @@ +((nil + (indent-tabs-mode . nil)) + (makefile-mode + (indent-tabs-mode . t)) + (git-commit-mode + (git-commit-major-mode . git-commit-elisp-text-mode))) diff --git a/.packages/llama-20251101.2002/llama-autoloads.el b/.packages/llama-20251101.2002/llama-autoloads.el new file mode 100644 index 0000000..49443cc --- /dev/null +++ b/.packages/llama-20251101.2002/llama-autoloads.el @@ -0,0 +1,112 @@ +;;; llama-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 llama.el + +(autoload 'llama "llama" "\ +Expand to a `lambda' expression that wraps around FN and BODY. + +This macro provides a compact way to write short `lambda' expressions. +It expands to a `lambda' expression, which calls the function FN with +arguments BODY and returns its value. The arguments of the `lambda' +expression are derived from symbols found in BODY. + +Each symbol from `%1' through `%9', which appears in an unquoted part +of BODY, specifies a mandatory argument. Each symbol from `&1' through +`&9', which appears in an unquoted part of BODY, specifies an optional +argument. The symbol `&*' specifies extra (`&rest') arguments. + +The shorter symbol `%' can be used instead of `%1', but using both in +the same expression is not allowed. Likewise `&' can be used instead +of `&1'. These shorthands are not recognized in function position. + +To support binding forms that use a vector as VARLIST (such as `-let' +from the `dash' package), argument symbols are also detected inside of +vectors. + +The space between `##' and FN can be omitted because `##' is read-syntax +for the symbol whose name is the empty string. If you prefer you can +place a space there anyway, and if you prefer to not use this somewhat +magical symbol at all, you can instead use the alternative name `llama'. + +Instead of: + + (lambda (a &optional _ c &rest d) + (foo a (bar c) d)) + +you can use this macro and write: + + (##foo %1 (bar &3) &*) + +which expands to: + + (lambda (%1 &optional _&2 &3 &rest &*) + (foo %1 (bar &3) &*)) + +Unused trailing arguments and mandatory unused arguments at the border +between mandatory and optional arguments are also supported: + + (##list %1 _%3 &5 _&6) + +becomes: + + (lambda (%1 _%2 _%3 &optional _&4 &5 _&6) + (list %1 &5)) + +Note how `_%3' and `_&6' are removed from the body, because their names +begin with an underscore. Also note that `_&4' is optional, unlike the +explicitly specified `_%3'. + +Consider enabling `llama-fontify-mode' to highlight `##' and its +special arguments. + +(fn FN &rest BODY)" nil t) +(defvar llama-fontify-mode nil "\ +Non-nil if Llama-Fontify mode is enabled. +See the `llama-fontify-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 `llama-fontify-mode'.") +(custom-autoload 'llama-fontify-mode "llama" nil) +(autoload 'llama-fontify-mode "llama" "\ +In Emacs Lisp mode, highlight the `##' macro and its special arguments. + +This is a global minor mode. If called interactively, toggle the +`Llama-Fontify 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 \\='llama-fontify-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 "llama" '("##" "all-completions" "elisp-" "intern" "lisp--el-match-keyword@llama" "llama-")) + +;;; End of scraped data + +(provide 'llama-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; llama-autoloads.el ends here diff --git a/.packages/llama-20251101.2002/llama-pkg.el b/.packages/llama-20251101.2002/llama-pkg.el new file mode 100644 index 0000000..d00c7ee --- /dev/null +++ b/.packages/llama-20251101.2002/llama-pkg.el @@ -0,0 +1,9 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "llama" "20251101.2002" + "Compact syntax for short lambda." + '((emacs "26.1") + (compat "30.1")) + :url "https://github.com/tarsius/llama" + :commit "e4803de8ab85991b6a944430bb4f543ea338636d" + :revdesc "e4803de8ab85" + :keywords '("extensions")) diff --git a/.packages/llama-20251101.2002/llama.el b/.packages/llama-20251101.2002/llama.el new file mode 100644 index 0000000..8e0d177 --- /dev/null +++ b/.packages/llama-20251101.2002/llama.el @@ -0,0 +1,572 @@ +;;; llama.el --- Compact syntax for short lambda -*- lexical-binding:t -*- + +;; Copyright (C) 2020-2025 Jonas Bernoulli + +;; Authors: Jonas Bernoulli +;; Homepage: https://github.com/tarsius/llama +;; Keywords: extensions + +;; Package-Version: 20251101.2002 +;; Package-Revision: e4803de8ab85 +;; Package-Requires: ( +;; (emacs "26.1") +;; (compat "30.1")) + +;; SPDX-License-Identifier: GPL-3.0-or-later + +;; This file 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 file 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 file. If not, see . + +;;; Commentary: + +;; This package implements a macro named `##', which provides a compact way +;; to write short `lambda' expressions. + +;; The signature of the macro is (## FN &rest BODY) and it expands to a +;; `lambda' expression, which calls the function FN with the arguments BODY +;; and returns the value of that. The arguments of the `lambda' expression +;; are derived from symbols found in BODY. + +;; Each symbol from `%1' through `%9', which appears in an unquoted part +;; of BODY, specifies a mandatory argument. Each symbol from `&1' through +;; `&9', which appears in an unquoted part of BODY, specifies an optional +;; argument. The symbol `&*' specifies extra (`&rest') arguments. + +;; The shorter symbol `%' can be used instead of `%1', but using both in +;; the same expression is not allowed. Likewise `&' can be used instead +;; of `&1'. These shorthands are not recognized in function position. + +;; To support binding forms that use a vector as VARLIST (such as `-let' +;; from the `dash' package), argument symbols are also detected inside of +;; vectors. + +;; The space between `##' and FN can be omitted because `##' is read-syntax +;; for the symbol whose name is the empty string. If you prefer you can +;; place a space there anyway, and if you prefer to not use this somewhat +;; magical symbol at all, you can instead use the alternative name `llama'. + +;; Instead of: +;; +;; (lambda (a &optional _ c &rest d) +;; (foo a (bar c) d)) +;; +;; you can use this macro and write: +;; +;; (##foo %1 (bar &3) &*) +;; +;; which expands to: +;; +;; (lambda (%1 &optional _&2 &3 &rest &*) +;; (foo %1 (bar &3) &*)) + +;; Unused trailing arguments and mandatory unused arguments at the border +;; between mandatory and optional arguments are also supported: +;; +;; (##list %1 _%3 &5 _&6) +;; +;; becomes: +;; +;; (lambda (%1 _%2 _%3 &optional _&4 &5 _&6) +;; (list %1 &5)) +;; +;; Note how `_%3' and `_&6' are removed from the body, because their names +;; begin with an underscore. Also note that `_&4' is optional, unlike the +;; explicitly specified `_%3'. + +;; Consider enabling `llama-fontify-mode' to highlight `##' and its +;; special arguments. + +;;; Code: + +(require 'compat) + +;;;###autoload +(defmacro llama (fn &rest body) + "Expand to a `lambda' expression that wraps around FN and BODY. + +This macro provides a compact way to write short `lambda' expressions. +It expands to a `lambda' expression, which calls the function FN with +arguments BODY and returns its value. The arguments of the `lambda' +expression are derived from symbols found in BODY. + +Each symbol from `%1' through `%9', which appears in an unquoted part +of BODY, specifies a mandatory argument. Each symbol from `&1' through +`&9', which appears in an unquoted part of BODY, specifies an optional +argument. The symbol `&*' specifies extra (`&rest') arguments. + +The shorter symbol `%' can be used instead of `%1', but using both in +the same expression is not allowed. Likewise `&' can be used instead +of `&1'. These shorthands are not recognized in function position. + +To support binding forms that use a vector as VARLIST (such as `-let' +from the `dash' package), argument symbols are also detected inside of +vectors. + +The space between `##' and FN can be omitted because `##' is read-syntax +for the symbol whose name is the empty string. If you prefer you can +place a space there anyway, and if you prefer to not use this somewhat +magical symbol at all, you can instead use the alternative name `llama'. + +Instead of: + + (lambda (a &optional _ c &rest d) + (foo a (bar c) d)) + +you can use this macro and write: + + (##foo %1 (bar &3) &*) + +which expands to: + + (lambda (%1 &optional _&2 &3 &rest &*) + (foo %1 (bar &3) &*)) + +Unused trailing arguments and mandatory unused arguments at the border +between mandatory and optional arguments are also supported: + + (##list %1 _%3 &5 _&6) + +becomes: + + (lambda (%1 _%2 _%3 &optional _&4 &5 _&6) + (list %1 &5)) + +Note how `_%3' and `_&6' are removed from the body, because their names +begin with an underscore. Also note that `_&4' is optional, unlike the +explicitly specified `_%3'. + +Consider enabling `llama-fontify-mode' to highlight `##' and its +special arguments." + (cond ((symbolp fn)) + ((and (eq (car-safe fn) backquote-backquote-symbol) + (not body)) + (setq body (cdr fn)) + (setq fn backquote-backquote-symbol)) + ((signal 'wrong-type-argument + (list 'symbolp backquote-backquote-symbol fn)))) + (let* ((args (make-vector 10 nil)) + (body (cdr (llama--collect (cons fn body) args))) + (rest (aref args 0)) + (args (nreverse (cdr (append args nil)))) + (args (progn (while (and args (null (car args))) + (setq args (cdr args))) + args)) + (pos (length args)) + (opt nil) + (args (mapcar + (lambda (arg) + (if arg + (setq opt (string-match-p "\\`_?&" (symbol-name arg))) + (setq arg (intern (format "_%c%s" (if opt ?& ?%) pos)))) + (setq pos (1- pos)) + arg) + args)) + (opt nil) + (args (mapcar + (lambda (symbol) + (cond + ((string-match-p "\\`_?%" (symbol-name symbol)) + (when opt + (error "`%s' cannot follow optional arguments" symbol)) + (list symbol)) + (opt + (list symbol)) + ((setq opt t) + (list '&optional symbol)))) + (nreverse args)))) + `(lambda + (,@(apply #'nconc args) + ,@(and rest (list '&rest rest))) + (,fn ,@body)))) + +(defalias (intern "") 'llama) +(defalias '\#\# 'llama) + +(defconst llama--unused-argument (make-symbol "llama--unused-argument")) + +(defun llama--collect (expr args &optional fnpos backquoted unquote) + (cond + ((memq (car-safe expr) (list (intern "") 'llama 'quote)) expr) + ((and backquoted (symbolp expr)) expr) + ((and backquoted + (memq (car-safe expr) + (list backquote-unquote-symbol + backquote-splice-symbol))) + (list (car expr) + (llama--collect (cadr expr) args nil nil t))) + ((memq (car-safe expr) + (list backquote-backquote-symbol + backquote-splice-symbol)) + (list (car expr) + (llama--collect (cadr expr) args nil t))) + ((symbolp expr) + (let ((name (symbol-name expr))) + (save-match-data + (cond + ((string-match "\\`\\(_\\)?[%&]\\([1-9*]\\)?\\'" name) + (let* ((pos (match-string 2 name)) + (pos (cond ((equal pos "*") 0) + ((not pos) 1) + ((string-to-number pos)))) + (sym (aref args pos))) + (unless (and fnpos (not unquote) (memq expr '(% &))) + (when (and sym (not (equal expr sym))) + (error "`%s' and `%s' are mutually exclusive" sym expr)) + (aset args pos expr))) + (if (match-string 1 name) + llama--unused-argument + expr)) + (expr))))) + ((or (listp expr) + (vectorp expr)) + (let* ((vectorp (vectorp expr)) + (expr (if vectorp (append expr ()) expr)) + (fnpos (and (not vectorp) + (not backquoted) + (ignore-errors (length expr)))) ;proper-list-p + (ret ())) + (catch t + (while t + (let ((elt (llama--collect (car expr) args fnpos backquoted))) + (unless (eq elt llama--unused-argument) + (push elt ret))) + (setq fnpos nil) + (setq expr (cdr expr)) + (unless (and expr + (listp expr) + (not (eq (car expr) backquote-unquote-symbol))) + (throw t nil)))) + (setq ret (nreverse ret)) + (when expr + (setcdr (last ret) (llama--collect expr args nil backquoted))) + (if vectorp (vconcat ret) ret))) + (expr))) + +;;; Completion + +(define-advice elisp--expect-function-p (:around (fn pos) llama) + "Support function completion directly following `##'." + (or (and (eq (char-before pos) ?#) + (eq (char-before (- pos 1)) ?#)) + (and (eq (char-before pos) ?\s) + (eq (char-before (- pos 1)) ?#) + (eq (char-before (- pos 2)) ?#)) + (funcall fn pos))) + +(define-advice all-completions (:around (fn str table &rest rest) llama) + "Remove empty symbol from completion results if originating from `llama'. + +`##' is the notation for the symbol whose name is the empty string. + (intern \"\") => ## + (symbol-name \\='##) => \"\" + +The `llama' package uses `##' as the name of a macro, which allows +it to be used akin to syntax, without actually being new syntax. +\(`describe-function' won't let you select `##', but because that is an +alias for `llama', you can access the documentation under that name.) + +This advice prevents the empty string from being offered as a completion +candidate when `obarray' or a completion table that internally uses +that is used as TABLE." + (let ((result (apply fn str table rest))) + (if (and (eq obarray table) (equal str "")) + (delete "" result) + result))) + +;;; Fontification + +(defgroup llama () + "Compact syntax for short lambda." + :group 'extensions + :group 'faces + :group 'lisp) + +(defface llama-\#\#-macro '((t :inherit font-lock-function-call-face)) + "Face used for the name of the `##' macro.") + +(defface llama-llama-macro '((t :inherit font-lock-keyword-face)) + "Face used for the name of the `llama' macro.") + +(defface llama-mandatory-argument '((t :inherit font-lock-variable-use-face)) + "Face used for mandatory arguments `%1' through `%9' and `%'.") + +(defface llama-optional-argument '((t :inherit font-lock-type-face)) + "Face used for optional arguments `&1' through `&9', `&' and `&*'.") + +(defface llama-deleted-argument + `((((supports :box t)) + :box ( :line-width ,(if (>= emacs-major-version 28) (cons -1 -1) -1) + :color "red" + :style nil)) + (((supports :underline t)) + :underline "red") + (t + :inherit font-lock-warning-face)) + "Face used for deleted arguments `_%1'...`_%9', `_&1'...`_&9' and `_&*'. +This face is used in addition to one of llama's other argument faces. +Unlike implicit unused arguments (which do not appear in the function +body), these arguments are deleted from the function body during macro +expansion, and the looks of this face should hint at that.") + +(defconst llama-font-lock-keywords-28 + '(("(\\(##\\)" 1 'llama-\#\#-macro) + ("(\\(llama\\)\\_>" 1 'llama-llama-macro) + ("\\_<\\(?:_?%[1-9]?\\)\\_>" + 0 (llama--maybe-face 'llama-mandatory-argument)) + ("\\_<\\(?:_?&[1-9*]?\\)\\_>" + 0 (llama--maybe-face 'llama-optional-argument)) + ("\\_<\\(?:_\\(?:%[1-9]?\\|&[1-9*]?\\)\\)\\_>" + 0 'llama-deleted-argument prepend))) + +(defconst llama-font-lock-keywords-29 + `(("\\_<\\(&[1-9*]?\\)\\_>" 1 'default) + (,(apply-partially #'llama--match-and-fontify "(\\(##\\)") + 1 'llama-\#\#-macro) + (,(apply-partially #'llama--match-and-fontify "(\\(llama\\_>\\)") + 1 'llama-llama-macro))) + +(defvar llama-font-lock-keywords + (if (fboundp 'read-positioning-symbols) + llama-font-lock-keywords-29 + llama-font-lock-keywords-28)) + +(defun llama--maybe-face (face) + (and (not (and (member (match-string 0) '("%" "&")) + (and-let* ((beg (ignore-errors + (scan-lists (match-beginning 0) -1 1)))) + (string-match-p "\\`\\(##\\|llama\\_>\\)?[\s\t\n\r]*\\'" + (buffer-substring-no-properties + (1+ beg) (match-beginning 0)))))) + face)) + +(defun llama--match-and-fontify (re end) + (static-if (fboundp 'bare-symbol) + (and (re-search-forward re end t) + (prog1 t + (save-excursion + (goto-char (match-beginning 0)) + (when-let ((_(save-match-data (not (nth 8 (syntax-ppss))))) + (expr (ignore-errors + (read-positioning-symbols (current-buffer))))) + (put-text-property (match-beginning 0) (point) + 'font-lock-multiline t) + (llama--fontify (cdr expr) nil nil t))))) + (list re end))) ; Silence compiler. + +(defun llama--fontify (expr &optional fnpos backquoted top) + (static-if (fboundp 'bare-symbol) + (cond + ((null expr) expr) + ((eq (car-safe expr) 'quote)) + ((eq (ignore-errors (bare-symbol (car-safe expr))) 'quote)) + ((and (memq (ignore-errors (bare-symbol (car-safe expr))) + (list (intern "") 'llama)) + (not top))) + ((and backquoted (symbol-with-pos-p expr))) + ((and backquoted + (memq (car-safe expr) + (list backquote-unquote-symbol + backquote-splice-symbol))) + (llama--fontify expr)) + ((symbol-with-pos-p expr) + (save-match-data + (when-let* + ((name (symbol-name (bare-symbol expr))) + (face (cond + ((and (string-match + "\\_<\\(?:\\(_\\)?%\\([1-9]\\)?\\)\\_>" name) + (or (not fnpos) (match-end 2))) + 'llama-mandatory-argument) + ((and (string-match + "\\_<\\(?:\\(_\\)?&\\([1-9*]\\)?\\)\\_>" name) + (or (not fnpos) (match-end 2))) + 'llama-optional-argument)))) + (when (match-end 1) + (setq face (list 'llama-deleted-argument face))) + (let ((beg (symbol-with-pos-pos expr))) + (put-text-property + beg (save-excursion (goto-char beg) (forward-symbol 1)) + 'face face))))) + ((or (listp expr) + (vectorp expr)) + (let* ((vectorp (vectorp expr)) + (expr (if vectorp (append expr ()) expr)) + (fnpos (and (not vectorp) + (not backquoted) + (ignore-errors (length expr))))) + (catch t + (while t + (cond ((eq (car expr) backquote-backquote-symbol) + (setq expr (cdr expr)) + (llama--fontify (car expr) t t)) + ((llama--fontify (car expr) fnpos backquoted))) + (setq fnpos nil) + (setq expr (cdr expr)) + (unless (and expr + (listp expr) + (not (eq (car expr) backquote-unquote-symbol))) + (throw t nil)))) + (when expr + (llama--fontify expr fnpos)))))) + (list expr fnpos backquoted top)) ; Silence compiler. + +(defvar llama-fontify-mode-lighter nil) + +;;;###autoload +(define-minor-mode llama-fontify-mode + "In Emacs Lisp mode, highlight the `##' macro and its special arguments." + :lighter llama-fontify-mode-lighter + :global t + (cond + (llama-fontify-mode + (advice-add 'lisp--el-match-keyword :override + #'lisp--el-match-keyword@llama '((depth . -80))) + (advice-add 'elisp-mode-syntax-propertize :override + #'elisp-mode-syntax-propertize@llama) + (add-hook 'emacs-lisp-mode-hook #'llama--add-font-lock-keywords)) + (t + (advice-remove 'lisp--el-match-keyword + #'lisp--el-match-keyword@llama) + (advice-remove 'elisp-mode-syntax-propertize + #'elisp-mode-syntax-propertize@llama) + (remove-hook 'emacs-lisp-mode-hook #'llama--add-font-lock-keywords))) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (derived-mode-p 'emacs-lisp-mode) + (if llama-fontify-mode + (font-lock-add-keywords nil llama-font-lock-keywords) + (font-lock-remove-keywords nil llama-font-lock-keywords)) + (font-lock-flush))))) + +(defun llama--add-font-lock-keywords () + (font-lock-add-keywords nil llama-font-lock-keywords)) + +(defun lisp--el-match-keyword@llama (limit) + "Highlight symbols following \"(##\" the same as if they followed \"(\"." + (catch 'found + (while (re-search-forward + (concat "(\\(?:## ?\\)?\\(" + (static-if (get 'lisp-mode-symbol 'rx-definition) ;>= 29.1 + (rx lisp-mode-symbol) + lisp-mode-symbol-regexp) + "\\)\\_>") + limit t) + (let ((sym (intern-soft (match-string 1)))) + (when (and (or (special-form-p sym) + (macrop sym) + (and (bound-and-true-p morlock-mode) + ;; Same as in advice of `morlock' package. + (get sym 'morlock-font-lock-keyword))) + (not (get sym 'no-font-lock-keyword)) + (static-if (fboundp 'lisp--el-funcall-position-p) ;>= 28.1 + (lisp--el-funcall-position-p (match-beginning 0)) + (not (lisp--el-non-funcall-position-p + (match-beginning 0))))) + (throw 'found t)))))) + +(defun elisp-mode-syntax-propertize@llama (start end) + ;; Synced with Emacs up to 6b9510d94f814cacf43793dce76250b5f7e6f64a. + "Highlight `##' as the symbol which it is." + (goto-char start) + (let ((case-fold-search nil)) + (funcall + (syntax-propertize-rules + ;; Empty symbol. + ;; {{ Comment out to prevent the `##' from becoming part of + ;; the following symbol when there is no space in between. + ;; ("##" (0 (unless (nth 8 (syntax-ppss)) + ;; (string-to-syntax "_")))) + ;; }} + ;; {{ As for other symbols, use `font-lock-constant-face' in + ;; docstrings and comments. + ("##" (0 (when (nth 8 (syntax-ppss)) + (string-to-syntax "_")))) + ;; }} + ;; {{ Preserve this part, even though it is absent from + ;; this function in 29.1; backporting it by association. + ;; Prevent the @ from becoming part of a following symbol. + (",@" (0 (unless (nth 8 (syntax-ppss)) + (string-to-syntax "'")))) + ;; }} + ;; Unicode character names. (The longest name is 88 characters + ;; long.) + ("\\?\\\\N{[-A-Za-z0-9 ]\\{,100\\}}" + (0 (unless (nth 8 (syntax-ppss)) + (string-to-syntax "_")))) + ((rx "#" (or (seq (group-n 1 "&" (+ digit)) ?\") ; Bool-vector. + (seq (group-n 1 "s") "(") ; Record. + (seq (group-n 1 (+ "^")) "["))) ; Char-table. + (1 (unless (save-excursion (nth 8 (syntax-ppss (match-beginning 0)))) + (string-to-syntax "'"))))) + start end))) + +;;; Partial applications + +(defun llama--left-apply-partially (fn &rest args) + "Return a function that is a partial application of FN to ARGS. + +ARGS is a list of the first N arguments to pass to FN. The result +is a new function which does the same as FN, except that the first N +arguments are fixed at the values with which this function was called. + +See also `llama--right-apply-partially', which instead fixes the last +N arguments. + +These functions are intended to be used using the names `partial' and +`rpartial'. To be able to use these shorthands in a file, you must set +the file-local value of `read-symbols-shorthands', which was added in +Emacs 28.1. For an example see the end of file \"llama.el\". + +This is an alternative to `apply-partially', whose name is too long." + (declare (pure t) (side-effect-free error-free)) + (lambda (&rest args2) + (apply fn (append args args2)))) + +(defun llama--right-apply-partially (fn &rest args) + "Return a function that is a right partial application of FN to ARGS. + +ARGS is a list of the last N arguments to pass to FN. The result +is a new function which does the same as FN, except that the last N +arguments are fixed at the values with which this function was called. + +See also `llama--left-apply-partially', which instead fixes the first +N arguments. + +These functions are intended to be used using the names `rpartial' and +`partial'. To be able to use these shorthands in a file, you must set +the file-local value of `read-symbols-shorthands', which was added in +Emacs 28.1. For an example see the end of file \"llama.el\"." + (declare (pure t) (side-effect-free error-free)) + (lambda (&rest args2) + (apply fn (append args2 args)))) + +;; An example of how one would use these functions: +;; +;; (list (funcall (partial (lambda (a b) (list a b)) 'fixed) 'after) +;; (funcall (rpartial (lambda (a b) (list a b)) 'fixed) 'before)) + +;; An example of the configuration that is necessary to enable this: +;; +;; Local Variables: +;; indent-tabs-mode: nil +;; read-symbol-shorthands: ( +;; ("partial" . "llama--left-apply-partially") +;; ("rpartial" . "llama--right-apply-partially")) +;; End: +;; +;; Do not set `read-symbol-shorthands' in the ".dir-locals.el" +;; file, because that does not work for uncompiled libraries. + +(provide 'llama) + +;;; llama.el ends here diff --git a/.packages/llama-20251101.2002/llama.elc b/.packages/llama-20251101.2002/llama.elc new file mode 100644 index 0000000..5a65425 Binary files /dev/null and b/.packages/llama-20251101.2002/llama.elc differ diff --git a/.packages/magit-section-20251220.917/dir b/.packages/magit-section-20251220.917/dir new file mode 100644 index 0000000..6e44681 --- /dev/null +++ b/.packages/magit-section-20251220.917/dir @@ -0,0 +1,19 @@ +This is the file .../info/dir, which contains the +topmost node of the Info hierarchy, called (dir)Top. +The first time you invoke Info you start off looking at this node. + +File: dir, Node: Top This is the top of the INFO tree + + This (the Directory node) gives a menu of major topics. + Typing "q" exits, "H" lists all Info commands, "d" returns here, + "h" gives a primer for first-timers, + "mEmacs" visits the Emacs manual, etc. + + In Emacs, you can click mouse button 2 on a menu item or cross reference + to select it. + +* Menu: + +Emacs +* Magit-Section: (magit-section). + Use Magit sections in your own packages. diff --git a/.packages/magit-section-20251220.917/magit-section-autoloads.el b/.packages/magit-section-20251220.917/magit-section-autoloads.el new file mode 100644 index 0000000..aa1f445 --- /dev/null +++ b/.packages/magit-section-20251220.917/magit-section-autoloads.el @@ -0,0 +1,67 @@ +;;; magit-section-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 magit-section.el + +(autoload 'magit-add-section-hook "magit-section" "\ +Add to the value of section hook HOOK the function FUNCTION. + +Add FUNCTION at the beginning of the hook list unless optional +APPEND is non-nil, in which case FUNCTION is added at the end. +If FUNCTION already is a member, then move it to the new location. + +If optional AT is non-nil and a member of the hook list, then +add FUNCTION next to that instead. Add before or after AT, or +replace AT with FUNCTION depending on APPEND. If APPEND is the +symbol `replace', then replace AT with FUNCTION. For any other +non-nil value place FUNCTION right after AT. If nil, then place +FUNCTION right before AT. If FUNCTION already is a member of the +list but AT is not, then leave FUNCTION where ever it already is. + +If optional LOCAL is non-nil, then modify the hook's buffer-local +value rather than its global value. This makes the hook local by +copying the default value. That copy is then modified. + +HOOK should be a symbol. If HOOK is void, it is first set to nil. +HOOK's value must not be a single hook function. FUNCTION should +be a function that takes no arguments and inserts one or multiple +sections at point, moving point forward. FUNCTION may choose not +to insert its section(s), when doing so would not make sense. It +should not be abused for other side-effects. To remove FUNCTION +again use `remove-hook'. + +(fn HOOK FUNCTION &optional AT APPEND LOCAL)") +(autoload 'magit--handle-bookmark "magit-section" "\ +Open a bookmark created by `magit--make-bookmark'. + +Call the generic function `magit-bookmark-get-buffer-create' to get +the appropriate buffer without displaying it. + +Then call the `magit-*-setup-buffer' function of the the major-mode +with the variables' values as arguments, which were recorded by +`magit--make-bookmark'. + +(fn BOOKMARK)") +(register-definition-prefixes "magit-section" '("context-menu-region" "isearch-clean-overlays" "magit-")) + +;;; End of scraped data + +(provide 'magit-section-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; magit-section-autoloads.el ends here diff --git a/.packages/magit-section-20251220.917/magit-section-pkg.el b/.packages/magit-section-20251220.917/magit-section-pkg.el new file mode 100644 index 0000000..d23fa1f --- /dev/null +++ b/.packages/magit-section-20251220.917/magit-section-pkg.el @@ -0,0 +1,14 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "magit-section" "20251220.917" + "Sections for read-only buffers." + '((emacs "28.1") + (compat "30.1") + (cond-let "0.1") + (llama "1.0") + (seq "2.24")) + :url "https://github.com/magit/magit" + :commit "649b4c972151c0ee495876c0d4c8c13787614886" + :revdesc "649b4c972151" + :keywords '("tools") + :authors '(("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev")) + :maintainers '(("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev"))) diff --git a/.packages/magit-section-20251220.917/magit-section.el b/.packages/magit-section-20251220.917/magit-section.el new file mode 100644 index 0000000..48fae5f --- /dev/null +++ b/.packages/magit-section-20251220.917/magit-section.el @@ -0,0 +1,2685 @@ +;;; magit-section.el --- Sections for read-only buffers -*- lexical-binding:t; coding:utf-8 -*- + +;; Copyright (C) 2008-2025 The Magit Project Contributors + +;; Author: Jonas Bernoulli +;; Maintainer: Jonas Bernoulli + +;; Homepage: https://github.com/magit/magit +;; Keywords: tools + +;; Package-Version: 20251220.917 +;; Package-Revision: 649b4c972151 +;; Package-Requires: ( +;; (emacs "28.1") +;; (compat "30.1") +;; (cond-let "0.1") +;; (llama "1.0") +;; (seq "2.24")) + +;; SPDX-License-Identifier: GPL-3.0-or-later + +;; Magit 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. +;; +;; Magit 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 Magit. If not, see . + +;; You should have received a copy of the AUTHORS.md file, which +;; lists all contributors. If not, see https://magit.vc/authors. + +;;; Commentary: + +;; This package implements the main user interface of Magit — the +;; collapsible sections that make up its buffers. This package used +;; to be distributed as part of Magit but now it can also be used by +;; other packages that have nothing to do with Magit or Git. + +;;; Code: + +(require 'cl-lib) +(require 'compat) +(require 'cond-let) +(require 'eieio) +(require 'llama) ; For (##these ...) see M-x describe-function RET # # RET. +(require 'subr-x) + +;; For older Emacs releases we depend on an updated `seq' release from GNU +;; ELPA, for `seq-keep'. Unfortunately something else may require `seq' +;; before `package' had a chance to put this version on the `load-path'. +(when (and (featurep 'seq) + (not (fboundp 'seq-keep))) + (unload-feature 'seq 'force)) +(require 'seq) +;; Furthermore, by default `package' just silently refuses to upgrade. +(defconst magit--core-upgrade-instructions "\ +Magit requires `%s' >= %s, +but due to bad defaults, Emacs' package manager, refuses to +upgrade this and other built-in packages to higher releases +from GNU Elpa. + +To fix this, you have to add this to your init file: + + (setq package-install-upgrade-built-in t) + +Then evaluate that expression by placing the cursor after it +and typing \\[eval-last-sexp]. + +Once you have done that, you have to explicitly upgrade `%s': + + \\[package-install] %s \\`RET' + +Then you also must make sure the updated version is loaded, +by evaluating this form: + + (progn (unload-feature \\='%s t) (require \\='%s)) + +If this does not work, then try uninstalling Magit and all of its +dependencies. After that exit and restart Emacs, and only then +reinstalling Magit. + +If you don't use the `package' package manager but still get +this warning, then your chosen package manager likely has a +similar defect.") +(unless (fboundp 'seq-keep) + (display-warning 'magit (substitute-command-keys + (format magit--core-upgrade-instructions + 'seq "2.24" 'seq 'seq 'seq 'seq)) + :emergency)) + +(require 'cursor-sensor) +(require 'format-spec) + +(eval-when-compile (require 'benchmark)) + +;; For `magit-section-get-relative-position' +(declare-function magit-hunk-section-p "magit-diff" (section) t) + +(define-obsolete-variable-alias 'magit-keep-region-overlay + 'magit-section-keep-region-overlay "Magit-Section 4.0.0") + +(make-obsolete-variable 'magit-section-visibility-indicator + 'magit-section-visibility-indicators "Magit-Section 4.5.0") + +;;; Hooks + +(defvar magit-section-movement-hook nil + "Hook run by `magit-section-goto'. +That function in turn is used by all section movement commands. +See also info node `(magit)Section Movement'.") + +(defvar magit-section-set-visibility-hook + (list #'magit-section-cached-visibility) + "Hook used to set the initial visibility of a section. +Stop at the first function that returns non-nil. The returned +value should be `show', `hide' or nil. If no function returns +non-nil, determine the visibility as usual, i.e., use the +hardcoded section specific default (see `magit-insert-section').") + +;;; Options + +(defgroup magit-section nil + "Expandable sections." + :link '(info-link "(magit)Sections") + :group 'extensions) + +(defcustom magit-section-highlight-current t + "Whether to highlight the current section." + :package-version '(magit-section . "4.3.6") + :group 'magit-section + :type 'boolean) + +(defcustom magit-section-highlight-selection t + "Whether to highlight the selected sections. +If you disable this, you probably also want to disable +`magit-section-highlight-current' to get the region to +always look as it would be in non-magit buffers." + :package-version '(magit-section . "4.3.6") + :group 'magit-section + :type 'boolean) + +(defcustom magit-section-show-child-count t + "Whether to append the number of children to section headings. +This only applies to sections for which doing so makes sense." + :package-version '(magit-section . "2.1.0") + :group 'magit-section + :type 'boolean) + +(defcustom magit-section-cache-visibility t + "Whether to cache visibility of sections. + +Sections always retain their visibility state when they are being +recreated during a refresh. But if a section disappears and then +later reappears again, then this option controls whether this is +the case. + +If t, then cache the visibility of all sections. If a list of +section types, then only do so for matching sections. If nil, +then don't do so for any sections." + :package-version '(magit-section . "2.12.0") + :group 'magit-section + :type '(choice (const :tag "Don't cache visibility" nil) + (const :tag "Cache visibility of all sections" t) + (repeat :tag "Cache visibility for section types" symbol))) + +(defcustom magit-section-initial-visibility-alist + '((stashes . hide)) + "Alist controlling the initial visibility of sections. + +Each element maps a section type or lineage to the initial +visibility state for such sections. The state has to be one of +`show' or `hide', or a function that returns one of these symbols. +A function is called with the section as the only argument. + +Use the command `magit-describe-section' to determine a section's +lineage or type. The vector in the output is the section lineage +and the type is the first element of that vector. Wildcards can +be used, see `magit-section-match'. + +Currently this option is only used to override hardcoded defaults, +but in the future it will also be used set the defaults. + +An entry whose key is `magit-status-initial-section' specifies +the visibility of the section `magit-status-goto-initial-section' +jumps to. This does not only override defaults, but also other +entries of this alist." + :package-version '(magit-section . "2.12.0") + :group 'magit-section + :type '(alist :key-type (sexp :tag "Section type/lineage") + :value-type (choice (const hide) + (const show) + function))) + +(defcustom magit-section-visibility-indicators + `((magit-fringe-bitmap> . magit-fringe-bitmapv) + (,(if (char-displayable-p ?…) "…" "...") . t)) + "Whether and how to indicate that a section can be expanded/collapsed. + +If nil, then don't show any indicators. Otherwise the value has to +be a list with two elements. The first controls the indicators used +in graphical frames, the second the indicators in terminal frames. +For graphical frames all of the following forms are valid, while +terminal frames do not have fringes and thus do not support the first +form. + +\(EXPANDABLE-BITMAP . COLLAPSIBLE-BITMAP) + + Both values have to be variables whose values are fringe + bitmaps. In this case every section that can be expanded or + collapsed gets an indicator in the left fringe. + + To provide extra padding around the indicator, set + `left-fringe-width' in `magit-mode-hook'. + +\(EXPANDABLE-CHAR . COLLAPSIBLE-CHAR) + + In this case every section that can be expanded or collapsed + gets an indicator in the left margin. + +\(STRING . BOOLEAN) + + In this case STRING (usually an ellipsis) is shown at the end + of the heading of every collapsed section. Expanded sections + get no indicator. The cdr controls whether the appearance of + these ellipsis take section highlighting into account. Doing + so might potentially have an impact on performance, while not + doing so is kinda ugly." + :package-version '(magit-section . "3.0.0") + :group 'magit-section + :type '(choice + (const :tag "No indicators" nil) + (list (choice :tag "In graphical frames" + (cons :tag "Use +- fringe indicators" + :format "%{%t%}%v\n" + (const :format " " magit-fringe-bitmap+) + (const :format " " magit-fringe-bitmap-)) + (cons :tag "Use >v fringe indicators" + :format "%{%t%}%v\n" + (const :format " " magit-fringe-bitmap>) + (const :format " " magit-fringe-bitmapv)) + (cons :tag "Use bold >v fringe indicators" + :format "%{%t%}%v\n" + (const :format " " magit-fringe-bitmap-bold>) + (const :format " " magit-fringe-bitmap-boldv)) + (cons :tag "Use custom fringe indicators" + (variable :tag "Expandable bitmap variable") + (variable :tag "Collapsible bitmap variable")) + (cons :tag "Use margin indicators" + (character :tag "Expandable char" ?+) + (character :tag "Collapsible char" ?-)) + (cons :tag "Use ellipses at end of headings" + (string :tag "Ellipsis" "…") + (choice :tag "Use face kludge" + (const :tag "Yes (potentially slow)" t) + (const :tag "No (kinda ugly)" nil)))) + (choice :tag "In terminal frames" + (cons :tag "Use margin indicators" + (character :tag "Expandable char" ?+) + (character :tag "Collapsible char" ?-)) + (cons :tag "Use ellipses at end of headings" + (string :tag "Ellipsis" "…") + (choice :tag "Use face kludge" + (const :tag "Yes (potentially slow)" t) + (const :tag "No (kinda ugly)" nil))))))) + +(defcustom magit-section-keep-region-overlay nil + "Whether to keep the region overlay when there is a valid selection. + +We strongly suggest that you keep the default value, nil. + +By default Magit removes the regular region overlay if, and only +if, that region constitutes a valid selection as understood by +Magit commands. Otherwise it does not remove that overlay, and +the region looks like it would in other buffers. + +There are two types of such valid selections: hunk-internal +regions and regions that select two or more sibling sections. +In such cases Magit removes the region overlay and instead +highlights a slightly larger range. All text (for hunk-internal +regions) or the headings of all sections (for sibling selections) +that are inside that range (not just inside the region) are acted +on by commands such as the staging command. This buffer range +begins at the beginning of the line on which the region begins +and ends at the end of the line on which the region ends. + +Because Magit acts on this larger range and not the region, it is +actually quite important to visualize that larger range. If we +don't do that, then one might think that these commands act on +the region instead. If you want to *also* visualize the region, +then set this option to t. But please note that when the region +does *not* constitute a valid selection, then the region is +*always* visualized as usual, and that it is usually under such +circumstances that you want to use a non-magit command to act on +the region. + +Depending on the used theme, the `magit-*-highlight-selection' +faces might conflict with the `region' face. If that happens and +it bothers you, then you have to customize these faces to address +the conflicts." + :package-version '(magit-section . "2.3.0") + :group 'magit-section + :type 'boolean) + +(defcustom magit-section-disable-line-numbers t + "In Magit buffers, whether to disable modes that display line numbers. + +Some users who turn on `global-display-line-numbers-mode' (or +`global-nlinum-mode' or `global-linum-mode') expect line numbers +to be displayed everywhere except in Magit buffers. Other users +do not expect Magit buffers to be treated differently. At least +in theory users in the first group should not use the global mode, +but that ship has sailed, thus this option." + :package-version '(magit-section . "3.0.0") + :group 'magit-section + :type 'boolean) + +;;; Variables + +(defvar-local magit-section-preserve-visibility t) + +(defvar-local magit-section-pre-command-region-p nil) +(defvar-local magit-section-pre-command-section nil) + +(defvar-local magit-section-highlight-force-update nil) +(defvar-local magit-section-highlight-overlays nil) +(defvar-local magit-section-selection-overlays nil) +(defvar-local magit-section-highlighted-sections nil + "List of highlighted sections that may have to be repainted on focus change.") +(defvar-local magit-section-focused-sections nil) + +(defvar-local magit-section-inhibit-markers nil) +(defvar-local magit-section-insert-in-reverse nil) + +(defvar-local magit--refreshing-buffer-p nil + "Whether the current buffer is presently being refreshed.") + +;;; Faces + +(defgroup magit-section-faces nil + "Faces used by Magit-Section." + :group 'magit-section + :group 'faces) + +(defface magit-section-highlight + '((((class color) (background light)) + :extend t + :background "grey95") + (((class color) (background dark)) + :extend t + :background "grey20")) + "Face for highlighting the current section." + :group 'magit-section-faces) + +(defface magit-section-heading + '((((class color) (background light)) + :extend t + :foreground "DarkGoldenrod4" + :weight bold) + (((class color) (background dark)) + :extend t + :foreground "LightGoldenrod2" + :weight bold)) + "Face for section headings." + :group 'magit-section-faces) + +(defface magit-section-secondary-heading + '((t :extend t :weight bold)) + "Face for section headings of some secondary headings." + :group 'magit-section-faces) + +(defface magit-section-heading-selection + '((((class color) (background light)) + :extend t + :foreground "salmon4") + (((class color) (background dark)) + :extend t + :foreground "LightSalmon3")) + "Face for selected section headings." + :group 'magit-section-faces) + +(defface magit-section-child-count '((t nil)) + "Face used for child counts at the end of some section headings." + :group 'magit-section-faces) + +(defface magit-left-margin '((t :inherit default)) + "Face used for the left margin. + +Currently this is only used for section visibility indicators, and only +when `magit-section-visibility-indicators' is configured to show them in +the margin. + +Due to limitations of how the margin works in Emacs, this is only used +for those parts of the margin that actually display an indicator. For +that reason you should probably avoid setting the background color. + +Reasonable values include ((t)), which causes the indicator to inherit +the look of the heading (including section highlighting, if any), and +\((t :inherit default), which prevents that and causes the margin to +look like regular un-styled text in the buffer. Building on that, you +can make it look different, e.g., ((t :inherit default :weight bold)." + :group 'magit-section-faces) + +;;; Classes + +(defvar magit--current-section-hook nil + "Internal variable used for `magit-describe-section'.") + +(defvar magit--section-type-alist nil) + +(defclass magit-section () + ((type :initform nil :initarg :type) + (keymap :initform nil) + (value :initform nil) + (start :initform nil) + (content :initform nil) + (end :initform nil) + (hidden) + (painted) + (washer :initform nil :initarg :washer) + (inserter :initform (symbol-value 'magit--current-section-hook)) + (selective-highlight :initform nil :initarg :selective-highlight) + (heading-highlight-face :initform nil :initarg :heading-highlight-face) + (heading-selection-face :initform nil :initarg :heading-selection-face) + (parent :initform nil) + (children :initform nil))) + +;;; Mode + +(defvar symbol-overlay-inhibit-map) + +(defvar-keymap magit-section-heading-map + :doc "Keymap used in the heading line of all expandable sections. +This keymap is used in addition to the section-specific keymap, if any." + "" #'ignore + "" #'magit-mouse-toggle-section + "" #'magit-mouse-toggle-section + " " #'magit-mouse-toggle-section) + +(defvar-keymap magit-section-mode-map + :doc "Parent keymap for keymaps of modes derived from `magit-section-mode'." + :full t + :suppress t + " " #'magit-mouse-toggle-section + " " #'magit-mouse-toggle-section + "TAB" #'magit-section-toggle + "C-c TAB" #'magit-section-cycle + "C-" #'magit-section-cycle + "M-" #'magit-section-cycle + ;; is the most portable binding for Shift+Tab. + "" #'magit-section-cycle-global + "^" #'magit-section-up + "p" #'magit-section-backward + "n" #'magit-section-forward + "M-p" #'magit-section-backward-sibling + "M-n" #'magit-section-forward-sibling + "1" #'magit-section-show-level-1 + "2" #'magit-section-show-level-2 + "3" #'magit-section-show-level-3 + "4" #'magit-section-show-level-4 + "M-1" #'magit-section-show-level-1-all + "M-2" #'magit-section-show-level-2-all + "M-3" #'magit-section-show-level-3-all + "M-4" #'magit-section-show-level-4-all) + +(define-derived-mode magit-section-mode special-mode "Magit-Sections" + "Parent major mode from which major modes with Magit-like sections inherit. + +Magit-Section is documented in info node `(magit-section)'." + :interactive nil + :group 'magit-section + (buffer-disable-undo) + (setq truncate-lines t) + (setq buffer-read-only t) + (setq-local line-move-visual t) ; See #1771. + ;; Turn off syntactic font locking. See #5420. + (setq-local font-lock-defaults '(nil t)) + (setq show-trailing-whitespace nil) + (setq-local symbol-overlay-inhibit-map t) + (setq list-buffers-directory (abbreviate-file-name default-directory)) + (make-local-variable 'text-property-default-nonsticky) + (push (cons 'keymap t) text-property-default-nonsticky) + (add-hook 'pre-command-hook #'magit-section-pre-command-hook nil t) + (add-hook 'post-command-hook #'magit-section-post-command-hook t t) + (add-hook 'deactivate-mark-hook #'magit-section-deactivate-mark t t) + (setq-local redisplay-highlight-region-function + #'magit-section--highlight-region) + (setq-local redisplay-unhighlight-region-function + #'magit-section--unhighlight-region) + (add-function :filter-return (local 'filter-buffer-substring-function) + #'magit-section--remove-text-properties) + (when (fboundp 'magit-section-context-menu) + (add-hook 'context-menu-functions #'magit-section-context-menu 10 t)) + (when magit-section-disable-line-numbers + (when (and (fboundp 'linum-mode) + (bound-and-true-p global-linum-mode)) + (linum-mode -1)) + (when (and (fboundp 'nlinum-mode) + (bound-and-true-p global-nlinum-mode)) + (nlinum-mode -1)) + (when (and (fboundp 'display-line-numbers-mode) + (bound-and-true-p global-display-line-numbers-mode)) + (display-line-numbers-mode -1))) + (when (fboundp 'magit-preserve-section-visibility-cache) + (add-hook 'kill-buffer-hook #'magit-preserve-section-visibility-cache))) + +(defun magit-section--remove-text-properties (string) + "Remove all text-properties from STRING. +Most importantly `magit-section'." + (set-text-properties 0 (length string) nil string) + string) + +;;; Core + +(defvar-local magit-root-section nil + "The root section in the current buffer. +All other sections are descendants of this section. The value +of this variable is set by `magit-insert-section' and you should +never modify it.") +(put 'magit-root-section 'permanent-local t) + +(defvar-local magit--context-menu-section nil "For internal use only.") + +(defvar magit--context-menu-buffer nil "For internal use only.") + +(defun magit-point () + "Return point or the position where the context menu was invoked. +When using the context menu, return the position the user clicked +on, provided the current buffer is the buffer in which the click +occurred. Otherwise return the same value as `point'." + (if magit--context-menu-section + (magit-menu-position) + (point))) + +(defun magit-thing-at-point (thing &optional no-properties) + "Return the THING at point or where the context menu was invoked. +When using the context menu, return the thing the user clicked +on, provided the current buffer is the buffer in which the click +occurred. Otherwise return the same value as `thing-at-point'. +For the meaning of THING and NO-PROPERTIES see that function." + (if-let ((pos (magit-menu-position))) + (save-excursion + (goto-char pos) + (thing-at-point thing no-properties)) + (thing-at-point thing no-properties))) + +(defun magit-current-section () + "Return the section at point or where the context menu was invoked. +When using the context menu, return the section that the user +clicked on, provided the current buffer is the buffer in which +the click occurred. Otherwise return the section at point." + (or magit--context-menu-section + (magit-section-at) + magit-root-section)) + +(defun magit-section-at (&optional position) + "Return the section at POSITION, defaulting to point." + (get-text-property (or position (point)) 'magit-section)) + +(defun magit-section-ident (section) + "Return an unique identifier for SECTION. +The return value has the form ((TYPE . VALUE)...)." + (cons (cons (oref section type) + (magit-section-ident-value section)) + (and$ (oref section parent) + (magit-section-ident $)))) + +(defun magit-section-equal (a b) + "Return t if A an B are the same section." + (and a b (equal (magit-section-ident a) + (magit-section-ident b)))) + +(cl-defgeneric magit-section-ident-value (object) + "Return OBJECT's value, making it constant and unique if necessary. + +This is used to correlate different incarnations of the same +section, see `magit-section-ident' and `magit-get-section'. + +Sections whose values are not constant and/or unique should +implement a method that return a value that can be used for +thispurpose.") + +(cl-defmethod magit-section-ident-value ((section magit-section)) + "Return the value unless it is an object. + +Different object incarnations representing the same value tend to +not be equal, so call this generic function on the object itself +to determine a constant value." + (let ((value (oref section value))) + (if (eieio-object-p value) + (magit-section-ident-value value) + value))) + +(cl-defmethod magit-section-ident-value ((object eieio-default-superclass)) + "For values that are objects, simply return the object itself. +Two objects that represent the same entity are not `equal'. So if +the values of the objects of a certain section class are themselves +objects, then a method has to be defined for objects of one of the +involved classes." + object) + +(defun magit-get-section (ident &optional root) + "Return the section identified by IDENT. +IDENT has to be a list as returned by `magit-section-ident'. +If optional ROOT is non-nil, then search in that section tree +instead of in the one whose root `magit-root-section' is." + (setq ident (reverse ident)) + (let ((section (or root magit-root-section))) + (when (eq (car (pop ident)) + (oref section type)) + (while (and ident + (pcase-let ((`(,type . ,value) (car ident))) + (setq section + (cl-find-if + (##and (eq (oref % type) type) + (equal (magit-section-ident-value %) value)) + (oref section children))))) + (pop ident)) + section))) + +(defun magit-section-lineage (section &optional raw) + "Return the lineage of SECTION. +If optional RAW is non-nil, return a list of section objects, beginning +with SECTION, otherwise return a list of section types." + (cons (if raw section (oref section type)) + (and$ (oref section parent) + (magit-section-lineage $ raw)))) + +(defvar-local magit-insert-section--current nil "For internal use only.") +(defvar-local magit-insert-section--parent nil "For internal use only.") +(defvar-local magit-insert-section--oldroot nil "For internal use only.") + +;;; Menu + +(defvar magit-menu-common-value nil "See function `magit-menu-common-value'.") +(defvar magit-menu--desc-values nil "For internal use only.") + +(defun magit-section-context-menu (menu click) + "Populate MENU with Magit-Section commands at CLICK." + (when-let ((section (save-excursion + (unless (region-active-p) + (mouse-set-point click)) + (magit-section-at)))) + (unless (region-active-p) + (setq magit--context-menu-buffer (current-buffer)) + (if-let ((alt (save-excursion + (mouse-set-point click) + (run-hook-with-args-until-success + 'magit-menu-alternative-section-hook section)))) + (setq magit--context-menu-section (setq section alt)) + (setq magit--context-menu-section section) + (magit-section-update-highlight t))) + (when (magit-section-content-p section) + (keymap-set-after menu "" + `(menu-item + ,(if (oref section hidden) "Expand section" "Collapse section") + magit-section-toggle)) + (when-let* ((_(not (oref section hidden))) + (children (oref section children)) + (_(seq-some #'magit-section-content-p children))) + (when (seq-some (##oref % hidden) children) + (keymap-set-after menu "" + `(menu-item "Expand children" + magit-section-show-children))) + (when (seq-some (##not (oref % hidden)) children) + (keymap-set-after menu "" + `(menu-item "Collapse children" + magit-section-hide-children)))) + (keymap-set-after menu "" menu-bar-separator)) + (keymap-set-after menu "" + `(menu-item "Describe section" magit-describe-section)) + (when-let ((map (oref section keymap))) + (keymap-set-after menu "" menu-bar-separator) + (when (symbolp map) + (setq map (symbol-value map))) + (setq magit-menu-common-value (magit-menu-common-value section)) + (setq magit-menu--desc-values (magit-menu--desc-values section)) + (map-keymap (lambda (key binding) + (when (consp binding) + (define-key-after menu (vector key) + (copy-sequence binding)))) + (menu-bar-keymap map)))) + menu) + +(defun magit-menu-item (desc def &optional props) + "Return a menu item named DESC binding DEF and using PROPS. + +If DESC contains a supported %-spec, substitute the +expression (magit-menu-format-desc DESC) for that. +See `magit-menu-format-desc'." + `(menu-item + ,(if (and (stringp desc) (string-match-p "%[tTvsmMx]" desc)) + (list 'magit-menu-format-desc desc) + desc) + ,def + ;; Without this, the keys for point would be shown instead + ;; of the relevant ones from where the click occurred. + :keys ,(##magit--menu-position-keys def) + ,@props)) + +(defun magit--menu-position-keys (def) + (or (ignore-errors + (save-excursion + (goto-char (magit-menu-position)) + (and-let ((key (cl-find-if-not + (lambda (key) + (string-match-p "\\`<[0-9]+>\\'" + (key-description key))) + (where-is-internal def)))) + (key-description key)))) + "")) + +(defun magit-menu-position () + "Return the position where the context-menu was invoked. +If the current command wasn't invoked using the context-menu, +then return nil." + (and magit--context-menu-section + (ignore-errors + (posn-point (event-start (aref (this-command-keys-vector) 0)))))) + +(defun magit-menu-highlight-point-section () + (setq magit-section-highlight-force-update t) + (cond-let + ((eq (current-buffer) magit--context-menu-buffer) + (setq magit--context-menu-section nil)) + ([window (get-buffer-window magit--context-menu-buffer)] + (with-selected-window window + (setq magit--context-menu-section nil) + (magit-section-update-highlight))) + ((with-current-buffer magit--context-menu-buffer + (setq magit--context-menu-section nil)))) + (setq magit--context-menu-buffer nil)) + +(defvar magit--plural-append-es '(branch)) + +(cl-defgeneric magit-menu-common-value (_section) + "Return some value to be used by multiple menu items. +This function is called by `magit-section-context-menu', which +stores the value in `magit-menu-common-value'. Individual menu +items can use it, e.g., in the expression used to set their +description." + nil) + +(defun magit-menu--desc-values (section) + (let ((type (oref section type)) + (value (oref section value)) + (multiple (magit-region-sections nil t))) + (list type + value + (format "%s %s" type value) + (and multiple (length multiple)) + (if (memq type magit--plural-append-es) "es" "s")))) + +(defun magit-menu-format-desc (format) + "Format a string based on FORMAT and menu section or selection. +The following %-specs are allowed: +%t means \"TYPE\". +%T means \"TYPE\", or \"TYPEs\" if multiple sections are selected. +%v means \"VALUE\". +%s means \"TYPE VALUE\". +%m means \"TYPE VALUE\", or \"COUNT TYPEs\" if multiple sections + are selected. +%M means \"VALUE\", or \"COUNT TYPEs\" if multiple sections are + selected. +%x means the value of `magit-menu-common-value'." + (pcase-let* ((`(,type ,value ,single ,count ,suffix) magit-menu--desc-values) + (multiple (and count (format "%s %s%s" count type suffix)))) + (format-spec format + `((?t . ,type) + (?T . ,(format "%s%s" type (if count suffix ""))) + (?v . ,value) + (?s . ,single) + (?m . ,(or multiple single)) + (?M . ,(or multiple value)) + (?x . ,(format "%s" magit-menu-common-value)))))) + +(define-advice context-menu-region (:around (fn menu click) magit-section-mode) + "Disable in `magit-section-mode' buffers." + (if (derived-mode-p 'magit-section-mode) + menu + (funcall fn menu click))) + +;;; Commands +;;;; Movement + +(defun magit-section-forward () + "Move to the beginning of the next visible section." + (interactive) + (if (eobp) + (user-error "No next section") + (let ((section (magit-current-section))) + (if (oref section parent) + (let ((next (and (not (oref section hidden)) + (not (= (oref section end) + (1+ (point)))) + (car (oref section children))))) + (while (and section (not next)) + (unless (setq next (car (magit-section-siblings section 'next))) + (setq section (oref section parent)))) + (if next + (magit-section-goto next) + (user-error "No next section"))) + (magit-section-goto 1))))) + +(defun magit-section-backward () + "Move to the beginning of the current or the previous visible section. +When point is at the beginning of a section then move to the +beginning of the previous visible section. Otherwise move to +the beginning of the current section." + (interactive) + (if (bobp) + (user-error "No previous section") + (let ((section (magit-current-section)) children) + (cond + ((and (= (point) + (1- (oref section end))) + (setq children (oref section children))) + (magit-section-goto (car (last children)))) + ((and (oref section parent) + (not (= (point) + (oref section start)))) + (magit-section-goto section)) + (t + (let ((prev (car (magit-section-siblings section 'prev)))) + (if prev + (while (and (not (oref prev hidden)) + (setq children (oref prev children))) + (setq prev (car (last children)))) + (setq prev (oref section parent))) + (cond (prev + (magit-section-goto prev)) + ((oref section parent) + (user-error "No previous section")) + ;; Eob special cases. + ((not (get-text-property (1- (point)) 'invisible)) + (magit-section-goto -1)) + (t + (goto-char (previous-single-property-change + (1- (point)) 'invisible)) + (forward-line -1) + (magit-section-goto (magit-current-section)))))))))) + +(defun magit-section-up () + "Move to the beginning of the parent section." + (interactive) + (if-let ((parent (oref (magit-current-section) parent))) + (magit-section-goto parent) + (user-error "No parent section"))) + +(defun magit-section-forward-sibling () + "Move to the beginning of the next sibling section. +If there is no next sibling section, then move to the parent." + (interactive) + (cond-let + [[current (magit-current-section)]] + ((not (oref current parent)) + (magit-section-goto 1)) + ([next (car (magit-section-siblings current 'next))] + (magit-section-goto next)) + ((magit-section-forward)))) + +(defun magit-section-backward-sibling () + "Move to the beginning of the previous sibling section. +If there is no previous sibling section, then move to the parent." + (interactive) + (cond-let + [[current (magit-current-section)]] + ((not (oref current parent)) + (magit-section-goto -1)) + ([previous (car (magit-section-siblings current 'prev))] + (magit-section-goto previous)) + ((magit-section-backward)))) + +(defun magit-mouse-set-point (event &optional promote-to-region) + "Like `mouse-set-point' but also call `magit-section-movement-hook'." + (interactive "e\np") + (mouse-set-point event promote-to-region) + (run-hook-with-args 'magit-section-movement-hook (magit-current-section))) + +(defun magit-section-goto (arg) + "Run `magit-section-movement-hook'. +See info node `(magit)Section Movement'." + (if (integerp arg) + (progn (forward-line arg) + (setq arg (magit-current-section))) + (goto-char (oref arg start))) + (run-hook-with-args 'magit-section-movement-hook arg)) + +(defun magit-section-set-window-start (section) + "Ensure the beginning of SECTION is visible." + (unless (pos-visible-in-window-p (oref section end)) + (set-window-start (selected-window) (oref section start)))) + +(defmacro magit-define-section-jumper + (name heading type &optional value inserter &rest properties) + "Define an interactive function to go to some section. +Together TYPE and VALUE identify the section. +HEADING is the displayed heading of the section." + (declare (indent defun)) + `(transient-define-suffix ,name (&optional expand) + ,(format "Jump to the section \"%s\". +With a prefix argument also expand it." heading) + ,@properties + ,@(and (not (plist-member properties :description)) + (list :description heading)) + ,@(and inserter + `(:if (##memq ',inserter + (symbol-value + (intern (format "%s-sections-hook" + (substring (symbol-name major-mode) + 0 -5))))))) + :inapt-if-not (##magit-get-section + (cons (cons ',type ,value) + (magit-section-ident magit-root-section))) + (interactive "P") + (cond-let + ([section (magit-get-section + (cons (cons ',type ,value) + (magit-section-ident magit-root-section)))] + (goto-char (oref section start)) + (when expand + (with-local-quit (magit-section-show section)) + (recenter 0))) + ((message ,(format "Section \"%s\" wasn't found" heading)))))) + +;;;; Visibility + +(defun magit-section-show (section) + "Show the body of the current section." + (interactive (list (magit-current-section))) + (oset section hidden nil) + (magit-section--opportunistic-wash section) + (magit-section--opportunistic-paint section) + (when-let ((beg (oref section content))) + (remove-overlays beg (oref section end) 'invisible t)) + (magit-section-maybe-update-visibility-indicator section) + (magit-section-maybe-cache-visibility section) + (dolist (child (oref section children)) + (if (oref child hidden) + (magit-section-hide child) + (magit-section-show child)))) + +(defun magit-section-hide (section) + "Hide the body of the current section." + (interactive (list (magit-current-section))) + (if (eq section magit-root-section) + (user-error "Cannot hide root section") + (oset section hidden t) + (when-let ((beg (oref section content))) + (let ((end (oref section end))) + (when (< beg (point) end) + (goto-char (oref section start))) + (remove-overlays beg end 'invisible t) + (let ((o (make-overlay beg end))) + (overlay-put o 'evaporate t) + (overlay-put o 'invisible t) + (overlay-put o 'cursor-intangible t)))) + (magit-section-maybe-update-visibility-indicator section) + (magit-section-maybe-cache-visibility section))) + +(defun magit-section-toggle (section) + "Toggle visibility of the body of the current section." + (interactive (list (magit-current-section))) + (cond ((eq section magit-root-section) + (user-error "Cannot hide root section")) + ((oref section hidden) + (magit-section-show section)) + ((magit-section-hide section)))) + +(defun magit-section-toggle-children (section) + "Toggle visibility of bodies of children of the current section." + (interactive (list (magit-current-section))) + (let* ((children (oref section children)) + (show (seq-some (##oref % hidden) children))) + (dolist (c children) + (oset c hidden show))) + (magit-section-show section)) + +(defun magit-section-show-children (section &optional depth) + "Recursively show the bodies of children of the current section. +With a prefix argument show children that deep and hide deeper +children." + (interactive (list (magit-current-section))) + (magit-section-show-children-1 section depth) + (magit-section-show section)) + +(defun magit-section-show-children-1 (section &optional depth) + (dolist (child (oref section children)) + (oset child hidden nil) + (if depth + (if (> depth 0) + (magit-section-show-children-1 child (1- depth)) + (magit-section-hide child)) + (magit-section-show-children-1 child)))) + +(defun magit-section-hide-children (section) + "Recursively hide the bodies of children of the current section." + (interactive (list (magit-current-section))) + (mapc #'magit-section-hide (oref section children))) + +(defun magit-section-show-headings (section) + "Recursively show headings of children of the current section. +Only show the headings, previously shown text-only bodies are +hidden." + (interactive (list (magit-current-section))) + (magit-section-show-headings-1 section) + (magit-section-show section)) + +(defun magit-section-show-headings-1 (section) + (dolist (child (oref section children)) + (oset child hidden nil) + (when (or (oref child children) + (not (oref child content))) + (magit-section-show-headings-1 child)))) + +(defun magit-section-cycle (section) + "Cycle visibility of current section and its children. + +If this command is invoked using \\`C-' and that is globally bound +to `tab-next', then this command pivots to behave like that command, and +you must instead use \\`C-c TAB' to cycle section visibility. + +If you would like to keep using \\`C-' to cycle section visibility +but also want to use `tab-bar-mode', then you have to prevent that mode +from using this key and instead bind another key to `tab-next'. Because +`tab-bar-mode' does not use a mode map but instead manipulates the +global map, this involves advising `tab-bar--define-keys'." + (interactive (list (magit-current-section))) + (cond-let + ((and (equal (this-command-keys) [C-tab]) + (eq (global-key-binding [C-tab]) 'tab-next) + (fboundp 'tab-bar-switch-to-next-tab)) + (tab-bar-switch-to-next-tab current-prefix-arg)) + ((eq section magit-root-section) + (magit-section-cycle-global)) + ((oref section hidden) + (magit-section-show section) + (magit-section-hide-children section)) + [[children (oref section children)]] + ((and (seq-some (##oref % hidden) children) + (seq-some (##oref % children) children)) + (magit-section-show-headings section)) + ((seq-some #'magit-section-hidden-body children) + (magit-section-show-children section)) + ((magit-section-hide section)))) + +(defun magit-section-cycle-global () + "Cycle visibility of all sections in the current buffer." + (interactive) + (cond-let + [[children (oref magit-root-section children)]] + ((and (seq-some (##oref % hidden) children) + (seq-some (##oref % children) children)) + (magit-section-show-headings magit-root-section)) + ((seq-some #'magit-section-hidden-body children) + (magit-section-show-children magit-root-section)) + ((mapc #'magit-section-hide children)))) + +(defun magit-section-hidden (section) + "Return t if the content of SECTION or of any ancestor is hidden. +Ignore whether the body of any of SECTION's descendants is hidden. +When the status of descendants is irrelevant but that of ancestors +matters, instead use `magit-section-hidden-body'." + (or (oref section hidden) + (and$ (oref section parent) + (magit-section-hidden $)))) + +(defun magit-section-hidden-body (section &optional pred) + "Return t if the content of SECTION or of any descendant is hidden. +Ignore whether the body of any of SECTION's ancestors is hidden; +if you need that use `magit-section-hidden'." + (if-let ((children (oref section children))) + (funcall (or pred #'seq-some) #'magit-section-hidden-body children) + (and (oref section content) + (oref section hidden)))) + +(defalias 'magit-section-invisible-p #'magit-section-hidden) + +(defun magit-section-content-p (section) + "Return non-nil if SECTION has content or an unused washer function." + (with-slots (content end washer) section + (and content (or (not (= content end)) washer)))) + +(defun magit-section-show-level (level) + "Show surrounding sections up to LEVEL. +Likewise hide sections at higher levels. If the region selects multiple +sibling sections, act on all marked trees. If LEVEL is negative, show +all sections up to the absolute value of that, not just surrounding +sections." + (if (< level 0) + (let ((s (magit-current-section))) + (setq level (- level)) + (while (> (1- (length (magit-section-ident s))) level) + (setq s (oref s parent)) + (goto-char (oref s start))) + (magit-section-show-children magit-root-section (1- level))) + (dolist (section (or (magit-region-sections) + (list (magit-current-section)))) + (cl-do* ((s section + (oref s parent)) + (i (1- (length (magit-section-ident s))) + (cl-decf i))) + ((cond ((< i level) (magit-section-show-children s (- level i 1)) t) + ((= i level) (magit-section-hide s) t)) + (magit-section-goto s)))))) + +(defun magit-section-show-level-1 () + "Show surrounding sections on first level." + (interactive) + (magit-section-show-level 1)) + +(defun magit-section-show-level-1-all () + "Show all sections on first level." + (interactive) + (magit-section-show-level -1)) + +(defun magit-section-show-level-2 () + "Show surrounding sections up to second level." + (interactive) + (magit-section-show-level 2)) + +(defun magit-section-show-level-2-all () + "Show all sections up to second level." + (interactive) + (magit-section-show-level -2)) + +(defun magit-section-show-level-3 () + "Show surrounding sections up to third level." + (interactive) + (magit-section-show-level 3)) + +(defun magit-section-show-level-3-all () + "Show all sections up to third level." + (interactive) + (magit-section-show-level -3)) + +(defun magit-section-show-level-4 () + "Show surrounding sections up to fourth level." + (interactive) + (magit-section-show-level 4)) + +(defun magit-section-show-level-4-all () + "Show all sections up to fourth level." + (interactive) + (magit-section-show-level -4)) + +(defun magit-mouse-toggle-section (event) + "Toggle visibility of the clicked section. +Clicks outside either the section heading or the left fringe are +silently ignored." + (interactive "e") + (let* ((pos (event-start event)) + (section (magit-section-at (posn-point pos)))) + (if (eq (posn-area pos) 'left-fringe) + (when section + (while (not (magit-section-content-p section)) + (setq section (oref section parent))) + (unless (eq section magit-root-section) + (goto-char (oref section start)) + (magit-section-toggle section))) + (magit-section-toggle section)))) + +;;;; Auxiliary + +(defun magit-describe-section-briefly (&optional section ident interactive) + "Show information about SECTION or the section at point. +With a prefix argument show the section identity instead of the +section lineage. This command is intended for debugging purposes. +Non-interactively, just return the information. Interactively, +or when INTERACTIVE is non-nil, show the section in the echo area." + (interactive (list (magit-current-section) current-prefix-arg t)) + (unless section + (setq section (magit-current-section))) + (let ((str (format "#<%s %S %S %s-%s%s>" + (eieio-object-class section) + (let ((val (oref section value))) + (cond ((stringp val) + (substring-no-properties val)) + ((and (eieio-object-p val) + (fboundp 'cl-prin1-to-string)) + (cl-prin1-to-string val)) + (val))) + (if ident + (magit-section-ident section) + (apply #'vector (magit-section-lineage section))) + (and$ (oref section start) + (if (markerp $) (marker-position $) $)) + (if-let ((m (oref section content))) + (format "[%s-]" + (if (markerp m) (marker-position m) m)) + "") + (and$ (oref section end) + (if (markerp $) (marker-position $) $))))) + (when interactive + (message "%s" str)) + str)) + +(cl-defmethod cl-print-object ((section magit-section) stream) + "Print `magit-describe-section' result of SECTION." + (princ (magit-describe-section-briefly section) stream)) + +(defun magit-describe-section (section &optional interactive-p) + "Show information about the section at point." + (interactive (list (magit-current-section) t)) + (let ((inserter-section section)) + (while (and inserter-section (not (oref inserter-section inserter))) + (setq inserter-section (oref inserter-section parent))) + (when (and inserter-section (oref inserter-section inserter)) + (setq section inserter-section))) + (pcase (oref section inserter) + (`((,hook ,fun) . ,src-src) + (help-setup-xref `(magit-describe-section ,section) interactive-p) + (with-help-window (help-buffer) + (with-current-buffer standard-output + (insert (format-message + "%s\n is inserted by `%s'\n from `%s'" + (magit-describe-section-briefly section) + (make-text-button (symbol-name fun) nil + :type 'help-function + 'help-args (list fun)) + (make-text-button (symbol-name hook) nil + :type 'help-variable + 'help-args (list hook)))) + (pcase-dolist (`(,hook ,fun) src-src) + (insert (format-message + ",\n called by `%s'\n from `%s'" + (make-text-button (symbol-name fun) nil + :type 'help-function + 'help-args (list fun)) + (make-text-button (symbol-name hook) nil + :type 'help-variable + 'help-args (list hook))))) + (insert ".\n\n") + (insert + (format-message + "`%s' is " + (make-text-button (symbol-name fun) nil + :type 'help-function 'help-args (list fun)))) + (describe-function-1 fun)))) + (_ (message "%s, inserter unknown" + (magit-describe-section-briefly section))))) + +;;; Match + +(cl-defun magit-section-match + (condition &optional (section (magit-current-section))) + "Return t if SECTION matches CONDITION. + +SECTION defaults to the section at point. If SECTION is not +specified and there also is no section at point, then return +nil. + +CONDITION can take the following forms: + (CONDITION...) matches if any of the CONDITIONs matches. + [CLASS...] matches if the section's class is the same + as the first CLASS or a subclass of that; + the section's parent class matches the + second CLASS; and so on. + [* CLASS...] matches sections that match [CLASS...] and + also recursively all their child sections. + CLASS matches if the section's class is the same + as CLASS or a subclass of that; regardless + of the classes of the parent sections. + +Each CLASS should be a class symbol, identifying a class that +derives from `magit-section'. For backward compatibility CLASS +can also be a \"type symbol\". A section matches such a symbol +if the value of its `type' slot is `eq'. If a type symbol has +an entry in `magit--section-type-alist', then a section also +matches that type if its class is a subclass of the class that +corresponds to the type as per that alist. + +Note that it is not necessary to specify the complete section +lineage as printed by `magit-describe-section-briefly', unless +of course you want to be that precise." + (and section (magit-section-match-1 condition section))) + +(defun magit-section-match-1 (condition section) + (cl-assert condition) + (and section + (if (listp condition) + (seq-find (##magit-section-match-1 % section) condition) + (magit-section-match-2 (if (symbolp condition) + (list condition) + (cl-coerce condition 'list)) + section)))) + +(defun magit-section-match-2 (condition section) + (if (eq (car condition) '*) + (or (magit-section-match-2 (cdr condition) section) + (and$ (oref section parent) + (magit-section-match-2 condition $))) + (and (cond-let + [[c (car condition)]] + ((class-p c) + (cl-typep section c)) + ([class (cdr (assq c magit--section-type-alist))] + (cl-typep section class)) + ((eq (oref section type) c))) + (or (not (setq condition (cdr condition))) + (and$ (oref section parent) + (magit-section-match-2 condition $)))))) + +(defun magit-section-value-if (condition &optional section) + "If the section at point matches CONDITION, then return its value. + +If optional SECTION is non-nil then test whether that matches +instead. If there is no section at point and SECTION is nil, +then return nil. If the section does not match, then return +nil. + +See `magit-section-match' for the forms CONDITION can take." + (and$ (or section (magit-current-section)) + (and (magit-section-match condition $) + (oref $ value)))) + +(defmacro magit-section-case (&rest clauses) + "Choose among clauses on the type of the section at point. + +Each clause looks like (CONDITION BODY...). The type of the +section is compared against each CONDITION; the BODY forms of the +first match are evaluated sequentially and the value of the last +form is returned. Inside BODY the symbol `it' is bound to the +section at point. If no clause succeeds or if there is no +section at point, return nil. + +See `magit-section-match' for the forms CONDITION can take. +Additionally a CONDITION of t is allowed in the final clause, and +matches if no other CONDITION match, even if there is no section +at point." + (declare (indent 0) + (debug (&rest (sexp body)))) + `(let ((it (magit-current-section))) + (cond ,@(mapcar (lambda (clause) + `(,(or (eq (car clause) t) + `(and it + (magit-section-match-1 ',(car clause) it))) + ,@(cdr clause))) + clauses)))) + +(defun magit-section-match-assoc (section alist) + "Return the value associated with SECTION's type or lineage in ALIST." + (seq-some (pcase-lambda (`(,key . ,val)) + (and (magit-section-match-1 key section) val)) + alist)) + +;;; Create + +(defvar magit-insert-section-hook nil + "Hook run after `magit-insert-section's BODY. +Avoid using this hook and only ever do so if you know +what you are doing and are sure there is no other way.") + +(defmacro magit-insert-section (&rest args) + "Insert a section at point. + +Create a section object of type CLASS, storing VALUE in its +`value' slot, and insert the section at point. CLASS is a +subclass of `magit-section' or has the form `(eval FORM)', in +which case FORM is evaluated at runtime and should return a +subclass. In other places a sections class is often referred +to as its \"type\". + +Many commands behave differently depending on the class of the +current section and sections of a certain class can have their +own keymap, which is specified using the `keymap' class slot. +The value of that slot should be a variable whose value is a +keymap. + +For historic reasons Magit and Forge in most cases use symbols +as CLASS that don't actually identify a class and that lack the +appropriate package prefix. This works due to some undocumented +kludges, which are not available to other packages. + +When optional HIDE is non-nil collapse the section body by +default, i.e., when first creating the section, but not when +refreshing the buffer. Else expand it by default. This can be +overwritten using `magit-section-set-visibility-hook'. When a +section is recreated during a refresh, then the visibility of +predecessor is inherited and HIDE is ignored (but the hook is +still honored). + +BODY is any number of forms that actually insert the section's +heading and body. Optional NAME, if specified, has to be a +symbol, which is then bound to the object of the section being +inserted. + +Before BODY is evaluated the `start' of the section object is set +to the value of `point' and after BODY was evaluated its `end' is +set to the new value of `point'; BODY is responsible for moving +`point' forward. + +If it turns out inside BODY that the section is empty, then +`magit-cancel-section' can be used to abort and remove all traces +of the partially inserted section. This can happen when creating +a section by washing Git's output and Git didn't actually output +anything this time around. + +\(fn [NAME] (CLASS &optional VALUE HIDE) &rest BODY)" + (declare (indent 1) ;sic + (debug ([&optional symbolp] + (&or [("eval" form) &optional form form &rest form] + [symbolp &optional form form &rest form]) + body))) + (pcase-let* ((bind (and (symbolp (car args)) + (pop args))) + (`((,class ,value ,hide . ,args) . ,body) args) + (obj (gensym "section"))) + `(let* ((,obj (magit-insert-section--create + ,(if (eq (car-safe class) 'eval) (cadr class) `',class) + ,value ,hide ,@args)) + (magit-insert-section--current ,obj) + (magit-insert-section--oldroot + (or magit-insert-section--oldroot + (and (not magit-insert-section--parent) + (prog1 magit-root-section + (setq magit-root-section ,obj))))) + (magit-insert-section--parent ,obj)) + (catch 'cancel-section + ,@(if bind `((let ((,bind ,obj)) ,@body)) body) + (magit-insert-section--finish ,obj)) + ,obj))) + +(defun magit-insert-section--create (class value hide &rest args) + (let (type) + (if (class-p class) + (setq type (or (car (rassq class magit--section-type-alist)) + class)) + (setq type class) + (setq class (or (cdr (assq class magit--section-type-alist)) + 'magit-section))) + (let ((obj (apply class :type type args))) + (oset obj value value) + (oset obj parent magit-insert-section--parent) + (oset obj start (if magit-section-inhibit-markers (point) (point-marker))) + (unless (slot-boundp obj 'hidden) + (oset obj hidden + (let (set old) + (cond + ((setq set (run-hook-with-args-until-success + 'magit-section-set-visibility-hook obj)) + (eq set 'hide)) + ((setq old (and (not magit-section-preserve-visibility) + magit-insert-section--oldroot + (magit-get-section + (magit-section-ident obj) + magit-insert-section--oldroot))) + (oref old hidden)) + ((setq set (magit-section-match-assoc + obj magit-section-initial-visibility-alist)) + (eq (if (functionp set) (funcall set obj) set) 'hide)) + (hide))))) + (unless (oref obj keymap) + (let ((type (oref obj type))) + (oset obj keymap + (or (let ((sym (intern (format "magit-%s-section-map" type)))) + (and (boundp sym) sym)) + (let ((sym (intern (format "forge-%s-section-map" type)))) + (and (boundp sym) sym)))))) + obj))) + +(defun magit-insert-section--finish (obj) + (run-hooks 'magit-insert-section-hook) + (if magit-section-inhibit-markers + (oset obj end (point)) + (oset obj end (point-marker)) + (set-marker-insertion-type (oref obj start) t)) + (cond + ((eq obj magit-root-section) + (when (eq magit-section-inhibit-markers 'delay) + (setq magit-section-inhibit-markers nil) + (magit-map-sections + (lambda (section) + (oset section start (copy-marker (oref section start) t)) + (oset section end (copy-marker (oref section end) t)))))) + (t + (magit-section--set-section-properties obj) + (magit-section-maybe-add-heading-map obj) + (when (oref obj children) + (magit-insert-child-count obj)) + (if magit-section-insert-in-reverse + (push obj (oref (oref obj parent) children)) + (let ((parent (oref obj parent))) + (oset parent children + (nconc (oref parent children) + (list obj))))))) + (when magit-section-insert-in-reverse + (oset obj children (nreverse (oref obj children))))) + +(defun magit-cancel-section (&optional if-empty) + "Cancel inserting the section that is currently being inserted. + +Canceling returns from the inner most use of `magit-insert-section' and +removes all text that was inserted by that. + +If optional IF-EMPTY is non-nil, then only cancel the section, if it is +empty. If a section is split into a heading and a body (i.e., when its +`content' slot is non-nil), then only check if the body is empty." + (when (and magit-insert-section--current + (or (not if-empty) + (= (point) (or (oref magit-insert-section--current content) + (oref magit-insert-section--current start))))) + (if (eq magit-insert-section--current magit-root-section) + (insert "(empty)\n") + (delete-region (oref magit-insert-section--current start) + (point)) + (setq magit-insert-section--current nil) + (throw 'cancel-section nil)))) + +(defun magit-insert-heading (&rest args) + "Insert the heading for the section currently being inserted. + +This function should only be used inside `magit-insert-section'. + +When called without any arguments, then just set the `content' +slot of the object representing the section being inserted to +a marker at `point'. The section should only contain a single +line when this function is used like this. + +When called with arguments ARGS, which have to be strings, or +nil, then insert those strings at point. The section should not +contain any text before this happens and afterwards it should +again only contain a single line. If the `face' property is set +anywhere inside any of these strings, then insert all of them +unchanged. Otherwise use the `magit-section-heading' face for +all inserted text. + +The `content' property of the section object is the end of the +heading (which lasts from `start' to `content') and the beginning +of the the body (which lasts from `content' to `end'). If the +value of `content' is nil, then the section has no heading and +its body cannot be collapsed. If a section does have a heading, +then its height must be exactly one line, including a trailing +newline character. This isn't enforced, you are responsible for +getting it right. The only exception is that this function does +insert a newline character if necessary + +If provided, optional CHILD-COUNT must evaluate to an integer or +boolean. If t, then the count is determined once the children have been +inserted, using `magit-insert-child-count' (which see). For historic +reasons, if the heading ends with \":\", the count is substituted for +that, at this time as well. If `magit-section-show-child-count' is nil, +no counts are inserted + +\n(fn [CHILD-COUNT] &rest STRINGS)" + (declare (indent defun)) + (when args + (let ((count (and (or (integerp (car args)) + (booleanp (car args))) + (pop args))) + (heading (apply #'concat args))) + (insert (if (or (text-property-not-all 0 (length heading) + 'font-lock-face nil heading) + (text-property-not-all 0 (length heading) + 'face nil heading)) + heading + (propertize heading 'font-lock-face 'magit-section-heading))) + (when (and count magit-section-show-child-count) + (insert (propertize (format " (%s)" count) + 'font-lock-face 'magit-section-child-count))))) + (unless (bolp) + (insert ?\n)) + (when (fboundp 'magit-maybe-make-margin-overlay) + (magit-maybe-make-margin-overlay)) + (oset magit-insert-section--current content + (if magit-section-inhibit-markers (point) (point-marker)))) + +(defmacro magit-insert-section-body (&rest body) + "Use BODY to insert the section body, once the section is expanded. +If the section is expanded when it is created, then this is +like `progn'. Otherwise BODY isn't evaluated until the section +is explicitly expanded." + (declare (indent 0)) + (let ((f (gensym)) + (s (gensym)) + (l (gensym))) + `(let ((,f (lambda () ,@body))) + (if (oref magit-insert-section--current hidden) + (oset magit-insert-section--current washer + (let ((,s magit-insert-section--current)) + (lambda () + (let ((,l (magit-section-lineage ,s t))) + (dolist (s ,l) + (set-marker-insertion-type (oref s end) t)) + (funcall ,f) + (dolist (s ,l) + (set-marker-insertion-type (oref s end) nil)) + (magit-section--set-section-properties ,s) + (magit-section-maybe-remove-heading-map ,s) + (magit-section-maybe-remove-visibility-indicator ,s))))) + (funcall ,f))))) + +(defun magit-insert-headers (hook) + (let* ((header-sections nil) + (fn (##push magit-insert-section--current header-sections))) + (unwind-protect + (progn + (add-hook 'magit-insert-section-hook fn -90 t) + (magit-run-section-hook hook) + (when header-sections + (insert "\n") + ;; Make the first header into the parent of the rest. + (when (cdr header-sections) + (setq header-sections (nreverse header-sections)) + (let* ((1st-header (pop header-sections)) + (header-parent (oref 1st-header parent))) + (oset header-parent children (list 1st-header)) + (oset 1st-header children header-sections) + (oset 1st-header content (oref (car header-sections) start)) + (oset 1st-header end (oref (car (last header-sections)) end)) + (dolist (sub-header header-sections) + (oset sub-header parent 1st-header)) + (magit-section-maybe-add-heading-map 1st-header))))) + (remove-hook 'magit-insert-section-hook fn t)))) + +(defun magit-section--set-section-properties (section) + (pcase-let* (((eieio start end children keymap) section) + (props `( magit-section ,section + ,@(and$ (symbol-value keymap) + (list 'keymap $))))) + (if children + (save-excursion + (goto-char start) + (while (< (point) end) + (let ((next (or (next-single-property-change (point) 'magit-section) + end))) + (unless (magit-section-at) + (add-text-properties (point) next props)) + (goto-char next)))) + (add-text-properties start end props)))) + +(defun magit-section-maybe-add-heading-map (section) + (when (magit-section-content-p section) + (let ((start (oref section start)) + (map (oref section keymap))) + (when (symbolp map) + (setq map (symbol-value map))) + (put-text-property + start + (magit--eol-position start) + 'keymap (if map + (make-composed-keymap + (list map magit-section-heading-map)) + magit-section-heading-map))))) + +(defun magit-section-maybe-remove-heading-map (section) + (with-slots (start content end keymap) section + (when (= content end) + (put-text-property start end 'keymap + (if (symbolp keymap) (symbol-value keymap) keymap))))) + +(defun magit-insert-child-count (section) + "Modify SECTION's heading to contain number of child sections. + +If `magit-section-show-child-count' is non-nil and the SECTION +has children and its heading ends with \":\", then replace that +with \" (N)\", where N is the number of child sections. + +This function is called by `magit-insert-section' after that has +evaluated its BODY. Admittedly that's a bit of a hack." + (let (content count) + (cond + ((not (and magit-section-show-child-count + (setq content (oref section content)) + (setq count (length (oref section children))) + (> count 0)))) + ((eq (char-before (- content 1)) ?:) + (save-excursion + (goto-char (- content 2)) + (insert (magit--propertize-face (format " (%s)" count) + 'magit-section-child-count)) + (delete-char 1))) + ((and (eq (char-before (- content 4)) ?\s) + (eq (char-before (- content 3)) ?\() + (eq (char-before (- content 2)) ?t ) + (eq (char-before (- content 1)) ?\))) + (save-excursion + (goto-char (- content 3)) + (delete-char 1) + (insert (format "%s" count))))))) + +(defun magit-section--opportunistic-wash (section) + (when-let ((washer (oref section washer))) + (oset section washer nil) + (let ((inhibit-read-only t) + (magit-insert-section--parent section) + (magit-insert-section--current section)) + (save-excursion + (goto-char (oref section end)) + (oset section content (point-marker)) + (funcall washer) + (oset section end (point-marker)))) + (setq magit-section-highlight-force-update t))) + +;;; Highlight + +(defvar magit-section--refreshed-buffers nil) + +(defun magit-section-pre-command-hook () + (when (and (or magit--context-menu-buffer + magit--context-menu-section) + (not (eq (ignore-errors + (event-basic-type (aref (this-command-keys) 0))) + 'mouse-3))) + ;; This is the earliest opportunity to clean up after an aborted + ;; context-menu because that neither causes the command that created + ;; the menu to abort nor some abortion hook to be run. It is not + ;; possible to update highlighting before the first command invoked + ;; after the menu is aborted. Here we can only make sure it is + ;; updated afterwards. + (magit-menu-highlight-point-section)) + (setq magit-section--refreshed-buffers nil) + (setq magit-section-pre-command-region-p (region-active-p)) + (setq magit-section-pre-command-section (magit-current-section)) + (setq magit-section-focused-sections nil)) + +(defun magit-section-post-command-hook () + (let ((window (selected-window))) + ;; The command may have used `set-window-buffer' to change + ;; the window's buffer without changing the current buffer. + (when (eq (current-buffer) (window-buffer window)) + (cursor-sensor-move-to-tangible window) + (when (or magit--context-menu-buffer + magit--context-menu-section) + (magit-menu-highlight-point-section)))) + (unless (memq (current-buffer) magit-section--refreshed-buffers) + (magit-section-update-highlight)) + (setq magit-section--refreshed-buffers nil)) + +(defun magit-section-deactivate-mark () + (setq magit-section-highlight-force-update t)) + +(defun magit-section-update-highlight (&optional force) + (let ((section (magit-current-section)) + (focused (magit-focused-sections))) + (cond + ((or force + magit-section-highlight-force-update + (xor magit-section-pre-command-region-p (region-active-p)) + (not (eq magit-section-pre-command-section section))) + (let ((inhibit-read-only t) + (deactivate-mark nil) + (selection (magit-region-sections))) + (mapc #'delete-overlay magit-section-highlight-overlays) + (mapc #'delete-overlay magit-section-selection-overlays) + (setq magit-section-highlight-overlays nil) + (setq magit-section-selection-overlays nil) + (cond ((magit-section--maybe-enable-long-lines-shortcuts)) + ((eq section magit-root-section)) + ((not magit-section-highlight-current) + (when selection + (magit-section-highlight-selection selection))) + ((not selection) + (magit-section-highlight section)) + (t + (mapc #'magit-section-highlight selection) + (magit-section-highlight-selection selection))) + (dolist (section (cl-union magit-section-highlighted-sections focused)) + (when (slot-boundp section 'painted) + (magit-section-update-paint section focused))) + (restore-buffer-modified-p nil))) + ((and (eq magit-section-pre-command-section section) + magit-section-selection-overlays + (region-active-p) + (not (magit-region-sections))) + (mapc #'delete-overlay magit-section-selection-overlays) + (setq magit-section-selection-overlays nil))) + (setq magit-section-highlight-force-update nil) + (magit-section-maybe-paint-visibility-ellipses))) + +(cl-defmethod magit-section-highlight ((section magit-section)) + (pcase-let* + (((eieio start content end children heading-highlight-face) section) + (headlight heading-highlight-face) + (selective (magit-section-selective-highlight-p section))) + (cond + (selective + (magit-section-highlight-range start (or content end) headlight) + (cond (children + (let ((child-start (oref (car children) start))) + (when (and content (< content child-start)) + (magit-section-highlight-range content child-start))) + (mapc #'magit-section-highlight children)) + ((and content (not (slot-boundp section 'painted))) + (magit-section-highlight-range content end)) + ;; Unfortunate kludge for delayed hunk refinement. + ((magit-section--refine section)))) + (headlight + (magit-section-highlight-range start (or content end) headlight) + (when content + (magit-section-highlight-range (if headlight content start) end))) + ((magit-section-highlight-range start end))))) + +(defun magit-section-highlight-selection (selection) + (when magit-section-highlight-selection + (dolist (sibling selection) + (with-slots (start content end heading-selection-face) sibling + (let ((ov (make-overlay start (or content end) nil t))) + (overlay-put ov 'font-lock-face + (or heading-selection-face + 'magit-section-heading-selection)) + (overlay-put ov 'evaporate t) + (overlay-put ov 'priority '(nil . 9)) + (push ov magit-section-selection-overlays) + ov))))) + +(defun magit-section-highlight-range (start end &optional face) + (let ((ov (make-overlay start end nil t))) + (overlay-put ov 'font-lock-face (or face 'magit-section-highlight)) + (overlay-put ov 'evaporate t) + (push ov magit-section-highlight-overlays) + ov)) + +(defun magit-section-selective-highlight-p (section &optional as-child) + (or (oref section selective-highlight) + (and as-child + (oref section heading-highlight-face)) + (slot-boundp section 'painted) + (and$ (oref section children) + (magit-section-selective-highlight-p (car $) t)))) + +;;; Paint + +(defun magit-section-update-paint (section focused-sections) + (cl-flet ((paint (highlight) + (let ((inhibit-read-only t)) + (save-excursion + (goto-char (oref section start)) + (magit-section-paint section highlight)))) + (unregister () + (setq magit-section-highlighted-sections + (delq section magit-section-highlighted-sections)))) + (if (magit-section-hidden section) + ;; If the section is highlighted but unfocused, it remains + ;; highlighted, but `magit-section--opportunistic-paint' via + ;; `magit-section-show' will unhighlight on expansion, and + ;; before then (or if a refresh occurs first) it doesn't matter. + (unregister) + (pcase (list (if (memq section focused-sections) 'focus 'unfocus) + (oref section painted)) + (`(focus ,(or 'nil 'plain)) + (paint t) + (cl-pushnew section magit-section-highlighted-sections)) + (`(focus highlight) + (cl-pushnew section magit-section-highlighted-sections)) + (`(unfocus ,(or 'nil 'highlight)) + (paint nil) + (unregister)) + ('(unfocus plain) + (unregister)))))) + +(cl-defmethod magit-section-paint ((section magit-section) _highlight) + (error "Slot `paint' bound but `magit-section-paint' not implemented for `%s'" + (eieio-object-class-name section))) + +(defun magit-section--opportunistic-paint (section) + (when (and (not (oref section hidden)) + (slot-boundp section 'painted)) + (if magit--refreshing-buffer-p + ;; Defer to `magit-section-update-highlight'. + (unless (oref section painted) + (cl-pushnew section magit-section-highlighted-sections)) + (magit-section-update-paint section (magit-focused-sections))))) + +(cl-defmethod magit-section--refine ((_section magit-section))) + +;;; Long Lines + +(defvar magit-show-long-lines-warning t) + +(defun magit-section--maybe-enable-long-lines-shortcuts () + (and (fboundp 'long-line-optimizations-p) + (long-line-optimizations-p) + (prog1 t + (message "Enabling long lines shortcuts in %S" (current-buffer)) + (kill-local-variable 'redisplay-highlight-region-function) + (kill-local-variable 'redisplay-unhighlight-region-function) + (when magit-show-long-lines-warning + (setq magit-show-long-lines-warning nil) + (display-warning 'magit (format "\ +Emacs has enabled redisplay shortcuts +in this buffer because there are lines whose length go beyond +`long-line-threshold' (%s characters). As a result, section +highlighting and the special appearance of the region has been +disabled. + +These shortcuts remain enabled, even once there no longer are +any long lines in this buffer. To disable them again, kill +and recreate the buffer. + +This message won't be shown for this session again. To disable +it for all future sessions, set `magit-show-long-lines-warning' +to nil." (bound-and-true-p long-line-threshold)) :warning))))) + +;;; Successor + +(cl-defgeneric magit-section-get-relative-position (section)) + +(cl-defmethod magit-section-get-relative-position ((section magit-section)) + (let ((start (oref section start)) + (point (magit-point))) + (list (- (line-number-at-pos point) + (line-number-at-pos start)) + (- point (line-beginning-position))))) + +(cl-defgeneric magit-section-goto-successor ()) + +(cl-defmethod magit-section-goto-successor ((section magit-section) + line char &optional _arg) + (or (magit-section-goto-successor--same section line char) + (magit-section-goto-successor--related section))) + +(defun magit-section-goto-successor--same (section line char) + (let ((ident (magit-section-ident section))) + (and-let ((found (magit-get-section ident))) + (let ((start (oref found start))) + (goto-char start) + (unless (eq found magit-root-section) + (ignore-errors + (forward-line line) + (forward-char char)) + (unless (eq (magit-current-section) found) + (goto-char start))) + t)))) + +(defun magit-section-goto-successor--related (section) + (and-let ((found (magit-section-goto-successor--related-1 section))) + (goto-char (if (eq (oref found type) 'button) + (point-min) + (oref found start))))) + +(defun magit-section-goto-successor--related-1 (section) + (or (and$ (pcase (oref section type) + ('staged 'unstaged) + ('unstaged 'staged) + ('unpushed 'unpulled) + ('unpulled 'unpushed)) + (magit-get-section `((,$) (status)))) + (and$ (magit-section-siblings section 'next) + (magit-get-section (magit-section-ident (car $)))) + (and$ (magit-section-siblings section 'prev) + (magit-get-section (magit-section-ident (car $)))) + (and$ (oref section parent) + (or (magit-get-section (magit-section-ident $)) + (magit-section-goto-successor--related-1 $))))) + +;;; Region + +(defvar-local magit-section--region-overlays nil) + +(defun magit-section--delete-region-overlays () + (mapc #'delete-overlay magit-section--region-overlays) + (setq magit-section--region-overlays nil)) + +(defun magit-section--highlight-region (start end window rol) + (magit-section--delete-region-overlays) + (if (and magit-section-highlight-selection + (not magit-section-keep-region-overlay) + (or (magit-region-sections) + (run-hook-with-args-until-success 'magit-region-highlight-hook + (magit-current-section))) + (not (= (line-number-at-pos start) + (line-number-at-pos end))) + ;; (not (eq (car-safe last-command-event) 'mouse-movement)) + ) + (funcall (default-value 'redisplay-unhighlight-region-function) rol) + (funcall (default-value 'redisplay-highlight-region-function) + start end window rol))) + +(defun magit-section--unhighlight-region (rol) + (magit-section--delete-region-overlays) + (funcall (default-value 'redisplay-unhighlight-region-function) rol)) + +;;; Visibility + +(defvar-local magit-section-visibility-cache nil) +(put 'magit-section-visibility-cache 'permanent-local t) + +(defun magit-section-cached-visibility (section) + "Return the visibility cached for SECTION. +When `magit-section-preserve-visibility' is nil, return nil." + (and magit-section-preserve-visibility + (cdr (assoc (magit-section-ident section) + magit-section-visibility-cache)))) + +(cl-defun magit-section-cache-visibility + (&optional (section magit-insert-section--current)) + "Cache SECTION's current visibility." + (setf (alist-get (magit-section-ident section) + magit-section-visibility-cache + nil nil #'equal) + (if (oref section hidden) 'hide 'show))) + +(cl-defun magit-section-maybe-cache-visibility + (&optional (section magit-insert-section--current)) + (when (or (eq magit-section-cache-visibility t) + (memq (oref section type) + magit-section-cache-visibility)) + (magit-section-cache-visibility section))) + +(defun magit-section-visibility-indicator () + (if (window-system) + (car magit-section-visibility-indicators) + (cadr magit-section-visibility-indicators))) + +(defun magit-section-maybe-update-visibility-indicator (section) + (when-let* ((indicator (magit-section-visibility-indicator)) + (_(magit-section-content-p section))) + (let* ((beg (oref section start)) + (eoh (magit--eol-position beg)) + (kind (cl-typecase (car indicator) + (symbol 'fringe) + (character 'margin) + (string 'ellipsis))) + (indicator (if (or (oref section hidden) + (eq kind 'ellipsis)) + (car indicator) + (cdr indicator)))) + (pcase kind + ((or 'fringe 'margin) + (let ((ov (magit--overlay-at beg 'magit-vis-indicator kind))) + (unless ov + (setq ov (make-overlay beg eoh nil t)) + (overlay-put ov 'evaporate t) + (overlay-put ov 'magit-vis-indicator kind)) + (overlay-put + ov 'before-string + (pcase kind + ('fringe + (propertize "fringe" 'display + `(left-fringe ,indicator fringe))) + ('margin + (propertize "margin" 'display + `((margin left-margin) + ,(propertize (string indicator) + 'face 'magit-left-margin)))))))) + ('ellipsis + (let ((ov (magit--overlay-at (1- eoh) 'magit-vis-indicator 'eoh))) + (cond ((oref section hidden) + (unless ov + (setq ov (make-overlay (1- eoh) eoh)) + (overlay-put ov 'evaporate t) + (overlay-put ov 'magit-vis-indicator 'eoh)) + (overlay-put ov 'after-string indicator)) + (ov + (delete-overlay ov))))))))) + +(defvar-local magit--ellipses-sections nil) + +(defun magit-section-maybe-paint-visibility-ellipses () + ;; This is needed because we hide the body instead of "the body + ;; except the final newline and additionally the newline before + ;; the body"; otherwise we could use `buffer-invisibility-spec'. + (when-let* ((indicator (car (magit-section-visibility-indicator))) + (_(stringp indicator))) + (let* ((sections (append magit--ellipses-sections + (setq magit--ellipses-sections + (or (magit-region-sections) + (list (magit-current-section)))))) + (beg (mapcar (##oref % start) sections)) + (end (mapcar (##oref % end) sections))) + (when (region-active-p) + ;; This ensures that the region face is removed from ellipses + ;; when the region becomes inactive, but fails to ensure that + ;; all ellipses within the active region use the region face, + ;; because the respective overlay has not yet been updated at + ;; this time. The magit-selection face is always applied. + (push (region-beginning) beg) + (push (region-end) end)) + (setq beg (apply #'min beg)) + (setq end (apply #'max end)) + (dolist (ov (overlays-in beg end)) + (when (eq (overlay-get ov 'magit-vis-indicator) 'eoh) + (overlay-put + ov 'after-string + (propertize + indicator 'font-lock-face + (let ((pos (overlay-start ov))) + (delq nil (nconc (mapcar (##overlay-get % 'font-lock-face) + (overlays-at pos)) + (list (get-char-property + pos 'font-lock-face)))))))))))) + +(defun magit-section-maybe-remove-visibility-indicator (section) + (when (and (magit-section-visibility-indicator) + (= (oref section content) + (oref section end))) + (dolist (o (overlays-in (oref section start) + (1+ (magit--eol-position (oref section start))))) + (when (overlay-get o 'magit-vis-indicator) + (delete-overlay o))))) + +(defvar-local magit-section--opened-sections nil) + +(defun magit-section--open-temporarily (beg end) + (save-excursion + (goto-char beg) + (let ((section (magit-current-section))) + (while section + (let ((content (oref section content))) + (cond ((and (magit-section-hidden section) + (<= (or content (oref section start)) + beg + (oref section end))) + (when content + (magit-section-show section) + (push section magit-section--opened-sections)) + (setq section (oref section parent))) + ((setq section nil))))))) + (or (eq search-invisible t) + (not (isearch-range-invisible beg end)))) + +(define-advice isearch-clean-overlays (:around (fn) magit-mode) + (if (derived-mode-p 'magit-mode) + (let ((pos (point))) + (dolist (section magit-section--opened-sections) + (unless (<= (oref section content) pos (oref section end)) + (magit-section-hide section))) + (setq magit-section--opened-sections nil)) + (funcall fn))) + +(defun magit-section-reveal (section) + (while section + (when (oref section hidden) + (magit-section-show section)) + (setq section (oref section parent)))) + +;;; Utilities + +(cl-defun magit-section-selected-p (section &optional (selection nil sselection)) + (and (not (eq section magit-root-section)) + (or (eq section (magit-current-section)) + (memq section (if sselection + selection + (setq selection (magit-region-sections)))) + (and$ (oref section parent) + (magit-section-selected-p $ selection))))) + +(defun magit-section-parent-value (section) + (and$ (oref section parent) + (oref $ value))) + +(defun magit-section-siblings (section &optional direction) + "Return a list of the sibling sections of SECTION. + +If optional DIRECTION is `prev', then return siblings that come +before SECTION. If it is `next', then return siblings that come +after SECTION. For all other values, return all siblings +excluding SECTION itself." + (and-let* ((parent (oref section parent)) + (siblings (oref parent children))) + (pcase direction + ('prev (cdr (member section (reverse siblings)))) + ('next (cdr (member section siblings))) + (_ (remq section siblings))))) + +(defun magit-focused-sections () + "Return a list of the selected sections and all their descendants. +If no sections are selected return a list of the current section and +its descendants, except if that is the root section, in which case +return nil." + (or magit-section-focused-sections + (setq magit-section-focused-sections + (let ((current (magit-current-section))) + (and (not (eq current magit-root-section)) + (let (sections) + (letrec ((collect (lambda (section) + (mapc collect (oref section children)) + (push section sections)))) + (mapc collect + (or (magit-region-sections) (list current)))) + sections)))))) + +(defun magit-region-values (&optional condition multiple) + "Return a list of the values of the selected sections. + +Return the values that themselves would be returned by +`magit-region-sections' (which see)." + (mapcar (##oref % value) + (magit-region-sections condition multiple))) + +(defun magit-region-sections (&optional condition multiple) + "Return a list of the selected sections. + +When the region is active and constitutes a valid section +selection, then return a list of all selected sections. This is +the case when the region begins in the heading of a section and +ends in the heading of the same section or in that of a sibling +section. If optional MULTIPLE is non-nil, then the region cannot +begin and end in the same section. + +When the selection is not valid, then return nil. In this case, +most commands that can act on the selected sections will instead +act on the section at point. + +When the region looks like it would in any other buffer then +the selection is invalid. When the selection is valid then the +region uses the `magit-section-highlight' face. This does not +apply to diffs where things get a bit more complicated, but even +here if the region looks like it usually does, then that's not +a valid selection as far as this function is concerned. + +If optional CONDITION is non-nil, then the selection not only +has to be valid; all selected sections additionally have to match +CONDITION, or nil is returned. See `magit-section-match' for the +forms CONDITION can take." + (and (region-active-p) + (let* ((rbeg (region-beginning)) + (rend (region-end)) + (sbeg (magit-section-at rbeg)) + (send (magit-section-at rend))) + ;; It should be possible to select a single section using + ;; `set-mark-command', so don't use `use-region-p' above. + ;; We still have to prevent the selection overlay from + ;; being flashed when clicking inside a section, which + ;; the first condition accomplishes: + (and (or (not (eq this-command #'mouse-drag-region)) + (> rend rbeg)) + send + (not (eq send magit-root-section)) + (not (and (eq send sbeg) + (or multiple + (> rend rbeg)))) + (let ((siblings (cons sbeg (magit-section-siblings sbeg 'next))) + (sections ())) + (and (memq send siblings) + (magit-section-position-in-heading-p sbeg rbeg) + (magit-section-position-in-heading-p send rend) + (progn + (while siblings + (push (car siblings) sections) + (when (eq (pop siblings) send) + (setq siblings nil))) + (setq sections (nreverse sections)) + (and (or (not condition) + (seq-every-p (##magit-section-match condition %) + sections)) + sections)))))))) + +(defun magit-map-sections (function &optional section) + "Apply FUNCTION to all sections for side effects only, depth first. +If optional SECTION is non-nil, only map over that section and +its descendants, otherwise map over all sections in the current +buffer, ending with `magit-root-section'." + (let ((section (or section magit-root-section))) + (mapc (##magit-map-sections function %) + (oref section children)) + (funcall function section))) + +(defun magit-section-position-in-heading-p (&optional section pos) + "Return t if POSITION is inside the heading of SECTION. +POSITION defaults to point and SECTION defaults to the +current section." + (unless section + (setq section (magit-current-section))) + (unless pos + (setq pos (point))) + (ignore-errors ; Allow navigating broken sections. + (and section + (>= pos (oref section start)) + (< pos (or (oref section content) + (oref section end))) + t))) + +(defun magit-section-internal-region-p (&optional section) + "Return t if the region is active and inside SECTION's body. +If optional SECTION is nil, use the current section." + (and (region-active-p) + (or section (setq section (magit-current-section))) + (let ((beg (magit-section-at (region-beginning)))) + (and (eq beg (magit-section-at (region-end))) + (eq beg section))) + (not (or (magit-section-position-in-heading-p section (region-beginning)) + (magit-section-position-in-heading-p section (region-end)))) + t)) + +(defun magit-wash-sequence (function) + "Repeatedly call FUNCTION until it returns nil or eob is reached. +FUNCTION has to move point forward or return nil." + (while (and (not (eobp)) (funcall function)))) + +;;;###autoload +(defun magit-add-section-hook (hook function &optional at append local) + "Add to the value of section hook HOOK the function FUNCTION. + +Add FUNCTION at the beginning of the hook list unless optional +APPEND is non-nil, in which case FUNCTION is added at the end. +If FUNCTION already is a member, then move it to the new location. + +If optional AT is non-nil and a member of the hook list, then +add FUNCTION next to that instead. Add before or after AT, or +replace AT with FUNCTION depending on APPEND. If APPEND is the +symbol `replace', then replace AT with FUNCTION. For any other +non-nil value place FUNCTION right after AT. If nil, then place +FUNCTION right before AT. If FUNCTION already is a member of the +list but AT is not, then leave FUNCTION where ever it already is. + +If optional LOCAL is non-nil, then modify the hook's buffer-local +value rather than its global value. This makes the hook local by +copying the default value. That copy is then modified. + +HOOK should be a symbol. If HOOK is void, it is first set to nil. +HOOK's value must not be a single hook function. FUNCTION should +be a function that takes no arguments and inserts one or multiple +sections at point, moving point forward. FUNCTION may choose not +to insert its section(s), when doing so would not make sense. It +should not be abused for other side-effects. To remove FUNCTION +again use `remove-hook'." + (unless (boundp hook) + (error "Cannot add function to undefined hook variable %s" hook)) + (unless (default-boundp hook) + (set-default hook nil)) + (let ((value (if local + (if (local-variable-p hook) + (symbol-value hook) + (unless (local-variable-if-set-p hook) + (make-local-variable hook)) + (copy-sequence (default-value hook))) + (default-value hook)))) + (if at + (when (setq at (member at value)) + (setq value (delq function value)) + (cond ((eq append 'replace) + (setcar at function)) + (append + (push function (cdr at))) + (t + (push (car at) (cdr at)) + (setcar at function)))) + (setq value (delq function value))) + (unless (member function value) + (setq value (if append + (append value (list function)) + (cons function value)))) + (when (eq append 'replace) + (setq value (delq at value))) + (if local + (set hook value) + (set-default hook value)))) + +(defvar-local magit-disabled-section-inserters nil) + +(defun magit-disable-section-inserter (fn) + "Disable the section inserter FN in the current repository. +It is only intended for use in \".dir-locals.el\" and +\".dir-locals-2.el\". Also see info node `(magit)Per-Repository +Configuration'." + (cl-pushnew fn magit-disabled-section-inserters)) + +(put 'magit-disable-section-inserter 'safe-local-eval-function t) + +(defun magit-run-section-hook (hook &rest args) + "Run HOOK with ARGS, warning about invalid entries." + (let ((entries (symbol-value hook))) + (unless (listp entries) + (setq entries (list entries))) + (when-let ((invalid (seq-remove #'functionp entries))) + (message "`%s' contains entries that are no longer valid. +%s\nUsing standard value instead. Please re-configure hook variable." + hook + (mapconcat (##format " `%s'" %) invalid "\n")) + (sit-for 5) + (setq entries (eval (car (get hook 'standard-value))))) + (dolist (entry entries) + (let ((magit--current-section-hook (cons (list hook entry) + magit--current-section-hook))) + (unless (memq entry magit-disabled-section-inserters) + (if (bound-and-true-p magit-refresh-verbose) + (let ((time (benchmark-elapse (apply entry args)))) + (message " %-50s %f %s" entry time + (cond ((> time 0.03) "!!") + ((> time 0.01) "!") + ("")))) + (apply entry args))))))) + +(cl-defun magit--overlay-at (pos prop &optional (val nil sval) testfn) + (cl-find-if (lambda (o) + (let ((p (overlay-properties o))) + (and (plist-member p prop) + (or (not sval) + (funcall (or testfn #'eql) + (plist-get p prop) + val))))) + (overlays-at pos t))) + +(defun magit-face-property-all (face string) + "Return non-nil if FACE is present in all of STRING." + (catch 'missing + (let ((pos 0)) + (while (setq pos (next-single-property-change pos 'font-lock-face string)) + (let ((val (get-text-property pos 'font-lock-face string))) + (unless (if (consp val) + (memq face val) + (eq face val)) + (throw 'missing nil)))) + (not pos)))) + +(defun magit--add-face-text-property ( beg end face + &optional append object adopt-face) + "Like `add-face-text-property' but for `font-lock-face'. +If optional ADOPT-FACE, then replace `face' with `font-lock-face' +first. The latter is a hack, which is likely to be removed again." + (when (stringp object) + (unless beg (setq beg 0)) + (unless end (setq end (length object)))) + (when adopt-face + (let ((beg beg) + (end end)) + (while (< beg end) + (let ((pos (next-single-property-change beg 'face object end)) + (val (get-text-property beg 'face object))) + ;; We simply assume font-lock-face is not also set. + (put-text-property beg pos 'font-lock-face val object) + (remove-list-of-text-properties beg pos '(face) object) + (setq beg pos))))) + (while (< beg end) + (let* ((pos (next-single-property-change beg 'font-lock-face object end)) + (val (get-text-property beg 'font-lock-face object)) + (val (ensure-list val))) + (put-text-property beg pos 'font-lock-face + (if append + (append val (list face)) + (cons face val)) + object) + (setq beg pos))) + object) + +(defun magit--propertize-face (string face) + (propertize string 'face face 'font-lock-face face)) + +(defun magit--put-face (beg end face string) + (put-text-property beg end 'face face string) + (put-text-property beg end 'font-lock-face face string)) + +(defun magit--bolp (pos) + "Return t if POS is at the beginning of a line. +This is like moving to POS and then calling `bolp'." + (save-excursion (goto-char pos) (bolp))) + +(defun magit--eolp (pos) + "Return t if POS is at the end of a line. +This is like moving to POS and then calling `eolp'." + (save-excursion (goto-char pos) (bolp))) + +(defun magit--bol-position (pos) + "Return the position at the beginning of the line containing POS. +This is like moving to POS and then calling `pos-bol'." + (save-excursion (goto-char pos) (pos-bol))) + +(defun magit--eol-position (pos) + "Return the position at the end of the line containing POS. +This is like moving to POS and then calling `pos-eol'." + (save-excursion (goto-char pos) (pos-eol))) + +;;; Imenu Support + +(defvar-local magit--imenu-group-types nil) +(defvar-local magit--imenu-item-types nil) + +(defun magit--imenu-create-index () + ;; If `which-function-mode' is active, then the create-index + ;; function is called at the time the major-mode is being enabled. + ;; Modes that derive from `magit-mode' have not populated the buffer + ;; at that time yet, so we have to abort. + (and magit-root-section + (or magit--imenu-group-types + magit--imenu-item-types) + (let ((index + (mapcan + (lambda (section) + (cond + (magit--imenu-group-types + (and (if (eq (car-safe magit--imenu-group-types) 'not) + (not (magit-section-match + (cdr magit--imenu-group-types) + section)) + (magit-section-match magit--imenu-group-types section)) + (and-let ((children (oref section children))) + `((,(magit--imenu-index-name section) + ,@(mapcar (##cons (magit--imenu-index-name %) + (oref % start)) + children)))))) + (magit--imenu-item-types + (and (magit-section-match magit--imenu-item-types section) + `((,(magit--imenu-index-name section) + . ,(oref section start))))))) + (oref magit-root-section children)))) + (if (and magit--imenu-group-types (symbolp magit--imenu-group-types)) + (cdar index) + index)))) + +(defun magit--imenu-index-name (section) + (let ((heading (buffer-substring-no-properties + (oref section start) + (1- (or (oref section content) + (oref section end)))))) + (save-match-data + (cond + ((and (magit-section-match [commit logbuf] section) + (string-match "[^ ]+\\([ *|]*\\).+" heading)) + (replace-match " " t t heading 1)) + ((magit-section-match + '([branch local branchbuf] [tag tags branchbuf]) section) + (oref section value)) + ((magit-section-match [branch remote branchbuf] section) + (concat (oref (oref section parent) value) "/" + (oref section value))) + ((string-match " ([0-9]+)\\'" heading) + (substring heading 0 (match-beginning 0))) + (heading))))) + +(defun magit--imenu-goto-function (_name position &rest _rest) + "Go to the section at POSITION. +Make sure it is visible, by showing its ancestors where +necessary. For use as `imenu-default-goto-function' in +`magit-mode' buffers." + (goto-char position) + (let ((section (magit-current-section))) + (while (setq section (oref section parent)) + (when (oref section hidden) + (magit-section-show section))))) + +;;; Bookmark support + +(declare-function bookmark-get-filename "bookmark" (bookmark-name-or-record)) +(declare-function bookmark-make-record-default "bookmark" + (&optional no-file no-context posn)) +(declare-function bookmark-prop-get "bookmark" (bookmark-name-or-record prop)) +(declare-function bookmark-prop-set "bookmark" (bookmark-name-or-record prop val)) + +(cl-defgeneric magit-bookmark-get-filename () + (or (buffer-file-name) (buffer-name))) + +(cl-defgeneric magit-bookmark-get-value (bookmark mode)) + +(cl-defgeneric magit-bookmark--get-child-value (section) + (oref section value)) + +(cl-defgeneric magit-bookmark-get-buffer-create (bookmark mode)) + +(defun magit--make-bookmark () + "Create a bookmark for the current Magit buffer. +Input values are the major-mode's `magit-bookmark-name' method, +and the buffer-local values of the variables referenced in its +`magit-bookmark-variables' property." + (require 'bookmark) + (if (plist-member (symbol-plist major-mode) 'magit-bookmark-variables) + ;; `bookmark-make-record-default's return value does not match + ;; (NAME . ALIST), even though it is used as the default value + ;; of `bookmark-make-record-function', which states that such + ;; functions must do that. See #4356. + (let ((bookmark (cons nil (bookmark-make-record-default 'no-file)))) + (bookmark-prop-set bookmark 'handler #'magit--handle-bookmark) + (bookmark-prop-set bookmark 'mode major-mode) + (bookmark-prop-set bookmark 'filename (magit-bookmark-get-filename)) + (bookmark-prop-set bookmark 'defaults (list (magit-bookmark-name))) + (magit-bookmark-get-value bookmark) + (bookmark-prop-set + bookmark 'magit-hidden-sections + (seq-keep (##and (oref % hidden) + (cons (oref % type) + (magit-bookmark--get-child-value %))) + (oref magit-root-section children))) + bookmark) + (user-error "Bookmarking is not implemented for %s buffers" major-mode))) + +;;;###autoload +(defun magit--handle-bookmark (bookmark) + "Open a bookmark created by `magit--make-bookmark'. + +Call the generic function `magit-bookmark-get-buffer-create' to get +the appropriate buffer without displaying it. + +Then call the `magit-*-setup-buffer' function of the the major-mode +with the variables' values as arguments, which were recorded by +`magit--make-bookmark'." + (require (quote magit-bookmark) nil t) + (let ((buffer (magit-bookmark-get-buffer-create + bookmark + (bookmark-prop-get bookmark 'mode)))) + (set-buffer buffer) ; That is the interface we have to adhere to. + (when-let ((hidden (bookmark-prop-get bookmark 'magit-hidden-sections))) + (with-current-buffer buffer + (dolist (child (oref magit-root-section children)) + (if (member (cons (oref child type) + (oref child value)) + hidden) + (magit-section-hide child) + (magit-section-show child))))) + ;; Compatibility with `bookmark+' package. See #4356. + (when (bound-and-true-p bmkp-jump-display-function) + (funcall bmkp-jump-display-function (current-buffer))) + nil)) + +(put 'magit--handle-bookmark 'bookmark-handler-type "Magit") + +(cl-defgeneric magit-bookmark-name () + "Return name for bookmark to current buffer." + (format "%s%s" + (substring (symbol-name major-mode) 0 -5) + (if-let ((vars (get major-mode 'magit-bookmark-variables))) + (mapcan (##ensure-list (symbol-value %)) vars) + ""))) + +;;; Bitmaps + +(define-fringe-bitmap 'magit-fringe-bitmap+ + [#b00000000 + #b00011000 + #b00011000 + #b01111110 + #b01111110 + #b00011000 + #b00011000 + #b00000000]) + +(define-fringe-bitmap 'magit-fringe-bitmap- + [#b00000000 + #b00000000 + #b00000000 + #b01111110 + #b01111110 + #b00000000 + #b00000000 + #b00000000]) + +(define-fringe-bitmap 'magit-fringe-bitmap> + [#b01100000 + #b00110000 + #b00011000 + #b00001100 + #b00011000 + #b00110000 + #b01100000 + #b00000000]) + +(define-fringe-bitmap 'magit-fringe-bitmapv + [#b00000000 + #b10000010 + #b11000110 + #b01101100 + #b00111000 + #b00010000 + #b00000000 + #b00000000]) + +(define-fringe-bitmap 'magit-fringe-bitmap-bold> + [#b11100000 + #b01110000 + #b00111000 + #b00011100 + #b00011100 + #b00111000 + #b01110000 + #b11100000]) + +(define-fringe-bitmap 'magit-fringe-bitmap-boldv + [#b10000001 + #b11000011 + #b11100111 + #b01111110 + #b00111100 + #b00011000 + #b00000000 + #b00000000]) + +;;; _ +(provide 'magit-section) +;; Local Variables: +;; read-symbol-shorthands: ( +;; ("and$" . "cond-let--and$") +;; ("and>" . "cond-let--and>") +;; ("and-let" . "cond-let--and-let") +;; ("if-let" . "cond-let--if-let") +;; ("when-let" . "cond-let--when-let") +;; ("while-let" . "cond-let--while-let") +;; ("match-string" . "match-string") +;; ("match-str" . "match-string-no-properties")) +;; End: +;;; magit-section.el ends here diff --git a/.packages/magit-section-20251220.917/magit-section.elc b/.packages/magit-section-20251220.917/magit-section.elc new file mode 100644 index 0000000..26d7e32 Binary files /dev/null and b/.packages/magit-section-20251220.917/magit-section.elc differ diff --git a/.packages/magit-section-20251220.917/magit-section.info b/.packages/magit-section-20251220.917/magit-section.info new file mode 100644 index 0000000..7854469 --- /dev/null +++ b/.packages/magit-section-20251220.917/magit-section.info @@ -0,0 +1,320 @@ +This is magit-section.info, produced by makeinfo version 6.8 from +magit-section.texi. + + Copyright (C) 2015-2025 Jonas Bernoulli + + + You can redistribute this document and/or modify it under the terms + of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) + any later version. + + This document is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + +INFO-DIR-SECTION Emacs +START-INFO-DIR-ENTRY +* Magit-Section: (magit-section). Use Magit sections in your own packages. +END-INFO-DIR-ENTRY + + +File: magit-section.info, Node: Top, Next: Introduction, Up: (dir) + +Magit-Section Developer Manual +****************************** + +This package implements the main user interface of Magit — the +collapsible sections that make up its buffers. This package used to be +distributed as part of Magit but how it can also be used by other +packages that have nothing to do with Magit or Git. + + To learn more about the section abstraction and available commands +and user options see *note (magit)Sections::. This manual documents how +you can use sections in your own packages. + +This manual is for Magit-Section version 4.4.2. + + Copyright (C) 2015-2025 Jonas Bernoulli + + + You can redistribute this document and/or modify it under the terms + of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) + any later version. + + This document is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + +* Menu: + +* Introduction:: +* Creating Sections:: +* Core Functions:: +* Matching Functions:: + + +File: magit-section.info, Node: Introduction, Next: Creating Sections, Prev: Top, Up: Top + +1 Introduction +************** + +This package implements the main user interface of Magit — the +collapsible sections that make up its buffers. This package used to be +distributed as part of Magit but how it can also be used by other +packages that have nothing to do with Magit or Git. + + To learn more about the section abstraction and available commands +and user options see *note (magit)Sections::. This manual documents how +you can use sections in your own packages. + + When the documentation leaves something unaddressed, then please +consider that Magit uses this library extensively and search its source +for suitable examples before asking me for help. Thanks! + + +File: magit-section.info, Node: Creating Sections, Next: Core Functions, Prev: Introduction, Up: Top + +2 Creating Sections +******************* + + -- Macro: magit-insert-section [name] (type &optional value hide) &rest + body + Create a section object of type CLASS, storing VALUE in its ‘value’ + slot, and insert the section at point. CLASS is a subclass of + ‘magit-section’ or has the form ‘(eval FORM)’, in which case FORM + is evaluated at runtime and should return a subclass. In other + places a sections class is often referred to as its "type". + + Many commands behave differently depending on the class of the + current section and sections of a certain class can have their own + keymap, which is specified using the ‘keymap’ class slot. The + value of that slot should be a variable whose value is a keymap. + + For historic reasons Magit and Forge in most cases use symbols as + CLASS that don’t actually identify a class and that lack the + appropriate package prefix. This works due to some undocumented + kludges, which are not available to other packages. + + When optional HIDE is non-‘nil’ collapse the section body by + default, i.e., when first creating the section, but not when + refreshing the buffer. Else expand it by default. This can be + overwritten using ‘magit-section-set-visibility-hook’. When a + section is recreated during a refresh, then the visibility of + predecessor is inherited and HIDE is ignored (but the hook is still + honored). + + BODY is any number of forms that actually insert the section’s + heading and body. Optional NAME, if specified, has to be a symbol, + which is then bound to the object of the section being inserted. + + Before BODY is evaluated the ‘start’ of the section object is set + to the value of ‘point’ and after BODY was evaluated its ‘end’ is + set to the new value of ‘point’; BODY is responsible for moving + ‘point’ forward. + + If it turns out inside BODY that the section is empty, then + ‘magit-cancel-section’ can be used to abort and remove all traces + of the partially inserted section. This can happen when creating a + section by washing Git’s output and Git didn’t actually output + anything this time around. + + -- Function: magit-insert-heading [child-count] &rest args + Insert the heading for the section currently being inserted. + + This function should only be used inside ‘magit-insert-section’. + + When called without any arguments, then just set the ‘content’ slot + of the object representing the section being inserted to a marker + at ‘point’. The section should only contain a single line when + this function is used like this. + + When called with arguments ARGS, which have to be strings, or + ‘nil’, then insert those strings at point. The section should not + contain any text before this happens and afterwards it should again + only contain a single line. If the ‘face’ property is set anywhere + inside any of these strings, then insert all of them unchanged. + Otherwise use the ‘magit-section-heading’ face for all inserted + text. + + The ‘content’ property of the section object is the end of the + heading (which lasts from ‘start’ to ‘content’) and the beginning + of the the body (which lasts from ‘content’ to ‘end’). If the + value of ‘content’ is ‘nil’, then the section has no heading and + its body cannot be collapsed. If a section does have a heading, + then its height must be exactly one line, including a trailing + newline character. This isn’t enforced, you are responsible for + getting it right. The only exception is that this function does + insert a newline character if necessary. + + If provided, optional CHILD-COUNT must evaluate to an integer or + boolean. If ‘t’, then the count is determined once the children + have been inserted, using ‘magit-insert-child-count’ (which see). + For historic reasons, if the heading ends with ":", the count is + substituted for that, at this time as well. If + ‘magit-section-show-child-count’ is ‘nil’, no counts are inserted + + -- Macro: magit-insert-section-body &rest body + Use BODY to insert the section body, once the section is expanded. + If the section is expanded when it is created, then this is like + ‘progn’. Otherwise BODY isn’t evaluated until the section is + explicitly expanded. + + -- Function: magit-cancel-section + Cancel inserting the section that is currently being inserted. + Remove all traces of that section. + + -- Function: magit-wash-sequence function + Repeatedly call FUNCTION until it returns ‘nil’ or the end of the + buffer is reached. FUNCTION has to move point forward or return + ‘nil’. + + +File: magit-section.info, Node: Core Functions, Next: Matching Functions, Prev: Creating Sections, Up: Top + +3 Core Functions +**************** + + -- Function: magit-current-section + Return the section at point or where the context menu was invoked. + When using the context menu, return the section that the user + clicked on, provided the current buffer is the buffer in which the + click occurred. Otherwise return the section at point. + +Function magit-section-at &optional position + Return the section at POSITION, defaulting to point. Default to + point even when the context menu is used. + + -- Function: magit-section-ident section + Return an unique identifier for SECTION. The return value has the + form ‘((TYPE . VALUE)...)’. + + -- Function: magit-section-ident-value value + Return a constant representation of VALUE. + + VALUE is the value of a ‘magit-section’ object. If that is an + object itself, then that is not suitable to be used to identify the + section because two objects may represent the same thing but not be + equal. If possible a method should be added for such objects, + which returns a value that is equal. Otherwise the catch-all + method is used, which just returns the argument itself. + + -- Function: magit-get-section ident &optional root + Return the section identified by IDENT. IDENT has to be a list as + returned by ‘magit-section-ident’. If optional ROOT is non-‘nil’, + then search in that section tree instead of in the one whose root + ‘magit-root-section’ is. + + -- Function: magit-section-lineage section &optional raw + Return the lineage of SECTION. If optional RAW is non-‘nil’, + return a list of section objects, beginning with SECTION, otherwise + return a list of section types. + + -- Function: magit-section-content-p section + Return non-‘nil’ if SECTION has content or an unused washer + function. + + The next two functions are replacements for the Emacs functions that +have the same name except for the ‘magit-’ prefix. Like +‘magit-current-section’ they do not act on point, the cursors position, +but on the position where the user clicked to invoke the context menu. + + If your package provides a context menu and some of its commands act +on the "thing at point", even if just as a default, then use the +prefixed functions to teach them to instead use the click location when +appropriate. + +Function magit-point + Return point or the position where the context menu was invoked. + When using the context menu, return the position the user clicked + on, provided the current buffer is the buffer in which the click + occurred. Otherwise return the same value as ‘point’. + +Function magit-thing-at-point thing &optional no-properties + Return the THING at point or where the context menu was invoked. + When using the context menu, return the thing the user clicked on, + provided the current buffer is the buffer in which the click + occurred. Otherwise return the same value as ‘thing-at-point’. + For the meaning of THING and NO-PROPERTIES see that function. + + +File: magit-section.info, Node: Matching Functions, Prev: Core Functions, Up: Top + +4 Matching Functions +******************** + + -- Function: magit-section-match condition &optional (section + (magit-current-section)) + Return ‘t’ if SECTION matches CONDITION. + + SECTION defaults to the section at point. If SECTION is not + specified and there also is no section at point, then return ‘nil’. + + CONDITION can take the following forms: + + • ‘(CONDITION...)’ matches if any of the CONDITIONs matches. + • ‘[CLASS...]’ matches if the section’s class is the same as the + first CLASS or a subclass of that; the section’s parent class + matches the second CLASS; and so on. + + • ‘[* CLASS...]’ matches sections that match [CLASS...] and also + recursively all their child sections. + • ‘CLASS’ matches if the section’s class is the same as CLASS or + a subclass of that; regardless of the classes of the parent + sections. + + Each CLASS should be a class symbol, identifying a class that + derives from ‘magit-section’. For backward compatibility CLASS can + also be a "type symbol". A section matches such a symbol if the + value of its ‘type’ slot is ‘eq’. If a type symbol has an entry in + ‘magit--section-type-alist’, then a section also matches that type + if its class is a subclass of the class that corresponds to the + type as per that alist. + + Note that it is not necessary to specify the complete section + lineage as printed by ‘magit-describe-section-briefly’, unless of + course you want to be that precise. + + -- Function: magit-section-value-if condition &optional section + If the section at point matches CONDITION, then return its value. + + If optional SECTION is non-‘nil’ then test whether that matches + instead. If there is no section at point and SECTION is ‘nil’, + then return ‘nil’. If the section does not match, then return + ‘nil’. + + See ‘magit-section-match’ for the forms CONDITION can take. + + -- Macro: magit-section-case &rest clauses + Choose among clauses on the type of the section at point. + + Each clause looks like ‘(CONDITION BODY...)’. The type of the + section is compared against each CONDITION; the BODY forms of the + first match are evaluated sequentially and the value of the last + form is returned. Inside BODY the symbol ‘it’ is bound to the + section at point. If no clause succeeds or if there is no section + at point, return ‘nil’. + + See ‘magit-section-match’ for the forms CONDITION can take. + Additionally a CONDITION of ‘t’ is allowed in the final clause, and + matches if no other CONDITION match, even if there is no section at + point. + + + +Tag Table: +Node: Top808 +Node: Introduction2109 +Node: Creating Sections2879 +Node: Core Functions7846 +Node: Matching Functions11021 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/.packages/org-roam-20251125.729/dir b/.packages/org-roam-20251125.729/dir new file mode 100644 index 0000000..738e5fc --- /dev/null +++ b/.packages/org-roam-20251125.729/dir @@ -0,0 +1,18 @@ +This is the file .../info/dir, which contains the +topmost node of the Info hierarchy, called (dir)Top. +The first time you invoke Info you start off looking at this node. + +File: dir, Node: Top This is the top of the INFO tree + + This (the Directory node) gives a menu of major topics. + Typing "q" exits, "H" lists all Info commands, "d" returns here, + "h" gives a primer for first-timers, + "mEmacs" visits the Emacs manual, etc. + + In Emacs, you can click mouse button 2 on a menu item or cross reference + to select it. + +* Menu: + +Emacs +* Org-roam: (org-roam). Roam Research for Emacs. diff --git a/.packages/org-roam-20251125.729/org-roam-autoloads.el b/.packages/org-roam-20251125.729/org-roam-autoloads.el new file mode 100644 index 0000000..7e368b9 --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-autoloads.el @@ -0,0 +1,331 @@ +;;; org-roam-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 org-roam.el + +(autoload 'org-roam-list-files "org-roam" "\ +Return a list of all Org-roam files under `org-roam-directory'. +See `org-roam-file-p' for how each file is determined to be as +part of Org-Roam.") +(register-definition-prefixes "org-roam" '("org-roam-")) + + +;;; Generated autoloads from org-roam-capture.el + +(autoload 'org-roam-capture- "org-roam-capture" "\ +Main entry point of `org-roam-capture' module. +GOTO and KEYS correspond to `org-capture' arguments. +INFO is a plist for filling up Org-roam's capture templates. +NODE is an `org-roam-node' construct containing information about the node. +PROPS is a plist containing additional Org-roam properties for each template. +TEMPLATES is a list of org-roam templates. + +(fn &key GOTO KEYS NODE INFO PROPS TEMPLATES)") +(autoload 'org-roam-capture "org-roam-capture" "\ +Launches an `org-capture' process for a new or existing node. +This uses the templates defined at `org-roam-capture-templates'. +Arguments GOTO and KEYS see `org-capture'. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +The TEMPLATES, if provided, override the list of capture templates (see +`org-roam-capture-'.) +The INFO, if provided, is passed along to the underlying `org-roam-capture-'. + +(fn &optional GOTO KEYS &key FILTER-FN TEMPLATES INFO)" t) +(register-definition-prefixes "org-roam-capture" '("org-roam-capture-")) + + +;;; Generated autoloads from org-roam-compat.el + +(autoload 'org-roam-db-autosync-enable "org-roam-compat" "\ +Activate `org-roam-db-autosync-mode'.") +(make-obsolete 'org-roam-db-autosync-enable 'org-roam-db-autosync-mode "2025-11-23") +(register-definition-prefixes "org-roam-compat" '("org-roam-")) + + +;;; Generated autoloads from org-roam-dailies.el + +(autoload 'org-roam-dailies-capture-today "org-roam-dailies" "\ +Create an entry in the daily-note for today. +When GOTO is non-nil, go the note without creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed. + +(fn &optional GOTO KEYS)" t) +(autoload 'org-roam-dailies-goto-today "org-roam-dailies" "\ +Find the daily-note for today, creating it if necessary. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed. + +(fn &optional KEYS)" t) +(autoload 'org-roam-dailies-capture-tomorrow "org-roam-dailies" "\ +Create an entry in the daily-note for tomorrow. + +With numeric argument N, use the daily-note N days in the future. + +With a `C-u' prefix or when GOTO is non-nil, go the note without +creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed. + +(fn N &optional GOTO KEYS)" t) +(autoload 'org-roam-dailies-goto-tomorrow "org-roam-dailies" "\ +Find the daily-note for tomorrow, creating it if necessary. + +With numeric argument N, use the daily-note N days in the +future. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed. + +(fn N &optional KEYS)" t) +(autoload 'org-roam-dailies-capture-yesterday "org-roam-dailies" "\ +Create an entry in the daily-note for yesteday. + +With numeric argument N, use the daily-note N days in the past. + +When GOTO is non-nil, go the note without creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed. + +(fn N &optional GOTO KEYS)" t) +(autoload 'org-roam-dailies-goto-yesterday "org-roam-dailies" "\ +Find the daily-note for yesterday, creating it if necessary. + +With numeric argument N, use the daily-note N days in the +future. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed. + +(fn N &optional KEYS)" t) +(autoload 'org-roam-dailies-capture-date "org-roam-dailies" "\ +Create an entry in the daily-note for a date using the calendar. +Prefer past dates, unless PREFER-FUTURE is non-nil. +With a `C-u' prefix or when GOTO is non-nil, go the note without +creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed. + +(fn &optional GOTO PREFER-FUTURE KEYS)" t) +(autoload 'org-roam-dailies-goto-date "org-roam-dailies" "\ +Find the daily-note for a date using the calendar, creating it if necessary. +Prefer past dates, unless PREFER-FUTURE is non-nil. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed. + +(fn &optional PREFER-FUTURE KEYS)" t) +(autoload 'org-roam-dailies-find-directory "org-roam-dailies" "\ +Find and open `org-roam-dailies-directory'." t) +(register-definition-prefixes "org-roam-dailies" '("org-roam-dailies-")) + + +;;; Generated autoloads from org-roam-db.el + +(autoload 'org-roam-db-sync "org-roam-db" "\ +Synchronize the cache state with the current Org files on-disk. +If FORCE, force a rebuild of the cache from scratch. + +(fn &optional FORCE)" t) +(defvar org-roam-db-autosync-mode nil "\ +Non-nil if Org-Roam-Db-Autosync mode is enabled. +See the `org-roam-db-autosync-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 `org-roam-db-autosync-mode'.") +(custom-autoload 'org-roam-db-autosync-mode "org-roam-db" nil) +(autoload 'org-roam-db-autosync-mode "org-roam-db" "\ +Global minor mode to keep your Org-roam session automatically synchronized. + +Through the session this will continue to setup your +buffers (that are Org-roam file visiting), keep track of the +related changes, maintain cache consistency and incrementally +update the currently active database. + +If you need to manually trigger resync of the currently active +database, see `org-roam-db-sync' command. + +This is a global minor mode. If called interactively, toggle the +`Org-Roam-Db-Autosync 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 \\='org-roam-db-autosync-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 "org-roam-db" '("emacsql-constraint" "org-roam-db")) + + +;;; Generated autoloads from org-roam-export.el + +(register-definition-prefixes "org-roam-export" '("org-roam-export--org-html--reference")) + + +;;; Generated autoloads from org-roam-graph.el + +(autoload 'org-roam-graph "org-roam-graph" "\ +Build and possibly display a graph for NODE. +ARG may be any of the following values: + - nil show the graph. + - `\\[universal-argument]' show the graph for NODE. + - `\\[universal-argument]' N show the graph for NODE limiting nodes to N steps. + +(fn &optional ARG NODE)" t) +(register-definition-prefixes "org-roam-graph" '("org-roam-")) + + +;;; Generated autoloads from org-roam-id.el + +(autoload 'org-roam-update-org-id-locations "org-roam-id" "\ +Scan Org-roam files to update `org-id' related state. +This is like `org-id-update-id-locations', but will automatically +use the currently bound `org-directory' and `org-roam-directory' +along with DIRECTORIES (if any), where the lookup for files in +these directories will be always recursive. + +Note: Org-roam doesn't have hard dependency on +`org-id-locations-file' to lookup IDs for nodes that are stored +in the database, but it still tries to properly integrates with +`org-id'. This allows the user to cross-reference IDs outside of +the current `org-roam-directory', and also link with \"id:\" +links to headings/files within the current `org-roam-directory' +that are excluded from identification in Org-roam as +`org-roam-node's, e.g. with \"ROAM_EXCLUDE\" property. + +(fn &rest DIRECTORIES)" t) +(register-definition-prefixes "org-roam-id" '("org-roam-id-")) + + +;;; Generated autoloads from org-roam-log.el + +(register-definition-prefixes "org-roam-log" '("org-roam-log-")) + + +;;; Generated autoloads from org-roam-migrate.el + +(autoload 'org-roam-migrate-wizard "org-roam-migrate" "\ +Migrate all notes from to be compatible with Org-roam v2. +1. Convert all notes from v1 format to v2. +2. Rebuild the cache. +3. Replace all file links with ID links." t) +(register-definition-prefixes "org-roam-migrate" '("org-roam-migrate-")) + + +;;; Generated autoloads from org-roam-mode.el + +(autoload 'org-roam-buffer-display-dedicated "org-roam-mode" "\ +Launch NODE dedicated Org-roam buffer. +Unlike the persistent `org-roam-buffer', the contents of this +buffer won't be automatically changed and will be held in place. + +In interactive calls prompt to select NODE, unless called with +`universal-argument', in which case NODE will be set to +`org-roam-node-at-point'. + +(fn NODE)" t) +(register-definition-prefixes "org-roam-mode" '("org-roam-")) + + +;;; Generated autoloads from org-roam-node.el + +(autoload 'org-roam-node-find "org-roam-node" "\ +Find and open an Org-roam node by its title or alias. +INITIAL-INPUT is the initial input for the prompt. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +If OTHER-WINDOW, visit the NODE in another window. +The TEMPLATES, if provided, override the list of capture templates (see +`org-roam-capture-'.) + +(fn &optional OTHER-WINDOW INITIAL-INPUT FILTER-FN PRED &key TEMPLATES)" t) +(autoload 'org-roam-node-random "org-roam-node" "\ +Find and open a random Org-roam node. +With prefix argument OTHER-WINDOW, visit the node in another +window instead. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. + +(fn &optional OTHER-WINDOW FILTER-FN)" t) +(autoload 'org-roam-node-insert "org-roam-node" "\ +Find an Org-roam node and insert (where the point is) an \"id:\" link to it. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +The TEMPLATES, if provided, override the list of capture templates (see +`org-roam-capture-'.) +The INFO, if provided, is passed to the underlying `org-roam-capture-'. + +(fn &optional FILTER-FN &key TEMPLATES INFO)" t) +(autoload 'org-roam-refile "org-roam-node" "\ +Refile node at point to an org-roam NODE. + +If region is active, then use it instead of the node at point. + +(fn NODE)" t) +(autoload 'org-roam-extract-subtree "org-roam-node" "\ +Convert current subtree at point to a node, and extract it into a new file." t) +(autoload 'org-roam-ref-find "org-roam-node" "\ +Find and open an Org-roam node that's dedicated to a specific ref. +INITIAL-INPUT is the initial input to the prompt. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. + +(fn &optional INITIAL-INPUT FILTER-FN)" t) +(register-definition-prefixes "org-roam-node" '("org-roam-")) + + +;;; Generated autoloads from org-roam-overlay.el + +(register-definition-prefixes "org-roam-overlay" '("org-roam-overlay-")) + + +;;; Generated autoloads from org-roam-protocol.el + +(register-definition-prefixes "org-roam-protocol" '("org-roam-")) + + +;;; Generated autoloads from org-roam-utils.el + +(autoload 'org-roam-version "org-roam-utils" "\ +Return `org-roam' version. +Interactively, or when MESSAGE is non-nil, show in the echo area. + +(fn &optional MESSAGE)" t) +(autoload 'org-roam-diagnostics "org-roam-utils" "\ +Collect and print info for `org-roam' issues." t) +(register-definition-prefixes "org-roam-utils" '("org-roam-")) + +;;; End of scraped data + +(provide 'org-roam-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; org-roam-autoloads.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-capture.el b/.packages/org-roam-20251125.729/org-roam-capture.el new file mode 100644 index 0000000..863819b --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-capture.el @@ -0,0 +1,843 @@ +;;; org-roam-capture.el --- Capture functionality -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; 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, 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: +;; +;; This module provides `org-capture' functionality for Org-roam. With this +;; module the user can capture new nodes or capture new content to existing +;; nodes. +;; +;;; Code: +(require 'org-roam) + +;;;; Declarations +(defvar org-end-time-was-given) + +;;; Options +(defcustom org-roam-capture-templates + '(("d" "default" plain "%?" + :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" + "#+title: ${title}\n") + :unnarrowed t)) + "Templates for the creation of new entries within Org-roam. + +Each entry is a list with the following items: + +keys The keys that will select the template, as a string, characters only, for + example \"a\" for a template to be selected with a single key, or + \"bt\" for selection with two keys. When using several keys, keys + using the same prefix must be together in the list and preceded by a + 2-element entry explaining the prefix key, for example: + + (\"b\" \"Templates for marking stuff to buy\") + + The \"C\" key is used by default for quick access to the customization of + the template variable. But if you want to use that key for a template, + you can. + +description A short string describing the template, which will be shown + during selection. + +type The type of entry. Valid types are: + entry an Org node, with a headline. Will be filed + as the child of the target entry or as a + top level entry. Its default template is: + \"* %?\n %a\" + item a plain list item, will be placed in the + first plain list at the target location. + Its default template is: + \"- %?\" + checkitem a checkbox item. This differs from the + plain list item only in so far as it uses a + different default template. Its default + template is: + \"- [ ] %?\" + table-line a new line in the first table at target location. + Its default template is: + \"| %? |\" + plain text to be inserted as it is. + +template The template for creating the capture item. + If it is an empty string or nil, a default template based on + the entry type will be used (see the \"type\" section above). + Instead of a string, this may also be one of: + + (file \"/path/to/template-file\") + (function function-returning-the-template) + + in order to get a template from a file, or dynamically + from a function. + +The template contains a compulsory :target property. The :target property +contains a list, where: + - The first element indicates the type of the target. + - The second element indicates the location of the captured node. + - And the rest of the list indicate the prefilled template, that will be + inserted and the position of the point will be adjusted for. + This behavior varies from type to type. + +The following options are supported for the :target property: + + (file \"path/to/file\") + The file will be created, and prescribed an ID. + + (file+head \"path/to/file\" \"head content\") + The file will be created, prescribed an ID, and head content will be + inserted if the node is a newly captured one. + + (file+olp \"path/to/file\" (\"h1\" \"h2\")) + The file will be created, prescribed an ID. If the file doesn't contain + the outline path (h1, h2), it will be automatically created. The point + will be adjusted to the last element in the OLP. + + (file+head+olp \"path/to/file\" \"head content\" (\"h1\" \"h2\")) + The file will be created, prescribed an ID. Head content will be + inserted at the start of the file if the node is a newly captured one. + If the file doesn't contain the outline path (h1, h2), it will be + automatically created. The point will be adjusted to the last element in + the OLP. + + (file+datetree \"path/to/file\" tree-type) + The file will be created, prescribed an ID. A date based outline path + will be created for today's date. The tree-type can be one of the + following symbols: day, week or month. The point will adjusted to the + last element in the tree. To prompt for date instead of using today's, + use the :time-prompt property. + + (node \"title or alias or ID of an existing node\") + The point will be placed for an existing node, based on either, its + title, alias or ID. + +The rest of the entry is a property list of additional options. Recognized +properties are: + + :prepend Normally newly captured information will be appended at + the target location (last child, last table line, + last list item...). Setting this property will + change that. + + :immediate-finish When set, do not offer to edit the information, just + file it away immediately. This makes sense if the + template only needs information that can be added + automatically. + + :jump-to-captured When set, jump to the captured entry when finished. + + :empty-lines Set this to the number of lines that should be inserted + before and after the new item. Default 0, only common + other value is 1. + + :empty-lines-before Set this to the number of lines that should be inserted + before the new item. Overrides :empty-lines for the + number lines inserted before. + + :empty-lines-after Set this to the number of lines that should be inserted + after the new item. Overrides :empty-lines for the + number of lines inserted after. + + :clock-in Start the clock in this item. + + :clock-keep Keep the clock running when filing the captured entry. + + :clock-resume Start the interrupted clock when finishing the capture. + Note that :clock-keep has precedence over :clock-resume. + When setting both to t, the current clock will run and + the previous one will not be resumed. + + :time-prompt Prompt for a date/time to be used for date/week trees + and when filling the template. + + :tree-type When `week', make a week tree instead of the month-day + tree. When `month', make a month tree instead of the + month-day tree. + + :unnarrowed Do not narrow the target buffer, simply show the + full buffer. Default is to narrow it so that you + only see the new stuff. + + :table-line-pos Specification of the location in the table where the + new line should be inserted. It should be a string like + \"II-3\", meaning that the new line should become the + third line before the second horizontal separator line. + + :kill-buffer If the target file was not yet visited by a buffer when + capture was invoked, kill the buffer again after capture + is finalized. + + :no-save Do not save the target file after finishing the capture. + +The template defines the text to be inserted. Often this is an +Org mode entry (so the first line should start with a star) that +will be filed as a child of the target headline. It can also be +freely formatted text. Furthermore, the following %-escapes will +be replaced with content and expanded: + + %[pathname] Insert the contents of the file given by + `pathname'. These placeholders are expanded at the very + beginning of the process so they can be used to extend the + current template. + %(sexp) Evaluate elisp `(sexp)' and replace it with the results. + Only placeholders pre-existing within the template, or + introduced with %[pathname] are expanded this way. Since this + happens after expanding non-interactive %-escapes, those can + be used to fill the expression. + %<...> The result of `format-time-string' on the ... format + specification. + %t Time stamp, date only. The time stamp is the current time, + except when called from agendas with `\\[org-agenda-capture]' or + with `org-capture-use-agenda-date' set. + %T Time stamp as above, with date and time. + %u, %U Like the above, but inactive time stamps. + %i Initial content, copied from the active region. If + there is text before %i on the same line, such as + indentation, and %i is not inside a %(sexp), that prefix + will be added before every line in the inserted text. + %a Annotation, normally the link created with `org-store-link'. + %A Like %a, but prompt for the description part. + %l Like %a, but only insert the literal link. + %L Like %l, but without brackets (the link content itself). + %c Current kill ring head. + %x Content of the X clipboard. + %k Title of currently clocked task. + %K Link to currently clocked task. + %n User name (taken from the variable `user-full-name'). + %f File visited by current buffer when `org-capture' was called. + %F Full path of the file or directory visited by current buffer. + %:keyword Specific information for certain link types, see below. + %^g Prompt for tags, with completion on tags in target file. + %^G Prompt for tags, with completion on all tags in all agenda files. + %^t Like %t, but prompt for date. Similarly %^T, %^u, %^U. + You may define a prompt like: %^{Please specify birthday}t. + The default date is that of %t, see above. + %^C Interactive selection of which kill or clip to use. + %^L Like %^C, but insert as link. + %^{prop}p Prompt the user for a value for property `prop'. + A default value can be specified like this: + %^{prop|default}p. + %^{prompt} Prompt the user for a string and replace this sequence with it. + A default value and a completion table can be specified like this: + %^{prompt|default|completion2|completion3|...}. + %? After completing the template, position cursor here. + %\\1 ... %\\N Insert the text entered at the nth %^{prompt}, where N + is a number, starting from 1. + +Apart from these general escapes, you can access information specific to +the link type that is created. For example, calling `org-capture' in emails +or in Gnus will record the author and the subject of the message, which you +can access with \"%:from\" and \"%:subject\", respectively. Here is a +complete list of what is recorded for each link type. + +Link type | Available information +------------------------+------------------------------------------------------ +bbdb | %:type %:name %:company +vm, wl, mh, mew, rmail, | %:type %:subject %:message-id +gnus | %:from %:fromname %:fromaddress + | %:to %:toname %:toaddress + | %:fromto (either \"to NAME\" or \"from NAME\") + | %:date %:date-timestamp (as active timestamp) + | %:date-timestamp-inactive (as inactive timestamp) +gnus | %:group, for messages also all email fields +eww, w3, w3m | %:type %:url +info | %:type %:file %:node +calendar | %:type %:date + +When you need to insert a literal percent sign in the template, +you can escape ambiguous cases with a backward slash, e.g., \\%i. + +In addition to all of the above, Org-roam supports additional +substitutions within its templates. \"${foo}\" will look for the +foo property in the Org-roam node (see the `org-roam-node'). If +the property does not exist, the user will be prompted to fill in +the string value. + +Org-roam templates are NOT compatible with regular Org capture: +they rely on additional hacks and hooks to achieve the +streamlined user experience in Org-roam." + :group 'org-roam + :type '(repeat + (choice (list :tag "Multikey description" + (string :tag "Keys ") + (string :tag "Description")) + (list :tag "Template entry" + (string :tag "Keys ") + (string :tag "Description ") + (choice :tag "Capture Type " :value entry + (const :tag "Org entry" entry) + (const :tag "Plain list item" item) + (const :tag "Checkbox item" checkitem) + (const :tag "Plain text" plain) + (const :tag "Table line" table-line)) + (choice :tag "Template " + (string) + (list :tag "File" + (const :format "" file) + (file :tag "Template file")) + (list :tag "Function" + (const :format "" function) + (function :tag "Template function"))) + (plist :inline t + ;; Give the most common options as checkboxes + :options (((const :format "%v " :target) + (choice :tag "Node location" + (list :tag "File" + (const :format "" file) + (string :tag " File")) + (list :tag "File & Head Content" + (const :format "" file+head) + (string :tag " File") + (string :tag " Head Content")) + (list :tag "File & Outline path" + (const :format "" file+olp) + (string :tag " File") + (list :tag "Outline path" + (repeat (string :tag "Headline")))) + (list :tag "File & Head Content & Outline path" + (const :format "" file+head+olp) + (string :tag " File") + (string :tag " Head Content") + (list :tag "Outline path" + (repeat (string :tag "Headline")))))) + ((const :format "%v " :prepend) (const t)) + ((const :format "%v " :immediate-finish) (const t)) + ((const :format "%v " :jump-to-captured) (const t)) + ((const :format "%v " :empty-lines) (const 1)) + ((const :format "%v " :empty-lines-before) (const 1)) + ((const :format "%v " :empty-lines-after) (const 1)) + ((const :format "%v " :clock-in) (const t)) + ((const :format "%v " :clock-keep) (const t)) + ((const :format "%v " :clock-resume) (const t)) + ((const :format "%v " :time-prompt) (const t)) + ((const :format "%v " :tree-type) (const week)) + ((const :format "%v " :unnarrowed) (const t)) + ((const :format "%v " :table-line-pos) (string)) + ((const :format "%v " :kill-buffer) (const t)))))))) + +(defcustom org-roam-capture-new-node-hook nil + "Normal-mode hooks run when a new Org-roam node is created. +The current point is the point of the new node. +The hooks must not move the point." + :group 'org-roam + :type 'hook) + +(defvar org-roam-capture-preface-hook nil + "Hook run when Org-roam tries to determine capture location of the node. +If any hook returns a value (which should be an ID), all hooks +after it are ignored. + +With this hook you can hijack controls over the location of the +node for which the capture process is currently running for, or +use to just perform an arbitrary side effect, e.g. modify the +state related to the capture process. See `org-roam-protocol' and +`org-roam-dailies' as examples for what and how this hook is used +for. + +If you're trying to perform the hijack, it's mandatory for you to: + 1. Set the currently active buffer for editing operations using + `org-capture-target-buffer'. + 2. Place the point in this buffer from where the location starts + from (e.g. if it's a file based node it should be the BOB, + otherwise it should be the position from where the heading + based node starts from). + 3. Return the ID (as a string) of the capturing node. + +If you use this hook for any other purpose, but not the hijack, +it's mandatory that you should return nil as the return value; so +the capture process would be able to setup the capture buffer. + +If you need to do something when you capture new nodes, use +`org-roam-capture-new-node-hook' instead of this hook. + +WARNING: This hook is primarily designed for the usage by the +extensions and packages, and requires understanding of the +internal capture process. If you don't understand it, you should +learn these internals before using this or use it at your own +risk breaking things.") + +;;; Variables + +(defvar org-roam-capture--node nil + "The node passed during an Org-roam capture. +This variable is populated dynamically, and is only non-nil +during the Org-roam capture process.") + +(defvar org-roam-capture--info nil + "A property-list of additional information passed to the Org-roam template. +This variable is populated dynamically, and is only non-nil +during the Org-roam capture process.") + +(defconst org-roam-capture--template-keywords (list :target :id :link-description :call-location + :region) + "Keywords used in `org-roam-capture-templates' specific to Org-roam.") + +;;; Main entry point +;;;###autoload +(cl-defun org-roam-capture- (&key goto keys node info props templates) + "Main entry point of `org-roam-capture' module. +GOTO and KEYS correspond to `org-capture' arguments. +INFO is a plist for filling up Org-roam's capture templates. +NODE is an `org-roam-node' construct containing information about the node. +PROPS is a plist containing additional Org-roam properties for each template. +TEMPLATES is a list of org-roam templates." + (let* ((props (plist-put props :call-location (point-marker))) + (org-capture-templates + (mapcar (lambda (template) + (org-roam-capture--convert-template template props)) + (or templates org-roam-capture-templates))) + (_ (setf (org-roam-node-id node) (or (org-roam-node-id node) + (org-id-new)))) + (org-roam-capture--node node) + (org-roam-capture--info info)) + (when (and (not keys) + (= (length org-capture-templates) 1)) + (setq keys (caar org-capture-templates))) + (org-capture goto keys))) + +;;;###autoload +(cl-defun org-roam-capture (&optional goto keys &key filter-fn templates info) + "Launches an `org-capture' process for a new or existing node. +This uses the templates defined at `org-roam-capture-templates'. +Arguments GOTO and KEYS see `org-capture'. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +The TEMPLATES, if provided, override the list of capture templates (see +`org-roam-capture-'.) +The INFO, if provided, is passed along to the underlying `org-roam-capture-'." + (interactive "P") + (let ((node (org-roam-node-read nil filter-fn))) + (org-roam-capture- :goto goto + :info info + :keys keys + :templates templates + :node node + :props '(:immediate-finish nil)))) + +;;; Capture process +(defun org-roam-capture-p () + "Return t if the current capture process is an Org-roam capture. +This function is to only be called when `org-capture-plist' is +valid for the capture (i.e. initialization, and finalization of +the capture)." + (plist-get org-capture-plist :org-roam)) + +(defun org-roam-capture--get (keyword) + "Get the value for KEYWORD from the `org-roam-capture-template'." + (plist-get (plist-get org-capture-plist :org-roam) keyword)) + +(defun org-roam-capture--put (prop value) + "Set property PROP to VALUE in the `org-roam-capture-template'." + (let ((p (plist-get org-capture-plist :org-roam))) + (setq org-capture-plist + (plist-put org-capture-plist + :org-roam + (plist-put p prop value))))) + +;;;; Capture target +(defun org-roam-capture--prepare-buffer () + "Prepare the capture buffer for the current Org-roam based capture template. +This function will initialize and setup the capture buffer, +position the point to the current :target (and if necessary, +create it if it doesn't exist), and place the point for further +processing by `org-capture'. + +Note: During the capture process this function is run by +`org-capture-set-target-location', as a (function ...) based +capture target." + (if-let* ((id (run-hook-with-args-until-success 'org-roam-capture-preface-hook))) + (org-roam-capture--put :id id) + (org-roam-capture--setup-target-location) + ;; Adjust point for plain captures to skip past metadata (e.g. properties drawer) + (org-roam-capture--adjust-point-for-capture-type)) + (let ((template (org-capture-get :template))) + (when (stringp template) + (org-capture-put + :template + (org-roam-capture--fill-template template)))) + (org-roam-capture--put :finalize (or (org-capture-get :finalize) + (org-roam-capture--get :finalize)))) + +(defun org-roam-capture--setup-target-location () + "Initialize the buffer, and goto the location of the new capture." + (let ((target-entry-p t) + p new-file-p id) + (pcase (org-roam-capture--get-target) + (`(file ,path) + (setq path (org-roam-capture--target-truepath path) + new-file-p (org-roam-capture--new-file-p path)) + (when new-file-p (org-roam-capture--put :new-file path)) + (set-buffer (org-capture-target-buffer path)) + (widen) + (setq p (goto-char (point-min)) + target-entry-p nil)) + (`(file+olp ,path ,olp) + (setq path (org-roam-capture--target-truepath path) + new-file-p (org-roam-capture--new-file-p path)) + (when new-file-p (org-roam-capture--put :new-file path)) + (set-buffer (org-capture-target-buffer path)) + (setq p (point-min)) + (let ((m (org-roam-capture-find-or-create-olp olp))) + (goto-char m)) + (widen)) + (`(file+head ,path ,head) + (setq path (org-roam-capture--target-truepath path) + new-file-p (org-roam-capture--new-file-p path)) + (set-buffer (org-capture-target-buffer path)) + (when new-file-p + (org-roam-capture--put :new-file path) + (insert (org-roam-capture--fill-template head 'ensure-newline)) + (setq p (point-max))) + (widen) + (unless new-file-p + (setq p (goto-char (point-min)))) + (setq target-entry-p nil)) + (`(file+head+olp ,path ,head ,olp) + (setq path (org-roam-capture--target-truepath path) + new-file-p (org-roam-capture--new-file-p path)) + (set-buffer (org-capture-target-buffer path)) + (widen) + (when new-file-p + (org-roam-capture--put :new-file path) + (insert (org-roam-capture--fill-template head 'ensure-newline))) + (setq p (point-min)) + (let ((m (org-roam-capture-find-or-create-olp olp))) + (goto-char m))) + (`(file+datetree ,path ,tree-type) + (setq path (org-roam-capture--target-truepath path)) + (require 'org-datetree) + (widen) + (set-buffer (org-capture-target-buffer path)) + (unless (file-exists-p path) + (org-roam-capture--put :new-file path)) + (funcall + (pcase tree-type + (`week #'org-datetree-find-iso-week-create) + (`month #'org-datetree-find-month-create) + (_ #'org-datetree-find-date-create)) + (calendar-gregorian-from-absolute + (cond + (org-overriding-default-time + ;; Use the overriding default time. + (time-to-days org-overriding-default-time)) + ((org-capture-get :default-time) + (time-to-days (org-capture-get :default-time))) + ((org-capture-get :time-prompt) + ;; Prompt for date. Bind `org-end-time-was-given' so + ;; that `org-read-date-analyze' handles the time range + ;; case and returns `prompt-time' with the start value. + (let* ((org-time-was-given nil) + (org-end-time-was-given nil) + (prompt-time (org-read-date + nil t nil "Date for tree entry:"))) + (org-capture-put + :default-time + (if (or org-time-was-given + (= (time-to-days prompt-time) (org-today))) + prompt-time + ;; Use 00:00 when no time is given for another + ;; date than today? + (apply #'encode-time 0 0 + org-extend-today-until + (cl-cdddr (decode-time prompt-time))))) + (time-to-days prompt-time))) + (t + ;; Current date, possibly corrected for late night + ;; workers. + (org-today))))) + (setq p (point))) + (`(node ,title-or-id) + ;; first try to get ID, then try to get title/alias + (let ((node (or (org-roam-node-from-id title-or-id) + (org-roam-node-from-title-or-alias title-or-id) + (user-error "No node with title or id \"%s\"" title-or-id)))) + (set-buffer (org-capture-target-buffer (org-roam-node-file node))) + (goto-char (org-roam-node-point node)) + (setq p (org-roam-node-point node) + target-entry-p (and (derived-mode-p 'org-mode) (org-at-heading-p)))))) + ;; Setup `org-id' for the current capture target and return it back to the + ;; caller. + ;; Unless it's an entry type, then we want to create an ID for the entry instead + (pcase (org-capture-get :type) + ('entry + (advice-add #'org-capture-place-entry :after #'org-roam-capture--create-id-for-entry) + (org-roam-capture--put :new-node-p t) + (setq id (org-roam-node-id org-roam-capture--node))) + (_ + (save-excursion + (goto-char p) + (unless (org-entry-get p "ID") + (org-roam-capture--put :new-node-p t)) + (setq id (or (org-entry-get p "ID") + (org-roam-node-id org-roam-capture--node))) + (setf (org-roam-node-id org-roam-capture--node) id) + (org-entry-put p "ID" id)))) + (org-roam-capture--put :id id) + (org-roam-capture--put :target-entry-p target-entry-p) + (advice-add #'org-capture-place-template :before #'org-roam-capture--set-target-entry-p-a) + (advice-add #'org-capture-place-template :after #'org-roam-capture-run-new-node-hook-a))) + +(defun org-roam-capture--set-target-entry-p-a (_) + "Correct `:target-entry-p' in Org-capture template based on `:target.'." + (org-capture-put :target-entry-p (org-roam-capture--get :target-entry-p)) + (advice-remove #'org-capture-place-template #'org-roam-capture--set-target-entry-p-a)) + +(defun org-roam-capture-run-new-node-hook-a (_) + "Advice to run after the Org-capture template is placed." + (when (org-roam-capture--get :new-node-p) + (run-hooks 'org-roam-capture-new-node-hook)) + (advice-remove #'org-capture-place-template #'org-roam-capture-run-new-node-hook-a)) + +(defun org-roam-capture--create-id-for-entry () + "Create the ID for the new entry." + (org-entry-put (point) "ID" (org-roam-capture--get :id)) + (advice-remove #'org-capture-place-entry #'org-roam-capture--create-id-for-entry)) + +(defun org-roam-capture--get-target () + "Get the current capture :target for the capture template in use." + (or (org-roam-capture--get :target) + (user-error "Template needs to specify `:target'"))) + +(defun org-roam-capture--target-truepath (path) + "From PATH get the correct path to the current capture target and return it. +PATH is a string that can optionally contain templated text in +it." + (or (org-roam-node-file org-roam-capture--node) + (thread-first + path + (org-roam-capture--fill-template) + (string-trim) + (expand-file-name org-roam-directory)))) + +(defun org-roam-capture--new-file-p (path) + "Return t if PATH is for a new file with no visiting buffer." + (not (or (file-exists-p path) + (org-find-base-buffer-visiting path)))) + +(defun org-roam-capture-find-or-create-olp (olp) + "Return a marker pointing to the entry at OLP in the current buffer. +If OLP does not exist, create it. If anything goes wrong, throw +an error, and if you need to do something based on this error, +you can catch it with `condition-case'." + (let* ((level 1) + (lmin 1) + (lmax 1) + (start (point-min)) + (end (point-max)) + found flevel) + (unless (derived-mode-p 'org-mode) + (error "Buffer %s needs to be in Org mode" (current-buffer))) + (org-with-wide-buffer + (goto-char start) + (dolist (heading olp) + (setq heading (org-roam-capture--fill-template heading)) + (let ((re (format org-complex-heading-regexp-format + (regexp-quote heading))) + (cnt 0)) + (while (re-search-forward re end t) + (setq level (- (match-end 1) (match-beginning 1))) + (when (and (>= level lmin) (<= level lmax)) + (setq found (match-beginning 0) flevel level cnt (1+ cnt)))) + (when (> cnt 1) + (error "Heading not unique on level %d: %s" lmax heading)) + (when (= cnt 0) + ;; Create heading if it doesn't exist + (goto-char end) + (unless (bolp) (newline)) + (let (org-insert-heading-respect-content) + (org-insert-heading nil nil t)) + (unless (= lmax 1) + (dotimes (_ level) (org-do-demote))) + (insert heading) + (setq end (point)) + (goto-char start) + (while (re-search-forward re end t) + (setq level (- (match-end 1) (match-beginning 1))) + (when (and (>= level lmin) (<= level lmax)) + (setq found (match-beginning 0) flevel level cnt (1+ cnt)))))) + (goto-char found) + (setq lmin (1+ flevel) lmax (+ lmin (if org-odd-levels-only 1 0))) + (setq start found + end (save-excursion (org-end-of-subtree t t)))) + (point-marker)))) + +(defun org-roam-capture--adjust-point-for-capture-type (&optional pos) + "Reposition the point for template insertion dependently on the capture type. +Return the newly adjusted position of `point'. + +POS is the current position of point (an integer) inside the +currently active capture buffer, where the adjustment should +start to begin from. If it's nil, then it will default to +the current value of `point'." + (goto-char (or pos (point))) + (pcase (org-capture-get :type) + (`plain + (if (org-capture-get :prepend) + (let ((el (org-element-at-point))) + (while (and (not (eobp)) + (memq (org-element-type el) + '(drawer property-drawer keyword comment comment-block horizontal-rule))) + (goto-char (org-element-property :end el)) + (setq el (org-element-at-point)))) + (goto-char (org-entry-end-position))))) + (point)) + +;;; Capture implementation +(add-hook 'org-roam-capture-preface-hook #'org-roam-capture--try-capture-to-ref-h) +(defun org-roam-capture--try-capture-to-ref-h () + "Try to capture to an existing node that match the ref." + (when-let* ((node (and (plist-get org-roam-capture--info :ref) + (org-roam-node-from-ref + (plist-get org-roam-capture--info :ref))))) + (set-buffer (org-capture-target-buffer (org-roam-node-file node))) + (goto-char (org-roam-node-point node)) + (widen) + (org-roam-node-id node))) + +(add-hook 'org-roam-capture-new-node-hook #'org-roam-capture--insert-captured-ref-h) +(defun org-roam-capture--insert-captured-ref-h () + "Insert the ref if any." + (when-let* ((ref (plist-get org-roam-capture--info :ref))) + (org-roam-ref-add ref))) + +;;;; Finalizers +(add-hook 'org-capture-prepare-finalize-hook #'org-roam-capture--install-finalize-h) +(defun org-roam-capture--install-finalize-h () + "Install `org-roam-capture--finalize' if the capture is an Org-roam capture." + (when (org-roam-capture-p) + (add-hook 'org-capture-after-finalize-hook #'org-roam-capture--finalize))) + +(defun org-roam-capture--finalize () + "Finalize the `org-roam-capture' process." + (if org-note-abort + (when-let* ((new-file (org-roam-capture--get :new-file)) + (_ (yes-or-no-p "Delete file for aborted capture?"))) + (when (find-buffer-visiting new-file) + (kill-buffer (find-buffer-visiting new-file))) + (delete-file new-file)) + (when-let* ((buffer (plist-get org-capture-plist :buffer)) + (file (buffer-file-name buffer))) + (org-id-add-location (org-roam-capture--get :id) file)) + (when-let* ((finalize (org-roam-capture--get :finalize)) + (org-roam-finalize-fn (intern (concat "org-roam-capture--finalize-" + (symbol-name finalize))))) + (if (functionp org-roam-finalize-fn) + (funcall org-roam-finalize-fn) + (funcall finalize)))) + (remove-hook 'org-capture-after-finalize-hook #'org-roam-capture--finalize)) + +(defun org-roam-capture--finalize-find-file () + "Visit the buffer after Org-capture is done. +This function is to be called in the Org-capture finalization process. +ID is unused." + (switch-to-buffer (org-capture-get :buffer))) + +(defun org-roam-capture--finalize-insert-link () + "Insert a link to ID into the buffer where Org-capture was called. +ID is the Org id of the newly captured content. +This function is to be called in the Org-capture finalization process." + (when-let* ((mkr (org-roam-capture--get :call-location)) + (buf (marker-buffer mkr))) + (with-current-buffer buf + (when-let* ((region (org-roam-capture--get :region))) + (delete-region (car region) (cdr region)) + (set-marker (car region) nil) + (set-marker (cdr region) nil)) + (let* ((id (org-roam-capture--get :id)) + (description (org-roam-capture--get :link-description)) + (link (org-link-make-string (concat "id:" id) + description))) + (if (eq (point) (marker-position mkr)) + (insert link) + (org-with-point-at mkr + (insert link))) + (run-hook-with-args 'org-roam-post-node-insert-hook + id + description))))) + +;;;; Processing of the capture templates +(defun org-roam-capture--fill-template (template &optional ensure-newline) + "Expand TEMPLATE and return it. +It expands ${var} occurrences in TEMPLATE, and then runs +org-capture's template expansion. +When ENSURE-NEWLINE, always ensure there's a newline behind." + (let* ((template (if (functionp template) + (funcall template) + template)) + (template-whitespace-content (org-roam-whitespace-content template))) + (setq template + (org-roam-format-template + template + (lambda (key default-val) + (let ((fn (intern key)) + (node-fn (intern (concat "org-roam-node-" key))) + (ksym (intern (concat ":" key)))) + (cond + ((fboundp fn) + (funcall fn org-roam-capture--node)) + ((fboundp node-fn) + (funcall node-fn org-roam-capture--node)) + ((plist-get org-roam-capture--info ksym) + (plist-get org-roam-capture--info ksym)) + (t (let ((r (read-from-minibuffer (format "%s: " key) default-val))) + (plist-put org-roam-capture--info ksym r) + r))))))) + ;; WARNING: + ;; `org-capture-fill-template' fills the template, but post-processes whitespace such that the resultant + ;; template does not start with any whitespace, and only ends with a single newline + ;; + ;; Instead, we restore the whitespace in the original template. + (setq template (replace-regexp-in-string "[\n]*\\'" "" (org-capture-fill-template template))) + (when (and ensure-newline + (string-equal template-whitespace-content "")) + (setq template-whitespace-content "\n")) + (setq template (concat template template-whitespace-content)) + template)) + +(defun org-roam-capture--convert-template (template &optional props) + "Convert TEMPLATE from Org-roam syntax to `org-capture-templates' syntax. +PROPS is a plist containing additional Org-roam specific +properties to be added to the template." + (pcase template + (`(,_key ,_desc) + template) + ((or `(,key ,desc ,type ignore ,body . ,rest) + `(,key ,desc ,type (function ignore) ,body . ,rest) + `(,key ,desc ,type ,body . ,rest)) + (setq rest (append rest props)) + (let (org-roam-plist options) + (while rest + (let* ((key (pop rest)) + (val (pop rest)) + (custom (member key org-roam-capture--template-keywords))) + (when (and custom + (not val)) + (user-error "Invalid capture template format: %s\nkey %s cannot be nil" template key)) + (if custom + (setq org-roam-plist (plist-put org-roam-plist key val)) + (setq options (plist-put options key val))))) + (append `(,key ,desc ,type #'org-roam-capture--prepare-buffer ,body) + options + (list :org-roam org-roam-plist)))) + (_ + (signal 'invalid-template template)))) + + +(provide 'org-roam-capture) + +;;; org-roam-capture.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-capture.elc b/.packages/org-roam-20251125.729/org-roam-capture.elc new file mode 100644 index 0000000..9243173 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-capture.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-compat.el b/.packages/org-roam-20251125.729/org-roam-compat.el new file mode 100644 index 0000000..46879b5 --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-compat.el @@ -0,0 +1,255 @@ +;;; org-roam-compat.el --- Backward compatibility code -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; 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, 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: +;; +;; This file is dedicated to maintain backward compatibility with older older +;; Emacsen and Org-roam versions. +;; +;;; Code: +(require 'org-roam) + +;;; Backports +;; REVIEW Remove when 26.x support is dropped. This is exact the same as +;; `directory-files-recursively' from Emacs 26, but with FOLLOW-SYMLINKS +;; parameter from Emacs 27. +(defun org-roam--directory-files-recursively (dir regexp + &optional include-directories predicate + follow-symlinks) + "Return list of all files under directory DIR whose names match REGEXP. +This function works recursively. Files are returned in \"depth +first\" order, and files from each directory are sorted in +alphabetical order. Each file name appears in the returned list +in its absolute form. + +By default, the returned list excludes directories, but if +optional argument INCLUDE-DIRECTORIES is non-nil, they are +included. + +PREDICATE can be either nil (which means that all subdirectories +of DIR are descended into), t (which means that subdirectories that +can't be read are ignored), or a function (which is called with +the name of each subdirectory, and should return non-nil if the +subdirectory is to be descended into). + +If FOLLOW-SYMLINKS is non-nil, symbolic links that point to +directories are followed. Note that this can lead to infinite +recursion." + (let* ((result nil) + (files nil) + (dir (directory-file-name dir)) + ;; When DIR is "/", remote file names like "/method:" could + ;; also be offered. We shall suppress them. + (tramp-mode (and tramp-mode (file-remote-p (expand-file-name dir))))) + (dolist (file (sort (file-name-all-completions "" dir) + 'string<)) + (unless (member file '("./" "../")) + (if (directory-name-p file) + (let* ((leaf (substring file 0 (1- (length file)))) + (full-file (concat dir "/" leaf))) + ;; Don't follow symlinks to other directories. + (when (and (or (not (file-symlink-p full-file)) + (and (file-symlink-p full-file) + follow-symlinks)) + ;; Allow filtering subdirectories. + (or (eq predicate nil) + (eq predicate t) + (funcall predicate full-file))) + (let ((sub-files + (if (eq predicate t) + (condition-case nil + (org-roam--directory-files-recursively + full-file regexp include-directories + predicate follow-symlinks) + (file-error nil)) + (org-roam--directory-files-recursively + full-file regexp include-directories + predicate follow-symlinks)))) + (setq result (nconc result sub-files)))) + (when (and include-directories + (string-match regexp leaf)) + (setq result (nconc result (list full-file))))) + (when (string-match regexp file) + (push (concat dir "/" file) files))))) + (nconc result (nreverse files)))) + +;;; Compatibility hacks and patches +(advice-add #'org-id-add-location :around #'org-roam--handle-absent-org-id-locations-file-a) +(defun org-roam--handle-absent-org-id-locations-file-a (fn &rest args) + "Gracefully handle errors related to absence of `org-id-locations-file'. +FN is `org-id-add-location' that comes from advice and ARGS are +passed to it." + (condition-case err + (apply fn args) + ;; `org-id' makes the assumption that `org-id-locations-file' will be stored in `user-emacs-directory' + ;; which always exist if you have Emacs, so it uses `with-temp-file' to write to the file. However, the + ;; users *do* change the path to this file and `with-temp-file' unable to create the file, if the path to + ;; it consists of directories that don't exist. We'll have to handle this ourselves. + (error + (advice-remove 'org-id-add-location #'org-roam--handle-absent-org-id-locations-file-a) + (if (file-exists-p (file-truename org-id-locations-file)) + (signal (car err) (cdr err)) + ;; Pre-allocate the hash table to avoid weird access related errors during the regeneration. + (or org-id-locations (setq org-id-locations (make-hash-table :test 'equal))) + ;; If permissions allow that, try to create the user specified directory path to + ;; `org-id-locations-file' ourselves. + (condition-case _err + (progn (org-roam-message (concat "`org-id-locations-file' (%s) doesn't exist. " + "Trying to regenerate it (this may take a while)...") + org-id-locations-file) + (make-directory (file-name-directory (file-truename org-id-locations-file))) + (org-roam-update-org-id-locations) + (apply fn args)) + ;; In case of failure (lack of permissions), we'll patch it to at least handle the current session + ;; without errors. + (file-error (org-roam-message "Failed to regenerate `org-id-locations-file'") + (lwarn 'org-roam :error " +-------- +WARNING: `org-id-locations-file' (%s) doesn't exist! + Org-roam is unable to create it for you. +-------- + +This happens when Emacs doesn't have permissions to create the +path to your `org-id-locations-file'. Org-roam will now fallback +storing the file in your current `org-roam-directory', but the +warning will keep popup with each new session. + +To stop this warning from popping up, set `org-id-locations-file' +to the location you want and ensure that the path exists on your +filesystem, then run M-x `org-roam-update-org-id-locations'. + +Note: While Org-roam doesn't depend on `org-id-locations-file' to +lookup IDs for the nodes that are stored in the database, it +still tries to keep it updated so IDs work across other files in +Org-mode, so the IDs used in your `org-roam-directory' would be +able to cross-reference outside of `org-roam-directory'. It also +allows to keep linking with \"id:\" links within the current +`org-roam-directory' to headings and files that are excluded from +identification (e.g. with \"ROAM_EXCLUDE\" property) as Org-roam +nodes." org-id-locations-file) + (setq org-id-locations-file + (expand-file-name ".orgids" (file-truename org-roam-directory))) + (apply fn args))))))) + +;;;; Deprecated :if-new capture template keyword +(with-eval-after-load 'org-roam-capture + (add-to-list 'org-roam-capture--template-keywords :if-new) + + (let ((inhibit-warning-p t)) ; REVIEW Set this to nil close to next major release + (advice-add 'org-roam-capture--get-target :around #'org-roam-capture--get-if-new-target-a) + (defun org-roam-capture--get-if-new-target-a (fn &rest args) + "Get the current capture target using deprecated :if-new property." + (if-let* ((target (org-roam-capture--get :if-new))) + (prog1 target + (unless inhibit-warning-p + (lwarn 'org-roam-capture :warning + (mapconcat + #'identity + ["`:if-new' property is deprecated in favor of `:target'." + "This warning will popup once per each session. In order to get" + "rid of it, rename all the references to the `:if-new' property" + "in your capture templates to `:target'."] + "\n")) + ;; Don't irritate the user too much. Displaying the warning once per session should be enough. + (setq inhibit-warning-p t))) + (apply fn args))))) + +;;; Obsolete aliases (remove after next major release) +(define-obsolete-function-alias + 'org-roam-setup + 'org-roam-db-autosync-enable "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-teardown + 'org-roam-db-autosync-disable "org-roam 2.0") + +(define-obsolete-variable-alias + 'org-roam-current-node + 'org-roam-buffer-current-node "org-roam 2.0") +(define-obsolete-variable-alias + 'org-roam-current-directory + 'org-roam-buffer-current-directory "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-buffer-render + 'org-roam-buffer-render-contents "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-buffer + 'org-roam-buffer-display-dedicated "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-visit-thing + 'org-roam-buffer-visit-thing "org-roam 2.0") + +(define-obsolete-function-alias + 'org-roam-dailies-find-today + 'org-roam-dailies-goto-today "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-dailies-find-yesterday + 'org-roam-dailies-goto-yesterday "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-dailies-find-tomorrow + 'org-roam-dailies-goto-tomorrow "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-dailies-find-next-note + 'org-roam-dailies-goto-next-note "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-dailies-find-previous-note + 'org-roam-dailies-goto-previous-note "org-roam 2.0") +(define-obsolete-function-alias + 'org-roam-dailies-find-date + 'org-roam-dailies-goto-date "org-roam 2.0") + +(define-obsolete-function-alias + 'org-roam-add-property + 'org-roam-property-add "org-roam 2.1") + +(define-obsolete-function-alias + 'org-roam-remove-property + 'org-roam-property-remove "org-roam 2.1") + +(define-obsolete-variable-alias + 'org-roam-mode-section-functions + 'org-roam-mode-sections "org-roam 2.2.0") + +(define-obsolete-function-alias + 'org-roam-dolist-with-progress + 'dolist-with-progress-reporter "2025-11-07") + +;;; Obsolete functions +(make-obsolete 'org-roam-get-keyword 'org-collect-keywords "org-roam 2.0") + +;;;###autoload +(defun org-roam-db-autosync-enable () + "Activate `org-roam-db-autosync-mode'." + (declare (obsolete org-roam-db-autosync-mode "2025-11-23")) + (org-roam-db-autosync-mode +1)) + +(defun org-roam-db-autosync-disable () + "Deactivate `org-roam-db-autosync-mode'." + (declare (obsolete org-roam-db-autosync-mode "2025-11-23")) + (org-roam-db-autosync-mode -1)) + +(defun org-roam-db-autosync-toggle () + "Toggle `org-roam-db-autosync-mode' enabled/disabled." + (declare (obsolete org-roam-db-autosync-mode "2025-11-23")) + (org-roam-db-autosync-mode 'toggle)) + +(provide 'org-roam-compat) + +;;; org-roam-compat.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-compat.elc b/.packages/org-roam-20251125.729/org-roam-compat.elc new file mode 100644 index 0000000..6410782 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-compat.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-dailies.el b/.packages/org-roam-20251125.729/org-roam-dailies.el new file mode 100644 index 0000000..d7bf60e --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-dailies.el @@ -0,0 +1,366 @@ +;;; org-roam-dailies.el --- Daily-notes for Org-roam -*- coding: utf-8; lexical-binding: t; -*- +;;; +;; Copyright © 2020-2025 Jethro Kuan +;; Copyright © 2020 Leo Vivier + +;; Author: Jethro Kuan +;; Leo Vivier +;; URL: https://github.com/org-roam/org-roam +;; Keywords: org-mode, roam, convenience +;; Package-Requires: ((emacs "26.1") (dash "2.13") (org-roam "2.1")) + +;; 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, 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: +;; +;; This extension provides functionality for creating daily-notes, or shortly +;; "dailies". Dailies implemented here as a unique node per unique file, where +;; each file named after certain date and stored in `org-roam-dailies-directory'. +;; +;; One can use dailies for various purposes, e.g. journaling, fleeting notes, +;; scratch notes or whatever else you can think of. +;; +;;; Code: +(require 'dash) +(require 'org-roam) + +;;; Faces +(defface org-roam-dailies-calendar-note + '((t :inherit (org-link) :underline nil)) + "Face for dates with a daily-note in the calendar." + :group 'org-roam-faces) + +;;; Options +(defcustom org-roam-dailies-directory "daily/" + "Path to daily-notes. +This path is relative to `org-roam-directory'." + :group 'org-roam + :type 'string) + +(defcustom org-roam-dailies-find-file-hook nil + "Hook that is run right after navigating to a daily-note." + :group 'org-roam + :type 'hook) + +(defcustom org-roam-dailies-capture-templates + `(("d" "default" entry + "* %?" + :target (file+head "%<%Y-%m-%d>.org" + "#+title: %<%Y-%m-%d>\n"))) + "Capture templates for daily-notes in Org-roam. +Note that for daily files to show up in the calendar, they have to be of format +\"org-time-string.org\". +See `org-roam-capture-templates' for the template documentation." + :group 'org-roam + :type '(repeat + (choice (list :tag "Multikey description" + (string :tag "Keys ") + (string :tag "Description")) + (list :tag "Template entry" + (string :tag "Keys ") + (string :tag "Description ") + (choice :tag "Capture Type " :value entry + (const :tag "Org entry" entry) + (const :tag "Plain list item" item) + (const :tag "Checkbox item" checkitem) + (const :tag "Plain text" plain) + (const :tag "Table line" table-line)) + (choice :tag "Template " + (string) + (list :tag "File" + (const :format "" file) + (file :tag "Template file")) + (list :tag "Function" + (const :format "" function) + (function :tag "Template function"))) + (plist :inline t + ;; Give the most common options as checkboxes + :options (((const :format "%v " :target) + (choice :tag "Node location" + (list :tag "File" + (const :format "" file) + (string :tag " File")) + (list :tag "File & Head Content" + (const :format "" file+head) + (string :tag " File") + (string :tag " Head Content")) + (list :tag "File & Outline path" + (const :format "" file+olp) + (string :tag " File") + (list :tag "Outline path" + (repeat (string :tag "Headline")))) + (list :tag "File & Head Content & Outline path" + (const :format "" file+head+olp) + (string :tag " File") + (string :tag " Head Content") + (list :tag "Outline path" + (repeat (string :tag "Headline")))))) + ((const :format "%v " :prepend) (const t)) + ((const :format "%v " :immediate-finish) (const t)) + ((const :format "%v " :jump-to-captured) (const t)) + ((const :format "%v " :empty-lines) (const 1)) + ((const :format "%v " :empty-lines-before) (const 1)) + ((const :format "%v " :empty-lines-after) (const 1)) + ((const :format "%v " :clock-in) (const t)) + ((const :format "%v " :clock-keep) (const t)) + ((const :format "%v " :clock-resume) (const t)) + ((const :format "%v " :time-prompt) (const t)) + ((const :format "%v " :tree-type) (const week)) + ((const :format "%v " :unnarrowed) (const t)) + ((const :format "%v " :table-line-pos) (string)) + ((const :format "%v " :kill-buffer) (const t)))))))) + +;;; Commands +;;;; Today +;;;###autoload +(defun org-roam-dailies-capture-today (&optional goto keys) + "Create an entry in the daily-note for today. +When GOTO is non-nil, go the note without creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (interactive "P") + (org-roam-dailies--capture (current-time) goto keys)) + +;;;###autoload +(defun org-roam-dailies-goto-today (&optional keys) + "Find the daily-note for today, creating it if necessary. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (interactive) + (org-roam-dailies-capture-today t keys)) + +;;;; Tomorrow +;;;###autoload +(defun org-roam-dailies-capture-tomorrow (n &optional goto keys) + "Create an entry in the daily-note for tomorrow. + +With numeric argument N, use the daily-note N days in the future. + +With a `C-u' prefix or when GOTO is non-nil, go the note without +creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (interactive "p") + (org-roam-dailies--capture (time-add (* n 86400) (current-time)) goto keys)) + +;;;###autoload +(defun org-roam-dailies-goto-tomorrow (n &optional keys) + "Find the daily-note for tomorrow, creating it if necessary. + +With numeric argument N, use the daily-note N days in the +future. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (interactive "p") + (org-roam-dailies-capture-tomorrow n t keys)) + +;;;; Yesterday +;;;###autoload +(defun org-roam-dailies-capture-yesterday (n &optional goto keys) + "Create an entry in the daily-note for yesteday. + +With numeric argument N, use the daily-note N days in the past. + +When GOTO is non-nil, go the note without creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (interactive "p") + (org-roam-dailies-capture-tomorrow (- n) goto keys)) + +;;;###autoload +(defun org-roam-dailies-goto-yesterday (n &optional keys) + "Find the daily-note for yesterday, creating it if necessary. + +With numeric argument N, use the daily-note N days in the +future. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (interactive "p") + (org-roam-dailies-capture-tomorrow (- n) t keys)) + +;;;; Date +;;;###autoload +(defun org-roam-dailies-capture-date (&optional goto prefer-future keys) + "Create an entry in the daily-note for a date using the calendar. +Prefer past dates, unless PREFER-FUTURE is non-nil. +With a `C-u' prefix or when GOTO is non-nil, go the note without +creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (interactive "P") + (let ((time (let ((org-read-date-prefer-future prefer-future)) + (org-read-date nil t nil (if goto + "Find daily-note: " + "Capture to daily-note: "))))) + (org-roam-dailies--capture time goto keys))) + +;;;###autoload +(defun org-roam-dailies-goto-date (&optional prefer-future keys) + "Find the daily-note for a date using the calendar, creating it if necessary. +Prefer past dates, unless PREFER-FUTURE is non-nil. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (interactive) + (org-roam-dailies-capture-date t prefer-future keys)) + +;;;; Navigation +(defun org-roam-dailies-goto-next-note (&optional n) + "Find next daily-note. + +With numeric argument N, find note N days in the future. If N is +negative, find note N days in the past." + (interactive "p") + (unless (org-roam-dailies--daily-note-p) + (user-error "Not in a daily-note")) + (setq n (or n 1)) + (let* ((dailies (org-roam-dailies--list-files)) + (position + (cl-position-if (lambda (candidate) + (string= (buffer-file-name (buffer-base-buffer)) candidate)) + dailies)) + note) + (unless position + (user-error "Can't find current note file - have you saved it yet?")) + (pcase n + ((pred (natnump)) + (when (eq position (- (length dailies) 1)) + (user-error "Already at newest note"))) + ((pred (integerp)) + (when (eq position 0) + (user-error "Already at oldest note")))) + (setq note (nth (+ position n) dailies)) + (find-file note) + (run-hooks 'org-roam-dailies-find-file-hook))) + +(defun org-roam-dailies-goto-previous-note (&optional n) + "Find previous daily-note. + +With numeric argument N, find note N days in the past. If N is +negative, find note N days in the future." + (interactive "p") + (let ((n (if n (- n) -1))) + (org-roam-dailies-goto-next-note n))) + +(defun org-roam-dailies--list-files (&rest extra-files) + "List all files in `org-roam-dailies-directory'. +EXTRA-FILES can be used to append extra files to the list." + (let ((dir (expand-file-name org-roam-dailies-directory org-roam-directory)) + (regexp (rx-to-string `(and "." (or ,@org-roam-file-extensions))))) + (append (--remove (let ((file (file-name-nondirectory it))) + (when (or (auto-save-file-name-p file) + (backup-file-name-p file) + (string-match "^\\." file)) + it)) + (directory-files-recursively dir regexp)) + extra-files))) + +(defun org-roam-dailies--daily-note-p (&optional file) + "Return t if FILE is an Org-roam daily-note, nil otherwise. +If FILE is not specified, use the current buffer's file-path." + (when-let* ((path (expand-file-name + (or file + (buffer-file-name (buffer-base-buffer))))) + (directory (expand-file-name org-roam-dailies-directory org-roam-directory))) + (setq path (expand-file-name path)) + (save-match-data + (and + (org-roam-file-p path) + (org-roam-descendant-of-p path directory))))) + +;;;###autoload +(defun org-roam-dailies-find-directory () + "Find and open `org-roam-dailies-directory'." + (interactive) + (find-file (expand-file-name org-roam-dailies-directory org-roam-directory))) + +;;; Calendar integration +(defun org-roam-dailies-calendar--file-to-date (file) + "Convert FILE to date. +Return (MONTH DAY YEAR) or nil if not an Org time-string." + (ignore-errors + (cl-destructuring-bind (_ _ _ d m y _ _ _) + (org-parse-time-string + (file-name-sans-extension + (file-name-nondirectory file))) + (list m d y)))) + +(defun org-roam-dailies-calendar-mark-entries () + "Mark days in the calendar for which a daily-note is present." + (when (file-exists-p (expand-file-name org-roam-dailies-directory org-roam-directory)) + (dolist (date (remove nil + (mapcar #'org-roam-dailies-calendar--file-to-date + (org-roam-dailies--list-files)))) + (when (calendar-date-is-visible-p date) + (calendar-mark-visible-date date 'org-roam-dailies-calendar-note))))) + +(add-hook 'calendar-today-visible-hook #'org-roam-dailies-calendar-mark-entries) +(add-hook 'calendar-today-invisible-hook #'org-roam-dailies-calendar-mark-entries) + +;;; Capture implementation +(add-to-list 'org-roam-capture--template-keywords :override-default-time) + +(defun org-roam-dailies--capture (time &optional goto keys) + "Capture an entry in a daily-note for TIME, creating it if necessary. +When GOTO is non-nil, go the note without creating an entry. + +ELisp programs can set KEYS to a string associated with a template. +In this case, interactive selection will be bypassed." + (let ((org-roam-directory (expand-file-name org-roam-dailies-directory org-roam-directory)) + (org-roam-dailies-directory "./")) + (org-roam-capture- :goto (when goto '(4)) + :keys keys + :node (org-roam-node-create) + :templates org-roam-dailies-capture-templates + :props (list :override-default-time time))) + (when goto (run-hooks 'org-roam-dailies-find-file-hook))) + +(add-hook 'org-roam-capture-preface-hook #'org-roam-dailies--override-capture-time-h) + +(defun org-roam-dailies--override-capture-time-h () + "Override the `:default-time' with the time from `:override-default-time'." + (when (org-roam-capture--get :override-default-time) + (org-capture-put :default-time (org-roam-capture--get :override-default-time))) + nil) + +;;; Bindings +(defvar org-roam-dailies-map (make-sparse-keymap) + "Keymap for `org-roam-dailies'.") + +(define-prefix-command 'org-roam-dailies-map) + +(define-key org-roam-dailies-map (kbd "d") #'org-roam-dailies-goto-today) +(define-key org-roam-dailies-map (kbd "y") #'org-roam-dailies-goto-yesterday) +(define-key org-roam-dailies-map (kbd "t") #'org-roam-dailies-goto-tomorrow) +(define-key org-roam-dailies-map (kbd "n") #'org-roam-dailies-capture-today) +(define-key org-roam-dailies-map (kbd "f") #'org-roam-dailies-goto-next-note) +(define-key org-roam-dailies-map (kbd "b") #'org-roam-dailies-goto-previous-note) +(define-key org-roam-dailies-map (kbd "c") #'org-roam-dailies-goto-date) +(define-key org-roam-dailies-map (kbd "v") #'org-roam-dailies-capture-date) +(define-key org-roam-dailies-map (kbd ".") #'org-roam-dailies-find-directory) + +(provide 'org-roam-dailies) + +;;; org-roam-dailies.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-dailies.elc b/.packages/org-roam-20251125.729/org-roam-dailies.elc new file mode 100644 index 0000000..6be43c4 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-dailies.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-db.el b/.packages/org-roam-20251125.729/org-roam-db.el new file mode 100644 index 0000000..04b6481 --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-db.el @@ -0,0 +1,730 @@ +;;; org-roam-db.el --- Org-roam database API -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; 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, 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: +;; +;; This module provides the underlying database API to Org-roam. +;; +;;; Code: +(require 'org-roam) +(require 'url-parse) +(require 'ol) +(defvar org-outline-path-cache) + +;;; Options +(defcustom org-roam-db-location (locate-user-emacs-file "org-roam.db") + "The path to file where the Org-roam database is stored. + +It is the user's responsibility to set this correctly, especially +when used with multiple Org-roam instances." + :type 'string + :group 'org-roam) + +(defcustom org-roam-db-gc-threshold gc-cons-threshold + "The value to temporarily set the `gc-cons-threshold' threshold to. +During `org-roam-db-sync', Emacs can pause multiple times to +perform garbage collection because of the large number of +temporary structures generated (e.g. parsed ASTs). + +`gc-cons-threshold' is temporarily set to +`org-roam-db-gc-threshold' during this operation, and increasing +`gc-cons-threshold' will help reduce the number of GC operations, +at the cost of memory usage. Tweaking this value may lead to +better overall performance. + +For example, to reduce the number of GCs to the minimum, on +machines with large memory one may set it to +`most-positive-fixnum'." + :type 'int + :group 'org-roam) + +(defcustom org-roam-db-node-include-function (lambda () t) + "A custom function to check if the point contains a valid node. +This function is called each time a node (both file and headline) +is about to be saved into the Org-roam database. + +If the function returns nil, Org-roam will skip the node. This +function is useful for excluding certain nodes from the Org-roam +database." + :type 'function + :group 'org-roam) + +(defcustom org-roam-db-update-on-save t + "If t, update the Org-roam database upon saving the file. +Disable this if your files are large and updating the database is +slow." + :type 'boolean + :group 'org-roam) + +(defcustom org-roam-db-extra-links-elements '(node-property keyword) + "The list of Org element types to include for parsing by Org-roam. + +By default, when parsing Org's AST, links within keywords and +property drawers are not parsed as links. Sometimes however, it +is desirable to parse and cache these links (e.g. hiding links in +a property drawer)." + :package-version '(org-roam . "2.2.0") + :group 'org-roam + :type '(set + (const :tag "keywords" keyword) + (const :tag "property drawers" node-property))) + +(defcustom org-roam-db-extra-links-exclude-keys '((node-property . ("ROAM_REFS")) + (keyword . ("transclude"))) + "Keys to ignore when mapping over links. + +The car of the association list is the Org element type (e.g. +keyword). The cdr is a list of case-insensitive strings to +exclude from being treated as links. + +For example, we use this to prevent self-referential links in +ROAM_REFS." + :package-version '(org-roam . "2.2.0") + :group 'org-roam + :type '(alist)) + +;;; Variables +(defconst org-roam-db-version 20) + +(defvar org-roam-db--connection (make-hash-table :test #'equal) + "Database connection to Org-roam database.") + +;;; Core Functions +(defun org-roam-db--get-connection () + "Return the database connection, if any." + (gethash (expand-file-name (file-name-as-directory org-roam-directory)) + org-roam-db--connection)) + +(defun org-roam-db () + "Entrypoint to the Org-roam sqlite database. +Initializes and stores the database, and the database connection. +Performs a database upgrade when required." + (unless (and (org-roam-db--get-connection) + (emacsql-live-p (org-roam-db--get-connection))) + (let ((init-db (not (file-exists-p org-roam-db-location)))) + (make-directory (file-name-directory org-roam-db-location) t) + (let ((conn (emacsql-sqlite-open org-roam-db-location))) + (puthash (expand-file-name (file-name-as-directory org-roam-directory)) + conn + org-roam-db--connection) + (when init-db + (org-roam-db--init conn)) + (let* ((version (caar (emacsql conn "PRAGMA user_version"))) + (version (org-roam-db--upgrade-maybe conn version))) + (cond + ((> version org-roam-db-version) + (emacsql-close conn) + (user-error + "The Org-roam database was created with a newer Org-roam version. %s" + "You need to update the Org-roam package")) + ((< version org-roam-db-version) + (emacsql-close conn) + (error "BUG: The Org-roam database scheme changed %s" + "and there is no upgrade path"))))))) + (org-roam-db--get-connection)) + +;;; Entrypoint: (org-roam-db-query) +(define-error 'emacsql-constraint "SQL constraint violation") +(defun org-roam-db-query (sql &rest args) + "Run SQL query on Org-roam database with ARGS. +SQL can be either the emacsql vector representation, or a string." + (apply #'emacsql (org-roam-db) sql args)) + +(defun org-roam-db-query! (handler sql &rest args) + "Run SQL query on Org-roam database with ARGS. +SQL can be either the emacsql vector representation, or a string. +The query is expected to be able to fail, in this situation, run HANDLER." + (condition-case err + (org-roam-db-query sql args) + (emacsql-constraint + (funcall handler err)))) + +;;; Schemata +(defconst org-roam-db--table-schemata + '((files + [(file :unique :primary-key) + title + (hash :not-null) + (atime :not-null) + (mtime :not-null)]) + + (nodes + ([(id :not-null :primary-key) + (file :not-null) + (level :not-null) + (pos :not-null) + todo + priority + (scheduled text) + (deadline text) + title + properties + olp] + (:foreign-key [file] :references files [file] :on-delete :cascade))) + + (aliases + ([(node-id :not-null) + alias] + (:foreign-key [node-id] :references nodes [id] :on-delete :cascade))) + + (citations + ([(node-id :not-null) + (cite-key :not-null) + (pos :not-null) + properties] + (:foreign-key [node-id] :references nodes [id] :on-delete :cascade))) + + (refs + ([(node-id :not-null) + (ref :not-null) + (type :not-null)] + (:foreign-key [node-id] :references nodes [id] :on-delete :cascade))) + + (tags + ([(node-id :not-null) + tag] + (:foreign-key [node-id] :references nodes [id] :on-delete :cascade))) + + (links + ([(pos :not-null) + (source :not-null) + (dest :not-null) + (type :not-null) + (properties :not-null)] + (:foreign-key [source] :references nodes [id] :on-delete :cascade))))) + +(defconst org-roam-db--table-indices + '((alias-node-id aliases [node-id]) + (refs-node-id refs [node-id]) + (tags-node-id tags [node-id]))) + +(defun org-roam-db--init (db) + "Initialize database DB with the correct schema and user version." + (emacsql-with-transaction db + (pcase-dolist (`(,table ,schema) org-roam-db--table-schemata) + (emacsql db [:create-table $i1 $S2] table schema)) + (pcase-dolist (`(,index-name ,table ,columns) org-roam-db--table-indices) + (emacsql db [:create-index $i1 :on $i2 $S3] index-name table columns)) + (emacsql db (format "PRAGMA user_version = %s" org-roam-db-version)))) + +(defun org-roam-db--upgrade-maybe (db version) + "Upgrades the database schema for DB, if VERSION is old." + (emacsql-with-transaction db + 'ignore + (if (< version org-roam-db-version) + (progn + (org-roam-message (format "Upgrading the Org-roam database from version %d to version %d" + version org-roam-db-version)) + (org-roam-db-sync t)))) + version) + +(defun org-roam-db--close (&optional db) + "Closes the database connection for database DB. +If DB is nil, closes the database connection for the database in +the current `org-roam-directory'." + (unless db + (setq db (org-roam-db--get-connection))) + (when (and db (emacsql-live-p db)) + (emacsql-close db))) + +(defun org-roam-db--close-all () + "Closes all database connections made by Org-roam." + (dolist (conn (hash-table-values org-roam-db--connection)) + (org-roam-db--close conn))) + +;;; Database API +;;;; Clearing +(defun org-roam-db-clear-all () + "Clears all entries in the Org-roam cache." + (interactive) + (when (file-exists-p org-roam-db-location) + (dolist (table (mapcar #'car org-roam-db--table-schemata)) + (org-roam-db-query `[:delete :from ,table])))) + +(defun org-roam-db-clear-file (&optional file) + "Remove any related links to the FILE. +This is equivalent to removing the node from the graph. +If FILE is nil, clear the current buffer." + (setq file (or file (buffer-file-name (buffer-base-buffer)))) + (org-roam-db-query [:delete :from files + :where (= file $s1)] + file)) + +;;;; Updating tables + +(defun org-roam-db--file-title () + "In current Org buffer, get the title. +If there is no title, return the file name relative to +`org-roam-directory'." + (org-link-display-format + (or (string-join (cdr (assoc "TITLE" (org-collect-keywords '("title")))) " ") + (file-name-sans-extension (file-relative-name + (buffer-file-name (buffer-base-buffer)) + org-roam-directory))))) + +(defun org-roam-db-insert-file (&optional hash) + "Update the files table for the current buffer. +If UPDATE-P is non-nil, first remove the file in the database. +If HASH is non-nil, use that as the file's hash without recalculating it." + (let* ((file (buffer-file-name)) + (file-title (org-roam-db--file-title)) + (attr (file-attributes file)) + (atime (file-attribute-access-time attr)) + (mtime (file-attribute-modification-time attr)) + (hash (or hash (org-roam-db--file-hash file)))) + (org-roam-db-query + [:insert :into files + :values $v1] + (list (vector file file-title hash atime mtime))))) + +(defun org-roam-db-get-scheduled-time () + "Return the scheduled time at point in ISO8601 format." + (when-let* ((time (org-get-scheduled-time (point)))) + (format-time-string "%FT%T" time))) + +(defun org-roam-db-get-deadline-time () + "Return the deadline time at point in ISO8601 format." + (when-let* ((time (org-get-deadline-time (point)))) + (format-time-string "%FT%T" time))) + +(defun org-roam-db-node-p () + "Return t if headline at point is an Org-roam node, else return nil." + (and (org-id-get) + (not (org-entry-get (point) "ROAM_EXCLUDE")) + (funcall org-roam-db-node-include-function))) + +(defun org-roam-db-map-nodes (fns) + "Run FNS over all nodes in the current buffer." + (org-with-wide-buffer + (org-map-region + (lambda () + (when (org-roam-db-node-p) + (dolist (fn fns) + (funcall fn)))) + (point-min) (point-max)))) + +(defun org-roam-db-map-links (fns) + "Run FNS over all links in the current buffer." + (org-with-point-at 1 + (while (re-search-forward org-link-any-re nil :no-error) + ;; `re-search-forward' let the cursor one character after the link, we need to go backward one char to + ;; make the point be on the link. + (backward-char) + (let* ((begin (match-beginning 0)) + (element (org-element-context)) + (type (org-element-type element)) + link) + (cond + ;; Links correctly recognized by Org Mode + ((eq type 'link) + (setq link element)) + ;; Links in property drawers and lines starting with #+. Recall that, as for Org Mode v9.4.4, the + ;; org-element-type of links within properties drawers is "node-property" and for lines starting with + ;; #+ is "keyword". + ((and (member type org-roam-db-extra-links-elements) + (not (member-ignore-case (org-element-property :key element) + (cdr (assoc type org-roam-db-extra-links-exclude-keys)))) + (setq link (save-excursion + (goto-char begin) + (save-match-data (org-element-link-parser))))))) + (when link + (dolist (fn fns) + (funcall fn link))))))) + +(defun org-roam-db-map-citations (info fns) + "Run FNS over all citations in the current buffer. +INFO is the org-element parsed buffer." + (org-element-map info 'citation-reference + (lambda (cite) + (dolist (fn fns) + (funcall fn cite))))) + +(defun org-roam-db-insert-file-node () + "Insert the file-level node into the Org-roam cache." + (org-with-point-at 1 + (when (and (= (org-outline-level) 0) + (org-roam-db-node-p)) + (when-let* ((id (org-id-get))) + (let* ((file (buffer-file-name (buffer-base-buffer))) + (title (org-roam-db--file-title)) + (pos (point)) + (todo nil) + (priority nil) + (scheduled nil) + (deadline nil) + (level 0) + (tags org-file-tags) + (properties (org-entry-properties)) + (olp nil)) + (org-roam-db-query! + (lambda (err) + (lwarn 'org-roam :warning "%s for %s (%s) in %s" + (error-message-string err) + title id file)) + [:insert :into nodes + :values $v1] + (vector id file level pos todo priority + scheduled deadline title properties olp)) + (when tags + (org-roam-db-query + [:insert :into tags + :values $v1] + (mapcar (lambda (tag) + (vector id (substring-no-properties tag))) + tags))) + (org-roam-db-insert-aliases) + (org-roam-db-insert-refs)))))) + +(cl-defun org-roam-db-insert-node-data () + "Insert node data for headline at point into the Org-roam cache." + (when-let* ((id (org-id-get))) + (let* ((file (buffer-file-name (buffer-base-buffer))) + (heading-components (org-heading-components)) + (pos (point)) + (todo (nth 2 heading-components)) + (priority (nth 3 heading-components)) + (level (nth 1 heading-components)) + (scheduled (org-roam-db-get-scheduled-time)) + (deadline (org-roam-db-get-deadline-time)) + (title (or (nth 4 heading-components) + (progn (lwarn 'org-roam :warning "Node in %s:%s:%s has no title, skipping..." + file + (line-number-at-pos) + (1+ (- (point) (line-beginning-position)))) + (cl-return-from org-roam-db-insert-node-data)))) + (properties (org-entry-properties)) + (olp (org-get-outline-path nil 'use-cache)) + (title (org-link-display-format title))) + (org-roam-db-query! + (lambda (err) + (lwarn 'org-roam :warning "%s for %s (%s) in %s" + (error-message-string err) + title id file)) + [:insert :into nodes + :values $v1] + (vector id file level pos todo priority + scheduled deadline title properties olp))))) + +(defun org-roam-db-insert-aliases () + "Insert aliases for node at point into Org-roam cache." + (when-let* ((node-id (org-id-get)) + (aliases (org-entry-get (point) "ROAM_ALIASES")) + (aliases (split-string-and-unquote aliases))) + (org-roam-db-query [:insert :into aliases + :values $v1] + (mapcar (lambda (alias) + (vector node-id alias)) + aliases)))) + +(defun org-roam-db-insert-tags () + "Insert tags for node at point into Org-roam cache." + (when-let* ((node-id (org-id-get)) + (tags (org-get-tags))) + (org-roam-db-query [:insert :into tags + :values $v1] + (mapcar (lambda (tag) + (vector node-id (substring-no-properties tag))) tags)))) + +(defun org-roam-db-insert-refs () + "Insert refs for node at point into Org-roam cache." + (when-let* ((node-id (org-id-get)) + (refs (org-entry-get (point) "ROAM_REFS")) + (refs (split-string-and-unquote refs))) + (let (rows) + (dolist (ref refs) + (save-match-data + (cond (;; @citeKey + (string-prefix-p "@" ref) + (push (vector node-id (substring ref 1) "cite") rows)) + (;; [cite:@citeKey] + (string-prefix-p "[cite:" ref) + (condition-case nil + (let ((cite-obj (org-cite-parse-objects ref))) + (org-element-map cite-obj 'citation-reference + (lambda (cite) + (let ((key (org-element-property :key cite))) + (push (vector node-id key "cite") rows))))) + (error + (lwarn '(org-roam) :warning + "%s:%s\tInvalid cite %s, skipping..." (buffer-file-name) (point) ref)))) + (;; https://google.com, cite:citeKey + ;; Note: we use string-match here because it matches any link: e.g. [[cite:abc][abc]] + ;; But this form of matching is loose, and can accept invalid links e.g. [[cite:abc] + (string-match org-link-any-re (org-link-encode ref '(#x20))) + (setq ref (org-link-encode ref '(#x20))) + (let ((ref-url (url-generic-parse-url (or (match-string 2 ref) (match-string 0 ref)))) + (link-type ()) ;; clear url-type for backward compatible. + (path ())) + (setq link-type (url-type ref-url)) + (setf (url-type ref-url) nil) + (setq path (org-link-decode (url-recreate-url ref-url))) + (if (and (boundp 'org-ref-cite-types) + (or (assoc link-type org-ref-cite-types) + (member link-type org-ref-cite-types))) + (dolist (key (org-roam-org-ref-path-to-keys path)) + (push (vector node-id key link-type) rows)) + (push (vector node-id path link-type) rows)))) + (t + (lwarn '(org-roam) :warning + "%s:%s\tInvalid ref %s, skipping..." (buffer-file-name) (point) ref))))) + (when rows + (org-roam-db-query [:insert :into refs + :values $v1] + rows))))) + +(defun org-roam-db-insert-link (link) + "Insert link data for LINK at current point into the Org-roam cache." + (save-excursion + (goto-char (org-element-property :begin link)) + (let* ((type (org-element-property :type link)) + (path (org-element-property :path link)) + (option (and (string-match "::\\(.*\\)\\'" path) + (match-string 1 path))) + (path (if (not option) path + (substring path 0 (match-beginning 0)))) + (source (org-roam-id-at-point)) + (properties (list :outline (ignore-errors + ;; This can error if link is not under any headline + (org-get-outline-path 'with-self 'use-cache)))) + (properties (if option (plist-put properties :search-option option) + properties))) + ;; For Org-ref links, we need to split the path into the cite keys + (when (and source path) + (if (and (boundp 'org-ref-cite-types) + (or (assoc type org-ref-cite-types) + (member type org-ref-cite-types))) + (org-roam-db-query + [:insert :into citations + :values $v1] + (mapcar (lambda (k) (vector source k (point) properties)) + (org-roam-org-ref-path-to-keys path))) + (org-roam-db-query + [:insert :into links + :values $v1] + (vector (point) source path type properties))))))) + +(defun org-roam-db-insert-citation (citation) + "Insert data for CITATION at current point into the Org-roam cache." + (save-excursion + (goto-char (org-element-property :begin citation)) + (let ((key (org-element-property :key citation)) + (source (org-roam-id-at-point)) + (properties (list :outline (ignore-errors + ;; This can error if link is not under any headline + (org-get-outline-path 'with-self 'use-cache))))) + (when (and source key) + (org-roam-db-query + [:insert :into citations + :values $v1] + (vector source key (point) properties)))))) + +;;;; Fetching +(defun org-roam-db--get-current-files () + "Return a hash-table of file to the hash of its file contents." + (let ((current-files (org-roam-db-query [:select [file hash] :from files])) + (ht (make-hash-table :test #'equal))) + (dolist (row current-files) + (puthash (car row) (cadr row) ht)) + ht)) + +(defun org-roam-db--file-hash (file-path) + "Compute the hash of FILE-PATH." + (with-temp-buffer + (set-buffer-multibyte nil) + (insert-file-contents-literally file-path) + (secure-hash 'sha1 (current-buffer)))) + +;;;; Synchronization +(defun org-roam-db-update-file (&optional file-path _deprecated-arg) + "Update Org-roam cache for FILE-PATH. + +If the file does not exist anymore, remove it from the cache. + +If the file exists, update the cache with information. + +If NO-REQUIRE, don't require optional libraries. Set NO-REQUIRE +when the libraries are already required at some toplevel, e.g. +in `org-roam-db-sync'." + (setq file-path (or file-path (buffer-file-name (buffer-base-buffer)))) + (let ((content-hash (org-roam-db--file-hash file-path)) + (db-hash (caar (org-roam-db-query [:select hash :from files + :where (= file $s1)] file-path))) + info) + (unless (string= content-hash db-hash) + (require 'org-ref nil t) + (org-roam-with-file file-path nil + (emacsql-with-transaction (org-roam-db) + (org-with-wide-buffer + (org-set-regexps-and-options 'tags-only) + ;; Org doesn't use this anymore, so we probably should stop too. + ;; (org-refresh-category-properties) + (org-roam-db-clear-file) + (org-roam-db-insert-file content-hash) + (org-roam-db-insert-file-node) + (setq org-outline-path-cache nil) + (org-roam-db-map-nodes + (list #'org-roam-db-insert-node-data + #'org-roam-db-insert-aliases + #'org-roam-db-insert-tags + #'org-roam-db-insert-refs)) + (setq org-outline-path-cache nil) + (setq info (org-element-parse-buffer)) + (org-roam-db-map-links + (list #'org-roam-db-insert-link)) + (when (require 'oc nil t) + (org-roam-db-map-citations + info + (list #'org-roam-db-insert-citation))))))))) + +;;;###autoload +(defun org-roam-db-sync (&optional force) + "Synchronize the cache state with the current Org files on-disk. +If FORCE, force a rebuild of the cache from scratch." + (interactive "P") + (org-roam-db--close) ;; Force a reconnect + (when force (delete-file org-roam-db-location)) + (org-roam-db) ;; To initialize the database, no-op if already initialized + (require 'org-ref nil t) + (require 'oc nil t) + (let* ((gc-cons-threshold org-roam-db-gc-threshold) + (org-agenda-files nil) + (org-roam-files (org-roam-list-files)) + (current-files (org-roam-db--get-current-files)) + (modified-files nil)) + (dolist (file org-roam-files) + (let ((contents-hash (org-roam-db--file-hash file))) + (unless (string= (gethash file current-files) + contents-hash) + (push file modified-files))) + (remhash file current-files)) + (emacsql-with-transaction (org-roam-db) + (dolist-with-progress-reporter (file (hash-table-keys current-files)) + "Clearing removed files..." + (org-roam-db-clear-file file)) + (dolist-with-progress-reporter (file modified-files) + "Processing modified files..." + (condition-case err + (org-roam-db-update-file file) + (error + (org-roam-db-clear-file file) + (lwarn 'org-roam :error "Failed to process %s with error %s, skipping..." + file (error-message-string err)))))))) + +;;;###autoload +(define-minor-mode org-roam-db-autosync-mode + "Global minor mode to keep your Org-roam session automatically synchronized. +Through the session this will continue to setup your +buffers (that are Org-roam file visiting), keep track of the +related changes, maintain cache consistency and incrementally +update the currently active database. + +If you need to manually trigger resync of the currently active +database, see `org-roam-db-sync' command." + :group 'org-roam + :global t + :init-value nil + (let ((enabled org-roam-db-autosync-mode)) + (cond + (enabled + (add-hook 'find-file-hook #'org-roam-db-autosync--setup-file-h) + (add-hook 'kill-emacs-hook #'org-roam-db--close-all) + (advice-add #'rename-file :after #'org-roam-db-autosync--rename-file-a) + (advice-add #'delete-file :before #'org-roam-db-autosync--delete-file-a) + (advice-add #'vc-delete-file :around #'org-roam-db-autosync--vc-delete-file-a) + (org-roam-db-sync)) + (t + (remove-hook 'find-file-hook #'org-roam-db-autosync--setup-file-h) + (remove-hook 'kill-emacs-hook #'org-roam-db--close-all) + (advice-remove #'rename-file #'org-roam-db-autosync--rename-file-a) + (advice-remove #'delete-file #'org-roam-db-autosync--delete-file-a) + (advice-remove #'vc-delete-file #'org-roam-db-autosync--vc-delete-file-a) + (org-roam-db--close-all) + ;; Disable local hooks for all org-roam buffers + (dolist (buf (org-roam-buffer-list)) + (with-current-buffer buf + (remove-hook 'after-save-hook #'org-roam-db-autosync--try-update-on-save-h t))))))) + +(defun org-roam-db-autosync--delete-file-a (file &optional _trash) + "Maintain cache consistency when file deletes. +FILE is removed from the database." + (when (and (not (auto-save-file-name-p file)) + (not (backup-file-name-p file)) + (org-roam-file-p file)) + (org-roam-db-clear-file (expand-file-name file)))) + +(defun org-roam-db-autosync--vc-delete-file-a (fun file) + "Maintain cache consistency on file deletion by FUN. +FILE is removed from the database." + (let ((org-roam-file-p (and (not (auto-save-file-name-p file)) + (not (backup-file-name-p file)) + (org-roam-file-p file)))) + (apply fun `(,file)) + (when (and org-roam-file-p + (not (file-exists-p file))) + (org-roam-db-clear-file (expand-file-name file))))) + +(defun org-roam-db-autosync--rename-file-a (old-file new-file-or-dir &rest _args) + "Maintain cache consistency of file rename. +OLD-FILE is cleared from the database, and NEW-FILE-OR-DIR is added." + (let ((new-file (if (directory-name-p new-file-or-dir) + (expand-file-name (file-name-nondirectory old-file) new-file-or-dir) + new-file-or-dir))) + (setq new-file (expand-file-name new-file)) + (setq old-file (expand-file-name old-file)) + (when (and (not (auto-save-file-name-p old-file)) + (not (auto-save-file-name-p new-file)) + (not (backup-file-name-p old-file)) + (not (backup-file-name-p new-file)) + (org-roam-file-p old-file)) + (org-roam-db-clear-file old-file)) + (when (org-roam-file-p new-file) + (org-roam-db-update-file new-file)))) + +(defun org-roam-db-autosync--setup-file-h () + "Setup the current buffer if it visits an Org-roam file." + (when (org-roam-file-p) (run-hooks 'org-roam-find-file-hook))) + +(add-hook 'org-roam-find-file-hook #'org-roam-db-autosync--setup-update-on-save-h) +(defun org-roam-db-autosync--setup-update-on-save-h () + "Setup the current buffer to update the DB after saving the current file." + (add-hook 'after-save-hook #'org-roam-db-autosync--try-update-on-save-h nil t)) + +(defun org-roam-db-autosync--try-update-on-save-h () + "If appropriate, update the database for the current file after saving buffer." + (when org-roam-db-update-on-save (org-roam-db-update-file))) + +;;; Diagnostics +(defun org-roam-db-diagnose-node () + "Print information about node at point." + (interactive) + (prin1 (org-roam-node-at-point))) + +(defun org-roam-db-explore () + "Explore the org-roam DB contents." + (interactive) + (require 'sqlite-mode nil t) + (if (fboundp 'sqlite-mode-open-file) + (sqlite-mode-open-file org-roam-db-location) + (message "org-roam-db-explore: This command requires Emacs 29"))) + +(provide 'org-roam-db) + +;;; org-roam-db.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-db.elc b/.packages/org-roam-20251125.729/org-roam-db.elc new file mode 100644 index 0000000..211abb5 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-db.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-export.el b/.packages/org-roam-20251125.729/org-roam-export.el new file mode 100644 index 0000000..b552bea --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-export.el @@ -0,0 +1,74 @@ +;;; org-roam-export.el --- Org-roam org-export tweaks -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; Author: Jethro Kuan +;; URL: https://github.com/org-roam/org-roam +;; Keywords: org-mode, roam, convenience +;; Package-Requires: ((emacs "26.1") (org "9.6") (org-roam "2.1")) + +;; 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, 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: +;; +;; This package provides the necessary changes required to make org-export work out-of-the-box. +;; +;; To enable it, run: +;; +;; (require 'org-roam-export) +;; +;; The key issue Org's export-to-html functionality has is that it does not respect the ID property, which +;; Org-roam relies heavily on. This patches the necessary function in ox-html to export ID links correctly, +;; pointing to the correct place. +;; +;;; Code: +(require 'ox-html) + +(defun org-roam-export--org-html--reference (datum info &optional named-only) + "Org-roam's patch for `org-html--reference' to support ID link export. +See `org-html--reference' for DATUM, INFO and NAMED-ONLY." + (let* ((type (org-element-type datum)) + (user-label + (org-element-property + (pcase type + ((or `headline `inlinetask) :CUSTOM_ID) + ((or `radio-target `target) :value) + (_ :name)) + datum)) + (user-label + (or user-label + (when-let* ((path (org-element-property :ID datum))) + ;; see `org-html-link' for why we use "ID-" + ;; (search for "ID-" in ox-html.el) + (concat "ID-" path))))) + (cond + ((and user-label + (or (plist-get info :html-prefer-user-labels) + (memq type '(headline inlinetask)))) + user-label) + ((and named-only + (not (memq type '(headline inlinetask radio-target target))) + (not user-label)) + nil) + (t + (org-export-get-reference datum info))))) + +(advice-add 'org-html--reference :override #'org-roam-export--org-html--reference) + +(provide 'org-roam-export) +;;; org-roam-export.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-export.elc b/.packages/org-roam-20251125.729/org-roam-export.elc new file mode 100644 index 0000000..55b7ff6 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-export.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-graph.el b/.packages/org-roam-20251125.729/org-roam-graph.el new file mode 100644 index 0000000..a04d86d --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-graph.el @@ -0,0 +1,301 @@ +;;; org-roam-graph.el --- Basic graphing functionality for Org-roam -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; Author: Jethro Kuan +;; URL: https://github.com/org-roam/org-roam +;; Keywords: org-mode, roam, convenience +;; Package-Requires: ((emacs "26.1") (org "9.6") (org-roam "2.1")) + +;; 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, 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: +;; +;; This extension implements capability to build and generate graphs in Org-roam +;; with the help of Graphviz. +;; +;;; Code: +(require 'xml) ;xml-escape-string +(require 'org-roam) + +;;; Options +(defcustom org-roam-graph-viewer (executable-find "firefox") + "Method to view the org-roam graph. +It may be one of the following: + - a string representing the path to the executable for viewing the graph. + - a function accepting a single argument: the graph file path. + - nil uses `view-file' to view the graph." + :type '(choice + (string :tag "Path to executable") + (function :tag "Function to display graph" eww-open-file) + (const :tag "view-file")) + :group 'org-roam) + +(defcustom org-roam-graph-executable "dot" + "Path to graphing executable, or its name." + :type 'string + :group 'org-roam) + +(defcustom org-roam-graph-filetype "svg" + "File type to generate when producing graphs." + :type 'string + :group 'org-roam) + + +(defcustom org-roam-graph-extra-config nil + "Extra options passed to graphviz. +Example: + ((\"rankdir\" . \"LR\"))" + :type 'alist + :group 'org-roam) + +(defcustom org-roam-graph-edge-extra-config nil + "Extra edge options passed to graphviz. +Example: + ((\"dir\" . \"back\"))" + :type 'alist + :group 'org-roam) + +(defcustom org-roam-graph-node-extra-config + '(("id" . (("style" . "bold,rounded,filled") + ("fillcolor" . "#EEEEEE") + ("color" . "#C9C9C9") + ("fontcolor" . "#111111"))) + ("http" . (("style" . "rounded,filled") + ("fillcolor" . "#EEEEEE") + ("color" . "#C9C9C9") + ("fontcolor" . "#0A97A6"))) + ("https" . (("style" . "rounded,filled") + ("fillcolor" . "#EEEEEE") + ("color" . "#C9C9C9") + ("fontcolor" . "#0A97A6")))) + "Extra options for graphviz nodes." + :type '(alist) + :group 'org-roam) + +(defcustom org-roam-graph-link-hidden-types + '("file") + "What sort of links to hide from the Org-roam graph." + :type '(repeat string) + :group 'org-roam) + +(defcustom org-roam-graph-max-title-length 100 + "Maximum length of titles in graph nodes." + :type 'number + :group 'org-roam) + +(defcustom org-roam-graph-shorten-titles 'truncate + "Determines how long titles appear in graph nodes. +Recognized values are the symbols `truncate' and `wrap', in which +cases the title will be truncated or wrapped, respectively, if it +is longer than `org-roam-graph-max-title-length'. + +All other values including nil will have no effect." + :type '(choice + (const :tag "truncate" truncate) + (const :tag "wrap" wrap) + (const :tag "no" nil)) + :group 'org-roam) + +(defcustom org-roam-graph-link-builder 'org-roam-org-protocol-link-builder + "Function used to build the Org-roam graph links. +Given a node name, return a string to be used for the link fed to +the graph generation utility." + :type 'function + :group 'org-roam) + +(defcustom org-roam-graph-generation-hook nil + "Functions to run after the graph has been generated. +Each function is called with two arguments: the filename +containing the graph generation tool, and the generated graph." + :type 'hook + :group 'org-roam) + +(defun org-roam-org-protocol-link-builder (node) + "Default org-roam link builder. Generate an org-protocol link using NODE." + (concat "org-protocol://roam-node?node=" + (url-hexify-string (org-roam-node-id node)))) + +;;; Interactive command +;;;###autoload +(defun org-roam-graph (&optional arg node) + "Build and possibly display a graph for NODE. +ARG may be any of the following values: + - nil show the graph. + - `\\[universal-argument]' show the graph for NODE. + - `\\[universal-argument]' N show the graph for NODE limiting nodes to N steps." + (interactive + (list current-prefix-arg + (and current-prefix-arg + (org-roam-node-at-point 'assert)))) + (let ((graph (cl-typecase arg + (null (org-roam-graph--dot nil 'all-nodes)) + (cons (org-roam-graph--dot (org-roam-graph--connected-component + (org-roam-node-id node) 0))) + (integer (org-roam-graph--dot (org-roam-graph--connected-component + (org-roam-node-id node) (abs arg))))))) + (org-roam-graph--build graph #'org-roam-graph--open))) + +;;; Generation and Build process +(defun org-roam-graph--build (graph &optional callback) + "Generate the GRAPH, and execute CALLBACK when process exits successfully. +CALLBACK is passed the graph file as its sole argument." + (unless (stringp org-roam-graph-executable) + (user-error "`org-roam-graph-executable' is not a string")) + (unless (executable-find org-roam-graph-executable) + (user-error (concat "Cannot find executable \"%s\" to generate the graph. " + "Please adjust `org-roam-graph-executable'") + org-roam-graph-executable)) + (let* ((temp-dot (make-temp-file "graph." nil ".dot" graph)) + (temp-graph (make-temp-file "graph." nil (concat "." org-roam-graph-filetype)))) + (org-roam-message "building graph") + (make-process + :name "*org-roam-graph*" + :buffer " *org-roam-graph*" + :command `(,org-roam-graph-executable ,temp-dot "-T" ,org-roam-graph-filetype "-o" ,temp-graph) + :sentinel (when callback + (lambda (process _event) + (when (= 0 (process-exit-status process)) + (progn (funcall callback temp-graph) + (run-hook-with-args 'org-roam-graph-generation-hook temp-dot temp-graph)))))))) + +(defun org-roam-graph--dot (&optional edges all-nodes) + "Build the graphviz given the EDGES of the graph. +If ALL-NODES, include also nodes without edges." + (let ((org-roam-directory-temp org-roam-directory) + (nodes-table (make-hash-table :test #'equal)) + (seen-nodes (list)) + (edges (or edges (org-roam-db-query [:select :distinct [source dest type] :from links])))) + (pcase-dolist (`(,id ,file ,title) + (org-roam-db-query [:select [id file title] :from nodes])) + (puthash id (org-roam-node-create :file file :id id :title title) nodes-table)) + (with-temp-buffer + (setq-local org-roam-directory org-roam-directory-temp) + (insert "digraph \"org-roam\" {\n") + (dolist (option org-roam-graph-extra-config) + (insert (org-roam-graph--dot-option option) ";\n")) + (insert (format " edge [%s];\n" + (mapconcat (lambda (var) + (org-roam-graph--dot-option var nil "\"")) + org-roam-graph-edge-extra-config + ","))) + (pcase-dolist (`(,source ,dest ,type) edges) + (unless (member type org-roam-graph-link-hidden-types) + (pcase-dolist (`(,node ,node-type) `((,source "id") + (,dest ,type))) + (unless (member node seen-nodes) + (insert (org-roam-graph--format-node + (or (gethash node nodes-table) node) node-type)) + (push node seen-nodes))) + (insert (format " \"%s\" -> \"%s\";\n" + (xml-escape-string source) + (xml-escape-string dest))))) + (when all-nodes + (maphash (lambda (id node) + (unless (member id seen-nodes) + (insert (org-roam-graph--format-node node "id")))) + nodes-table)) + (insert "}") + (buffer-string)))) + +(defun org-roam-graph--connected-component (id distance) + "Return the edges for all nodes reachable from/connected to ID. +DISTANCE is the maximum distance away from the root node." + (let* ((query + (if (= distance 0) + " +WITH RECURSIVE + links_of(source, dest) AS + (SELECT source, dest FROM links UNION + SELECT dest, source FROM links), + connected_component(source) AS + (SELECT dest FROM links_of WHERE source = $s1 UNION + SELECT dest FROM links_of JOIN connected_component USING(source)) +SELECT DISTINCT source, dest, type FROM links +WHERE source IN connected_component OR dest IN connected_component;" + " +WITH RECURSIVE + links_of(source, dest) AS + (SELECT source, dest FROM links UNION + SELECT dest, source FROM links), + connected_component(source, trace) AS + (VALUES ($s1 , json_array($s1)) UNION + SELECT lo.dest, json_insert(cc.trace, '$[' || json_array_length(cc.trace) || ']', lo.dest) FROM + connected_component AS cc JOIN links_of AS lo USING(source) + WHERE ( + -- Avoid cycles by only visiting each node once. + (SELECT count(*) FROM json_each(cc.trace) WHERE json_each.value == lo.dest) == 0 + -- Note: BFS is cut off early here. + AND json_array_length(cc.trace) < $s2)), + nodes(source) as (SELECT DISTINCT source + FROM connected_component GROUP BY source ORDER BY min(json_array_length(trace))) +SELECT DISTINCT source, dest, type FROM links WHERE source IN nodes OR dest IN nodes;"))) + (org-roam-db-query query id distance))) + +(defun org-roam-graph--dot-option (option &optional wrap-key wrap-val) + "Return dot string of form KEY=VAL for OPTION cons. +If WRAP-KEY is non-nil it wraps the KEY. +If WRAP-VAL is non-nil it wraps the VAL." + (concat wrap-key (car option) wrap-key + "=" + wrap-val (cdr option) wrap-val)) + +(defun org-roam-graph--format-node (node type) + "Return a graphviz NODE with TYPE. +Handles both Org-roam nodes, and string nodes (e.g. urls)." + (let (node-id node-properties) + (if (org-roam-node-p node) + (let* ((title (org-roam-quote-string (org-roam-node-title node))) + (shortened-title + (org-roam-quote-string + (pcase org-roam-graph-shorten-titles + (`truncate (truncate-string-to-width title org-roam-graph-max-title-length nil nil "...")) + (`wrap (org-roam-word-wrap org-roam-graph-max-title-length title)) + (_ title))))) + (setq node-id (org-roam-node-id node) + node-properties `(("label" . ,shortened-title) + ("URL" . ,(funcall org-roam-graph-link-builder node)) + ("tooltip" . ,(xml-escape-string title))))) + (setq node-id node + node-properties (append `(("label" . ,(concat type ":" node))) + (when (member type (list "http" "https")) + `(("URL" . ,(xml-escape-string (concat type ":" node)))))))) + (format "\"%s\" [%s];\n" + node-id + (mapconcat (lambda (n) + (org-roam-graph--dot-option n nil "\"")) + (append (cdr (assoc type org-roam-graph-node-extra-config)) + node-properties) ",")))) + +(defun org-roam-graph--open (file) + "Open FILE using `org-roam-graph-viewer' with `view-file' as a fallback." + (pcase org-roam-graph-viewer + ((pred stringp) + (if (executable-find org-roam-graph-viewer) + (condition-case err + (call-process org-roam-graph-viewer nil 0 nil file) + (error (user-error "Failed to open org-roam graph: %s" err))) + (user-error "Executable not found: \"%s\"" org-roam-graph-viewer))) + ((pred functionp) (funcall org-roam-graph-viewer file)) + ('nil (view-file file)) + (_ (signal 'wrong-type-argument `((functionp stringp null) ,org-roam-graph-viewer))))) + + +(provide 'org-roam-graph) + +;;; org-roam-graph.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-graph.elc b/.packages/org-roam-20251125.729/org-roam-graph.elc new file mode 100644 index 0000000..8fa6a5c Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-graph.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-id.el b/.packages/org-roam-20251125.729/org-roam-id.el new file mode 100644 index 0000000..5250dba --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-id.el @@ -0,0 +1,88 @@ +;;; org-roam-id.el --- ID-related utilities for Org-roam -*- lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; 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, 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: +;; +;; This module provides ID-related facilities using the Org-roam database. +;; +;;; Code: +(require 'org-id) + +(defun org-roam-id-at-point () + "Return the ID at point, if any. +Recursively traverses up the headline tree to find the +first encapsulating ID." + (org-with-wide-buffer + (org-back-to-heading-or-point-min t) + (while (and (not (org-roam-db-node-p)) + (not (bobp))) + (org-roam-up-heading-or-point-min)) + (when (org-roam-db-node-p) + (org-id-get)))) + +(defun org-roam-id-find (id &optional markerp) + "Return the location of the entry with the id ID using the Org-roam db. +The return value is a cons cell (file-name . position), or nil +if there is no entry with that ID. +With optional argument MARKERP, return the position as a new marker." + (cond + ((symbolp id) (setq id (symbol-name id))) + ((numberp id) (setq id (number-to-string id)))) + (let ((node (org-roam-populate (org-roam-node-create :id id)))) + (when-let* ((file (org-roam-node-file node))) + (if markerp + (let ((buffer (or (find-buffer-visiting file) + (find-file-noselect file)))) + (with-current-buffer buffer + (move-marker (make-marker) (org-roam-node-point node) buffer))) + (cons (org-roam-node-file node) + (org-roam-node-point node)))))) + +(defalias 'org-roam-id-open 'org-id-open + "Obsolete alias - use `org-id-open' directly.") + +(advice-add 'org-id-find :before-until #'org-roam-id-find) + +;;;###autoload +(defun org-roam-update-org-id-locations (&rest directories) + "Scan Org-roam files to update `org-id' related state. +This is like `org-id-update-id-locations', but will automatically +use the currently bound `org-directory' and `org-roam-directory' +along with DIRECTORIES (if any), where the lookup for files in +these directories will be always recursive. + +Note: Org-roam doesn't have hard dependency on +`org-id-locations-file' to lookup IDs for nodes that are stored +in the database, but it still tries to properly integrates with +`org-id'. This allows the user to cross-reference IDs outside of +the current `org-roam-directory', and also link with \"id:\" +links to headings/files within the current `org-roam-directory' +that are excluded from identification in Org-roam as +`org-roam-node's, e.g. with \"ROAM_EXCLUDE\" property." + (interactive) + (cl-loop for dir in (cons org-roam-directory directories) + for org-roam-directory = dir + nconc (org-roam-list-files) into files + finally (org-id-update-id-locations files org-roam-verbose))) + +(provide 'org-roam-id) + +;;; org-roam-id.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-id.elc b/.packages/org-roam-20251125.729/org-roam-id.elc new file mode 100644 index 0000000..2bb3881 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-id.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-log.el b/.packages/org-roam-20251125.729/org-roam-log.el new file mode 100644 index 0000000..8bb9c6e --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-log.el @@ -0,0 +1,47 @@ +;;; org-roam-log.el --- Integrations with Org-log -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2022-2025 Jethro Kuan + +;; 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, 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: +;; +;; This module provides integrations with Org-log. +;; +;;; Code: +(require 'org-roam) + +(defcustom org-roam-log-setup-hook nil + "Hook run when a log for an Org-roam file is setup." + :group 'org-roam + :type 'hook) + +(defun org-roam-log-p () + "Return t if the log buffer is for an Org-roam file, nil otherwise." + (and org-log-note-marker + (org-roam-file-p (buffer-file-name (marker-buffer org-log-note-marker))))) + +(defun org-roam-log--setup () + "Run hooks in `org-roam-log-setup-hook'." + (run-hooks 'org-roam-log-setup-hook)) + +(add-hook 'org-roam-log-setup-hook #'org-roam--register-completion-functions-h) +(add-hook 'org-log-buffer-setup-hook #'org-roam-log--setup) + +(provide 'org-roam-log) +;;; org-roam-log.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-log.elc b/.packages/org-roam-20251125.729/org-roam-log.elc new file mode 100644 index 0000000..97fdf78 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-log.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-migrate.el b/.packages/org-roam-20251125.729/org-roam-migrate.el new file mode 100644 index 0000000..88ebbec --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-migrate.el @@ -0,0 +1,162 @@ +;;; org-roam-migrate.el --- Migration utilities from v1 to v2 -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; 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, 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: +;; +;; This is a special library provided for the v1 users of this package. It's +;; purpose is to ease the transition from v1 to v2, by providing migration +;; utilities to convert from v1 notes to v2 nodes. +;; +;;; Code: +(require 'org-roam) + +;;; Migration wizard (v1 -> v2) +;;;###autoload +(defun org-roam-migrate-wizard () + "Migrate all notes from to be compatible with Org-roam v2. +1. Convert all notes from v1 format to v2. +2. Rebuild the cache. +3. Replace all file links with ID links." + (interactive) + (when (yes-or-no-p "Org-roam will now convert all your notes from v1 to v2. +This will take a while. Are you sure you want to do this?") + ;; Back up notes + (let ((backup-dir (expand-file-name "org-roam.bak" + (file-name-directory (directory-file-name org-roam-directory))))) + (message "Backing up files to %s" backup-dir) + (copy-directory org-roam-directory backup-dir)) + + ;; Upgrade database to v2 + (org-roam-db-sync 'force) + + ;; Convert v1 to v2 + (dolist (f (org-roam-list-files)) + (org-roam-with-file f nil + (org-roam-migrate-v1-to-v2))) + + ;; Rebuild cache + (org-roam-db-sync 'force) + + ;;Replace all file links with ID links + (dolist (f (org-roam-list-files)) + (org-roam-with-file f nil + (org-roam-migrate-replace-file-links-with-id) + (save-buffer))))) + +(defun org-roam-migrate-v1-to-v2 () + "Convert the current buffer to v2 format." + ;; Create file level ID + (org-with-point-at 1 + (org-id-get-create)) + ;; Replace roam_key into properties drawer roam_ref + (when-let* ((refs (mapcan #'split-string-and-unquote + (cdar (org-collect-keywords '("roam_key")))))) + (let ((case-fold-search t)) + (org-with-point-at 1 + (dolist (ref refs) + (org-roam-ref-add ref)) + (while (re-search-forward "^#\\+roam_key:" (point-max) t) + (beginning-of-line) + (kill-line 1))))) + + ;; Replace roam_alias into properties drawer roam_aliases + (when-let* ((aliases (mapcan #'split-string-and-unquote + (cdar (org-collect-keywords '("roam_alias")))))) + (dolist (alias aliases) + (org-roam-alias-add alias))) + (let ((case-fold-search t)) + (org-with-point-at 1 + (while (re-search-forward "^#\\+roam_alias:" (point-max) t) + (beginning-of-line) + (kill-line 1)))) + + ;; Replace #+roam_tags into #+filetags + (org-with-point-at 1 + (let* ((roam-tags (org-roam-migrate-get-prop-list "ROAM_TAGS")) + (file-tags (cl-mapcan (lambda (value) + (cl-mapcan + (lambda (k) (org-split-string k ":")) + (split-string value))) + (org-roam-migrate-get-prop-list "FILETAGS"))) + (tags (append roam-tags file-tags)) + (tags (seq-map (lambda (tag) + (replace-regexp-in-string + "[^[:alnum:]_@#%]" + "_" + tag)) tags)) + (tags (seq-uniq tags))) + (when tags + (org-roam-migrate-prop-set "filetags" (org-make-tag-string tags)))) + (let ((case-fold-search t)) + (org-with-point-at 1 + (while (re-search-forward "^#\\+roam_tags:" (point-max) t) + (beginning-of-line) + (kill-line 1))))) + (save-buffer)) + +(defun org-roam-migrate-get-prop-list (keyword) + "Return prop list for KEYWORD." + (let ((re (format "^#\\+%s:[ \t]*\\([^\n]+\\)" (upcase keyword))) + lst) + (goto-char (point-min)) + (while (re-search-forward re 2048 t) + (setq lst (append lst (split-string-and-unquote + (buffer-substring-no-properties + (match-beginning 1) (match-end 1)))))) + lst)) + +(defun org-roam-migrate-prop-set (name value) + "Set a file property called NAME to VALUE in buffer file. +If the property is already set, replace its value." + (setq name (downcase name)) + (org-with-point-at 1 + (let ((case-fold-search t)) + (if (re-search-forward (concat "^#\\+" name ":\\(.*\\)") + (point-max) t) + (replace-match (concat "#+" name ": " value) 'fixedcase) + (while (and (not (eobp)) + (looking-at "^[#:]")) + (if (save-excursion (end-of-line) (eobp)) + (progn + (end-of-line) + (insert "\n")) + (forward-line) + (beginning-of-line))) + (insert "#+" name ": " value "\n"))))) + +(defun org-roam-migrate-replace-file-links-with-id () + "Replace all file: links with ID links in current buffer." + (org-with-point-at 1 + (while (re-search-forward org-link-bracket-re nil t) + (let* ((mdata (match-data)) + (path (match-string 1)) + (desc (match-string 2))) + (when (string-prefix-p "file:" path) + (setq path (expand-file-name (substring path 5))) + (when-let* ((node-id (caar (org-roam-db-query [:select [id] :from nodes + :where (= file $s1) + :and (= level 0)] path)))) + (set-match-data mdata) + (replace-match (org-link-make-string (concat "id:" node-id) + desc) nil t))))))) + +(provide 'org-roam-migrate) +;;; org-roam-migrate.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-migrate.elc b/.packages/org-roam-20251125.729/org-roam-migrate.elc new file mode 100644 index 0000000..824d1f2 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-migrate.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-mode.el b/.packages/org-roam-20251125.729/org-roam-mode.el new file mode 100644 index 0000000..89b5f21 --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-mode.el @@ -0,0 +1,722 @@ +;;; org-roam-mode.el --- Major mode for special Org-roam buffers -*- lexical-binding: t -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; 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, 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: +;; +;; This module implements `org-roam-mode', which is a major mode that used by +;; special Org-roam buffers to display various content in a section-like manner +;; about the nodes and relevant to them information (e.g. backlinks) with which +;; the user can interact with. +;; +;;; Code: +(require 'org-roam) + +;;;; Declarations +(defvar org-ref-buffer-hacked) + +;;; Options +(defcustom org-roam-mode-sections (list #'org-roam-backlinks-section + #'org-roam-reflinks-section) + "A list of sections for the `org-roam-mode' based buffers. +Each section is a function that is passed the `org-roam-node' +for which the section will be constructed as the first +argument. Normally this node is `org-roam-buffer-current-node'. +The function may also accept other optional arguments. Each item +in the list is either: + +1. A function, which is called only with the `org-roam-node' as the argument +2. A list, containing the function and the optional arguments. + +For example, one can add + + (org-roam-backlinks-section :unique t) + +to the list to pass :unique t to the section-rendering function." + :group 'org-roam + :type `(repeat (choice (symbol :tag "Function") + (list :tag "Function with arguments" + (symbol :tag "Function") + (repeat :tag "Arguments" :inline t (sexp :tag "Arg")))))) + +(defcustom org-roam-buffer-postrender-functions (list) + "Functions to run after the Org-roam buffer is rendered. +Each function accepts no arguments, and is run with the Org-roam +buffer as the current buffer." + :group 'org-roam + :type 'hook) + +(defcustom org-roam-preview-function #'org-roam-preview-default-function + "The preview function to use to populate the Org-roam buffer. + +The function takes no arguments, but the point is temporarily set +to the exact location of the backlink." + :group 'org-roam + :type 'function) + +(defcustom org-roam-preview-postprocess-functions (list #'org-roam-strip-comments) + "A list of functions to postprocess the preview content. + +Each function takes a single argument, the string for the preview +content, and returns the post-processed string. The functions are +applied in order of appearance in the list." + :group 'org-roam + :type 'hook) + +;;; Faces +(defface org-roam-header-line + `((((class color) (background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "DarkGoldenrod4" + :weight bold) + (((class color) (background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :foreground "LightGoldenrod2" + :weight bold)) + "Face for the `header-line' in some Org-roam modes." + :group 'org-roam-faces) + +(defface org-roam-title + '((t :weight bold)) + "Face for Org-roam titles." + :group 'org-roam-faces) + +(defface org-roam-olp + '((((class color) (background light)) :foreground "grey60") + (((class color) (background dark)) :foreground "grey40")) + "Face for the OLP of the node." + :group 'org-roam-faces) + +(defface org-roam-preview-heading + `((((class color) (background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "grey80" + :foreground "grey30") + (((class color) (background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "grey25" + :foreground "grey70")) + "Face for preview headings." + :group 'org-roam-faces) + +(defface org-roam-preview-heading-highlight + `((((class color) (background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "grey75" + :foreground "grey30") + (((class color) (background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :background "grey35" + :foreground "grey70")) + "Face for current preview headings." + :group 'org-roam-faces) + +(defface org-roam-preview-heading-selection + `((((class color) (background light)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit org-roam-preview-heading-highlight + :foreground "salmon4") + (((class color) (background dark)) + ,@(and (>= emacs-major-version 27) '(:extend t)) + :inherit org-roam-preview-heading-highlight + :foreground "LightSalmon3")) + "Face for selected preview headings." + :group 'org-roam-faces) + +(defface org-roam-preview-region + `((t :inherit bold + ,@(and (>= emacs-major-version 27) + (list :extend (ignore-errors (face-attribute 'region :extend)))))) + "Face used by `org-roam-highlight-preview-region-using-face'. + +This face is overlaid over text that uses other hunk faces, +and those normally set the foreground and background colors. +The `:foreground' and especially the `:background' properties +should be avoided here. Setting the latter would cause the +loss of information. Good properties to set here are `:weight' +and `:slant'." + :group 'org-roam-faces) + +(defface org-roam-dim + '((((class color) (background light)) :foreground "grey60") + (((class color) (background dark)) :foreground "grey40")) + "Face for the dimmer part of the widgets." + :group 'org-roam-faces) + +;;; Major mode +(defvar org-roam-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map magit-section-mode-map) + (define-key map [C-return] 'org-roam-buffer-visit-thing) + (define-key map (kbd "C-m") 'org-roam-buffer-visit-thing) + (define-key map [remap revert-buffer] 'org-roam-buffer-refresh) + map) + "Parent keymap for all keymaps of modes derived from `org-roam-mode'.") + +(define-derived-mode org-roam-mode magit-section-mode "Org-roam" + "Major mode for displaying relevant information about Org-roam nodes. +This mode is used by special Org-roam buffers, such as persistent +`org-roam-buffer' and dedicated Org-roam buffers +\(`org-roam-buffer-display-dedicated'), which render the +information in a section-like manner (see +`org-roam-mode-sections'), with which the user can +interact with." + :group 'org-roam + (face-remap-add-relative 'header-line 'org-roam-header-line) + ;; https://github.com/meedstrom/org-node/issues/149 + (setq-local font-lock-defaults nil)) + +;;; Buffers +(defvar org-roam-buffer-current-node nil + "The node for which an `org-roam-mode' based buffer displays its contents. +This set both, locally and globally. Normally the local value is +only set in the `org-roam-mode' based buffers, while the global +value shows the current node in the persistent `org-roam-buffer'.") + +(put 'org-roam-buffer-current-node 'permanent-local t) + +(defvar org-roam-buffer-current-directory nil + "The `org-roam-directory' value of `org-roam-buffer-current-node'. +Set both, locally and globally in the same way as +`org-roam-buffer-current-node'.") + +(put 'org-roam-buffer-current-directory 'permanent-local t) + +;;;; Library +(defun org-roam-buffer-visit-thing () + "This is a placeholder command. +Where applicable, section-specific keymaps bind another command +which visits the thing at point." + (interactive) + (user-error "There is no thing at point that could be visited")) + +(defun org-roam-buffer-file-at-point (&optional assert) + "Return the file at point in the current `org-roam-mode' based buffer. +If ASSERT, throw an error." + (if-let* ((file (magit-section-case + (org-roam-node-section (org-roam-node-file (oref it node))) + (org-roam-grep-section (oref it file)) + (org-roam-preview-section (oref it file)) + (t (cl-assert (derived-mode-p 'org-roam-mode)))))) + file + (when assert + (user-error "No file at point")))) + +(defun org-roam-buffer-refresh () + "Refresh the contents of the currently selected Org-roam buffer." + (interactive) + (cl-assert (derived-mode-p 'org-roam-mode)) + (save-excursion (org-roam-buffer-render-contents))) + +(defun org-roam-buffer-render-contents () + "Recompute and render the contents of an Org-roam buffer. +Assumes that the current buffer is an `org-roam-mode' based +buffer." + (let ((inhibit-read-only t)) + (erase-buffer) + (org-roam-mode) + (setq-local default-directory org-roam-buffer-current-directory) + (setq-local org-roam-directory org-roam-buffer-current-directory) + (org-roam-buffer-set-header-line-format + (org-roam-node-title org-roam-buffer-current-node)) + (magit-insert-section (org-roam) + (magit-insert-heading) + (dolist (section org-roam-mode-sections) + (pcase section + ((pred functionp) + (funcall section org-roam-buffer-current-node)) + (`(,fn . ,args) + (apply fn (cons org-roam-buffer-current-node args))) + (_ + (user-error "Invalid `org-roam-mode-sections' specification"))))) + (run-hooks 'org-roam-buffer-postrender-functions) + (goto-char 0))) + +(defun org-roam-buffer-set-header-line-format (string) + "Set the header-line using STRING. +If the `face' property of any part of STRING is already set, then +that takes precedence. Also pad the left side of STRING so that +it aligns with the text area." + (setq-local header-line-format + (concat (propertize " " 'display '(space :align-to 0)) + string))) + +;;;; Dedicated buffer +;;;###autoload +(defun org-roam-buffer-display-dedicated (node) + "Launch NODE dedicated Org-roam buffer. +Unlike the persistent `org-roam-buffer', the contents of this +buffer won't be automatically changed and will be held in place. + +In interactive calls prompt to select NODE, unless called with +`universal-argument', in which case NODE will be set to +`org-roam-node-at-point'." + (interactive + (list (if current-prefix-arg + (org-roam-node-at-point 'assert) + (org-roam-node-read nil nil nil 'require-match)))) + (let ((buffer (get-buffer-create (org-roam-buffer--dedicated-name node)))) + (with-current-buffer buffer + (setq-local org-roam-buffer-current-node node) + (setq-local org-roam-buffer-current-directory org-roam-directory) + (org-roam-buffer-render-contents)) + (display-buffer buffer))) + +(defun org-roam-buffer--dedicated-name (node) + "Construct buffer name for NODE dedicated Org-roam buffer." + (let ((title (org-roam-node-title node)) + (filename (file-relative-name (org-roam-node-file node) org-roam-directory))) + (format "*org-roam: %s<%s>*" title filename))) + +(defun org-roam-buffer-dedicated-p (&optional buffer) + "Return t if an Org-roam BUFFER is a node dedicated one. +See `org-roam-buffer-display-dedicated' for more details. +If BUFFER is nil, default it to `current-buffer'." + (or buffer (setq buffer (current-buffer))) + (string-match-p (concat "^" (regexp-quote "*org-roam: ")) + (buffer-name buffer))) + +;;;; Persistent buffer +(defvar org-roam-buffer "*org-roam*" + "The persistent Org-roam buffer name. Must be surround with \"*\". +The content inside of this buffer will be automatically updated +to the nearest node at point that comes from the current buffer. +To toggle its display use `org-roam-buffer-toggle' command.") + +(defun org-roam-buffer-toggle () + "Toggle display of the persistent `org-roam-buffer'." + (interactive) + (pcase (org-roam-buffer--visibility) + ('visible + (progn + (quit-window nil (get-buffer-window org-roam-buffer)) + (remove-hook 'post-command-hook #'org-roam-buffer--redisplay-h))) + ((or 'exists 'none) + (progn + (display-buffer (get-buffer-create org-roam-buffer)) + (org-roam-buffer-persistent-redisplay))))) + +(define-inline org-roam-buffer--visibility () + "Return the current visibility state of the persistent `org-roam-buffer'. +Valid states are `visible', `exists' and `none'." + (declare (side-effect-free t)) + (inline-quote + (cond + ((get-buffer-window org-roam-buffer) 'visible) + ((get-buffer org-roam-buffer) 'exists) + (t 'none)))) + +(defun org-roam-buffer-persistent-redisplay () + "Recompute contents of the persistent `org-roam-buffer'. +Has no effect when there's no `org-roam-node-at-point'." + (when-let* ((node (org-roam-node-at-point))) + (unless (equal node org-roam-buffer-current-node) + (setq org-roam-buffer-current-node node + org-roam-buffer-current-directory org-roam-directory) + (with-current-buffer (get-buffer-create org-roam-buffer) + (org-roam-buffer-render-contents) + (add-hook 'kill-buffer-hook #'org-roam-buffer--persistent-cleanup-h nil t))))) + +(defun org-roam-buffer--persistent-cleanup-h () + "Clean-up global state that's dedicated for the persistent `org-roam-buffer'." + (setq-default org-roam-buffer-current-node nil + org-roam-buffer-current-directory nil)) + +(add-hook 'org-roam-find-file-hook #'org-roam-buffer--setup-redisplay-h) +(defun org-roam-buffer--setup-redisplay-h () + "Setup automatic redisplay of the persistent `org-roam-buffer'." + (add-hook 'post-command-hook #'org-roam-buffer--redisplay-h nil t)) + +(defun org-roam-buffer--redisplay-h () + "Reconstruct the persistent `org-roam-buffer'. +This needs to be quick or infrequent, because this designed to +run at `post-command-hook'." + (and (get-buffer-window org-roam-buffer) + (org-roam-buffer-persistent-redisplay))) + +;;; Sections +;;;; Node +(defvar org-roam-node-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map org-roam-mode-map) + (define-key map [remap org-roam-buffer-visit-thing] 'org-roam-node-visit) + map) + "Keymap for `org-roam-node-section's.") + +(defclass org-roam-node-section (magit-section) + ((keymap :initform 'org-roam-node-map) + (node :initform nil)) + "A `magit-section' used by `org-roam-mode' to outline NODE in its own heading.") + +(cl-defun org-roam-node-insert-section (&key source-node point properties) + "Insert section for a link from SOURCE-NODE to some other node. +The other node is normally `org-roam-buffer-current-node'. + +SOURCE-NODE is an `org-roam-node' that links or references with +the other node. + +POINT is a character position where the link is located in +SOURCE-NODE's file. + +PROPERTIES (a plist) contains additional information about the +link. + +Despite the name, this function actually inserts 2 sections at +the same time: + +1. `org-roam-node-section' for a heading that describes + SOURCE-NODE. Acts as a parent section of the following one. + +2. `org-roam-preview-section' for a preview content that comes + from SOURCE-NODE's file for the link (that references the + other node) at POINT. Acts a child section of the previous + one." + (magit-insert-section section (org-roam-node-section) + (let ((outline (if-let* ((outline (plist-get properties :outline))) + (mapconcat #'org-link-display-format outline " > ") + "Top"))) + (insert (concat (propertize (org-roam-node-title source-node) + 'font-lock-face 'org-roam-title) + (format " (%s)" + (propertize outline 'font-lock-face 'org-roam-olp))))) + (magit-insert-heading) + (oset section node source-node) + (magit-insert-section section (org-roam-preview-section) + (insert (org-roam-fontify-like-in-org-mode + (org-roam-preview-get-contents (org-roam-node-file source-node) point)) + "\n") + (oset section file (org-roam-node-file source-node)) + (oset section point point) + (insert ?\n)))) + +;;;; Preview +(defvar org-roam-preview-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map org-roam-mode-map) + (define-key map [remap org-roam-buffer-visit-thing] 'org-roam-preview-visit) + map) + "Keymap for `org-roam-preview-section's.") + +(defclass org-roam-preview-section (magit-section) + ((keymap :initform 'org-roam-preview-map) + (file :initform nil) + (point :initform nil)) + "A `magit-section' used by `org-roam-mode' to contain preview content. +The preview content comes from FILE, and the link as at POINT.") + +(defun org-roam-preview-visit (file point &optional other-window) + "Visit FILE at POINT and return the visited buffer. +With OTHER-WINDOW non-nil do so in another window. +In interactive calls OTHER-WINDOW is set with +`universal-argument'." + (interactive (list (org-roam-buffer-file-at-point 'assert) + (oref (magit-current-section) point) + current-prefix-arg)) + (let ((buf (find-file-noselect file)) + (display-buffer-fn (if other-window + #'switch-to-buffer-other-window + #'pop-to-buffer-same-window))) + (funcall display-buffer-fn buf) + (with-current-buffer buf + (widen) + (goto-char point)) + (when (org-invisible-p) (org-fold-show-context)) + buf)) + +(defun org-roam-preview-default-function () + "Return the preview content at point. + +This function returns the all contents under the current +headline, up to the next headline." + (let ((beg (save-excursion + (org-roam-end-of-meta-data t) + (point))) + (end (save-excursion + (org-next-visible-heading 1) + (point)))) + (string-trim (buffer-substring-no-properties beg end)))) + +(defun org-roam-preview-get-contents (file pt) + "Get preview content for FILE at PT." + (save-excursion + (org-roam-with-temp-buffer file + (org-with-wide-buffer + (goto-char pt) + (let ((s (funcall org-roam-preview-function))) + (dolist (fn org-roam-preview-postprocess-functions) + (setq s (funcall fn s))) + s))))) + +;;;; Backlinks +(cl-defstruct (org-roam-backlink (:constructor org-roam-backlink-create) + (:copier nil)) + source-node target-node + point properties) + +(cl-defmethod org-roam-populate ((backlink org-roam-backlink)) + "Populate BACKLINK from database." + (setf (org-roam-backlink-source-node backlink) + (org-roam-populate (org-roam-backlink-source-node backlink)) + (org-roam-backlink-target-node backlink) + (org-roam-populate (org-roam-backlink-target-node backlink))) + backlink) + +(cl-defun org-roam-backlinks-get (node &key unique) + "Return the backlinks for NODE. + + When UNIQUE is nil, show all positions where references are found. + When UNIQUE is t, limit to unique sources." + (let* ((sql (if unique + [:select :distinct [source dest pos properties] + :from links + :where (= dest $s1) + :and (= type "id") + :group :by source + :having (funcall min pos)] + [:select [source dest pos properties] + :from links + :where (= dest $s1) + :and (= type "id")])) + (backlinks (org-roam-db-query sql (org-roam-node-id node)))) + (cl-loop for backlink in backlinks + collect (pcase-let ((`(,source-id ,dest-id ,pos ,properties) backlink)) + (org-roam-populate + (org-roam-backlink-create + :source-node (org-roam-node-create :id source-id) + :target-node (org-roam-node-create :id dest-id) + :point pos + :properties properties)))))) + +(defun org-roam-backlinks-sort (a b) + "Default sorting function for backlinks A and B. +Sorts by title." + (string< (org-roam-node-title (org-roam-backlink-source-node a)) + (org-roam-node-title (org-roam-backlink-source-node b)))) + +(cl-defun org-roam-backlinks-section (node &key (unique nil) (show-backlink-p nil) + (section-heading "Backlinks:")) + "The backlinks section for NODE. + +When UNIQUE is nil, show all positions where references are found. +When UNIQUE is t, limit to unique sources. + +When SHOW-BACKLINK-P is not null, only show backlinks for which +this predicate is not nil. + +SECTION-HEADING is the string used as a heading for the backlink section." + (when-let* ((backlinks (seq-sort #'org-roam-backlinks-sort (org-roam-backlinks-get node :unique unique)))) + (magit-insert-section (org-roam-backlinks) + (magit-insert-heading section-heading) + (dolist (backlink backlinks) + (when (or (null show-backlink-p) + (and (not (null show-backlink-p)) + (funcall show-backlink-p backlink))) + (org-roam-node-insert-section + :source-node (org-roam-backlink-source-node backlink) + :point (org-roam-backlink-point backlink) + :properties (org-roam-backlink-properties backlink)))) + (insert ?\n)))) + +;;;; Reflinks +(cl-defstruct (org-roam-reflink (:constructor org-roam-reflink-create) + (:copier nil)) + source-node ref + point properties) + +(cl-defmethod org-roam-populate ((reflink org-roam-reflink)) + "Populate REFLINK from database." + (setf (org-roam-reflink-source-node reflink) + (org-roam-populate (org-roam-reflink-source-node reflink))) + reflink) + +(defun org-roam-reflinks-get (node) + "Return the reflinks for NODE." + (let ((refs (org-roam-db-query [:select :distinct [refs:ref links:source links:pos links:properties] + :from refs + :left-join links + :where (= refs:node-id $s1) + :and (= links:dest refs:ref) + :union + :select :distinct [refs:ref citations:node-id + citations:pos citations:properties] + :from refs + :left-join citations + :where (= refs:node-id $s1) + :and (= citations:cite-key refs:ref)] + (org-roam-node-id node))) + links) + (pcase-dolist (`(,ref ,source-id ,pos ,properties) refs) + (push (org-roam-populate + (org-roam-reflink-create + :source-node (org-roam-node-create :id source-id) + :ref ref + :point pos + :properties properties)) links)) + links)) + +(defun org-roam-reflinks-sort (a b) + "Default sorting function for reflinks A and B. +Sorts by title." + (string< (org-roam-node-title (org-roam-reflink-source-node a)) + (org-roam-node-title (org-roam-reflink-source-node b)))) + +(defun org-roam-reflinks-section (node) + "The reflinks section for NODE." + (when-let* ((refs (org-roam-node-refs node)) + (reflinks (seq-sort #'org-roam-reflinks-sort (org-roam-reflinks-get node)))) + (magit-insert-section (org-roam-reflinks) + (magit-insert-heading "Reflinks:") + (dolist (reflink reflinks) + (org-roam-node-insert-section + :source-node (org-roam-reflink-source-node reflink) + :point (org-roam-reflink-point reflink) + :properties (org-roam-reflink-properties reflink))) + (insert ?\n)))) + +;;;; Grep +(defvar org-roam-grep-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map org-roam-mode-map) + (define-key map [remap org-roam-buffer-visit-thing] 'org-roam-grep-visit) + map) + "Keymap for Org-roam grep result sections.") + +(defclass org-roam-grep-section (magit-section) + ((keymap :initform 'org-roam-grep-map) + (file :initform nil) + (row :initform nil) + (col :initform nil)) + "A `magit-section' used by `org-roam-mode' to contain grep output.") + +(defun org-roam-grep-visit (file &optional other-window row col) + "Visit FILE at row ROW (if any) and column COL (if any). Return the buffer. +With OTHER-WINDOW non-nil (in interactive calls set with +`universal-argument') display the buffer in another window +instead." + (interactive (list (org-roam-buffer-file-at-point t) + current-prefix-arg + (oref (magit-current-section) row) + (oref (magit-current-section) col))) + (let ((buf (find-file-noselect file)) + (display-buffer-fn (if other-window + #'switch-to-buffer-other-window + #'pop-to-buffer-same-window))) + (funcall display-buffer-fn buf) + (with-current-buffer buf + (widen) + (goto-char (point-min)) + (when row + (forward-line (1- row))) + (when col + (forward-char (1- col)))) + (when (org-invisible-p) (org-fold-show-context)) + buf)) + +;;;; Unlinked references +(defvar org-roam-unlinked-references-result-re + (rx (group (one-or-more anything)) + ":" + (group (one-or-more digit)) + ":" + (group (one-or-more digit)) + ":" + (group (zero-or-more anything))) + "Regex for the return result of a ripgrep query.") + +(defun org-roam-unlinked-references-preview-line (file row) + "Return the preview line from FILE. +This is the ROW within FILE." + (with-temp-buffer + (insert-file-contents file) + (forward-line (1- row)) + (buffer-substring-no-properties + (save-excursion + (beginning-of-line) + (point)) + (save-excursion + (end-of-line) + (point))))) + +(defun org-roam-unlinked-references--rg-command (titles temp-file) + "Return the ripgrep command searching for TITLES using TEMP-FILE for pattern. +This avoids shell escaping issues by writing the pattern to a file instead +of passing it directly through the shell command line." + ;; Write pattern to temp file to avoid shell escaping issues with quotes, + ;; spaces, and other special characters in titles + (with-temp-file temp-file + (insert "\\[([^[]]++|(?R))*\\]" + (mapconcat (lambda (title) + ;; Use regexp-quote instead of shell-quote-argument + ;; since we're writing a regex pattern, not a shell argument + (format "|(\\b%s\\b)" (regexp-quote title))) + titles ""))) + + (concat "rg --follow --only-matching --vimgrep --pcre2 --ignore-case " + (mapconcat (lambda (glob) (concat "--glob " glob)) + (org-roam--list-files-search-globs org-roam-file-extensions) + " ") + " --file " (shell-quote-argument temp-file) " " + (shell-quote-argument (expand-file-name org-roam-directory)))) + +(defun org-roam-unlinked-references-section (node) + "The unlinked references section for NODE. +References from FILE are excluded." + (when (and (executable-find "rg") + (org-roam-node-title node) + (not (string-match "PCRE2 is not available" + (shell-command-to-string "rg --pcre2-version")))) + (let* ((titles (cons (org-roam-node-title node) + (org-roam-node-aliases node))) + ;; Create temp file for the regex pattern + (temp-file (make-temp-file "org-roam-rg-pattern-")) + (rg-command (org-roam-unlinked-references--rg-command titles temp-file))) + ;; Use unwind-protect to ensure temp file cleanup even if errors occur + (unwind-protect + (let* ((results (split-string (shell-command-to-string rg-command) "\n")) + f row col match) + (magit-insert-section (unlinked-references) + (magit-insert-heading "Unlinked References:") + (dolist (line results) + (save-match-data + (when (string-match org-roam-unlinked-references-result-re line) + (setq f (match-string 1 line) + row (string-to-number (match-string 2 line)) + col (string-to-number (match-string 3 line)) + match (match-string 4 line)) + (when (and match + (not (file-equal-p (org-roam-node-file node) f)) + (member (downcase match) (mapcar #'downcase titles))) + (magit-insert-section section (org-roam-grep-section) + (oset section file f) + (oset section row row) + (oset section col col) + (insert (propertize (format "%s:%s:%s" + (truncate-string-to-width (file-name-base f) 15 nil nil t) + row col) 'font-lock-face 'org-roam-dim) + " " + (org-roam-fontify-like-in-org-mode + (org-roam-unlinked-references-preview-line f row)) + "\n")))))) + (insert ?\n))) + ;; Clean up temp file - this runs even if an error occurs above + (delete-file temp-file))))) + +(provide 'org-roam-mode) +;;; org-roam-mode.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-mode.elc b/.packages/org-roam-20251125.729/org-roam-mode.elc new file mode 100644 index 0000000..3717c4b Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-mode.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-node.el b/.packages/org-roam-20251125.729/org-roam-node.el new file mode 100644 index 0000000..af1ca78 --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-node.el @@ -0,0 +1,1171 @@ +;;; org-roam-node.el --- Interfacing and interacting with nodes -*- lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; 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, 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: +;; +;; This module is dedicated for Org-roam nodes and its components. It provides +;; standard means to interface with them, both programmatically and +;; interactively. +;; +;;; Code: +(require 'crm) +(require 'subr-x) +(require 'org-roam) + +;;; Options +;;;; Completing-read +(defcustom org-roam-node-display-template "${title}" + "Configures display formatting for Org-roam node. + +If it is a function, it will be called to format a node. +Its result is expected to be a string (potentially with +embedded properties). + +If it is a string and it will be used as described in org-roam + (see org-roam-node-display-template) + +When it is a string, the following processing is done: + +Patterns of form \"${field-name:length}\" are interpolated based +on the current node. + +Each \"field-name\" is replaced with the return value of each +corresponding accessor function for `org-roam-node', e.g. +\"${title}\" will be interpolated by the result of +`org-roam-node-title'. You can also define custom accessors using +`cl-defmethod'. For example, you can define: + + (cl-defmethod org-roam-node-my-title ((node org-roam-node)) + (concat \"My \" (org-roam-node-title node))) + +and then reference it here or in the capture templates as +\"${my-title}\". + +\"length\" is an optional specifier and declares how many +characters can be used to display the value of the corresponding +field. If it\\='s not specified, the field will be inserted as is, +i.e. it won\\='t be aligned nor trimmed. If it\\='s an integer, the +field will be aligned accordingly and all the exceeding +characters will be trimmed out. If it\\='s \"*\", the field will use +as many characters as possible and will be aligned accordingly. + +A closure can also be assigned to this variable in which case the +closure is evaluated and the return value is used as the +template. The closure must evaluate to a valid template string. + +When org-roam-node-display-template is a function, the function is +expected to return a string, potentially propertized. For example, the +following function shows the title and base filename of the node: + +\(defun my--org-roam-format (node) + \"formats the node\" + (format \"%-40s %s\" + (if (org-roam-node-title node) + (propertize (org-roam-node-title node) \\='face \\='org-todo) + \"\") + (file-name-nondirectory (org-roam-node-file node)))) + +\(setq org-roam-node-display-template \\='my--org-roam-format)" + :group 'org-roam + :type '(choice string function)) + +(defcustom org-roam-node-annotation-function #'org-roam-node-read--annotation + "This function used to attach annotations for `org-roam-node-read'. +It takes a single argument NODE, which is an `org-roam-node' construct." + :group 'org-roam + :type 'function) + +(defcustom org-roam-node-default-sort 'file-mtime + "Default sort order for Org-roam node completions." + :type '(choice + (const :tag "none" nil) + (const :tag "file-mtime" file-mtime) + (const :tag "file-atime" file-atime)) + :group 'org-roam) + +(defcustom org-roam-node-formatter nil + "The link description for node insertion. +If a function is provided, the function should take a single +argument, an `org-roam-node', and return a string. + +If a string is provided, it is a template string expanded by +`org-roam-node--format-entry'." + :group 'org-roam + :type '(choice string function)) + +(defcustom org-roam-node-template-prefixes + '(("tags" . "#") + ("todo" . "t:")) + "Prefixes for each of the node's properties. +This is used in conjunction with +`org-roam-node-display-template': in minibuffer completions the +node properties will be prefixed with strings in this variable, +acting as a query language of sorts. + +For example, if a node has tags (\"foo\" \"bar\") and the alist +has the entry (\"tags\" . \"#\"), these will appear as +\"#foo #bar\"." + :group 'org-roam + :type '(alist)) + +(defcustom org-roam-ref-annotation-function #'org-roam-ref-read--annotation + "This function used to attach annotations for `org-roam-ref-read'. +It takes a single argument REF, which is a propertized string." + :group 'org-roam + :type '(function)) + +(defcustom org-roam-ref-prompt-function nil + "Function to prompt for ref strings in `org-roam-ref-add'. +Should take no arguments, prompt the user, and return a string." + :group 'org-roam + :type 'function) + +;;;; Completion-at-point +(defcustom org-roam-completion-everywhere nil + "When non-nil, provide link completion matching outside of Org links." + :group 'org-roam + :type 'boolean) + +(defcustom org-roam-completion-functions (list #'org-roam-complete-link-at-point + #'org-roam-complete-everywhere) + "List of functions to be used with `completion-at-point' for Org-roam." + :group 'org-roam + :type 'hook) + +;;;; Linkage +(defcustom org-roam-link-auto-replace t + "If non-nil, replace \"roam:\" links to existing nodes with \"id:\" links." + :group 'org-roam + :type 'boolean) + +(defcustom org-roam-extract-new-file-path "%<%Y%m%d%H%M%S>-${slug}.org" + "The file path template to use when a node is extracted to its own file. +This path is relative to `org-roam-directory'." + :group 'org-roam + :type 'string) + +(defvar org-roam-link-type "roam" + "Link type for org-roam nodes. +Replaced by `id' automatically when `org-roam-link-auto-replace' is non-nil.") + +(defvar org-roam-node-history nil + "Minibuffer history of nodes.") + +(defvar org-roam-ref-history nil + "Minibuffer history of refs.") + +;;; Definition +(cl-defstruct (org-roam-node (:constructor org-roam-node-create) + (:constructor org-roam-node-create-from-db + (title aliases ; 2 + id file file-title level todo ; 5 + point priority scheduled deadline properties ;;5 + olp file-atime file-mtime tags refs)) ;;5 + (:copier nil)) + "A heading or top level file with an assigned ID property." + file file-title file-hash file-atime file-mtime + id level point todo priority scheduled deadline title properties olp + tags aliases refs) + +(cl-defmethod org-roam-node-slug ((node org-roam-node)) + "Return the slug of NODE." + (org-roam-node-slugify (org-roam-node-title node))) + +(defun org-roam-node-slugify (title) + "Slugify TITLE." + (require 'ucs-normalize) + (let ((slug-trim-chars + ;; Combining Diacritical Marks https://www.unicode.org/charts/PDF/U0300.pdf + ;; For why these specific glyphs: https://github.com/org-roam/org-roam/pull/1460 + '( #x300 #x301 #x302 #x303 #x304 #x306 #x307 + #x308 #x309 #x30A #x30B #x30C #x31B #x323 + #x324 #x325 #x327 #x32D #x32E #x330 #x331))) + (thread-last title + (ucs-normalize-NFD-string) ;; aka. `string-glyph-decompose' from Emacs 29 + (seq-remove (lambda (char) (memq char slug-trim-chars))) + (apply #'string) + (ucs-normalize-NFC-string) ;; aka. `string-glyph-compose' from Emacs 29 + (replace-regexp-in-string "[^[:alnum:]]" "_") ;; convert anything not alphanumeric + (replace-regexp-in-string "__*" "_") ;; remove sequential underscores + (replace-regexp-in-string "^_" "") ;; remove starting underscore + (replace-regexp-in-string "_$" "") ;; remove ending underscore + (downcase)))) + +(cl-defmethod org-roam-node-formatted ((node org-roam-node)) + "Return a formatted string for NODE." + (pcase org-roam-node-formatter + ((pred functionp) + (funcall org-roam-node-formatter node)) + ((pred stringp) + (org-roam-node--format-entry (org-roam-node--process-display-format org-roam-node-formatter) node)) + (_ + (org-roam-node-title node)))) + +(cl-defmethod org-roam-node-category ((node org-roam-node)) + "Return the category for NODE." + (cdr (assoc-string "CATEGORY" (org-roam-node-properties node)))) + +;;; Nodes +;;;; Getters +(defun org-roam-node-at-point (&optional assert) + "Return the node at point. +If ASSERT, throw an error if there is no node at point. +This function also returns the node if it has yet to be cached in the +database. In this scenario, only expect `:id' and `:point' to be +populated." + (or (magit-section-case + (org-roam-node-section (oref it node)) + (org-roam-preview-section (save-excursion + (magit-section-up) + (org-roam-node-at-point))) + (t (org-with-wide-buffer + (while (not (or (org-roam-db-node-p) + (bobp) + (eq (funcall outline-level) + (save-excursion + (org-roam-up-heading-or-point-min) + (funcall outline-level))))) + (org-roam-up-heading-or-point-min)) + (when-let* ((id (org-id-get))) + (org-roam-populate + (org-roam-node-create + :id id + :point (point))))))) + (and assert (user-error "No node at point")))) + +(defun org-roam-node-from-id (id) + "Return an `org-roam-node' for the node containing ID. +Return nil if a node with ID does not exist." + (when (> (caar (org-roam-db-query [:select (funcall count) :from nodes + :where (= id $s1)] + id)) 0) + (org-roam-populate (org-roam-node-create :id id)))) + +(defun org-roam-node-from-title-or-alias (s &optional nocase) + "Return an `org-roam-node' for the node with title or alias S. +Return nil if the node does not exist. +Throw an error if multiple choices exist. + +If NOCASE is non-nil, the query is case insensitive. +It is case sensitive otherwise." + (let ((matches (seq-uniq + (append + (org-roam-db-query (vconcat [:select [id] :from nodes + :where (= title $s1)] + (if nocase [ :collate NOCASE ])) + s) + (org-roam-db-query (vconcat [:select [node-id] :from aliases + :where (= alias $s1)] + (if nocase [ :collate NOCASE ])) + s))))) + (cond + ((seq-empty-p matches) + nil) + ((= 1 (length matches)) + (org-roam-populate (org-roam-node-create :id (caar matches)))) + (t + (user-error "Multiple nodes exist with title or alias \"%s\"" s))))) + +(defun org-roam-node-from-ref (ref) + "Return an `org-roam-node' from REF reference. +Return nil if there's no node with such REF." + (save-match-data + (let (type path) + (cond + ((string-match org-link-plain-re ref) + (setq type (match-string 1 ref) + path (match-string 2 ref))) + ((string-prefix-p "@" ref) + (setq type "cite" + path (substring ref 1)))) + (when (and type path) + (when-let* ((id (caar (org-roam-db-query + [:select [nodes:id] + :from refs + :left-join nodes + :on (= refs:node-id nodes:id) + :where (= refs:type $s1) + :and (= refs:ref $s2) + :limit 1] + type path)))) + (org-roam-populate (org-roam-node-create :id id))))))) + +(cl-defmethod org-roam-populate ((node org-roam-node)) + "Populate NODE from database. +Uses the ID, and fetches remaining details from the database. +This can be quite costly: avoid, unless dealing with very few +nodes." + (when-let* ((node-info (car (org-roam-db-query [:select [ + file level pos todo priority + scheduled deadline title properties olp] + :from nodes + :where (= id $s1) + :limit 1] + (org-roam-node-id node))))) + (pcase-let* ((`(,file ,level ,pos ,todo ,priority ,scheduled ,deadline ,title ,properties ,olp) node-info) + (`(,atime ,mtime ,file-title) (car (org-roam-db-query [:select [atime mtime title] + :from files + :where (= file $s1)] + file))) + (tag-info (mapcar #'car (org-roam-db-query [:select [tag] :from tags + :where (= node-id $s1)] + (org-roam-node-id node)))) + (alias-info (mapcar #'car (org-roam-db-query [:select [alias] :from aliases + :where (= node-id $s1)] + (org-roam-node-id node)))) + (refs-info (mapcar #'car (org-roam-db-query [:select [ref] :from refs + :where (= node-id $s1)] + (org-roam-node-id node))))) + (setf (org-roam-node-file node) file + (org-roam-node-file-title node) file-title + (org-roam-node-file-atime node) atime + (org-roam-node-file-mtime node) mtime + (org-roam-node-level node) level + (org-roam-node-point node) pos + (org-roam-node-todo node) todo + (org-roam-node-priority node) priority + (org-roam-node-scheduled node) scheduled + (org-roam-node-deadline node) deadline + (org-roam-node-title node) title + (org-roam-node-properties node) properties + (org-roam-node-olp node) olp + (org-roam-node-tags node) tag-info + (org-roam-node-refs node) refs-info + (org-roam-node-aliases node) alias-info))) + node) + +(defun org-roam-node-list () + "Return all nodes stored in the database as a list of `org-roam-node's." + (let ((rows (org-roam-db-query + " +SELECT + title, + aliases, + + id, + file, + filetitle, + \"level\", + todo, + + pos, + priority , + scheduled , + deadline , + properties , + + olp, + atime, + mtime, + '(' || group_concat(tags, ' ') || ')' as tags, + refs +FROM + ( + SELECT + id, + file, + filetitle, + \"level\", + todo, + pos, + priority , + scheduled , + deadline , + title, + properties , + olp, + atime, + mtime, + tags, + '(' || group_concat(aliases, ' ') || ')' as aliases, + refs + FROM + ( + SELECT + nodes.id as id, + nodes.file as file, + nodes.\"level\" as \"level\", + nodes.todo as todo, + nodes.pos as pos, + nodes.priority as priority, + nodes.scheduled as scheduled, + nodes.deadline as deadline, + nodes.title as title, + nodes.properties as properties, + nodes.olp as olp, + files.atime as atime, + files.mtime as mtime, + files.title as filetitle, + tags.tag as tags, + aliases.alias as aliases, + '(' || group_concat(RTRIM (refs.\"type\", '\"') || ':' || LTRIM(refs.ref, '\"'), ' ') || ')' as refs + FROM nodes + LEFT JOIN files ON files.file = nodes.file + LEFT JOIN tags ON tags.node_id = nodes.id + LEFT JOIN aliases ON aliases.node_id = nodes.id + LEFT JOIN refs ON refs.node_id = nodes.id + GROUP BY nodes.id, tags.tag, aliases.alias ) + GROUP BY id, tags ) +GROUP BY id +"))) + (mapcan + (lambda (row) + (let ( + (all-titles (cons (car row) (nth 1 row))) + ) + (mapcar (lambda (temp-title) + (apply 'org-roam-node-create-from-db (cons temp-title (cdr row)))) + all-titles) + )) + rows) + ) + ) + +;;;; Finders +(defun org-roam-node-marker (node) + "Get the marker for NODE." + (let* ((file (org-roam-node-file node)) + (buffer (or (find-buffer-visiting file) + (find-file-noselect file)))) + (with-current-buffer buffer + (move-marker (make-marker) (org-roam-node-point node) buffer)))) + +(defun org-roam-node-open (node &optional cmd force) + "Go to the node NODE. +CMD is the command used to display the buffer. If not provided, +`org-link-frame-setup' is respected. Assumes that the node is +fully populated, with file and point. If NODE is already visited, +this won't automatically move the point to the beginning of the +NODE, unless FORCE is non-nil." + (interactive (list (org-roam-node-at-point) current-prefix-arg)) + (org-mark-ring-push) + (let ((m (org-roam-node-marker node)) + (cmd (or cmd + (cdr + (assq + (cdr (assq 'file org-link-frame-setup)) + '((find-file . switch-to-buffer) + (find-file-other-window . switch-to-buffer-other-window) + (find-file-other-frame . switch-to-buffer-other-frame)))) + 'switch-to-buffer-other-window))) + (if (not (equal (current-buffer) (marker-buffer m))) + (funcall cmd (marker-buffer m))) + (when (or force + (not (equal (org-roam-node-id node) + (org-roam-id-at-point)))) + (goto-char m)) + (move-marker m nil)) + (org-fold-show-context)) + +(defun org-roam-node-visit (node &optional other-window force) + "From the current buffer, visit NODE. Return the visited buffer. +Display the buffer in the selected window. With a prefix +argument OTHER-WINDOW display the buffer in another window +instead. + +If NODE is already visited, this won't automatically move the +point to the beginning of the NODE, unless FORCE is non-nil. In +interactive calls FORCE always set to t." + (interactive (list (org-roam-node-at-point t) current-prefix-arg t)) + (org-roam-node-open node (if other-window + #'switch-to-buffer-other-window + #'pop-to-buffer-same-window) + force)) + +;;;###autoload +(cl-defun org-roam-node-find (&optional other-window initial-input filter-fn pred &key templates) + "Find and open an Org-roam node by its title or alias. +INITIAL-INPUT is the initial input for the prompt. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +If OTHER-WINDOW, visit the NODE in another window. +The TEMPLATES, if provided, override the list of capture templates (see +`org-roam-capture-'.)" + (interactive current-prefix-arg) + (let ((node (org-roam-node-read initial-input filter-fn pred))) + (if (org-roam-node-file node) + (org-roam-node-visit node other-window) + (org-roam-capture- + :node node + :templates templates + :props '(:finalize find-file))))) + +;;;###autoload +(defun org-roam-node-random (&optional other-window filter-fn) + "Find and open a random Org-roam node. +With prefix argument OTHER-WINDOW, visit the node in another +window instead. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out." + (interactive current-prefix-arg) + (org-roam-node-visit + (cdr (seq-random-elt (org-roam-node-read--completions filter-fn))) + other-window)) + +;;;; Completing-read interface +(defun org-roam-node-read (&optional initial-input filter-fn sort-fn require-match prompt) + "Read and return an `org-roam-node'. +INITIAL-INPUT is the initial minibuffer prompt value. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +SORT-FN is a function to sort nodes. See `org-roam-node-read-sort-by-file-mtime' +for an example sort function. +If REQUIRE-MATCH, the minibuffer prompt will require a match. +PROMPT is a string to show at the beginning of the mini-buffer, +defaulting to \"Node: \"" + (let* ((nodes (org-roam-node-read--completions filter-fn sort-fn)) + (prompt (or prompt "Node: ")) + (node (completing-read + prompt + (lambda (string pred action) + (if (eq action 'metadata) + `(metadata + ;; Preserve sorting in the completion UI if a sort-fn is used + ,@(when sort-fn + '((display-sort-function . identity) + (cycle-sort-function . identity))) + (annotation-function + . ,(lambda (title) + (funcall org-roam-node-annotation-function + (get-text-property 0 'node title)))) + (category . org-roam-node)) + (complete-with-action action nodes string pred))) + nil require-match initial-input 'org-roam-node-history))) + (or (cdr (assoc node nodes)) + (org-roam-node-create :title node)))) + +(defun org-roam--format-nodes-using-template (nodes) + "Formats NODES using org-roam template features. +Uses org-roam--node-display-template." + (let ( + (wTemplate (org-roam-node--process-display-format org-roam-node-display-template)) + ) + (mapcar (lambda (node) + (org-roam-node-read--to-candidate node wTemplate)) nodes)) + ) + +(defun org-roam--format-nodes-using-function (nodes) + "Formats NODES using the function org-roam-node-display-template." + (mapcar (lambda (node) + (cons + (propertize (funcall org-roam-node-display-template node) 'node node) + node)) + nodes) + ) + +(defun org-roam-node-read--completions (&optional filter-fn sort-fn) + "Return an alist for node completion. +The car is the displayed title or alias for the node, and the cdr +is the `org-roam-node'. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +SORT-FN is a function to sort nodes. See `org-roam-node-read-sort-by-file-mtime' +for an example sort function. +The displayed title is formatted according to `org-roam-node-display-template'." + (let* ( + (nodes (org-roam-node-list)) + (nodes (if filter-fn + (cl-remove-if-not + (lambda (n) (funcall filter-fn n)) + nodes) + nodes)) + (nodes (if (functionp org-roam-node-display-template) + (org-roam--format-nodes-using-function nodes) + (org-roam--format-nodes-using-template nodes))) + + (sort-fn (or sort-fn + (when org-roam-node-default-sort + (intern (concat "org-roam-node-read-sort-by-" + (symbol-name org-roam-node-default-sort)))))) + (nodes (if sort-fn (seq-sort sort-fn nodes) + nodes))) + nodes)) + +(defun org-roam-node-read--to-candidate (node template) + "Return a minibuffer completion candidate given NODE. +TEMPLATE is the processed template used to format the entry." + (let ((candidate-main (org-roam-node--format-entry + template + node + (1- (if (bufferp (current-buffer)) + (window-width) (frame-width)))))) + (cons (propertize candidate-main 'node node) node))) + +(defun org-roam-node--format-entry (template node &optional width) + "Formats NODE for display in the results list. +WIDTH is the width of the results list. +TEMPLATE is the processed template used to format the entry." + (pcase-let ((`(,tmpl . ,tmpl-width) template)) + (org-roam-format-template + tmpl + (lambda (field _default-val) + (pcase-let* ((`(,field-name ,field-width) (split-string field ":")) + (getter (intern (concat "org-roam-node-" field-name))) + (field-value (funcall getter node))) + (when (and (equal field-name "file") + field-value) + (setq field-value (file-relative-name field-value org-roam-directory))) + (when (and (equal field-name "olp") + field-value) + (setq field-value (string-join field-value " > "))) + (when (and field-value (not (listp field-value))) + (setq field-value (list field-value))) + (setq field-value (mapconcat + (lambda (v) + (concat (or (cdr (assoc field-name org-roam-node-template-prefixes)) + "") + v)) + field-value " ")) + (setq field-width (cond + ((not field-width) + field-width) + ((string-equal field-width "*") + (if width + (- width tmpl-width) + tmpl-width)) + ((>= (string-to-number field-width) 0) + (string-to-number field-width)))) + (when field-width + (let* ((truncated (truncate-string-to-width field-value field-width 0 ?\s)) + (tlen (length truncated)) + (len (length field-value))) + (if (< tlen len) + ;; Make the truncated part of the string invisible. If strings + ;; are pre-propertized with display or invisible properties, the + ;; formatting may get messed up. Ideally, truncated strings are + ;; not preformatted with these properties. Face properties are + ;; allowed without restriction. + (put-text-property tlen len 'invisible t field-value) + ;; If the string wasn't truncated, but padded, use this string instead. + (setq field-value truncated)))) + field-value))))) + +(defun org-roam-node--process-display-format (format) + "Pre-calculate minimal widths needed by the FORMAT string." + (let* ((fields-width 0) + (string-width + (string-width + (org-roam-format-template + format + (lambda (field _default-val) + (setq fields-width + (+ fields-width + (string-to-number + (or (cadr (split-string field ":")) + ""))))))))) + (cons format (+ fields-width string-width)))) + +(defun org-roam-node-read-sort-by-file-mtime (completion-a completion-b) + "Sort files such that files modified more recently are shown first. +COMPLETION-A and COMPLETION-B are items in the form of +\(node-title org-roam-node-struct)" + (let ((node-a (cdr completion-a)) + (node-b (cdr completion-b))) + (time-less-p (org-roam-node-file-mtime node-b) + (org-roam-node-file-mtime node-a)))) + +(defun org-roam-node-read-sort-by-file-atime (completion-a completion-b) + "Sort files such that files accessed more recently are shown first. +COMPLETION-A and COMPLETION-B are items in the form of +\(node-title org-roam-node-struct)" + (let ((node-a (cdr completion-a)) + (node-b (cdr completion-b))) + (time-less-p (org-roam-node-file-atime node-b) + (org-roam-node-file-atime node-a)))) + +(defun org-roam-node-read--annotation (_node) + "Placeholder function. Return empty string for annotations." + "") + +;;;; Linkage +;;;;; [id:] link +;;;###autoload +(cl-defun org-roam-node-insert (&optional filter-fn &key templates info) + "Find an Org-roam node and insert (where the point is) an \"id:\" link to it. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +The TEMPLATES, if provided, override the list of capture templates (see +`org-roam-capture-'.) +The INFO, if provided, is passed to the underlying `org-roam-capture-'." + (interactive) + (unwind-protect + ;; Group functions together to avoid inconsistent state on quit + (atomic-change-group + (let* (region-text + beg end + (_ (when (region-active-p) + (setq beg (set-marker (make-marker) (region-beginning))) + (setq end (set-marker (make-marker) (region-end))) + (setq region-text (org-link-display-format (buffer-substring-no-properties beg end))))) + (node (org-roam-node-read region-text filter-fn)) + (description (or region-text + (org-roam-node-formatted node)))) + (if (org-roam-node-id node) + (progn + (when region-text + (delete-region beg end) + (set-marker beg nil) + (set-marker end nil)) + (let ((id (org-roam-node-id node))) + (insert (org-link-make-string + (concat "id:" id) + description)) + (run-hook-with-args 'org-roam-post-node-insert-hook + id + description))) + (org-roam-capture- + :node node + :info info + :templates templates + :props (append + (when (and beg end) + (list :region (cons beg end))) + (list :link-description description + :finalize 'insert-link)))))) + (deactivate-mark))) + +;;;;; [roam:] link +(org-link-set-parameters org-roam-link-type :follow #'org-roam-link-follow-link) +(defun org-roam-link-follow-link (title-or-alias) + "Navigate \"roam:\" link to find and open the node with TITLE-OR-ALIAS. +Assumes that the cursor was put where the link is." + (if-let* ((node (org-roam-node-from-title-or-alias title-or-alias))) + (progn + (when org-roam-link-auto-replace + (org-roam-link-replace-at-point)) + (org-mark-ring-push) + (org-roam-node-visit node nil 'force)) + (org-roam-capture- + :node (org-roam-node-create :title title-or-alias) + :props '(:finalize find-file)))) + +(defun org-roam-link-replace-at-point (&optional link) + "Replace \"roam:\" LINK at point with an \"id:\" link." + (save-excursion + (save-match-data + (let* ((link (or link (org-element-context))) + (type (org-element-property :type link)) + (path (org-element-property :path link)) + (desc (and (org-element-property :contents-begin link) + (org-element-property :contents-end link) + (buffer-substring-no-properties + (org-element-property :contents-begin link) + (org-element-property :contents-end link)))) + node) + (goto-char (org-element-property :begin link)) + (when (and (org-in-regexp org-link-any-re 1) + (string-equal type org-roam-link-type) + (setq node (save-match-data (org-roam-node-from-title-or-alias path)))) + (replace-match (org-link-make-string + (concat "id:" (org-roam-node-id node)) + (or desc path)))))))) + +(defun org-roam-link-replace-all () + "Replace all \"roam:\" links in buffer with \"id:\" links." + (interactive) + (org-with-point-at 1 + (while (search-forward (concat "[[" org-roam-link-type ":") nil t) + (org-roam-link-replace-at-point)))) + +(add-hook 'org-roam-find-file-hook #'org-roam--replace-roam-links-on-save-h) +(defun org-roam--replace-roam-links-on-save-h () + "Run `org-roam-link-replace-all' before buffer is saved to its file." + (when org-roam-link-auto-replace + (add-hook 'before-save-hook #'org-roam-link-replace-all nil t))) + +;;;;;; Completion-at-point interface +(defconst org-roam-bracket-completion-re + "\\[\\[\\(\\(?:roam:\\)?\\)\\([^z-a]*?\\)]]" + "Regex for completion within link brackets. +We use this as a substitute for `org-link-bracket-re', because +`org-link-bracket-re' requires content within the brackets for a match.") + +(defun org-roam-complete-link-at-point () + "Complete \"roam:\" link at point to an existing Org-roam node." + (let (roam-p start end) + (when (org-in-regexp org-roam-bracket-completion-re 1) + (setq roam-p (not (or (org-in-src-block-p) + (string-blank-p (match-string 1)))) + start (match-beginning 2) + end (match-end 2)) + (list start end + (org-roam--get-titles) + :exit-function + (lambda (str &rest _) + (delete-char (- 0 (length str))) + (insert (concat (unless roam-p "roam:") + str)) + (forward-char 2)))))) + +(defun org-roam-complete-everywhere () + "Complete symbol at point as a link completion to an Org-roam node. +This is a `completion-at-point' function, and is active when +`org-roam-completion-everywhere' is non-nil. + +Unlike `org-roam-complete-link-at-point' this will complete even +outside of the bracket syntax for links (i.e. \"[[roam:|]]\"), +hence \"everywhere\"." + (when (and org-roam-completion-everywhere + (thing-at-point 'word) + (not (org-in-src-block-p)) + (not (save-match-data (org-in-regexp org-link-any-re)))) + (let ((bounds (bounds-of-thing-at-point 'word))) + (list (car bounds) (cdr bounds) + (org-roam--get-titles) + :exit-function + (lambda (str _status) + (delete-char (- (length str))) + (insert "[[roam:" str "]]")) + ;; Proceed with the next completion function if the returned titles + ;; do not match. This allows the default Org capfs or custom capfs + ;; of lower priority to run. + :exclusive 'no)))) + +(add-hook 'org-roam-find-file-hook #'org-roam--register-completion-functions-h) +(add-hook 'org-roam-indirect-buffer-hook #'org-roam--register-completion-functions-h) + +(defun org-roam--register-completion-functions-h () + "Setup `org-roam-completion-functions' for `completion-at-point'." + (dolist (f org-roam-completion-functions) + (add-hook 'completion-at-point-functions f nil t))) + +;;;; Editing +(defun org-roam-demote-entire-buffer () + "Convert an org buffer with any top level content to a single node. + +All headings are demoted one level. + +The #+TITLE: keyword is converted into a level-1 heading and deleted. +Any tags declared on #+FILETAGS: are transferred to tags on the new top heading. + +Any top level properties drawers are incorporated into the new heading." + (interactive) + (org-with-point-at 1 + (org-map-region #'org-do-demote + (point-min) (point-max)) + (insert "* " + (org-roam--get-keyword "title") + "\n") + (org-back-to-heading) + (org-set-tags (org-roam--get-keyword "filetags")) + (org-roam-erase-keyword "title") + (org-roam-erase-keyword "filetags"))) + +(defun org-roam--h1-count () + "Count level-1 headings in the current file." + (let ((h1-count 0)) + (org-with-wide-buffer + (org-map-region (lambda () + (if (= (org-current-level) 1) + (cl-incf h1-count))) + (point-min) (point-max)) + h1-count))) + +(defun org-roam--buffer-promoteable-p () + "Verify that this buffer is promoteable: +There is a single level-1 heading +and no extra content before the first heading." + (and + (= (org-roam--h1-count) 1) + (org-with-point-at 1 (org-at-heading-p)))) + +(defun org-roam-promote-entire-buffer () + "Promote the current buffer, and save. +Converts a file containing a single level-1 headline node to a file +node." + (interactive) + (org-roam--promote-entire-buffer-internal) + (org-roam-db-update-file)) + +(defun org-roam--promote-entire-buffer-internal () + "Promote the current buffer." + (unless (org-roam--buffer-promoteable-p) + (user-error "Cannot promote: multiple root headings or there is extra file-level text")) + (org-with-point-at 1 + (let ((title (nth 4 (org-heading-components))) + (tags (org-get-tags))) + (org-fold-show-all) + (kill-whole-line) + (org-roam-end-of-meta-data t) + (insert "#+title: " title "\n") + (when tags (org-roam-tag-add tags)) + (org-map-region #'org-promote (point-min) (point-max))))) + +;;;###autoload +(defun org-roam-refile (node) + "Refile node at point to an org-roam NODE. + +If region is active, then use it instead of the node at point." + (interactive + (list (org-roam-node-read nil nil nil 'require-match))) + (let* ((regionp (org-region-active-p)) + (region-start (and regionp (region-beginning))) + (region-end (and regionp (region-end))) + (file (org-roam-node-file node)) + (nbuf (or (find-buffer-visiting file) + (find-file-noselect file))) + level reversed) + (if (equal (org-roam-node-at-point) node) + (user-error "Target is the same as current node") + (if regionp + (progn + (org-kill-new (buffer-substring region-start region-end)) + (org-save-markers-in-region region-start region-end)) + (progn + (if (org-before-first-heading-p) + (org-roam-demote-entire-buffer)) + (org-copy-subtree 1 nil t))) + (with-current-buffer nbuf + (org-with-wide-buffer + (goto-char (org-roam-node-point node)) + (setq level (org-get-valid-level (funcall outline-level) 1) + reversed (org-notes-order-reversed-p)) + (goto-char + (if reversed + (or (outline-next-heading) (point-max)) + (or (save-excursion (org-get-next-sibling)) + (org-end-of-subtree t t) + (point-max)))) + (unless (bolp) (newline)) + (org-paste-subtree level nil nil t) + (and org-auto-align-tags + (let ((org-loop-over-headlines-in-active-region nil)) + (org-align-tags))) + (when (fboundp 'deactivate-mark) (deactivate-mark)))) + (if regionp + (delete-region (point) (+ (point) (- region-end region-start))) + (org-preserve-local-variables + (delete-region + (and (org-back-to-heading t) (point)) + (min (1+ (buffer-size)) (org-end-of-subtree t t) (point))))) + ;; If the buffer end-up empty after the refile, kill it and delete its + ;; associated file. + (when (eq (buffer-size) 0) + (if (buffer-file-name) + (delete-file (buffer-file-name))) + (set-buffer-modified-p nil) + ;; If this was done during capture, abort the capture process. + (when (and org-capture-mode + (buffer-base-buffer (current-buffer))) + (org-capture-kill)) + (kill-buffer (current-buffer)))))) + +;;;###autoload +(defun org-roam-extract-subtree () + "Convert current subtree at point to a node, and extract it into a new file." + (interactive) + (save-excursion + (org-back-to-heading-or-point-min t) + (when (bobp) (user-error "Already a top-level node")) + (org-id-get-create) + (save-buffer) + (org-roam-db-update-file) + (let* ((template-info nil) + (node (org-roam-node-at-point)) + (template (org-roam-format-template + (string-trim (org-capture-fill-template org-roam-extract-new-file-path)) + (lambda (key default-val) + (let ((fn (intern key)) + (node-fn (intern (concat "org-roam-node-" key))) + (ksym (intern (concat ":" key)))) + (cond + ((fboundp fn) + (funcall fn node)) + ((fboundp node-fn) + (funcall node-fn node)) + (t (let ((r (read-from-minibuffer (format "%s: " key) default-val))) + (plist-put template-info ksym r) + r))))))) + (file-path + (expand-file-name + (read-file-name "Extract node to: " + (file-name-as-directory org-roam-directory) template nil template) + org-roam-directory))) + (when (file-exists-p file-path) + (user-error "%s exists. Aborting" file-path)) + (org-cut-subtree) + (save-buffer) + (with-current-buffer (find-file-noselect file-path) + (org-paste-subtree) + (while (> (org-current-level) 1) (org-promote-subtree)) + (save-buffer) + (org-roam-promote-entire-buffer) + (save-buffer))))) + +;;; Refs +;;;; Completing-read interface +(defun org-roam-ref-read (&optional initial-input filter-fn) + "Read an Org-roam ref and return a corresponding `org-roam-node'. +INITIAL-INPUT is the initial prompt value. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out. +filtered out." + (let* ((refs (org-roam-ref-read--completions)) + (refs (cl-remove-if-not (lambda (n) + (if filter-fn (funcall filter-fn (cdr n)) t)) refs)) + (ref (completing-read "Ref: " + (lambda (string pred action) + (if (eq action 'metadata) + `(metadata + (annotation-function + . ,org-roam-ref-annotation-function) + (category . org-roam-ref)) + (complete-with-action action refs string pred))) + nil t initial-input 'org-roam-ref-history))) + (cdr (assoc ref refs)))) + +(defun org-roam-ref-read--completions () + "Return an alist for ref completion. +The car is the ref, and the cdr is the corresponding node for the ref." + (let ((rows (org-roam-db-query + [:select [id ref type nodes:file pos title] + :from refs + :left-join nodes + :on (= refs:node-id nodes:id)]))) + (cl-loop for row in rows + collect (pcase-let* ((`(,id ,ref ,type ,file ,pos ,title) row) + (node (org-roam-node-create :id id + :file file + :point pos + :title title))) + (cons + (concat (propertize ref 'node node 'type type) + (propertize id 'invisible t)) + node))))) + +(defun org-roam-ref-read--annotation (ref) + "Return the annotation for REF, which assumed to be a propertized string." + (let* ((node (get-text-property 0 'node ref)) + (title (org-roam-node-title node))) + (when title + (concat " " title)))) + +;;;; Finders +;;;###autoload +(defun org-roam-ref-find (&optional initial-input filter-fn) + "Find and open an Org-roam node that's dedicated to a specific ref. +INITIAL-INPUT is the initial input to the prompt. +FILTER-FN is a function to filter out nodes: it takes an `org-roam-node', +and when nil is returned the node will be filtered out." + (interactive) + (let* ((node (org-roam-ref-read initial-input filter-fn))) + (org-roam-node-visit node))) + +;;;; Editing +(defun org-roam-ref-add (ref) + "Add REF to the node at point." + (interactive `(,(if org-roam-ref-prompt-function + (funcall org-roam-ref-prompt-function) + (read-string "Ref: ")))) + (let ((node (org-roam-node-at-point 'assert))) + (save-excursion + (goto-char (org-roam-node-point node)) + (org-roam-property-add "ROAM_REFS" (if (member " " (string-to-list ref)) + (concat "\"" ref "\"") + ref))))) + +(defun org-roam-ref-remove (&optional ref) + "Remove a REF from the node at point." + (interactive) + (let ((node (org-roam-node-at-point 'assert))) + (save-excursion + (goto-char (org-roam-node-point node)) + (org-roam-property-remove "ROAM_REFS" ref)))) + +;;; Tags +;;;; Getters +(defun org-roam-tag-completions () + "Return list of tags for completions within Org-roam." + (let ((roam-tags (mapcar #'car (org-roam-db-query [:select :distinct [tag] :from tags]))) + (org-tags (cl-loop for tagg in org-tag-alist + nconc (pcase tagg + ('(:newline) + nil) + (`(,tag . ,_) + (list tag)) + (_ nil))))) + (seq-uniq (append roam-tags org-tags)))) + +;;;; Editing +(defun org-roam-tag-add (tags) + "Add TAGS to the node at point." + (interactive + (list (let ((crm-separator "[ ]*:[ ]*")) + (completing-read-multiple "Tag: " (org-roam-tag-completions))))) + (let ((node (org-roam-node-at-point 'assert))) + (save-excursion + (goto-char (org-roam-node-point node)) + (if (= (org-outline-level) 0) + (let ((current-tags (split-string (or (cadr (assoc "FILETAGS" + (org-collect-keywords '("filetags")))) + "") + ":" 'omit-nulls))) + (org-roam-set-keyword "filetags" (org-make-tag-string (seq-uniq (append tags current-tags))))) + (org-set-tags (seq-uniq (append tags (org-get-tags))))) + tags))) + +(defun org-roam-tag-remove (&optional tags) + "Remove TAGS from the node at point." + (interactive) + (let ((node (org-roam-node-at-point 'assert))) + (save-excursion + (goto-char (org-roam-node-point node)) + (if (= (org-outline-level) 0) + (let* ((current-tags (split-string (or (cadr (assoc "FILETAGS" + (org-collect-keywords '("filetags")))) + (user-error "No tag to remove")) + ":" 'omit-nulls)) + (tags (or tags (completing-read-multiple "Tag: " current-tags)))) + (org-roam-set-keyword "filetags" + (org-make-tag-string (seq-difference current-tags tags #'string-equal)))) + (let* ((current-tags (or (org-get-tags) + (user-error "No tag to remove"))) + (tags (or tags (completing-read-multiple "Tag: " current-tags)))) + (org-set-tags (seq-difference current-tags tags #'string-equal)))) + tags))) + +;;; Titles and Aliases +;;;; Getters +(defun org-roam--get-titles () + "Return all distinct titles and aliases in the Org-roam database." + (mapcar #'car (org-roam-db-query [:select :distinct title :from nodes + :union :select alias :from aliases]))) + +;;;; Editing +(defun org-roam-alias-add (alias) + "Add ALIAS to the node at point." + (interactive "sAlias: ") + (let ((node (org-roam-node-at-point 'assert))) + (save-excursion + (goto-char (org-roam-node-point node)) + (org-roam-property-add "ROAM_ALIASES" alias)))) + +(defun org-roam-alias-remove (&optional alias) + "Remove an ALIAS from the node at point." + (interactive) + (let ((node (org-roam-node-at-point 'assert))) + (save-excursion + (goto-char (org-roam-node-point node)) + (org-roam-property-remove "ROAM_ALIASES" alias)))) + + +(provide 'org-roam-node) +;;; org-roam-node.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-node.elc b/.packages/org-roam-20251125.729/org-roam-node.elc new file mode 100644 index 0000000..c6491a4 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-node.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-overlay.el b/.packages/org-roam-20251125.729/org-roam-overlay.el new file mode 100644 index 0000000..3f36190 --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-overlay.el @@ -0,0 +1,95 @@ +;;; org-roam-overlay.el --- Link overlay for [id:] links to Org-roam nodes -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; Author: Jethro Kuan +;; URL: https://github.com/org-roam/org-roam +;; Keywords: org-mode, roam, convenience +;; Package-Requires: ((emacs "26.1") (org "9.6") (org-roam "2.1")) + +;; 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, 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: +;; +;; This extension allows to render [[id:]] links that don't have an associated +;; descriptor with an overlay that displays the node's current title. +;; +;;; Code: +(require 'org-roam) + +(defface org-roam-overlay + '((((class color) (background light)) + :background "grey90" :box (:line-width -1 :color "black")) + (((class color) (background dark)) + :background "grey10" :box (:line-width -1 :color "white"))) + "Face for the Org-roam overlay." + :group 'org-roam-faces) + +(defun org-roam-overlay--make (l r &rest props) + "Make an overlay from L to R with PROPS." + (let ((o (make-overlay l (or r l)))) + (overlay-put o 'category 'org-roam) + (while props (overlay-put o (pop props) (pop props))) + o)) + +(defun org-roam-overlay-make-link-overlay (link) + "Create overlay for LINK." + (save-excursion + (save-match-data + (let* ((type (org-element-property :type link)) + (id (org-element-property :path link)) + (pos (org-element-property :end link)) + (desc-p (org-element-property :contents-begin link)) + node) + (when (and (string-equal type "id") + (setq node (org-roam-node-from-id id)) + (not desc-p)) + (org-roam-overlay--make + pos pos + 'after-string (format "%s " + (propertize (org-roam-node-title node) + 'face 'org-roam-overlay)))))))) + +(defun org-roam-overlay-enable () + "Enable Org-roam overlays." + (org-roam-db-map-links + (list #'org-roam-overlay-make-link-overlay))) + +(defun org-roam-overlay-disable () + "Disable Org-roam overlays." + (remove-overlays nil nil 'category 'org-roam)) + +(defun org-roam-overlay-redisplay () + "Redisplay Org-roam overlays." + (org-roam-overlay-disable) + (org-roam-overlay-enable)) + +(define-minor-mode org-roam-overlay-mode + "Overlays for Org-roam ID links. +Org-roam overlay mode is a minor mode. When enabled, +overlay displaying the node's title is displayed." + :lighter " org-roam-overlay" + (if org-roam-overlay-mode + (progn + (org-roam-overlay-enable) + (add-hook 'after-save-hook #'org-roam-overlay-redisplay nil t)) + (org-roam-overlay-disable) + (remove-hook 'after-save-hook #'org-roam-overlay-redisplay t))) + +(provide 'org-roam-overlay) +;;; org-roam-overlay.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-overlay.elc b/.packages/org-roam-20251125.729/org-roam-overlay.elc new file mode 100644 index 0000000..5d3136f Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-overlay.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-pkg.el b/.packages/org-roam-20251125.729/org-roam-pkg.el new file mode 100644 index 0000000..3af672a --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-pkg.el @@ -0,0 +1,15 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "org-roam" "20251125.729" + "A database abstraction layer for Org-mode." + '((emacs "26.1") + (compat "30.1") + (dash "2.13") + (org "9.6") + (emacsql "4.1.0") + (magit-section "3.0.0")) + :url "https://github.com/org-roam/org-roam" + :commit "f4ba41cf3d59084e182a5186d432afc9aa3fc423" + :revdesc "f4ba41cf3d59" + :keywords '("org-mode" "roam" "convenience") + :authors '(("Jethro Kuan" . "jethrokuan95@gmail.com")) + :maintainers '(("Jethro Kuan" . "jethrokuan95@gmail.com"))) diff --git a/.packages/org-roam-20251125.729/org-roam-protocol.el b/.packages/org-roam-20251125.729/org-roam-protocol.el new file mode 100644 index 0000000..4174a56 --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-protocol.el @@ -0,0 +1,173 @@ +;;; org-roam-protocol.el --- Protocol handler for roam:// links -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan +;; Author: Jethro Kuan +;; URL: https://github.com/org-roam/org-roam +;; Keywords: org-mode, roam, convenience +;; Package-Requires: ((emacs "26.1") (org "9.6") (org-roam "2.1")) + +;; 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, 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: +;; +;; This extension extends `org-protocol', adding custom Org-roam handlers to it +;; to provide the next new protocols: +;; +;; 1. "roam-node": This protocol simply opens the node given by the node ID +;; 2. "roam-ref": This protocol creates or opens the node with the given REF +;; +;; You can find detailed instructions on how to setup the protocol in the +;; documentation for Org-roam. +;; +;;; Code: +(require 'org-protocol) +(require 'ol) ;; for org-link-decode +(require 'org-roam) + +;;; Options +(defcustom org-roam-protocol-store-links nil + "Whether to store links when capturing websites with `org-roam-protocol'." + :type 'boolean + :group 'org-roam) + +(defcustom org-roam-capture-ref-templates + '(("r" "ref" plain "%?" + :target (file+head "${slug}.org" + "#+title: ${title}") + :unnarrowed t)) + "The Org-roam templates used during a capture from the roam-ref protocol. +See `org-roam-capture-templates' for the template documentation." + :group 'org-roam + :type '(repeat + (choice (list :tag "Multikey description" + (string :tag "Keys ") + (string :tag "Description")) + (list :tag "Template entry" + (string :tag "Keys ") + (string :tag "Description ") + (choice :tag "Capture Type " :value entry + (const :tag "Org entry" entry) + (const :tag "Plain list item" item) + (const :tag "Checkbox item" checkitem) + (const :tag "Plain text" plain) + (const :tag "Table line" table-line)) + (choice :tag "Template " + (string) + (list :tag "File" + (const :format "" file) + (file :tag "Template file")) + (list :tag "Function" + (const :format "" function) + (function :tag "Template function"))) + (plist :inline t + ;; Give the most common options as checkboxes + :options (((const :format "%v " :target) + (choice :tag "Node location" + (list :tag "File" + (const :format "" file) + (string :tag " File")) + (list :tag "File & Head Content" + (const :format "" file+head) + (string :tag " File") + (string :tag " Head Content")) + (list :tag "File & Outline path" + (const :format "" file+olp) + (string :tag " File") + (list :tag "Outline path" + (repeat (string :tag "Headline")))) + (list :tag "File & Head Content & Outline path" + (const :format "" file+head+olp) + (string :tag " File") + (string :tag " Head Content") + (list :tag "Outline path" + (repeat (string :tag "Headline")))))) + ((const :format "%v " :prepend) (const t)) + ((const :format "%v " :immediate-finish) (const t)) + ((const :format "%v " :jump-to-captured) (const t)) + ((const :format "%v " :empty-lines) (const 1)) + ((const :format "%v " :empty-lines-before) (const 1)) + ((const :format "%v " :empty-lines-after) (const 1)) + ((const :format "%v " :clock-in) (const t)) + ((const :format "%v " :clock-keep) (const t)) + ((const :format "%v " :clock-resume) (const t)) + ((const :format "%v " :time-prompt) (const t)) + ((const :format "%v " :tree-type) (const week)) + ((const :format "%v " :unnarrowed) (const t)) + ((const :format "%v " :table-line-pos) (string)) + ((const :format "%v " :kill-buffer) (const t)))))))) + +;;; Handlers +(defun org-roam-protocol-open-ref (info) + "Process an org-protocol://roam-ref?ref= style url with INFO. + +It opens or creates a note with the given ref. + + javascript:location.href = \\='org-protocol://roam-ref?template=r&ref=\\='+ \\ + encodeURIComponent(location.href) + \\='&title=\\=' + \\ + encodeURIComponent(document.title) + \\='&body=\\=' + \\ + encodeURIComponent(window.getSelection())" + (unless (plist-get info :ref) + (user-error "No ref key provided")) + (org-roam-plist-map! (lambda (k v) + (org-link-decode + (if (equal k :ref) + (org-protocol-sanitize-uri v) + v))) info) + (when org-roam-protocol-store-links + (push (list (plist-get info :ref) + (plist-get info :title)) org-stored-links)) + (org-link-store-props :type (and (string-match org-link-plain-re + (plist-get info :ref)) + (match-string 1 (plist-get info :ref))) + :link (plist-get info :ref) + :annotation (org-link-make-string (plist-get info :ref) + (or (plist-get info :title) + (plist-get info :ref))) + :initial (or (plist-get info :body) "")) + (raise-frame) + (let ((org-capture-link-is-already-stored t)) + (org-roam-capture- + :keys (plist-get info :template) + :node (org-roam-node-create :title (plist-get info :title)) + :info (list :ref (plist-get info :ref) + :body (plist-get info :body)) + :templates org-roam-capture-ref-templates)) + nil) + +(defun org-roam-protocol-open-node (info) + "This handler simply opens the file with emacsclient. + +INFO is a plist containing additional information passed by the protocol URL. +It should contain the FILE key, pointing to the path of the file to open. + + Example protocol string: + +org-protocol://roam-node?node=uuid" + (when-let* ((node (plist-get info :node))) + (raise-frame) + (org-roam-node-visit (org-roam-populate (org-roam-node-create :id node)) nil 'force)) + nil) + +(push '("org-roam-ref" :protocol "roam-ref" :function org-roam-protocol-open-ref) + org-protocol-protocol-alist) +(push '("org-roam-node" :protocol "roam-node" :function org-roam-protocol-open-node) + org-protocol-protocol-alist) + +(provide 'org-roam-protocol) + +;;; org-roam-protocol.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-protocol.elc b/.packages/org-roam-20251125.729/org-roam-protocol.elc new file mode 100644 index 0000000..ea93c25 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-protocol.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam-utils.el b/.packages/org-roam-20251125.729/org-roam-utils.el new file mode 100644 index 0000000..2009533 --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam-utils.el @@ -0,0 +1,442 @@ +;;; org-roam-utils.el --- Utilities for Org-roam -*- lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; 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, 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: +;; +;; This library provides definitions for utilities that used throughout the +;; whole package. +;; +;;; Code: + +(require 'org-roam) + +;;; String utilities +;; TODO Refactor this. +(defun org-roam-replace-string (old new s) + "Replace OLD with NEW in S." + (declare (pure t) (side-effect-free t)) + (replace-regexp-in-string (regexp-quote old) new s t t)) + +(defun org-roam-quote-string (s) + "Quotes string S." + (->> s + (org-roam-replace-string "\\" "\\\\") + (org-roam-replace-string "\"" "\\\""))) + +(defun org-roam-word-wrap (len s) + "If S is longer than LEN, wrap the words with newlines." + (declare (side-effect-free t)) + (save-match-data + (with-temp-buffer + (insert s) + (let ((fill-column len)) + (fill-region (point-min) (point-max))) + (buffer-substring (point-min) (point-max))))) + +(defun org-roam-string-equal (s1 s2) + "Return t if S1 and S2 are equal. +Like `string-equal', but case-insensitive." + (and (= (length s1) (length s2)) + (or (string-equal s1 s2) + (string-equal (downcase s1) (downcase s2))))) + +(defun org-roam-whitespace-content (s) + "Return the whitespace content at the end of S." + (with-temp-buffer + (insert s) + (skip-chars-backward " \t\n") + (buffer-substring-no-properties + (point) (point-max)))) + +(defun org-roam-strip-comments (s) + "Strip Org comments from string S." + (with-temp-buffer + (insert s) + (goto-char (point-min)) + (while (not (eobp)) + (if (org-at-comment-p) + (delete-region (line-beginning-position) + (progn (forward-line) (point))) + (forward-line))) + (buffer-string))) + +;;; List utilities +(defun org-roam-plist-map! (fn plist) + "Map FN over PLIST, modifying it in-place and returning it. +FN must take two arguments: the key and the value." + (let ((plist-index plist)) + (while plist-index + (let ((key (pop plist-index))) + (setf (car plist-index) (funcall fn key (car plist-index)) + plist-index (cdr plist-index))))) + plist) + +;;; File utilities +(defun org-roam-descendant-of-p (a b) + "Return t if A is descendant of B." + (unless (and a b (equal (file-truename a) (file-truename b))) + (string-prefix-p (replace-regexp-in-string "^\\([A-Za-z]\\):" 'downcase (expand-file-name b) t t) + (replace-regexp-in-string "^\\([A-Za-z]\\):" 'downcase (expand-file-name a) t t)))) + +(defmacro org-roam-with-file (file keep-buf-p &rest body) + "Execute BODY within FILE. +If FILE is nil, execute BODY in the current buffer. +Kills the buffer if KEEP-BUF-P is nil, and FILE is not yet visited." + (declare (indent 2) (debug t)) + `(let* (new-buf + (auto-mode-alist nil) + (find-file-hook nil) + (buf (or (and (not ,file) + (current-buffer)) ;If FILE is nil, use current buffer + (find-buffer-visiting ,file) ; If FILE is already visited, find buffer + (progn + (setq new-buf t) + (find-file-noselect ,file)))) ; Else, visit FILE and return buffer + res) + (with-current-buffer buf + (unless (derived-mode-p 'org-mode) + (delay-mode-hooks + (let ((org-inhibit-startup t) + (org-agenda-files nil)) + (org-mode) + (hack-local-variables)))) + (setq res (progn ,@body)) + (unless (and new-buf (not ,keep-buf-p)) + (save-buffer))) + (if (and new-buf (not ,keep-buf-p)) + (when (find-buffer-visiting ,file) + (kill-buffer (find-buffer-visiting ,file)))) + res)) + +;;; Buffer utilities +(defmacro org-roam-with-temp-buffer (file &rest body) + "Execute BODY within a temp buffer. +Like `with-temp-buffer', but propagates `org-roam-directory'. +If FILE, set `default-directory' to FILE's directory and insert its contents." + (declare (indent 1) (debug t)) + (let ((current-org-roam-directory (make-symbol "current-org-roam-directory"))) + `(let ((,current-org-roam-directory org-roam-directory)) + (with-temp-buffer + (let ((org-roam-directory ,current-org-roam-directory) + (org-inhibit-startup t)) + (delay-mode-hooks (org-mode)) + (when ,file + (insert-file-contents ,file) + (setq-local default-directory (file-name-directory ,file))) + ,@body))))) + +;;; Formatting +(defun org-roam-format-template (template replacer) + "Format TEMPLATE with the function REPLACER. +The templates are of form ${foo} for variable foo, and +${foo=default} for variable foo with default value \"default\". +REPLACER takes an argument of the format variable and the default +value (possibly nil). Adapted from `s-format'." + (let ((saved-match-data (match-data))) + (unwind-protect + (replace-regexp-in-string + "\\${\\([^}]+\\)}" + (lambda (md) + (let ((var (match-string 1 md)) + (replacer-match-data (match-data)) + default-val) + (when (string-match "\\(.+\\)=\\(.+\\)" var) + (setq default-val (match-string 2 var) + var (match-string 1 var))) + (unwind-protect + (let ((v (progn + (set-match-data saved-match-data) + (funcall replacer var default-val)))) + (if v + (format (apply #'propertize "%s" (text-properties-at 0 var)) v) + (signal 'org-roam-format-resolve md))) + (set-match-data replacer-match-data)))) + (if (functionp template) + (funcall template) + template) + ;; Need literal to make sure it works + t t) + (set-match-data saved-match-data)))) + +;;; Fontification +(defvar org-ref-buffer-hacked) + +(defvar org-roam-fontification-buffer "*org-roam-fontification-buffer*" + "The buffer helps to increase the speed of org-roam-buffer fontification.") + +(defun org-roam-get-fontification-buffer-create () + "Get or create the `org-roam-fontification-buffer'. +This buffer used to fontify multiple backlink previews efficiently (`org-mode' is booted just once)." + (with-current-buffer (get-buffer-create org-roam-fontification-buffer) + (unless (derived-mode-p 'org-mode) + (org-mode)) + (current-buffer))) + +(defun org-roam-fontify-like-in-org-mode (s) + "Fontify string S like in Org mode. +Like `org-fontify-like-in-org-mode', but supports `org-ref'." + ;; NOTE: pretend that the temporary buffer created by `org-fontify-like-in-org-mode' to + ;; fontify a `cite:' reference has been hacked by org-ref, whatever that means; + ;; + ;; `org-ref-cite-link-face-fn', which is used to supply a face for `cite:' links, calls + ;; `hack-dir-local-variables' rationalizing that `bibtex-completion' would throw some warnings + ;; otherwise. This doesn't seem to be the case and calling this function just before + ;; `org-font-lock-ensure' (alias of `font-lock-ensure') actually instead of fixing the alleged + ;; warnings messes the things so badly that `font-lock-ensure' crashes with error and doesn't let + ;; org-roam to proceed further. I don't know what's happening there exactly but disabling this hackery + ;; fixes the crashing. Fortunately, org-ref provides the `org-ref-buffer-hacked' switch, which we use + ;; here to make it believe that the buffer was hacked. + ;; + ;; This is a workaround for `cite:' links and does not have any effect on other ref types. + ;; + ;; `org-ref-buffer-hacked' is a buffer-local variable, therefore we inline + ;; `org-fontify-like-in-org-mode' here + (with-current-buffer (org-roam-get-fontification-buffer-create) + (erase-buffer) + (insert s) + (let ((org-ref-buffer-hacked t)) + (setq-local org-fold-core-style 'overlays) + (font-lock-ensure) + (buffer-string)))) + +;;; Org-mode utilities +;;;; Motions +(defun org-roam-up-heading-or-point-min () + "Fixed version of Org's `org-up-heading-or-point-min'." + (ignore-errors (org-back-to-heading t)) + (let ((p (point))) + (if (< 1 (funcall outline-level)) + (progn + (org-up-heading-safe) + (when (= (point) p) + (goto-char (point-min)))) + (unless (bobp) (goto-char (point-min)))))) + +;;;; Keywords +(defun org-roam-get-keyword (name &optional file bound) + "Return keyword property NAME from an org FILE. +FILE defaults to current file. +Only scans up to BOUND bytes of the document." + (unless bound + (setq bound 1024)) + (if file + (with-temp-buffer + (insert-file-contents file nil 0 bound) + (org-roam--get-keyword name)) + (org-roam--get-keyword name bound))) + +(defun org-roam--get-keyword (name &optional bound) + "Return keyword property NAME in current buffer. +If BOUND, scan up to BOUND bytes of the buffer." + (save-excursion + (let ((re (format "^#\\+%s:[ \t]*\\([^\n]+\\)" (upcase name)))) + (goto-char (point-min)) + (when (re-search-forward re bound t) + (buffer-substring-no-properties (match-beginning 1) (match-end 1)))))) + +(defun org-roam-end-of-meta-data (&optional full) + "Like `org-end-of-meta-data', but supports file-level metadata. + +When FULL is non-nil but not t, skip planning information, +properties, clocking lines and logbook drawers. + +When optional argument FULL is t, skip everything above, and also +skip keywords." + (org-back-to-heading-or-point-min t) + (when (org-at-heading-p) (forward-line)) + ;; Skip planning information. + (when (looking-at-p org-planning-line-re) (forward-line)) + ;; Skip property drawer. + (when (looking-at org-property-drawer-re) + (goto-char (match-end 0)) + (forward-line)) + ;; When FULL is not nil, skip more. + (when (and full (not (org-at-heading-p))) + (catch 'exit + (let ((end (save-excursion (outline-next-heading) (point))) + (re (concat "[ \t]*$" "\\|" org-clock-line-re))) + (while (not (eobp)) + (cond ;; Skip clock lines. + ((looking-at-p re) (forward-line)) + ;; Skip logbook drawer. + ((looking-at-p org-logbook-drawer-re) + (if (re-search-forward "^[ \t]*:END:[ \t]*$" end t) + (forward-line) + (throw 'exit t))) + ((looking-at-p org-drawer-regexp) + (if (re-search-forward "^[ \t]*:END:[ \t]*$" end t) + (forward-line) + (throw 'exit t))) + ;; When FULL is t, skip keywords too. + ((and (eq full t) + (looking-at-p org-keyword-regexp)) + (forward-line)) + (t (throw 'exit t)))))))) + +(defun org-roam-set-keyword (key value) + "Set keyword KEY to VALUE. +If the property is already set, it's value is replaced." + (org-with-point-at 1 + (let ((case-fold-search t)) + (if (re-search-forward (concat "^#\\+" key ":\\(.*\\)") (point-max) t) + (if (string-blank-p value) + (kill-whole-line) + (replace-match (concat " " value) 'fixedcase nil nil 1)) + (org-roam-end-of-meta-data 'drawers) + (if (save-excursion (end-of-line) (eobp)) + (progn + (end-of-line) + (insert "\n")) + (forward-line) + (beginning-of-line)) + (insert "#+" key ": " value "\n"))))) + +(defun org-roam-erase-keyword (keyword) + "Erase the line where the KEYWORD is, setting line from the top of the file." + (let ((case-fold-search t)) + (org-with-point-at 1 + (when (re-search-forward (concat "^#\\+" keyword ":") nil t) + (beginning-of-line) + (delete-region (point) (line-end-position)) + (delete-char 1))))) + +;;;; Properties +(defun org-roam-add-property (val prop) + "Add VAL value to PROP property for the node at point. +Both, VAL and PROP are strings." + (org-roam-property-add prop val)) + +(defun org-roam-remove-property (prop &optional val) + "Remove VAL value from PROP property for the node at point. +Both VAL and PROP are strings. + +If VAL is not specified, user is prompted to select a value." + (org-roam-property-remove prop val)) + +(defun org-roam-property-add (prop val) + "Add VAL value to PROP property for the node at point. +Both, VAL and PROP are strings." + (let* ((p (org-entry-get (point) prop)) + (lst (when p (split-string-and-unquote p))) + (lst (if (memq val lst) lst (cons val lst))) + (lst (seq-uniq lst))) + (org-set-property prop (combine-and-quote-strings lst)) + val)) + +(defun org-roam-property-remove (prop &optional val) + "Remove VAL value from PROP property for the node at point. +Both VAL and PROP are strings. + +If VAL is not specified, user is prompted to select a value." + (let* ((p (org-entry-get (point) prop)) + (lst (when p (split-string-and-unquote p))) + (prop-to-remove (or val (completing-read "Remove: " lst))) + (lst (delete prop-to-remove lst))) + (if lst + (org-set-property prop (combine-and-quote-strings lst)) + (org-delete-property prop)) + prop-to-remove)) + +;;; Refs +(defun org-roam-org-ref-path-to-keys (path) + "Return a list of keys given an org-ref cite: PATH. +Accounts for both v2 and v3." + (cond ((fboundp 'org-ref-parse-cite-path) + (mapcar (lambda (cite) (plist-get cite :key)) + (plist-get (org-ref-parse-cite-path path) :references))) + ((fboundp 'org-ref-split-and-strip-string) + (org-ref-split-and-strip-string path)))) + +;;; Logs +(defvar org-roam-verbose) +(defun org-roam-message (format-string &rest args) + "Pass FORMAT-STRING and ARGS to `message' when `org-roam-verbose' is t." + (when org-roam-verbose + (apply #'message `(,(concat "(org-roam) " format-string) ,@args)))) + +;;; Diagnostics +;; TODO Update this to also get commit hash +;;;###autoload +(defun org-roam-version (&optional message) + "Return `org-roam' version. +Interactively, or when MESSAGE is non-nil, show in the echo area." + (interactive) + (let* ((toplib (or load-file-name buffer-file-name)) + gitdir topdir version) + (unless (and toplib (equal (file-name-nondirectory toplib) "org-roam-utils.el")) + (setq toplib (locate-library "org-roam-utils.el"))) + (setq toplib (and toplib (org-roam--straight-chase-links toplib))) + (when toplib + (setq topdir (file-name-directory toplib) + gitdir (expand-file-name ".git" topdir))) + (when (file-exists-p gitdir) + (setq version + (let ((default-directory topdir)) + (shell-command-to-string "git describe --tags --dirty --always")))) + (unless version + (setq version (with-temp-buffer + (insert-file-contents-literally (locate-library "org-roam.el")) + (goto-char (point-min)) + (save-match-data + (if (re-search-forward "\\(?:;; Version: \\([^z-a]*?$\\)\\)" nil nil) + (substring-no-properties (match-string 1)) + "N/A"))))) + (if (or message (called-interactively-p 'interactive)) + (message "%s" version) + version))) + +(defun org-roam--straight-chase-links (filename) + "Chase links in FILENAME until a name that is not a link. + +This is the same as `file-chase-links', except that it also +handles fake symlinks that are created by the package manager +straight.el on Windows. + +See ." + (when (and (bound-and-true-p straight-symlink-emulation-mode) + (fboundp 'straight-chase-emulated-symlink)) + (when-let* ((target (straight-chase-emulated-symlink filename))) + (unless (eq target 'broken) + (setq filename target)))) + (file-chase-links filename)) + +;;;###autoload +(defun org-roam-diagnostics () + "Collect and print info for `org-roam' issues." + (interactive) + (with-current-buffer (switch-to-buffer-other-window (get-buffer-create "*org-roam diagnostics*")) + (erase-buffer) + (insert (propertize "Copy info below this line into issue:\n" 'face '(:weight bold))) + (insert (format "- Emacs: %s\n" (emacs-version))) + (insert (format "- Framework: %s\n" + (condition-case _ + (completing-read "I'm using the following Emacs framework:" + '("Doom" "Spacemacs" "N/A" "I don't know")) + (quit "N/A")))) + (insert (format "- Org: %s\n" (org-version nil 'full))) + (insert (format "- Org-roam: %s" (org-roam-version))) + (insert (format "- sqlite-connector: %s" + (if-let* ((conn (org-roam-db--get-connection))) + (eieio-object-class conn) + "not connected"))))) + +(provide 'org-roam-utils) +;;; org-roam-utils.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam-utils.elc b/.packages/org-roam-20251125.729/org-roam-utils.elc new file mode 100644 index 0000000..6ccdaad Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam-utils.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam.el b/.packages/org-roam-20251125.729/org-roam.el new file mode 100644 index 0000000..1cd934d --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam.el @@ -0,0 +1,364 @@ +;;; org-roam.el --- A database abstraction layer for Org-mode -*- coding: utf-8; lexical-binding: t; -*- + +;; Copyright © 2020-2025 Jethro Kuan + +;; Author: Jethro Kuan +;; URL: https://github.com/org-roam/org-roam +;; Keywords: org-mode, roam, convenience +;; Package-Version: 20251125.729 +;; Package-Revision: f4ba41cf3d59 +;; Package-Requires: ((emacs "26.1") (compat "30.1") (dash "2.13") (org "9.6") (emacsql "4.1.0") (magit-section "3.0.0")) + +;; 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, 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: +;; +;; Org-roam is a Roam Research inspired Emacs package and is an addition to +;; Org-mode to have a way to quickly process complex SQL-like queries over a +;; large set of plain text Org-mode files. To achieve this Org-roam provides a +;; database abstraction layer, the capabilities of which include, but are not +;; limited to: +;; +;; - Link graph traversal and visualization. +;; - Instantaneous SQL-like queries on headlines +;; - What are my TODOs, scheduled for X, or due by Y? +;; - Accessing the properties of a node, such as its tags, refs, TODO state or +;; priority. +;; +;; All of these functionality is powered by this layer. Hence, at its core +;; Org-roam's primary goal is to provide a resilient dual representation of +;; what's already available in plain text, while cached in a binary database, +;; that is cheap to maintain, easy to understand, and is as up-to-date as it +;; possibly can. For users who would like to perform arbitrary programmatic +;; queries on their Org files Org-roam also exposes an API to this database +;; abstraction layer. +;; +;; ----------------------------------------------------------------------------- +;; +;; In order for the package to correctly work through your interactive session +;; it's mandatory to add somewhere to your configuration the next form: +;; +;; (org-roam-db-autosync-mode) +;; +;; The form can be called both, before or after loading the package, which is up +;; to your preferences. If you call this before the package is loaded, then it +;; will automatically load the package. +;; +;; ----------------------------------------------------------------------------- +;; +;; This package also comes with a set of officially supported extensions that +;; provide extra features. You can find them in the "extensions/" subdirectory. +;; These extensions are not automatically loaded with `org-roam`, but they still +;; will be lazy-loaded through their own `autoload's. +;; +;; Org-roam also has other extensions that don't come together with this package. +;; Such extensions are distributed as their own packages, while also +;; authored and maintained by different people on distinct repositories. The +;; majority of them can be found at https://github.com/org-roam and MELPA. +;; +;;; Code: +(require 'dash) + +(require 'rx) +(require 'seq) +(require 'cl-lib) + +(require 'compat) + +(require 'magit-section) + +(require 'emacsql) +;; REVIEW: is this require needed? +;; emacsql-sqlite provides a common interface to an emacsql SQLite backend (e.g. emacs-sqlite-builtin) +;; not to be confused with a backend itself named emacsql-sqlite that existed in emacsql < 4.0. +(require 'emacsql-sqlite) + +(require 'org) +(require 'org-attach) ; To set `org-attach-id-dir' +(require 'org-id) +(require 'ol) +(require 'org-element) +(require 'org-capture) + +(require 'ansi-color) ; to strip ANSI color codes in `org-roam--list-files' + +(eval-when-compile + (require 'subr-x)) + +;;; Options +(defgroup org-roam nil + "A database abstraction layer for Org-mode." + :group 'org + :prefix "org-roam-" + :link '(url-link :tag "Github" "https://github.com/org-roam/org-roam") + :link '(url-link :tag "Online Manual" "https://www.orgroam.com/manual.html")) + +(defgroup org-roam-faces nil + "Faces used by Org-roam." + :group 'org-roam + :group 'faces) + +(defcustom org-roam-verbose t + "Echo messages that are not errors." + :type 'boolean + :group 'org-roam) + +(defcustom org-roam-directory (expand-file-name "~/org-roam/") + "Default path to Org-roam files. +All Org files, at any level of nesting, are considered part of the Org-roam." + :type 'directory + :group 'org-roam) + +(defcustom org-roam-find-file-hook nil + "Hook run when an Org-roam file is visited." + :group 'org-roam + :type 'hook) + +(defcustom org-roam-post-node-insert-hook nil + "Hook run when an Org-roam node is inserted as an Org link. +Each function takes two arguments: the id of the node, and the link description." + :group 'org-roam + :type 'hook) + +(defcustom org-roam-file-extensions '("org") + "List of file extensions to be included by Org-Roam. +While a file extension different from \".org\" may be used, the +file still needs to be an `org-mode' file, and it is the user's +responsibility to ensure that." + :type '(repeat string) + :group 'org-roam) + +(defcustom org-roam-file-exclude-regexp (list org-attach-id-dir) + "Files matching this regexp or list of regexps are excluded from Org-roam." + :type '(choice + (repeat + (string :tag "Regular expression matching files to ignore")) + (string :tag "Regular expression matching files to ignore") + (const :tag "Include everything" nil)) + :group 'org-roam) + +(defcustom org-roam-list-files-commands + (if (member system-type '(windows-nt ms-dos cygwin)) + nil + '(find fd fdfind rg)) + "Commands that will be used to find Org-roam files. + +It should be a list of symbols or cons cells representing any of +the following supported file search methods. + +The commands will be tried in order until an executable for a +command is found. The Elisp implementation is used if no command +in the list is found. + + `find' + + Use find as the file search method. + Example command: + find /path/to/dir -type f \ + \( -name \"*.org\" -o -name \"*.org.gpg\" -name \"*.org.age\" \) + + `fd' + + Use fd as the file search method. + Example command: + fd /path/to/dir/ --type file -e \".org\" -e \".org.gpg\" -e \".org.age\" + + `fdfind' + + Same as `fd'. It's an alias that used in some OSes (e.g. Debian, Ubuntu) + + `rg' + + Use ripgrep as the file search method. + Example command: + rg /path/to/dir/ --files -g \"*.org\" -g \"*.org.gpg\" -g \"*.org.age\" + +By default, `executable-find' will be used to look up the path to +the executable. If a custom path is required, it can be specified +together with the method symbol as a cons cell. For example: +\\='(find (rg . \"/path/to/rg\"))." + :type '(set + (const :tag "find" find) + (const :tag "fd" fd) + (const :tag "fdfind" fdfind) + (const :tag "rg" rg) + (const :tag "elisp" nil))) + +;;; Library +(defun org-roam-file-p (&optional file) + "Return t if FILE is an Org-roam file, nil otherwise. +If FILE is not specified, use the current buffer's file-path. + +FILE is an Org-roam file if: +- It's located somewhere under `org-roam-directory' +- It has a matching file extension (`org-roam-file-extensions') +- It doesn't match excluded regexp (`org-roam-file-exclude-regexp')" + (when (or file (buffer-file-name (buffer-base-buffer))) + (let* ((path (or file (buffer-file-name (buffer-base-buffer)))) + (relative-path (file-relative-name path org-roam-directory)) + (ext (org-roam--file-name-extension path)) + (ext (if (or (string= ext "gpg") + (string= ext "age")) + (org-roam--file-name-extension (file-name-sans-extension path)) + ext)) + (org-roam-dir-p (org-roam-descendant-of-p path org-roam-directory)) + (valid-file-ext-p (member ext org-roam-file-extensions)) + (match-exclude-regexp-p + (cond + ((not org-roam-file-exclude-regexp) nil) + ((stringp org-roam-file-exclude-regexp) + (string-match-p org-roam-file-exclude-regexp relative-path)) + ((listp org-roam-file-exclude-regexp) + (let (is-match) + (dolist (exclude-re org-roam-file-exclude-regexp) + (setq is-match (or is-match (string-match-p exclude-re relative-path)))) + is-match))))) + (save-match-data + (and + path + org-roam-dir-p + valid-file-ext-p + (not match-exclude-regexp-p)))))) + +;;;###autoload +(defun org-roam-list-files () + "Return a list of all Org-roam files under `org-roam-directory'. +See `org-roam-file-p' for how each file is determined to be as +part of Org-Roam." + (org-roam--list-files (expand-file-name org-roam-directory))) + +(defun org-roam-buffer-p (&optional buffer) + "Return t if BUFFER is for an Org-roam file. +If BUFFER is not specified, use the current buffer." + (let ((buffer (or buffer (current-buffer))) + path) + (with-current-buffer buffer + (and (derived-mode-p 'org-mode) + (setq path (buffer-file-name (buffer-base-buffer))) + (org-roam-file-p path))))) + +(defun org-roam-buffer-list () + "Return a list of buffers that are Org-roam files." + (--filter (org-roam-buffer-p it) + (buffer-list))) + +(defun org-roam--file-name-extension (filename) + "Return file name extension for FILENAME. +Like `file-name-extension', but does not strip version number." + (save-match-data + (let ((file (file-name-nondirectory filename))) + (if (and (string-match "\\.[^.]*\\'" file) + (not (eq 0 (match-beginning 0)))) + (substring file (+ (match-beginning 0) 1)))))) + +(defun org-roam--list-files (dir) + "Return all Org-roam files located recursively within DIR. +Use external shell commands if defined in `org-roam-list-files-commands'." + (let (path exe) + (cl-dolist (cmd org-roam-list-files-commands) + (pcase cmd + (`(,e . ,path) + (setq path (executable-find path) + exe (symbol-name e))) + ((pred symbolp) + (setq path (executable-find (symbol-name cmd)) + exe (symbol-name cmd))) + (wrong-type + (signal 'wrong-type-argument + `((consp symbolp) + ,wrong-type)))) + (when path (cl-return))) + (if-let* ((files (when path + (let ((fn (intern (concat "org-roam--list-files-" exe)))) + (unless (fboundp fn) (user-error "%s is not an implemented search method" fn)) + (funcall fn path (format "\"%s\"" dir))))) + (files (seq-filter #'org-roam-file-p files)) + (files (mapcar #'expand-file-name files))) ; canonicalize names + files + (org-roam--list-files-elisp dir)))) + +(defun org-roam--shell-command-files (cmd) + "Run CMD in the shell and return a list of files. +If no files are found, an empty list is returned." + (--> cmd + (shell-command-to-string it) + (ansi-color-filter-apply it) + (split-string it "\n") + (seq-filter (lambda (s) + (not (or (null s) (string= "" s)))) it))) + +(defun org-roam--list-files-search-globs (exts) + "Given EXTS, return a list of search globs. +E.g. (\".org\") => (\"*.org\" \"*.org.gpg\")" + (cl-loop for e in exts + append (list (format "\"*.%s\"" e) + (format "\"*.%s.gpg\"" e) + (format "\"*.%s.age\"" e)))) + +(defun org-roam--list-files-find (executable dir) + "Return all Org-roam files under DIR, using \"find\", provided as EXECUTABLE." + (let* ((globs (org-roam--list-files-search-globs org-roam-file-extensions)) + (names (string-join (mapcar (lambda (glob) (concat "-name " glob)) globs) " -o ")) + (command (string-join `(,executable "-L" ,dir "-type f \\(" ,names "\\)") " "))) + (org-roam--shell-command-files command))) + +(defun org-roam--list-files-fd (executable dir) + "Return all Org-roam files under DIR, using \"fd\", provided as EXECUTABLE." + (let* ((globs (org-roam--list-files-search-globs org-roam-file-extensions)) + (extensions (string-join (mapcar (lambda (glob) (concat "-e " (substring glob 2 -1))) globs) " ")) + (command (string-join `(,executable "-L" "--type file" ,extensions "." ,dir) " "))) + (org-roam--shell-command-files command))) + +(defalias 'org-roam--list-files-fdfind #'org-roam--list-files-fd) + +(defun org-roam--list-files-rg (executable dir) + "Return all Org-roam files under DIR, using \"rg\", provided as EXECUTABLE." + (let* ((globs (org-roam--list-files-search-globs org-roam-file-extensions)) + (command (string-join `( + ,executable "-L" ,dir "--files" + ,@(mapcar (lambda (glob) (concat "-g " glob)) globs)) " "))) + (org-roam--shell-command-files command))) + +(declare-function org-roam--directory-files-recursively "org-roam-compat") + +(defun org-roam--list-files-elisp (dir) + "Return all Org-roam files under DIR, using Elisp based implementation." + (let ((regex (concat "\\.\\(?:"(mapconcat + #'regexp-quote org-roam-file-extensions + "\\|" )"\\)\\(?:\\.gpg\\|\\.age\\)?\\'")) + result) + (dolist (file (org-roam--directory-files-recursively dir regex nil nil t) result) + (when (and (file-readable-p file) + (org-roam-file-p file)) + (push file result))))) + +;;; Package bootstrap +(provide 'org-roam) + +(cl-eval-when (load eval) + (require 'org-roam-compat) + (require 'org-roam-utils) + (require 'org-roam-db) + (require 'org-roam-node) + (require 'org-roam-id) + (require 'org-roam-capture) + (require 'org-roam-mode) + (require 'org-roam-log) + (require 'org-roam-migrate)) + +;;; org-roam.el ends here diff --git a/.packages/org-roam-20251125.729/org-roam.elc b/.packages/org-roam-20251125.729/org-roam.elc new file mode 100644 index 0000000..8a07ad3 Binary files /dev/null and b/.packages/org-roam-20251125.729/org-roam.elc differ diff --git a/.packages/org-roam-20251125.729/org-roam.info b/.packages/org-roam-20251125.729/org-roam.info new file mode 100644 index 0000000..714f97e --- /dev/null +++ b/.packages/org-roam-20251125.729/org-roam.info @@ -0,0 +1,2505 @@ +This is org-roam.info, produced by makeinfo version 6.8 from +org-roam.texi. + + Copyright (C) 2020-2025 Jethro Kuan + + You can redistribute this document and/or modify it under the terms + of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) + any later version. + + This document is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + +INFO-DIR-SECTION Emacs +START-INFO-DIR-ENTRY +* Org-roam: (org-roam). Roam Research for Emacs. +END-INFO-DIR-ENTRY + + +File: org-roam.info, Node: Top, Next: Introduction, Up: (dir) + +Org-roam User Manual +******************** + + + This manual is for Org-roam version 2.3.1. + + Copyright (C) 2020-2025 Jethro Kuan + + You can redistribute this document and/or modify it under the terms + of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) + any later version. + + This document is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + +* Menu: + +* Introduction:: +* Target Audience:: +* A Brief Introduction to the Zettelkasten Method:: +* Installation:: +* Getting Started:: +* Customizing Node Caching:: +* The Org-roam Buffer:: +* Node Properties:: +* Citations:: +* Completion:: +* Encryption:: +* The Templating System:: +* Extensions:: +* Performance Optimization:: +* The Org-mode Ecosystem:: +* FAQ:: +* Developer's Guide to Org-roam:: +* Appendix:: +* Keystroke Index:: +* Command Index:: +* Function Index:: +* Variable Index:: + +— The Detailed Node Listing — + +Installation + +* Installing from MELPA:: +* Installing from Source:: + +Getting Started + +* The Org-roam Node:: +* Links between Nodes:: +* Setting up Org-roam:: +* Creating and Linking Nodes:: +* Customizing Node Completions:: + +Customizing Node Caching + +* How to cache:: +* What to cache:: +* When to cache:: + +The Org-roam Buffer + +* Navigating the Org-roam Buffer:: +* Configuring what is displayed in the buffer:: +* Configuring the Org-roam buffer display:: +* Styling the Org-roam buffer:: + +Node Properties + +* Standard Org properties:: +* Titles and Aliases:: +* Tags:: +* Refs:: + +Citations + +* Using the Cached Information:: + +Completion + +* Completing within Link Brackets:: +* Completing anywhere:: + +The Templating System + +* Template Walkthrough:: +* Org-roam Template Expansion:: + +Extensions + +* org-roam-protocol:: +* org-roam-graph:: +* org-roam-dailies:: +* org-roam-export:: + +org-roam-protocol + +* Installation: Installation (1). +* The roam-node protocol:: +* The roam-ref protocol:: + +Installation + +* Linux:: +* Mac OS:: +* Windows:: + +org-roam-graph + +* Graph Options:: + +org-roam-dailies + +* Configuration:: +* Usage:: + +Performance Optimization + +* Garbage Collection:: + +The Org-mode Ecosystem + +* Browsing History with winner-mode:: +* Versioning Notes:: +* Full-text search with Deft:: +* Org-journal:: +* Org-download:: +* mathpix.el: mathpixel. +* Org-noter / Interleave:: +* Bibliography:: +* Spaced Repetition:: + +FAQ + +* How do I have more than one Org-roam directory?:: +* How do I create a note whose title already matches one of the candidates?:: +* How can I stop Org-roam from creating IDs everywhere?:: +* How do I migrate from Roam Research?:: +* How to migrate from Org-roam v1?:: +* How do I publish my notes with an Internet-friendly graph?:: + +How do I publish my notes with an Internet-friendly graph? + +* Configure org-mode for publishing:: +* Overriding the default link creation function:: +* Copying the generated file to the export directory:: + +Developer’s Guide to Org-roam + +* Org-roam's Design Principle:: +* Building Extensions and Advanced Customization of Org-roam:: + +Building Extensions and Advanced Customization of Org-roam + +* Accessing the Database:: +* Accessing and Modifying Nodes:: +* Extending the Capture System:: + +Appendix + +* Note-taking Workflows:: +* Ecosystem:: + + + +File: org-roam.info, Node: Introduction, Next: Target Audience, Prev: Top, Up: Top + +1 Introduction +************** + +Org-roam is a tool for networked thought. It reproduces some of Roam +Research’s (https://roamresearch.com/) (1) key features within Org-mode +(https://orgmode.org/). + + Org-roam allows for effortless non-hierarchical note-taking: with +Org-roam, notes flow naturally, making note-taking fun and easy. +Org-roam augments the Org-mode syntax, and will work for anyone already +using Org-mode for their personal wiki. + + Org-roam leverages the mature ecosystem around Org-mode. For +example, it has first-class support for org-ref +(https://github.com/jkitchin/org-ref) for citation management, and is +able to piggyback off Org’s excellent LaTeX and source-block evaluation +capabilities. + + Org-roam provides these benefits over other tooling: + + • *Privacy and Security:* Your personal wiki belongs only to you, + entirely offline and in your control. Encrypt your notes with GPG. + • *Longevity of Plain Text:* Unlike web solutions like Roam Research, + the notes are first and foremost plain Org-mode files – Org-roam + simply builds an auxiliary database to give the personal wiki + superpowers. Having your notes in plain-text is crucial for the + longevity of your wiki. Never have to worry about proprietary web + solutions being taken down. The notes are still functional even if + Org-roam ceases to exist. + • *Free and Open Source:* Org-roam is free and open-source, which + means that if you feel unhappy with any part of Org-roam, you may + choose to extend Org-roam, or open a pull request. + • *Leverage the Org-mode ecosystem:* Over the decades, Emacs and + Org-mode has developed into a mature system for plain-text + organization. Building upon Org-mode already puts Org-roam + light-years ahead of many other solutions. + • *Built on Emacs:* Emacs is also a fantastic interface for editing + text, and Org-roam inherits many of the powerful text-navigation + and editing packages available to Emacs. + + ---------- Footnotes ---------- + + (1) To understand more about Roam, a collection of links are +available in *note Note-taking Workflows::. + + +File: org-roam.info, Node: Target Audience, Next: A Brief Introduction to the Zettelkasten Method, Prev: Introduction, Up: Top + +2 Target Audience +***************** + +Org-roam is a tool that will appear unfriendly to anyone unfamiliar with +Emacs and Org-mode, but it is also extremely powerful to those willing +to put effort in mastering the intricacies. Org-roam stands on the +shoulders of giants. Emacs was first created in 1976, and remains the +tool of choice for many for editing text and designing textual +interfaces. The malleability of Emacs allowed the creation of Org-mode, +an all-purpose plain-text system for maintaining TODO lists, planning +projects, and authoring documents. Both of these tools are incredibly +vast and require significant time investment to master. + + Org-roam assumes only basic familiarity with these tools. It is not +difficult to get up and running with basic text-editing functionality, +but one will only fully appreciate the power of building Roam +functionality into Emacs and Org-mode when the usage of these tools +become more advanced. + + One key advantage to Org-roam is that building on top of Emacs gives +it malleability. This is especially important for note-taking +workflows. It is our belief that note-taking workflows are extremely +personal, and there is no one tool that’s perfect for you. Org-mode and +Org-roam allows you to discover what works for you, and build that +perfect tool for yourself. + + If you are new to the software, and choose to take this leap of +faith, I hope you find yourself equally entranced as Neal Stephenson +was. + + Emacs outshines all other editing software in approximately the + same way that the noonday sun does the stars. It is not just + bigger and brighter; it simply makes everything else vanish. – + Neal Stephenson, In the Beginning was the Command Line (1998) + + +File: org-roam.info, Node: A Brief Introduction to the Zettelkasten Method, Next: Installation, Prev: Target Audience, Up: Top + +3 A Brief Introduction to the Zettelkasten Method +************************************************* + +Org-roam provides utilities for maintaining a digital slip-box. This +section aims to provide a brief introduction to the “slip-box”, or +“Zettelkasten” method. By providing some background on the method, we +hope that the design decisions of Org-roam will become clear, and that +will aid in using Org-roam appropriately. In this section we will +introduce terms commonly used within the Zettelkasten community and the +Org-roam forums. + + The Zettelkasten is a personal tool for thinking and writing. It +places heavy emphasis on connecting ideas, building up a web of thought. +Hence, it is well suited for knowledge workers and intellectual tasks, +such as conducting research. The Zettelkasten can act as a research +partner, where conversations with it may produce new and surprising +lines of thought. + + This method is attributed to German sociologist Niklas Luhmann, who +using the method had produced volumes of written works. Luhmann’s +slip-box was simply a box of cards. These cards are small – often only +large enough to fit a single concept. The size limitation encourages +ideas to be broken down into individual concepts. These ideas are +explicitly linked together. The breakdown of ideas encourages +tangential exploration of ideas, increasing the surface for thought. +Making linking explicit between notes also encourages one to think about +the connections between concepts. + + At the corner of each note, Luhmann ascribed each note with an +ordered ID, allowing him to link and jump between notes. In Org-roam, +we simply use hyperlinks. + + Org-roam is the slip-box, digitalized in Org-mode. Every zettel +(card) is a plain-text, Org-mode file. In the same way one would +maintain a paper slip-box, Org-roam makes it easy to create new zettels, +pre-filling boilerplate content using a powerful templating system. + + *Fleeting notes* + + A slip-box requires a method for quickly capturing ideas. These are +called *fleeting notes*: they are simple reminders of information or +ideas that will need to be processed later on, or trashed. This is +typically accomplished using ‘org-capture’ (see *note (org)Capture::), +or using Org-roam’s daily notes functionality (see *note +org-roam-dailies::). This provides a central inbox for collecting +thoughts, to be processed later into permanent notes. + + *Permanent notes* + + Permanent notes are further split into two categories: *literature +notes* and *concept notes*. Literature notes can be brief annotations +on a particular source (e.g. book, website or paper), that you’d like +to access later on. Concept notes require much more care in authoring: +they need to be self-explanatory and detailed. Org-roam’s templating +system supports the addition of different templates to facilitate the +creation of these notes. + + For further reading on the Zettelkasten method, “How to Take Smart +Notes” by Sonke Ahrens is a decent guide. + + +File: org-roam.info, Node: Installation, Next: Getting Started, Prev: A Brief Introduction to the Zettelkasten Method, Up: Top + +4 Installation +************** + +Org-roam can be installed using Emacs’ package manager or manually from +its development repository. + +* Menu: + +* Installing from MELPA:: +* Installing from Source:: + + +File: org-roam.info, Node: Installing from MELPA, Next: Installing from Source, Up: Installation + +4.1 Installing from MELPA +========================= + +Org-roam is available from Melpa and Melpa-Stable. If you haven’t used +Emacs’ package manager before, you may familiarize yourself with it by +reading the documentation in the Emacs manual, see *note +(emacs)Packages::. Then, add one of the archives to ‘package-archives’: + + • To use Melpa: + + (require 'package) + (add-to-list 'package-archives + '("melpa" . "http://melpa.org/packages/") t) + + • To use Melpa-Stable: + + (require 'package) + (add-to-list 'package-archives + '("melpa-stable" . "http://stable.melpa.org/packages/") t) + + Org-roam also depends on a recent version of Org, which can be +obtained in Org’s package repository (see *note (org)Installation::). + + Once you have done that, you can install Org-roam and its +dependencies using: + + M-x package-install RET org-roam RET + + +File: org-roam.info, Node: Installing from Source, Prev: Installing from MELPA, Up: Installation + +4.2 Installing from Source +========================== + +You may install Org-roam directly from the repository on GitHub +(https://github.com/org-roam/org-roam) if you like. This will give you +access to the latest version hours or days before it appears on MELPA, +and months (or more) before it is added to the Debian or Ubuntu +repositories. This will also give you access to various developmental +branches that may be available. + + Note, however, that development version, and especially any feature +branches, may not always be in working order. You’ll need to be +prepared to do some debugging, or to manually roll-back to working +versions, if you install from GitHub. + + Installing from GitHub requires that you clone the repository: + + git clone https://github.com/org-roam/org-roam.git /path/to/org/roam + + where ‘./path/to/org/roam’ is the location you will store your copy +of the code. + + Next, you need to add this location to your load path, and ‘require’ +the Org-roam library. Add the following code to your ‘.emacs’: + + (add-to-list 'load-path "/path/to/org/roam") + (require 'org-roam) + + You now have Org-roam installed. However, you don’t necessarily have +the dependencies that it requires. These include: + + • dash + • f + • s + • org + • emacsql + • magit-section + + You can install this manually as well, or get the latest version from +MELPA. You may wish to use use-package +(https://github.com/jwiegley/use-package), straight.el +(https://github.com/raxod502/straight.el) to help manage this. + + If you would like to install the manual for access from Emacs’ +built-in Info system, you’ll need to compile the .texi source file, and +install it in an appropriate location. + + To compile the .texi source file, from a terminal navigate to the +‘/doc’ subdirectory of the Org-roam repository, and run the following: + + make infodir=/path/to/my/info/files install-info + + Where ‘/path/to/my/info/files’ is the location where you keep info +files. This target directory needs to be stored in the variable +‘Info-default-directory-list‘. If you aren’t using one of the default +info locations, you can configure this with the following in your +‘.emacs’ file: + + (require 'info) + (add-to-list 'Info-default-directory-list + "/path/to/my/info/files") + + You can also use one of the default locations, such as: + + • _usr/local/share/info_ + • _usr/share/info_ + • _usr/local/share/info_ + + If you do this, you’ll need to make sure you have write-access to +that location, or run the above ‘make’ command as root. + + Now that the info file is ready, you need to add it to the +corresponding ‘dir’ file: + + install-info /path/to/my/info/files/org-roam.info /path/to/my/info/files/dir + + +File: org-roam.info, Node: Getting Started, Next: Customizing Node Caching, Prev: Installation, Up: Top + +5 Getting Started +***************** + +* Menu: + +* The Org-roam Node:: +* Links between Nodes:: +* Setting up Org-roam:: +* Creating and Linking Nodes:: +* Customizing Node Completions:: + + +File: org-roam.info, Node: The Org-roam Node, Next: Links between Nodes, Up: Getting Started + +5.1 The Org-roam Node +===================== + +We first begin with some terminology we’ll use throughout the manual. +We term the basic denomination in Org-roam a node. We define a node as +follows: + + A node is any headline or top level file with an ID. + + For example, with this example file content: + + :PROPERTIES: + :ID: foo + :END: + #+title: Foo + + * Bar + :PROPERTIES: + :ID: bar + :END: + + We create two nodes: + + 1. A file node “Foo” with id ‘foo’. + 2. A headline node “Bar” with id ‘bar’. + + Headlines without IDs will not be considered Org-roam nodes. Org IDs +can be added to files or headlines via the interactive command ‘M-x +org-id-get-create’. + + +File: org-roam.info, Node: Links between Nodes, Next: Setting up Org-roam, Prev: The Org-roam Node, Up: Getting Started + +5.2 Links between Nodes +======================= + +We link between nodes using Org’s standard ID link (e.g. ‘id:foo’). +While only ID links will be considered during the computation of links +between nodes, Org-roam caches all other links in the documents for +external use. + + +File: org-roam.info, Node: Setting up Org-roam, Next: Creating and Linking Nodes, Prev: Links between Nodes, Up: Getting Started + +5.3 Setting up Org-roam +======================= + +Org-roam’s capabilities stem from its aggressive caching: it crawls all +files within ‘org-roam-directory’, and maintains a cache of all links +and nodes. + + To start using Org-roam, pick a location to store the Org-roam files. +The directory that will contain your notes is specified by the variable +‘org-roam-directory’. Org-roam searches recursively within +‘org-roam-directory’ for notes. This variable needs to be set before +any calls to Org-roam functions. + + For this tutorial, create an empty directory, and set +‘org-roam-directory’: + + (make-directory "~/org-roam") + (setq org-roam-directory (file-truename "~/org-roam")) + + The ‘file-truename’ function is only necessary when you use symbolic +links inside ‘org-roam-directory’: Org-roam does not resolve symbolic +links. One can however instruct Emacs to always resolve symlinks, at a +performance cost: + + (setq find-file-visit-truename t) + + Next, we setup Org-roam to run functions on file changes to maintain +cache consistency. This is achieved by running ‘M-x +org-roam-db-autosync-mode’. To ensure that Org-roam is available on +startup, place this in your Emacs configuration: + + (org-roam-db-autosync-mode) + + To build the cache manually, run ‘M-x org-roam-db-sync’. Cache +builds may take a while the first time, but subsequent builds are often +instantaneous because they only reprocess modified files. + + +File: org-roam.info, Node: Creating and Linking Nodes, Next: Customizing Node Completions, Prev: Setting up Org-roam, Up: Getting Started + +5.4 Creating and Linking Nodes +============================== + +Org-roam makes it easy to create notes and link them together. There +are 2 main functions for creating nodes: + + • ‘org-roam-node-insert’: creates a node if it does not exist, and + inserts a link to the node at point. + • ‘org-roam-node-find’: creates a node if it does not exist, and + visits the node. + • ‘org-roam-capture’: creates a node if it does not exist, and + restores the current window configuration upon completion. + + Let’s first try ‘org-roam-node-find’. Calling ‘M-x +org-roam-node-find’ will show a list of titles for nodes that reside in +‘org-roam-directory’. It should show nothing right now, since there are +no notes in the directory. Enter the title of the note you wish to +create, and press ‘RET’. This begins the note creation process. This +process uses ‘org-capture’’s templating system, and can be customized +(see *note The Templating System::). Using the default template, +pressing ‘C-c C-c’ finishes the note capture. + + Now that we have a node, we can try inserting a link to the node +using ‘M-x org-roam-node-insert’. This brings up the list of nodes, +which should contain the node you just created. Selecting the node will +insert an ‘id:’ link to the node. If you instead entered a title that +does not exist, you will once again be brought through the node creation +process. + + One can also conveniently insert links via the completion-at-point +functions Org-roam provides (see *note Completion::). + + +File: org-roam.info, Node: Customizing Node Completions, Prev: Creating and Linking Nodes, Up: Getting Started + +5.5 Customizing Node Completions +================================ + +Node selection is achieved via the ‘completing-read’ interface, +typically through ‘org-roam-node-read’. The presentation of these nodes +are governed by ‘org-roam-node-display-template’. + + • Variable: org-roam-node-display-template + + Configures display formatting for Org-roam node. + + Patterns of form “${field-name:length}” are interpolated based on + the current node. + + Each “field-name” is replaced with the return value of each + corresponding accessor function for org-roam-node, e.g. “${title}” + will be interpolated by the result of org-roam-node-title. You can + also define custom accessors using cl-defmethod. For example, you + can define: + + (cl-defmethod org-roam-node-my-title ((node org-roam-node)) (concat + “My ” (org-roam-node-title node))) + + and then reference it here or in the capture templates as + “${my-title}”. + + “length” is an optional specifier and declares how many characters + can be used to display the value of the corresponding field. If + it’s not specified, the field will be inserted as is, i.e. it + won’t be aligned nor trimmed. If it’s an integer, the field will + be aligned accordingly and all the exceeding characters will be + trimmed out. If it’s “*”, the field will use as many characters as + possible and will be aligned accordingly. + + A closure can also be assigned to this variable in which case the + closure is evaluated and the return value is used as the template. + The closure must evaluate to a valid template string. + + If you’re using a vertical completion framework, such as Ivy and +Selectrum, Org-roam supports the generation of an aligned, tabular +completion interface. For example, to include a column for tags up to +10 character widths wide, one can set ‘org-roam-node-display-template’ +as such: + + (setq org-roam-node-display-template + (concat "${title:*} " + (propertize "${tags:10}" 'face 'org-tag))) + + +File: org-roam.info, Node: Customizing Node Caching, Next: The Org-roam Buffer, Prev: Getting Started, Up: Top + +6 Customizing Node Caching +************************** + +* Menu: + +* How to cache:: +* What to cache:: +* When to cache:: + + +File: org-roam.info, Node: How to cache, Next: What to cache, Up: Customizing Node Caching + +6.1 How to cache +================ + +Org-roam uses a SQLite database to perform caching. This integration is +managed by the emacsql (https://github.com/magit/emacsql) library. It +should “just work”. + + +File: org-roam.info, Node: What to cache, Next: When to cache, Prev: How to cache, Up: Customizing Node Caching + +6.2 What to cache +================= + +By default, all nodes (any headline or file with an ID) are cached by +Org-roam. There are instances where you may want to have headlines with +ID, but not have them cached by Org-roam. + + To exclude a headline from the Org-roam database, set the +‘ROAM_EXCLUDE’ property to a non-nil value. For example: + + * Foo + :PROPERTIES: + :ID: foo + :ROAM_EXCLUDE: t + :END: + + One can also set ‘org-roam-db-node-include-function’. For example, +to exclude all headlines with the ‘ATTACH’ tag from the Org-roam +database, one can set: + + (setq org-roam-db-node-include-function + (lambda () + (not (member "ATTACH" (org-get-tags))))) + + Org-roam relied on the obtained Org AST for the buffer to parse +links. However, links appearing in some places (e.g. within property +drawers) are not considered by the Org AST to be links. Therefore, +Org-roam takes special care of additionally trying to process these +links. Use ‘org-roam-db-extra-links-elements’ to specify which +additional Org AST element types to consider. + + • Variable: org-roam-db-extra-links-elements + + The list of Org element types to include for parsing by Org-roam. + + By default, when parsing Org’s AST, links within keywords and + property drawers are not parsed as links. Sometimes however, it is + desirable to parse and cache these links (e.g. hiding links in a + property drawer). + + Additionally, one may want to ignore certain keys from being excluded +within property drawers. For example, we would not want ‘ROAM_REFS’ +links to be self-referential. Hence, to exclude specific keys, we use +‘org-roam-db-extra-links-exclude-keys’. + + • Variable: org-roam-db-extra-links-exclude-keys + + Keys to ignore when mapping over links. + + The car of the association list is the Org element type (e.g. + keyword). The cdr is a list of case-insensitive strings to exclude + from being treated as links. + + +File: org-roam.info, Node: When to cache, Prev: What to cache, Up: Customizing Node Caching + +6.3 When to cache +================= + +By default, Org-roam is eager in caching: each time an Org-roam file is +modified and saved, it updates the database for the corresponding file. +This keeps the database up-to-date, causing the least surprise when +using the interactive commands. + + However, depending on how large your Org files are, database updating +can be a slow operation. You can disable the automatic updating of the +database by setting ‘org-roam-db-update-on-save’ to ‘nil’. + + • Variable: org-roam-db-update-on-save + + If t, update the Org-roam database upon saving the file. Disable +this if your files are large and updating the database is slow. + + +File: org-roam.info, Node: The Org-roam Buffer, Next: Node Properties, Prev: Customizing Node Caching, Up: Top + +7 The Org-roam Buffer +********************* + +Org-roam provides the Org-roam buffer: an interface to view +relationships with other notes (backlinks, reference links, unlinked +references etc.). There are two main commands to use here: + + • ‘org-roam-buffer-toggle’: Launch an Org-roam buffer that tracks the + node currently at point. This means that the content of the buffer + changes as the point is moved, if necessary. + • ‘org-roam-buffer-display-dedicated’: Launch an Org-roam buffer for + a specific node without visiting its file. Unlike + ‘org-roam-buffer-toggle’ you can have multiple such buffers and + their content won’t be automatically replaced with a new node at + point. + + To bring up a buffer that tracks the current node at point, call ‘M-x +org-roam-buffer-toggle’. + + • Function: org-roam-buffer-toggle + + Toggle display of the ‘org-roam-buffer’. + + To bring up a buffer that’s dedicated for a specific node, call ‘M-x +org-roam-buffer-display-dedicated’. + + • Function: org-roam-buffer-display-dedicated + + Launch node dedicated Org-roam buffer without visiting the node + itself. + +* Menu: + +* Navigating the Org-roam Buffer:: +* Configuring what is displayed in the buffer:: +* Configuring the Org-roam buffer display:: +* Styling the Org-roam buffer:: + + +File: org-roam.info, Node: Navigating the Org-roam Buffer, Next: Configuring what is displayed in the buffer, Up: The Org-roam Buffer + +7.1 Navigating the Org-roam Buffer +================================== + +The Org-roam buffer uses ‘magit-section’, making the typical +‘magit-section’ keybindings available. Here are several of the more +useful ones: + + • ‘M-{N}’: ‘magit-section-show-level-{N}-all’ + • ‘n’: ‘magit-section-forward’ + • ‘’: ‘magit-section-toggle’ + • ‘’: ‘org-roam-buffer-visit-thing’ + + ‘org-roam-buffer-visit-thing’ is a placeholder command, that is +replaced by section-specific commands such as ‘org-roam-node-visit’. + + +File: org-roam.info, Node: Configuring what is displayed in the buffer, Next: Configuring the Org-roam buffer display, Prev: Navigating the Org-roam Buffer, Up: The Org-roam Buffer + +7.2 Configuring what is displayed in the buffer +=============================================== + +There are currently 3 provided widget types: + +Backlinks + View (preview of) nodes that link to this node +Reference Links + Nodes that reference this node (see *note Refs::) +Unlinked references + View nodes that contain text that match the nodes title/alias but + are not linked + + To configure what sections are displayed in the buffer, set +‘org-roam-mode-sections’. + + (setq org-roam-mode-sections + (list #'org-roam-backlinks-section + #'org-roam-reflinks-section + ;; #'org-roam-unlinked-references-section + )) + + Note that computing unlinked references may be slow, and has not been +added in by default. + + For each section function, you can pass args along to modify its +behaviour. For example, if you want to render unique sources for +backlinks (and also keep rendering reference links), set +‘org-roam-mode-sections’ as follows: + + (setq org-roam-mode-sections + '((org-roam-backlinks-section :unique t) + org-roam-reflinks-section)) + + The backlinks section ‘org-roam-backlinks-section’ also supports a +predicate to filter backlinks, ‘:show-backlink-p’. This can be used as +follows: + + (defun my-org-roam-show-backlink-p (backlink) + (not (member "daily" (org-roam-node-tags (org-roam-backlink-source-node backlink))))) + + (setq org-roam-mode-sections + '((org-roam-backlinks-section :unique t :show-backlink-p my-org-roam-show-backlink-p) + org-roam-reflinks-section)) + + +File: org-roam.info, Node: Configuring the Org-roam buffer display, Next: Styling the Org-roam buffer, Prev: Configuring what is displayed in the buffer, Up: The Org-roam Buffer + +7.3 Configuring the Org-roam buffer display +=========================================== + +Org-roam does not control how the pop-up buffer is displayed: this is +left to the user. The author’s recommended configuration is as follows: + + (add-to-list 'display-buffer-alist + '("\\*org-roam\\*" + (display-buffer-in-direction) + (direction . right) + (window-width . 0.33) + (window-height . fit-window-to-buffer))) + + Crucially, the window is a regular window (not a side-window), and +this allows for predictable navigation: + + • ‘RET’ navigates to thing-at-point in the current window, replacing + the Org-roam buffer. + • ‘C-u RET’ navigates to thing-at-point in the other window. + + For users that prefer using a side-window for the org-roam buffer, +the following example configuration should provide a good starting +point: + + (add-to-list 'display-buffer-alist + '("\\*org-roam\\*" + (display-buffer-in-side-window) + (side . right) + (slot . 0) + (window-width . 0.33) + (window-parameters . ((no-other-window . t) + (no-delete-other-windows . t))))) + + +File: org-roam.info, Node: Styling the Org-roam buffer, Prev: Configuring the Org-roam buffer display, Up: The Org-roam Buffer + +7.4 *TODO* Styling the Org-roam buffer +====================================== + + +File: org-roam.info, Node: Node Properties, Next: Citations, Prev: The Org-roam Buffer, Up: Top + +8 Node Properties +***************** + +* Menu: + +* Standard Org properties:: +* Titles and Aliases:: +* Tags:: +* Refs:: + + +File: org-roam.info, Node: Standard Org properties, Next: Titles and Aliases, Up: Node Properties + +8.1 Standard Org properties +=========================== + +Org-roam caches most of the standard Org properties. The full list now +includes: + + • outline level + • todo state + • priority + • scheduled + • deadline + • tags + + +File: org-roam.info, Node: Titles and Aliases, Next: Tags, Prev: Standard Org properties, Up: Node Properties + +8.2 Titles and Aliases +====================== + +Each node has a single title. For file nodes, this is specified with +the ‘#+title‘ property for the file. For headline nodes, this is the +main text. + + Nodes can also have multiple aliases. Aliases allow searching for +nodes via an alternative name. For example, one may want to assign a +well-known acronym (AI) to a node titled “Artificial Intelligence”. + + To assign an alias to a node, add the “ROAM_ALIASES” property to the +node: + + * Artificial Intelligence + :PROPERTIES: + :ROAM_ALIASES: AI + :END: + + Alternatively, Org-roam provides some functions to add or remove +aliases. + + • Function: org-roam-alias-add alias + + Add ALIAS to the node at point. When called interactively, prompt + for the alias to add. + + • Function: org-roam-alias-remove + + Remove an alias from the node at point. + + +File: org-roam.info, Node: Tags, Next: Refs, Prev: Titles and Aliases, Up: Node Properties + +8.3 Tags +======== + +Tags for top-level (file) nodes are pulled from the variable +‘org-file-tags’, which is set by the ‘#+filetags’ keyword, as well as +other tags the file may have inherited. Tags for headline level nodes +are regular Org tags. + + Note that the ‘#+filetags’ keyword results in tags being inherited by +headers within the file. This makes it impossible for selective tag +inheritance: i.e. either tag inheritance is turned off, or all headline +nodes will inherit the tags from the file node. This is a design +compromise of Org-roam. + + +File: org-roam.info, Node: Refs, Prev: Tags, Up: Node Properties + +8.4 Refs +======== + +Refs are unique identifiers for nodes. These keys allow references to +the key to show up in the Org-roam buffer. For example, a node for a +website may use the URL as the ref, and a node for a paper may use an +Org-ref citation key. + + To add a ref, add to the “ROAM_REFS” property as follows: + + * Google + :PROPERTIES: + :ROAM_REFS: https://www.google.com/ + :END: + + With the above example, if another node links to +, it will show up as a “reference backlink”. + + These keys also come in useful for when taking website notes, using +the ‘roam-ref’ protocol (see *note org-roam-protocol::). + + You may assign multiple refs to a single node, for example when you +want multiple papers in a series to share the same note, or an article +has a citation key and a URL at the same time. + + Org-roam also provides some functions to add or remove refs. + + • Function: org-roam-ref-add ref + + Add REF to the node at point. When called interactively, prompt + for the ref to add. + + • Function: org-roam-ref-remove + + Remove a ref from the node at point. + + +File: org-roam.info, Node: Citations, Next: Completion, Prev: Node Properties, Up: Top + +9 Citations +*********** + +Since version 9.5, Org has first-class support for citations. Org-roam +supports the caching of both these in-built citations (of form +‘[cite:@key]’) and org-ref (https://github.com/jkitchin/org-ref) +citations (of form cite:key). + + Org-roam attempts to load both the ‘org-ref’ and ‘org-cite’ package +when indexing files, so no further setup from the user is required for +citation support. + +* Menu: + +* Using the Cached Information:: + + +File: org-roam.info, Node: Using the Cached Information, Up: Citations + +9.1 Using the Cached Information +================================ + +It is common to use take reference notes for academic papers. To +designate the node to be the canonical node for the academic paper, we +can use its unique citation key: + + * Probabilistic Robotics + :PROPERTIES: + :ID: 51b7b82c-bbb4-4822-875a-ed548cffda10 + :ROAM_REFS: @thrun2005probabilistic + :END: + + or + + * Probabilistic Robotics + :PROPERTIES: + :ID: 51b7b82c-bbb4-4822-875a-ed548cffda10 + :ROAM_REFS: [cite:@thrun2005probabilistic] + :END: + + for ‘org-cite’, or: + + * Probabilistic Robotics + :PROPERTIES: + :ID: 51b7b82c-bbb4-4822-875a-ed548cffda10 + :ROAM_REFS: cite:thrun2005probabilistic + :END: + + for ‘org-ref’. + + When another node has a citation for that key, we can see it using +the ‘Reflinks’ section of the Org-roam buffer. + + Extension developers may be interested in retrieving the citations +within their notes. This information can be found within the ‘citation’ +table of the Org-roam database. + + +File: org-roam.info, Node: Completion, Next: Encryption, Prev: Citations, Up: Top + +10 Completion +************* + +Completions for Org-roam are provided via ‘completion-at-point’. +Org-roam currently provides completions in two scenarios: + + • When within an Org bracket link + • Anywhere + + Completions are installed locally in all Org-roam files. To trigger +completions, call ‘M-x completion-at-point’. If using ‘company-mode’, +add ‘company-capf’ to ‘company-backends’. + + Completions respect ‘completion-styles’: the user is free to choose +how candidates are matched. An example of a completion style that has +grown in popularity is orderless +(https://github.com/oantolin/orderless). + +* Menu: + +* Completing within Link Brackets:: +* Completing anywhere:: + + +File: org-roam.info, Node: Completing within Link Brackets, Next: Completing anywhere, Up: Completion + +10.1 Completing within Link Brackets +==================================== + +Completions within link brackets are provided by +‘org-roam-complete-link-at-point’. + + The completion candidates are the titles and aliases for all Org-roam +nodes. Upon choosing a candidate, a ‘roam:Title’ link will be inserted, +linking to node of choice. + + +File: org-roam.info, Node: Completing anywhere, Prev: Completing within Link Brackets, Up: Completion + +10.2 Completing anywhere +======================== + +The same completions can be triggered anywhere for the symbol at point +if not within a bracketed link. This is provided by +‘org-roam-complete-everywhere’. Similarly, the completion candidates +are the titles and aliases for all Org-roam nodes, and upon choosing a +candidate a ‘roam:Title’ link will be inserted linking to the node of +choice. + + This is disabled by default. To enable it, set +‘org-roam-completion-everywhere’ to ‘t’: + + (setq org-roam-completion-everywhere t) + + • Variable: org-roam-completion-everywhere + + When non-nil, provide link completion matching outside of Org links. + + +File: org-roam.info, Node: Encryption, Next: The Templating System, Prev: Completion, Up: Top + +11 Encryption +************* + +Emacs has support for creating and editing encrypted gpg files, and +Org-roam need not provide additional tooling. To create encrypted +files, simply add the ‘.gpg’ extension in your Org-roam capture +templates. For example: + + (setq org-roam-capture-templates '(("d" "default" plain "%?" + :target (file+head "${slug}.org.gpg" + "#+title: ${title}\n") + :unnarrowed t))) + + Note that the Org-roam database stores metadata information in +plain-text (headline text, for example), so if this information is +private to you then you should also ensure the database is encrypted. + + +File: org-roam.info, Node: The Templating System, Next: Extensions, Prev: Encryption, Up: Top + +12 The Templating System +************************ + +Org-roam extends the ‘org-capture’ system, providing a smoother +note-taking experience. However, these extensions mean Org-roam capture +templates are incompatible with ‘org-capture’ templates. + + Org-roam’s templates are specified by ‘org-roam-capture-templates’. +Just like ‘org-capture-templates’, ‘org-roam-capture-templates’ can +contain multiple templates. If ‘org-roam-capture-templates’ only +contains one template, there will be no prompt for template selection. + +* Menu: + +* Template Walkthrough:: +* Org-roam Template Expansion:: + + +File: org-roam.info, Node: Template Walkthrough, Next: Org-roam Template Expansion, Up: The Templating System + +12.1 Template Walkthrough +========================= + +To demonstrate the additions made to org-capture templates. Here, we +explain the default template, reproduced below. You will find most of +the elements of the template are similar to ‘org-capture’ templates. + + (("d" "default" plain "%?" + :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" + "#+title: ${title}\n") + :unnarrowed t)) + + 1. The template has short key ‘"d"’. If you have only one template, + org-roam automatically chooses this template for you. + 2. The template is given a description of ‘"default"’. + 3. ‘plain’ text is inserted. Other options include Org headings via + ‘entry’. + 4. Notice that the ‘target’ that’s usually in Org-capture templates is + missing here. + 5. ‘"%?"’ is the template inserted on each call to + ‘org-roam-capture-’. This template means don’t insert any content, + but place the cursor here. + 6. ‘:target’ is a compulsory specification in the Org-roam capture + template. The first element of the list indicates the type of the + target, the second element indicates the location of the captured + node, and the rest of the elements indicate prefilled template that + will be inserted and the position of the point will be adjusted + for. The latter behavior varies from type to type of the capture + target. + 7. ‘:unnarrowed t’ tells org-capture to show the contents for the + whole file, rather than narrowing to just the entry. This is part + of the Org-capture templates. + + See the ‘org-roam-capture-templates’ documentation for more details +and customization options. + + +File: org-roam.info, Node: Org-roam Template Expansion, Prev: Template Walkthrough, Up: The Templating System + +12.2 Org-roam Template Expansion +================================ + +Org-roam’s template definitions also extend org-capture’s template +syntax, to allow prefilling of strings. We have seen a glimpse of this +in *note Template Walkthrough: Template Walkthrough. + + Org-roam provides the ‘${foo}’ syntax for substituting variables with +known strings. ‘${foo}’’s substitution is performed as follows: + + 1. If ‘foo’ is a function, ‘foo’ is called with the current node as + its argument. + 2. Else if ‘org-roam-node-foo’ is a function, ‘foo’ is called with the + current node as its argument. The ‘org-roam-node-’ prefix defines + many of Org-roam’s node accessors such as ‘org-roam-node-title’ and + ‘org-roam-node-level’. + 3. Else look up ‘org-roam-capture--info’ for ‘foo’. This is an + internal variable that is set before the capture process begins. + 4. If none of the above applies, read a string using + ‘completing-read’. + 1. Org-roam also provides the ‘${foo=default_val}’ syntax, where + if a default value is provided, will be the initial value for + the ‘foo’ key during minibuffer completion. + + One can check the list of available keys for nodes by inspecting the +‘org-roam-node’ struct. At the time of writing, it is: + + (cl-defstruct (org-roam-node (:constructor org-roam-node-create) + (:copier nil)) + "A heading or top level file with an assigned ID property." + file file-hash file-atime file-mtime + id level point todo priority scheduled deadline title properties olp + tags aliases refs) + + This makes ‘${file}’, ‘${file-hash}’ etc. all valid substitutions. + + +File: org-roam.info, Node: Extensions, Next: Performance Optimization, Prev: The Templating System, Up: Top + +13 Extensions +************* + +* Menu: + +* org-roam-protocol:: +* org-roam-graph:: +* org-roam-dailies:: +* org-roam-export:: + + +File: org-roam.info, Node: org-roam-protocol, Next: org-roam-graph, Up: Extensions + +13.1 org-roam-protocol +====================== + +Org-roam provides extensions for capturing content from external +applications such as the browser, via ‘org-protocol’. Org-roam extends +‘org-protocol’ with 2 protocols: the ‘roam-node’ and ‘roam-ref’ +protocols. + +* Menu: + +* Installation: Installation (1). +* The roam-node protocol:: +* The roam-ref protocol:: + + +File: org-roam.info, Node: Installation (1), Next: The roam-node protocol, Up: org-roam-protocol + +13.1.1 Installation +------------------- + +To enable Org-roam’s protocol extensions, simply add the following to +your init file: + + (require 'org-roam-protocol) + + We also need to set up ‘org-protocol’: the instructions for setting +up ‘org-protocol’ are reproduced here. + + On a high-level, external calls are passed to Emacs via +‘emacsclient’. ‘org-protocol’ intercepts these and runs custom actions +based on the protocols registered. Hence, to use ‘org-protocol’, once +must: + + 1. launch the ‘emacsclient’ process + 2. Register ‘org-protocol://’ as a valid scheme-handler + + The instructions for the latter for each operating system is detailed +below. + +* Menu: + +* Linux:: +* Mac OS:: +* Windows:: + + +File: org-roam.info, Node: Linux, Next: Mac OS, Up: Installation (1) + +Linux +..... + +For Linux users, create a desktop application in +‘~/.local/share/applications/org-protocol.desktop’: + + [Desktop Entry] + Name=Org-Protocol + Exec=emacsclient %u + Icon=emacs-icon + Type=Application + Terminal=false + MimeType=x-scheme-handler/org-protocol + + Associate ‘org-protocol://’ links with the desktop application by +running in your shell: + + xdg-mime default org-protocol.desktop x-scheme-handler/org-protocol + + To disable the “confirm” prompt in Chrome, you can also make Chrome +show a checkbox to tick, so that the ‘Org-Protocol Client’ app will be +used without confirmation. To do this, run in a shell: + + sudo mkdir -p /etc/opt/chrome/policies/managed/ + sudo tee /etc/opt/chrome/policies/managed/external_protocol_dialog.json >/dev/null <<'EOF' + { + "ExternalProtocolDialogShowAlwaysOpenCheckbox": true + } + EOF + sudo chmod 644 /etc/opt/chrome/policies/managed/external_protocol_dialog.json + + and then restart Chrome (for example, by navigating to +) to make the new policy take effect. + + See here (https://www.chromium.org/administrators/linux-quick-start) +for more info on the ‘/etc/opt/chrome/policies/managed’ directory and +here +(https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ExternalProtocolDialogShowAlwaysOpenCheckbox) +for information on the ‘ExternalProtocolDialogShowAlwaysOpenCheckbox’ +policy. + + +File: org-roam.info, Node: Mac OS, Next: Windows, Prev: Linux, Up: Installation (1) + +Mac OS +...... + +For Mac OS, we need to create our own application. + + 1. Launch Script Editor + 2. Use the following script, paying attention to the path to + ‘emacsclient’: + + on open location this_URL + set EC to "/usr/local/bin/emacsclient --no-wait " + set filePath to quoted form of this_URL + do shell script EC & filePath & " &> /dev/null &" + tell application "Emacs" to activate + end open location + + 1. Save the script in ‘/Applications/OrgProtocolClient.app’, changing + the script type to “Application”, rather than “Script”. + 2. Edit ‘/Applications/OrgProtocolClient.app/Contents/Info.plist’, + adding the following before the last ‘’ tag: + + CFBundleURLTypes + + + CFBundleURLName + org-protocol handler + CFBundleURLSchemes + + org-protocol + + + + + 1. Save the file, and run the ‘OrgProtocolClient.app’ to register the + protocol. + + To disable the “confirm” prompt in Chrome, you can also make Chrome +show a checkbox to tick, so that the ‘OrgProtocol’ app will be used +without confirmation. To do this, run in a shell: + + defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool true + + If you’re using Emacs Mac Port +(https://github.com/railwaycat/homebrew-emacsmacport), it registered its +‘Emacs.app‘ as the default handler for the URL scheme ‘org-protocol‘. +To make ‘OrgProtocol.app’ the default handler instead, run: + + defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add \ + '{"LSHandlerPreferredVersions" = { "LSHandlerRoleAll" = "-"; }; LSHandlerRoleAll = "org.yourusername.OrgProtocol"; LSHandlerURLScheme = "org-protocol";}' + + Then restart your computer. + + If you’re using the Emacs Homebrew formula +(https://formulae.brew.sh/formula/emacs), you may need one of the +following additional configurations: + + 1. Add option ‘-c‘ to ‘emacsclient‘ in the script, and start emacs + from command line with ‘emacs –daemon‘ + + on open location this_URL + set EC to "/usr/local/bin/emacsclient -c --no-wait " + set filePath to quoted form of this_URL + do shell script EC & filePath & " &> /dev/null &" + tell application "Emacs" to activate + end open location + + 1. Add ‘(server-start)‘ in .emacs (in this case you do not need option + ‘-c‘ for ‘emacsclient‘ in the script, and you do not need to start + emacs with ‘emacs –daemon‘ + + • Testing org-protocol + + To test that you have the handler setup and registered properly + from the command line you can run: + + open org-protocol://roam-ref\?template=r\&ref=test\&title=this + + If you get an error similar too this or the wrong handler is run: + + No application knows how to open URL + org-protocol://roam-ref?template=r&ref=test&title=this (Error + Domain=NSOSStatusErrorDomain Code=-10814 + “kLSApplicationNotFoundErr: E.g. no application claims the + file” UserInfo={_LSLine=1489, _LSFunction=runEvaluator}). + + You may need to manually register your handler, like this: + + /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -R -f /Applications/OrgProtocolClient.app + + Here is a link to the lsregister command that is really useful: + + + +File: org-roam.info, Node: Windows, Prev: Mac OS, Up: Installation (1) + +Windows +....... + +For Windows, create a temporary ‘org-protocol.reg’ file: + + REGEDIT4 + + [HKEY_CLASSES_ROOT\org-protocol] + @="URL:Org Protocol" + "URL Protocol"="" + [HKEY_CLASSES_ROOT\org-protocol\shell] + [HKEY_CLASSES_ROOT\org-protocol\shell\open] + [HKEY_CLASSES_ROOT\org-protocol\shell\open\command] + @="\"C:\\Windows\\System32\\wsl.exe\" emacsclient \"%1\"" + + The above will forward the protocol to WSL. If you run Emacs +natively on Windows, replace the last line with: + + @="\"c:\\path\\to\\emacs\\bin\\emacsclientw.exe\" \"%1\"" + + After executing the .reg file, the protocol is registered and you can +delete the file. + + +File: org-roam.info, Node: The roam-node protocol, Next: The roam-ref protocol, Prev: Installation (1), Up: org-roam-protocol + +13.1.2 The roam-node protocol +----------------------------- + +The roam-node protocol opens the node with ID specified by the ‘node’ +key (e.g. ‘org-protocol://roam-node?node=node-id’). ‘org-roam-graph’ +uses this to make the graph navigable. + + +File: org-roam.info, Node: The roam-ref protocol, Prev: The roam-node protocol, Up: org-roam-protocol + +13.1.3 The roam-ref protocol +---------------------------- + +This protocol finds or creates a new note with a given ‘ROAM_REFS’: + +[image src="images/roam-ref.gif"] + + + To use this, create the following bookmarklet +(https://en.wikipedia.org/wiki/Bookmarklet) in your browser: + + javascript:location.href = + 'org-protocol://roam-ref?template=r&ref=' + + encodeURIComponent(location.href) + + '&title=' + + encodeURIComponent(document.title) + + '&body=' + + encodeURIComponent(window.getSelection()) + + or as a keybinding in ‘qutebrowser’ in , using the ‘config.py’ file +(see Configuring qutebrowser +(https://github.com/qutebrowser/qutebrowser/blob/master/doc/help/configuring.asciidoc)): + + config.bind("", "open javascript:location.href='org-protocol://roam-ref?template=r&ref='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)") + + where ‘template’ is the template key for a template in +‘org-roam-capture-ref-templates’ (see *note The Templating System::). + + +File: org-roam.info, Node: org-roam-graph, Next: org-roam-dailies, Prev: org-roam-protocol, Up: Extensions + +13.2 org-roam-graph +=================== + +Org-roam provides basic graphing capabilities to explore +interconnections between notes, in ‘org-roam-graph’. This is done by +performing SQL queries and generating images using Graphviz +(https://graphviz.org/). The graph can also be navigated: see *note +org-roam-protocol::. + + The entry point to graph creation is ‘org-roam-graph’. + + • Function: org-roam-graph & optional arg node + + Build and display a graph for NODE. ARG may be any of the following +values: + + • ‘nil’ show the full graph. + • ‘integer’ an integer argument ‘N’ will show the graph for the + connected components to node up to ‘N’ steps away. + + • User Option: org-roam-graph-executable + + Path to the graphing executable (in this case, Graphviz). Set this + if Org-roam is unable to find the Graphviz executable on your + system. + + You may also choose to use ‘neato’ in place of ‘dot’, which + generates a more compact graph layout. + + • User Option: org-roam-graph-viewer + + Org-roam defaults to using Firefox (located on PATH) to view the + SVG, but you may choose to set it to: + + 1. A string, which is a path to the program used + 2. a function accepting a single argument: the graph file path. + + ‘nil’ uses ‘view-file’ to view the graph. + + If you are using WSL2 and would like to open the graph in Windows, + you can use the second option to set the browser and network file + path: + + (setq org-roam-graph-viewer + (lambda (file) + (let ((org-roam-graph-viewer "/mnt/c/Program Files/Mozilla Firefox/firefox.exe")) + (org-roam-graph--open (concat "file://///wsl$/Ubuntu" file))))) + +* Menu: + +* Graph Options:: + + +File: org-roam.info, Node: Graph Options, Up: org-roam-graph + +13.2.1 Graph Options +-------------------- + +Graphviz provides many options for customizing the graph output, and +Org-roam supports some of them. See + for customizable +options. + + • User Option: org-roam-graph-filetype + + The file type to generate for graphs. This defaults to ‘"svg"’. + + • User Option: org-roam-graph-extra-config + + Extra options passed to graphviz for the digraph (The “G” + attributes). Example: ‘'~(("rankdir" . "LR"))’ + + • User Option: org-roam-graph-node-extra-config + + An alist of options to style the nodes. The car of the alist node + type such as ‘"id"’, or ‘"http"’. The cdr of the list is another + alist of Graphviz node options (the “N” attributes). + + • User Option: org-roam-graph-edge-extra-config + + Extra options for edges in the graphviz output (The “E” + attributes). Example: ‘'(("dir" . "back"))’ + + +File: org-roam.info, Node: org-roam-dailies, Next: org-roam-export, Prev: org-roam-graph, Up: Extensions + +13.3 org-roam-dailies +===================== + +Org-roam provides journaling capabilities akin to Org-journal with +‘org-roam-dailies’. + +* Menu: + +* Configuration:: +* Usage:: + + +File: org-roam.info, Node: Configuration, Next: Usage, Up: org-roam-dailies + +13.3.1 Configuration +-------------------- + +For ‘org-roam-dailies’ to work, you need to define two variables: + + • Variable: ‘org-roam-dailies-directory’ + + Path to daily-notes. This path is relative to + ‘org-roam-directory’. + + • Variable: ‘org-roam-dailies-capture-templates’ + + Capture templates for daily-notes in Org-roam. + + Here is a sane default configuration: + + (setq org-roam-dailies-directory "daily/") + + (setq org-roam-dailies-capture-templates + '(("d" "default" entry + "* %?" + :target (file+head "%<%Y-%m-%d>.org" + "#+title: %<%Y-%m-%d>\n")))) + + See *note The Templating System:: for creating new templates. + + +File: org-roam.info, Node: Usage, Prev: Configuration, Up: org-roam-dailies + +13.3.2 Usage +------------ + +‘org-roam-dailies’ provides these interactive functions: + + • Function: ‘org-roam-dailies-capture-today’ &optional goto + + Create an entry in the daily note for today. + + When ‘goto’ is non-nil, go to the note without creating an entry. + + • Function: ‘org-roam-dailies-goto-today’ + + Find the daily note for today, creating it if necessary. + + There are variants of those commands for ‘-yesterday’ and +‘-tomorrow’: + + • Function: ‘org-roam-dailies-capture-yesterday’ n &optional goto + + Create an entry in the daily note for yesterday. + + With numeric argument ‘n’, use the daily note ‘n’ days in the past. + + • Function: ‘org-roam-dailies-goto-yesterday’ + + With numeric argument N, use the daily-note N days in the future. + + There are also commands which allow you to use Emacs’s ‘calendar’ to +find the date + + • Function: ‘org-roam-dailies-capture-date’ + + Create an entry in the daily note for a date using the calendar. + + Prefer past dates, unless ‘prefer-future’ is non-nil. + + With a ’C-u’ prefix or when ‘goto’ is non-nil, go the note without + creating an entry. + + • Function: ‘org-roam-dailies-goto-date’ + + Find the daily note for a date using the calendar, creating it if + necessary. + + Prefer past dates, unless ‘prefer-future’ is non-nil. + + • Function: ‘org-roam-dailies-find-directory’ + + Find and open ‘org-roam-dailies-directory’. + + • Function: ‘org-roam-dailies-goto-previous-note’ + + When in an daily-note, find the previous one. + + • Function: ‘org-roam-dailies-goto-next-note’ + + When in an daily-note, find the next one. + + +File: org-roam.info, Node: org-roam-export, Prev: org-roam-dailies, Up: Extensions + +13.4 org-roam-export +==================== + +Because Org-roam files are plain org files, they can be exported easily +using ‘org-export’ to a variety of formats, including ‘html’ and ‘pdf’. +However, Org-roam relies heavily on ID links, which Org’s html export +has poor support of. To fix this, Org-roam provides a bunch of +overrides to better support export. To use them, simply run: + + (require 'org-roam-export) + + +File: org-roam.info, Node: Performance Optimization, Next: The Org-mode Ecosystem, Prev: Extensions, Up: Top + +14 Performance Optimization +*************************** + +* Menu: + +* Garbage Collection:: + + +File: org-roam.info, Node: Garbage Collection, Up: Performance Optimization + +14.1 Garbage Collection +======================= + +During the cache-build process, Org-roam generates a lot of in-memory +data-structures (such as the Org file’s AST), which are discarded after +use. These structures are garbage collected at regular intervals (see +*note info:elisp#Garbage Collection: (elisp)Garbage Collection.). + + Org-roam provides the option ‘org-roam-db-gc-threshold’ to +temporarily change the threshold value for GC to be triggered during +these memory-intensive operations. To reduce the number of garbage +collection processes, one may set ‘org-roam-db-gc-threshold’ to a high +value (such as ‘most-positive-fixnum’): + + (setq org-roam-db-gc-threshold most-positive-fixnum) + + +File: org-roam.info, Node: The Org-mode Ecosystem, Next: FAQ, Prev: Performance Optimization, Up: Top + +15 The Org-mode Ecosystem +************************* + +Because Org-roam is built on top of Org-mode, it benefits from the vast +number of packages already available. + +* Menu: + +* Browsing History with winner-mode:: +* Versioning Notes:: +* Full-text search with Deft:: +* Org-journal:: +* Org-download:: +* mathpix.el: mathpixel. +* Org-noter / Interleave:: +* Bibliography:: +* Spaced Repetition:: + + +File: org-roam.info, Node: Browsing History with winner-mode, Next: Versioning Notes, Up: The Org-mode Ecosystem + +15.1 Browsing History with winner-mode +====================================== + +‘winner-mode’ is a global minor mode that allows one to undo and redo +changes in the window configuration. It is included with GNU Emacs +since version 20. + + ‘winner-mode’ can be used as a simple version of browser history for +Org-roam. Each click through org-roam links (from both Org files and +the backlinks buffer) causes changes in window configuration, which can +be undone and redone using ‘winner-mode’. To use ‘winner-mode’, simply +enable it, and bind the appropriate interactive functions: + + (winner-mode +1) + (define-key winner-mode-map (kbd "") #'winner-undo) + (define-key winner-mode-map (kbd "") #'winner-redo) + + + +File: org-roam.info, Node: Versioning Notes, Next: Full-text search with Deft, Prev: Browsing History with winner-mode, Up: The Org-mode Ecosystem + +15.2 Versioning Notes +===================== + +Since Org-roam notes are just plain text, it is trivial to track changes +in your notes database using version control systems such as Git +(https://git-scm.com/). Simply initialize ‘org-roam-directory’ as a Git +repository, and commit your files at regular or appropriate intervals. +Magit (https://magit.vc/) is a great interface to Git within Emacs. + + In addition, it may be useful to observe how a particular note has +evolved, by looking at the file history. Git-timemachine +(https://gitlab.com/pidu/git-timemachine) allows you to visit historic +versions of a tracked Org-roam note. + + +File: org-roam.info, Node: Full-text search with Deft, Next: Org-journal, Prev: Versioning Notes, Up: The Org-mode Ecosystem + +15.3 Full-text search with Deft +=============================== + +Deft (https://jblevins.org/projects/deft/) provides a nice interface for +browsing and filtering org-roam notes. + + (use-package deft + :after org + :bind + ("C-c n d" . deft) + :custom + (deft-recursive t) + (deft-use-filter-string-for-filename t) + (deft-default-extension "org") + (deft-directory org-roam-directory)) + + The Deft interface can slow down quickly when the number of files get +huge. Notdeft (https://github.com/hasu/notdeft) is a fork of Deft that +uses an external search engine and indexer. + + +File: org-roam.info, Node: Org-journal, Next: Org-download, Prev: Full-text search with Deft, Up: The Org-mode Ecosystem + +15.4 Org-journal +================ + +Org-journal (https://github.com/bastibe/org-journal) provides journaling +capabilities to Org-mode. A lot of its functionalities have been +incorporated into Org-roam under the name *note ‘org-roam-dailies’: +org-roam-dailies. It remains a good tool if you want to isolate your +verbose journal entries from the ideas you would write on a scratchpad. + + (use-package org-journal + :bind + ("C-c n j" . org-journal-new-entry) + :custom + (org-journal-date-prefix "#+title: ") + (org-journal-file-format "%Y-%m-%d.org") + (org-journal-dir "/path/to/journal/files/") + (org-journal-date-format "%A, %d %B %Y")) + + +File: org-roam.info, Node: Org-download, Next: mathpixel, Prev: Org-journal, Up: The Org-mode Ecosystem + +15.5 Org-download +================= + +Org-download (https://github.com/abo-abo/org-download) lets you +screenshot and yank images from the web into your notes: + +[image src="images/org-download.gif"] + + + +Figure: org-download + + (use-package org-download + :after org + :bind + (:map org-mode-map + (("s-Y" . org-download-screenshot) + ("s-y" . org-download-yank)))) + + +File: org-roam.info, Node: mathpixel, Next: Org-noter / Interleave, Prev: Org-download, Up: The Org-mode Ecosystem + +15.6 mathpix.el +=============== + +mathpix.el (https://github.com/jethrokuan/mathpix.el) uses Mathpix’s +(https://mathpix.com/) API to convert clips into latex equations: + +[image src="images/mathpix.gif"] + + + +Figure: mathpix + + (use-package mathpix.el + :straight (:host github :repo "jethrokuan/mathpix.el") + :custom ((mathpix-app-id "app-id") + (mathpix-app-key "app-key")) + :bind + ("C-x m" . mathpix-screenshot)) + + +File: org-roam.info, Node: Org-noter / Interleave, Next: Bibliography, Prev: mathpixel, Up: The Org-mode Ecosystem + +15.7 Org-noter / Interleave +=========================== + +Org-noter (https://github.com/weirdNox/org-noter) and Interleave +(https://github.com/rudolfochrist/interleave) are both projects that +allow synchronised annotation of documents (PDF, EPUB etc.) within +Org-mode. + + +File: org-roam.info, Node: Bibliography, Next: Spaced Repetition, Prev: Org-noter / Interleave, Up: The Org-mode Ecosystem + +15.8 Bibliography +================= + +Org 9.5 added native citation and bibliography functionality, called +“org-cite”, which org-roam supports. + + org-roam-bibtex (https://github.com/org-roam/org-roam-bibtex) offers +tight integration between org-ref (https://github.com/jkitchin/org-ref), +helm-bibtex (https://github.com/tmalsburg/helm-bibtex) and ‘org-roam’. +This helps you manage your bibliographic notes under ‘org-roam’. + + For example, though helm-bibtex provides the ability to visit notes +for bibliographic entries, org-roam-bibtex extends it with the ability +to visit the file with the right ‘ROAM_REFS’. + + +File: org-roam.info, Node: Spaced Repetition, Prev: Bibliography, Up: The Org-mode Ecosystem + +15.9 Spaced Repetition +====================== + +Org-fc (https://www.leonrische.me/fc/index.html) is a spaced repetition +system that scales well with a large number of files. Other +alternatives include org-drill +(https://orgmode.org/worg/org-contrib/org-drill.html), and pamparam +(https://github.com/abo-abo/pamparam). + + To use Anki for spaced repetition, anki-editor +(https://github.com/louietan/anki-editor) allows you to write your cards +in Org-mode, and sync your cards to Anki via anki-connect +(https://github.com/FooSoft/anki-connect#installation). + + +File: org-roam.info, Node: FAQ, Next: Developer's Guide to Org-roam, Prev: The Org-mode Ecosystem, Up: Top + +16 FAQ +****** + +* Menu: + +* How do I have more than one Org-roam directory?:: +* How do I create a note whose title already matches one of the candidates?:: +* How can I stop Org-roam from creating IDs everywhere?:: +* How do I migrate from Roam Research?:: +* How to migrate from Org-roam v1?:: +* How do I publish my notes with an Internet-friendly graph?:: + + +File: org-roam.info, Node: How do I have more than one Org-roam directory?, Next: How do I create a note whose title already matches one of the candidates?, Up: FAQ + +16.1 How do I have more than one Org-roam directory? +==================================================== + +Emacs supports directory-local variables, allowing the value of +‘org-roam-directory’ to be different in different directories. It does +this by checking for a file named ‘.dir-locals.el’. + + To add support for multiple directories, override the +‘org-roam-directory’ variable using directory-local variables. This is +what ‘.dir-locals.el’ may contain: + + ((nil . ((org-roam-directory . "/path/to/alt/org-roam-dir") + (org-roam-db-location . "/path/to/alt/org-roam-dir/org-roam.db")))) + + Note ‘org-roam-directory’ and ‘org-roam-db-location’ should be an +absolute path, not relative. + + Alternatively, use ‘eval’ if you wish to call functions: + + ((nil . ((eval . (setq-local + org-roam-directory (expand-file-name (locate-dominating-file + default-directory ".dir-locals.el")))) + (eval . (setq-local + org-roam-db-location (expand-file-name "org-roam.db" + org-roam-directory)))))) + + All files within that directory will be treated as their own separate +set of Org-roam files. Remember to run ‘org-roam-db-sync’ from a file +within that directory, at least once. + + +File: org-roam.info, Node: How do I create a note whose title already matches one of the candidates?, Next: How can I stop Org-roam from creating IDs everywhere?, Prev: How do I have more than one Org-roam directory?, Up: FAQ + +16.2 How do I create a note whose title already matches one of the candidates? +============================================================================== + +This situation arises when, for example, one would like to create a note +titled “bar” when “barricade” already exists. + + The solution is dependent on the mini-buffer completion framework in +use. Here are the solutions: + +Ivy + call ‘ivy-immediate-done’, typically bound to ‘C-M-j’. + Alternatively, set ‘ivy-use-selectable-prompt’ to ‘t’, so that + “bar” is now selectable. +Helm + Org-roam should provide a selectable “[?] bar” candidate at the + top of the candidate list. + + +File: org-roam.info, Node: How can I stop Org-roam from creating IDs everywhere?, Next: How do I migrate from Roam Research?, Prev: How do I create a note whose title already matches one of the candidates?, Up: FAQ + +16.3 How can I stop Org-roam from creating IDs everywhere? +========================================================== + +Other than the interactive commands that Org-roam provides, Org-roam +does not create IDs everywhere. If you are noticing that IDs are being +created even when you don’t want them to be (e.g. when tangling an Org +file), check the value you have set for ‘org-id-link-to-org-use-id’: +setting it to ‘'create-if-interactive’ is a popular option. + + +File: org-roam.info, Node: How do I migrate from Roam Research?, Next: How to migrate from Org-roam v1?, Prev: How can I stop Org-roam from creating IDs everywhere?, Up: FAQ + +16.4 How do I migrate from Roam Research? +========================================= + +Fabio has produced a command-line tool that converts markdown files +exported from Roam Research into Org-roam compatible markdown. More +instructions are provided in the repository +(https://github.com/fabioberger/roam-migration). + + +File: org-roam.info, Node: How to migrate from Org-roam v1?, Next: How do I publish my notes with an Internet-friendly graph?, Prev: How do I migrate from Roam Research?, Up: FAQ + +16.5 How to migrate from Org-roam v1? +===================================== + +Those coming from Org-roam v1 will do well treating v2 as entirely new +software. V2 has a smaller core and fewer moving parts, while retaining +the bulk of its functionality. It is recommended to read the +documentation above about nodes. + + It is still desirable to migrate notes collected in v1 to v2. To +migrate your v1 notes to v2, use ‘M-x org-roam-migrate-wizard’. This +blog post +(https://d12frosted.io/posts/2021-06-11-path-to-org-roam-v2.html) +provides a good overview of what’s new in v2 and how to migrate. + + Essentially, to migrate notes from v1 to v2, one must: + + 1. Add IDs to all existing notes. These are located in top-level + property drawers (Although note that in v2, not all files need to + have IDs). + 2. Update the Org-roam database to conform to the new schema. + 3. Replace ‘#+ROAM_KEY’ into the ‘ROAM_REFS’ property + 4. Replace ‘#+ROAM_ALIAS’ into the ‘ROAM_ALIASES’ property + 5. Move ‘#+ROAM_TAGS’ into the ‘#+FILETAGS’ property for file-level + nodes, and the ‘ROAM_TAGS’ property for headline nodes + 6. Replace existing file links with ID links. + + +File: org-roam.info, Node: How do I publish my notes with an Internet-friendly graph?, Prev: How to migrate from Org-roam v1?, Up: FAQ + +16.6 How do I publish my notes with an Internet-friendly graph? +=============================================================== + +The default graph builder creates a graph with an org-protocol +(https://orgmode.org/worg/org-contrib/org-protocol.html) handler which +is convenient when you’re working locally but inconvenient when you want +to publish your notes for remote access. Likewise, it defaults to +displaying the graph in Emacs which has the exact same caveats. This +problem is solvable in the following way using org-mode’s native +publishing (https://orgmode.org/manual/Publishing.html) capability: + + 1. configure org-mode to publish your org-roam notes as a project. + 2. create a function that overrides the default org-protocol link + creation function(‘org-roam-default-link-builder’). + 3. create a hook that’s called at the end of graph creation to copy + the generated graph to the appropriate place. + + The example code below is used to publish to a local directory where +a separate shell script copies the files to the remote site. + +* Menu: + +* Configure org-mode for publishing:: +* Overriding the default link creation function:: +* Copying the generated file to the export directory:: + + +File: org-roam.info, Node: Configure org-mode for publishing, Next: Overriding the default link creation function, Up: How do I publish my notes with an Internet-friendly graph? + +16.6.1 Configure org-mode for publishing +---------------------------------------- + +This has two steps: + 1. Setting of a _roam_ project that publishes your notes. + 2. Configuring the _sitemap.html_ generation. + 3. Setting up ‘org-publish’ to generate the graph. + + This will require code like the following: + (defun roam-sitemap (title list) + (concat "#+OPTIONS: ^:nil author:nil html-postamble:nil\n" + "#+SETUPFILE: ./simple_inline.theme\n" + "#+TITLE: " title "\n\n" + (org-list-to-org list) "\nfile:sitemap.svg")) + + (setq my-publish-time 0) ; see the next section for context + (defun roam-publication-wrapper (plist filename pubdir) + (org-roam-graph) + (org-html-publish-to-html plist filename pubdir) + (setq my-publish-time (cadr (current-time)))) + + (setq org-publish-project-alist + '(("roam" + :base-directory "~/roam" + :auto-sitemap t + :sitemap-function roam-sitemap + :sitemap-title "Roam notes" + :publishing-function roam-publication-wrapper + :publishing-directory "~/roam-export" + :section-number nil + :table-of-contents nil + :style ""))) + + +File: org-roam.info, Node: Overriding the default link creation function, Next: Copying the generated file to the export directory, Prev: Configure org-mode for publishing, Up: How do I publish my notes with an Internet-friendly graph? + +16.6.2 Overriding the default link creation function +---------------------------------------------------- + +The code below will generate a link to the generated html file instead +of the default org-protocol link. + (defun org-roam-custom-link-builder (node) + (let ((file (org-roam-node-file node))) + (concat (file-name-base file) ".html"))) + + (setq org-roam-graph-link-builder 'org-roam-custom-link-builder) + + +File: org-roam.info, Node: Copying the generated file to the export directory, Prev: Overriding the default link creation function, Up: How do I publish my notes with an Internet-friendly graph? + +16.6.3 Copying the generated file to the export directory +--------------------------------------------------------- + +The default behavior of ‘org-roam-graph’ is to generate the graph and +display it in Emacs. There is an ‘org-roam-graph-generation-hook’ +available that provides access to the file names so they can be copied +to the publishing directory. Example code follows: + + (add-hook 'org-roam-graph-generation-hook + (lambda (dot svg) (if (< (- (cadr (current-time)) my-publish-time) 5) + (progn (copy-file svg "~/roam-export/sitemap.svg" 't) + (kill-buffer (file-name-nondirectory svg)) + (setq my-publish-time 0))))) + + +File: org-roam.info, Node: Developer's Guide to Org-roam, Next: Appendix, Prev: FAQ, Up: Top + +17 Developer’s Guide to Org-roam +******************************** + +* Menu: + +* Org-roam's Design Principle:: +* Building Extensions and Advanced Customization of Org-roam:: + + +File: org-roam.info, Node: Org-roam's Design Principle, Next: Building Extensions and Advanced Customization of Org-roam, Up: Developer's Guide to Org-roam + +17.1 Org-roam’s Design Principle +================================ + +Org-roam is primarily motivated by the need for a dual representation. +We (humans) love operating in a plain-text environment. The syntax +rules of Org-mode are simple and fit snugly within our brain. This also +allows us to use the tools and packages we love to explore and edit our +notes. Org-mode is simply the most powerful plain-text format +available, with support for images, LaTeX, TODO planning and much more. + + But this plain-text format is simply ill-suited for exploration of +these notes: plain-text is simply not amenable for answering +large-scale, complex queries (e.g. how many tasks do I have that are +due by next week?). Interfaces such as Org-agenda slow to a crawl when +the number of files becomes unwieldy, which can quickly become the case. + + At its core, Org-roam provides a database abstraction layer, +providing a dual representation of what’s already available in +plain-text. This allows us (humans) to continue working with +plain-text, while programs can utilize the database layer to perform +complex queries. These capabilities include, but are not limited to: + + • link graph traversal and visualization + • Instantaneous SQL-like queries on headlines + • What are my TODOs, scheduled for X, or due by Y? + • Accessing the properties of a node, such as its tags, refs, TODO + state or priority + + All of these functionality is powered by this database abstraction +layer. Hence, at its core Org-roam’s primary goal is to provide a +resilient dual representation that is cheap to maintain, easy to +understand, and is as up-to-date as it possibly can. Org-roam also then +exposes an API to this database abstraction layer for users who would +like to perform programmatic queries on their Org files. + + +File: org-roam.info, Node: Building Extensions and Advanced Customization of Org-roam, Prev: Org-roam's Design Principle, Up: Developer's Guide to Org-roam + +17.2 Building Extensions and Advanced Customization of Org-roam +=============================================================== + +Because Org-roam’s core functionality is small, it is possible and +sometimes desirable to build extensions on top of it. These extensions +may use one or more of the following functionalities: + + • Access to Org-roam’s database + • Usage/modification of Org-roam’s interactive commands + + Org-roam provides no guarantees that extensions will continue to +function as Org-roam evolves, but by following these simple rules, +extensions can be made robust to local changes in Org-roam. + + 1. Extensions should not modify the database schema. Any extension + that requires the caching of additional data should make a request + upstream to Org-roam. + 2. Extensions requiring access to the database should explicitly state + support for the database version (‘org-roam-db-version’), and only + conditionally load when support is available. + +* Menu: + +* Accessing the Database:: +* Accessing and Modifying Nodes:: +* Extending the Capture System:: + + +File: org-roam.info, Node: Accessing the Database, Next: Accessing and Modifying Nodes, Up: Building Extensions and Advanced Customization of Org-roam + +17.2.1 Accessing the Database +----------------------------- + +Access to the database is provided singularly by ‘org-roam-db-query’, +for example: + + (org-roam-db-query [:select * :from nodes]) + + One can refer to the database schema by looking up +‘org-roam-db--table-schemata’. There are multiple helper functions +within Org-roam that call ‘org-roam-db-query’, these are subject to +change. To ensure that extensions/customizations are robust to change, +extensions should only use ‘org-roam-db-query’, and perhaps replicate +the SQL query if necessary. + + +File: org-roam.info, Node: Accessing and Modifying Nodes, Next: Extending the Capture System, Prev: Accessing the Database, Up: Building Extensions and Advanced Customization of Org-roam + +17.2.2 Accessing and Modifying Nodes +------------------------------------ + +The node interface is cleanly defined using ‘cl-defstruct’. The primary +method to access nodes is ‘org-roam-node-at-point’ and +‘org-roam-node-read’: + + • Function: org-roam-node-at-point &optional assert + + Return the node at point. If ASSERT, throw an error if there is no + node at point. + + • Function: org-roam-node-read &optional initial-input filter-fn + sort-fn require-match + + Read and return an ‘org-roam-node’. INITIAL-INPUT is the initial + minibuffer prompt value. FILTER-FN is a function to filter out + nodes: it takes a single argument (an ‘org-roam-node’), and when + nil is returned the node will be filtered out. SORT-FN is a + function to sort nodes. See + ‘org-roam-node-read-sort-by-file-mtime’ for an example sort + function. If REQUIRE-MATCH, the minibuffer prompt will require a + match. + + Once you obtain the node, you can use the accessors for the node, +e.g. ‘org-roam-node-id’ or ‘org-roam-node-todo’. + + It is possible to define (or override existing) properties on nodes. +This is simply done using a ‘cl-defmethod’ on the ‘org-roam-node’ +struct: + + (cl-defmethod org-roam-node-namespace ((node org-roam-node)) + "Return the namespace for NODE. + The namespace is the final directory of the file for the node." + (file-name-nondirectory + (directory-file-name + (file-name-directory (org-roam-node-file node))))) + + The snippet above defines a new property ‘namespace’ on +‘org-roam-node’, which making it available for use in capture templates. + + +File: org-roam.info, Node: Extending the Capture System, Prev: Accessing and Modifying Nodes, Up: Building Extensions and Advanced Customization of Org-roam + +17.2.3 Extending the Capture System +----------------------------------- + +Org-roam applies some patching over Org’s capture system to smooth out +the user experience, and sometimes it is desirable to use Org-roam’s +capturing system instead. The exposed function to be used in extensions +is ‘org-roam-capture-’: + + • Function: org-roam-capture- &key goto keys node info props + templates + + Main entry point. GOTO and KEYS correspond to ‘org-capture’ + arguments. INFO is a plist for filling up Org-roam’s capture + templates. NODE is an ‘org-roam-node’ construct containing + information about the node. PROPS is a plist containing additional + Org-roam properties for each template. TEMPLATES is a list of + org-roam templates. + + An example of an extension using ‘org-roam-capture-’ is +‘org-roam-dailies’ itself: + + (defun org-roam-dailies--capture (time &optional goto) + "Capture an entry in a daily-note for TIME, creating it if necessary. + + When GOTO is non-nil, go the note without creating an entry." + (org-roam-capture- :goto (when goto '(4)) + :node (org-roam-node-create) + :templates org-roam-dailies-capture-templates + :props (list :override-default-time time)) + (when goto (run-hooks 'org-roam-dailies-find-file-hook))) + + +File: org-roam.info, Node: Appendix, Next: Keystroke Index, Prev: Developer's Guide to Org-roam, Up: Top + +18 Appendix +*********** + +* Menu: + +* Note-taking Workflows:: +* Ecosystem:: + + +File: org-roam.info, Node: Note-taking Workflows, Next: Ecosystem, Up: Appendix + +18.1 Note-taking Workflows +========================== + +Books + • How To Take Smart Notes + (https://www.goodreads.com/book/show/34507927-how-to-take-smart-notes) +Articles + • The Zettelkasten Method - LessWrong 2.0 + (https://www.lesswrong.com/posts/NfdHG6oHBJ8Qxc26s/the-zettelkasten-method-1) + • Building a Second Brain in Roam...And Why You Might Want To : + RoamResearch + (https://reddit.com/r/RoamResearch/comments/eho7de/building_a_second_brain_in_roamand_why_you_might) + • Roam Research: Why I Love It and How I Use It - Nat Eliason + (https://www.nateliason.com/blog/roam) + • Adam Keesling’s Twitter Thread + (https://twitter.com/adam_keesling/status/1196864424725774336?s=20) + • How To Take Smart Notes With Org-mode · Jethro Kuan + (https://blog.jethro.dev/posts/how_to_take_smart_notes_org/) +Threads + • Ask HN: How to Take Good Notes + (https://news.ycombinator.com/item?id=22473209) +Videos + • How to Use Roam to Outline a New Article in Under 20 Minutes + (https://www.youtube.com/watch?v=RvWic15iXjk) + + +File: org-roam.info, Node: Ecosystem, Prev: Note-taking Workflows, Up: Appendix + +18.2 Ecosystem +============== + + +File: org-roam.info, Node: Keystroke Index, Next: Command Index, Prev: Appendix, Up: Top + +Appendix A Keystroke Index +************************** + + +File: org-roam.info, Node: Command Index, Next: Function Index, Prev: Keystroke Index, Up: Top + +Appendix B Command Index +************************ + + +File: org-roam.info, Node: Function Index, Next: Variable Index, Prev: Command Index, Up: Top + +Appendix C Function Index +************************* + + +File: org-roam.info, Node: Variable Index, Prev: Function Index, Up: Top + +Appendix D Variable Index +************************* + +Emacs 30.1 (Org mode 9.7.29) + + +Tag Table: +Node: Top754 +Node: Introduction4256 +Ref: Introduction-Footnote-16397 +Node: Target Audience6506 +Node: A Brief Introduction to the Zettelkasten Method8382 +Node: Installation11540 +Node: Installing from MELPA11871 +Node: Installing from Source12886 +Node: Getting Started15802 +Node: The Org-roam Node16094 +Node: Links between Nodes16917 +Node: Setting up Org-roam17322 +Node: Creating and Linking Nodes18929 +Node: Customizing Node Completions20647 +Node: Customizing Node Caching22870 +Node: How to cache23106 +Node: What to cache23407 +Node: When to cache25541 +Node: The Org-roam Buffer26313 +Node: Navigating the Org-roam Buffer27774 +Node: Configuring what is displayed in the buffer28487 +Node: Configuring the Org-roam buffer display30296 +Node: Styling the Org-roam buffer31796 +Node: Node Properties32008 +Node: Standard Org properties32227 +Node: Titles and Aliases32572 +Node: Tags33579 +Node: Refs34239 +Node: Citations35445 +Node: Using the Cached Information36011 +Node: Completion37158 +Node: Completing within Link Brackets37953 +Node: Completing anywhere38403 +Node: Encryption39183 +Node: The Templating System39939 +Node: Template Walkthrough40656 +Node: Org-roam Template Expansion42480 +Node: Extensions44354 +Node: org-roam-protocol44590 +Node: Installation (1)45052 +Node: Linux45889 +Node: Mac OS47415 +Ref: Testing org-protocol50208 +Node: Windows51221 +Node: The roam-node protocol51964 +Node: The roam-ref protocol52351 +Node: org-roam-graph53530 +Node: Graph Options55431 +Node: org-roam-dailies56465 +Node: Configuration56752 +Node: Usage57567 +Node: org-roam-export59390 +Node: Performance Optimization59910 +Node: Garbage Collection60116 +Node: The Org-mode Ecosystem60910 +Node: Browsing History with winner-mode61407 +Node: Versioning Notes62279 +Node: Full-text search with Deft63070 +Node: Org-journal63821 +Node: Org-download64633 +Node: mathpixel65152 +Node: Org-noter / Interleave65733 +Node: Bibliography66125 +Node: Spaced Repetition66886 +Node: FAQ67542 +Node: How do I have more than one Org-roam directory?68010 +Node: How do I create a note whose title already matches one of the candidates?69581 +Node: How can I stop Org-roam from creating IDs everywhere?70498 +Node: How do I migrate from Roam Research?71192 +Node: How to migrate from Org-roam v1?71689 +Node: How do I publish my notes with an Internet-friendly graph?73081 +Node: Configure org-mode for publishing74442 +Node: Overriding the default link creation function75920 +Node: Copying the generated file to the export directory76592 +Node: Developer's Guide to Org-roam77563 +Node: Org-roam's Design Principle77837 +Node: Building Extensions and Advanced Customization of Org-roam79825 +Node: Accessing the Database81085 +Node: Accessing and Modifying Nodes81814 +Node: Extending the Capture System83686 +Node: Appendix85236 +Node: Note-taking Workflows85423 +Node: Ecosystem86670 +Node: Keystroke Index86787 +Node: Command Index86938 +Node: Function Index87091 +Node: Variable Index87245 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/20241210001045-technical.org b/20241210001045-technical.org old mode 100644 new mode 100755 index 5ac1d0c..9694160 --- a/20241210001045-technical.org +++ b/20241210001045-technical.org @@ -1,7 +1,7 @@ :PROPERTIES: :ID: 2f285f04-fcf4-4ade-a1ac-2c50b43d529a :END: -#+title: technical_moc +#+title: Technical MOC #+filetags: :moc: In this file I want to include technical information (things related to programming, coding and networking etc): @@ -18,3 +18,6 @@ In this file I want to include technical information (things related to programm - [[id:5a207a1c-6f02-40d5-b42e-38daaa0aec10][c_notes]] - [[id:ae343652-96fe-4341-8a36-ec3a1abd0dc6][java_moc]] - [[id:f09cb4ed-1407-4187-9002-de2c5db13a8f][server_moc]] + +- [[id:631b2086-4b8f-4fe3-829d-be1dc014e293][design-patterns-notes]] +- [[id:37495d5f-2a77-40bc-b45c-8163189bbe6b][technical-commonplace]] diff --git a/20241210001045-technical.org~ b/20241210001045-technical.org~ deleted file mode 100644 index d5bd542..0000000 --- a/20241210001045-technical.org~ +++ /dev/null @@ -1,19 +0,0 @@ -:PROPERTIES: -:ID: 2f285f04-fcf4-4ade-a1ac-2c50b43d529a -:END: -#+title: technical_moc -#+filetags: :moc: - -In this file I want to include technical information (things related to programming, coding and networking etc): - -- [[id:e7f2302b-16eb-476d-a7b9-be12f077819d][AOC Notes]] -- [[id:348df473-6443-4f4a-b366-95397b574989][web-port-notes]] -- [[id:710f65e5-0bd4-42be-b5d1-69dbe79b745e][github-notes]] -- [[id:bdb493df-db92-4c93-9558-0b10fdff3048][linux_moc]] -- [[id:e448cd99-afee-4702-947f-644bb34dc1aa][database_moc]] -- [[id:8fa3f476-6152-45f4-b618-50f1e4bce46c][emacs_moc]] -- [[id:0880f089-a5ad-49cd-8ce3-f020a5941313][networking-moc]] -- [[id:9d1cfccc-8da7-41a3-b435-9857f0abe441][leetcode_notes]] -- [[id:347d2663-515b-4d9a-9ee9-7706ee86a845][haskell_notes]] -- [[id:5a207a1c-6f02-40d5-b42e-38daaa0aec10][c_notes]] -- [[id:ae343652-96fe-4341-8a36-ec3a1abd0dc6][java_moc]] diff --git a/20241210001045-technical_coding.org~ b/20241210001045-technical_coding.org~ deleted file mode 100755 index 382be7d..0000000 --- a/20241210001045-technical_coding.org~ +++ /dev/null @@ -1,15 +0,0 @@ -:PROPERTIES: -:ID: 2f285f04-fcf4-4ade-a1ac-2c50b43d529a -:END: -#+title: Technical Coding -#+filetags: :coding:notes:technical:index: - -In this file I want to include technical coding information. This will include things I've learnt from solving: -- [[id:9d1cfccc-8da7-41a3-b435-9857f0abe441][Leetcode Notes]] -- [[id:e7f2302b-16eb-476d-a7b9-be12f077819d][AOC Notes]] -- [[id:347d2663-515b-4d9a-9ee9-7706ee86a845][Haskell Notes]] -- [[id:5a207a1c-6f02-40d5-b42e-38daaa0aec10][C Notes]] -- [[id:348df473-6443-4f4a-b366-95397b574989][web-port-notes]] -- [[id:710f65e5-0bd4-42be-b5d1-69dbe79b745e][github-notes]] -- [[id:ae343652-96fe-4341-8a36-ec3a1abd0dc6][technical-java-notes]] -- diff --git a/20241210001150-aoc_notes.org~ b/20241210001150-aoc_notes.org~ deleted file mode 100755 index 1139b1d..0000000 --- a/20241210001150-aoc_notes.org~ +++ /dev/null @@ -1,1085 +0,0 @@ -:PROPERTIES: -:ID: e7f2302b-16eb-476d-a7b9-be12f077819d -:END: -#+title: AOC Notes -#+STARTUP: overview - -Here are the notes for the AOC (Advent Of Code) for the year 2024. -Workspace: -#+BEGIN_SRC haskell -import System.Process (callCommand) -main :: IO () -main = do - putStrLn "Launching IntelliJ in gnome-terminal with zsh..." - _ <- callCommand "gnome-terminal -- zsh -c 'idea /home/zaine/Documents/projects/advent_of_code'" - putStrLn "Terminal launched." -#+END_SRC - -#+RESULTS: - -* Day 3 -** point 1 -A lot of basic string and numeric manipulation was tested. -When you have a input string, and want to test weather there contains a substring, you can use - -#+BEGIN_SRC java[[id:8fa3f476-6152-45f4-b618-50f1e4bce46c][Emacs Stuff]] -// input is the string -if (input.startsWith("mul(", i)) { - int endIndex = input.indexOf(")", i); - if (endIndex != -1) { - String candidate = input.substring(i, endIndex + 1); -} -} -#+END_SRC - -Here we can see that through the loop, an if check is being done to check if the string starts with "mul(", if so, it gets the endIndex of it too. Then it stores that "candidate" value into a String, using the substring method. -** point 2 -some regex below: this checks if the input is of the correct format. - -#+BEGIN_SRC java - public static boolean isValidMul(String input) { - // Regex to validate mul(X,Y) where X and Y are 1-3 digit numbers - return input.matches("mul\\(\\d{1,3},\\d{1,3}\\)"); - } -#+END_SRC -* Day 4 -** part 1 -was extremely difficult. i had to load the input as a 2d array, -#+BEGIN_SRC java -int cols = lines.get(0).length(); //where lines is var -int cols = grid[0].length; // where grid is a 2d array -#+END_SRC -this allows you to get the vertical length of the 2d array. - -*** countWordOccurrences Method -Iterates through the grid to check for occurrences of the word "XMAS" in all possible directions (horizontal, vertical, and diagonal). -Directions: Defined by the directions array, which contains 8 possible ways to traverse: - {0, 1}: Right - {0, -1}: Left - {1, 0}: Down - {-1, 0}: Up - {1, 1}: Diagonal down-right - {1, -1}: Diagonal down-left - {-1, 1}: Diagonal up-right - {-1, -1}: Diagonal up-left - -For each starting position (row, col) in the grid: - -The program checks each direction by calling isWordFound. - -*** Checking for the Word -isWordFound Method Validates if the word exists starting from a specific position (row, col) in the grid, moving in the specified direction (dx, dy). -For each character in the word: -- compute the new position (newRow, newCol) based on the direction. -- Check bounds to ensure the position is valid (not out of the grid). -- Compare the character at the position with the corresponding character in the word. -- If any check fails, return false. - -If all characters match, the word is found, and the method returns true. - -*** Counting Matches -For each occurrence of the word found by isWordFound, increment the count variable. -After scanning all positions and directions in the grid, the total count is returned. - -** part 2 -was alot easier, i looped through the whole grid, and wherever there is the letter 'A', i want to check around it, it can be in the form: -#+BEGIN_SRC -M.S -.A. -M.S -#+END_SRC -and this would count as one, as there is MAS twice (diagonally in the shape of an X) -* Day 5 -** Part One: Identifying Correctly Ordered Updates -*** Splitting Input into Rules and Updates -Parsing the input file into two distinct sections (rules and updates) required identifying the empty line separator. - #+BEGIN_SRC java - for (String line : lines) { - if (line.trim().isEmpty()) { - emptyLineFound = true; - continue; // Skip the empty line itself - } - if (!emptyLineFound) { - firstList.add(line); - } else { - secondList.add(line); - } - } - #+END_SRC - -*** Dependency Graph Representation -Representing the rules as a directed graph with each rule defining an edge (X|Y as X -> Y). This graph maps each page to a list of pages that must follow it. - #+BEGIN_SRC java - Map> graph = new HashMap<>(); - graph.putIfAbsent(from, new ArrayList<>()); - graph.get(from).add(to); - #+END_SRC - -*** Checking Update Validity -Verifying if an update follows the rules using a map of page positions for quick lookup. - #+BEGIN_SRC java - for (Map.Entry> entry : graph.entrySet()) { - int from = entry.getKey(); - for (int to : entry.getValue()) { - if (positions.get(from) >= positions.get(to)) { - return false; // Rule violated - } - } - } - #+END_SRC - -*** Finding the Middle Page -Calculating the middle page for each correctly ordered update using list indexing. - #+BEGIN_SRC java - int middlePage = pages.get(pages.size() / 2); - #+END_SRC - -** Part Two: Reordering Incorrect Updates -*** Topological Sorting -Reordering pages required implementing a topological sort, which ensures all dependencies (rules) are respected. - #+BEGIN_SRC java - visiting.add(node); - for (int neighbor : graph.getOrDefault(node, Collections.emptyList())) { - if (!dfs(neighbor, graph, visited, visiting, sorted)) { - return false; // Cycle detected - } - } - visiting.remove(node); - visited.add(node); - sorted.add(node); - #+END_SRC - -*** Subgraph Creation -Only rules involving pages in the current update were considered. This required dynamically building a subgraph for each update. - #+BEGIN_SRC java - for (int page : pages) { - if (graph.containsKey(page)) { - for (int dependent : graph.get(page)) { - if (pages.contains(dependent)) { - subGraph.get(page).add(dependent); - } - } - } - } - #+END_SRC - -*** Cycle Detection - Ensuring no cycles existed in the dependency graph was critical for valid sorting. - #+BEGIN_SRC java - if (visiting.contains(node)) { - return false; // Cycle detected - } - #+END_SRC - -*** Finding Middle Page After Reordering - Same approach as in Part One but applied after sorting. - #+BEGIN_SRC java - int correctedMiddlePage = reorderedPages.get(reorderedPages.size() / 2); - #+END_SRC - -* Day 6 -** Part 1 -*** Input Parsing -#+BEGIN_SRC java -List input = Files.readAllLines(Paths.get("aoc_24/src/day_6/input")); -int rows = input.size(); -int cols = input.get(0).length(); -char[][] map = new char[rows][cols]; -#+END_SRC - -*** Guard Initialization - #+BEGIN_SRC java - for (int r = 0; r < rows; r++) { - for (int c = 0; c < cols; c++) { - if ("^v<>".indexOf(map[r][c]) != -1) { - guardRow = r; - guardCol = c; - guardFacing = map[r][c]; - map[r][c] = '.'; // Clear the guard's position - } - } - } - #+END_SRC - -*** Movement Directions - #+BEGIN_SRC java - Map directions = Map.of( - '^', new int[] {-1, 0}, - 'v', new int[] {1, 0}, - '<', new int[] {0, -1}, - '>', new int[] {0, 1} - ); - #+END_SRC - -*** Turning Logic - #+BEGIN_SRC java - Map turnRight = Map.of( - '^', '>', - '>', 'v', - 'v', '<', - '<', '^' - ); - #+END_SRC - -*** Visited Positions Tracking - #+BEGIN_SRC java - Set visited = new HashSet<>(); - visited.add(guardRow + "," + guardCol); - #+END_SRC - -*** Movement and Termination Logic - #+BEGIN_SRC java - while (true) { - int[] move = directions.get(guardFacing); - int nextRow = guardRow + move[0]; - int nextCol = guardCol + move[1]; - - if (nextRow < 0 || nextRow >= rows || nextCol < 0 || nextCol >= cols) { - break; // Guard leaves the map - } - - if (map[nextRow][nextCol] == '#') { - guardFacing = turnRight.get(guardFacing); // Turn right - } else { - guardRow = nextRow; - guardCol = nextCol; - visited.add(guardRow + "," + guardCol); - } - } - #+END_SRC -** Part 2 -*** Input Parsing - #+BEGIN_SRC java - List input = Files.readAllLines(Paths.get("aoc_24/src/day_6/input")); - int rows = input.size(); - int cols = input.get(0).length(); - char[][] map = new char[rows][cols]; - #+END_SRC - -*** Guard Initialization - #+BEGIN_SRC java - for (int r = 0; r < rows; r++) { - for (int c = 0; c < cols; c++) { - if ("^v<>".indexOf(map[r][c]) != -1) { - guardRow = r; - guardCol = c; - guardFacing = map[r][c]; - map[r][c] = '.'; // Clear the guard's position - } - } - } - #+END_SRC - -*** Movement Directions - #+BEGIN_SRC java - Map directions = Map.of( - '^', new int[] {-1, 0}, - 'v', new int[] {1, 0}, - '<', new int[] {0, -1}, - '>', new int[] {0, 1} - ); - #+END_SRC - -*** Turning Logic - #+BEGIN_SRC java - Map turnRight = Map.of( - '^', '>', - '>', 'v', - 'v', '<', - '<', '^' - ); - #+END_SRC - -*** Valid Obstruction Positions - #+BEGIN_SRC java - Set validObstructions = new HashSet<>(); - - for (int r = 0; r < rows; r++) { - for (int c = 0; c < cols; c++) { - if (map[r][c] == '.' && !(r == guardRow && c == guardCol)) { - map[r][c] = '#'; // Temporarily place obstruction - - if (causesLoop(map, guardRow, guardCol, guardFacing, directions, turnRight)) { - validObstructions.add(r + "," + c); - } - - map[r][c] = '.'; // Remove obstruction - } - } - } - System.out.println("Number of valid obstruction positions: " + validObstructions.size()); - #+END_SRC - -*** Loop Detection Helper Function - #+BEGIN_SRC java - private static boolean causesLoop(char[][] map, int guardRow, int guardCol, char guardFacing, - Map directions, Map turnRight) { - Set seenStates = new HashSet<>(); - int rows = map.length; - int cols = map[0].length; - - while (true) { - String state = guardRow + "," + guardCol + "," + guardFacing; - if (seenStates.contains(state)) { - return true; // Loop detected - } - seenStates.add(state); - - int[] move = directions.get(guardFacing); - int nextRow = guardRow + move[0]; - int nextCol = guardCol + move[1]; - - if (nextRow < 0 || nextRow >= rows || nextCol < 0 || nextCol >= cols) { - return false; // Guard leaves the map - } - - if (map[nextRow][nextCol] == '#') { - guardFacing = turnRight.get(guardFacing); // Turn right - } else { - guardRow = nextRow; - guardCol = nextCol; - } - } - } - #+END_SRC - -* Day 7 -** Part 1 -*** Input Parsing - - Parse the input file, where each line is in the format `: ...` - - `testValue` is a target number, and we determine if it can be computed by combining the given numbers with `+` or `*`. - #+BEGIN_SRC java - List input = Files.readAllLines(Paths.get("aoc_24/src/day_7/input")); - long totalCalibrationResult = 0; - - for (String line : input) { - String[] parts = line.split(": "); - long testValue = Long.parseLong(parts[0]); // Target value - String[] numbers = parts[1].split(" "); - } - #+END_SRC - -*** Validation Logic - - The `isValidEquation` function checks if any combination of operators (`+` or `*`) between the numbers matches the `testValue`. - - Evaluation is performed left-to-right. - #+BEGIN_SRC java - private static boolean isValidEquation(long testValue, String[] numbers) { - List operators = Arrays.asList("+", "*"); - List operatorCombinations = generateOperatorCombinations(numbers.length - 1, operators); - - for (String[] operatorCombination : operatorCombinations) { - long result = Long.parseLong(numbers[0]); - for (int i = 1; i < numbers.length; i++) { - String operator = operatorCombination[i - 1]; - long num = Long.parseLong(numbers[i]); - - if (operator.equals("+")) { - result += num; - } else if (operator.equals("*")) { - result *= num; - } - } - - if (result == testValue) { - return true; // Equation is valid - } - } - return false; // No valid equation found - } - #+END_SRC - -*** Operator Combination Generator - - Generate all possible combinations of `+` and `*` for `n-1` positions (where `n` is the number of numbers). - #+BEGIN_SRC java - private static List generateOperatorCombinations(int numOperators, List operators) { - List combinations = new ArrayList<>(); - generateOperatorCombinationsRecursive(new String[numOperators], 0, operators, combinations); - return combinations; - } - - private static void generateOperatorCombinationsRecursive(String[] current, int index, List operators, List combinations) { - if (index == current.length) { - combinations.add(current.clone()); - return; - } - - for (String operator : operators) { - current[index] = operator; - generateOperatorCombinationsRecursive(current, index + 1, operators, combinations); - } - } - #+END_SRC - -*** Main Logic - - Iterate over each line of input. - - Parse `testValue` and numbers. - - If a valid equation exists for the line, add the `testValue` to the total calibration result. - #+BEGIN_SRC java - for (String line : input) { - String[] parts = line.split(": "); - long testValue = Long.parseLong(parts[0]); - String[] numbers = parts[1].split(" "); - - if (isValidEquation(testValue, numbers)) { - totalCalibrationResult += testValue; - } - } - System.out.println("Total Calibration Result: " + totalCalibrationResult); - #+END_SRC - -** Part 2 -*** Input Parsing - - Reads an input file where each line is formatted as `: ...`. - - Parses `testValue` and the numbers to evaluate equations that could result in `testValue`. - #+BEGIN_SRC java - List input = Files.readAllLines(Paths.get("aoc_24/src/day_7/input")); - long totalCalibrationResult = 0; - - for (String line : input) { - String[] parts = line.split(": "); - long testValue = Long.parseLong(parts[0]); // Target value - String[] numbers = parts[1].split(" "); - } - #+END_SRC - -*** Validation Logic - - The `isValidEquation` function checks if any combination of operators (`+`, `*`, or `||`) between numbers can match the `testValue`. - - Includes support for a new operator `||`: - - Concatenates the current `result` and the next number as strings. - - Converts the concatenated string back to `long` to update the result. - - Evaluation is performed left-to-right. - #+BEGIN_SRC java - private static boolean isValidEquation(long testValue, String[] numbers) { - List operators = Arrays.asList("+", "*", "||"); - List operatorCombinations = generateOperatorCombinations(numbers.length - 1, operators); - - for (String[] operatorCombination : operatorCombinations) { - long result = Long.parseLong(numbers[0]); - for (int i = 1; i < numbers.length; i++) { - String operator = operatorCombination[i - 1]; - long num = Long.parseLong(numbers[i]); - - if (operator.equals("+")) { - result += num; - } else if (operator.equals("*")) { - result *= num; - } else if (operator.equals("||")) { - result = Long.parseLong(Long.toString(result) + Long.toString(num)); - } - } - - if (result == testValue) { - return true; - } - } - return false; - } - #+END_SRC - -*** Operator Combination Generator - - Generates all possible combinations of `+`, `*`, and `||` operators for `n-1` positions (where `n` is the number of numbers). - - Recursively builds the combinations. - #+BEGIN_SRC java - private static List generateOperatorCombinations(int numOperators, List operators) { - List combinations = new ArrayList<>(); - generateOperatorCombinationsRecursive(new String[numOperators], 0, operators, combinations); - return combinations; - } - - private static void generateOperatorCombinationsRecursive(String[] current, int index, List operators, List combinations) { - if (index == current.length) { - combinations.add(current.clone()); - return; - } - - for (String operator : operators) { - current[index] = operator; - generateOperatorCombinationsRecursive(current, index + 1, operators, combinations); - } - } - #+END_SRC - -*** Main Logic - - Iterates over each line of input. - - Parses `testValue` and numbers. - - Adds `testValue` to the total if a valid equation exists for the line. - #+BEGIN_SRC java - for (String line : input) { - String[] parts = line.split(": "); - long testValue = Long.parseLong(parts[0]); - String[] numbers = parts[1].split(" "); - - if (isValidEquation(testValue, numbers)) { - totalCalibrationResult += testValue; - } - } - System.out.println("Total Calibration Result: " + totalCalibrationResult); - #+END_SRC - -* Day 8 -Resonant Collinearity - -** Part One -- Objective: Identify unique antinode locations within a map, considering two antennas of the same frequency in a specific configuration. -- Key Condition: Antinode occurs if two antennas of the same frequency are aligned such that one is twice as far from the antinode as the other. -- Steps: - 1. Parse the input map to locate antennas grouped by their frequency. - 2. For each frequency group, iterate through all antenna pairs. - 3. Calculate potential antinode positions based on the defined condition. - 4. Use a Set to store unique antinode positions. - 5. Return the size of the Set as the total unique antinode count. - -- Code Snippet: -#+BEGIN_SRC java -for (int i = 0; i < locations.size(); i++) { - for (int j = i + 1; j < locations.size(); j++) { - int[] a = locations.get(i); - int[] b = locations.get(j); - - // Calculate midpoints and validate conditions - if ((b[0] - a[0]) % 2 == 0 && (b[1] - a[1]) % 2 == 0) { - int midRow = (a[0] + b[0]) / 2; - int midCol = (a[1] + b[1]) / 2; - antinodes.add(midRow + "," + midCol); - } - } -} -#+END_SRC - -** Part Two -- Objective: Update the model to include all positions perfectly aligned with at least two antennas of the same frequency. -- Key Changes: - - Antinodes occur at all positions along the straight line between antennas of the same frequency. - - Antennas themselves are also antinodes unless they are the only instance of their frequency. -- Steps: - 1. Parse the input map and group antennas by frequency. - 2. For each pair of antennas of the same frequency: - - Calculate direction vectors (reduced using GCD). - - Traverse along the direction vector in both forward and backward directions, marking all valid positions as antinodes. - 3. Add each antenna location directly to the set of antinodes. - 4. Return the size of the unique antinode set. - -- Code Snippet: -#+BEGIN_SRC java -int dr = b[0] - a[0]; -int dc = b[1] - a[1]; -int gcd = gcd(Math.abs(dr), Math.abs(dc)); -dr /= gcd; -dc /= gcd; - -// Traverse along the line -int row = a[0], col = a[1]; -while (isWithinBounds(row, col, rows, cols)) { - antinodes.add(row + "," + col); - row += dr; - col += dc; -} -#+END_SRC - -** Notes on Implementation -- Data Structures: - - Map>: Stores antenna positions by frequency. - - Set: Tracks unique antinode positions. -- Utility Functions: - - isWithinBounds: Ensures coordinates are within map dimensions. - - gcd: Simplifies direction vectors to avoid redundant calculations. - -* Day 9 -** Part 1: Manipulating and Calculating Disk Placement -Concept: Creating and manipulating a disk structure based on input. -Input is split into alternating "id" and "space" values. -Example of creating the disk: - #+BEGIN_SRC java - for (String character : lines.getFirst().split("")) { - int num = Integer.parseInt(character); - if (space) { - for (int i = 0; i < num; i++) disk.add(-1); - } else { - for (int i = 0; i < num; i++) disk.add(id); - id++; - } - space = !space; - } - #+END_SRC - -- Key Learning: Understanding alternating patterns in input and their translation to a data structure. - -- Problem Solving: Adjusting misplaced items. - - Utilize a while loop to locate and correct misplaced "-1" values in the disk. - - Example: - #+BEGIN_SRC java - if (disk.get(i) == -1) { - int val = -1; - while (val == -1) { - val = disk.removeLast(); - } - disk.add(i, val); - } - #+END_SRC - -- Final Calculation: Using BigInteger for large numbers. - - Formula: index * value for each position in the disk. - - Example: - #+BEGIN_SRC java - BigInteger count = BigInteger.ZERO; - for (int i = 0; i < disk.size(); i++) { - count = count.add(BigInteger.valueOf(i).multiply(BigInteger.valueOf(disk.get(i)))); - } - #+END_SRC - -** Part 2: Advanced Disk Rearrangement with Blocks - -- Concept: Representing disk as a list of Block objects. - - Block stores size and id. - - Example: - #+BEGIN_SRC java - public static class Block { - private int size; - private int id; - public Block(int size, int id) { - this.size = size; - this.id = id; - } - } - #+END_SRC - -- Key Learning: Encapsulating logic into objects improves clarity and scalability. - -- Space Management: Finding and fitting blocks into available spaces. - - Utilize a fit method to split or match blocks. - - Example: - #+BEGIN_SRC java - public List fit(Block work) { - if (work.size > this.size) return null; - List newList = new ArrayList<>(); - newList.add(work); - if (work.size < this.size) { - newList.add(new Block(this.size - work.size, -1)); - } - return newList; - } - #+END_SRC - -- Problem Solving: Iterating backward through the disk to find and rearrange blocks into spaces. - - Restart loop when a fit is found to ensure proper placement. - - Example: - #+BEGIN_SRC java - for (int i = 0; i < diskPlace; i++) { - Block possibleSpace = disk.get(i); - if (possibleSpace.getId() == -1) { - List blocks = possibleSpace.fit(work); - if (blocks != null) { - disk.remove(diskPlace); - disk.add(diskPlace, new Block(work.getSize(), -1)); - for (int j = blocks.size() - 1; j >= 0; j--) { - disk.add(i, blocks.get(j)); - } - break; - } - } - } - #+END_SRC - -- Final Calculation: Summing placements using block properties. - - Ensure large calculations are done efficiently with BigInteger. - - Example: - #+BEGIN_SRC java - BigInteger count = BigInteger.ZERO; - int placement = 0; - for (Block block : disk) { - if (block.getId() != -1) { - for (int j = 0; j < block.getSize(); j++) { - count = count.add(BigInteger.valueOf(placement).multiply(BigInteger.valueOf(block.getId()))); - placement++; - } - } else { - placement += block.getSize(); - } - } - #+END_SRC - -* Day 10 -** Part 1: Counting Trails in a 2D Grid - -- Concept: Navigating and processing a 2D grid based on specific rules. - - Input is parsed into a 2D map from a list of strings. - - Conversion logic for parsing: - #+BEGIN_SRC java - int[] map = new int[width * height]; - int i = 0; - for (String line : lines) { - if (line.isBlank()) continue; - for (String character : line.trim().split("")) { - map[i] = Integer.parseInt(character); - i++; - } - } - #+END_SRC - -- Recursive Approach: Traversing paths with a helper function countTrails. - - Recursion halts on boundaries, invalid values, or when a sequence completes. - - Example: - #+BEGIN_SRC java - private static Set countTrails(int[] map, int x, int y, int width, int height, int val) { - if (x >= width || y >= height || x < 0 || y < 0 || map[y * width + x] != val) return new HashSet<>(); - if (val == 9) return Set.of(new Point(9, x, y)); - - Set result = new HashSet<>(); - result.addAll(countTrails(map, x + 1, y, width, height, val + 1)); - result.addAll(countTrails(map, x - 1, y, width, height, val + 1)); - result.addAll(countTrails(map, x, y + 1, width, height, val + 1)); - result.addAll(countTrails(map, x, y - 1, width, height, val + 1)); - return result; - } - #+END_SRC - -- Key Learning: Recursive exploration of a grid with stateful logic for trail validity. - -- Result Calculation: Sum the size of all unique trail sets. - - Example: - #+BEGIN_SRC java - long count = 0; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - Set set = countTrails(map, x, y, width, height, 0); - count += set.size(); - } - } - #+END_SRC - -** Part 2: Enhanced Trail Counting with Weighted Points - -- Concept: Counting trails with weights using a Map for aggregation. - - Modified helper function countTrails2 tracks weights for each point. - - Example: - - #+BEGIN_SRC java - private static Map countTrails2(int[] map, int x, int y, int width, int height, int val) { - if (x >= width || y >= height || x < 0 || y < 0 || map[y * width + x] != val) return new HashMap<>(); - if (val == 9) return Map.of(new Point(1, x, y), 1); - - Map result = new HashMap<>(); - checkDirection(map, x + 1, y, width, height, val, result); - checkDirection(map, x - 1, y, width, height, val, result); - checkDirection(map, x, y + 1, width, height, val, result); - checkDirection(map, x, y - 1, width, height, val, result); - return result; - } - #+END_SRC - -- Helper Method: checkDirection facilitates merging results for trail continuity. - - Example: - #+BEGIN_SRC java - private static void checkDirection(int[] map, int x, int y, int width, int height, int val, Map result) { - Map res = countTrails2(map, x, y, width, height, val + 1); - for (Point p : res.keySet()) { - result.merge(p, res.get(p), Integer::sum); - } - } - #+END_SRC - -- Key Learning: Using a Map to manage complex trail state and weights for precise calculations. - -- Result Calculation: Sum weighted trail counts. - - Example: - #+BEGIN_SRC java - long count = 0; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - Map res = countTrails2(map, x, y, width, height, 0); - for (int value : res.values()) { - count += value; - } - } - } - #+END_SRC - -- Encapsulation of grid points as objects (Point) simplifies hash-based operations and improves code clarity. -- Using collections like Set and Map effectively is crucial for aggregating results in a structured way. - - -Would you like to make any adjustments or add further examples? -* Day 12 -** Core Logic and Functionality - -1. Coordinates Mapping: - - A map (coords) stores coordinates of each character from the input. For each character, all the coordinates where it appears are stored as Point objects. - - #+BEGIN_SRC java - for (int i = 0; i < in.size(); i++) { - for (int j = 0; j < in.get(i).length(); j++) { - coords.putIfAbsent(in.get(i).charAt(j), new ArrayList<>()); - coords.get(in.get(i).charAt(j)).add(new Point(i, j)); - } - } - #+END_SRC - -2. Flood Fill Algorithm with Stack: - - A flood-fill algorithm is used to explore areas connected by the same character. The algorithm uses a stack to explore adjacent points recursively. - - #+BEGIN_SRC java - ArrayDeque stack = new ArrayDeque<>(); - stack.push(co); - while (!stack.isEmpty()) { - var cur = stack.pop(); - // explore neighbors - } - #+END_SRC - -3. Fence Counting: - - For each region, the number of "fences" (edges where the character changes) is counted. The algorithm checks for boundaries or differing characters adjacent to each point. - - #+BEGIN_SRC java - if (nd.x < 0 || nd.y < 0 || nd.x >= in.size() || nd.y >= in.get(0).length()) { - fence++; - } else if (in.get(nd.x).charAt(nd.y) != ch) { - fence++; - } - #+END_SRC - -4. Side Fetching Logic: - - The fetchSides() method computes the number of "sides" based on the placement of fences, counting how the fences are arranged along rows and columns. - - #+BEGIN_SRC java - for (var xx : cols.keySet()) { - var xl = cols.get(xx); - Collections.sort(xl); - // logic for sorting and counting sides - } - #+END_SRC - -5. Area and Fence Calculations: - - For each character, the area (number of connected points) and the number of fences are calculated. The result is a product of area and fence count. - - #+BEGIN_SRC java - ret += area * fence; - p2 += area * fetchSides(fences); - #+END_SRC - - -*** Core Logic and Functionality - - Coordinates mapping using a Map> to track character positions. - - Flood-fill algorithm using a stack to explore regions of connected characters. - - Fence counting logic to identify boundaries and different characters. - - Side fetching logic to count the number of fences arranged along rows and columns. - - Area and fence calculations for each region to compute the final result. - - - -* Day 13 -** Part 1: Parsing Input and Solving Simultaneous Equations - - Goal: Parse input, extract button coefficients and prize values, solve simultaneous equations to find valid token costs. - - Key Concepts: - - Input parsing using BufferedReader. - - Using determinants to solve simultaneous equations. - - Validating solutions for constraints (non-negative integers, valid m/n). - - Code Snippets: - - Parsing Input: - - #+BEGIN_SRC java - if (line.startsWith("Button A:")) { - String[] parts = line.split(":")[1].split(","); - current = new ButtonPrize(); - current.buttonAX = Integer.parseInt(parts[0].trim().split("\\+")[1]); - current.buttonAY = Integer.parseInt(parts[1].trim().split("\\+")[1]); - } - #+END_SRC - - - Solving Simultaneous Equations: - - #+BEGIN_SRC java - int determinant = buttonAX * buttonBY - buttonBX * buttonAY; - if (determinant == 0) return 0; // No solution - - long mNumerator = prizeX * buttonBY - prizeY * buttonBX; - long nNumerator = prizeY * buttonAX - prizeX * buttonAY; - - if (mNumerator % determinant != 0 || nNumerator % determinant != 0) return 0; - long m = mNumerator / determinant; - long n = nNumerator / determinant; - return (m < 0 || n < 0) ? 0 : m * 3 + n; // Calculate token costs - #+END_SRC - - - Challenges Faced: - - Edge cases with determinant = 0 or invalid input format. - - Ensuring no negative values for m/n. - -** Part 2: Transforming Input Data - - Goal: Modify prize values with a fixed offset before calculations. - - Key Concepts: - - Transforming input data programmatically. - - Reusing the existing calculation logic after transformation. - - Code Snippets: - - Prepending Offset to Prize Values: - - #+BEGIN_SRC java - private void prependZeroes(ButtonPrize bp) { - bp.setPrizeX(bp.getPrizeX() + 10000000000000L); - bp.setPrizeY(bp.getPrizeY() + 10000000000000L); - } - #+END_SRC - - - Reusing Logic: - - #+BEGIN_SRC java - for (ButtonPrize bp : data) { - prependZeroes(bp); - count_part2 += calculateSimultaneousEquations(bp.getButtonAX(), bp.getButtonAY(), - bp.getButtonBX(), bp.getButtonBY(), - bp.getPrizeX(), bp.getPrizeY()); - } - #+END_SRC - - - Challenges Faced: - - Avoiding modification of original input logic while adding transformations. - - Maintaining readability and modularity. - -* Day 14 -** Part 1: Simulating Robot Movement - -- Concept: Simulating the movement of robots on a grid, wrapping their positions around the edges. - - The grid has dimensions 101x103, and the robot positions wrap around when they move out of bounds. - - Wrapping is implemented using a helper method: - - #+BEGIN_SRC java - public static int wrap(int value, int max) { - return ((value % max) + max) % max; - } - #+END_SRC - -- Key Learning: Efficiently handling movement on a toroidal grid (wrap-around behavior). - -- Quadrant Assignment: - - Robots are excluded from the middle row and column (x=50, y=51). - - Quadrant assignments are based on the x and y positions: - - #+BEGIN_SRC java - if (x < 50 && y < 51) { - quadrantCounts[0]++; // Top-left - } else if (x >= 50 && y < 51) { - quadrantCounts[1]++; // Top-right - } else if (x < 50 && y >= 51) { - quadrantCounts[2]++; // Bottom-left - } else if (x >= 50 && y >= 51) { - quadrantCounts[3]++; // Bottom-right - } - #+END_SRC - -- Safety Factor Calculation: - - The safety factor is the product of the number of robots in each quadrant: - - #+BEGIN_SRC java - int safetyFactor = 1; - for (int count : quadrantCounts) { - safetyFactor *= count; - } - #+END_SRC - -** Part 2: Identifying Patterns in Robot Positions - -- Concept: Simulating grid states to find a specific pattern of robot alignment. - - Robots move based on their initial velocity, and their positions are updated iteratively. - - A grid is used to track robot positions, and columns are checked for specific patterns. - -- Key Learning: Efficiently detecting consecutive robot positions in a grid column. - -- Grid Initialization: - - A helper method initializes a 2D grid with given dimensions: - - #+BEGIN_SRC java - private int[][] initializeGrid(int rows, int cols) { - return new int[rows][cols]; - } - #+END_SRC - -- Position Calculation: - - New positions are computed using the robot's velocity and current step, with wrapping: - - #+BEGIN_SRC java - private int[] calculateNewPosition(int[] position, int[] velocity, int step, int[] tileDimensions) { - return new int[] { - (position[0] + step * (tileDimensions[0] + velocity[0])) % tileDimensions[0], - (position[1] + step * (tileDimensions[1] + velocity[1])) % tileDimensions[1] - }; - } - #+END_SRC - -- Pattern Detection: - - A helper method checks for consecutive robots in a column: - - #+BEGIN_SRC java - private boolean hasConsecutiveInRow(List positions, int requiredConsecutive) { - Collections.sort(positions); - int consecutiveCount = 0; - - for (int i = 1; i < positions.size(); i++) { - if (positions.get(i) - positions.get(i - 1) == 1) { - consecutiveCount++; - if (consecutiveCount >= requiredConsecutive) { - return true; - } - } else { - consecutiveCount = 0; - } - } - return false; - } - #+END_SRC - -- Stopping Condition: - - Simulation stops when a column has at least requiredConsecutive robots aligned. - ---- - -### Supporting Components - -- Data Representation: - - PointAndVelocity encapsulates robot data, including position (PX, PY) and velocity (VX, VY): - - #+BEGIN_SRC java - public static class PointAndVelocity { - private int PX; - private int PY; - private int VX; - private int VY; - - // Getters and setters - public int getVX() { return VX; } - public void setVX(int vX) { VX = vX; } - public int getVY() { return VY; } - public void setVY(int vY) { VY = vY; } - public int getPX() { return PX; } - public void setPX(int pX) { PX = pX; } - public int getPY() { return PY; } - public void setPY(int pY) { PY = pY; } - } - #+END_SRC - -- Input Parsing: - - Robot data is parsed from a file or input list. Each robot's position and velocity are extracted: - - #+BEGIN_SRC java - private List getPointAndVelocities() { - List pvs = new ArrayList<>(); - try (BufferedReader reader = new BufferedReader(new FileReader(fetchFilePath()))) { - String line; - while ((line = reader.readLine()) != null) { - String[] parts = line.split(" "); - PointAndVelocity pav = new PointAndVelocity(); - pav.setPX(Integer.parseInt(parts[0].split(",")[0].replace("p=", ""))); - pav.setPY(Integer.parseInt(parts[0].split(",")[1].replace("p=", ""))); - pav.setVX(Integer.parseInt(parts[1].split(",")[0].replace("v=", ""))); - pav.setVY(Integer.parseInt(parts[1].split(",")[1].replace("v=", ""))); - pvs.add(pav); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return pvs; - } - #+END_SRC - -- Simulation Control: - - Part 1 iterates for 100 steps, while Part 2 continues until a pattern is found or the maximum steps are reached. - -* diff --git a/20241210001206-leetcode_notes.org~ b/20241210001206-leetcode_notes.org~ deleted file mode 100755 index 02a3224..0000000 --- a/20241210001206-leetcode_notes.org~ +++ /dev/null @@ -1,17 +0,0 @@ -:PROPERTIES: -:ID: 9d1cfccc-8da7-41a3-b435-9857f0abe441 -:END: -#+title: Leetcode Notes -#+filetags: :notes:leetcode:coding:technical: - -* Resources: -To work through: - -- https://www.youtube.com/watch?v=lvO88XxNAzs&list=LL&index=1&ab_channel=stoneycodes - -* Start -[[id:275988a8-59d8-40c8-a8b4-47118d6eb834][big-o-complexity]] - -[[id:086ca3ca-39ec-4d37-b56d-b6d9f51e6873][how-to-solve-leetcode]] - -[[id:93a43a24-6861-40c4-b45b-581977bb55cf][leetcode-arrays]] diff --git a/20241210004247-emacs_stuff.org b/20241210004247-emacs_stuff.org old mode 100644 new mode 100755 diff --git a/20241210004247-emacs_stuff.org~ b/20241210004247-emacs_stuff.org~ deleted file mode 100644 index 8fbebe2..0000000 --- a/20241210004247-emacs_stuff.org~ +++ /dev/null @@ -1,26 +0,0 @@ -:PROPERTIES: -:ID: 8fa3f476-6152-45f4-b618-50f1e4bce46c -:END: -#+title: emacs_moc -#+filetags: :emacs:moc: - -The purpose of this file is to store things related to emacs (that being packages, or community projects that i stumble across). -- [[id:034abe27-ca14-4dc0-9a3f-b8d0e1f26342][emacs-stuff-org-roam]] for roam related things -- [[id:8e5e9498-ff3c-48e7-aab5-6e94b2e41ccb][emacs-stuff-gtd]] -- [[id:966175d4-3b58-4abc-9b41-08cbf328dd87][emacs-stuff-keybindings]] -- [[id:7e79e4c5-383d-450f-882c-33d4f87ba1b5][emacs-stuff-elisp]] -- [[id:2ab0fa3f-8ac6-4af2-8cd4-1dd490fb19c3][emacs-stuff-magit]] -- [[id:45CC3AF5-5E20-4B03-A36C-8D4BDD5CBB13][emacs-stuff-evil]] - - -- A link that contains all the key bindings for emacs: [[http://xahlee.info/emacs/emacs/emacs_keybinding_list.html][Keybindings list]] -- the theme 'ef-dream' repository: [[https://github.com/protesilaos/ef-themes][ef-themes]] -- something to look into: [[https://github.com/mickeynp/combobulate][combobulate]] -- the use package git hub: [[https://github.com/jwiegley/use-package][use-package]] -- hamacs (someones emacs config) [[https://www.howardabrams.com/hamacs/][hamacs]] -- projectile doc [[https://docs.projectile.mx/projectile/configuration.html][proj doc]] -- doom style dashboard [[https://gist.github.com/DevelopmentCool2449/ffc91d1d9b7b16e0f48402b698386f3d#file-dashboard-doom-style-el][doom dash]] -- soft charcoal theme [[https://github.com/mswift42/soft-charcoal-theme?tab=readme-ov-file][sc]] -- the theme im currently using: [[https://github.com/ogdenwebb/emacs-kaolin-themes?tab=readme-ov-file][kaolin]] -- config: [[https://gitlab.com/dwt1/configuring-emacs][config-dwt]] -- simplenote to self hosted: [[https://ru2saig.github.io/posts/switching-from-simplenote-to-a-self-hosted-approach-nextcloud-orgzly-and-emacs/][Link]] diff --git a/20241210004329-org_roam.org~ b/20241210004329-org_roam.org~ deleted file mode 100755 index 044c0c8..0000000 --- a/20241210004329-org_roam.org~ +++ /dev/null @@ -1,29 +0,0 @@ -:PROPERTIES: -:ID: 034abe27-ca14-4dc0-9a3f-b8d0e1f26342 -:END: -#+title: emacs-stuff-org-roam -This base will contain information on org roam. Although its closely linked to the [[id:8e5e9498-ff3c-48e7-aab5-6e94b2e41ccb][emacs-stuff-gtd]] node, that one will contain articles, notes and videos related to how to get things done. - - -Here is the current config in my init.el -#+BEGIN_SRC elisp - ;;roam config - (use-package org-roam - :ensure t - :custom - (org-roam-directory "~/master-folder/org_files/org_roam") - :bind (("C-c n l" . org-roam-buffer-toggle) - ("C-c n f" . org-roam-node-find) - ("C-c n i" . org-roam-node-insert)) - :config - (org-roam-setup)) -#+END_SRC - - -- for the org-roam-ui (the graphical interface for nodes): [[https://github.com/org-roam/org-roam-ui][org-roam-ui]] -- an article: [[https://gist.github.com/nickanderson/00005b5b03e323a65ada98c5fa5ebb11][example-org-roam-workflow.org]] -- An article to read: [[https://cmdln.org/2023/03/25/how-i-org-in-2023/][How i use org in 2023]] -- An article: [[https://jethrokuan.github.io/org-roam-guide/][org-roam-guide]] -- An article: [[https://ianjones.info/own-your-second-brain][Own your second brain]] -- article: [[https://honnef.co/articles/my-org-roam-workflows-for-taking-notes-and-writing-articles/][my-org-roam-workflows-for-taking-notes-and-writing-articles]] -- article: [[https://michaelneuper.com/posts/how-i-use-org-roam-to-takes-notes-for-cs/][how-i-use-org-roam-to-takes-notes-for-cs]] diff --git a/20241210004453-gtd.org~ b/20241210004453-gtd.org~ deleted file mode 100755 index 17f3a1c..0000000 --- a/20241210004453-gtd.org~ +++ /dev/null @@ -1,7 +0,0 @@ -:PROPERTIES: -:ID: 8e5e9498-ff3c-48e7-aab5-6e94b2e41ccb -:END: -#+title: emacs-stuff-gtd -#+filetags: :emacs:gtd:resources: - -- article: [[https://hamberg.no/gtd][gtd]] diff --git a/20241210012703-fyp.org~ b/20241210012703-fyp.org~ deleted file mode 100755 index 5fae555..0000000 --- a/20241210012703-fyp.org~ +++ /dev/null @@ -1,27 +0,0 @@ -:PROPERTIES: -:ID: 7d199fbe-b0e7-48fd-b8a1-793044dbea01 -:END: -#+title: FYP -#+filetags: :index:uni:fyp: - -In this file i will include things related to my final year *project*. - -- The idea: -*A web platform for users to take notes with an ai assistant* - -- Migrating to cloud databse. -I was originally intending to use AWS RDS with an e2c instance, but realised that the learning curve was too great, and that i needed a simpler solution. -On the <2024-12-09 Mon> I decided to try this: exporting the current vm i had running and run in on oracle cloud. -The results for this: - -The UML for this project: [[id:4a8edaed-9ebd-402b-9c5f-7a0cb4399102][UML_FYP]] -@startuml -Alice -> Bob: Authentication Request -Bob --> Alice: Authentication Response - -Alice -> Bob: Another authentication Request -Alice <-- Bob: Another authentication Response -@enduml - - -[[id:26b2ed9a-cb81-4c43-bc63-6b3c8ffa3bf1][fyp-report-planning]] diff --git a/20241210152650-uni.org b/20241210152650-uni.org old mode 100644 new mode 100755 diff --git a/20241210152650-uni.org~ b/20241210152650-uni.org~ deleted file mode 100644 index 929991a..0000000 --- a/20241210152650-uni.org~ +++ /dev/null @@ -1,12 +0,0 @@ -:PROPERTIES: -:ID: 797d6e3e-98eb-4bc7-88b6-e096ef7306ad -:END: -#+title: uni_moc -#+filetags: :uni:index: -* Modules: -- [[id:5443ed1c-bb7f-4eb4-9c96-d12648dd2291][tpis]] -- [[id:556d10d1-1c74-4d9f-a398-39cb3bd5d935][afp]] -- [[id:c69e4c4d-2fb4-4cf1-a835-a235cf6db8e9][ise]] -- [[id:3acffb66-bc1a-4661-904f-c5447b3c3488][advanced-networking]] -* Final Year Project -- [[id:7d199fbe-b0e7-48fd-b8a1-793044dbea01][fyp]] Final Year Project diff --git a/20241210152713-tpis.org~ b/20241210152713-tpis.org~ deleted file mode 100755 index 1815e16..0000000 --- a/20241210152713-tpis.org~ +++ /dev/null @@ -1,9 +0,0 @@ -:PROPERTIES: -:ID: 5443ed1c-bb7f-4eb4-9c96-d12648dd2291 -:END: -#+title: TPIS -#+filetags: :uni:tpis: - -Teaching Programming In School -- Proposal: [[file:~/master-folder/misc/proposal.pdf][Proposal for the module]] -- <2024-12-10 Tue> - Presentation diff --git a/20241210232054-uml_fyp.org~ b/20241210232054-uml_fyp.org~ deleted file mode 100755 index 5319a19..0000000 --- a/20241210232054-uml_fyp.org~ +++ /dev/null @@ -1,708 +0,0 @@ -:PROPERTIES: -:ID: 4a8edaed-9ebd-402b-9c5f-7a0cb4399102 -:END: -#+title: UML_FYP -#+filetags: :uni:fyp: - - -* Class diagram -** class 2: -@startuml -skinparam classAttributeIconSize 0 -skinparam packageStyle rectangle -skinparam linetype ortho -left to right direction - -' Entity Layer -rectangle "Entity Layer" as EntityLayer #E3F2FD { - class User { - +id: Long - +roles: Set - +firstName: String - +lastName: String - +username: String - +password: String - +confirmPassword: String - +email: String - +phoneNumber: String - +picture: byte[] - } - - class Workspace { - +id: Long - +name: String - +description: String - +fileCount: int - +noteCount: int - +lastAccessed: LocalDateTime - +dateCreated: LocalDateTime - } - - class Library { - +id: Long - +name: String - +description: String - +dateCreated: LocalDateTime - +lastAccessed: LocalDateTime - } - - class Page { - +id: Long - +name: String - +workspaceId: Long - +content: Text - +height: int - +width: int - } - - class FileMetadata { - +id: Long - +fileUrl: String - +userId: String - +description: String - +fileData: byte[] - +fileName: String - +fileType: String - } - - class AiChat { - +id: Long - +name: String - +workspaceId: Long - +createdAt: LocalDateTime - +messages: List - } -} - -' Repository Layer -rectangle "Repository Layer" as RepositoryLayer #E8F5E9 { - class AiChatRepository - class FileMetadataRepository - class LibraryRepository - class PageRepository - class UserRepository - class WorkspaceRepository - class RegisterRepository - class AuthRepository -} - -' Service Layer -rectangle "Service Layer" as ServiceLayer #FFF3E0 { - class AiChatService - class AuthService - class FileMetadataService - class LibraryService - class PageService - class RegisterService - class UserService - class WorkspaceService -} - -' Controller Layer -rectangle "Controller Layer" as ControllerLayer #F3E5F5 { - class AiChatController - class AiChatWebSocketController - class AuthController - class FileMetadataController - class LibraryController - class PageController - class RegisterController - class UserController - class WorkspaceController -} - -' External Python Microservice -rectangle "External NLP Module (Python FastAPI)" as ExternalNLP #FCE4EC { - class FastAPINLPServer { - +/extract_text - +/keywords - +/tfidf_keywords - +/summarize - +/ner - } -} - - - - rectangle "Frontend Core" as FrontendCore { - class AboutComponent - class AccessibilityComponent - class ContactComponent - class ForgotPasswordComponent - class LoginComponent - class LoginService - class PrivacyComponent - class RegisterComponent - class RegisterService - class SecurityComponent - class TermsComponent - - LoginComponent --> LoginService - RegisterComponent --> RegisterService - - LoginService ..> AuthController : REST - RegisterService ..> RegisterController : REST - } - - rectangle "Frontend Entities" as FrontendEntities { - class AiChatComponent - class DashboardComponent - class DefaultLayoutComponent - class HomeComponent - class LibraryComponent - class ProfileComponent - class WorkspacePageComponent - class WorkspacesComponent - - class AiChatServiceFE - class DashboardServiceFE - class LayoutServiceFE - class HomeServiceFE - class LibraryServiceFE - class ProfileServiceFE - class WorkspacePageServiceFE - class WorkspacesServiceFE - - AiChatComponent --> AiChatServiceFE - DashboardComponent --> DashboardServiceFE - DefaultLayoutComponent --> LayoutServiceFE - DefaultLayoutComponent --> LoginComponent - DefaultLayoutComponent --> RegisterComponent - HomeComponent --> HomeServiceFE - LibraryComponent --> LibraryServiceFE - ProfileComponent --> ProfileServiceFE - WorkspacePageComponent --> WorkspacePageServiceFE - WorkspacesComponent --> WorkspacesServiceFE - - ForgotPasswordComponent ..> UserController : REST - AiChatServiceFE ..> AiChatController : REST - AiChatServiceFE ..> AiChatWebSocketController : WebSocket - - DashboardServiceFE ..> WorkspaceController : REST - DashboardServiceFE ..> PageController : REST - DashboardServiceFE ..> AiChatController : REST - - LayoutServiceFE ..> UserController : REST - - HomeServiceFE ..> AuthController : REST - - LibraryServiceFE ..> LibraryController : REST - LibraryServiceFE ..> FileMetadataController : REST - - ProfileServiceFE ..> UserController : REST - - WorkspacePageServiceFE ..> PageController : REST - WorkspacePageServiceFE ..> FileMetadataController : REST - WorkspacePageServiceFE ..> AiChatController : REST - - WorkspacesServiceFE ..> WorkspaceController : REST - AboutComponent --> ContactComponent - AboutComponent --> TermsComponent - AboutComponent --> PrivacyComponent - } - - class AngularClient - AngularClient --> FrontendCore - AngularClient --> FrontendEntities - AngularClient ..> FastAPINLPServer : REST - - -' Entity Relationships -User "1" --> "many" Library -User "1" --> "many" Workspace -Library "1" --> "many" Workspace -Library "1" --> "many" FileMetadata -Workspace "1" --> "many" Page -Workspace "1" --> "many" FileMetadata -Workspace "1" --> "many" AiChat - -' Controller → Service -AiChatController --> AiChatService -AiChatWebSocketController --> AiChatService -AuthController --> AuthService -FileMetadataController --> FileMetadataService -LibraryController --> LibraryService -PageController --> PageService -RegisterController --> RegisterService -UserController --> UserService -WorkspaceController --> WorkspaceService - -' Service → Repository -AiChatService --> AiChatRepository -AuthService --> AuthRepository -FileMetadataService --> FileMetadataRepository -LibraryService --> LibraryRepository -PageService --> PageRepository -RegisterService --> RegisterRepository -UserService --> UserRepository -WorkspaceService --> WorkspaceRepository - -' Repository → Entity -AiChatRepository --> AiChat -FileMetadataRepository --> FileMetadata -LibraryRepository --> Library -PageRepository --> Page -UserRepository --> User -WorkspaceRepository --> Workspace -RegisterRepository --> User -AuthRepository --> User - -@enduml - -** authentication sequence diagram: -@startuml -title Full Authentication Flow - Registration to Secured Access - -skinparam shadowing true -skinparam packageStyle rectangle -skinparam handwritten false -skinparam linetype polyline -skinparam ParticipantPadding 20 -skinparam maxMessageSize 150 - -actor User - -== Registration Process == - -box "Client" #E3F2FD - participant UserClient as "User" -end box - -box "Backend - Registration" #E8F5E9 - participant RegisterController - participant UserService -end box - -UserClient -> RegisterController : POST /register\n(username, password, confirmPassword) -RegisterController -> RegisterController : Check if passwords match -alt Passwords do not match - RegisterController --> UserClient : 400 Bad Request (Passwords mismatch) - return -end -RegisterController -> RegisterController : Hash password (BCrypt) -RegisterController -> RegisterController : Load default profile image -RegisterController -> UserService : createUser(user) -RegisterController --> UserClient : 200 OK (User Created) - -== Authentication Process == - -box "Backend - Authentication" #FFF3E0 - participant AuthController - participant AuthenticationManager - participant JwtUtil -end box - -UserClient -> AuthController : POST /auth/login\n(username, password) -AuthController -> AuthenticationManager : Authenticate credentials -alt Valid credentials - AuthController -> JwtUtil : generateToken(userDetails, userId) - AuthController --> UserClient : 200 OK + JWT -else Invalid credentials - AuthController --> UserClient : 401 Unauthorized - return -end - -== Accessing a Protected API == - -box "Security Filter Chain" #F3E5F5 - participant JwtRequestFilter - participant UserDetailsService - participant JwtUtilFilter as "JwtUtil" -end box - -UserClient -> JwtRequestFilter : Request with Authorization header -JwtRequestFilter -> JwtUtilFilter : extractUsername(jwt) -JwtRequestFilter -> UserDetailsService : loadUserByUsername -JwtRequestFilter -> JwtUtilFilter : validateToken(jwt, userDetails) -alt Valid token - JwtRequestFilter -> SecurityContext : Set authentication -else Invalid token - JwtRequestFilter -> JwtRequestFilter : Log and skip authentication -end -JwtRequestFilter --> UserClient : Continue filter chain - -== @JwtRequired Secured Method Access == - -box "AOP - Method Security" #E1F5FE - participant JwtAspect - participant JwtUtilAspect as "JwtUtil" -end box - -UserClient -> JwtAspect : Call method annotated with @JwtRequired -JwtAspect -> JwtAspect : Extract JWT from header -JwtAspect -> JwtUtilAspect : extractUsername(jwt) -JwtAspect -> SecurityContext : Get UserDetails -JwtAspect -> JwtUtilAspect : validateToken(jwt, userDetails) -alt Token valid and user matches - JwtAspect --> UserClient : Proceed to method execution -else Invalid/mismatched token - JwtAspect --> UserClient : Unauthorized exception - return -end - -@enduml - -** class -@startuml -skinparam classAttributeIconSize 0 -skinparam packageStyle rectangle - -package "High-Level Overview" { - - ' Controller Layer - package "Controller Layer" { - class AiChatController - class AiChatWebSocketController - class AuthController - class FileMetadataController - class LibraryController - class PageController - class RegisterController - class UserController - class WorkspaceController - } - - ' Service Layer - package "Service Layer" { - class AiChatService - class AuthService - class FileMetadataService - class LibraryService - class PageService - class RegisterService - class UserService - class WorkspaceService - } - - ' Repository Layer - package "Repository Layer" { - class AiChatRepository - class FileMetadataRepository - class LibraryRepository - class PageRepository - class UserRepository - class WorkspaceRepository - class RegisterRepository - class AuthRepository - } - - ' Entity Layer - package "Entity Layer" { - - class User { - +id: Long - +roles: Set - +firstName: String - +lastName: String - +username: String - +password: String - +confirmPassword: String - +email: String - +phoneNumber: String - +picture: byte[] - } - - class Workspace { - +id: Long - +name: String - +description: String - +fileCount: int - +noteCount: int - +lastAccessed: LocalDateTime - +dateCreated: LocalDateTime - } - - class Library { - +id: Long - +name: String - +description: String - +dateCreated: LocalDateTime - +lastAccessed: LocalDateTime - } - - class Page { - +id: Long - +name: String - +workspaceId: Long - +content: Text - +height: int - +width: int - } - - class FileMetadata { - +id: Long - +fileUrl: String - +userId: String - +description: String - +fileData: byte[] - +fileName: String - +fileType: String - } - - class AiChat { - +id: Long - +name: String - +workspaceId: Long - +createdAt: LocalDateTime - +messages: List - } - } - - ' Python NLP Microservice - package "External NLP Module (Python FastAPI)" { - class FastAPINLPServer { - +/extract_text - +/keywords - +/tfidf_keywords - +/summarize - +/ner - } - } - - ' Entity Relationships - User "1" --> "many" Library - User "1" --> "many" Workspace - Library "1" --> "many" Workspace - Library "1" --> "many" FileMetadata - Workspace "1" --> "many" Page - Workspace "1" --> "many" FileMetadata - Workspace "1" --> "many" AiChat - - ' Controller → Service - AiChatController --> AiChatService - AiChatWebSocketController --> AiChatService - AuthController --> AuthService - FileMetadataController --> FileMetadataService - LibraryController --> LibraryService - PageController --> PageService - RegisterController --> RegisterService - UserController --> UserService - WorkspaceController --> WorkspaceService - - ' Service → Repository - AiChatService --> AiChatRepository - AuthService --> AuthRepository - FileMetadataService --> FileMetadataRepository - LibraryService --> LibraryRepository - PageService --> PageRepository - RegisterService --> RegisterRepository - UserService --> UserRepository - WorkspaceService --> WorkspaceRepository - - ' Repository → Entity - AiChatRepository --> AiChat - FileMetadataRepository --> FileMetadata - LibraryRepository --> Library - PageRepository --> Page - UserRepository --> User - WorkspaceRepository --> Workspace - RegisterRepository --> User - AuthRepository --> User - - ' Frontend → NLP Server - -} - -' Frontend Component -package "Frontend" { - class AngularClient -} - -' Angular communicates with both backends -AngularClient ..> AiChatController : REST -AngularClient ..> AiChatWebSocketController : WebSocket -AngularClient ..> AuthController : REST -AngularClient ..> PageController : REST -AngularClient ..> FileMetadataController : REST -AngularClient ..> WorkspaceController : REST -AngularClient ..> LibraryController : REST -AngularClient ..> RegisterController : REST -AngularClient ..> UserController : REST -AngularClient ..> FastAPINLPServer : REST - -@enduml -** client-server -@startuml -!pragma layout smetana - -actor User - -package "Client Side (Angular)" { - [Angular App] as Frontend -} - -package "Spring Boot Backend" { - [Auth Controller] - [Note Controller] - [NLP Proxy Service] - [Spring Boot App] as Backend -} - -package "Database Layer" { - database "PostgreSQL Database" as DB -} - -package "FastAPI NLP Server (Port 9010)" { - [FastAPI NLP Service] as NLP - [Summarisation Endpoint] as SumEndpoint - [Keyword Extraction] as KeywordEndpoint - [NER Endpoint] as NEREndpoint -} - -package "External API" { - [OpenAI API] -} - -' Interactions -User --> Frontend : Uses Web Interface -Frontend --> Backend : REST API Calls -Backend --> [Auth Controller] : Handles Auth -Backend --> [Note Controller] : Handles Notes -Backend --> [NLP Proxy Service] : Handles NLP Requests -[Auth Controller] --> DB : Access users table -[Note Controller] --> DB : Access notes table -[NLP Proxy Service] --> NLP : HTTP (port 9010) -NLP --> SumEndpoint : /summarise -NLP --> KeywordEndpoint : /keywords -NLP --> NEREndpoint : /ner -SumEndpoint --> [OpenAI API] : API call for contextual help - -note right of Frontend - Angular app includes: - - Note Editor - - Summary View - - Keyword Panel -end note - -note right of Backend - Spring Boot includes: - - Auth Controller - - Note Controller - - NLP Proxy Service (calls FastAPI) -end note - -note right of NLP - FastAPI exposes endpoints for: - - Summarisation (Pegasus) - - Keyword Extraction (TF-IDF, YAKE) - - NER (spaCy) -end note -@enduml -** high level: -@startuml -skinparam componentStyle uml2 -skinparam packageStyle rectangle - -package "Client (Frontend)" { - [Angular UI] -} - -package "Java Backend (Spring Boot)" { - [REST API Controller Layer] - [WebSocket Controller] - [Service Layer] - [Repository Layer] - [JPA Entities] -} - -package "Python NLP Service" { - [FastAPI Server] - [Summarizer (Pegasus)] - [Keyword Extractor (YAKE / TF-IDF)] - [NER (spaCy)] - [Extract Text (Canvas Object)] -} - -package "External Services" { - [OpenAI API] - [PostgreSQL DB] -} - -' Communication Arrows -[Angular UI] --> [REST API Controller Layer] : REST API (JSON) -[Angular UI] --> [WebSocket Controller] : WebSocket - -[REST API Controller Layer] --> [Service Layer] -[WebSocket Controller] --> [Service Layer] -[Service Layer] --> [Repository Layer] -[Repository Layer] ..> [JPA Entities] : uses -[Service Layer] --> [OpenAI API] : API calls - -[Service Layer] --> [FastAPI Server] : REST (NLP Requests) -[FastAPI Server] --> [Summarizer (Pegasus)] -[FastAPI Server] --> [Keyword Extractor (YAKE / TF-IDF)] -[FastAPI Server] --> [NER (spaCy)] -[FastAPI Server] --> [Extract Text (Canvas Object)] - -[Repository Layer] --> [PostgreSQL DB] : Hibernate ORM -@enduml - -** title AI Chat + Workspace Workflow -@startuml -title AI Chat + Workspace Workflow - -skinparam shadowing true -skinparam packageStyle rectangle -skinparam handwritten false -skinparam linetype polyline -skinparam ParticipantPadding 20 -skinparam maxMessageSize 150 - -actor User - -== AI Chat Session Creation == - -box "Client" #E3F2FD - participant AngularClient as "User" -end box - -box "Backend - AI Chat" #E8F5E9 - participant AiChatController - participant AiChatService - participant AiChatRepository -end box - -box "External NLP Service" #FCE4EC - participant FastAPINLPServer as "FastAPI NLP" -end box - -User -> AngularClient : Open AI Chat page -AngularClient -> AiChatController : POST /ai-chat\n(chat metadata) -AiChatController -> AiChatService : createChat(chatDto) -AiChatService -> AiChatRepository : save(chat) -AiChatService --> AiChatController : chatId -AiChatController --> AngularClient : 200 OK + chatId - -User -> AngularClient : Send message via WebSocket -AngularClient -> AiChatWebSocketController : message -AiChatWebSocketController -> AiChatService : handleMessage() - -alt Message requires NLP - AiChatService -> FastAPINLPServer : POST /summarize or /ner - FastAPINLPServer --> AiChatService : NLP result -end - -AiChatService -> AiChatRepository : update(chat with message) -AiChatWebSocketController --> AngularClient : Message response - -== Workspace Creation == - -box "Backend - Workspace" #FFF3E0 - participant WorkspaceController - participant WorkspaceService - participant WorkspaceRepository -end box - -User -> AngularClient : Create Workspace -AngularClient -> WorkspaceController : POST /workspace\n(name, description) -WorkspaceController -> WorkspaceService : createWorkspace(dto) -WorkspaceService -> WorkspaceRepository : save(workspace) -WorkspaceService --> WorkspaceController : workspaceId -WorkspaceController --> AngularClient : 200 OK + workspaceId - -@enduml - -* Screenshots: -** Draft 1: -[[file:~/master-folder/FYP/uml/draft1.png]] - diff --git a/20241210233721-brain.org~ b/20241210233721-brain.org~ deleted file mode 100755 index 7d73cf8..0000000 --- a/20241210233721-brain.org~ +++ /dev/null @@ -1,34 +0,0 @@ -:PROPERTIES: -:ID: b2fb976a-c23c-4275-8a53-da343c223b97 -:END: -#+title: brain -#+filetags: :brain: - -#+BEGIN_SRC elisp -(org-roam-ui-mode) -#+END_SRC - -#+RESULTS: -: t - -* Technical (Computing) -[[id:8fa3f476-6152-45f4-b618-50f1e4bce46c][Emacs Stuff]] -[[id:2f285f04-fcf4-4ade-a1ac-2c50b43d529a][technical]] -* Career -** Work - -*** Index: [[id:dd04d228-fff5-402a-929d-9d113a2ec965][career-index]] - -** Applications - career (pre work) - -The org file: [[file:~/master-folder/org_files/career.org][career]] -The roam file: [[id:fe5086b8-1941-4125-881a-65d01e1e7774][Career roam]] - -* Uni stuff: -[[id:797d6e3e-98eb-4bc7-88b6-e096ef7306ad][Uni]] -* Misc -** Books -[[id:63314cff-3a3f-49b4-9e76-4a359c51f55f][books-main]] -[[id:2706598f-e6aa-4e88-8d24-5f699bd22787][Book Notes]] -** Food -[[id:65F747B1-3CB2-429A-9E26-ED8BC169E689][recipes-main]] diff --git a/20241210233721-brain_moc.org b/20241210233721-brain_moc.org index 017d14d..9f0ade8 100755 --- a/20241210233721-brain_moc.org +++ b/20241210233721-brain_moc.org @@ -1,30 +1,25 @@ :PROPERTIES: :ID: b2fb976a-c23c-4275-8a53-da343c223b97 :END: -#+title: brain_moc +#+title: Brain MOC #+filetags: :moc: -#+BEGIN_SRC elisp -(org-roam-ui-mode) -#+END_SRC +* [[id:580cc3a5-af8e-4cbe-b5ad-5b06680e6c37][Backlog]] + +* [[id:2f285f04-fcf4-4ade-a1ac-2c50b43d529a][Technical MOC]] + +* [[id:565eaccd-8cf6-4dbb-bc66-a4b37367ce6b][Non Technical MOC]] + +* [[id:dd04d228-fff5-402a-929d-9d113a2ec965][Career MOC]] + +* [[id:08415f5c-986e-45a6-8ea1-f3bedcc996f0][Misc MOC]] + +* [[id:797d6e3e-98eb-4bc7-88b6-e096ef7306ad][Uni MOC]] + -#+RESULTS: -: t -* Backlog -[[id:580cc3a5-af8e-4cbe-b5ad-5b06680e6c37][backlog]] -* Technical (Computing) -[[id:2f285f04-fcf4-4ade-a1ac-2c50b43d529a][technical_moc]] -* Non Technical -[[id:565eaccd-8cf6-4dbb-bc66-a4b37367ce6b][non_technical_moc]] -* Uni stuff: -[[id:797d6e3e-98eb-4bc7-88b6-e096ef7306ad][uni_moc]] -* Career -[[id:dd04d228-fff5-402a-929d-9d113a2ec965][career_moc]] -* Misc -[[id:08415f5c-986e-45a6-8ea1-f3bedcc996f0][misc_moc]] diff --git a/20241210233721-brain_moc.org~ b/20241210233721-brain_moc.org~ deleted file mode 100755 index 659bc10..0000000 --- a/20241210233721-brain_moc.org~ +++ /dev/null @@ -1,32 +0,0 @@ -:PROPERTIES: -:ID: b2fb976a-c23c-4275-8a53-da343c223b97 -:END: -#+title: brain_moc -#+filetags: :moc: - -#+BEGIN_SRC elisp -(org-roam-ui-mode) -#+END_SRC - -#+RESULTS: -: t - -* Technical (Computing) -[[id:2f285f04-fcf4-4ade-a1ac-2c50b43d529a][technical_moc]] - -* Non Technical -[[id:565eaccd-8cf6-4dbb-bc66-a4b37367ce6b][non_technical_moc]] - -* Uni stuff: -[[id:797d6e3e-98eb-4bc7-88b6-e096ef7306ad][uni_moc]] - -* Career -[[id:dd04d228-fff5-402a-929d-9d113a2ec965][career_moc]] - -* Misc -[[id:08415f5c-986e-45a6-8ea1-f3bedcc996f0][misc_moc]] - - -* quick notes -** portainer access token: -ptr_KFQqKse9K4Nc9M5jnpc61fpAvGzdTOXTzswz9CwOF74= diff --git a/20241211161232-applications.org b/20241211161232-applications.org old mode 100644 new mode 100755 diff --git a/20241212011909-career_roam.org~ b/20241212011909-career_roam.org~ deleted file mode 100755 index 01178ca..0000000 --- a/20241212011909-career_roam.org~ +++ /dev/null @@ -1,9 +0,0 @@ -:PROPERTIES: -:ID: fe5086b8-1941-4125-881a-65d01e1e7774 -:END: -#+title: Career roam -#+filetags: :pre-career:index: - - - -Microlise Assessment Centre: [[id:f877240e-c2c8-4087-84e5-4b1ca3fcd4ed][microlise-assessment]] diff --git a/20241212013207-haskell_notes.org~ b/20241212013207-haskell_notes.org~ deleted file mode 100755 index df56991..0000000 --- a/20241212013207-haskell_notes.org~ +++ /dev/null @@ -1,54 +0,0 @@ -:PROPERTIES: -:ID: 347d2663-515b-4d9a-9ee9-7706ee86a845 -:END: -#+title: Haskell Notes -#+filetags: :technical:notes:haskell:coding: - - -* Haskell Notes -** Introduction -Haskell is a purely functional programming language with strong [[id:729441d1-51d5-4d94-8fe6-ff9ebb3f5739][Static Typing]] and [[id:63456626-b34e-46d9-b85e-0f1f5724aa83][Lazy Evaluation]]. It was named after the logician Haskell Curry. It is widely used in academia and industry for teaching and research as well as for writing industrial applications. - -** Features of Haskell -- Purely Functional: Functions in Haskell are pure, meaning they don't have side effects. -- Strong Static Typing: Types are checked at compile time, reducing runtime errors. -- Lazy Evaluation: Expressions are not evaluated until their values are needed. -- Type Inference: Haskell can automatically infer types, making the code more concise. -- Concise Syntax: Haskell's syntax is clean and concise, making it easy to read and write. - -** Getting Started with Haskell -- Installation: To get started with Haskell, you need to install the Glasgow Haskell Compiler (GHC). You can download it from [[https://www.haskell.org/downloads/][Download]] -- Basic Syntax: - - Comments: Single line comments start with `--`, and multi-line comments are enclosed within `{-` and `-}`. - - Modules: Code is organized into modules, which can be imported using the `import` keyword. - -** Basic Concepts -- Functions: Functions are first-class citizens in Haskell. A function definition looks like this: - #+BEGIN_SRC haskell - add :: Int -> Int -> Int - add x y = x + y - #+END_SRC - This defines a function *add* that takes two integers and returns their sum. - -- Types and Type Classes: Types are a crucial part of Haskell. You define types using the `data` keyword, and type classes using the `class` keyword. - -** Example -Here's a simple example to demonstrate some basic features of Haskell: - #+BEGIN_SRC haskell - -- Define a new data type - data Shape = Circle Float | Rectangle Float Float - - -- Define a function to calculate the area of a shape - area :: Shape -> Float - area (Circle r) = pi * r^2 - area (Rectangle l w) = l * w - - -- Example usage - main = do - let c = Circle 10 - let r = Rectangle 5 7 - print (area c) - print (area r) - #+END_SRC - -This example defines a new data type Shape with two constructors, Circle and Rectangle, and a function area that calculates the area of a shape. diff --git a/20241212013902-lazy_evaluation.org~ b/20241212013902-lazy_evaluation.org~ deleted file mode 100755 index f40e5c3..0000000 --- a/20241212013902-lazy_evaluation.org~ +++ /dev/null @@ -1,9 +0,0 @@ -:PROPERTIES: -:ID: 63456626-b34e-46d9-b85e-0f1f5724aa83 -:END: -#+title: Lazy Evaluation -#+filetags: :haskell:coding:notes: - -See this article: [[https://medium.com/background-thread/what-is-lazy-evaluation-programming-word-of-the-day-8a6f4410053f][Lazy eval]] - -There are two types of evaluation: strict and lazy diff --git a/20241213005125-c_notes.org~ b/20241213005125-c_notes.org~ deleted file mode 100755 index 71a2f4e..0000000 --- a/20241213005125-c_notes.org~ +++ /dev/null @@ -1,7 +0,0 @@ -:PROPERTIES: -:ID: 5a207a1c-6f02-40d5-b42e-38daaa0aec10 -:END: -#+title: c_notes -#+filetags: :index:coding:notes: - -[[id:efe0360d-8d81-4372-833d-ad58e67d17c6][socket_programming_in_c]] diff --git a/20241213005156-socket_programming_in_c.org~ b/20241213005156-socket_programming_in_c.org~ deleted file mode 100755 index e96a4dd..0000000 --- a/20241213005156-socket_programming_in_c.org~ +++ /dev/null @@ -1,31 +0,0 @@ -:PROPERTIES: -:ID: efe0360d-8d81-4372-833d-ad58e67d17c6 -:END: -#+title: Socket Programming in C -#+filetags: :networking:coding:notes: - -From: [[https://www.linuxhowtos.org/C_C++/socket.htm][Web Link]] -* Steps: -The steps involved in establishing a socket on the client side are as follows: - -1. Create a socket with the socket() system call -2. Connect the socket to the address of the server using the connect() system call -3. Send and receive data. There are a number of ways to do this, but the simplest is to use the read() and write() system calls. - -The steps involved in establishing a socket on the server side are as follows: - -1. Create a socket with the socket() system call -2. Bind the socket to an address using the bind() system call. For a server socket on the Internet, an address consists of a port number on the host machine. -3. Listen for connections with the listen() system call -4. Accept a connection with the accept() system call. This call typically blocks until a client connects with the server. -5. Send and receive data -* Socket types: -When you create a socket, you must specify the *address domain* and the *socket type*, the client and server can only communicate if they are of the same type and in the same domain. - -The two most common address domains: -- unix domain (they share common file system) -- internet domain - -The two most common socket types: -- stream sockets (continuous stream of characters) - uses tcp -- datagram sockets (reads the entire messages at once) - uses dp diff --git a/20241217234535-web_port_notes.org~ b/20241217234535-web_port_notes.org~ deleted file mode 100755 index 565c3ab..0000000 --- a/20241217234535-web_port_notes.org~ +++ /dev/null @@ -1,205 +0,0 @@ -:PROPERTIES: -:ID: 348df473-6443-4f4a-b366-95397b574989 -:END: -#+title: web-port-notes -#+filetags: :index:docs:zzq: - -* Footnotes and sidenotes - -Here is a list of macros: - -#+begin_src emacs-lisp - (setq org-export-global-macros - (append - '( - - ("sidenote" - . "@@html:$2@@") - - ("epigraph" . "@@html:
$1
$2
@@") - - ("epigraph_single" . "@@html:
$1
@@") - - ("epigraph3" . "@@html:
$1
$2, $3
@@") - - ("kbd" . "@@html:$1@@@@latex:\\texttt{$1}@@") - - ("margimg" - . "@@html:@@") - - - org-export-global-macros))) - - -#+end_src - -They are used as follows: - -{{{sidenote(1, The very first iteration of this website used the Angular framework\, only after a while I realised (as every Emacs lover does) that I want to make this an Emacs-centric project)}}} - -Use footnotes as follows: -[fn:1] -then put them at the bottom with the respective information. - -* Blorgz - -** ideas: -### **Personal Growth & Self-Improvement** -1. **The Power of Journaling: How Writing Every Day Can Transform Your Life** - - Exploring the benefits of journaling for mental clarity, goal setting, and emotional processing. - -2. **The Science of Happiness: What Really Makes Us Happy?** - - A deep dive into the psychology and neuroscience of happiness and how to apply it to daily life. - -3. **Building a Growth Mindset: How to Shift from a Fixed to a Growth-Oriented Outlook** - - Practical steps and insights on adopting a growth mindset for personal and professional development. - -4. **How to Set and Achieve Long-Term Goals** - - A structured approach to setting clear, actionable goals and staying motivated over time. - -5. **Embracing Failure: How to Learn and Grow from Setbacks** - - Understanding the importance of failure and how to reframe it as an opportunity for growth. - -### **Mental Health & Well-being** -6. **Dealing with Anxiety: Techniques to Cope and Build Resilience** - - Mindfulness, cognitive-behavioral strategies, and lifestyle changes that help manage anxiety. - -7. **How to Build Emotional Intelligence (EQ) for Better Relationships** - - Tips for recognizing, understanding, and managing your own emotions, and how to navigate others' emotions. - -8. **The Importance of Sleep for Mental and Physical Health** - - Why sleep is crucial for your overall well-being, along with tips for improving your sleep hygiene. - -9. **How to Practice Self-Compassion and Be Kinder to Yourself** - - Exploring the importance of self-compassion and how to stop being your own harshest critic. - -10. **Breaking the Cycle of Negative Self-Talk** - - How to identify, challenge, and reframe the negative thoughts that hold you back. - -### **Lifestyle & Balance** -11. **Minimalism: How Decluttering Your Life Can Lead to More Freedom** - - A guide to adopting a minimalist lifestyle, including decluttering your home, work, and digital space. - -12. **The Importance of Work-Life Balance and How to Achieve It** - - Strategies for maintaining a healthy balance between your career, personal life, and self-care. - -13. **How to Create a Morning Routine That Sets You Up for Success** - - A step-by-step guide to designing a morning routine that boosts your productivity and mindset. - -14. **The Power of Saying 'No': Setting Boundaries to Protect Your Time and Energy** - - How to say no gracefully and why it’s important for your mental health and well-being. - -15. **Building Strong Relationships: The Art of Effective Communication** - - How to communicate more clearly and empathetically in both personal and professional settings. - -### **Life Philosophy & Reflection** -16. **Living with Purpose: How to Find Your Life’s Meaning** - - A philosophical exploration of how to align your actions with your core values and life purpose. - -17. **Stoicism for Modern Life: How Ancient Philosophy Can Help You Thrive Today** - - Applying Stoic principles to improve resilience, clarity, and calm in the face of challenges. - -18. **The Concept of ‘Ikigai’: Finding Joy and Fulfillment in Your Work and Life** - - Exploring the Japanese philosophy of Ikigai and how to apply it for greater fulfillment and balance. - -19. **How to Handle Life Transitions: Moving Forward with Confidence** - - Tips for navigating big life changes, from job shifts to personal transformations. - -20. **The Importance of Gratitude: How to Cultivate a Daily Practice for a More Positive Life** - - The science behind gratitude and how to incorporate it into your daily life to increase happiness. - -### **Productivity in Daily Life** -21. **Time Management for Busy People: How to Get More Done Without Burning Out** - - Techniques like time blocking, prioritization, and task batching to make your day more productive. - -22. **Overcoming Overwhelm: How to Tackle Large Tasks Without Feeling Stressed** - - Breaking down big tasks into manageable chunks to prevent feelings of stress or burnout. - -23. **The Importance of Play and Fun in a Productive Life** - - How leisure and play are just as important for mental health and long-term productivity. - -24. **How to Stay Motivated During Long-Term Projects** - - Strategies for maintaining motivation and momentum over the course of a long, challenging task. - -25. **Creating a Digital Detox: How to Unplug and Recharge** - - The benefits of taking time away from screens and how to implement a healthy digital detox. - - -** my emacs.config -- [[id:b2db0b0b-c179-43ab-9e2b-22bbaac69bcb][wp-emacs-config-blorg]] -** prefrontal-cortex -- [[id:b292f5c6-0c27-439c-8274-2150eb45e20d][wp-prefront-cortex-blorg]] -** new emacs config written on: <2025-02-14 Fri> -[[id:1ee754f9-f30f-4976-850b-d18d01a834d2][wp-new-emacs-config-blorg]] -** urge surfing: <2025-03-14 Fri> -[[id:cfc4ce06-7862-49b7-9a4f-e515d690cd38][wp-urge-surfing-blorg]] -** growth mindset -[[id:CD093B85-BF68-4EAB-AABE-733C7BFC99DE][wp-growth-mindset]] <2025-03-14 Fri> -** emotional intelligence -[[id:D02B89DC-84D0-4211-A902-B9399F4179CA][wp-emotional-intelligence]] <2025-03-16 Sun> -** reflection on week 12 -[[id:8CD2F4C4-22C2-4ECC-8F5F-C4779F8AC0F1][wp-week-12-reflections]] -** sadness -[[id:462F091B-9156-48B3-8665-0BE36C95C182][wp-sadness]] -* Commits -** code: -You can add a commit detail by doing this: -#+begin_src elist -(insert-commit-template) -;; "SPC c i c" -#+end_src -** Commit on <2024-12-17 Tue> -*** Details -This commit was focused on getting the blog section ready. So far ive decided to go for a static approach, whereby the blogs are stored in a .json file and populated in an array. The 'slug' property is found in: -- the title of the file (blog) -- the metadata of the blog -- the metadata of the index.json -These three must be consistent -*** What to work on next: -- the rendering of the content of the blogs -- the github project population: match the blog page stylings. -*** Commit message: -"Worked on the blog page, did stylings and began to populate" -** Commit on <2024-12-18 Wed> -*** Details -Decided to change the way the blog is rendered. Using a json index object to display the list (slug is importnant), then blog detail is displayed as a rendered *HTML* from a markdown file. The scss was changed as well: -#+begin_src js -"node_modules/prismjs/themes/prism-dark.css" -#+end_src -this loads the theme for the code blocks. -*** What to work on next: -- the github project population: match the blog page stylings. -*** Commit message: -"continued work on blog page, stylings are done, the rendering changed from using json to md." -** Commit on <2024-12-20 Fri> -*** Details -Worked on the github project display, kept the same look as the blogs. Also done the about me section in the homepage (added some random ai generated info - need to change). Also done the contacts (set up a smpt gmail server) -*** What to work on next: -- Get rid of all the hardcoded blogs, and begin first blog. -*** Commit message: -"finished contact section - added smtp gmail server" -** Commit on <2025-01-01 Wed> -*** Details -Deployed (changed back to emailjs) -*** What to work on next: -*** Commit message: -** Commit on <2025-01-12 Sun> -*** Details -- added new blog: prefrontal cortex and self discipline -- added a estimated time to read -*** What to work on next: -more blogs -*** Commit message: -"added new blog" -** Commit on <2025-02-15 Sat> -*** Details -- added tags with persistency. Redid the whole UI (theme) -*** What to work on next: -- add a cv section -*** Commit message: -** Commit on <2025-03-14 Fri> -*** Details -- added quizzes and used firebase for storage -*** What to work on next: -- rendering of images , spending more time on blogs and creating quizzes -*** Commit message: diff --git a/20241217234944-wp_emacs_config_blorg.org~ b/20241217234944-wp_emacs_config_blorg.org~ deleted file mode 100755 index 2ffd941..0000000 --- a/20241217234944-wp_emacs_config_blorg.org~ +++ /dev/null @@ -1,6 +0,0 @@ -:PROPERTIES: -:ID: b2db0b0b-c179-43ab-9e2b-22bbaac69bcb -:END: -#+title: wp-emacs-config-blorg - -[[file:~/master-folder/projects/web-port/md-files/emacs_config.md][file]] diff --git a/20241220234456-github_notes.org b/20241220234456-github_notes.org index f647da4..b536e32 100755 --- a/20241220234456-github_notes.org +++ b/20241220234456-github_notes.org @@ -4,6 +4,10 @@ #+title: github_notes #+filetags: :git:notes: +* Cheat sheet + + + * Open Source Projects: - [[https://github.com/codecrafters-io/build-your-own-x?tab=readme-ov-file][Build your own `x`]] https://www.atlassian.com/git/tutorials/saving-changes/gitignore diff --git a/20241220234456-github_notes.org~ b/20241220234456-github_notes.org~ deleted file mode 100755 index b21ffde..0000000 --- a/20241220234456-github_notes.org~ +++ /dev/null @@ -1,8 +0,0 @@ -:PROPERTIES: -:ID: 710f65e5-0bd4-42be-b5d1-69dbe79b745e -:END: -#+title: github_notes -#+filetags: :git:notes: - -* Open Source Projects: -- [[https://github.com/codecrafters-io/build-your-own-x?tab=readme-ov-file][Build your own `x`]] diff --git a/20241231172511-book_notes.org~ b/20241231172511-book_notes.org~ deleted file mode 100755 index ead8335..0000000 --- a/20241231172511-book_notes.org~ +++ /dev/null @@ -1,14 +0,0 @@ -:PROPERTIES: -:ID: 2706598f-e6aa-4e88-8d24-5f699bd22787 -:END: -#+title: book_notes -#+filetags: :index:books:notes: - - -* [[id:455ef38f-9a5f-4f62-afe9-25e2261e1282][the_science_of_self_discipline]] - -* [[id:EC9D851F-3A2E-4F32-A584-76F6F7A08E30][the_clean_coder]] - -* [[id:2d7f1ccc-99d7-4c45-8fe7-4b87080edb01][so_good_they_cant_ignore_you]] - -* [[id:dd55d635-59de-4ed9-8ff0-423782c2e0ae][clean-code]] diff --git a/20241231172543-the_science_of_self_discipline.org~ b/20241231172543-the_science_of_self_discipline.org~ deleted file mode 100755 index 15e040b..0000000 --- a/20241231172543-the_science_of_self_discipline.org~ +++ /dev/null @@ -1,147 +0,0 @@ -:PROPERTIES: -:ID: 455ef38f-9a5f-4f62-afe9-25e2261e1282 -:TYPE: Book -:AUTHOR: Peter Hollins -:DATE_STARTED: <2024-12-27 Fri> -:DATE_ENDED: <2025-05-24 Sat> -:END: -#+title: The Science Of Self Discipline -#+filetags: :books:complete: - -* Introduction -Upon completing the book titled "The Science of Self-Discipline" written by Peter Hollins, I wanted to write a -little summary of the lessons the book has to offer. - -* Purpose - -The purpose of the book is to provide a framework for those wanting to build and maintain self-discipline in their -daily routine, through science-based advice and strategies. - -* Biological Basis of Self-Discipline - -One of the first quotes given in the book is from Jim Rohn, who states that: - -> “We must all suffer one of two things: the pain of discipline or the pain of regret.” - -The very first chapter talks about the biology behind self-discipline. The reason for discussing this is that -without having an understanding of the things that cause, diminish or strengthen self-discipline, it would be -difficult to benefit from it. The concept of [[id:a087da71-bcfb-4ddf-9565-b82113d5d27f][neuroplasticity]] is mentioned in the book, which -enables change. Our brain's ability to form and reorganise neural connections alludes to the fact that -self-discipline can be developed and improved over time. The example used is that of a road being taken to and from -work every single day. The more often this road is taken, the more automatic the journey becomes, up to a point -where you will be able to get through it without conscious thought. - -Another important point raised is the concept of *willpower fatigue*. Self-discipline and willpower are not two -static quantities that are fixed, they are like gas in a tank, it can be drained or replenished. Essentially this -emphasises the point that no matter how great somebody's willpower is, it will eventually deplete. How does one -combat this then? One should prioritise important tasks when the willpower is at its highest, larger tasks should be -broken down into smaller ones, and self-care should be practiced to replenish willpower. - -* Two Rules: - -** The 40% Rule - -This rule was developed by Navy SEALs, and states that when you feel like you've reached your mental or physical -limit, the reality is that you've only reached about 40% of your true capacity. This rule allows you to create a -shift in your mindset. Perceived limitations are no longer ones maximum capacity, but rather, this shift pushes you -to tap into hidden reserves and maximises your potential. - -** 10-Minute Rule - -If you ever felt like you crave something, and the urge pushes you to it, the 10 minute rules states that you should -wait for 10 minutes before getting it. If you want to eat a sugary snack, wait for 10 minutes before getting it. -This exercise removes the 'immediate' from immediate gratification, and more-so shows that you *can* withstand your -urges. - -* Discipline Drainers - -The author then goes on to mention common discipline drainers, and how to overcome them. - -** False Hope Syndrome - -Instead of setting unrealistic expectations, set smaller achievable goals, and celebrate the wins along the way. If -you were to do the former, it can quickly lead to disappointment and a decrease in motivation. The latter approach -will give you the sense of accomplishment, build self-confidence and increase momentum, which is more sustainable -over time. - -** Procrastination - -To improve self-discipline, procrastination should be avoided, one should stop waiting to *be ready* or for -everything to feel *just right*. Inaction goes hand in hand with making excuses, and ultimately sabotages the -chances of you getting the thing you want done. The 75% rule was mentioned, where you take action when you are 75% -certain of success. Embracing the imperfection allows you to act, and this action enables you to improve -self-discipline. - -* Flex your Uncomfortable muscle - -By nature self-discipline is uncomfortable. If you were given the choice to play video games or run a mile, most -would choose the former, simply because it is *easier*. Methods such as urge surfing, seeking out -challenges and practicing discomfort are mentioned here that would allow you to develop self-discipline. - -* Create a Disciplined Environment - -The next chapter of the book states that having an environment that is conducive to self-discipline is one of the -most effective and simplest ways to drastically improve ones life. How does one do this? The author lists and -explains ways to create such an environment. From amongst them are: -- Minimising Distractions: essentially you create a clutter-free working environment, and focus on the 'out of sight, - out of mind' principle -- Regulate Dopamine: being mindful of the cues that trigger dopamine release, such as junk food, social media etc. - and instead creating a reward system that enforces positive behaviour and habits -- Optimise default choices: simply put, this is streamlining disciplined behaviour and choosing the path of least - resistance - -* Delayed Gratification - -This chapter was titled 'Why You Should Always Eat Your Vegetables First', and, as one can tell, this is talking -about the art of delaying gratification. The author goes on to explain how this works, and goes back to the -[[id:acba0d25-08db-4784-8cc2-fe5c437ba723][stanford-marshmallow-experiment]]. Two ways one can delay gratification are: -- Visualising your future self: research goes on to state that there is a strong correlation between visualising - your future self and making better long-term decisions. This is simply putting yourself in the shoes of your - future self and imagining what you will be doing in the future -- The 10-10-10 Rule: a question to pose to oneself, asking 'how will I feel in 10 minutes, 10 hours and 10 days?'. - This question forces a perspective shift and can allow you to prioritise long-term benefits over short-term - satisfactions - -* Using targeted questions - -> If you make the effort to ask yourself these four questions and to be -honest in your answers, you’ll become more aware of your tendencies to -rationalize and make excuses, and you’ll be prepared to create better -habits for leading a disciplined life. - -The four questions are as follows: - -1. Do I want to be a disciplined person or not? -2. Am I doing the right thing or simply what’s easy? -3. These are the vegetables, so what am I getting for dessert? -4. Am I being self-aware? - -* Mindset and Approach - -This chapter talks about how our mindset can affect weather we positively or negatively perceive our lives. Some of -the ways one can take on a more positive and optimistic outlook on life are: -- The Endowed Progress Effect: perceiving advancements can make us feel more motivated and optimistic, one can do - this by recognising and acknowledging progress in the past towards a goal -- Goal Proximity: the idea that the closer we are to a goal, the more motivated we are to reach it. -- Think of How Your Actions Can Benefit Others: when one considers how their actions can benefit others, this can - quickly turn into a strong source of motivation and drive -- Think Optimistically: by thinking optimistically, one can create a positive and optimistic outlook on life. The - term used in the book is 'hoping for the best while preparing for the worst' -- Think in Terms of Effort: focus on the effort, not the outcome. When one does this, they are able to enjoy the - process regardless of the outcome - -* Build Routines and Habits - -Motivation is nice to have, but it is something that fluctuates based on emotion and circumstances. Habits on the -other hand, are something concrete and can be built and maintained. Research has shown that it takes 66 days to -build a habit, and requires self-discipline to get through that process. But once it is built, this habit will drive -you instead. The final thing mentioned in the book is the six sources of influence model by Joseph Grenny. These -factors are (1) personal motivation, (2) personal ability, (3) social motivation, (4) social ability, (5) structural -motivation, and (6) structural ability. - -* Summary - -This book is a great read, and taught me a lot about self-discipline and the science behind it. I would definitely -recommend it to anyone who wants to improve their self-discipline. It is, however, something that should be -reflected upon, not all the approaches and strategies are a one-size-fits-all, thus, take it with a grain of salt and -adapt it to your own circumstances. diff --git a/20250111213016-wp_prefront_cortex_blog.org~ b/20250111213016-wp_prefront_cortex_blog.org~ deleted file mode 100755 index 4592887..0000000 --- a/20250111213016-wp_prefront_cortex_blog.org~ +++ /dev/null @@ -1,6 +0,0 @@ -:PROPERTIES: -:ID: b292f5c6-0c27-439c-8274-2150eb45e20d -:END: -#+title: wp-prefront-cortex-blorg - -[[file:~/master-folder/projects/web-port/md-files/prefrontal_cortex.md][file]] diff --git a/20250120110833-afp.org~ b/20250120110833-afp.org~ deleted file mode 100755 index d100641..0000000 --- a/20250120110833-afp.org~ +++ /dev/null @@ -1,11 +0,0 @@ -:PROPERTIES: -:ID: 556d10d1-1c74-4d9f-a398-39cb3bd5d935 -:END: -#+title: AFP -#+filetags: :uni:afp:index: - -[[id:6c272430-aff5-468b-90d3-5ff3a96152cf][afp_week1]] - -[[id:4bc71106-1d2b-4c71-836d-54b738fe5ff5][afp_week2]] - -[[id:1f395b8c-cf55-43eb-9430-dd9449f6b575][afp_week5]] diff --git a/20250120111047-afp_week1.org~ b/20250120111047-afp_week1.org~ deleted file mode 100755 index fcdc763..0000000 --- a/20250120111047-afp_week1.org~ +++ /dev/null @@ -1,10 +0,0 @@ -:PROPERTIES: -:ID: 6c272430-aff5-468b-90d3-5ff3a96152cf -:END: -#+title: afp_week1 -#+filetags: :uni: - -* <2025-01-20 Mon> : [[id:f6c9e1a7-8465-4cef-9481-2b803d0c43d4][afp_lab_1]] -- Installing Agda - -* <2025-01-21 Tue> : [[id:3aef24fd-b220-4408-aa1e-c3538d661b62][afp_lec_1]] diff --git a/20250120113936-afp-lab-1.org~ b/20250120113936-afp-lab-1.org~ deleted file mode 100755 index 2b7801b..0000000 --- a/20250120113936-afp-lab-1.org~ +++ /dev/null @@ -1,115 +0,0 @@ -:PROPERTIES: -:ID: f6c9e1a7-8465-4cef-9481-2b803d0c43d4 -:END: -#+title: afp-lab-1 -#+filetags: :notes:uni:afp: -<2025-01-20 Mon> -* Installation of Agda: -** Step 1 -#+BEGIN_SRC eshell -sudo apt-get install zlib1g-dev libncurses5-dev -#+END_SRC - -then install ghc -- https://www.haskell.org/ghcup/ - -Now that you have cabal installed, use it to install Agda as a Haskell package: -#+BEGIN_SRC eshell -cabal update -cabal install Agda -#+END_SRC -** Step 2 -Most users will want to install the standard library. You can install this as any other Agda library (see Library Management). See the agda-stdlib project’s installation instructions for the steps to take to install the latest version. -https://github.com/agda/agda-stdlib -https://agda.readthedocs.io/en/latest/tools/package-system.html#package-system -* Exercises: -[[file:~/master-folder/Uni/ADVFUNC/afp-learning-2024-2025/files/LectureNotes/files/exercises/my-lab1.lagda.md][my lab1]] - - -```agda -data Bool : Type where - true false : Bool -``` - - -In Agda, the snippet `data Bool : Type where true false : Bool` is a definition of a simple data type named `Bool`. Let’s break down and explain all the components and words in this snippet: - ---- - -### 1. **`data`** -- **What it means:** This keyword introduces a new *data type* definition in Agda. -- **Purpose:** Defines a type that consists of one or more *constructors*, which are used to create values of the type. -- **In this case:** The `data` keyword is used to define the `Bool` type. - ---- - -### 2. **`Bool`** -- **What it is:** The name of the data type being defined. -- **Purpose:** Represents a type that has exactly two possible values: `true` and `false`. -- **In this case:** `Bool` is a common type used to represent truth values in logic (true or false). - ---- - -### 3. **`:` (colon)** -- **What it means:** Indicates a type declaration in Agda. -- **Purpose:** Separates the name of the data type (`Bool`) from its type (`Type`). -- **In this case:** `Bool : Type` declares that `Bool` is a type itself (i.e., a type of values). - ---- - -### 4. **`Type`** -- **What it is:** The universe of all types in Agda. -- **Purpose:** In Agda, types are first-class citizens, and `Type` represents the "type of types." For instance: - - `Bool : Type` means `Bool` is a type. - - If you define a type `ℕ : Type` for natural numbers, it also belongs to `Type`. -- **In this case:** `Bool` is defined as a type that belongs to this universe. - ---- - -### 5. **`where`** -- **What it means:** Introduces the constructors (values) of the type. -- **Purpose:** Lists the specific ways you can construct or create values of the newly defined type. -- **In this case:** `where` introduces the two constructors, `true` and `false`, which are the only possible values of the `Bool` type. - ---- - -### 6. **`true false`** -- **What they are:** The *constructors* of the `Bool` type. -- **Purpose:** Constructors are functions (or constants) that produce values of the type. Here: - - `true : Bool` means `true` is a value of type `Bool`. - - `false : Bool` means `false` is a value of type `Bool`. -- **In this case:** These two constructors define all possible values of `Bool`. - ---- - -### 7. **`Bool` after the `:`** -- **What it means:** Specifies the type of each constructor. -- **Purpose:** Ensures that each constructor produces a value of the correct type (`Bool` in this case). -- **In this case:** Both `true` and `false` are of type `Bool`. - ---- - -### Complete Meaning -The entire definition can be read as: -1. Define a new type called `Bool`. -2. `Bool` belongs to the universe of types (`Type`). -3. The `Bool` type has two constructors: - - `true` (a value of type `Bool`). - - `false` (a value of type `Bool`). - ---- - -### Example Usage in Agda -You can use `Bool` in various ways: -```agda --- A function that negates a Bool -not : Bool → Bool -not true = false -not false = true - --- A value of type Bool -myBool : Bool -myBool = true -``` - -This showcases how the `Bool` type and its constructors (`true` and `false`) can be used in programs. diff --git a/20250121110241-afp-lec-1.org~ b/20250121110241-afp-lec-1.org~ deleted file mode 100755 index 2447418..0000000 --- a/20250121110241-afp-lec-1.org~ +++ /dev/null @@ -1,154 +0,0 @@ -:PROPERTIES: -:ID: 3aef24fd-b220-4408-aa1e-c3538d661b62 -:END: -#+title: afp-lec-1 -#+filetags: :notes:uni:afp: -<2025-01-21 Tue> -[[file:~/master-folder/Uni/ADVFUNC/afp-learning-2024-2025/files/LectureNotes/files/introduction.lagda.md][Week 1 Handout]] -* Week 1 lec 1 -if you want to put a hole in the file (ie the { }1 ) then put a ? and load the file - -types are default called 'sets' in agda but we will call them types. - -data Bool : Type where - true false : Bool - -Here we create a type called Bool - --- - -data Maybe (A : Type) : Type where - nothing : Maybe A - just : A → Maybe A - -Given the type A we produce another type -Then we have two constructors, we can actually call them whatever we want, the only rule is that it shouldnt have spaces in the middle. For example, instead of nothing we can call 'nothing' as 'Nothingljfsdsdj'. - -The below is known as coercion or the disjoint union -Considering Blah = Either ℕ Bool -left 0: Blah -right false: Blah - --- - -data ℕ : Type where - zero : ℕ - suc : ℕ → ℕ - --- 4 = suc (suc (suc (suc zero))) - --- - -data List (A : Type) : Type where - [] : List A - _::_ : A → List A → List A - -Below is a function that maps a type to a type: -myList : Type -> Type -myList = List - --- N -> Type ... this is called 'Dependant Type' which depends on elements of another type. -When it comes to types, its often the case where the language we use doesnt exactly define the type we want it to. For example in haskell, the binary tree, when we want to use the binary search tree its a little difficult. In agda we can define a precise type; including the binary search tree. In summary agda can write precise types. - --- - -if_then_else_ : {A : Type} → Bool → A → A → A -if true then x else y = x -if false then x else y = y - -this above is known as mixfix operation, we use the _ to denote where the arguments of the function are going to be places - --- - -_+_ : ℕ → ℕ → ℕ -zero + y = y -suc x + y = suc (x + y) - -here we can pattern match on any of x or y -in haskell, recursion can be done and there arent restrictions on it. in Agda we have structural recursion as there is a termination on recursion. Structural recursion is when you follow the structure of the definition, for example in suc x + y, we get suc (x + y), we keep removing the x from suc until we are left with 0. scrcpy - --- - -_*_ : ℕ → ℕ → ℕ -zero * y = zero -suc x * y = x * y + y - -for suc x * y: -(1 + x) * y -y + x * y - -in infixr, the r means the brackets are explicitly on the right, if we use infixl then its on the left: -x + y + z -x + (y + z) : r -(x + y) + z : l - --- research implicit arguements. - - -reverse : {A : Type} → List A → List A -reverse [] = [] -reverse (x :: xs) = reverse xs ++ [ x ] - -although this program works, its inefficient. - -rev-append : {A : Type} → List A → List A → List A -rev-append [] ys = ys -rev-append (x :: xs) ys = rev-append xs (x :: ys) - -rev : {A : Type} → List A → List A -rev xs = rev-append xs [] - -the revappend is a helper function. you can see theres no ++ (concatenation) involved. -* Week 1 lec 2 - -N-Induction : (P: N -> Type) - -> P 0 - -> ((k:N) -> Pk (P (suc k)) -choose k = 0 - -P0 : P0 -f0 p1 : P1 -f1 p2 : p2 - - -> (n:N) -> Pn - -This is proof by induction, - -ℕ-induction P p0 f 0 = P0 -ℕ-induction P p0 f(suc n) = goal -where - ℍ : Pn - ℍ = ℕ-induction P p0 f n - -ℕ-induction P p0 f 3 = - f3(f2(f1 p0)) -essentially this is a for loop. - --- -indstep : (k:N) -> k≣k -> suc k ≣ suc k -indstep k e = e - -ℕ-refl n = ℕ-induction (λx -> x≣x) * (λke -> e) - -introduction and elimination rules - - --- -List-induction : { x : Type } - -> (P : List X -> Type) - -> P [] - -> ((x:X)(xs:List X) -> Pxs -> P(x::xs)) - - -> (xs : List X ) -> P xs - -List-induction - - -* Keybindings: -- C-c C-l : to load the agda file -- SPC-w for the windows -- C-c C-c : case split (agda mode) (put x, or b or whatever the first one is, then use this - very useful). -- C-c C-SPC: give: tries to fill the hole -- C-shift - : undo -- C-c C-r : refine -- C-c C-, : show the context diff --git a/20250128110828-afp_week2.org~ b/20250128110828-afp_week2.org~ deleted file mode 100755 index a44b277..0000000 --- a/20250128110828-afp_week2.org~ +++ /dev/null @@ -1,9 +0,0 @@ -:PROPERTIES: -:ID: 4bc71106-1d2b-4c71-836d-54b738fe5ff5 -:END: -#+title: afp_week2 -#+filetags: :uni:afp: - -<2025-01-27 Mon> - -<2025-01-28 Tue> diff --git a/20250128111008-afp_lec_2.org b/20250128111008-afp_lec_2.org old mode 100644 new mode 100755 diff --git a/20250128111008-afp_lec_2.org~ b/20250128111008-afp_lec_2.org~ deleted file mode 100644 index 863135c..0000000 --- a/20250128111008-afp_lec_2.org~ +++ /dev/null @@ -1,43 +0,0 @@ -:PROPERTIES: -:ID: 460f4a49-8ae4-444a-bf82-4e14ca7cad3f -:END: -#+title: afp-lec-2 -#+filetags: :uni:afp:notes: - -- List are dependant, thats what makes it so special. - - -```agda -data _≡_ {X : Type} : X → X → Type where - refl : (x : X) → x ≡ x - -infix 0 _≡_ -``` -Here is the identity type. For every type X, im going to define two elements of X, and the only way to define this element the constructor of which is single. The type is like a proposition and the element is like the proof. By just having this rule we can do everything we wanna do, for example, proving that if x=y, y=x. -Definition equal : = -Type equality : ≡ - - - -we want to write propositions as types and proofs as programs. - -A proof is a convincing argument. How do you convince someone that something you believe is true is actually true, it ivolves reasoning. -* AND -To prove A and B we have to prove A, and also prove B. Proof by arguments; you have to argue/justify that A is true and that B is true. - -a : A -the little `a` is a justification of the the big `A`. little a is a way to prove that big A holds. - -So for this it would be: -a : A -b : B -and we need that both holds, imagine them as pairs: (a , b) -cartesian product -> (a , b) : A x B -the cartesian product is just a set of pairs. The below is a translation of conjunction to cartesian product in Agda. - -```agda - -data _ x _ (A B : Type) : Type where - _ , _ : A -> B -> A x B - -``` diff --git a/20250213124335-i3_wm.org b/20250213124335-i3_wm.org old mode 100644 new mode 100755 diff --git a/20250213124335-i3_wm.org~ b/20250213124335-i3_wm.org~ deleted file mode 100644 index f29028a..0000000 --- a/20250213124335-i3_wm.org~ +++ /dev/null @@ -1,16 +0,0 @@ -:PROPERTIES: -:ID: 9d5aae0f-4ae1-49a5-a047-9099baad0a06 -:END: -#+title: i3-wm -#+filetags: :linux:guide: - -* Commands: -*Mod1 = Win Key* - -$mod+Enter = Open Terminal -$mod+s = Stacked layout -$mod+e = Default layout -$mod+d = dmenu - - -* Config file: diff --git a/20250214155617-wp_new_emacs_config_blorg.org b/20250214155617-wp_new_emacs_config_blorg.org old mode 100644 new mode 100755 diff --git a/20250214155617-wp_new_emacs_config_blorg.org~ b/20250214155617-wp_new_emacs_config_blorg.org~ deleted file mode 100644 index d35f8b6..0000000 --- a/20250214155617-wp_new_emacs_config_blorg.org~ +++ /dev/null @@ -1,129 +0,0 @@ -:PROPERTIES: -:ID: 1ee754f9-f30f-4976-850b-d18d01a834d2 -:END: -#+title: wp-new-emacs-config-blorg - -# Setting Up an Advanced Emacs Configuration for Productivity - -I recently spoke about what Emacs is, and how it is useful for productivity. I wanted to write this up again and dive more into the other files that were stored in the `/scripts` directory , as well as how to set it up. - -## Prerequisites - -Before we begin, ensure you have Emacs installed. You can install Emacs using the following commands based on your operating system: - -- **Ubuntu/Debian:** `sudo apt install emacs` -- **MacOS (Homebrew):** `brew install emacs` -- **Windows:** Use [MSYS2](https://www.msys2.org/) or install Emacs from [GNU Emacs](https://www.gnu.org/software/emacs/). - -Additionally, ensure that `git` is installed to clone repositories and manage configurations. - -## Download the Configuration Files - -First let's walk through how to set this up. - -Clone the repository or manually download the provided configuration files into your `~/.emacs.d/` directory: - -```sh -mkdir -p ~/.emacs.d/ -cd ~/.emacs.d/ -``` - -The following file should be copied to `~/.emacs.d/`: -- `init.el` - -And the following files should be copied into `~/.emacs.d/scripts`: -- `auto-comp.el` -- `custom-agenda.el` -- `displays.el` -- `keyboard.el` -- `shells.el` -- `window.el` - -If you are using `git`, you can clone your repository directly: - -```sh -git clone https://github.com/zainezq/dot-files/tree/main/emacs-config -``` -## Understanding the Configuration - -This configuration is modularised for easier maintenance. Each file handles a specific feature: - -### `init.el`: The Core Configuration - -The `init.el` file is the entry point of the configuration. It: -- Loads package management (MELPA, `use-package`) -- Imports additional modules (`displays`, `shells`, `auto-comp`, `window`, `keyboard`, `custom-agenda`) -- Configures UI elements such as themes, icons, and window behavior -- Sets up Org mode and language support -- Enables Evil mode for Vim-like keybindings - -### `auto-comp.el`: Auto-Completion Setup - -This file configures `company-mode` for autocompletion in Emacs. It: -- Loads `company-mode` and `company-box` for a better UI -- Sets the minimum prefix length and delay before suggestions appear -- Enables backend support for various modes - -### `keyboard.el`: Custom Keybindings - -This file sets up keybindings using the `general.el` package. Some useful shortcuts include: -- `SPC .` → Open file finder -- `SPC f c` → Open `init.el` for quick edits -- `SPC b b` → Switch buffers -- `SPC w 1` → Removes (not kills) all buffers except the current one -- `SPC t n` → Toggle NeoTree file explorer - -### `window.el`: Window Management - -Defines functions for moving buffers between splits using `windmove`. Functions include: -- `buf-move-up` → Swap buffers up -- `buf-move-down` → Swap buffers down -- `buf-move-left` → Swap buffers left -- `buf-move-right` → Swap buffers right - -### `shells.el`: Shell and Terminal Integration - -Configures: -- `vterm` as the primary terminal -- `eshell-toggle` for quick access to Eshell -- `vterm-toggle` for easy terminal toggling - -### `custom-agenda.el`: Org Mode Enhancements - -This file customises Org mode agendas. It: -- Configures custom agenda views -- Hides the Org agenda startup message -- Enables extra features such as displaying scheduled tasks - -### `displays.el`: UI Enhancements - -This file improves the visual experience in Emacs: -- Configures `dashboard.el` to show a custom startup screen, you may modify this to your liking, see: [Emacs Dashboard](https://github.com/emacs-dashboard/emacs-dashboard) -- Enables `neotree` for file navigation -- Hides unnecessary UI elements for a cleaner look - -## Installing Dependencies - -Open Emacs and run the following command to install missing packages: - -```sh -M-x package-refresh-contents -M-x package-install-selected-packages -``` - -Alternatively, restart Emacs, and `use-package` will automatically install any missing dependencies. - -If any issues arise, check `*Messages*` buffer (`M-x view-echo-area-messages`) or start Emacs with debugging mode enabled (`emacs --debug-init`). What I tend to do is whenever I encounter any errors, I run emacs in minimal mode: `emacs -Q`, this loads emacs without the init.el file (if I can't pinpoint the exact error). - -## Final Notes - -This configuration optimises Emacs for efficient navigation, organisation, and shell integration. -Everybodies configuration will differ based on their needs, so feel free to take and leave the parts as you wish! - -For additional customisation, refer to the official package documentation: -- [General.el (Keybindings)](https://github.com/noctuid/general.el) -- [Evil Mode (Vim keybindings)](https://github.com/emacs-evil/evil) -- [Org Mode](https://orgmode.org/) -- [Neotree (File navigation)](https://github.com/jaypei/emacs-neotree) - - diff --git a/20250218110239-afp_week5.org b/20250218110239-afp_week5.org old mode 100644 new mode 100755 diff --git a/20250218110239-afp_week5.org~ b/20250218110239-afp_week5.org~ deleted file mode 100644 index fb9ac42..0000000 --- a/20250218110239-afp_week5.org~ +++ /dev/null @@ -1,7 +0,0 @@ -:PROPERTIES: -:ID: 1f395b8c-cf55-43eb-9430-dd9449f6b575 -:END: -#+title: afp_week5 -#+filetags: :uni:afp: - -[[id:ed4c372b-0314-4b6e-9119-742f69b5e434][afp-lec-5]] diff --git a/20250218110346-af_wk5_lec1.org~ b/20250218110346-af_wk5_lec1.org~ deleted file mode 100644 index 960ecf6..0000000 --- a/20250218110346-af_wk5_lec1.org~ +++ /dev/null @@ -1,8 +0,0 @@ -:PROPERTIES: -:ID: ed4c372b-0314-4b6e-9119-742f69b5e434 -:END: -#+title: af_wk5_lec1 - -* -the first half of the lecture we went through the practice test solutions. -for the last question we got a hint, namely to redefine the leaf and node constructors of the Rose Trees. diff --git a/20250218110346-afp_lec_5.org b/20250218110346-afp_lec_5.org old mode 100644 new mode 100755 diff --git a/20250218110346-afp_lec_5.org~ b/20250218110346-afp_lec_5.org~ deleted file mode 100644 index 0ec4711..0000000 --- a/20250218110346-afp_lec_5.org~ +++ /dev/null @@ -1,9 +0,0 @@ -:PROPERTIES: -:ID: ed4c372b-0314-4b6e-9119-742f69b5e434 -:END: -#+title: afp-lec-5 -#+filetags: :uni:afp:notes: - -* -the first half of the lecture we went through the practice test solutions. -for the last question we got a hint, namely to redefine the leaf and node constructors of the Rose Trees. diff --git a/20250218174735-emacs_stuff_keybindings.org b/20250218174735-emacs_stuff_keybindings.org old mode 100644 new mode 100755 diff --git a/20250218174735-emacs_stuff_keybindings.org~ b/20250218174735-emacs_stuff_keybindings.org~ deleted file mode 100644 index ed2171b..0000000 --- a/20250218174735-emacs_stuff_keybindings.org~ +++ /dev/null @@ -1,13 +0,0 @@ -:PROPERTIES: -:ID: 966175d4-3b58-4abc-9b41-08cbf328dd87 -:END: -#+title: emacs-stuff-keybindings -#+filetags: :emacs:guide: - -Keybindings I have come across: - -* TO indent a region n amount of spaces (where n is a number): `C-u n C-x Tab` - -* Projectile: -- `SPC-p p` - switch project -- `SPC-p f` - find project diff --git a/20250226184629-wp_urge_surfing_blorg.org b/20250226184629-wp_urge_surfing_blorg.org old mode 100644 new mode 100755 diff --git a/20250226184629-wp_urge_surfing_blorg.org~ b/20250226184629-wp_urge_surfing_blorg.org~ deleted file mode 100644 index 4ad70ea..0000000 --- a/20250226184629-wp_urge_surfing_blorg.org~ +++ /dev/null @@ -1,68 +0,0 @@ -:PROPERTIES: -:ID: cfc4ce06-7862-49b7-9a4f-e515d690cd38 -:END: -#+title: wp-urge-surfing-blorg - -# Urge Surfing: Mastering the Art of Riding Your Impulses - -By Zaine Qayyum - -## Table of Contents - -1. [Introduction](#introduction) -2. [What is Urge Surfing?](#what-is-urge-surfing) -3. [How Urge Surfing Works](#how-urge-surfing-works) -4. [Conclusion](#conclusion) - -## Introduction - -I've spoken about the internal components of 'self-discipline' in another blog, but if we take a look at this whole self-improvement topic from another angle, we can see that the underlying reason for us not being able to 'stick to things' is due to us giving in to our urges. That may sound trivial, and we may connect the dots that if we control our impulses, we can do xyz. However, that form of thinking requires a bit of explanation. - -Psychologists have researched and found that opposing our urges is like making them stronger because we give it that 'attention' it wants (Wegner, 1994). In his Ironic Process Theory, Daniel Wegner demonstrated that trying to suppress thoughts such as resisting cravings or unwanted impulses paradoxically makes them more persistent (Wegner, Schneider, Carter, & White, 1987). Addiction research further emphasises this, where forcefully fighting cravings can intensify them rather than make them disappear. - -But what if, instead of giving in or fighting them, we learned to ride them like a wave? This is the foundation of urge surfing, a mindfulness based technique developed by Dr. Alan Marlatt, which teaches individuals to observe their cravings without reacting to them, allowing them to naturally peak and fade. - -## What is Urge Surfing? - -Urge surfing is a concept that originated in addiction therapy and mindfulness practices. Developed by psychologist **Dr. Alan Marlatt**, it was designed to help people struggling with addictive behaviors by teaching them to observe their cravings rather than acting on them. - -The fundamental aspect of the technique is based on the ideology that **urges are temporary** (so real), they rise, peak and then eventually fade away, which is where the term **surfing** intuitively comes from. - -## How Urge Surfing Works - -Urge surfing relies on mindfulness, where we recognise the urge, observe it, then let it fade away. - -The process can be broken down into three main steps: - -### 1. **Recognising the Urge** -The first step is to *identify the urge* as it arises. This means paying close attention to bodily sensations, thoughts, and emotions that signal a craving. For example: -- A sudden tension in the stomach when craving sweets. -- Restlessness and an urge to check social media. -- A racing heart and a compulsion to lash out in anger. - -Acknowledging the urge early gives you the power to observe it rather than be consumed by it (kind of wanted to link this to "The Observer and the Observed"). - -### 2. **Riding the Wave** -Once you recognise the urge, the next step is to **observe it without reacting**. Imagine the urge as a wave in the ocean. rather than fighting it, you ride it by: -- *Breathing deeply*: In other words, focussing on slow deep breaths to achor yourself in the present moment -- *Noticing sensations*: Where do you feel the urge? Is it in your chest, hands, or stomach? -- *Labeling the urge*: Mentally note, "This is just a craving," or "This is just an impulse." This helps you distance yourself from it -- *Practicing non-judgment*: Don't label the urge as good or bad. Just observe it as it rises and falls - -### 3. **Letting It Fade Away** -With time, urges *naturally subside*. Like waves, they reach a peak and then fade away. The trick behind this is accepting that they come and go, and this gives you a much better control over your impulses. - -## The Science Behind Urge Surfing -Now you might be thinking "Hey you just spouted a bunch of things but where is the scientific correlation???". Let's take a look at the science behind it: - -- *The 90-Second Rule*: Neuroscientist **Dr. Jill Bolte Taylor** suggests that most emotional reactions last about 90 seconds. If we can *sit with an urge* for that duration, it often begins to dissipate. -- *Neuroplasticity*: Every time we resist an impulse instead of acting on it, we *weaken the neural pathways* associated with that habit. Over time, the urges become less intense. -- *The Prefrontal Cortex*: Self-control is governed by the prefrontal cortex, the rational part of our brain. Practicing urge surfing strengthens this area, which improves discipline. - -![Urge Surfing Diagram](./assets/urge-surfing.png) - -*Source: [Link](https://www.thenourishedpath.com/blog/eating-mindfully-urge-surfing)* - -## Conclusion - -Urge surfing is truly a powerful technique when mastered, not only does it allow you to control your urges without giving in, it also helps you to become more self-disciplined. If you are interested in learning more about this, I would recommend reading the book "The Science of Self-Discipline" by Peter Hollins. diff --git a/20250314223811-wp_growth_mindset.org b/20250314223811-wp_growth_mindset.org old mode 100644 new mode 100755 diff --git a/20250314223811-wp_growth_mindset.org~ b/20250314223811-wp_growth_mindset.org~ deleted file mode 100644 index f751fbd..0000000 --- a/20250314223811-wp_growth_mindset.org~ +++ /dev/null @@ -1,85 +0,0 @@ -:PROPERTIES: -:ID: CD093B85-BF68-4EAB-AABE-733C7BFC99DE -:END: -#+title: wp-growth-mindset - -# Building a Growth Mindset - -By Zaine Qayyum - ---- - -This topic is something that I've been wanting to talk about for a while, and the reason is because of how important it is as human beings to have this **growth mindset**. You might ask "why? what is the need when I can just have a fixed mindset?". The answer is simple: having a growth mindset is essential for personal and professional success. This is what I wanted to talk about in this blog, and I hope you find it useful! - -## Table of Contents - -1. [What Is a Growth Mindset?](#what-is-a-growth-mindset) -2. [Why Does a Growth Mindset Matter?](#why-does-a-growth-mindset-matter) -3. [How to Develop a Growth Mindset](#how-to-develop-a-growth-mindset) -4. [Final Thoughts](#final-thoughts). - -## What Is a Growth Mindset? - -The term *growth mindset* was introduced by psychologist **Dr. Carol Dweck** in her research on motivation and learning. It refers to the belief that our abilities, intelligence, and talents can be developed through **effort, learning, and persistence**. Take for example the muscles in our body, we develop them through repeated "reps" and consistent effort. The same applies to our intelligence, talents, and abilities; we can develop them through effort, learning, and persistence. - -This contrasts with a **fixed mindset**, where people believe their intelligence and talents are static traits, they either "have it" or they don’t. - -### Growth Mindset vs. Fixed Mindset - -| Growth Mindset | Fixed Mindset | -|---------------|--------------| -| Challenges are opportunities to grow | Challenges are threats to avoid | -| Failure is a stepping stone for learning | Failure defines intelligence and worth | -| Effort is the path to mastery | If you have to try, you're not naturally talented | -| Constructive criticism is valuable | Criticism is a personal attack | -| Inspired by others' success | Feels threatened by others' success | - -## Why Does a Growth Mindset Matter? -The question now might arise, "why does a growth mindset matter?" -Having a growth mindset is **not just motivational jargon,** but it has real benefits, here are some of them: - -- **Increases resilience:** People with a growth mindset are more likely to persist in the face of challenges, which ultimately allows you to grow in multiple ways. -- **Encourages continuous learning:** Lifelong learning is something so valued and desired (subject for another blog?), and a growth mindset goes hand in hand with it. -- **Boosts performance:** Research shows that students and professionals with a growth mindset perform better over time. This "performance" can be related to arbitrary things like academic success, job performance, or personal growth. -- **Improves relationships:** It helps people handle feedback better and build stronger connections with others. - -## How to Develop a Growth Mindset - -### 1. **Reframe Failure as Learning** -Instead of viewing failure as proof of inadequacy, see it as feedback. Ask yourself: -- *What can I learn from this?* -- *How can I approach this differently next time?* - -The questions I always ask myself are "What did I do that went well?" and "What can I do differently next time?" - -### 2. **Challenges should be embraced** -A common trap of a fixed mindset is avoiding challenges to protect your self-esteem. Instead: -- Take on **new projects** that push your abilities. -- Step outside your **comfort zone** regularly. -- Remind yourself: *Every expert was once a beginner*. - -### 3. **Use "Yet" to Change Your Self Talk** -Pay attention to your inner dialogue (yes we all have one, even if we don't realise it). If you catch yourself saying: -> *"I'm not good at this."* - -Reframe it to: -> *"I'm not good at this **yet**."* - -This small change can shift your perspective from **impossibility to potential**. - -### 4. **Value Effort Over Talent** -Society often glorifies natural talent, but effort is what leads to mastery. Instead of aiming to be "the best," focus on: -- Developing **discipline and consistency**. -- Tracking your **progress** rather than comparing yourself to others. -- Celebrating small wins along the way. - -## Final Thoughts - -A **growth mindset** isn’t something you "get" overnight, it takes a while to cultivate. It’s a daily practice. It requires self awareness, patience, and a willingness to embrace discomfort. But once achieved, it can take you to unimaginable heights. - -I honestly feel as though the best thing that worked for me was shifting my mindset, being positive about the situations I am in and learning to embrace the now. - -I hope this inspires you even in the slightest :) - ---- - diff --git a/20250314230952-wp_emotional_intelligence.org b/20250314230952-wp_emotional_intelligence.org old mode 100644 new mode 100755 diff --git a/20250314230952-wp_emotional_intelligence.org~ b/20250314230952-wp_emotional_intelligence.org~ deleted file mode 100644 index 6e985f0..0000000 --- a/20250314230952-wp_emotional_intelligence.org~ +++ /dev/null @@ -1,94 +0,0 @@ -:PROPERTIES: -:ID: D02B89DC-84D0-4211-A902-B9399F4179CA -:END: -#+title: wp-emotional-intelligence - -# How to Build Emotional Intelligence (EQ) for Better Relationships - -Someone asked me a while ago "bro, do you think I have emotional intelligence?", and after having that conversation, I thought to myself "what exactly does *mean* to have emotional intelligence? Emotional Intelligence (EQ) is the ability to recognise, understand, and manage your own emotions, as well as the emotions of others. I wanted to write out this post so that this can be better understood and applied to our daily lives. - ---- - -## What is Emotional Intelligence (EQ)? - -Emotional Intelligence is often broken down into five key components: - -1. **Self-Awareness**: Recognising and understanding your own emotions. -2. **Self-Regulation**: Managing and controlling your emotional reactions. -3. **Motivation**: Harnessing emotions to pursue goals with energy and persistence. -4. **Empathy**: Understanding and sharing the feelings of others. -5. **Social Skills**: Building and maintaining healthy relationships through effective communication and conflict resolution. - -Knowledge is of little use if not applied. These five components, one can say, are the building blocks for EQ. - ---- - -## Why EQ Matters in Relationships - -Relationships depend on emotional connection. Whether it’s with a partner, family member, friend, or colleague, EQ helps you: - -- Communicate more effectively. -- Resolve conflicts constructively. -- Build trust and intimacy. -- Understand and meet the emotional needs of others. - -Without emotional intelligence, you may not be able to *understand* the emotions of others, which can ultimately lead to conflicts. - ---- - -## How to Build Emotional Intelligence for Better Relationships - -Based on the 5 components of EQ, here are practical steps to develop your EQ and strengthen your relationships: - -### **Self-Awareness** - - **Reflect on Your Emotions**: Take time each day to identify and label your emotions. Ask yourself, “What am I feeling right now, and why?” - - **Journal**: Writing about your emotions can help you process them and identify patterns in your reactions. - - **Seek Feedback**: Ask friends or family members how they perceive your emotional responses. This can provide valuable insights into blind spots. - -### **Self-Regulation** - - **Pause Before Reacting**: When you feel a strong emotion, take a deep breath and give yourself a moment to respond thoughtfully rather than reacting impulsively. - - **Practice Stress Management**: Techniques like meditation, exercise, or deep breathing can help you stay calm in emotionally charged situations. - - **Set Boundaries**: Learn to say no and manage your emotional energy to avoid depletion. - -### **Empathy** - - **Listen Actively**: Pay full attention when someone is speaking. Focus on their words, tone, and body language without interrupting or planning your response. There is a huge difference between active listening and passive listening. - - **Put Yourself in Their Shoes**: Try to understand the other person’s perspective, even if you don’t agree with it. - - **Validate Their Feelings**: Acknowledge their emotions by saying things like, “I understand why you’d feel that way.” - -### **Social Skills** - - **Communicate Clearly**: Use “I” statements to express your feelings without blaming others (e.g., “I feel upset when…”). - - **Practice Conflict Resolution**: Approach disagreements with a problem solving mindset rather than a confrontational one. Remember its you and them versus the problem, not each other! - - **Show Appreciation**: Regularly express gratitude and appreciation for the people in your life. - -### **Motivation** - - **Set Personal Goals**: Identify what you want to achieve in your relationships and take steps to work toward those goals. - - **Stay Positive**: Focus on the good in your relationships and maintain a hopeful outlook, even during challenging times. - ---- - -## Real-Life Examples of EQ in Action - -There are many practical examples of EQ in action in our daily lives. Take work as an example, if you notice your colleague a little stressed, offer them support and ask if they need help! Not only will they feel grateful that they're being seen, you'll also strengthen your professional relationship with said colleague. Another one is in a platonic relationship, when a friend shares a problem, listen without judgement and offer empathy. - ---- - -## The Long-Term Benefits of High EQ - -Building emotional intelligence is a lifelong journey, but the rewards are immense. Over time, you’ll notice: - -- Stronger, more meaningful relationships. -- Improved communication. -- Greater resilience in the face of challenges. -- A deeper understanding of yourself and others. -- Being able to actively listen to others. - ---- - -## Final Thoughts - -This whole thought and discussion stemmed from that single question. I find myself becoming more intrigued in the intricacies of relationships and human interaction. EQ is one of those components that make up a considerable portion of how we interact with others, without which relationships would become stale. Thank you for reading :) - - ---- - -*“Emotional intelligence is the key to both personal and professional success.” – Daniel Goleman* diff --git a/20250324041724-wp_week_12_reflections.org b/20250324041724-wp_week_12_reflections.org old mode 100644 new mode 100755 diff --git a/20250324041724-wp_week_12_reflections.org~ b/20250324041724-wp_week_12_reflections.org~ deleted file mode 100644 index 6b3dd75..0000000 --- a/20250324041724-wp_week_12_reflections.org~ +++ /dev/null @@ -1,8 +0,0 @@ -:PROPERTIES: -:ID: 8CD2F4C4-22C2-4ECC-8F5F-C4779F8AC0F1 -:END: -#+title: wp-week-12-reflection - -# Week 12 reflections - -12 out of the 52 weeks are now completed (following the [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601)), and I guess this blog post will be a little different from the usual *information-centric* posts. 12 weeks having passed from this year means there's only 9 months left of 2025, and i've come to realise that time is moving *quick*. The question then arose, "how can I maximise the time that I have?", the answer to which isn't as simple as one may think. Albeit this, let's take a look at one particularly useful equation that may serve as a guide to modelling the value of time: diff --git a/20250326002128-emacs_stuff_elisp.org b/20250326002128-emacs_stuff_elisp.org old mode 100644 new mode 100755 diff --git a/20250326002128-emacs_stuff_elisp.org~ b/20250326002128-emacs_stuff_elisp.org~ deleted file mode 100644 index 03130e4..0000000 --- a/20250326002128-emacs_stuff_elisp.org~ +++ /dev/null @@ -1,81 +0,0 @@ -:PROPERTIES: -:ID: 7e79e4c5-383d-450f-882c-33d4f87ba1b5 -:END: -#+title: emacs-stuff-elisp - --- use ` - -** DT - - What is decision tree: a tree structure that split the data depending on different values. - - Each node is a test on the attribute. - - Each branch represents the outcome. - -** NB - - What is Naive Bayes? Classifier based on the conditional probability given by the Bayes theorem. - - Calculating the probability of each class, and classify the given features into the one with higher probability. - -** LR - - What is logistic regression: a linear model for classification - - Fitting the logistic growth and the sigmoid midpoint - - Output a probability, but can use a cutoff point to decide class. - -** Results: -Choose the top 20/50 words when theyre used as a feature diff --git a/20250329121843-ise_week_2.org b/20250329121843-ise_week_2.org old mode 100644 new mode 100755 diff --git a/20250329121843-ise_week_2.org~ b/20250329121843-ise_week_2.org~ deleted file mode 100644 index b61749f..0000000 --- a/20250329121843-ise_week_2.org~ +++ /dev/null @@ -1,229 +0,0 @@ -:PROPERTIES: -:ID: f308642d-fcf3-410b-b154-d60582e112a2 -:END: -#+title: ise-week-2 -#+filetags: :uni:ise:notes: - - -* DONE Different Configuration Sampling Methods (pages 8-19) -* DONE Configuration Encodings (pages 21-28) -* DONE Single Environment Learning (DaL) (pages 39-46) - -* 2.1 -** Configuration Sampling -In general machine learning problem, we dont care where the data comes from , but here we do. - -Configuration sampling is used to select representative samples for learning performance models. - -- Types of options: - - Binary (e.g., on/off) - - Numeric (e.g., value ranges) -- Goal: Balance model accuracy with sampling effort. - -** Binary Sampling Strategies - -*** Option-wise Strategy -- Each binary option is selected at least once in some configuration. -- Minimize other options to reduce unknown interaction effects. -- Size: Linear in the number of binary options. - -*** T-wise Strategy -- Covers all T-wise combinations of options (T ≥ 2). -- Example (2-wise): {001}, {010}, {100}, {111} -- Size: Exponential in T. - -*** Negative Option-wise Strategy -- For each option: one configuration where it is disabled, all others enabled. -- Adds one all-yes configuration. -- Size: Linear. -- Example (3 options): {110}, {101}, {011}, {111} -- you can see the 4th one is an all-yes configuration - -*** Random (Binary) -- Select n configurations randomly. -- Simple but may be less representative. - -*** Difference Between Option-wise and Negative Option-wise Strategies - -Both strategies are used for sampling configurations in systems with binary options, but they focus on different aspects of option selection. - -**** Option-wise Strategy -- **Goal:** Ensure each option is enabled (selected) at least once across configurations. -- For every binary option, create a configuration where it is **on**. -- Other options are minimized to avoid unknown interactions. -- **Focus:** Testing the **presence** of each option. -- **Example (3 options):** - - {100} → Option 1 enabled, others off - - {010} → Option 2 enabled, others off - - {001} → Option 3 enabled, others off - -**** Negative Option-wise Strategy -- **Goal:** Ensure each option is disabled (deselected) at least once. -- For each option, create a configuration where it is **off**, and **all others are on**. -- Also includes a configuration where all options are **on**. -- **Focus:** Testing the **absence** of each option. -- **Example (3 options):** - - {110} → Option 3 disabled - - {101} → Option 2 disabled - - {011} → Option 1 disabled - - {111} → All options enabled - -**** Comparison Summary - -| Feature | Option-wise | Negative Option-wise | -|-------------------------+--------------------------+-------------------------------| -| Focus | Presence of each option | Absence of each option | -| What is varied | Each option enabled once | Each option disabled once | -| Other options in config | Typically disabled | Typically enabled | -| Additional config? | Not required | Yes, includes all-on config | -| Use case | Minimal presence testing | Influence of removing options | - -** Non-Binary (Numeric) Sampling Strategies - -*** One-Factor-At-A-Time (OFAT) -- Assumes no interactions among options. -- Varies one option at a time, others fixed at center values. -- Size: Linear in number of options. -- Example (values = 1,3,5): {333}, {533}, {133}, {353}, {313}, {331}, {335} - -*** Box-Behnken Design (BBD) -- Captures quadratic effects and 2-wise interactions. -- Uses subset of 3^k full factorial (min, center, max). -- Size: Exponential in number of options. -- Example: {111}, {113}, {115}, {131}, {151}, etc. - -*** Central Composite Design (CCD) -- Combines: - - 2^k factorial points - - 2k axial points at α-distance - - 1 center point -- Captures curvature and interactions. -- Example: 8 full factorial + 6 axial + {333} - -*** Plackett-Burman Design (PBD) -- Focus on main effects, assumes negligible interactions. -- Uses predefined seeds, e.g., PBD(9,3) -- First config from seed, rest by right-shifting seed. -- Uses indices only for values. -- Example: If O = {1,100,1000,10000,100000}, index 3 could mean 1, 1000, 100000 - -*** Random (Non-Binary) -- Random selection of numeric configurations. -- Risk of non-uniformity and clustering. -- Can negatively impact learning performance. - -** Mixed Variable Sampling - -Some systems include both binary and non-binary (numeric) configuration options. -These are referred to as **mixed systems**. - -- Requires hybrid or combined strategies to ensure representative coverage. -- One approach: **Permute over the mixed space** by combining possible binary and numeric value combinations. -- This can grow combinatorially, so sampling techniques may be needed to reduce the total number of permutations. - -*** Example -- Non-binary configs: {0.1, 0.4, 5}, {0.2, 0.4, 7}, {0.2, 0.7, 5} -- Binary configs: {1,0}, {1,1} -- Full mixed permutations: - - {0.1, 0.4, 5, 1, 0} - - {0.1, 0.4, 5, 1, 1} - - {0.2, 0.4, 7, 1, 0} - - {0.2, 0.4, 7, 1, 1} - - {0.2, 0.7, 5, 1, 0} - - {0.2, 0.7, 5, 1, 1} - -* 2.2 -** Single Environment Learning: DeepPerf - Source: Ha & Zhang, ICSE 2019 - - DeepPerf is an early approach using deep neural networks (>3 layers) to predict software performance in configurable systems. - - - Designed to address: - - Small data size: Limited measurements available. - - Feature sparsity: Only a few configuration options significantly impact performance. - - Network instability: Tackled with tailored hyperparameter tuning. - -** Limitation of DeepPerf - - Does not handle sample sparsity, a major issue in configuration performance prediction. - -** Improved Approach: Divide-and-Learn (DaL) - Source: Gong & Chen, ESEC/FSE 2023 - -*** Key Problem: Sample Sparsity - - Caused by: - - Inherited feature sparsity. - - Small configuration changes leading to drastic performance shifts. - - Not all configurations being valid. - - Training data is sparse due to expensive measurements. - -*** Key Properties of Configuration Landscape - 1. Intra-division smoothness: Configurations in the same division show smooth performance variations. - 2. Inter-division sharpness: Cross-division configurations differ significantly, possibly on key options. - - Risk: Limited data might lead to overfitting within divisions. - -*** Architecture of DaL - - Three Goals: - 1. Divide the configuration data into meaningful divisions → function ϕ - 2. Learn a local model for each division → function μ - 3. Assign new configurations to the correct local model → using ϕ and μ - - - Implementation: - - CART (Decision Tree) is used for dividing. - - DeepPerf models are trained within each division. - - Random Forest is used for classifying unseen configurations into divisions. - -*** Trade-off: Number of Divisions - - More divisions → better at tackling sparsity, but less data per model → risks underfitting. - - Need to balance: - - Generalizability vs. - - Specialization - -*** Results - - DaL outperforms or matches state-of-the-art in 33 out of 40 cases. - - Achieves up to 1.94× improvement. - - Needs fewer training samples for same accuracy. - - Especially beneficial in complex systems or with more training data. -* 2.3 -** Single Environment Learning: Encoding - Source: Gong & Chen, MSR 2022 - - A study conducted by the lab investigates how different encoding schemes impact the software performance learning pipeline. - -*** Three Common Encoding Schemes - - Label encoding - - Scaled label encoding (e.g., max-min normalization) - - One-hot encoding - -** Encoding Schemes Explained - -*** Label Encoding - - Converts configuration options into numeric values. - - Example: - - Configuration: (cache_size, interval, ssl, data_strategy) - - Values: cache_size = (1, 10, 10000), interval = (1–4), ssl = (0, 1), data_strategy = (strategy_1, strategy_2, strategy_3) - - Encoded: (10000, 2, 1, 1) → (2, 1, 1, 1) → data_strategy: (0, 1, 2) - -*** Scaled Label Encoding - - Similar to label encoding but normalizes all values to the range [0, 1]. - - Example (10000, 2, 1, 1) becomes (1, 1/3, 1, 0.5) - -*** One-Hot Encoding - - Transforms each categorical value into a binary vector. - - Example: (10000, 2, 1, 1) becomes (0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0) - -** Community Debate and Justifications - - - Categorical features (e.g., cache_mode = memory, disk, mixed): - - Label encoding implies false ordering (1, 2, 3) - - One-hot encoding avoids this but may introduce multicollinearity. - - - Numeric options (e.g., cache_size = 1, 10, 10000): - - Label encoding maintains order but struggles with large scale differences. - - Scaled label encoding improves numeric stability but weakens interaction with binary features. - -** Study Protocol - - Evaluated using 7 learning algorithms across 5 software systems. - - diff --git a/20250329142725-ise_week_3.org b/20250329142725-ise_week_3.org old mode 100644 new mode 100755 diff --git a/20250329142725-ise_week_3.org~ b/20250329142725-ise_week_3.org~ deleted file mode 100644 index 05f980e..0000000 --- a/20250329142725-ise_week_3.org~ +++ /dev/null @@ -1,182 +0,0 @@ -:PROPERTIES: -:ID: 1d0fa257-579f-49f3-b8fd-a3b68ddccf10 -:END: -#+title: ise-week-3 -#+filetags: :uni:ise:notes: - - -* DONE Classic Code Complexity Metrics (pages 8-27) -* DONE How to Mine Bugs for Learning? (pages 37-43) -* DONE Cross Project Prediction (HDP) (pages 50-60) - -* 3.1 Intelligent Software Engineering: Classic Metrics -** Software Defect Prediction -- The foundation of software defect prediction lies in metric identification. -- This was a key research direction in the 1980s. -- Metrics aim to quantify properties of code to detect potential defects and improve quality. -** Classic Code Metrics - -*** 1. McCabe Cyclomatic Complexity -- Purpose: Measures the complexity of code based on the number of linearly independent paths in the code’s flow graph. - -**** Why it Matters -- More conditional statements = More possible execution paths = Higher complexity. -- Useful for identifying complex, hard-to-test, and error-prone code. - -**** Simple Definition -- McCabe Complexity = Number of simple conditions + 1 - -**** What is a “Simple Condition”? -- A conditional without logical connectors (AND, OR). -- Examples: - - if (a > b) - - while (a > b) - - for (a=b; a > b; b++) - - do {…} while (a > b) - -**** Compound Conditions -- Count each simple condition inside: - - if (a > b || a > 2) → 2 simple conditions - - if (a > b && a > 2) → 2 simple conditions - -**** Use Case -- Helps determine test case count needed for complete branch coverage. - -*** 2. Halstead Complexity Measures -- Purpose: Measures complexity based on the operators and operands used in code. - -**** Definitions: -- n1: Number of distinct operators (e.g., !=, !, %, /, *, +, &&, ||) -- n2: Number of distinct operands (e.g., variable names, constants, types like bool, char) -- N1: Total occurrences of operators -- N2: Total occurrences of operands - -**** Why Use Halstead? -- Evaluates: - - Code length - - Code vocabulary - - Effort required to implement or understand the code - - Potential bugs - -*** 3. Lines of Code (LOC) -- LOC: Total number of lines in a program. -- Comment Lines: Lines containing only comments. - -**** Usefulness: -- Simple indicator of: - - Code size - - Code density - - Maintainability and readability - -* 3.2 Intelligent Software Engineering: Within-Project Prediction -** Just-in-Time (JIT) Defect Prediction -- Based on the classic work by Kim et al. (2008). -- Focuses on predicting defects at the commit/change level rather than file or module level. - -** Steps in the JIT Defect Prediction Pipeline: -1. File-level changes are extracted from a project's revision history. -2. Bug fix changes are identified using keywords in SCM (Source Code Management) change log messages. -3. Bug-introducing and clean changes are identified by tracing backwards from the bug fix commits. -4. A classification model (e.g., SVM) is trained on these labeled examples. -5. Once trained, the classifier can predict if new code changes are likely to be buggy or clean. - -** Change-wise Prediction Details - -*** Change History Extraction -- Collected information includes: - - Change log - - Author - - Change date - - Source code - - Change delta - - Change metadata - -*** Identifying Bug-Introducing Changes - -**** Step 1: Search for Bug Fixes -- Use keywords (e.g., “fix”, “bug”, “patch”) to find bug-fixing commits. - -**** Step 2: Use the SZZ Algorithm -- Determine what was changed in bug fixes. -- Produces a list of regions ("hunks") showing differences between two revisions. -- Deleted or modified code in each hunk is treated as the location of a bug. -- Traces origin of this code to find the earlier bug-introducing changes. - -** Example Walkthrough - -*** Revision 1: -- Initial creation of a function `bar`. -- Introduces a bug: `if (report == null)` (should be `!=`). -- SCM annotate shows all lines as modified in revision 1 by "kim". - -*** Revision 2: -- Two changes: - - Function `bar` renamed to `foo`. - - Argument changed from `report` to `report.str` in `println`. -- Annotate output shows lines 1 and 4 were last modified by "ejw" in revision 2. - -*** Revision 3: -- Bug fix applied: changes `==` to `!=` on line 3. -- SZZ algorithm compares revisions 3 and 2, identifying line 3 as modified. -- Traces line 3’s origin back to revision 1 — identifying the bug-introducing change. - -* 3.3 Intelligent Software Engineering: Cross-Project Prediction (HDP) -** Heterogeneous Defect Prediction (HDP) -- Based on the work by Nam and Kim (2015). -- Motivation: Metrics used for defect prediction often differ across projects. -- Goal: Address the metric mismatching problem across projects (heterogeneous settings). -- Classifier agnostic — can be used with any machine learning model. - -** HDP Architecture - -*** Metric Selection in Source Datasets -- Uses well-known feature selection methods: - - Gain ratio - - Chi-square - - Relief-F - - Significance attribute evaluation -- Empirical testing used to choose the best approach. -- Top 15% metrics per source project are selected. -- Metric mismatching arises because each project may prioritize different metrics. - -*** Matching Source and Target Metrics - -**** Key Steps: -1. Pair all metrics from source and target projects. -2. Remove poorly matched metrics based on a cutoff threshold for matching scores. -3. Apply maximum weighted bipartite matching to select the best group of matched metric pairs: - - Goal: Maximize sum of matching scores. - - Ensure no duplicated metrics are selected. - -**** Example: -- 2 source metrics: X1, X2 -- 2 target metrics: Y1, Y2 -- Matching pairs: (X1,Y1), (X1,Y2), (X2,Y1), (X2,Y2) - -After applying a cutoff threshold of 0.30: -- Group 1: (X1,Y1) and (X2,Y2) with total score 1.3 (=0.8+0.5) -- Group 2: (X2,Y1) with score 0.4 (Stands alone (can't be paired with any other remaining pair without duplication)). -- Group 1 is chosen as the matched metric set. - -** Methods for Calculating Matching Scores - -*** Percentile-Based Method -- Compares 9 percentiles (10th, 20th, ..., 90th) between source and target metric values. -- Uses the formula: - Pij(n) = 1 - |spij(n) - bpij(n)| / bpij(n) - - spij(n): smaller percentile value - - bpij(n): bigger percentile value -- Matching score is 1 when all percentiles are identical. - -*** Kolmogorov-Smirnov (KS) Test Method -- Non-parametric two-sample test. -- Useful when distributions are unknown or have unequal variances. -- Computes a p-value to indicate the similarity. -- Matching score derived from the p-value. - -*** Spearman’s Rank Correlation Coefficient Method -- Measures correlation between two sets of values. -- If dataset sizes differ, randomly sample the larger set to match sizes. - -** Classifier Independence -- HDP approach can be paired with any machine learning algorithm (e.g., SVM, RF, etc.) diff --git a/20250329200158-ise_week_4.org b/20250329200158-ise_week_4.org old mode 100644 new mode 100755 diff --git a/20250329200158-ise_week_4.org~ b/20250329200158-ise_week_4.org~ deleted file mode 100644 index 424ee9b..0000000 --- a/20250329200158-ise_week_4.org~ +++ /dev/null @@ -1,268 +0,0 @@ -:PROPERTIES: -:ID: ebf874d9-0554-47f0-be8b-5c9a948738bf -:END: -#+title: ise-week-4 -#+filetags: :uni:ise:notes: - - - -* DONE Different Coverage Metrics and Branch Concepts (pages 6-12) -* DONE Evolutionary Algorithm (pages 24-32) -* DONE Test Case Generation (EvoSuite) (pages 44-55) -* DONE Multi/Many-objective Software Testing (Sapienz) (pages 80-97) - -want to figure out how to translate the real world phenotype to a genotype -* 4.2 Evolutionary Algorithms - Intelligent Software Engineering - -** 1. Illustrative Optimization Problem - -- Problem: Maximize the objective function \( f(x) = x^2 \) -- Design variable: \( x \in \{-15, -14, ..., 0, 1, ..., 15\} \) -- Search space: All integers between -15 and 15 inclusive -- Objective function: \( f(x) = x^2 \), to be maximized -- Constraints: None -- This problem is simple and allows us to demonstrate the application of evolutionary algorithms without involving additional complexity from constraints. - -** 2. Representation - -Evolutionary algorithms operate on representations of solutions called genotypes, which map to actual solutions (phenotypes). The choice of representation is crucial and problem-dependent. - -*** Binary Representation - -- The solution is represented as a fixed-length binary string. -- For the example problem (maximizing \( f(x) = x^2 \)), we use a 5-bit binary representation: - - The first bit indicates the sign of \( x \): 0 for positive, 1 for negative. - - The remaining bits represent the magnitude in binary. -- The genotype space is \( \{0,1\}^L \), where L is the length of the binary string. - -*** Other Common Representations - -- **Binary**: Suitable for many simple problems. -- **Integer**: Useful for categorical or discrete variables (e.g., car brands such as Toyota, Volkswagen, etc.). -- **Floating Point**: Used for problems with continuous variables. For example, optimizing \( f(x_1, x_2) = x_1 + x_2 \), where \( x_1, x_2 \in [0,1] \). -- **Permutations**: Suitable for ordering problems like the Traveling Salesman Problem. -- **Matrices**: Employed in more complex problems such as staff allocation or scheduling. - -** 3. Evolutionary Algorithm Steps - -The typical steps in an evolutionary algorithm include: - -1. **Initialization**: - - Start with a randomly generated population of candidate solutions. - - Ensure a diverse set of individuals to explore the search space effectively. - - Optionally include known solutions or use heuristics to seed the initial population. - -2. **Evaluation**: - - Each individual is evaluated using a fitness function. - - The fitness function quantifies how well an individual performs with respect to the problem objective. - -3. **Main Loop** (repeats until termination condition is met): - a. **Selection**: - - Select parent individuals based on their fitness. - - Higher fitness individuals have a higher chance of being selected. - - b. **Recombination (Crossover)**: - - Combine selected parents to produce new offspring. - - Occurs with probability \( P_c \) (crossover probability). - - c. **Mutation**: - - Randomly alter offspring genes to maintain diversity. - - Occurs with probability \( P_m \) (mutation probability). - - d. **Evaluation of Offspring**: - - Assess the fitness of each newly created individual. - - e. **Survivor Selection**: - - Decide which individuals (from parents and offspring) will make up the next generation. - - Can use various strategies like elitism or generational replacement. - -** 4. Fitness Function - -- The fitness function is derived from the problem’s objective or quality function. -- It assigns a single real-valued score to each individual (phenotype). -- The function reflects the degree to which a solution meets the desired criteria. -- Typically, the aim is to **maximize** fitness. -- If the problem is better posed as a minimization task, it can be transformed accordingly (e.g., minimizing \( f(x) \) is equivalent to maximizing \( -f(x) \)). - -* 4.3 Test Case Generation using EvoSuite - Intelligent Software Engineering - -** 1. Introduction to EvoSuite - -- EvoSuite is a tool developed by Fraser and Arcuri (2011) for automated test case generation. -- It generates whole test suites (not just individual test cases) for a given software system. -- The tool accepts a list of input classes to be tested and produces corresponding JUnit test case code. -- It leverages **genetic algorithms**, a form of evolutionary computation, to evolve effective test suites. - -** 2. Motivation and Limitations of Traditional Methods - -- Conventional test generation tools typically focus on **single coverage goals** (e.g., a single program branch). -- Assumes: - - All coverage goals are equally important. - - All goals are equally difficult to reach. - - Goals are independent of each other. -- These assumptions are problematic: - - The sequence in which goals are selected can significantly affect the quality of the resulting test suite. - - Interdependencies among goals are often ignored. - -*** Solution: -- Generate **whole test suites** rather than isolated test cases. -- Takes into account relationships between methods/classes. - -** 3. Architecture and Representation - -*** Test Suite Representation - -- A test suite \( T \) consists of multiple test cases. -- Each **test case** is a sequence of statements of varying types and lengths. -- The total length of a test suite is the sum of the lengths of its individual test cases. - -*** Statement Types in Test Cases - -1. **Primitive statements**: Initialize basic types (e.g., `int var0 = 54`) -2. **Constructor statements**: Create new instances (e.g., `Stack var1 = new Stack()`) -3. **Field statements**: Access object members (e.g., `int var2 = var1.size`) -4. **Method statements**: Call methods (e.g., `int var3 = var1.pop()`) - -** 4. Fitness Function - -- Guides the **selection of parents** in the genetic algorithm. -- Aims to **maximize code coverage**. -- If two test suites achieve the same coverage, the one with fewer statements is preferred (parsimony). -- Uses **branch coverage** as the primary metric. -- Employs the **branch distance heuristic**: - - Measures how close an input is to flipping a predicate’s boolean outcome. - -** 5. Bloat Control - -- A known issue in Genetic Algorithms is **bloat**, where test cases grow unnecessarily large. -- Can lead to memory exhaustion and inefficiency. - -*** Techniques Used: -- Set limits: - - Maximum number of test cases \( N \) - - Maximum length per test case \( L \) -- Discard offspring that do not provide improved coverage. - -** 6. Search Operators - -*** Crossover Operator - -- Combines two parent test suites (P1 and P2) to generate two offspring (O1 and O2). -- O1 = first \( a \cdot |P1| \) test cases from P1 + remaining from P2. -- O2 = similar combination from P2 and P1. -- Valid since test cases are independent. -- Helps reduce difference in length between resulting test suites. - -*** Mutation Operator - -- Mutation is applied with a probability of \( 1/T \), where \( T \) is the number of test cases. -- New test cases may be added with a probability \( p \), up to a maximum count \( N \). - -*** Mutation Operations (applied with equal probability 1/3): - -1. **Remove**: - - Each statement \( s_i \) is deleted with probability \( 1/n \), where \( n \) is the number of statements. - - If needed, replace deleted statements to keep test case valid. - -2. **Change**: - - Each statement \( s_i \) may be altered. - - For primitives: change numeric value randomly within ±Δ. - - For others: change to a method/field/constructor of the same type. - -3. **Insert**: - - A new statement is inserted at a random position in the test case. - -** 7. Results and Evaluation - -- Key takeaway: **EvoSuite outperforms traditional single-goal test generation tools**. -- Reported improvement: Up to **18x better branch coverage** than single-branch strategies. - - -* 4.4 Multi/Many-objective Software Testing with Sapienz - Intelligent Software Engineering - -** 1. Introduction to Sapienz - -- Sapienz is an automated software testing tool developed by Mao et al. (2016). -- It uses evolutionary algorithms to generate test cases for Android apps. -- Notable Achievements: - - Tested the top 1000 most popular Google Play apps. - - Discovered 558 unique and previously unknown app crashes. - - Led to a commercial spinout company named **MaJiCkE**. - - Acquired by **Facebook/Meta**. - -- Sapienz customizes the **NSGA-II** algorithm (a multi-objective genetic algorithm) for test case generation. - -Reference: Mao, Ke, Mark Harman, and Yue Jia. *"Sapienz: Multi-objective automated testing for android applications."* ISSTA 2016. - -** 2. NSGA-II: An Overview - -- NSGA-II is a Genetic Algorithm (GA) adapted for **multi-objective optimization**. -- Key Differences from standard GA: - - Uses **Pareto dominance** for survival selection. - - A solution **a dominates** solution **b** if: - - \( a_i \leq b_i \) for all objectives, and - - \( \exists j \) such that \( a_j < b_j \) - - A **Pareto optimal** solution is one that is not dominated by any other in the population. - -- NSGA-II also uses: - - **Non-dominated sorting**: Separates population into Pareto fronts. - - **Crowding distance**: Prefers diverse solutions within the same front. - -** 3. Representation - -- Specific representation details were not included in the slides but are tailored to represent Android GUI interaction sequences. - -** 4. Objective Functions in Sapienz - -Sapienz optimizes multiple objectives simultaneously: - -*** a. Code Coverage - -- Types of coverage used: - - **Statement Coverage**: Measures how many individual code statements are executed. - - **Method Coverage**: Measures the number of methods invoked. - - **Android Activity Coverage**: Tracks which screens (activities) of the app are accessed. - - Example: A dialer app may include separate activities for contacts, keypad, call history, etc. - -*** b. Test Case Length - -- Shorter test cases are generally preferred to improve efficiency and reduce overhead. -- Multiple slides (86–89) emphasize the importance of minimizing test length. - -*** c. Crash Discovery - -- The number of test cases that lead to app crashes is also a key metric. -- Objective: Maximize the number of crash-inducing test cases. - -** 5. Search Operators - -*** a. Crossover - -- Combines parts of two parent test sequences to form new offspring. -- Details of the crossover structure are tool-specific but follow the typical GA-style recombination. - -*** b. Mutation - -- Mutations are applied to test cases to explore new behaviors. -- Types of Mutation: - - 1. **High-Level Mutation**: - - Alters the structure or intent of test sequences. - - 2. **Low-Level Mutation (Same Size)**: - - Changes test actions without altering the sequence length. - - 3. **Low-Level Mutation (Different Size)**: - - Adds or removes actions to vary the length of test cases. - - 4. **Low-Level Mutation (Shuffling)**: - - Reorders existing actions in the test case. - -** 6. Results and Observations - -- Sapienz significantly **outperforms other automated testing tools** in terms of: - - Number of crashes detected. - - Coverage achieved. - - Efficiency in test generation. - - diff --git a/20250329231658-emacs_stuff_magit.org b/20250329231658-emacs_stuff_magit.org old mode 100644 new mode 100755 diff --git a/20250331201944-ise_week_5.org b/20250331201944-ise_week_5.org old mode 100644 new mode 100755 diff --git a/20250331201944-ise_week_5.org~ b/20250331201944-ise_week_5.org~ deleted file mode 100644 index 24dedc2..0000000 --- a/20250331201944-ise_week_5.org~ +++ /dev/null @@ -1,117 +0,0 @@ -:PROPERTIES: -:ID: 0e70c535-b145-42d9-a9ed-fe48cddbb1a5 -:END: -#+title: ise-week-5 -#+filetags: :uni:ise:notes: - -* TODO Model free Tuning (for ORM) (pages 9-17) -* TODO Model free Tuning (BestConfig) (pages 18-23) - - -* 5.1 Model-Free Tuning for ORM Systems - Intelligent Software Engineering - -** 1. Introduction and Background - -- This approach was proposed by Singh et al. (2016). -- The goal is to optimize Object-Relational Mapping (ORM) systems without relying on models. -- Uses **NSGA-II**, a multi-objective evolutionary algorithm, to handle **multiple performance concerns**. - -Reference: Singh, Ravjot et al. *"Optimizing the performance-related configurations of object-relational mapping frameworks using a multi-objective genetic algorithm."* ACM/SPEC ICPE 2016. - -** 2. Architecture and Setup - -- Focuses exclusively on **binary configuration options**. -- Example of a configuration: `{0011}` – a binary vector where each bit represents a configuration toggle (on/off). -- Evaluates performance using three objective metrics: - - **Execution time** - - **CPU load** - - **Memory consumption** -- Other components follow the standard NSGA-II flow: selection, crossover, mutation, and fitness evaluation. - -** 3. Stopping Criteria - -Two specific stopping rules are proposed for determining when to terminate the evolutionary process: - -*** a. Setting 1: t-test-based Stopping - -- Conducts statistical **t-tests** to compare changes in objective values between generations. -- For each pair of consecutive generations \( g_i \) and \( g_j \): - - Run a t-test on ∆CPU and ∆MEM between all configurations in both generations. -- If **all p-values > 0.05** for **two consecutive generations**, it indicates **no statistically significant improvement**, and the algorithm is stopped. - -*** b. Setting 2: Mutual Dominance Rate (MDR) - -- Measures how much progress is made by comparing the current and previous generation. -- Let: - - Set A = configurations from the previous generation - - Set B = configurations from the current generation -- Define \( dom(A,B) \) as the number of configurations in A that are **dominated** by any configuration in B. - -Interpretation: -- **MDR = 0**: No progress — performance plateau -- **MDR < 0**: Regression — performance is deteriorating -- **MDR > 0**: Improvement — current generation is better than the last - -** 4. Termination Condition - -- The tuning process should stop if **any** of the defined stopping conditions (t-test or MDR) are met. - -** 5. Experimental Results - -- NSGA-II consistently found configurations that ranked within the **top 25%** of all possible configurations across tested applications. -- Results were obtained by combining different **aggregation functions** and **stopping rules**, demonstrating strong generalization and effectiveness. - - -* 5.2 Model-Free Tuning with BestConfig - Intelligent Software Engineering - -** 1. Introduction and Background - -- BestConfig is a model-free configuration tuning system proposed by **Zhu et al. (2017)**. -- It focuses on tuning for **a single performance objective** (e.g., throughput, latency). -- Utilizes **local search techniques** rather than global evolutionary approaches. -- Employs **label encoding** for parameters (e.g., {0, 23, 100}). -- Key strategy: aggressively explore **promising regions** of the configuration space. - -Reference: Zhu, Yuqing et al. *"BestConfig: tapping the performance potential of systems via automatic configuration tuning."* SoCC 2017. - -** 2. Architecture Overview - -- BestConfig is designed to intelligently search a high-dimensional configuration space. -- Architecture relies on two core components: - - DDS (Divide & Diverge Sampling) - - RBS (Recursive Bound & Search) - -** 3. DDS: Divide & Diverge Sampling - -- Purpose: Ensures **coverage** of the entire configuration space by dividing it into **subspaces**. -- Process: - 1. Each configuration parameter's range is divided into **k intervals**. - 2. These intervals are combined across all parameters, forming \( k^n \) subspaces. - 3. **One random sample** is taken from each subspace. - -- Advantages: - - Avoids bias in sampling (common in uniform random search). - - More likely to sample from all areas of the space. - - Especially useful in **high-dimensional spaces**. - -** 4. RBS: Recursive Bound & Search - -- Purpose: Locally refines and improves the best-known configuration. -- Steps: - 1. Identify the best-performing configuration \( C_0 \) from the initial samples. - 2. Define **bounds** for each parameter based on neighboring values around \( C_0 \). - 3. Sample new points within this bounded space to find a better configuration \( C_1 \). - 4. Repeat the bounding and sampling process **recursively** until no improvement is found. - -- Bound Definition: - - For each parameter value in \( C_0 \), the closest lower and higher values in the dataset are chosen as bounds. - -- Termination Conditions: - - If no better configuration is found in a recursive round, the search **restarts from a broader space**. - - The entire tuning process **stops** only when a **predefined resource budget** (e.g., time, evaluations) is exhausted. - -** 5. Results and Observations - -- BestConfig consistently finds configurations **significantly better than the system’s default settings**. -- Achieves these improvements within a **reasonable time frame**, making it practical for real-world use. - diff --git a/20250331202447-ise_week_7.org b/20250331202447-ise_week_7.org old mode 100644 new mode 100755 diff --git a/20250331202447-ise_week_7.org~ b/20250331202447-ise_week_7.org~ deleted file mode 100644 index 108ac7b..0000000 --- a/20250331202447-ise_week_7.org~ +++ /dev/null @@ -1,134 +0,0 @@ -:PROPERTIES: -:ID: 9ad3f3f1-55f7-4114-bc8c-17250b6dd25d -:END: -#+title: ise-week-7 -#+filetags: :uni:ise:notes: - -* TODO Statistical Test Selection and Use (pages 21-67) - -* 7.1 Comparing Algorithms in Intelligent Software Engineering - -** 1. Motivation - -- Algorithms and configurations vary in performance. -- No universally best algorithm: performance depends on the specific problem ("No Free Lunch" theorem). -- To determine which algorithm/configuration is suitable, **comparison is essential**. -- However, comparison is challenging due to the **stochastic nature** of computational intelligence algorithms. - -** 2. Stochastic Behaviour in Algorithms - -- Sources of randomness: - - In the algorithm (e.g., random initial population, stochastic gradient descent, mutation/crossover probabilities). - - In data sampling. -- Result: Running the same algorithm multiple times on the same problem yields **different results**. -- Therefore, comparisons must account for this randomness. - -** 3. Handling Stochastic Behaviour - -- To compare algorithms meaningfully: - - Run each algorithm **multiple times** (e.g., 30+ runs) using **different random seeds**. - - This helps capture typical performance and reduce reliance on single-run outliers. - -** 4. Methods for Comparison - -*** a. Mean (Average) - -- Simple and common. -- Problems: - - Sensitive to **outliers**. - - Does not represent **variability** in results. - -*** b. Mean + Standard Deviation - -- Adds information about variation. -- Still affected by outliers. -- Hard to tell whether differences are statistically significant. - -*** c. Median - -- More robust to outliers. -- Example: - - Sorted list: 0.000001, 0.6, 0.62, 0.65, 0.7, 0.75, 0.8, 0.8, 0.81 - - Median = 0.7 -- Problem: Ignores **variation** in data. - -*** d. Median + Quartiles - -- 1st and 3rd quartiles provide information about data spread. -- Still doesn't guarantee ability to distinguish between groups. - -*** e. Statistical Hypothesis Testing - -- Scientific method to determine if observed differences are **statistically significant**. -- Necessary for robust and credible comparison of algorithms. - -** 5. Statistical Hypothesis Testing: Process - -1. Define what to compare (e.g., accuracy or fitness). -2. Ensure fair comparison: - - Equal number of evaluations or explain why not. - - Example: Adjust generations to equate computational budget across algorithms. -3. Formulate hypotheses: - - **Null hypothesis (H₀)**: No difference between the two groups. - - **Alternative hypothesis (H₁)**: A statistically significant difference exists. -4. Select an appropriate test based on data distribution. - -** 6. Choosing the Test - -*** a. Normality Assumption - -- Many statistical tests assume a **normal distribution** of values. -- Visual inspection or tests (e.g., Shapiro-Wilk) can check this. - -*** b. Parametric vs Non-parametric Tests - -- Parametric tests (e.g., t-test): - - More powerful. - - Require assumptions (e.g., normality, homogeneity of variance). -- Non-parametric tests (e.g., Wilcoxon, Mann-Whitney): - - Safer for non-normal data. - - Widely used in stochastic algorithm comparisons. - -*** c. Paired vs Unpaired Tests - -- **Paired**: Use when comparing results from same initial conditions. -- **Unpaired**: Use when runs are completely independent. - -** 7. Test Outputs - -- Test produces a **statistic** and a **p-value**. - - If **p ≤ 0.05**, reject H₀: significant difference exists. - - If **p > 0.05**, do not reject H₀: no significant difference found. -- Significance level is usually set to **0.05**, corresponding to 95% confidence. -- Lower significance (e.g., 0.01) may be used in critical applications. - -** 8. Interpreting P-Values - -- High p-value → Observed difference likely due to chance → **Do not reject H₀**. -- Low p-value → Observed difference unlikely due to chance → **Reject H₀**. - -** 9. Test Examples (in R) - -- Two-tailed Wilcoxon Rank-Sum Test (unpaired). -- Two-tailed Wilcoxon Signed-Rank Test (paired). - -** 10. Multiple Comparisons Problem - -- Comparing many algorithms or configurations increases the risk of **Type I errors** (false positives). -- Correction methods: - - Adjust the significance threshold (e.g., Bonferroni correction). - - Downside: Conservative → **reduced power** (risk of missing real differences). - -** 11. Tests for N Groups - -- Stronger than multiple pairwise tests with correction. -- Common tests: - - **Kruskal-Wallis Test**: for unpaired comparisons across groups. - - **Friedman Test**: for paired comparisons across groups. - -*** Post-hoc Analysis - -- Needed when the global test finds significant differences but doesn't specify **which pairs** differ. - - Kruskal-Wallis → Dunn post-hoc test. - - Friedman → Nemenyi post-hoc test. - diff --git a/20250402185735-java_moc.org b/20250402185735-java_moc.org old mode 100644 new mode 100755 diff --git a/20250402185735-technical_java_notes.org b/20250402185735-technical_java_notes.org old mode 100644 new mode 100755 diff --git a/20250402185735-technical_java_notes.org~ b/20250402185735-technical_java_notes.org~ deleted file mode 100644 index 40cebaf..0000000 --- a/20250402185735-technical_java_notes.org~ +++ /dev/null @@ -1,11 +0,0 @@ -:PROPERTIES: -:ID: ae343652-96fe-4341-8a36-ec3a1abd0dc6 -:END: -#+title: Java Notes -#+filetags: :index:java:notes: - -[[id:5cfd7f6f-f5ac-4f18-90f9-be9a31dd238e][java-portswrigger-test]] - -Use this node for pom.xml: [[id:bcd41e87-120c-455c-8898-996ddaa41f75][maven-pom-file]] - -Tests: [[id:7b8de14c-a73e-4c92-a403-a9a1c419c0b3][java-junit-testing]] diff --git a/20250403120140-fyp_report_planning.org b/20250403120140-fyp_report_planning.org old mode 100644 new mode 100755 diff --git a/20250403120140-fyp_report_planning.org~ b/20250403120140-fyp_report_planning.org~ deleted file mode 100644 index d277856..0000000 --- a/20250403120140-fyp_report_planning.org~ +++ /dev/null @@ -1,213 +0,0 @@ -:PROPERTIES: -:ID: 26b2ed9a-cb81-4c43-bc63-6b3c8ffa3bf1 -:END: -#+title: fyp-report-planning -#+filetags: :uni:fyp: - -1. Title Page - - Title: "AI-Assisted Note-Taking Web Application" - - Your Name - - Supervisor's Name - - Institution/Department - - Date - - - -2. Abstract - - A concise summary of the project (150–250 words). - - Highlight the problem, solution, methods, and results. - - - - - -3. Table of Contents - - Include all headings and subheadings with page numbers. - - - -4. Introduction - - 4.1 Background: Explain the context of note-taking and its challenges. - - 4.2 Problem Statement: Describe the specific problem you aim to solve (e.g., information overload, accessibility). - - 4.3 Objectives: Define the goals of your project. - - 4.4 Scope: Clearly state the boundaries of the project. - - 4.5 Dissertation Structure: Briefly outline the contents of each section. - - - -5. Literature Review - - 5.1 Existing Solutions: Review existing tools for note-taking, their advantages, and limitations. - - 5.2 Related Research: Explore research on AI, NLP, and note-taking technologies. - - 5.3 Gaps in the Literature: Identify areas not addressed by current solutions, justifying the need for your project. - - - -6. Methodology - - 6.1 Problem Analysis: Define the user requirements and personas. - - 6.2 Proposed Solution: Describe your AI-assisted note-taking solution conceptually. - - 6.3 Technology Stack: Outline the tools, frameworks, APIs, and databases you plan to use. - - 6.4 System Architecture: Include diagrams for the client-server architecture and system workflow. - - 6.5 Data Handling: Describe how the AI will process input data (e.g., text, audio) and produce outputs. - - - -7. Implementation - - 7.1 Development Process: Document how you built the system (e.g., Agile methodology). - - 7.2 Features: Detail key features, such as AI-powered summarization, search functionality, or collaboration tools. - - 7.3 Challenges: Discuss technical challenges and how you addressed them. - - - -8. Evaluation - - 8.1 Testing: Describe how you tested the application (e.g., user testing, performance metrics). - - 8.2 Results: Present quantitative and qualitative results, including user feedback and performance benchmarks. - - 8.3 Analysis: Critically analyze the results and their implications. - - - -9. Discussion - - 9.1 Contributions: Highlight the unique aspects of your solution. - - 9.2 Limitations: Address any shortcomings in your system. - - 9.3 Future Work: Suggest possible enhancements and future research directions. - - - -10. Conclusion - - Summarize the problem, solution, and key findings. - - Reiterate the impact of your work and its importance. - - - -11. References - - List all the sources cited in the document using a consistent citation style (e.g., APA, IEEE, Harvard). - - - -12. Appendices - - Include any additional materials, such as: - - Code snippets - - User manuals - - Detailed testing data - - Wireframes or UI designs - -* intro -# Introduction - -## 1.1 Background - -The digital era has revolutionized the way people consume and manage information. With the proliferation of online content, academic resources, and professional documentation, individuals are constantly processing vast amounts of data. Note-taking, a fundamental cognitive tool for organizing knowledge, has evolved from traditional pen-and-paper methods to digital platforms that offer increased accessibility, storage, and retrieval capabilities. Despite these advancements, users still face challenges such as information overload, inefficient retrieval, and lack of contextual understanding. - -Artificial Intelligence (AI) and Natural Language Processing (NLP) have emerged as transformative technologies in optimizing information management. AI-powered note-taking applications can enhance the process by automatically summarizing content, organizing notes, and enabling intelligent search functionalities. By leveraging machine learning techniques, these systems can provide a personalized and efficient approach to note-taking, reducing cognitive load and improving productivity. - -## 1.2 Problem Statement - -While digital note-taking applications exist, most rely on manual input and basic text organization without leveraging AI to enhance usability. Users often struggle with the sheer volume of notes, leading to difficulties in retrieving relevant information quickly. Traditional search mechanisms lack semantic understanding, making it challenging to locate specific insights. Additionally, manually summarizing large amounts of text is time-consuming and inefficient. There is a growing need for a system that can intelligently process, categorize, and retrieve notes in an intuitive manner. - -## 1.3 Objectives - -This project aims to develop an AI-assisted note-taking web application that enhances knowledge management through NLP and machine learning. The primary objectives include: - -- **Automated Summarization**: Implement AI-powered summarization to extract key points from lengthy notes. -- **Intelligent Search**: Develop a smart search function that understands context and retrieves relevant information efficiently. -- **Automated Tagging and Organization**: Utilize AI to categorize and label notes for easy navigation. -- **Speech-to-Text Integration**: Enable users to convert spoken content into structured notes. -- **User-Friendly Interface**: Design an intuitive UI/UX for seamless interaction and accessibility. - -## 1.4 Scope - -This project focuses on developing a web-based AI-assisted note-taking application with core functionalities such as summarization, intelligent search, and speech-to-text conversion. The system will leverage NLP models and machine learning techniques to process textual data effectively. However, the project does not aim to develop a fully autonomous AI capable of understanding handwritten notes or processing multimedia inputs such as images and videos. Future enhancements may incorporate these aspects. - -## 1.5 Dissertation Structure - -This dissertation is structured as follows: - -- **Chapter 2: Literature Review** – Discusses existing note-taking solutions, AI applications in knowledge management, and identifies gaps in the literature. -- **Chapter 3: Methodology** – Outlines the technical approach, system architecture, and technologies used in developing the application. -- **Chapter 4: Implementation** – Details the development process, features, and challenges encountered. -- **Chapter 5: Evaluation** – Presents testing methodologies, results, and user feedback. -- **Chapter 6: Discussion** – Analyzes contributions, limitations, and potential future work. -- **Chapter 7: Conclusion** – Summarizes findings and the impact of the research. - -By addressing the challenges of digital note-taking with AI, this project aims to provide an innovative solution that enhances productivity and information management. - -* intor 2 -Absolutely! Here's a draft of the **Introduction** section for your dissertation titled **"AI-Assisted Note-Taking Web Application"**. This version reflects a strong academic tone and addresses all required subheadings (4.1–4.5). Feel free to tweak any specific names or phrases to better match your own work: - ---- - -## 4. Introduction - -### 4.1 Background - -Note-taking plays a fundamental role in both academic and professional contexts, serving as a critical tool for learning, information retention, and productivity. Traditional methods of note-taking, whether handwritten or digital, often rely heavily on user input, which can be cognitively demanding, time-consuming, and inconsistent across users. In the age of digital information, individuals are increasingly overwhelmed by the volume and complexity of content encountered during lectures, meetings, or research. This has led to growing concerns about cognitive overload, especially when users must process, organize, and retrieve large quantities of data manually. - -With the advancement of Artificial Intelligence (AI) and Natural Language Processing (NLP), there is a growing potential to revolutionize the way notes are captured, organized, and utilized. By leveraging machine learning algorithms, semantic understanding, and contextual summarization, AI can assist users in real-time or post-session to generate coherent and concise notes. However, the integration of such technologies into practical, user-friendly applications remains an ongoing challenge. - -### 4.2 Problem Statement - -Despite the availability of numerous note-taking tools, many fail to address critical user pain points such as cognitive overload, poor summarization, lack of personalization, and limited accessibility. Students, professionals, and individuals with neurodivergent needs may find it especially difficult to engage with existing solutions that require constant manual interaction. There remains a significant gap in tools that can intelligently process raw input (e.g., text or speech), summarize key points, and provide structured, searchable output that adapts to the user’s workflow. This project aims to bridge that gap by developing an AI-assisted web application that automates and enhances the note-taking process. - -### 4.3 Objectives - -The primary objectives of this dissertation project are: - -- To design and implement a web-based note-taking application that integrates AI capabilities for summarization and organization. -- To explore the use of NLP and machine learning techniques for processing text-based inputs. -- To improve accessibility and reduce cognitive load for users by automating key aspects of the note-taking process. -- To evaluate the effectiveness and usability of the system through user feedback and performance metrics. - -### 4.4 Scope - -This project focuses on the development of a prototype web application tailored to textual note input, though the underlying architecture may be extended to support audio input in future iterations. The system will include core features such as AI-powered summarization, keyword extraction, and searchable note archives. It will be built using Angular for the frontend, Spring Boot for the backend, and PostgreSQL for data storage. OpenAI’s API will be utilized to integrate advanced language processing capabilities. While the project does not aim to develop novel NLP models, it will focus on the integration and optimization of existing tools to deliver a practical, user-centric solution. - -### 4.5 Dissertation Structure - -This dissertation is structured as follows: -- **Chapter 5: Literature Review** examines current note-taking tools, relevant AI technologies, and identifies gaps that justify this project. -- **Chapter 6: Methodology** describes the user research, system design, technology stack, and system architecture. -- **Chapter 7: Implementation** details the development process, key features, and technical challenges faced during the build. -- **Chapter 8: Evaluation** outlines the testing methods used and presents results with analysis. -- **Chapter 9: Discussion** reflects on the project’s contributions, limitations, and potential directions for future work. -- **Chapter 10: Conclusion** summarizes the project and reiterates its significance. - ---- - -Would you like help tailoring this to reflect specific design decisions you've already made, like how your AI summarizer works or your user testing process? diff --git a/20250412234351-wp_sadness.org b/20250412234351-wp_sadness.org old mode 100644 new mode 100755 diff --git a/20250412234351-wp_sadness.org~ b/20250412234351-wp_sadness.org~ deleted file mode 100644 index 11a9fde..0000000 --- a/20250412234351-wp_sadness.org~ +++ /dev/null @@ -1,15 +0,0 @@ -:PROPERTIES: -:ID: 462F091B-9156-48B3-8665-0BE36C95C182 -:END: -#+title: wp-sadness - -Emotions. We all feel them on a daily basis. Happiness, anger, sadness, fear and disgust. They come and they go, sometimes for a long duration, and at other times merely for a few seconds. Sadness in particular is an interesting emotion; I say this for two reasons: the first is that it reminds us of what matters to us, and the second is that it makes you realise things about yourself that you never knew of before. Sadness is something that honestly makes you step out of your own body and view things in a different light, you become more perceptive despite the phyiscal and mental tang you feel. Should we strive to stop feeling sad? Who knows, some may say it's a part of who we are, others may counter and say that it's not a desired emotion. Regardless, we all have felt it at some point in our lives; the quantity of which varies across people, for some, it could be very minute and for some very large. - -> "Some psychologists argue that sadness plays an evolutionary role—it slows us down, forces us to think, to reflect, to re-evaluate our priorities. It’s the brain’s way of making us pause, take stock, and reorient ourselves." - -There comes that word: *pause*. How important is it to sometimes just pause and reflect, to ponder over life and the things happening around us. When was the last time we sat in silence with no distractions, no phones, no people, nothing. We learn a lot when we tune in to our emotions, despite how much sadness may heart, and how much it makes us want to cry, we should always remember that this same sadness adds value to the happy moments in life. Like shadows on a painting, it gives dimension to our emotional world. - -It reminds me of this verse in the noble Quran: فَإِنَّ مَعَ ٱلْعُسْرِ يُسْرًا which means: "So, surely with hardship comes ease." The hardship we face in life always has a positive aspect to it, sometimes we become too blinded and short sighted by the trials and tribulations that we forget to look at it from another angle. - -Anyways I'll end this with this poetic touch: -> "Sadness doesn’t shout. It whispers. It sits beside you in silence. It tugs at your sleeve when the world moves too fast. And in that quiet tug, you find pieces of yourself you forgot existed." diff --git a/20250417173809-linux_moc.org b/20250417173809-linux_moc.org old mode 100644 new mode 100755 diff --git a/20250417173809-linux_stuff.org b/20250417173809-linux_stuff.org old mode 100644 new mode 100755 diff --git a/20250417173809-linux_stuff.org~ b/20250417173809-linux_stuff.org~ deleted file mode 100644 index d503d25..0000000 --- a/20250417173809-linux_stuff.org~ +++ /dev/null @@ -1,11 +0,0 @@ -:PROPERTIES: -:ID: bdb493df-db92-4c93-9558-0b10fdff3048 -:END: -#+title: linux_moc -#+filetags: :linux:moc: - -- [[id:7612a9a6-ae70-4525-93a0-81bac857df39][wacom-notes]] -- [[id:bf277242-4f09-46a2-aa6b-1d75ce0025ac][systemd_services]] -- [[id:30c28e5e-0b1c-43ae-b3bd-eb31023f8b73][gpg-encryption]] -- [[id:569a4a57-1843-4821-8259-17762855985e][linux-arch-linux]] -- [[id:9d5aae0f-4ae1-49a5-a047-9099baad0a06][i3-wm]] diff --git a/20250417173821-wacom_notes.org b/20250417173821-wacom_notes.org old mode 100644 new mode 100755 diff --git a/20250417173821-wacom_notes.org~ b/20250417173821-wacom_notes.org~ deleted file mode 100644 index 031abd9..0000000 --- a/20250417173821-wacom_notes.org~ +++ /dev/null @@ -1,50 +0,0 @@ -:PROPERTIES: -:ID: 7612a9a6-ae70-4525-93a0-81bac857df39 -:END: -#+title: wacom-notes -#+filetags: :guide:linux:wacom: - -The command: `xsetwacom --list` gave me: - -Wacom One by Wacom M Pen stylus id: 12 type: STYLUS -Wacom One by Wacom M Pen eraser id: 13 type: ERASER - -Then, in order to map the stylus to a single monitor i needed to know my monitor mappings via `xrandr`: - -Screen 0: minimum 8 x 8, current 3840 x 1080, maximum 32767 x 32767 -DP-0 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 600mm x 340mm - 1920x1080 60.00*+ 143.85 119.98 59.94 - 1680x1050 59.95 - 1440x900 59.89 - 1440x576 50.00 - 1440x480 59.94 - 1280x1024 75.02 60.02 - 1280x960 60.00 - 1280x720 60.00 59.94 - 1152x864 75.00 - 1024x768 75.03 70.07 60.00 - 800x600 75.00 72.19 60.32 56.25 - 720x480 59.94 - 640x480 75.00 72.81 59.94 59.93 -DP-1 disconnected (normal left inverted right x axis y axis) -HDMI-0 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 521mm x 293mm - 1920x1080 60.00*+ 59.94 50.00 - 1680x1050 59.95 - 1600x900 60.00 - 1440x900 59.89 - 1280x1024 60.02 - 1280x800 59.81 - 1280x720 60.00 59.94 50.00 - 1024x768 70.07 60.00 - 800x600 72.19 60.32 56.25 - 720x576 50.00 - 720x480 59.94 - 640x480 72.81 59.94 -DP-2 disconnected (normal left inverted right x axis y axis) -DP-3 disconnected (normal left inverted right x axis y axis) -DP-4 disconnected (normal left inverted right x axis y axis) -DP-5 disconnected (normal left inverted right x axis y axis) - -Then I simply map it via: - -`xsetwacom set "Wacom One by Wacom M Pen stylus" MapToOutput HEAD-0` diff --git a/20250420012258-emacs_stuff_evil.org b/20250420012258-emacs_stuff_evil.org old mode 100644 new mode 100755 diff --git a/20250420012258-emacs_stuff_evil.org~ b/20250420012258-emacs_stuff_evil.org~ deleted file mode 100644 index 607149c..0000000 --- a/20250420012258-emacs_stuff_evil.org~ +++ /dev/null @@ -1,33 +0,0 @@ -:PROPERTIES: -:ID: 45CC3AF5-5E20-4B03-A36C-8D4BDD5CBB13 -:END: -#+title: emacs-stuff-evil -#+filetags: :emacs:guide: - -* Keybindings for moving: -** Search -To search use -Then if you want to get the hits, hit enter, then you can use 'n' for next and 'N' for previous hits. -** moving -- To move forward use 'e' and 'E' -- To move forward use 'b' and 'B' -(for beginning and end) -you can also use '{' and '}' for paragraph movement - -- To move to the next line use: 'j' -- To move to the previous line use: 'k' - -** replacement -that is a sample text -- Use 'r' To replace a single letter -- Use 'R' To enter replace mode and use ESC to exit it - -To do a replace all: -- :%s//replacement/g -thats if the '/' has stored the last search, the /g is for all. if you dont use it, itll just replace the first one in each line. you can also use /gc which will prompt for confirmation. - -- :'<,'>s//bar/g -thats if you are in visual mode - -- :s///g -thats a more generic one diff --git a/20250428133236-systemd_services.org b/20250428133236-systemd_services.org old mode 100644 new mode 100755 diff --git a/20250428133236-systemd_services.org~ b/20250428133236-systemd_services.org~ deleted file mode 100644 index 64ee0ba..0000000 --- a/20250428133236-systemd_services.org~ +++ /dev/null @@ -1,44 +0,0 @@ -:PROPERTIES: -:ID: bf277242-4f09-46a2-aa6b-1d75ce0025ac -:END: -#+title: systemd_services -#+filetags: :linux:guide: - - -* To add a systemctl - - - create a new systemd service file: - `sudo nano /etc/systemd/system/name.service` - - - example content: - [Unit] - Description=Watch TODO Directory and Update Master Task List - After=network.target - - [Service] - ExecStart=/usr/local/bin/watch-todo.sh - Restart=always - User=zaine - WorkingDirectory=/home/zaine/master-folder/org_files/todo - StandardOutput=append:/var/log/watch-todo.log - StandardError=append:/var/log/watch-todo.log - - [Install] - WantedBy=multi-user.target - - - reload and start: - sudo systemctl daemon-reload - sudo systemctl enable watch-todo.service - sudo systemctl start watch-todo.service - -* To remove a systemctl service: - - systemctl stop [servicename] - systemctl disable [servicename] - rm /etc/systemd/system/[servicename] - rm /etc/systemd/system/[servicename] # and symlinks that might be related - rm /usr/lib/systemd/system/[servicename] - rm /usr/lib/systemd/system/[servicename] # and symlinks that might be related - systemctl daemon-reload - systemctl reset-failed - diff --git a/20250430001952-microlise_assessment.org b/20250430001952-microlise_assessment.org old mode 100644 new mode 100755 diff --git a/20250430001952-microlise_assessment.org~ b/20250430001952-microlise_assessment.org~ deleted file mode 100644 index 8752927..0000000 --- a/20250430001952-microlise_assessment.org~ +++ /dev/null @@ -1,90 +0,0 @@ -:PROPERTIES: -:ID: f877240e-c2c8-4087-84e5-4b1ca3fcd4ed -:END: -#+title: microlise-assessment - -1. What are you most proud of doing in the last 2 years? - - - -2. What do you think you could have done better in the last two years? - - - -3. What is the most important thing you have done in the last two years? - - - -4. What books have you read recently? - - Recently, I have been reading The C Programming Language by Brian Kernighan and Dennis Ritchie to better understand low-level programming. I have been reading this book since my second year at university and have learnt many concepts that translate well into higher-level programming languages like Java. I also decided to create a GitHub repository where I store the practical applications of what was learnt from this book in an educational format so that I can share what I learnt as well test my knowledge. - - Another book I have been reading is The Science of Self-Discipline by Peter Hollins. What I took from this book is that despite perpetual distractions we are enveloped with, there are ways we can still remain disciplined. The structuring of the book is quite clever in the sense that it allows the reader to seamlessly flow from the relevant topics that surround the subject of 'self-discipline'. From this book, I got more into the GTD (getting things done) principle and has really helped with managing my to-dos. - - -5. What are the things you like about your role? - - The thing I like most about my current role is the fact that no two days are the same. As my current role is a part-time tutor, I meet students that really challenge me to explain complex concepts in simpler ways. There are many soft skills that I've picked up, such as: communication, time-management, organisation and teamworking skills. - - -6. What annoys you? - - Poor communication from peers and soiled working environments can at times be frustrating. I believe that good and innovative ideas come from open discussions, therefore I value settings where conversations flow in a respectful manner, where people can speak their thoughts and ideas regardless of their seniority. - -7. What would you like to be able to do better? - - I would like to improve my skills in DevOps, specifically the CI/CD and containerisation aspect of this. As I've worked on full-stack applications, my focus was mainly on getting the features deployed, however I want to understand more about deployment, scalability, and infrastructure. To bridge this gap, I began setting up my own homelab that hosts different services through docker-compose. I'm also looking at GitHub actions as I regularly upload to GitHub. - - *add something non-technical* - -8. If we were to ask your manager, how would they describe you? - -They’d describe me as: dependable, empathetic, and always ready to help. Someone who takes initiative in stressful situations, supports others without hesitation, and makes others smile. - - -9. What would your manager say was the best way to manage you? - - Giving me the trust and space to work independently. Being given regular feedback along with constructive performance reviews with what needs to be worked on really helps. - -10. What would your manager say you need to improve on? - - They might say I sometimes take on too much at once. I tend to get enthusiastic about new challenges, however I need to be able to set realistic expectations with both myself and the team through assessing the workload better. - -11. If we asked some of the people that worked with you, to describe you, what would - -they say? - -They'd likely say that I'm approachable, passionate about learning and well-organised. Someone who is easy to get along with and overall jolly. - - -12. If you could change something about your current role, what would it be? - - - -13. Why do you want to move on from your current role? - - - -14. What do you think you will like about this role? - - - -15. What do you think will be difficult about this role? - - - -16. Can you provide an example of where you have gone above and beyond the role to - -achieve a goal? - - - -17. Can you provide an example of where you have provided exceptional internal or - -external customer care? - - - -18. Have you done any charity work, or voluntary work to help others? If not, have you - -examples of where you have helped someone at work? diff --git a/20250516161728-gpg_encryption.org b/20250516161728-gpg_encryption.org old mode 100644 new mode 100755 diff --git a/20250516161728-gpg_encryption.org~ b/20250516161728-gpg_encryption.org~ deleted file mode 100644 index e2f916a..0000000 --- a/20250516161728-gpg_encryption.org~ +++ /dev/null @@ -1,34 +0,0 @@ -:PROPERTIES: -:ID: 30c28e5e-0b1c-43ae-b3bd-eb31023f8b73 -:END: -#+title: gpg-encryption -#+filetags: :linux:security:gpg: - -If you want to encrypt a file, use the following command: - -#+begin_src bash - - gpg -c file.txt - - # options include : - # gpg -c file.txt : for symmetric encryption - # gpg -d file.txt.gpg : to decrypt the file - # gpg --batch -c --passphrase mypassphrase file.txt : accepts passphrase right from command line - -#+end_src - -and to decrypt, use: - -#+begin_src bash - - gpg -d file.txt - - # You have to wait 10 minutes before you can get prompted for a password, before this, it will - # decrypt without the passphrase. - -#+end_src - -gpg --batch -c --passphrase Shakkal123! passwords.md - -gpg --batch -d --passphrase Shakkal123! passwords.md.gpg - diff --git a/20250703183239-linux_arch_linux.org b/20250703183239-linux_arch_linux.org old mode 100644 new mode 100755 diff --git a/20250703183239-linux_arch_linux.org~ b/20250703183239-linux_arch_linux.org~ deleted file mode 100644 index 904695b..0000000 --- a/20250703183239-linux_arch_linux.org~ +++ /dev/null @@ -1,10 +0,0 @@ -:PROPERTIES: -:ID: 569a4a57-1843-4821-8259-17762855985e -:END: -#+title: linux-arch-linux -#+filetags: :linux:arch: - -* Links: -- https://www.geeksforgeeks.org/how-to-install-intellij-idea-on-arch-based-linux-distributionsmanjaro/ - - diff --git a/20250715223949-the_clean_coder.html b/20250715223949-the_clean_coder.html old mode 100644 new mode 100755 diff --git a/20250715223949-the_clean_coder.org b/20250715223949-the_clean_coder.org old mode 100644 new mode 100755 diff --git a/20250715223949-the_clean_coder.org~ b/20250715223949-the_clean_coder.org~ deleted file mode 100644 index e190b88..0000000 --- a/20250715223949-the_clean_coder.org~ +++ /dev/null @@ -1,289 +0,0 @@ -:PROPERTIES: -:ID: EC9D851F-3A2E-4F32-A584-76F6F7A08E30 -:TYPE: Book -:AUTHOR: Robert C. Martin -:DATE_STARTED: <2025-07-15 Tue> -:DATE_ENDED: <2025-07-27 Sun> -:END: -#+title: The Clean Coder -#+filetags: :books: - -* Links: - -[[https://medium.com/@stephanie.manwaring/biggest-takeaways-from-each-chapter-of-the-clean-coder-by-robert-c-martin-5e9d1f5ae34][Medium website]] -[[https://codingjourneyman.com/tag/uncle-bob/page/2/][Coding Journey Man]] - - -* CHAPTER 1: PROFESIONALISM - -** Do no harm -No harm should be done to the function of our software. The harm comes about when there are bugs, the QA should find no bugs in the software. If the software is too complex to run without there being bugs, reduce the complexity of the software. Find ways to ensure that the code is designed so that it is easy to test. Aim for 100% test coverage, everything should be tested; automate the testing so you don't waste too much time. - -** Do no harm to the structure -It is the structure of your code that allows it to be flexible. If you compromise the structure, you compromise the future. If you want the software to be flexible, you have to flex it. This is done by making easy changes to it all the time, which is known as *merciless refactoring*. - -** Work ethic -Your career is your responsability and nobody else's. The 40 hours at work should be spent on the employers problems, and the extra 20 hours should be spent reading, practicing, learning, and otherwise enhancing your career. - -** Know your field -Do you know what a Nassi-Schneiderman chart is? If not, why not? Do you know the difference between a Mealy and a Moore state machine? You should. Could you write a quicksort without looking it up? Do you know what the term “Transform Analysis” means? Could you perform a functional decomposition with Data Flow Diagrams? What does the term “Tramp Data” mean? Have you heard the term “Conascence”? What is a Parnas Table? If you want to be a professional, you should know a sizable chunk of ideas, disciplines, techniques, tools, and terminologies and constantly be increasing the size of that chunk. - -Here is a minimal list of the things that every software professional should be conversant with: -• Design patterns. You ought to be able to describe all 24 patterns in the GOF book and have a working knowledge of many of the patterns in the POSA books. -• Design principles. You should know the SOLID principles and have a good understanding of the component principles. -• Methods. You should understand XP, Scrum, Lean, Kanban, Waterfall, Structured Analysis, and Structured Design. -• Disciplines. You should practice TDD, Object-Oriented design, Structured Programming, Continuous Integration, and Pair Programming. -• Artifacts: You should know how to use: UML, DFDs, Structure Charts, Petri Nets, State Transition Diagrams and Tables, flow charts, and decision tables. - -** Continuous learning -Read books, articles, blogs, tweets. Go to conferences. Go to user groups. Participate in reading and study groups. Learn things that are outside your comfort zone. If you are a .NET programmer, learn Java. If you are a Java programmer, learn Ruby. If you are a C programmer, learn Lisp. If you want to really bend your brain, learn Prolog and Forth! - -** Practice -Doing your daily job is performance, not practice. Practice is when you specifically exercise your skills outside of the performance of your job for the sole purpose of refining and enhancing those skills. More on this later. - -** Collaboration -Make a speacial effort to practice, program, plan and design together (not for 100% of your time). - -** Mentoring -The best way to learn is to teach. - -** Know your domain -It is the responsibility of every software professional to understand the domain of the solutions they are programming. If you are writing an accounting system, you should know the accounting field. If you are writing a travel application, you should know the travel industry. When starting a project in a new domain, read a book or two on the topic. Interview your customer and users about the foundation and basics of the domain. Spend some time with the experts, and try to understand their principles and values. - -** Identify with your Employer/Customer -Put yourself in your employer’s shoes and make sure that the features you are developing are really going to address your employer’s needs. - -** Humility -Professionals know they are arrogant and are not falsely humble. A professional knows his job and takes pride in his work. A professional is confident in his abilities, and takes bold and calculated risks based on that confidence. A professional is not timid. However, a professional also knows that there will be times when he will fail, his risk calculations will be wrong, his abilities will fall short. Be your own critique and never ridicule others, accept ridicule when deserved and laugh it off when it's not. - -* CHAPTER 2: SAYING NO -Professionals are expected to say no. Indeed, good managers crave someone who has the guts to say no. It’s the only way you can really get anything done. (tfb) - -If you are a professional, you will pursue and defend your objectives as aggressively as you can, so will your managers/peers. The best possible outcome is the goal that you and your manager share. The trick is to find that goal, and that usually takes negotiation. - -The most important time to say no is when the stakes are highest. The higher the stakes, the more valuable no becomes. - -Make sure you have documentation (memos) for high stake deliverables/situations (CYA) - -* CHAPTER 3: SAYING YES -Say. Mean. Do. -There are three parts to making a commitment. - -1. You say you’ll do it. -2. You mean it. -3. You actually do it. - -There are certain phrases used by ourselves and our peers that show a lack of commitment. Here are some common phrases: - -• Need\should. “We need to get this done.” “I need to lose weight.” “Someone should make that happen.” -• Hope\wish. “I hope to get this done by tomorrow.” “I hope we can meet again some day.” “I wish I had time for that.” “I wish this computer was faster.” -• Let’s. (not followed by “I . . .”) “Let’s meet sometime.” “Let’s finish this thing.” - -Real commitment will have you stating a fact about something you will do with a clear end time. If you rely on someone else to get your job done, do what you can to get what you need to move forward. Don’t let them be a blocker. - -Professionals are not required to say yes to everything that is asked of them. However, they should work hard to find creative ways to make “yes” possible. - -* CHAPTER 4: CODING -If you are tired or distracted, do not code. You’ll only wind up redoing what you did. Instead, find a way to eliminate the distractions and settle your mind. - -Don’t write code when you are tired. Dedication and professionalism are more about discipline than hours. Make sure that your sleep, health, and lifestyle are tuned so that you can put in eight good hours per day. - -Spend personal time before work trying to resolve or mitigate personal issues or demands so you can focus your mental energy on being a productive problem solver at work. - -Avoid the `flow zone`, rational faculties are diminished in the name of speed. Yes, you may be able to write more code, but you are going to end up giving up the ability to have a holistic view of the problem. You are likely to make decisions that you are going to end up having to go back and reverse. - -Be prepared to be interrupted and help someone — it’s the professional thing to do. When you hit writer’s block make sure you are sleeping, eating, and exercising enough. Additionally, read science fiction (or another form of creative consumption other than surfing the internet or watching TV). Lean on other creative consumption outlets to help keep you creative on the job - -It is incumbent upon you as a professional to reduce your debugging time as close to zero as you can get. Clearly zero is an asymptotic goal, but it is the goal nonetheless. - -Software development is a marathon — not a sprint. Conserve your mental energy during the day. - -“Hope” will get you into trouble (“I hope to have it done by…”). Don’t hope. Be direct about your timelines and realistic expectations. If you must, use an estimate/range. - -Ask for help and ask to give help (mentor). - -Programming is so hard, in fact, that it is beyond the capability of one person to do it well. No matter how skilled you are, you will certainly benefit from another programmer’s thoughts and ideas. - -* CHAPTER 5: TDD - -1. You are not allowed to write any production code until you have first written a failing unit test. -2. You are not allowed to write more of a unit test than is sufficient to fail—and not compiling is failing. -3. You are not allowed to write more production code that is sufficient to pass the currently failing unit test. - -Good tests function like good documentation. -TDD is a discipline that enhances certainty, courage, defect reduction, documentation, and design. -It’s professional to use TDD. - -* CHAPTER 6: PRACTICING - -It is not your employer’s job to keep your skills sharp for you. That responsability is on YOU. - -http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata - -https://codingdojo.org/ - -A programming kata is a precise set of choreographed keystrokes and mouse movements that simulates the solving of some programming problem. You aren’t actually solving the problem because you already know the solution. Rather, you are practicing the movements and decisions involved in solving the problem. - -Many kata are recorded at http://katas.softwarecraftsmanship.org. Others can be found at http://codekata.pragprog.com. Some of my favorites are: - -• The Bowling Game: http://butunclebob.com/ArticleS.UncleBob.TheBowling-GameKata -• Prime Factors: http://butunclebob.com/ArticleS.UncleBob.ThePrimeFactors-Kata -• Word Wrap: http://thecleancoder.blogspot.com/2010/10/craftsman-62-dark-path.html - -For a real challenge, try learning a kata so well that you can set it to music. Doing this well is hard. See: https://katas.softwarecraftsmanship.org/?p=71 - -Programmers can practice in a similar fashion (wasa) using a game known as ping-pong. The two partners choose a kata, or a simple problem. One programmer writes a unit test, and then the other must make it pass. Then they reverse roles. See: https://wiki.c2.com/?PairProgrammingPingPongPattern - -Other ways to practice: take on pro-bono work or a pet project, contribute to open source. Practice is something you do when you aren’t being paid. - -* CHAPTER 7: ACCEPTANCE TESTING -** Intro - -A company spends over **\$1 million every 6 weeks** on manual testing. -They consider cutting half the tests, risking half the product not working. -**Manual test plans are unsustainable**. Automating tests is far cheaper and more reliable. -**Acceptance tests** should be **automated** using tools like: - -FitNesse, Cucumber, Selenium, robot framework, cuke4duke, etc. -These tools make tests **readable and writable by non-programmers**. - -Writing acceptance tests is **not extra work** — it's **how you define what "done" means**. -It ensures that stakeholders and developers are **aligned on requirements**. - -** Who Writes Them and When? - -**Business Analysts (BAs)** often write "happy path" tests. -**QAs** write edge cases and "unhappy paths". -Developers may step in if others can't keep up. -Tests are best written **just before development**, typically during iteration planning. - -** Developers are responsible for: - -**Connecting** acceptance tests to the system. -**Implementing features** to make tests pass. -Negotiating unclear or flawed tests with authors. -Avoid passive-aggressive compliance; collaborate to refine faulty tests. - -** Realistic Expectations (e.g., Timing) - -Not all requirements can be absolute (e.g., "must respond in 2 seconds"). -Use **statistical assertions** (e.g., 99.5% of requests under 2 seconds). -Developers and stakeholders must **agree on testable, realistic criteria**. - -** Acceptance Tests vs Unit Tests - -| Feature | Unit Tests | Acceptance Tests | -| ------------- | -------------------------------- | ---------------------------------------- | -| Written by | Developers | Stakeholders / BAs / QA / Developers | -| Purpose | Specify and verify internal code | Specify and verify business requirements | -| Audience | Developers | Business + Developers | -| Scope | Small units (functions, classes) | Full system (API, UI, etc.) | -| Primary value | Design documentation | Requirements documentation | - -Tests are **not redundant** even if they check similar things — their **execution paths and intent differ**. - -** Testing GUIs - -GUIs are **volatile** (constantly changing), making them hard to test. -Apply **Single Responsibility Principle (SRP)**: - -Separate GUI aesthetics from business logic. -**Test through APIs** beneath the GUI whenever possible. -If GUI testing is necessary, use **IDs or abstractions**, not layout-specific logic. -Keep GUI tests **minimal**, as they’re fragile - -** Continuous Integration (CI) -Run **all tests (unit + acceptance)** multiple times per day via CI. -Trigger builds/tests **on every commit**. -A failed build/test is a **"stop everything" event**. -Never ignore broken tests; doing so can lead to **customer-facing bugs**. - -* CHAPTER 8: TESTING STRATEGIES -Having a full test automation policy is a feature of professional development teams which is not only composed by unit tests and acceptance tests. The test automation pyramid figure (https://codingjourneyman.com/2014/09/24/the-clean-coder-testing-strategies/) show every test types and their proportion. - -Unit tests are written by the programmers for the programmers to ensure that the code is working at the deepest/lowest level. They should execute in milliseconds and target a 100% code coverage (at least 90%). - -Component tests are a part of the acceptance tests and check the behavior of individual component. A component encapsulate a specific set of business rules. These kind of tests should be very quick as well because they are decoupled from the other components and should cover about half the system. - -Integration tests are required to check the communication between components in order to verify that the “plumbing” has been done correctly. They ensure that the architectural structure of the system is correct. About 20% of the system is covered by integration tests. - -System tests are executed at the highest level of the system, from the UI to check the whole application and its construction (load tests are in this category for instance). They check about 10% of the system. - -Manual/exploratory tests are done by humans to explore the application for unexpected behaviors. They need the human creativity to hunt possible hidden bugs. - -* CHAPTER 9: TIME MANAGEMENT -Attending meetings is important in order to follow the life cycle of your project but you are not required in every one of them. In this case you can politely decline the invitation if your presence is not mandatory. It’s no better to be present and play with your smart-phone because you’re bored or because you’re not involved. - -There are also some cases where you can leave a meeting. I know it might look rude to do so but it can happen that a meeting goes not as planned and take much more time that you have anticipated. In a situation like this you can politely ask if your presence is still needed and negotiate your exit. There is nothing worst than a meeting without an agenda and/or without a goal, there is no better way to waste time and energy. - -If you use an Agile methodology such as Scrum at work you certainly have to do stand-up meetings every day (mostly at the beginning of the day). Each member of the team should answer the 3 following questions : - - 1. What did I do yesterday ? - 2. What am I going to do today ? - 3. What’s in my way ? - -And no more, each person should be able to answer these questions in less than one minute. With this short and simple meeting you can easily know if your project is on track or no. - -During an iteration planning meeting a development team select and reject backlog items for the new sprint/iteration. The estimates (our next chapter) should be done for every candidate item and if possible some of the acceptance tests. The chosen tasks should be clear and ready for the development phase (coding) and this meeting aims to allow the team to briefly discuss over the items. - -Iteration retrospective meeting are designed to share what went wrong and what went right during the last iteration and to present demos to the clients/business. It should not extend 45 minutes, 20 for the retrospective and 25 for the demos which are prepared in advance. - -Uncle Bob defines two truths about meetings, finding the correct mix between them for your team can be challenging : - -- Meetings are necessary. -- Meetings are huge time wasters. - -Writing code is an intellectual exercise that requires long periods of concentration and can be exhausting for your mind. But your focus is not infinite and can be depleted, if you are familiar with Role Playing Game (RPG) see this as an empty mana pool. Unfortunately unlike in RPGs you cannot drink a potion to recharge your concentration in a blink but you can refill it. - -Sleeping is the best way to replenish your concentration, a good night of sleep (7~8 hours) can give you enough concentration for an entire day. Coffee is the developer’s best friend and can definitely help you regain a small amount of concentration for a short amount of time but don’t let this beverage send your focus in the wrong direction. - -It’s also possible to partially recharge your mana batteries by taking breaks during your day, it allows you to de-focus. If the weather permits it you can go out for a walk, have a conversation with a friends, even meditate if you want. You can also practice a physical discipline, it also demands concentration but not intellectual focus : muscle focus. This type of focus can help you increase your mental focus and give you mana. Programming is a creative discipline then exposing yourself to other people’s creativity (books, comics, movies, etc…) is also helpful to boost your own creativity. - -When producing code you will sometimes encounter “blind alleys”. It means that the path you’ve taken leads nowhere, in other word your algorithm does not what you want, your solution does not answer your need. It’s impossible to avoid every “blind alleys” but it’s important to realize when you are in one of them to back out. - -What you definitely want to avoid are software “marshes”, “bogs” or “swamps”. Unlike “blind alleys” they don’t stop you, there is always a way forward that looks shorter than the way back but that is not. Sticking to a bad software design is a typical example of a swamp, the more you advance the harder it is to advance and at the end you end up with a colossal “Technical Debt“ without noticing it. It kills a team’s productivity and can sometimes kills and entire project/company because maintenance has become overwhelming. If you discover that you are in a situation like this you should definitely turn back before it’s too late. -* CHAPTER 10: ESTIMATION - You are honor-bound to decline something you cannot commit to. Commitment is about certainty. - Professionals know the difference between estimates and commitments. - Estimates are just guesses. Estimates are ranges (not exact numbers). - Avoid the word “try”. It’s a loaded term. - Something to look into is a method like PERT to get a better estimate. - Professional software developers are very careful to set reasonable expectations despite the pressure to try to go fast. - Estimating methods: wide band delphi, flying fingers, planning poker. - -When you estimate a task, you provide three numbers. This is called trivariate analysis: -• O: Optimistic Estimate. This number is wildly optimistic. You could only get the task done this quickly if absolutely everything went right. Indeed, in order for the math to work this number should have much less than a 1% chance of occurrence. -• N: Nominal Estimate. This is the estimate with the greatest chance of success. If you were to draw a bar chart, it would be the highest bar, -• P: Pessimistic Estimate. Once again this is wildly pessimistic. It should include everything except hurricanes, nuclear war, stray black holes, and other catastrophes. Again, the math only works if this number has much less than a 1% chance of success. - -* CHAPTER 11: PRESSURE - -A professional developer is calm and decisive under pressure. As pressure grows, she adheres to disciplines knowing that they are the best way to meet the deadlines and commitments pressing on her. -Under pressure? Be sure to manage your commitments, follow disciplines, and keep code clean, communicate, and ask for help. - -The best way to stay calm under pressure is to avoid the situations that cause -pressure. That avoidance may not eliminate the pressure completely, but it -can go a long way towards minimizing and shortening the high-pressure -periods. - -* CHAPTER 12: COLLABORATION - Programmers have difficulty working closely with other programmers. That’s no excuse, though. Being a developer means working with people. - The team owns the code, not the individual - Professionals pair (and have good pairing habits). - Pairing is a great way to share knowledge so that people don’t end up in knowledge silos. - All team members should be able to play another team members’ position in a pinch and should know each other’s code. -* CHAPTER 13: TEAMS AND PROJECTS - Strive to have a “gelled” team. A gelled team is one that forms relationships, collaborates, and learn each other’s quirks and strengths. - Gelled teams can work miracles. They plan together, solve together, and get things done. -* CHAPTER 14: MENTORING, APPRENTICESHIP, AND CRAFTSMANSHIP -Developers often start out by teaching themselves (books, trial & error, copying code). - -Without mentorship, they risk missing crucial lessons—like setting expectations, meeting deadlines, and writing maintainable code. - -Good mentors matter: they correct mistakes early, model professionalism, and guide juniors through real-world practices. - -Software lacks true apprenticeships (unlike medicine, plumbing, or carpentry). New devs need hands-on oversight, not just “figure it out” work. - -Professionals should seek mentors and become mentors—help others level up, share best practices, and prevent the cycle of isolated learning. -* APPENDIX A: TOOLING - diff --git a/20250717230336-recipes_main.org b/20250717230336-recipes_main.org old mode 100644 new mode 100755 diff --git a/20250717230336-recipes_main.org~ b/20250717230336-recipes_main.org~ deleted file mode 100644 index aec7bc3..0000000 --- a/20250717230336-recipes_main.org~ +++ /dev/null @@ -1,9 +0,0 @@ -:PROPERTIES: -:ID: 65F747B1-3CB2-429A-9E26-ED8BC169E689 -:END: -#+title: recipes-moc -#+filetags: :moc:recipes: - -* [[id:F7D68FF4-CAD0-4791-BAE4-AC20B84A8785][recipes-ideas]] - -* [[id:EA93341B-20C0-48A2-BD88-F24ED3C540DA][recipes-done]] diff --git a/20250717230336-recipes_moc.org b/20250717230336-recipes_moc.org old mode 100644 new mode 100755 diff --git a/20250719174944-recipes_ideas.org b/20250719174944-recipes_ideas.org old mode 100644 new mode 100755 diff --git a/20250719174944-recipes_ideas.org~ b/20250719174944-recipes_ideas.org~ deleted file mode 100644 index 6547c52..0000000 --- a/20250719174944-recipes_ideas.org~ +++ /dev/null @@ -1,64 +0,0 @@ -:PROPERTIES: -:ID: F7D68FF4-CAD0-4791-BAE4-AC20B84A8785 -:END: -#+title: recipes-ideas - -* Spiced Potato & Pea Quesadillas - -Prep time: 20 min -Ingredients: - - Boiled potatoes, mashed - - Frozen peas - - Cumin, coriander, chili flakes - - Tortilla wraps - Method: - - Mix mashed potatoes, peas, and spices. - - Spread mixture on a tortilla, top with another. - - Toast in a pan until crispy on both sides. - -* Chickpea Pilaf - -Prep time: 25 min -Ingredients: - - Cooked rice - - Canned chickpeas - - Onion, garlic, cumin, cinnamon - - Optional: raisins or almonds - Method: - - Sauté onion, garlic, spices. - - Stir in chickpeas, then rice. - - Heat through, serve with yogurt. - -* Lentil Soup with Flatbread - -Prep time: 25 min -Ingredients: - - Red lentils - - Onion, garlic, carrot - - Cumin, turmeric, black pepper - - Vegetable stock - Method: - - Sauté onion, garlic, and carrot. - - Add spices and lentils. Pour in stock. - - Simmer until soft, then blend if preferred. diff --git a/20250719175023-recipes_done.org b/20250719175023-recipes_done.org old mode 100644 new mode 100755 diff --git a/20250719175023-recipes_done.org~ b/20250719175023-recipes_done.org~ deleted file mode 100644 index 4ba5a64..0000000 --- a/20250719175023-recipes_done.org~ +++ /dev/null @@ -1,29 +0,0 @@ -:PROPERTIES: -:ID: EA93341B-20C0-48A2-BD88-F24ED3C540DA -:END: -#+title: recipes-done -#+filetags: :recipes:references: - -* Done: -** <2025-07-17 Thu> -https://spainonafork.com/healthy-creamy-tuna-wraps-recipe/ - -Instead of 1 clove fresh garlic, i used 1/4 teaspoon garlic granules. -Also used lime juice instead of lemon juice -need to work on plating (put too much salad, its better to cut the tomatos in smaller chunks and the salad in smaller pieces) - -** <2025-07-18 Fri> -https://www.youtube.com/watch?v=wiKndVvU_Ks&list=LL&index=2&ab_channel=BrownGirlsKitchen - -Dont use plastic sieve (as boiled water goes on it when extracting the potatos) - -use low heat when toasting the wraps - -served 3 large sized wraps (maybe use taco wraps next time) - -** <2025-07-19 Sat> -https://www.youtube.com/watch?v=3d6DrdOEuY4&list=LL&index=1&ab_channel=FoodFusion - -WASH HANDS AFTER TOUCHING GREEN CHILLI. - -juilienne : cutting the garlic into small strips diff --git a/20250722221649-career_index.org~ b/20250722221649-career_index.org~ deleted file mode 100644 index 6dcaf66..0000000 --- a/20250722221649-career_index.org~ +++ /dev/null @@ -1,50 +0,0 @@ -:PROPERTIES: -:ID: dd04d228-fff5-402a-929d-9d113a2ec965 -:DATE_STARTED: <2025-07-22 Tue> -:END: -#+STARTUP: overview -#+title: Career Index -#+filetags: :index:career: - -* ABOUT: - -* pre-work -- [[id:2729599d-ae2b-4f22-b73d-bf22d81e0767][test-driven-development]] - -* Resources: - -** Books: -*** So Good They Can't Ignore You -Microlise recomended me to read this -**** Book Link: -- [[file:~/master-folder/pdfs/technical/so_good_they_cant_ignore_you.pdf][Book Internal PDF]] -- [[https://zserver.zapto.org/calibre/read/5/pdf][Book External PDF]] - -**** Link to org file: -- [[id:2d7f1ccc-99d7-4c45-8fe7-4b87080edb01][book-sgtciy]] - -*** Clean Coder: -Microlise recomended me to read this -**** Book Link: -- [[file:~/master-folder/pdfs/technical/The Clean Coder.pdf][Book Internal PDF]] -- [[https://zserver.zapto.org/calibre/read/10/pdf][Book External PDF]] - -**** Link to org file: -- [[id:EC9D851F-3A2E-4F32-A584-76F6F7A08E30][book-the-clean-coder]] - -*** The Manager’s Path -A Guide for Tech Leaders Navigating Growth and Change -Link: -[[https://www.amazon.com/Managers-Path-Leaders-Navigating-Growth/dp/1491973897][The Managers Path]] - -*** SICP -Book link: -- [[https://zserver.zapto.org/calibre/read/11/pdf][Online]] -- [[file:/home/zaine/master-folder/pdfs/technical/sicp.pdf][Internal]] - -** Websites: -*** Link to free software blogging course -- [[https://simpleprogrammer.com/my-free-blogging-course-is-getting-unbelievable-results/][Simple Programmer]] - - - diff --git a/20250722221649-career_moc.org b/20250722221649-career_moc.org old mode 100644 new mode 100755 index f1b4845..3b5cc3f --- a/20250722221649-career_moc.org +++ b/20250722221649-career_moc.org @@ -9,10 +9,7 @@ [[id:ABF4A0BE-0309-48A6-92ED-76031B3D2F86][microlise_moc]] * Articles/Blogs: -** TODO https://forge.medium.com/a-simple-tool-for-personal-growth-dc1e822aa229 -:PROPERTIES: -:FOLLOWUP: true -*** Description: +- https://forge.medium.com/a-simple-tool-for-personal-growth-dc1e822aa229 * pre-work - [[id:2729599d-ae2b-4f22-b73d-bf22d81e0767][test-driven-development]] diff --git a/20250722221649-career_moc.org~ b/20250722221649-career_moc.org~ deleted file mode 100644 index f87e0ad..0000000 --- a/20250722221649-career_moc.org~ +++ /dev/null @@ -1,48 +0,0 @@ -:PROPERTIES: -:ID: dd04d228-fff5-402a-929d-9d113a2ec965 -:DATE_STARTED: <2025-07-22 Tue> -:END: -#+STARTUP: overview -#+title: career_moc -#+filetags: :moc:career: - -[[id:ABF4A0BE-0309-48A6-92ED-76031B3D2F86][microlise_moc]] - -* ABOUT: - -* pre-work -- [[id:2729599d-ae2b-4f22-b73d-bf22d81e0767][test-driven-development]] -- [[id:f9897f8e-2b63-4ad2-a55f-3787c4ac235f][job_application_cover_letters]] -- [[id:5cfd7f6f-f5ac-4f18-90f9-be9a31dd238e][java-portswrigger-test]] -- [[id:f877240e-c2c8-4087-84e5-4b1ca3fcd4ed][microlise-assessment]] -* Resources: - -** Books: -*** So Good They Can't Ignore You -Microlise recomended me to read this -**** Book Link: -- [[file:~/master-folder/pdfs/technical/so_good_they_cant_ignore_you.pdf][Book Internal PDF]] -- [[https://zserver.zapto.org/calibre/read/5/pdf][Book External PDF]] - -*** Clean Coder: -Microlise recomended me to read this -**** Book Link: -- [[file:~/master-folder/pdfs/technical/The Clean Coder.pdf][Book Internal PDF]] -- [[https://zserver.zapto.org/calibre/read/10/pdf][Book External PDF]] - -*** The Manager’s Path -A Guide for Tech Leaders Navigating Growth and Change -Link: -[[https://www.amazon.com/Managers-Path-Leaders-Navigating-Growth/dp/1491973897][The Managers Path]] - -*** SICP -Book link: -- [[https://zserver.zapto.org/calibre/read/11/pdf][Online]] -- [[file:/home/zaine/master-folder/pdfs/technical/sicp.pdf][Internal]] - -** Websites: -*** Link to free software blogging course -- [[https://simpleprogrammer.com/my-free-blogging-course-is-getting-unbelievable-results/][Simple Programmer]] - - - diff --git a/20250723171109-maven_pom_file.org b/20250723171109-maven_pom_file.org old mode 100644 new mode 100755 diff --git a/20250723171109-maven_pom_file.org~ b/20250723171109-maven_pom_file.org~ deleted file mode 100644 index 6d9cea2..0000000 --- a/20250723171109-maven_pom_file.org~ +++ /dev/null @@ -1,69 +0,0 @@ -:PROPERTIES: -:ID: bcd41e87-120c-455c-8898-996ddaa41f75 -:END: -#+title: maven-pom-file -#+filetags: testing, fish - -* Doc Link -- [[https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html][Link to apache doc]] - -* Example of pom.xml -#+begin_src xml - - - 4.0.0 - com.mycompany.app - my-app - 1.0-SNAPSHOT - my-app - - http://www.example.com - - UTF-8 - 17 - - - - - org.junit - junit-bom - 5.11.0 - pom - import - - - - - - org.junit.jupiter - junit-jupiter-api - test - - - - org.junit.jupiter - junit-jupiter-params - test - - - - - ... lots of helpful plugins - - - - - #+end_src - -* Commands: - -*FOR TESTING* -#+begin_src bash - mvn clean test -#+end_src - -*COMPILING* -#+begin_src bash - mvn compile -#+end_src diff --git a/20250723182408-book_sgtciy.org~ b/20250723182408-book_sgtciy.org~ deleted file mode 100644 index 9d762e0..0000000 --- a/20250723182408-book_sgtciy.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 2d7f1ccc-99d7-4c45-8fe7-4b87080edb01 -:END: -#+title: book-sgtciy - diff --git a/20250723182408-so-good-they-cant-ignore-you.org b/20250723182408-so-good-they-cant-ignore-you.org old mode 100644 new mode 100755 diff --git a/20250723182408-so-good-they-cant-ignore-you.org~ b/20250723182408-so-good-they-cant-ignore-you.org~ deleted file mode 100644 index 172bb4b..0000000 --- a/20250723182408-so-good-they-cant-ignore-you.org~ +++ /dev/null @@ -1,76 +0,0 @@ -:PROPERTIES: -:ID: 2d7f1ccc-99d7-4c45-8fe7-4b87080edb01 -:TYPE: Book -:AUTHOR: Cal Newport -:DATE_STARTED: <2025-05-25 Sun> -:DATE_ENDED: <2025-06-15 Sun> -:END: -#+title: So good they can't ignore you -#+filetags: :books: - -* So good they cant ignore you -Some of these points have been inspired from this -[[https://jasonkwanhc.medium.com/book-summary-of-so-good-they-cant-ignore-you-58cb236fef0d][website]] - -* Summary - -The book focuses on the reality of how people end up loving what they do. It demystifies the concept: "follow your -passion", and details alternative strategies. - -** Rule *1: **Don’t Follow Your Passion** - -1. The Passion Hypothesis is the biggest myth in occupational happiness. It says that “The key to occupational happiness - is to first figure out what you are passionate about and then find a job that matches this passion”, the author1 - argues against this. -2. He mentions some incidents of people like Steve Jobs, proving that successful people like him (who is famous for the - concept "follow your passions") didn’t start off because he had a passion for the thing they do. - -** Rule *2: Be So Good They Can’t Ignore You (Or, the importance of skills) - -1. The traits that define great work are rare and valuable, if you want these traits, you need rare and valuable skills. - These skills are called *[[id:f9838952-9753-471b-a2cc-d72e01a53ef6][career-capital]]*. -2. Adopt the **Craftsman Mindset** where instead you focus on what you can offer the world. This is in stark contrast to - the **Passion Mindset** where you focus on what the world can offer you. The craftsman mindset focuses on becoming - better and improving the quality of what you produce. It focuses on becoming so good they can’t ignore you, - regardless of what you do for a living. -3. The concept of *[[id:d4f96bfb-b83d-449b-9f74-f602a1a3c2d3][deliberate-practice]]* is mentioned where you deliberately stretch your - abilities beyond where you're comfortable and then receive ruthless feedback on your performance. -4. 5 Steps on applying the deliberate practice in your work: - - 1. **Step 1: Decide What Type of Capital Market You’re Competing In.** There are two kinds of markets, a - *winner-take-all* market and an *auction* market. In a winner-take-all market, there's only one type of career - capital available and only one that matters. In the auction market however, there are a variety of relevant - skills that could *lead* you to getting the job, in other words, there are a variety of career capital available. - 2. **Step 2: Identify Your Capital Type**. This step makes you figure out what are the relevant skills that are - needed in order to be great at your job. In the winner-take-all market, it's pretty straightforward that it's - that one career capital, however in the auction market there's more flexibility. A useful heuristic mentioned is - the *open-gates* opportunities present. In other words, those opportunities to build capital that are already - open to you, then you work your way up. - 3. **Step 3: Define “Good”** . Having a clear view of what *good* means is important. This step forces you to think - about where you want to be and how you can achieve it using deliberate practice. This definition will be - different for different people. - 4. **Step 4: Stretch and Destroy**. Deliberate practice requires you to be uncomfortable, as it is something that is - not enjoyable. The important thing is to push beyond your comfort zone and get immediate feedback to steer you in - the right direction. - 5. **Step 5: Patience**. The acquisition of career capital will take time, therefore, it is necessary to be patient - and ensure that you pour all your effort into the capital you seek. The final sentence given in the book before - the summary is: **You stretch yourself, day after day, month after month, before finally looking up and - realising, "Hey, I've become pretty good, and people are starting to notice".** - -** Rule *3: Turn Down a Promotion (Or, the importance of control) - -1. The author here explains that once you've acquired a certain amount of career capital, your next step is to invest -in those traits that define great work. Discussion was made about control, and the common pitfalls that people fall -into. -2. The law of financial viability: when pursuing a project or career path, it's crucial to seek evidence that people - are willing to pay for it. If that evidence exists, it's a good sign to proceed; if not, it's better to reconsider or pivot. - -** Rule *4: Think Small, Act Big (Or, the importance of Mission) - -1. This rule focuses on the importance of having a mission in your work. Having a unifying focus for your career, a - sense of purpose, can make your work more meaningful and impactful. -2. A good career mission is similar to a scientific breakthrough, discovered in the adjacent possible of your field. - You will need to acquire enough career capital to be able to get into the *cutting edge* of your field. Once you - get into this cutting edge, you can then start to see these missions. -3. Think small, act big. Instead of focusing on a huge experiment with little feedback, focus on small experiments - that yield concrete feedback, and use this to guide you into the direction surrounding your general mission. diff --git a/20250723182408-so_good_they_cant_ignore_you.org b/20250723182408-so_good_they_cant_ignore_you.org old mode 100644 new mode 100755 diff --git a/20250723183655-career_capital.org b/20250723183655-career_capital.org old mode 100644 new mode 100755 diff --git a/20250723183655-career_capital.org~ b/20250723183655-career_capital.org~ deleted file mode 100644 index 4b9142b..0000000 --- a/20250723183655-career_capital.org~ +++ /dev/null @@ -1,11 +0,0 @@ -:PROPERTIES: -:ID: f9838952-9753-471b-a2cc-d72e01a53ef6 -:END: -#+title: Career capital -#+filetags: :definitions: - -Career capital refers to the abilities and resources you accumulate—whether skills, credentials, connections, or -savings—that allow you to do more with your career in the future. It’s an important consideration in long-term career -planning, especially in the early stages of your career. - -Taken from: https://probablygood.org/core-concepts/career-capital/ diff --git a/20250723183755-deliberate_practice.org b/20250723183755-deliberate_practice.org old mode 100644 new mode 100755 diff --git a/20250723183755-deliberate_practice.org~ b/20250723183755-deliberate_practice.org~ deleted file mode 100644 index 7d67c67..0000000 --- a/20250723183755-deliberate_practice.org~ +++ /dev/null @@ -1,12 +0,0 @@ -:PROPERTIES: -:ID: d4f96bfb-b83d-449b-9f74-f602a1a3c2d3 -:END: -#+title: Deliberate practice -#+filetags: :definitions: - -Deliberate practice refers to a special type of practice that is purposeful and systematic. While regular practice might -include mindless repetitions, deliberate practice requires focused attention and is conducted with the specific goal of -improving performance. - -Taken from: https://jamesclear.com/deliberate-practice-theory - diff --git a/20250723184233-advanced_networking.org b/20250723184233-advanced_networking.org old mode 100644 new mode 100755 diff --git a/20250723184233-advanced_networking.org~ b/20250723184233-advanced_networking.org~ deleted file mode 100644 index a709b2b..0000000 --- a/20250723184233-advanced_networking.org~ +++ /dev/null @@ -1,29 +0,0 @@ -:PROPERTIES: -:ID: 3acffb66-bc1a-4661-904f-c5447b3c3488 -:END: -#+title: advanced-networking -#+filetags: :uni:networking: - -# Advanced Networking - -This module was taught in the first semester of my final year at university. There were a wide range of topics that were covered, and best efforts were made in not talking about the security aspects of networks, although it is the case that when we talk about networks we are talking about secure networks (who even needs insecure networks?). - -The following core topics were covered: - -1. Lower Layer Protocols - - Packet vs Circuit Switching, Ethernet, layer models (DoD 4/5, OSI 7). - - Network Hardware: Switches, Routers, data/control/management plane. Software defined networks. - - LAN/WAN split, Arpanet, DoD, OSI. Why OSI Failed - - Link aggregation and VLANs -2. IP Addressing - - Addressing, routing, concepts. Why IPv6 is needed - - Address allocation, bootp, DHCP, SLAAC - - NAT and Proxying -3. TCP/UDP - - UDP: applications, advantages and disadvantages - - TCP: applications, advantages and disadvantages, mechanisms and operation, sequence numbers, receive windows, slow start, window scaling, PAWS, timestamping, multipathing - - Demultiplexing, multiplexing -4. DNS - - DNS: concepts, resource records, RR sets, basic operation, recursive and authoritative servers, caching, DNSSEC -5. Higher layer protocols - - Basic operation of HTTP, FTP, SMTP diff --git a/20250723184430-stanford_marshmallow_experiment.org b/20250723184430-stanford_marshmallow_experiment.org old mode 100644 new mode 100755 diff --git a/20250723184430-stanford_marshmallow_experiment.org~ b/20250723184430-stanford_marshmallow_experiment.org~ deleted file mode 100644 index b5e1c7a..0000000 --- a/20250723184430-stanford_marshmallow_experiment.org~ +++ /dev/null @@ -1,16 +0,0 @@ -:PROPERTIES: -:ID: acba0d25-08db-4784-8cc2-fe5c437ba723 -:END: -#+title: Stanford marshmallow experiment -#+filetags: :research: - -The Stanford marshmallow experiment, conducted in the 1960s and 1970s by psychologist Walter Mischel, explored the -ability of children to delay gratification. In the experiment, preschoolers were offered a marshmallow with the promise -of a second one if they waited a designated time (typically 15 minutes) without eating the first. The study's findings -revealed that children who waited longer to eat the marshmallow showed positive correlations with future outcomes like -higher SAT scores and better social functioning. However, later research has questioned the predictive power of the -original study, particularly when controlling for socio-economic factors. - -Source: https://jamesclear.com/delayed-gratification - - diff --git a/20250723185056-neuroplasticity.org b/20250723185056-neuroplasticity.org old mode 100644 new mode 100755 diff --git a/20250723185056-neuroplasticity.org~ b/20250723185056-neuroplasticity.org~ deleted file mode 100644 index a1f8cf8..0000000 --- a/20250723185056-neuroplasticity.org~ +++ /dev/null @@ -1,11 +0,0 @@ -:PROPERTIES: -:ID: a087da71-bcfb-4ddf-9565-b82113d5d27f -:END: -#+title: Neuroplasticity -#+filetags: :definitions: - - -The ability of the brain to form and reorganize synaptic connections, especially in response to learning or -experience or following injury. - -"Neuroplasticity offers real hope to everyone from stroke victims to dyslexics" diff --git a/20250723185829-test_driven_development.org b/20250723185829-test_driven_development.org old mode 100644 new mode 100755 diff --git a/20250723185829-test_driven_development.org~ b/20250723185829-test_driven_development.org~ deleted file mode 100644 index a2f7115..0000000 --- a/20250723185829-test_driven_development.org~ +++ /dev/null @@ -1,10 +0,0 @@ -:PROPERTIES: -:ID: 2729599d-ae2b-4f22-b73d-bf22d81e0767 -:END: -#+title: Test-driven development -#+filetags: :index:coding:guide: - -Test-driven development is a way of writing code that involves writing an automated unit-level test case that fails, then writing just enough code to make the test pass, then refactoring both the test code and the production code, then repeating with another new test case. Alternative approaches to writing automated tests is to write all of the production code before starting on the test code or to write all of the test code before starting on the production code. - -One example is: -- [[id:bca8e7a6-0590-4630-ab49-210306ad21a2][bowling-kata]] diff --git a/20250723185943-bowling_kata.org b/20250723185943-bowling_kata.org old mode 100644 new mode 100755 diff --git a/20250723185943-bowling_kata.org~ b/20250723185943-bowling_kata.org~ deleted file mode 100644 index c3a58b7..0000000 --- a/20250723185943-bowling_kata.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: bca8e7a6-0590-4630-ab49-210306ad21a2 -:END: -#+title: bowling-kata - diff --git a/20250723190203-java_portswrigger_test.org b/20250723190203-java_portswrigger_test.org old mode 100644 new mode 100755 diff --git a/20250723190203-java_portswrigger_test.org~ b/20250723190203-java_portswrigger_test.org~ deleted file mode 100644 index b492813..0000000 --- a/20250723190203-java_portswrigger_test.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 5cfd7f6f-f5ac-4f18-90f9-be9a31dd238e -:END: -#+title: java-portswrigger-test - diff --git a/20250723190656-java_junit_testing.org b/20250723190656-java_junit_testing.org old mode 100644 new mode 100755 diff --git a/20250723190656-java_junit_testing.org~ b/20250723190656-java_junit_testing.org~ deleted file mode 100644 index 612c892..0000000 --- a/20250723190656-java_junit_testing.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 7b8de14c-a73e-4c92-a403-a9a1c419c0b3 -:END: -#+title: java-junit-testing - diff --git a/20250723190927-self_hosting.org b/20250723190927-self_hosting.org old mode 100644 new mode 100755 diff --git a/20250723190927-self_hosting.org~ b/20250723190927-self_hosting.org~ deleted file mode 100644 index 9a28c5c..0000000 --- a/20250723190927-self_hosting.org~ +++ /dev/null @@ -1,9 +0,0 @@ -:PROPERTIES: -:ID: 99533f2d-a4e8-41d0-a605-c7d4cef6f995 -:END: -#+title: Self Hosting -#+filetags: :networking:self-hosting:index: - -https://hub.docker.com/_/nextcloud - -[[id:56f39be4-1108-4020-be5a-1f3a0fbf96fa][nextcloud]] diff --git a/20250723200800-postgres.org b/20250723200800-postgres.org old mode 100644 new mode 100755 diff --git a/20250724230557-books_org_agenda.org b/20250724230557-books_org_agenda.org old mode 100644 new mode 100755 diff --git a/20250724230557-books_org_agenda.org~ b/20250724230557-books_org_agenda.org~ deleted file mode 100644 index e126d4a..0000000 --- a/20250724230557-books_org_agenda.org~ +++ /dev/null @@ -1,478 +0,0 @@ -:PROPERTIES: -:ID: 363dbdfa-f23c-4f7e-a6f3-6d34f78984bb -:END: -#+title: books-org-agenda -#+filetags: :books:org:index: -#+DATE: 2025-05-19 -#+STARTUP: content - -* Books -** English Books -*** Teaching the Students the method of Studying -:PROPERTIES: -:Author: Sheikh Burhanul Islam Az-Zarnuji (tr. by Moulana Ebrahim Muhammad) -:Status: Read -:Group: Reading -:STARTED: <2024-07-01 Mon> -:FINISHED: <2024-07-12 Fri> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 11 -:DAYS_SINCE_FINISHED: 499 -:END: -*** A gift for nikah -:PROPERTIES: -:Author: Shaykh Abdul Raheem sahib DB -:Status: Read -:Group: Reading -:STARTED: <2024-10-28 Mon> -:FINISHED: <2024-10-29 Tue> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 1 -:DAYS_SINCE_FINISHED: 390 -:END: -*** The etiquette of Studying Hadith -:PROPERTIES: -:Author: Moulana Saleem Dhorab Sahib DB -:Status: Read -:Group: Reading -:STARTED: <2024-07-01 Mon> -:Finished: <2024-07-02 Tue> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 1 -:DAYS_SINCE_FINISHED: 509 -:END: -Read again on Tuesday 19th August 2025 - -*** The value of Time -:PROPERTIES: -:Author: Abdul Fattah Abu Ghuddah رح -:Status: Read -:Group: Reading -:STARTED: <2024-03-17 Sun> -:FINISHED: <2024-04-05 Fri> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 19 -:DAYS_SINCE_FINISHED: 597 -:END: -*** Naqshe Hayat -:PROPERTIES: -:Author: Shaykh Husain Ahmad Madani رح -:Status: Read -:Group: Reading -:STARTED: <2025-07-24 Thu> -:FINISHED: <2025-09-09 Tue> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 47 -:DAYS_SINCE_FINISHED: 75 -:END: -*** The Tafsir of Surah Nuh -:PROPERTIES: -:Author: Shaykh Abdul Raheem sahib DB -:Status: Read -:Group: Reading -:STARTED: <2024-09-24 Tue> -:FINISHED: <2025-09-10 Wed> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 351 -:DAYS_SINCE_FINISHED: 74 -:END: -*** The Path To Perfection -:PROPERTIES: -:Author: Shaikh Masihullah Khan -:Status: Read -:Group: Reading -:STARTED: <2024-07-17 Wed> -:FINISHED: <2025-09-12 Fri> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 422 -:DAYS_SINCE_FINISHED: 72 -:END: -*** An Introduction to the Science of Noble Hadith -:PROPERTIES: -:Author: Mufti Muadh Chatti DB -:Status: Reading -:Group: Reading -:STARTED: <2025-09-11 Thu> -:CATEGORY: Reading -:END: -*** Seeratul Mustafa Abridged -:PROPERTIES: -:Author: Mowlana Idrees Khandehlawi رح -:Status: Reading -:Group: Reading -:STARTED: <2025-09-12 Fri> -:CATEGORY: Reading -:END: - -*** Kanzul Bari -:PROPERTIES: -:Author: Shaykh Mufti Saiful Islam DB -:Status: Reading -:Group: Reading -:STARTED: <2025-07-24 Thu> -:CATEGORY: Reading -:END: - - -*** Hadith Scholarship in the Indian Subcontinent -:PROPERTIES: -:Author: Mawlana Muntasir Zaman -:Status: To Read -:Group: Reading -:STARTED: -:CATEGORY: To Read -:END: -*** Bidayat as-Sul Fi Tafdil ar-Rasul (The Beginning Of The Quest Of The High Esteem Of The Messenger ﷺ) -:PROPERTIES: -:Author: Imam 'Izz ibn 'Abd al-Salam رح (Translated by Aisha Bewley) -:Status: To Read -:Group: Reading -:STARTED: <2025-09-17 Wed> -:CATEGORY: To Read -:END: -*** Influence of The Noble Hadith Upon Differences of Opinion Amongst The Jurist Imams - :PROPERTIES: - :Author: Shaykh Muhammad Awwamah DB - :Status: To Read - :Group: Reading - :STARTED: - :CATEGORY: To Read - :END: -*** Muhammadﷺ: A Quranic Exposition of His Excellence and Virtues - :PROPERTIES: - :Author: Shaykh Yusuf al-Nabahani رح; Amjad Mahmood (translation) - :Status: To Read - :Group: Reading - :STARTED: - :CATEGORY: To Read - :END: - -*** Beneficial Epistle & Decisive Proof on Science of Divine Unity - :PROPERTIES: - :Author: Muhammad Salih al-Furfur رح; Amjad Mahmood (translation) - :Status: To Read - :Group: Reading - :STARTED: - :CATEGORY: To Read - :END: - -*** Seekers Aid, Manual on Creed & Hanafi Fiqh, Is'af Muridin Li -:PROPERTIES: -:Author: Abd al-Ghani al-Ghunaymi al-Maydani رح; Amjad Mahmood (translation) -:Status: To Read -:Group: Reading -:STARTED: -:CATEGORY: To Read -:END: -*** Muhammad ﷺ As If You Can See Him - :PROPERTIES: - :Author: A'id ibn 'Abdullah al-Qarni - :Status: To Read - :Group: Reading - :STARTED: - :CATEGORY: To Read - :END: - -*** How The Messenger Of Allah ﷺ Taught His Students - :PROPERTIES: - :Author: Jahangir Mahmud - :Status: To Read - :Group: Reading - :STARTED: - :CATEGORY: To Read - :END: - -*** The Life of Muhammad ﷺ - :PROPERTIES: - :Author: Imam Yahya bin Sharaf An-Nawawi رح - :Status: To Read - :Group: Reading - :STARTED: - :CATEGORY: To Read - :END: - -*** The prophet Muhammed ﷺ the best of all husbands - :PROPERTIES: - :Author: Dr. Ghazi Al-Shammari - :Status: To Read - :Group: Reading - :STARTED: - :CATEGORY: To Read - :END: - -*** The Tafsir of Surah Dahr - :PROPERTIES: - :Author: Shaykh Abdul Raheem sahib DB - :Status: To Read - :Group: Reading - :CATEGORY: To Read - :END: -*** The Tafsir of Surah Maryam - :PROPERTIES: - :Author: Shaykh Abdul Raheem sahib DB - :Status: To Read - :Group: Reading - :STARTED: <2024-10-28 Mon> - :CATEGORY: To Read - :END: -*** The Tafsir of Surah Fatiha - :PROPERTIES: - :Author: Shaykh Abdul Raheem sahib DB - :Status: To Read - :Group: Reading - :STARTED: - :CATEGORY: To Read - :END: -*** The Tafsir of Surah Yusuf -:PROPERTIES: -:Author: Shaykh Abdul Raheem sahib DB -:Status: To Read -:Group: Reading -:STARTED: -:CATEGORY: To Read -:END: -** Arabic Books -*** A المنهج المفيد لطلب علم الحديث -:PROPERTIES: -:Author: سيد عبد الماجد الغوري -:Status: Studied O -:Group: Study -:From: additional study book -:STARTED: <2024-07-20 Sat> -:Finished: <2024-08-30 Fri> -:CATEGORY: Studied O -:TOTAL_DAYS_SPENT: 41 -:DAYS_SINCE_FINISHED: 450 -:END: -*** A مختصر سيرة النبي وأصحابه العشرة -:PROPERTIES: -:Author: عبد الغني المقدسي رح -:Status: Reading -:Group: Reading -:STARTED: <2024-09-05 Thu> -:CATEGORY: Reading -:END: -*** A الإسناد من الدين وصفحة مشرقة من تاريخ سماع الحديث عند المحدثين -:PROPERTIES: -:Author: Abdul Fattah Abu Ghuddah رح -:Status: To Read -:Group: Reading -:STARTED: <2024-08-30 Fri> -:CATEGORY: To Read -:END: -** Darsi -*** A صحة ستة -**** Bukhari Shareef -:PROPERTIES: -:Author: Imam Muhammad al-Bukhari رح -:Status: To Study D -:Group: Study -:STARTED: -:CATEGORY: To Study D -:END: -**** Muslim Shareef -:PROPERTIES: -:Author: Imam Muslim ibn al-Hajjaj رح -:Status: To Study D -:Group: Study -:STARTED: -:CATEGORY: To Study D -:END: -**** Tirmizi Shareef - :PROPERTIES: - :Author: Imam al-Tirmidhi (Abu Isa Muhammad ibn Isa) رح - :Status: To Study D - :Group: Study - :STARTED: - :CATEGORY: To Study D - :END: -**** Nisai Shareef - :PROPERTIES: - :Author: Imam al-Nasa'i (Ahmad ibn Shu'ayb) رح - :Status: To Study D - :Group: Study - :STARTED: - :CATEGORY: To Study D - :END: -**** Ibn Majah Shareef - :PROPERTIES: - :Author: Imam Ibn Majah (Muhammad ibn Yazid) رح - :Status: To Study D - :Group: Study - :STARTED: - :CATEGORY: To Study D - :END: -**** Abu Dawoud Shareef - :PROPERTIES: - :Author: Imam Abu Dawood (Sulayman ibn al-Ash'ath) رح - :Status: To Study D - :Group: Study - :STARTED: - :CATEGORY: To Study D - :END: -*** A مشكاة -**** Mishkat Shareef -:PROPERTIES: -:Author: Muḥammad ibn ʻAbd Allāh Khatib Al-Tabrizi رح -:Status: Studied D -:Group: Study -:STARTED: <2024-08-12 Mon> -:FINISHED: <2025-07-18 Fri> -:CATEGORY: Studied D -:TOTAL_DAYS_SPENT: 340 -:DAYS_SINCE_FINISHED: 128 -:END: -**** Jalalayn -:PROPERTIES: -:Author: Tafsir al-Jalalayn by Jalal ad-Din al-Mahalli and Jalal ad-Din as-Suyuti رح -:Status: Studied D -:Group: Study -:STARTED: <2024-08-12 Mon> -:FINISHED: <2025-07-18 Fri> -:CATEGORY: Studied D -:TOTAL_DAYS_SPENT: 340 -:DAYS_SINCE_FINISHED: 128 -:END: -**** Hidaya 3 -:PROPERTIES: -:Author: Imam murghinani رح -:Status: Studied D -:Group: Study -:STARTED: <2024-08-12 Mon> -:FINISHED: <2025-07-18 Fri> -:CATEGORY: Studied D -:TOTAL_DAYS_SPENT: 340 -:DAYS_SINCE_FINISHED: 128 -:END: -**** Hidaya 4 -:PROPERTIES: -:Author: Imam murghinani رح -:Status: Studied D -:Group: Study -:STARTED: <2024-08-12 Mon> -:FINISHED: <2025-07-18 Fri> -:CATEGORY: Studied D -:TOTAL_DAYS_SPENT: 340 -:DAYS_SINCE_FINISHED: 128 -:END: -*** English Books -**** Tasheel Nahw -:PROPERTIES: -:Author: maulana mushtaq ahmad charthawli رح -:Status: Studied D -:Group: Study -:STARTED: <2019-07-01 Mon> -:Finished: <2022-07-01 Fri> -:CATEGORY: Studied D -:TOTAL_DAYS_SPENT: 1096 -:DAYS_SINCE_FINISHED: 1241 -:END: -**** Hadith Terminology and Classification, A handbook. -:PROPERTIES: -:Author: Muhammad S. ar-Rahwan -:Status: To Study O -:Group: Study -:From: additional study book -:STARTED: -:CATEGORY: To Study O -:END: - -*** References/Sharh -**** A تفسير أبي السعود -:PROPERTIES: -:Author: أبي السعود محمد العمادي رح -:Volumes: 9 -:Status: Voluminous -:Group: Study -:CATEGORY: Voluminous -:END: -**** A مرقاۃ المفاتیح شرح مشکوۃ المصابیح -:PROPERTIES: -:Author: Mullah Ali Qari رح -:Volumes: 11 -:Status: Voluminous -:Group: Study -:CATEGORY: Voluminous -:END: -**** A عمدة القاري شرح صحيح البخاري -:PROPERTIES: -:Author: Allamah Ayni رح -:Volumes: 20 -:Status: Voluminous -:Group: Study -:STARTED: <2025-05-29 Thu> -:CATEGORY: Voluminous -:END: - -** Guide -:Status: Reading | To Read | Read | Studying D | Studying O | To Study D | To Study O | Studied D | Studied O | Reference | Voluminous -:Group: Reading | Study -:Agenda: Books I am Studying (Darsi) | Books I am Studying (Outside) | Books To Study (Darsi) | Books To Study (Outside) | Books Studied (Darsi) | Books Studied (Outside) | Reference Books | Voluminous Books - -* Other Books -** The Science of Self-Discipline -:PROPERTIES: -:Author: Peter Hollins -:Status: Others Read -:Group: Other -:STARTED: <2024-12-27 Fri> -:FINISHED: <2025-05-24 Sat> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 148 -:DAYS_SINCE_FINISHED: 183 -:END: -** So good they cant ignore you -:PROPERTIES: -:Author: Cal newport -:Status: Others Read -:Group: Other -:STARTED: <2025-05-25 Sun> -:FINISHED: <2025-06-15 Sun> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 21 -:DAYS_SINCE_FINISHED: 161 -:END: -** The Clean Coder -:PROPERTIES: -:Author: Robert C. Martin -:Status: Others Read -:Group: Other -:STARTED: <2025-07-15 Tue> -:FINISHED: <2025-07-27 Sun> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 12 -:DAYS_SINCE_FINISHED: 119 -:END: -** Clean Code -:PROPERTIES: -:Author: Robert C. Martin -:Status: Others Reading -:Group: Other -:STARTED: <2025-07-28 Mon> -:CATEGORY: Reading -:END: -** The Toyota Way -:PROPERTIES: -:Author: Jeffry Liker -:Status: Others Read -:Group: Other -:STARTED: <2025-10-13 Mon> -:FINISHED: <2025-11-22 Sat> -:CATEGORY: Read -:TOTAL_DAYS_SPENT: 40 -:DAYS_SINCE_FINISHED: 1 -:END: -** Agile Testing -:PROPERTIES: -:Author: Lisa Crispin -:Status: Others Reading -:Group: Other -:STARTED: <2025-10-13 Mon> -:CATEGORY: Reading -:END: - - - -** Guide: -:Status: Others Reading | Others Read | Others To Read -:Group: Other diff --git a/20250727120306-nextcloud.org b/20250727120306-nextcloud.org old mode 100644 new mode 100755 diff --git a/20250727120306-nextcloud.org~ b/20250727120306-nextcloud.org~ deleted file mode 100644 index 49c38df..0000000 --- a/20250727120306-nextcloud.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 56f39be4-1108-4020-be5a-1f3a0fbf96fa -:END: -#+title: nextcloud - diff --git a/20250727121051-networking_moc.org b/20250727121051-networking_moc.org old mode 100644 new mode 100755 diff --git a/20250727122406-database_main.org~ b/20250727122406-database_main.org~ deleted file mode 100644 index a9f09c5..0000000 --- a/20250727122406-database_main.org~ +++ /dev/null @@ -1,7 +0,0 @@ -:PROPERTIES: -:ID: e448cd99-afee-4702-947f-644bb34dc1aa -:END: -#+title: database-main -#+filetags: :database:index: - -[[id:939e301b-6463-46a8-b57e-0af606e7e7ef][postgres]] diff --git a/20250727122406-database_moc.org b/20250727122406-database_moc.org old mode 100644 new mode 100755 diff --git a/20250727122406-database_moc.org~ b/20250727122406-database_moc.org~ deleted file mode 100644 index 3d6cc61..0000000 --- a/20250727122406-database_moc.org~ +++ /dev/null @@ -1,7 +0,0 @@ -:PROPERTIES: -:ID: e448cd99-afee-4702-947f-644bb34dc1aa -:END: -#+title: database_moc -#+filetags: :moc: - -[[id:939e301b-6463-46a8-b57e-0af606e7e7ef][postgres]] diff --git a/20250727174809-books_main.org~ b/20250727174809-books_main.org~ deleted file mode 100644 index 5964f1d..0000000 --- a/20250727174809-books_main.org~ +++ /dev/null @@ -1,12 +0,0 @@ -:PROPERTIES: -:ID: 63314cff-3a3f-49b4-9e76-4a359c51f55f -:END: -#+title: books-main -#+filetags: :index:books: - - -* Notes for books: [[id:2706598f-e6aa-4e88-8d24-5f699bd22787][Book Notes]] - -* Recommendations for books: [[id:238ff7d8-db22-41e2-8aad-fc3c778e6248][book-recs]] - -* [[id:363dbdfa-f23c-4f7e-a6f3-6d34f78984bb][books-org-agenda]] diff --git a/20250727174809-books_moc.org b/20250727174809-books_moc.org old mode 100644 new mode 100755 index 3a968b4..6bb7d68 --- a/20250727174809-books_moc.org +++ b/20250727174809-books_moc.org @@ -1,12 +1,12 @@ :PROPERTIES: :ID: 63314cff-3a3f-49b4-9e76-4a359c51f55f :END: -#+title: books_moc +#+title: Books MOC #+filetags: :moc:books: -* Notes for books: [[id:2706598f-e6aa-4e88-8d24-5f699bd22787][book_notes]] +* Notes for books: [[id:2706598f-e6aa-4e88-8d24-5f699bd22787][Book Notes]] -* Recommendations for books: [[id:238ff7d8-db22-41e2-8aad-fc3c778e6248][book-recs]] +* Recommendations for books: [[id:238ff7d8-db22-41e2-8aad-fc3c778e6248][Book Recs]] -* [[id:363dbdfa-f23c-4f7e-a6f3-6d34f78984bb][books-org-agenda]] +* [[id:363dbdfa-f23c-4f7e-a6f3-6d34f78984bb][Books Org Agenda]] diff --git a/20250727174809-books_moc.org~ b/20250727174809-books_moc.org~ deleted file mode 100644 index b17112b..0000000 --- a/20250727174809-books_moc.org~ +++ /dev/null @@ -1,12 +0,0 @@ -:PROPERTIES: -:ID: 63314cff-3a3f-49b4-9e76-4a359c51f55f -:END: -#+title: books-moc -#+filetags: :moc:books: - - -* Notes for books: [[id:2706598f-e6aa-4e88-8d24-5f699bd22787][Book Notes]] - -* Recommendations for books: [[id:238ff7d8-db22-41e2-8aad-fc3c778e6248][book-recs]] - -* [[id:363dbdfa-f23c-4f7e-a6f3-6d34f78984bb][books-org-agenda]] diff --git a/20250727174903-book_recs.org b/20250727174903-book_recs.org old mode 100644 new mode 100755 diff --git a/20250727174903-book_recs.org~ b/20250727174903-book_recs.org~ deleted file mode 100644 index 662be68..0000000 --- a/20250727174903-book_recs.org~ +++ /dev/null @@ -1,11 +0,0 @@ -:PROPERTIES: -:ID: 238ff7d8-db22-41e2-8aad-fc3c778e6248 -:END: -#+title: book-recs -#+filetags: :books:list: - - -* [[https://www.youtube.com/watch?v=qF6LQX-9p2I&list=LL&index=1&ab_channel=EmacsElements][Link]] -- The Unix Programming Environment by Brian W. Kernighan and Rob Pike -- An Introduction to Programming in Emacs Lisp by Robert J. Chassell -- GNU Emacs Manual by Richard M, Stallman diff --git a/20250727221512-clean_code.org b/20250727221512-clean_code.org old mode 100644 new mode 100755 diff --git a/20250727221512-clean_code.org~ b/20250727221512-clean_code.org~ deleted file mode 100644 index 0a4e695..0000000 --- a/20250727221512-clean_code.org~ +++ /dev/null @@ -1,612 +0,0 @@ -:PROPERTIES: -:ID: dd55d635-59de-4ed9-8ff0-423782c2e0ae -:TYPE: Book -:AUTHOR: Robert C. Martin -:DATE_STARTED: <2025-07-28 Mon> -:DATE_ENDED: -:END: -#+title: clean-code -#+filetags: :books: - -* Chapter 1: Clean Code - -Referenced Items: -- Implementation Patterns, Kent Beck, Addison-Wesley, 2007. -- Literate Programming, Donald E. Knuth, Center for the Study of Language and Information, Leland Stanford Junior University, 1992. - -Principles mentioned: -Single Responsibility Principle (SRP), the Open Closed Principle (OCP), and the Dependency Inversion Principle (DIP) - -* Chapter 2: Meaningful Names - -** Use intention revealing names: - -Names should reveal intent, there is no revelation in naming an integer ~d~, intending it stands for days. Instead, you should use the following names: -#+begin_src java - int elapsedTimeInDays; - int daysSinceCreation; - int daysSinceModification; - int fileAgeInDays; -#+end_src - -** Avoid disinformation - -Don't postfix the word 'list' to the name 'accounts' unless it's actually a list. This is because the reader will /assume/ the data type of accountsList is indeed a list, instead choose a name like ~accountsGroup~. - -** Make Meaningful Distinctions - -While it is possible to name by being disinformative, it is also possible to name being non informative. Consider: - -#+begin_src java - - public static void copyChars(char a1[], char a2[]) { - for (int i = 0; i < a1.length; i++) { - a2[i] = a1[i]; - } - } - -#+end_src - -What on earth does ~a[1]~ and ~a[2]~ even stand for? We are better off using names like source and destination (due to the function's intent of copying the array). - -Furthermore, noise words are redundant. We should never use the word ~variable~ when naming a variable, or ~table~ when naming a table. -** Use Pronouncable Names - -This is quite straightforward. Do not use a name like ~genymdhms~ to refer to generation date, year, month, day, hour, minute, -and second. Instead use ~generationTimeStamp~. - -** Use Searchable Names - -In modern IDE's, it is still quite difficult to search for single-lettered variables. The writer states a personal preference of using single-letter names only as local variables and inside short methods. The following principle is given: - -/The length of a name should correspond to the size of its scope/ - -** Avoid Encodings - -Don't prefix variables with letters like m_ as was done in the past. Do not type encode as well, an example of this is: ~PhoneNumber phoneString;~ we can see the reader being misled into thinking the phone number is a String. - -** Avoid Mental Mappings - -Clarity is king, don't use a name for a variable that only you know what it stands for. For example: using the letter r as the lower-cased version of the url with the host and scheme -removed. That's being smart, not professional. - -** Class Names - -#+BEGIN_QUOTE -Classes and objects should have noun or noun phrase names like Customer, WikiPage, -Account, and AddressParser. Avoid words like Manager, Processor, Data, or Info in the name -of a class. A class name should not be a verb. -#+END_QUOTE - -{{{epigraph_single(Classes and objects should have noun or noun phrase names like Customer\, WikiPage\, -Account\, and AddressParser. Avoid words like Manager\, Processor\, Data\, or Info in the name -of a class. A class name should not be a verb)}}} - -** Method Names - -Methods should have verb or verb phrase names. - -** Don't be cute/Don't use puns - -Do not use names that are only understandable to people whom you share jokes etc with. Furthermore, do not use colloquialism and slang in names. -- Example: ~HandGrenade~ instead of ~DeleteItems~ -- Example: ~whack()~ instead of ~kill()~ - -** Pick one word per concept - -If you have multiple choices for naming a concept, use one and stick with it. For instance if your options are fetch, get and retrieve, use one and stick with it throughout. - -** Solution Domain Names and Problem Domain Names - -Where possible use solution domain names, as the people that are going to be reading the code are programmers. Therefore, do not shy away from using CS terms, algorithm names, math names and so forth. - -However when it is not possible to use solution domain names (in other words, when there is no "programmer-eese" then use the name from the problem domain. The other programmers can ask the domain expert for clarification. If the code is more to do with the problem domain concepts, then the names should be drawn from them. - -** Add Meaningful Context - -Enclose names with well-named classes, functions, or namespaces. When all else fails, then prefix with something that provides more context. - -** Don't add gratuitous context - -Shorter names are better than longer ones, generally. This is so long as the context and intent is clear. Don't add redundant or irrelevant additions to the name in the for the sake of 'context'. - -* Chapter 3: Functions - -** Functions should be small - -Functions should be extremely short—ideally just a few lines, so they remain easy to understand and maintain. - -Avoid deeply nested blocks; keep indentation shallow (1–2 levels), often replacing blocks with descriptive function calls. - -A small function tells a concise, self-contained story, making it easier for readers to follow the program’s intent. - -The smaller the function, the more descriptive and accurate its name can be, improving self-documentation. - -Large functions hide complexity and mix abstraction levels, making errors and duplication more likely. - -** Do One Thing & One Level of Abstraction - -A function should do exactly one conceptual task, and all its statements should exist at the same abstraction level. - -Mixing details (like string concatenation) with high-level actions (like rendering a page) causes confusion. - -The Stepdown Rule: organise functions so they read like a top down narrative, each calling the next abstraction level. - -If you can extract a subfunction with a name that isn’t a restatement, the original function is doing too much. - -Functions that “do one thing” cannot be logically split into sections such as “initialize,” “process,” “finalize.” - -** Switch Statements - -Switch statements naturally violate “do one thing” by handling multiple cases; they also grow in size over time. - -They break the Single Responsibility Principle (multiple reasons to change) and Open-Closed Principle (must change for new cases). - -Preferred approach: hide switch statements inside a factory and dispatch behavior polymorphically through an interface. - -Allow only one visible switch in your system, used solely for object creation, then encapsulate it. - -This removes duplication and keeps high-level code unaware of concrete type distinctions. - -Example: - -#+begin_src java - public abstract class Employee { - public abstract boolean isPayday(); - public abstract Money calculatePay(); - public abstract void deliverPay(Money pay); - } - ----------------- - public interface EmployeeFactory { - public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType; - } - ----------------- - public class EmployeeFactoryImpl implements EmployeeFactory { - public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType { - switch (r.type) { - case COMMISSIONED: - return new CommissionedEmployee(r) ; - case HOURLY: - return new HourlyEmployee(r); - case SALARIED: - return new SalariedEmploye(r); - default: - throw new InvalidEmployeeType(r.type); - } - } - } - -#+end_src - -** Use Descriptive Names - -A function’s name should clearly state its purpose. Long, descriptive names beat short, cryptic ones. - -Consistent naming patterns (shared verbs/nouns) help code read like a coherent story and aid predictability. - -Descriptive names reduce the need for comments and improve comprehension without external documentation. - -Renaming functions can reveal design improvements, so try multiple options until the best emerges. - -IDE refactoring tools make renaming safe, encouraging experimentation. - -** Function Arguments - -{{{epigraph_single(The ideal number of arguments for a function is zero (niladic). Next comes one (monadic)\, followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification—and then shouldn’t be used anyway.)}}} - -Fewer arguments = better; aim for 0–2, avoid more than 3 unless absolutely necessary. - -Flag arguments (booleans) are a red flag—they imply the function does multiple things. - -Group related parameters into objects (e.g., ~Point~ for ~x~ and ~y~) to reduce argument count and improve clarity. - -Output arguments are confusing—prefer returning values or mutating the owning object’s state. - -Match function/argument names in verb–noun or keyword style (e.g., ~writeField(name)~, ~assertExpectedEqualsActual~). - -** Have No Side Effects - -A function should do only what its name promises. Hidden state changes are misleading and dangerous. - -Side effects create temporal coupling, meaning the function must be called in a certain sequence to be safe. - -If unavoidable, make side effects explicit in the name (e.g., ~checkPasswordAndInitializeSession~). - -Clear separation of command and query functions avoids ambiguity in meaning and intent. - -Functions that modify state and return information often cause confusion and should be split. - -** Error Handling - -Error handling is a single responsibility—separate it from normal logic to keep both paths clear. - -Prefer exceptions over error codes to avoid cluttering the happy path and to reduce dependency magnets. - -Extract try/catch bodies into their own functions for cleaner structure. - -See below: - -#+begin_src java - - public void delete(Page page) { - try { - deletePageAndAllReferences(page); - } - catch (Exception e) { - logError(e); - } - } - - private void deletePageAndAllReferences(Page page) throws Exception { - deletePage(page); - registry.deleteReference(page.name); - configKeys.deleteKey(page.name.makeKey()); - } - private void logError(Exception e) { - logger.log(e.getMessage()); - } - -#+end_src - -Keep functions small enough that occasional multiple return or break statements are acceptable. - -Avoid duplication in error handling, and follow the DRY principle to ensure changes occur in one place. - - -* Chapter 4: Comments - -Comments are a necessary evil—they exist because code fails to express intent clearly. - -Outdated comments are dangerous; they can mislead more than help. - -Strive to write code that explains itself; comments should be minimized. - -Truth is always in the code, not in the comments. - -** Comments Do Not Make Up for Bad Code - -Don’t use comments to excuse messy, unclear code—clean the code instead. - -Clear, expressive code with few comments > cluttered code with many comments. - -#+begin_src java - - // Check to see if the employee is eligible for full benefits - if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)) - - // Better: - if (employee.isEligibleForFullBenefits()) - -#+end_src - -** Good Comments - -Only write them when unavoidable. - -** Legal Comments - -Sometimes required for copyright/licensing. - -Keep them short; refer to standard licenses rather than embedding full legal text. - -** Informative Comments - -Explain return values, formats, or patterns. - -Prefer naming/structuring code to make such comments unnecessary. - -#+begin_src java - - // format matched kk:mm:ss EEE, MMM dd, yyyy - Pattern timeMatcher = Pattern.compile("\\d*:\\d*:\\d* \\w*, \\w* \\d*, \\d*"); - -#+end_src - - -** Explanation of Intent - -Describe why a certain approach was chosen. - -Helps future maintainers understand reasoning behind code. - -return 1; // we are greater because we are the right type. - -** Clarification - -Translate obscure values into readable terms. - -Useful when working with unchangeable APIs/libraries, but risky if incorrect. - -** Warning of Consequences - -Alert others about performance, thread-safety, or side effects. - -// SimpleDateFormat is not thread safe, so create each instance independently. - -** \TODO\ Comments - -Mark incomplete work or planned improvements. - -Should be reviewed regularly; not an excuse for bad code. - -** Amplification - -Highlight the importance of seemingly small details. - -// the trim is real important. It removes starting spaces... - -** Javadocs in Public APIs - -Public APIs should have clear documentation. - -Javadocs can also mislead—keep them accurate and up-to-date. - -** Don’t Use a Comment When You Can Use a Function or Variable - -Replace explanatory comments with expressive variable or function names. - -Refactor code to remove comment redundancy. - -** Position Markers - -Avoid decorative banners like // Actions ///////////////////////—they add clutter. - -Use sparingly and only for meaningful grouping. - -Overuse makes them blend into background noise. - -** Closing Brace Comments - -Comments on closing braces (} // while) are unnecessary for small, well-structured functions. - -Prefer short, clear functions over brace markers. - -** Attributions and Bylines - -Don’t add personal tags like /* Added by Rick */—use version control for authorship history. - -Such comments become outdated and irrelevant over time. - -** Commented-Out Code - -Never keep old code commented out; delete it and rely on version control history. - -Commented-out code adds clutter and confuses future maintainers. - -#+begin_src java - - // Old cruft that should be deleted: - //hdrPos = bytePos; - //dataPos = bytePos; - -#+end_src - -** HTML Comments - -Avoid HTML markup inside code comments—it makes them harder to read in the editor. - -Let documentation tools (like Javadoc) handle formatting. - -** Nonlocal Information - -Comments should describe nearby code only, not unrelated parts of the system. - -Avoid embedding global/system details that the function can’t control. - -** Too Much Information - -Avoid long, unnecessary historical or technical explanations. - -Keep only relevant context (e.g., “RFC 2045” reference is fine, not the full spec). - -** Inobvious Connection - -Ensure the relationship between comment and code is clear. - -Don’t make readers guess what part of the code the comment refers to. - -#+begin_src java - - // plus filter bytes ... but which part is “filter”? - this.pngBytes = new byte[((this.width + 1) * this.height * 3) + 200]; - -#+end_src - -** Function Headers - -Short, single-purpose functions with good names don’t need header comments. - -Let the function name explain the purpose. - -** Javadocs in Nonpublic Code - -Javadocs are useful for public APIs, but excessive formality in internal code is just noise. - -Internal methods should be self-explanatory without full doc comments. - -** Example: Refactored Prime Generator - -Original code: Over-commented, with redundant explanations and irrelevant history. - -Refactored version: Only two comments remain—both explain why, not what. - -One eases the reader into the algorithm. - -One explains rationale for using the square root as a loop limit. - - -* Chapter 5: Formatting -** Vertical Formatting (Clean Code, Ch.5) - -*** Vertical Formatting -- Vertical openness (blank lines) separates concepts and improves readability. -- Too much density makes code look like a muddle and harder to scan. - -*** Vertical Density -- Tightly related lines should appear vertically dense. -- Avoid useless comments that interrupt association. -- Example (bad): -#+BEGIN_SRC java - public class ReporterConfig { - /** - ,* The class name of the reporter listener - ,*/ - private String m_className; -#+END_SRC - -- Example (better): -#+BEGIN_SRC java -public class ReporterConfig { -private String m_className; -private List m_properties = new ArrayList<>(); -#+END_SRC - -*** Vertical Distance -- Related concepts should be kept close together to reduce scrolling and searching. -- Local variables → as close to use as possible, usually at top of function. -- Control variables → declared inside loop headers. -- Instance variables → declared at the top of class (common Java convention). - -#+BEGIN_SRC java -for (Test each : tests) { - count += each.countTestCases(); -} -#+END_SRC - -- Dependent functions: caller above callee for natural top-down reading. -#+BEGIN_SRC java -public Response makeResponse(...) { - String pageName = getPageNameOrDefault(request, "FrontPage"); - loadPage(pageName, context); - return makePageResponse(context); -} - -private String getPageNameOrDefault(Request request, String defaultPageName) { ... } -#+END_SRC - -*** Conceptual Affinity -- Group functions with similar naming or shared purpose. -- Example (JUnit assert methods): -#+BEGIN_SRC java -static public void assertTrue(String message, boolean condition) { ... } -static public void assertTrue(boolean condition) { ... } -static public void assertFalse(String message, boolean condition) { ... } -static public void assertFalse(boolean condition) { ... } -#+END_SRC - -*** Vertical Ordering -- Organise code top down: - - High-level concepts first (main logic). - - Lower-level details later. -- Readers can skim like a newspaper: important first, details last. -- Contrast: C/C++ require declarations before use, Java does not. - -*** Summary - vertical -- Use vertical openness to separate concepts. -- Use vertical density to group related ones. -- Keep related variables, methods, and concepts close together. -- Order code top down for natural readability. - -** Horizontal Formatting - -Keep lines short — most professional code naturally stays within ~45 characters, with ~80 as an upper bound. Lines beyond 100–120 characters are generally careless. - -Avoid shrinking font or overly wide monitors to fit more code — readability > fitting more characters. - -Example limit guideline: - -#+begin_src java - // Good (short) - int sum = a + b + c; - - // Bad (too long) - int sum = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q; -#+end_src -** Horizontal Openness and Density - -Use spaces to separate low-precedence operators (e.g., +, -, =) and improve readability. - -Do not put spaces between function names and parentheses — they are closely related. - -Example (Quadratic formula formatting): - -#+begin_src java - return (-b + Math.sqrt(determinant)) / (2*a); -#+end_src - -Separate arguments with spaces after commas to show distinct parameters. - -** Horizontal Alignment -Avoid aligning variable declarations or assignments in columns — it draws the eye to the wrong place. - -Long aligned lists usually mean the class is too large and should be split. - -Example (preferred unaligned): - -#+begin_src java - // Prefer this: - private Socket socket; - private InputStream input; - private OutputStream output; - - //instead of: - private Socket socket; - private InputStream input; - private OutputStream output; - -#+end_src - -** Indentation - -Indent according to scope hierarchy: - -Classes → no indent - -Methods → 1 level - -Method bodies → 2 levels - -Inner blocks → +1 for each nesting - -Indentation makes scopes visually obvious; without it, code is hard to scan. - -Avoid collapsing scopes onto one line — always use braces and proper indenting. - -** Dummy Scopes - -Avoid dummy bodies in loops (e.g., empty while or for loops). - -If unavoidable, place semicolon on its own indented line to make it visible. - -#+begin_src java - while (dis.read(buf, 0, size) != -1) - ; -#+end_src - -** Team Rules - -Teams must agree on a single formatting style for consistency. - -Use IDE formatters to enforce these rules across all files. - -Consistent formatting builds trust and reduces mental load for readers. - -** Uncle Bob’s Formatting Rules (Example in CodeAnalyzer.java) - -Short, clear methods with consistent spacing and indentation. - -Use spaces around assignment and low-precedence operators, no space for high-precedence operators. - -Avoid deeply nested structures — prefer clear, flat logic. - -Example snippet: - -#+begin_src java - private void measureLine(String line) { - lineCount++; - int lineSize = line.length(); - totalChars += lineSize; - lineWidthHistogram.addLine(lineSize, lineCount); - recordWidestLine(lineSize); - } -#+end_src diff --git a/20250804201706-big_o_complexity.org b/20250804201706-big_o_complexity.org old mode 100644 new mode 100755 diff --git a/20250804201706-big_o_complexity.org~ b/20250804201706-big_o_complexity.org~ deleted file mode 100644 index ad11dea..0000000 --- a/20250804201706-big_o_complexity.org~ +++ /dev/null @@ -1,115 +0,0 @@ -:PROPERTIES: -:ID: 275988a8-59d8-40c8-a8b4-47118d6eb834 -:END: -#+title: big-o-complexity -#+filetags: :leetcode:notes: -#+OPTIONS: toc:t - -* Big (O) - Time and Space Complexity -** Intro -Time Complexity: Describes the amount of time necessary to execute an algorithm - -Space Complexity: Describes the amount of memory or space utilized by an algorithm/program - -Both - asymptotically - - -** Technical Definition of Big O - -is a mathematical notation that describes the limiting behaviour of a function when the arguments tend towards a particular value or infinity. Why do we need it? it helps us understand how the performance of an algorithm changes as the size of the input grows, providing a simple way to compare and analyse different algorithms' efficiency. - -Improvement in time complexity is often more important as memory is cheap and readily available - -In Big O, there are six major types of complexities (time and space): - -- Constant: O(1) - -- Linear time: O(n) - -- Logarithmic time: O(n log n) - -- Quadratic time: O(n^2) - -- Exponential time: O(2^n) - -- Factorial time: O(n!) - - -** Big O - linear example - -Suppose we are given a problem where we have a list of `N` numbers of unknown length. We are asked to use code to find and return "True" if the number 2 is in the list and "False" otherwise. Our solution could be to go through every position in the list and check if the number at that position is equal to 2. - -[3, 10, 2, 7] - -#+begin_src python - for number in list: - if number == 2: - return True - else: - continue - return False -#+end_src - -This would take N time, we need to check every number in the list once, making this solution O(N) - linear time. This looks at the worst case scenarion, if 2 was at the start of the list we know it would take a constant time, however if it's at the end then it would take N time. - -[[~/master-folder/org_files/org_roam/assets/Big-O-Notation-3130482830.png]] - - -In the graph above focus on the tail end of the graphs because Big O is concerned with "as the input size grows what happens to the speed of the operations". - -+------------+--------------+----------------------------------+------------------------------------+----------------------+ -| Complexity | Name | Description | Common Use Cases | Performance at Scale | -+------------+--------------+----------------------------------+------------------------------------+----------------------+ -| O(1) | Constant | Runtime unaffected by input size | Hash tables, array access | Excellent | -+------------+--------------+----------------------------------+------------------------------------+----------------------+ -| O(log n) | Logarithmic | Runtime increases slowly | Binary search, balanced trees | Very good | -| | | (typically halved at each step) | | | -+------------+--------------+----------------------------------+------------------------------------+----------------------+ -| O(n) | Linear | Runtime scales linearly | Linear search, array traversal | Good | -| | | (proportional) | | | -+------------+--------------+----------------------------------+------------------------------------+----------------------+ -| O(n log n) | Linearithmic | Between linear and quadratic | Efficient sorting algorithms | Fair | -| | | (often seen in divide and conquer| | | -| | | algorithms) | | | -+------------+--------------+----------------------------------+------------------------------------+----------------------+ -| O(n²) | Quadratic | Runtime squares with input size | Nested loops, simple sorting | Poor | -+------------+--------------+----------------------------------+------------------------------------+----------------------+ -| O(2ⁿ) | Exponential | Runtime doubles with each input | Recursive solutions, combinatorics | Very poor | -+------------+--------------+----------------------------------+------------------------------------+----------------------+ -| O(n!) | Factorial | Runtime grows by factorial | Permutations, traveling salesman | Terrible | -| | | (extremely slow) | | | -+------------+--------------+----------------------------------+------------------------------------+----------------------+ - - -** Summation of complexities: - -When you have multiple operations in an algorithm that each have a linear time complexity O(n), and these operations are sequential (not nested), the overall time complexity of the algorithm remains linear, O(n). - -Here's how it works: - -1. Summing Linear Operations: If your algorithm involves several separate linear operations, such as: -• First iterating over an array of n elements, -• Then, in a separate loop, iterating over the same or another array of n elements, -• And perhaps another loop doing the same, -each operation has a complexity of O(n). If you sum these, the resulting complexity for these sequential operations is O(n) + O(n) + O(n), and so on. - -2. Simplification: According to Big O notation rules, when you add complexities of the same order, the overall complexity is dominated by the term that grows fastest as n increases. For linear operations, O(n) + O(n) + O(n) simplifies to O(n) because the growth rate in terms of the largest input size n doesn't change-it remains linear. - - -Linear time complexity, denoted as O(n), means that the time required to complete the execution of an algorithm increases linearly with the increase in the size of the input data. In essence, if you double the size of the input, you double the time it takes to process it. - -Suppose you have a task to sum the number 5, n times. The number of operations (in this case, additions) you perform directly corresponds to n. For instance: - -- If n = 1, you perform the operation 1 time: 5. -- If n = 2, you perform the operation 2 times: 5+5. -- If n = 3, you perform the operation 3 times: 5+5+5. -- And so on... - -In each of these cases, the number of addition operations you perform is exactly equal to n. The computational cost grows directly with n, which is the very definition of linear time complexity. Here's a breakdown: - -- When n = 1, the number of operations is 1. -- When n = 10, the number of operations is 10. -- When n = 100, the number of operations is 100. -- When n = 1000, the number of operations is 1000. - -In general, the total time taken for this task can be described as a function T(n) = n, where T(n) represents the total time or total number of operations, and n is the number of times you need to add 5. This function is a straight line when plotted against n, hence it is classified under linear time complexity O(n). diff --git a/20250804212215-how_to_solve_leetcode.org b/20250804212215-how_to_solve_leetcode.org old mode 100644 new mode 100755 diff --git a/20250804212215-how_to_solve_leetcode.org~ b/20250804212215-how_to_solve_leetcode.org~ deleted file mode 100644 index f7c4d06..0000000 --- a/20250804212215-how_to_solve_leetcode.org~ +++ /dev/null @@ -1,13 +0,0 @@ -:PROPERTIES: -:ID: 086ca3ca-39ec-4d37-b56d-b6d9f51e6873 -:END: -#+title: how-to-solve-leetcode -#+filetags: :leetcode:notes: - -* Process: - -- Read the problem twice to understand it - -- Try think basically of different ways to solve the problem - -- diff --git a/20250804212606-leetcode_arrays.org b/20250804212606-leetcode_arrays.org old mode 100644 new mode 100755 diff --git a/20250804212606-leetcode_arrays.org~ b/20250804212606-leetcode_arrays.org~ deleted file mode 100644 index 21537a6..0000000 --- a/20250804212606-leetcode_arrays.org~ +++ /dev/null @@ -1,330 +0,0 @@ -:PROPERTIES: -:ID: 93a43a24-6861-40c4-b45b-581977bb55cf -:END: -#+title: leetcode-arrays -#+filetags: :leetcode:notes: - -* 217 - Contains Duplicate: - -Given an integer array `nums`, return `true` if any value appears at least twice in the array, and return false if every element is distinct. - -*Example 1:* - -Input: nums = [1,2,3,1] - -Output: true - -Explanation: The element 1 occurs at the indices 0 and 3. - -*Example 2:* - -Input: nums = [1,2,3,4] - -Output: false - -Explanation: All elements are distinct. - -*Example 3:* - -Input: nums = [1,1,1,3,3,4,3,2,4,2] - -Output: true - -*Constraints:* - -1 <= nums.length <= 105 --109 <= nums[i] <= 109 - -** Attempt: - -Two loops -Outer loop will go through each element, inner loop will check if the element in outer loop is repeated in the array. - -#+begin_src python - class Solution(object): - def containsDuplicate(self, nums): - """ - :type nums: List[int] - :rtype: bool - """ - for i in nums: - for j in nums[i:len(nums)]: - if i == j: - return True - return False - -#+end_src - -Works? Yes, but there is a better solution - -** Solution: - -Use a [[id:3a41407c-661e-416a-80d2-4c7a137d153a][python-set]]. The reason is it does not allow for duplicates (it is unique). The solution is as follows: -We create a set from the array, then check if the length of the two are different, if they are then this indicates that there are duplicate values in the array. This is O(N) and is faster than the nested loops solution above. - -#+begin_src python - - if len(set(nums)) == len(nums): - return False - else: - return True - -#+end_src - -* 268 - Missing Number - -Given an array `nums` containing `n` distinct numbers in the range [0, n], return the only number in the range that is missing from the array. - -Example 1: -Input: nums = [3,0,1] - -Output: 2 -Explanation: n = 3 since there are 3 numbers, so all numbers are in the range [0,3]. 2 is the missing number in the range since it does not appear in nums. - -Example 2: -Input: nums = [0,1] - -Output: 2 -Explanation: n = 2 since there are 2 numbers, so all numbers are in the range [0,2]. 2 is the missing number in the range since it does not appear in nums. - -Example 3: -Input: nums = [9,6,4,2,3,5,7,0,1] - -Output: 8 -Explanation: n = 9 since there are 9 numbers, so all numbers are in the range [0,9]. 8 is the missing number in the range since it does not appear in nums. - -Constraints: - - n == nums.length - 1 <= n <= 104 - 0 <= nums[i] <= n - All the numbers of nums are unique. - -Follow up: Could you implement a solution using only O(1) extra space complexity and O(n) runtime complexity? - -** Attempt -Sort the array, loop through it and check via the incrementor - -#+begin_src python - - class Solution(object): - def missingNumber(self, nums): - """ - :type nums: List[int] - :rtype: int - """ - nums.sort() - for i in range(0, len(nums) + 1): - if i not in nums: - return i - -#+end_src - -Problem here is that sort operation is O(nlogn) - too slow. - -** Solution -One optimised solution: - -#+begin_src python - class Solution(object): - def missingNumber(self, nums): - """ - :type nums: List[int] - :rtype: int - """ - nums.sort() - n = len(nums) - total_sum = n * (n + 1) // 2 - actual_sum = sum(nums) - return total_sum - actual_sum -#+end_src - -Another: -#+begin_src python - class Solution(object): - def missingNumber(self, nums): - return sum(range(len(nums) + 1)) - sum(nums) -#+end_src - -This is O(N) -len = O(1) -Range object creation is O(1) -sum is O(N) -+1 in range(n) because n would be excluded otherwise. ie if you did range(2) you get [0,1] - -Some extra notes: -[[id:125c81dc-c14f-4b4d-93c6-0a2b157735ac][python-dictionary]] - -* 448 - Find all Numbers disappeared in an array -Given an array `nums` of `n` integers where `nums[i]` is in the range [1, n], return an array of all the integers in the range [1, n] that do not appear in nums. - -Example 1: -Input: nums = [4,3,2,7,8,2,3,1] -Output: [5,6] - -Example 2: -Input: nums = [1,1] -Output: [2] - -Constraints: - -n == nums.length -1 <= n <= 105 -1 <= nums[i] <= n - -Follow up: Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space. - -** Attempt -Create a set, loop through the set (it wont have duplicate values), if the counter is not equal to the value in the set, add it to a new list. - -#+begin_src python - class Solution(object): - def findDisappearedNumbers(self, nums): - """ - :type nums: List[int] - :rtype: List[int] - """ - new_set = set(nums) - print(new_set) - new_list = [] - for i in range(1, len(nums) + 1): - if i not in new_set: - new_list.append(i) - return new_list -#+end_src - -Time: O(N) as iterating through the range and appending to new list if not in given list. O(N) space. - -* 1 - Two Sum - -Given an array of integers `nums` and an integer `target`, return indices of the two numbers such that they add up to target. - -You may assume that each input would have exactly one solution, and you may not use the same element twice. - -You can return the answer in any order. - -Example 1: -Input: nums = [2,7,11,15], target = 9 -Output: [0,1] -Explanation: Because nums[0] + nums[1] == 9, we return [0, 1]. - -Example 2: -Input: nums = [3,2,4], target = 6 -Output: [1,2] - -Example 3: -Input: nums = [3,3], target = 6 -Output: [0,1] - -Constraints: - - 2 <= nums.length <= 104 - -109 <= nums[i] <= 109 - -109 <= target <= 109 - Only one valid answer exists. - -Follow-up: Can you come up with an algorithm that is less than O(n2) time complexity? - -** Attempt -Outer loop and inner loop - -#+begin_src python - class Solution(object): - def twoSum(self, nums, target): - """ - :type nums: List[int] - :type target: int - :rtype: List[int] - """ - ret = [] - for i in range(0, len(nums) ): - for j in range(i + 1, len(nums) ): - if nums[i] + nums[j] == target: - ret.append(nums[i]) - ret.append(nums[j]) - return ret - -#+end_src - -Bad as its O(N^2) - -** Solution -Use a hashmap and loop once - -After looking through the logic: -#+begin_src python - class Solution(object): - def twoSum(self, nums, target): - """ - :type nums: List[int] - :type target: int - :rtype: List[int] - """ - hm = {} - ret = [] - for i in range(0, len(nums)): - if (target - nums[i]) not in hm: - hm.update({nums[i]: i}) - else: - ret.append(i) - ret.append(hm.get(target - nums[i])) - return ret - -#+end_src - -[[~/master-folder/org_files/org_roam/assets/swappy-20250805-152411.png]] - -Youtube solution: -#+begin_src python - - hash_map = {} - for i , v in enumerate(nums): - if target - v in hash_map: - return i, hash_map[target - v] - else: - hash_map[v] = i - -#+end_src - -#+begin_src python - - hashMap = {} - for indx, val in enumerate(nums): - diff = target - val - if diff in hashMap: - return [indx, hashMap[diff]] - hashMap[val] = indx - -#+end_src - -* 1365 - How Many Numbers Are Smaller Than the Current Number - -Given the array `nums`, for each `nums[i]` find out how many numbers in the array are smaller than it. That is, for each `nums[i]` you have to count the number of valid j's such that j != i and nums[j] < nums[i]. - -Return the answer in an array. - -Example 1: - -Input: nums = [8,1,2,2,3] -Output: [4,0,1,1,3] -Explanation: -For nums[0]=8 there exist four smaller numbers than it (1, 2, 2 and 3). -For nums[1]=1 does not exist any smaller number than it. -For nums[2]=2 there exist one smaller number than it (1). -For nums[3]=2 there exist one smaller number than it (1). -For nums[4]=3 there exist three smaller numbers than it (1, 2 and 2). - -Example 2: - -Input: nums = [6,5,4,8] -Output: [2,1,0,3] - -Example 3: - -Input: nums = [7,7,7,7] -Output: [0,0,0,0] - -Constraints: - - 2 <= nums.length <= 500 - 0 <= nums[i] <= 100 diff --git a/20250804214537-python_set.org b/20250804214537-python_set.org old mode 100644 new mode 100755 diff --git a/20250804214537-python_set.org~ b/20250804214537-python_set.org~ deleted file mode 100644 index 7ff6d84..0000000 --- a/20250804214537-python_set.org~ +++ /dev/null @@ -1,22 +0,0 @@ -:PROPERTIES: -:ID: 3a41407c-661e-416a-80d2-4c7a137d153a -:END: -#+title: python-set -#+filetags: :python:notes: - -Sets are used to store multiple items in a single variable. - -Set is one of 4 built-in data types in Python used to store collections of data, the other 3 are List, Tuple, and Dictionary, all with different qualities and usage. - -A set is a collection which is unordered, unchangeable*, and unindexed. - -*Note: Set items are unchangeable, but you can remove items and add new items. - -Sets are written with curly brackets. -Example: - -#+begin_src python - # Create a Set: - thisset = {"apple", "banana", "cherry"} - print(thisset) -#+end_src diff --git a/20250805141906-python_dictionary.org b/20250805141906-python_dictionary.org old mode 100644 new mode 100755 diff --git a/20250805141906-python_dictionary.org~ b/20250805141906-python_dictionary.org~ deleted file mode 100644 index 30d0fad..0000000 --- a/20250805141906-python_dictionary.org~ +++ /dev/null @@ -1,63 +0,0 @@ -:PROPERTIES: -:ID: 125c81dc-c14f-4b4d-93c6-0a2b157735ac -:END: -#+title: python-dictionary -#+filetags: :python:notes: - -Dictionaries are used to store data values in key:value pairs. - -A dictionary is a collection which is ordered*, changeable and do not allow duplicates. - -*As of Python version 3.7, dictionaries are ordered. In Python 3.6 and earlier, dictionaries are unordered. - -Dictionaries are written with curly brackets, and have keys and values: - -#+begin_src python - - # Create and print a dictionary: - thisdict = { - "brand": "Ford", - "model": "Mustang", - "year": 1964 - } - print(thisdict) - -#+end_src - -Iterating: - -Iterate through Value - -To iterate through all values of a dictionary in Python using .values(), you can employ a for loop, accessing each value sequentially. This method allows you to process or display each individual value in the dictionary without explicitly referencing the corresponding keys. - -Example: In this example, we are using the values() method to print all the values present in the dictionary. - -#+begin_src python - - # create a python dictionary - d = {"name": "Geeks", "topic": "dict", "task": "iterate"} - - # loop over dict values - for val in d.values(): - -#+end_src - -Iterate through keys - -In Python, just looping through the dictionary provides you its keys. You can also iterate keys of a dictionary using built-in `.keys()` method. - -#+begin_src python - - # create a python dictionary - d = {"name": "Geeks", "topic": "dict", "task": "iterate"} - - # default loooping gives keys - for keys in d: - print(keys) - - # looping through keys - for keys in d.keys(): - print(keys) - -#+end_src - diff --git a/20250805143427-python_sorted_function.org b/20250805143427-python_sorted_function.org old mode 100644 new mode 100755 diff --git a/20250805143741-python_lambda.org b/20250805143741-python_lambda.org old mode 100644 new mode 100755 diff --git a/20250805143741-python_lambda.org~ b/20250805143741-python_lambda.org~ deleted file mode 100644 index ac29fa9..0000000 --- a/20250805143741-python_lambda.org~ +++ /dev/null @@ -1,6 +0,0 @@ -:PROPERTIES: -:ID: 9d534e89-7f0b-494c-bff6-7b3be05b85d1 -:END: -#+title: python-lambda -#+filetags: :python:notes:functions: - diff --git a/20250806111925-non_technical_moc.org b/20250806111925-non_technical_moc.org old mode 100644 new mode 100755 diff --git a/20250806111925-non_technical_moc.org~ b/20250806111925-non_technical_moc.org~ deleted file mode 100644 index 5baa1c2..0000000 --- a/20250806111925-non_technical_moc.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 565eaccd-8cf6-4dbb-bc66-a4b37367ce6b -:END: -#+title: non_technical_moc - diff --git a/20250806155335-emacs_stuff_org_publish.org b/20250806155335-emacs_stuff_org_publish.org old mode 100644 new mode 100755 diff --git a/20250806155335-emacs_stuff_org_publish.org~ b/20250806155335-emacs_stuff_org_publish.org~ deleted file mode 100644 index 5c0b9c0..0000000 --- a/20250806155335-emacs_stuff_org_publish.org~ +++ /dev/null @@ -1,158 +0,0 @@ -:PROPERTIES: -:ID: 7d2e867e-f091-4362-a583-453f732207fe -:END: -#+title: emacs-stuff-org-publish -#+filetags: :org:notes: - - -* How to insert footnotes: - -The Org website[fn:1] now looks a lot better than it used to. - -[fn:1] The link is: https://orgmode.org - -* Resources: -https://ogbe.net/blog/blogging_with_org - -https://systemcrafters.net/publishing-websites-with-org-mode/building-the-site/ - -https://orgmode.org/manual/Publishing-options.html - -https://www.orgroam.com/manual.html#Configuration - -https://www.reddit.com/r/emacs/comments/1j7febh/my_static_website_is_generated_from_org_mode_and/?chainedPosts=t3_116yit2 - -https://orgmode.org/worg/org-tutorials/org-publish-html-tutorial.html - -https://taingram.org/blog/org-mode-blog.html - - -* Extra snippets of code: - -#+begin_src emacs-lisp - ;; Commented out things: - - ;; (defvar z-head - ;; " - ;; ") - - ;; (setq org-html-validation-link nil - ;; org-html-head-include-scripts nil - ;; org-html-head-include-default-style nil - ;; org-html-head z-head) - - ;; (type-of (car '(rose violet daisy buttercup))) - ;; (cadr (assoc "FILETAGS" (org-collect-keywords '("FILETAGS")))) - - ;; (let ((list '(("post1.org") ("post2.org")))) - ;; (mapconcat (lambda (entry) - ;; (format "- [[file:%s]]" (car entry))) - ;; list - ;; "\n")) - - - ;; ("website" - ;; :components ("org-main" "org-categories-sitemap" "org-assets" "org-posts" "org-blogs" "org-static")) - ;; :html-head " - ;; - ;; - ;; - ;; " - - - (defun z/write-tag-pages () - "Generate tags/*.org pages listing posts for each tag." - (let* ((site-root (expand-file-name "~/master-folder/org_files/org_web/")) - (tags-dir (expand-file-name "tags" site-root))) - (unless (file-directory-p tags-dir) - (make-directory tags-dir t)) - (let ((idx (z/gather-tag-index))) - (maphash - (lambda (tag items) - (let* ((slug (z/tag-slug tag)) - (outfile (expand-file-name (format "%s.org" slug) tags-dir))) - (with-temp-file outfile - (insert (format "#+TITLE: Tag: %s\n#+OPTIONS: toc:nil num:nil title:nil \n\n* Posts tagged %s\n" - tag tag)) - ;; sort newest first if DATE present - (setq items (sort items (lambda (a b) (string> (nth 2 a) (nth 2 b))))) - (dolist (it items) - (let* ((file (nth 0 it)) - (title (nth 1 it)) - (rel (file-relative-name file tags-dir))) - ;; link to the source .org; org-publish will rewrite to the .html - (insert (format "- [[file:%s][%s]]\n" rel title))))))) - idx) - ;; Also write an index page listing all tag pages - ;; (let* ((all ())) - ;; (maphash (lambda (tag _items) (push tag all)) (z/gather-tag-index)) - ;; (with-temp-file (expand-file-name "index.org" (expand-file-name "tags" site-root)) - ;; (insert "#+TITLE: All Tags\n#+OPTIONS: toc:nil num:nil\n\n* Tags\n") - ;; (dolist (tag (sort all #'string-lessp)) - ;; (insert (format "- [[file:%s.org][%s]]\n" (z/tag-slug tag) tag))))) - - ))) - - -#+end_src - -* Options stuff: - -In Org mode, you can control per-file publishing behavior using special keywords (known as **file-local metadata**) at the top of the file. These are written like: - -```org -#+KEYWORD: value -``` - ---- - -Here are **useful options** you can set **per file**: - -| Keyword | Purpose | -| -------------------- | ----------------------------------------------------- | -| `#+TITLE:` | Title of the document | -| `#+AUTHOR:` | Author name | -| `#+EMAIL:` | Email address | -| `#+DATE:` | Date | -| `#+OPTIONS:` | Control export behavior (e.g. toc, num, author, etc.) | -| `#+HTML_HEAD:` | Custom HTML for `` (like styles or scripts) | -| `#+HTML_HEAD_EXTRA:` | Extra HTML inserted in `` | -| `#+HTML_PREAMBLE:` | Whether to include the preamble (`t`, `nil`, or HTML) | -| `#+HTML_POSTAMBLE:` | Same but for postamble | -| `#+LANGUAGE:` | Language used for export | -| `#+DESCRIPTION:` | Adds a `` tag | -| `#+KEYWORDS:` | Adds a `` tag | - ---- - -### ✅ Example: Disable TOC and Section Numbers *for one file* - -You can use the `#+OPTIONS:` line like so: - -```org -#+OPTIONS: toc:nil num:nil -``` - -This disables the Table of Contents and section numbers **just for that file**. - -Your updated file might look like this: - -#+BEGIN_SRC emacs-lisp -#+TITLE: Welcome to My Org Website -#+OPTIONS: toc:nil num:nil -#+HTML_HEAD: -#+HTML_HEAD: -#+END_SRC - -Here's a reference for some values you can tweak via `#+OPTIONS:`: - -| Option | Meaning | Example | -| ------------- | -------------------------------- | ---------------- | -| `toc:` | Table of contents (`t` or `nil`) | `toc:nil` | -| `num:` | Section numbering | `num:nil` | -| `author:` | Show author name | `author:nil` | -| `creator:` | Show Emacs/Org creator info | `creator:nil` | -| `date:` | Show date | `date:nil` | -| `html-style:` | Disable default style | `html-style:nil` | - - diff --git a/20250819174119-naqshe_hayat.org b/20250819174119-naqshe_hayat.org old mode 100644 new mode 100755 diff --git a/20250819174119-naqshe_hayat.org~ b/20250819174119-naqshe_hayat.org~ deleted file mode 100644 index 12d97f1..0000000 --- a/20250819174119-naqshe_hayat.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 4426cc9a-1568-4fc8-9242-269654c43a3b -:END: -#+title: naqshe-hayat - diff --git a/20250918120519-misc_moc.org b/20250918120519-misc_moc.org old mode 100644 new mode 100755 diff --git a/20250918120519-misc_moc.org~ b/20250918120519-misc_moc.org~ deleted file mode 100644 index ce85933..0000000 --- a/20250918120519-misc_moc.org~ +++ /dev/null @@ -1,7 +0,0 @@ -:PROPERTIES: -:ID: 08415f5c-986e-45a6-8ea1-f3bedcc996f0 -:END: -#+title: misc_moc -#+filetags: :misc:moc: - -* [[id:c1de3972-e932-48fd-8065-3d89dad58007][wedding_moc]] diff --git a/20250918120706-wedding_moc.org b/20250918120706-wedding_moc.org old mode 100644 new mode 100755 diff --git a/20250918120706-wedding_moc.org~ b/20250918120706-wedding_moc.org~ deleted file mode 100644 index 7db65e4..0000000 --- a/20250918120706-wedding_moc.org~ +++ /dev/null @@ -1,70 +0,0 @@ -:PROPERTIES: -:ID: c1de3972-e932-48fd-8065-3d89dad58007 -:END: -#+title: wedding_moc -#+filetags: :wedding:moc: - -* Important dates - -* Walimah Venues - -** Requirements -- 250 to 350 people -- Segregated -- External / Internal Catering (halal) -- Timing (Saturday evening) -- Prayer Facility -- Early July (or similar) -- Deposit - -** Hadley Hall -*** Details - -Bearwood Road, Birmingham, United Kingdom B66 4ES - -https://www.instagram.com/hadley.hall/?hl=en -https://www.facebook.com/p/Hadley-Hall-Banqueting-Suite-100063467019018/?locale=en_GB - -Contact Details: -- 0121 601 0955 -- 07522257044 (insta) - -Distance: 18 Minutes Drive / 51 Minutes Bus - -2 Suites. One is 200 people, the other is 450 people -Segregated Yes with 300 people -Catering is £10ph -Timing is 6-11pm (and morning too). -Prayer facility included. -Early July is good time -Deposit £500 - -Roughly £6500 (3k food, 3.5k everything else) - -<2025-09-28 Sun> : Went to view the hall, 2 halls are given for the price of 3.5k. -** Bab al Hara -*** Details -500 people segregated suite. one large hall. instagram has all details. 9.5k with catering, 6.2k without for 300 people. - -<2025-09-30 Tue> : Went to view - -** Bia Lounge -*** Details - -45-47 Golden Hillock Rd, Birmingham B10 0JU - -http://www.bialoungeweddinghall.co.uk/ - -Contact Details: - -Tel: 0121 772 7576 -Mob: 07901 553 350 - -Distance: 5 Min Drive / 27 Min Bus - -400 people -Segregated yes -Catering (in house basic is 10-12ph) -Early July yes (some dates available) -Prayer Facility included -Deposit minimum 500 diff --git a/20250926151524-workflow_moc.org b/20250926151524-workflow_moc.org old mode 100644 new mode 100755 diff --git a/20250926151524-workflow_moc.org~ b/20250926151524-workflow_moc.org~ deleted file mode 100644 index ae1d805..0000000 --- a/20250926151524-workflow_moc.org~ +++ /dev/null @@ -1,6 +0,0 @@ -:PROPERTIES: -:ID: 8CE93986-280B-45BD-9DF2-5D06586DDDE7 -:END: -#+title: workflow-moc -#+filetags: :workflow:moc: - diff --git a/20251002154125-microlise_moc.org b/20251002154125-microlise_moc.org old mode 100644 new mode 100755 diff --git a/20251002154125-microlise_moc.org~ b/20251002154125-microlise_moc.org~ deleted file mode 100644 index 2b4155b..0000000 --- a/20251002154125-microlise_moc.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: ABF4A0BE-0309-48A6-92ED-76031B3D2F86 -:END: -#+title: microlise_moc - diff --git a/20251002154204-pre_work_prep_microlise.org b/20251002154204-pre_work_prep_microlise.org old mode 100644 new mode 100755 diff --git a/20251002154204-pre_work_prep_microlise.org~ b/20251002154204-pre_work_prep_microlise.org~ deleted file mode 100644 index 1bb7fce..0000000 --- a/20251002154204-pre_work_prep_microlise.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 2BFB84B2-2129-4AE3-8E69-290CA5BF9747 -:END: -#+title: pre_work_prep_microlise - diff --git a/20251019114736-server_moc.org b/20251019114736-server_moc.org old mode 100644 new mode 100755 diff --git a/20251019114736-server_moc.org~ b/20251019114736-server_moc.org~ deleted file mode 100644 index 75f7c57..0000000 --- a/20251019114736-server_moc.org~ +++ /dev/null @@ -1,7 +0,0 @@ -:PROPERTIES: -:ID: f09cb4ed-1407-4187-9002-de2c5db13a8f -:END: -#+title: server_moc -#+filetags: :moc:server: - -[[id:2c2d8df4-ad36-40ab-9f30-8a047b372956][old_server_code]] diff --git a/20251019114758-old_nextcloud_server_code.org b/20251019114758-old_nextcloud_server_code.org old mode 100644 new mode 100755 diff --git a/20251019114758-old_nextcloud_server_code.org~ b/20251019114758-old_nextcloud_server_code.org~ deleted file mode 100644 index 96473f2..0000000 --- a/20251019114758-old_nextcloud_server_code.org~ +++ /dev/null @@ -1,71 +0,0 @@ -:PROPERTIES: -:ID: 2c2d8df4-ad36-40ab-9f30-8a047b372956 -:END: -#+title: old_cloudflare_server_code -#+filetags: :server:self-hosting: - -* wg -Shakkal123! - -docker run ghcr.io/wg-easy/wg-easy:14 node -e 'const bcrypt = require("bcryptjs"); const hash = bcrypt.hashSync("Shakkal123!", 10); console.log(hash.replace(/\$/g, "$$$$"));' - -Unable to find image 'ghcr.io/wg-easy/wg-easy:14' locally -14: Pulling from wg-easy/wg-easy -Digest: sha256:5f26407fd2ede54df76d63304ef184576a6c1bb73f934a58a11abdd852fab549 -Status: Downloaded newer image for ghcr.io/wg-easy/wg-easy:14 - -$$2a$$10$$E1lkGe/IH5EnFrQLhDH2M.yKk3Q7KlgRuu.fzf/76CbWoAMy4G83u - -* nextcloud: - -# Allow unauthenticated access to /nextcloud -location ^~ /nextcloud/ { - auth_basic off; - - proxy_pass http://localhost:8007/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - client_max_body_size 512M; - client_body_buffer_size 512k; - - add_header Referrer-Policy "no-referrer" always; - add_header X-Content-Type-Options "nosniff" always; - add_header X-Frame-Options "SAMEORIGIN" always; - add_header X-XSS-Protection "1; mode=block" always; -} - - - # iOS and calendar/carddav fixes - location ^~ /.well-known/carddav { - return 301 $scheme://$host/nextcloud/remote.php/dav; - } - - location ^~ /.well-known/caldav { - return 301 $scheme://$host/nextcloud/remote.php/dav; - } - - location ^~ /.well-known { - return 301 $scheme://$host/nextcloud/index.php$uri; - } - -* technitium - location /technitium/ { - proxy_pass http://localhost:5380/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # Rewrite path for base URL - rewrite ^/technitium/(.*)$ /$1 break; - } - - curl -X GET "https://zserver.zapto.org/portainer/api/endpoints/3/docker/containers/json?all=true" -H "X-API-Key: ptr_KFQqKse9K4Nc9M5jnpc61fpAvGzdTOXTzswz9CwOF74=" -u "admin:shakkal123" diff --git a/20251019114758-old_server_code.org~ b/20251019114758-old_server_code.org~ deleted file mode 100644 index e08e219..0000000 --- a/20251019114758-old_server_code.org~ +++ /dev/null @@ -1,71 +0,0 @@ -:PROPERTIES: -:ID: 2c2d8df4-ad36-40ab-9f30-8a047b372956 -:END: -#+title: old_server_code -#+filetags: :server:self-hosting: - -* wg -Shakkal123! - -docker run ghcr.io/wg-easy/wg-easy:14 node -e 'const bcrypt = require("bcryptjs"); const hash = bcrypt.hashSync("Shakkal123!", 10); console.log(hash.replace(/\$/g, "$$$$"));' - -Unable to find image 'ghcr.io/wg-easy/wg-easy:14' locally -14: Pulling from wg-easy/wg-easy -Digest: sha256:5f26407fd2ede54df76d63304ef184576a6c1bb73f934a58a11abdd852fab549 -Status: Downloaded newer image for ghcr.io/wg-easy/wg-easy:14 - -$$2a$$10$$E1lkGe/IH5EnFrQLhDH2M.yKk3Q7KlgRuu.fzf/76CbWoAMy4G83u - -* nextcloud: - -# Allow unauthenticated access to /nextcloud -location ^~ /nextcloud/ { - auth_basic off; - - proxy_pass http://localhost:8007/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - client_max_body_size 512M; - client_body_buffer_size 512k; - - add_header Referrer-Policy "no-referrer" always; - add_header X-Content-Type-Options "nosniff" always; - add_header X-Frame-Options "SAMEORIGIN" always; - add_header X-XSS-Protection "1; mode=block" always; -} - - - # iOS and calendar/carddav fixes - location ^~ /.well-known/carddav { - return 301 $scheme://$host/nextcloud/remote.php/dav; - } - - location ^~ /.well-known/caldav { - return 301 $scheme://$host/nextcloud/remote.php/dav; - } - - location ^~ /.well-known { - return 301 $scheme://$host/nextcloud/index.php$uri; - } - -* technitium - location /technitium/ { - proxy_pass http://localhost:5380/; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # Rewrite path for base URL - rewrite ^/technitium/(.*)$ /$1 break; - } - - curl -X GET "https://zserver.zapto.org/portainer/api/endpoints/3/docker/containers/json?all=true" -H "X-API-Key: ptr_KFQqKse9K4Nc9M5jnpc61fpAvGzdTOXTzswz9CwOF74=" -u "admin:shakkal123" diff --git a/20251101123637-backlog.org b/20251101123637-backlog.org old mode 100644 new mode 100755 index ed1c736..75757f9 --- a/20251101123637-backlog.org +++ b/20251101123637-backlog.org @@ -1,7 +1,7 @@ :PROPERTIES: :ID: 580cc3a5-af8e-4cbe-b5ad-5b06680e6c37 :END: -#+title: backlog +#+title: Backlog #+filetags: :backlog: * To sort: diff --git a/20251101123637-backlog.org~ b/20251101123637-backlog.org~ deleted file mode 100644 index 1b7726c..0000000 --- a/20251101123637-backlog.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 580cc3a5-af8e-4cbe-b5ad-5b06680e6c37 -:END: -#+title: backlog - diff --git a/20251109205925-old_nginx_code.org b/20251109205925-old_nginx_code.org old mode 100644 new mode 100755 diff --git a/20251109205925-old_nginx_code.org~ b/20251109205925-old_nginx_code.org~ deleted file mode 100644 index f020b83..0000000 --- a/20251109205925-old_nginx_code.org~ +++ /dev/null @@ -1,7 +0,0 @@ -:PROPERTIES: -:ID: a9829b5d-690d-4a21-ba94-ac8beac4d439 -:END: -#+title: old_nginx_code - - -server { server_name zainezq.com; access_log /var/log/nginx/zserver.access.log combined; error_log /var/log/nginx/zserver.error.log warn; # Basic authentication for the entire server auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/.htpasswd; # Root location location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; root /home/zaine/master-folder/org_files/org_web/output; index index.html index.htm; try_files $uri $uri/ =404; } location /nginx_status { stub_status; } location /dockge/ { proxy_pass http://127.0.0.1:5021/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /guac/ { proxy_pass http://127.0.0.1:3003/guacamole/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } # PGAdmin4 location location /pgadmin4/ { proxy_set_header X-Script-Name /pgadmin4; proxy_set_header Host $host; proxy_pass http://127.0.0.1:5050; proxy_redirect off; } location /pdf/ { proxy_pass http://127.0.0.1:8002/pdf/; proxy_set_header X-Script-Name /pdf; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } location /calibre { proxy_bind $server_addr; proxy_pass http://127.0.0.1:8083; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Scheme $scheme; proxy_set_header X-Script-Name /calibre; # IMPORTANT: path has NO trailing slash # This rewrites Calibre-Web's internal paths proxy_redirect off; proxy_http_version 1.1; client_max_body_size 100M; } location /codeserver/ { proxy_pass http://localhost:8441/; rewrite ^/codeserver(/.*)$ $1 break; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Accept-Encoding gzip; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /filebrowser { # prevents 502 bad gateway error proxy_buffers 8 32k; proxy_buffer_size 64k; client_max_body_size 75M; # redirect all HTTP traffic to localhost:8088; proxy_pass http://127.0.0.1:9991; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-NginX-Proxy true; # enables WS support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 999999999; } # Miniflux location location /miniflux/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:9433/miniflux/; proxy_redirect off; } # Jupyter location location /jupyter/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8888/jupyter/; proxy_redirect off; # WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } location /portainer/ { proxy_pass https://localhost:9443/; proxy_ssl_verify off; # Because Portainer uses a self-signed cert by default proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Authorization ""; # Required for WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Rewrite URL base path rewrite ^/portainer(/.*)$ $1 break; } location /wireguard/ { proxy_pass http://127.0.0.1:124/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Rewrite assets for subpath compatibility proxy_set_header Accept-Encoding ""; sub_filter 'href="/' 'href="/wireguard/'; sub_filter 'src="/' 'src="/wireguard/'; sub_filter_types text/css application/javascript; sub_filter_once off; } # /password -> /password/ location = /password { return 301 /password/; } # Main app/API (disable inherited basic auth here) location ^~ /password/ { auth_basic off; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSockets proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Keep the /password prefix upstream (NO trailing slash here) proxy_pass http://127.0.0.1:8006; } # (Optional but tidy) If you keep a dedicated WS block, disable auth there too location ^~ /password/notifications/hub { auth_basic off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8006; } # Optional: Add a custom error page error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # Optional: Cache static assets for performance (add this new block) # location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot|svg|html|htm)$ { # root /home/zaine/master-folder/org_files/org_web/output; # expires 30d; # access_log off; # } # Optional: Deny access to hidden files location ~ /\. { deny all; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/zainezq.com-0001/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/zainezq.com-0001/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = zserver.zapto.org) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name zserver.zapto.org; return 404; # managed by Certbot } diff --git a/20251122223053-keyboard.org b/20251122223053-keyboard.org old mode 100644 new mode 100755 diff --git a/20251122223053-keyboard.org~ b/20251122223053-keyboard.org~ deleted file mode 100644 index b07615d..0000000 --- a/20251122223053-keyboard.org~ +++ /dev/null @@ -1,5 +0,0 @@ -:PROPERTIES: -:ID: 0217f537-442a-4593-8c69-d481f0d1f2a8 -:END: -#+title: keyboard - diff --git a/20251214210526-useful_c_imports.org b/20251214210526-useful_c_imports.org old mode 100644 new mode 100755 diff --git a/20251214210526-useful_c_imports.org~ b/20251214210526-useful_c_imports.org~ deleted file mode 100644 index e8c39fc..0000000 --- a/20251214210526-useful_c_imports.org~ +++ /dev/null @@ -1,6 +0,0 @@ -:PROPERTIES: -:ID: d939e477-d1e9-43ea-960e-8727246d12a3 -:END: -#+title: useful-c-imports -#+filetags: :coding:notes: - diff --git a/20251223215636-design_patterns_notes.html b/20251223215636-design_patterns_notes.html new file mode 100755 index 0000000..5174796 --- /dev/null +++ b/20251223215636-design_patterns_notes.html @@ -0,0 +1,368 @@ + + + + + + + +design-patterns-notes + + + + +
+

design-patterns-notes

+ +
+

1. Design patterns. What are they?

+
+

+They are reusable solutions to common problems in software design. They help to make code more flexible, maintainable, and scalable. +

+ +

+Patterns allow you to say more with less. When you use a pattern in a description, other developers quickly know precisely the design you have in mind. +

+
+
+

1.1. OO concepts:

+
+
+
+

1.1.1. Abstraction:

+
+

+Focuses on essential features while hiding unnecessary internal details, allowing developers to work with high‑level concepts instead of implementation complexity. +

+ +

+Example: A Car class exposes start() and stop() methods without revealing how the engine ignition system works. +

+
+
+
+

1.1.2. Inheritance:

+
+

+Enables one class to derive properties and behaviours from another, promoting code reuse and creating natural parent–child hierarchies. +

+ +

+Example: A Dog class inherits from an Animal class, automatically gaining attributes like age and methods like eat(). +

+
+
+
+

1.1.3. Encapsulation:

+
+

+Protects an object’s internal state by restricting direct access to its data and exposing controlled interfaces for interaction. +

+ +

+Example: A BankAccount class keeps its balance private and provides deposit() and withdraw() methods to modify it safely. +

+
+
+
+

1.1.4. Polymorphism:

+
+

+Allows different objects to respond to the same interface or method call in their own unique ways, enabling flexible and extensible system design. +

+ +

+Example: Calling makeSound() on an Animal reference triggers bark() for a Dog and meow() for a Cat. +

+
+
+
+
+

1.2. OO principles:

+
+
    +
  • Encapsulate what varies
  • + +
  • Favor composition over inheritance
  • + +
  • Program to interfaces, not implementations
  • + +
  • Strive for loosely coupled designs between objects that interact
  • +
+
+
+
+

1.3. OO Patterns

+
+

+You have: +

+
    +
  • behavioural patterns
  • +
  • creational patterns
  • +
  • structural patterns
  • +
+
+
+

1.3.1. Behavioural patterns

+
+
+
    +
  1. Structural:
    +
    +

    +The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. +

    +
    +
  2. +
  3. Observer:
    +
    +

    +The Observer Pattern defines a one-to-many dependency between objects so that when +one object changes state, all of its dependents are notified and updated automatically. +

    + +

    +Subjects, or as we also know them, Observables, update Observers using a common +interface +

    + +

    +Observers are loosely coupled in that the Observable knows nothing about them, +other than that they implement the Observer interface. +

    + +

    +You can push or pull data from the Observable when using the pattern (pull is +considered more “correct”). +

    + +

    +Don’t depend on a specific order of notification for your Observers. +

    + +

    +Java has several implementations of the Observer Pattern, including the general +purpose java.util.Observable +

    +
    +
  4. +
+
+
+
+
+
+

Created: 2025-12-24 Wed 14:03

+

Validate

+
+ + diff --git a/20251223215636-design_patterns_notes.org b/20251223215636-design_patterns_notes.org new file mode 100755 index 0000000..64f6d14 --- /dev/null +++ b/20251223215636-design_patterns_notes.org @@ -0,0 +1,71 @@ +:PROPERTIES: +:ID: 631b2086-4b8f-4fe3-829d-be1dc014e293 +:END: +#+title: Design patterns +#+filetags: :notes:career:technical: + +* Design patterns. What are they? + + +They are reusable solutions to common problems in software design. They help to make code more flexible, maintainable, and scalable. + +Patterns allow you to say more with less. When you use a pattern in a description, other developers quickly know precisely the design you have in mind. + +** OO concepts: +*** Abstraction: +Focuses on essential features while hiding unnecessary internal details, allowing developers to work with high‑level concepts instead of implementation complexity. + +Example: A Car class exposes start() and stop() methods without revealing how the engine ignition system works. + +*** Inheritance: +Enables one class to derive properties and behaviours from another, promoting code reuse and creating natural parent–child hierarchies. + +Example: A Dog class inherits from an Animal class, automatically gaining attributes like age and methods like eat(). + +*** Encapsulation: +Protects an object’s internal state by restricting direct access to its data and exposing controlled interfaces for interaction. + +Example: A BankAccount class keeps its balance private and provides deposit() and withdraw() methods to modify it safely. + +*** Polymorphism: +Allows different objects to respond to the same interface or method call in their own unique ways, enabling flexible and extensible system design. + +Example: Calling makeSound() on an Animal reference triggers bark() for a Dog and meow() for a Cat. + +** OO principles: + +- Encapsulate what varies + +- Favor composition over inheritance + +- Program to interfaces, not implementations + +- Strive for loosely coupled designs between objects that interact + +** OO Patterns + +You have: +- *behavioural* patterns +- *creational* patterns +- *structural* patterns + +*** Behavioural patterns +**** Structural: +The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. +**** Observer: +The Observer Pattern defines a one-to-many dependency between objects so that when +one object changes state, all of its dependents are notified and updated automatically. + +Subjects, or as we also know them, Observables, update Observers using a common +interface + +Observers are loosely coupled in that the Observable knows nothing about them, +other than that they implement the Observer interface. + +You can push or pull data from the Observable when using the pattern (pull is +considered more “correct”). + +Don’t depend on a specific order of notification for your Observers. + +Java has several implementations of the Observer Pattern, including the general +purpose java.util.Observable diff --git a/20251223215636-design_patterns_notes.org~ b/20251223215636-design_patterns_notes.org~ new file mode 100755 index 0000000..b21b102 --- /dev/null +++ b/20251223215636-design_patterns_notes.org~ @@ -0,0 +1,71 @@ +:PROPERTIES: +:ID: 631b2086-4b8f-4fe3-829d-be1dc014e293 +:END: +#+title: design-patterns-notes +#+filetags: :notes:career:technical: + +* Design patterns. What are they? + + +They are reusable solutions to common problems in software design. They help to make code more flexible, maintainable, and scalable. + +Patterns allow you to say more with less. When you use a pattern in a description, other developers quickly know precisely the design you have in mind. + +** OO concepts: +*** Abstraction: +Focuses on essential features while hiding unnecessary internal details, allowing developers to work with high‑level concepts instead of implementation complexity. + +Example: A Car class exposes start() and stop() methods without revealing how the engine ignition system works. + +*** Inheritance: +Enables one class to derive properties and behaviours from another, promoting code reuse and creating natural parent–child hierarchies. + +Example: A Dog class inherits from an Animal class, automatically gaining attributes like age and methods like eat(). + +*** Encapsulation: +Protects an object’s internal state by restricting direct access to its data and exposing controlled interfaces for interaction. + +Example: A BankAccount class keeps its balance private and provides deposit() and withdraw() methods to modify it safely. + +*** Polymorphism: +Allows different objects to respond to the same interface or method call in their own unique ways, enabling flexible and extensible system design. + +Example: Calling makeSound() on an Animal reference triggers bark() for a Dog and meow() for a Cat. + +** OO principles: + +- Encapsulate what varies + +- Favor composition over inheritance + +- Program to interfaces, not implementations + +- Strive for loosely coupled designs between objects that interact + +** OO Patterns + +You have: +- *behavioural* patterns +- *creational* patterns +- *structural* patterns + +*** Behavioural patterns +**** Structural: +The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. +**** Observer: +The Observer Pattern defines a one-to-many dependency between objects so that when +one object changes state, all of its dependents are notified and updated automatically. + +Subjects, or as we also know them, Observables, update Observers using a common +interface + +Observers are loosely coupled in that the Observable knows nothing about them, +other than that they implement the Observer interface. + +You can push or pull data from the Observable when using the pattern (pull is +considered more “correct”). + +Don’t depend on a specific order of notification for your Observers. + +Java has several implementations of the Observer Pattern, including the general +purpose java.util.Observable diff --git a/20251223220531-technical_commonplace.org b/20251223220531-technical_commonplace.org new file mode 100755 index 0000000..7401389 --- /dev/null +++ b/20251223220531-technical_commonplace.org @@ -0,0 +1,21 @@ +:PROPERTIES: +:ID: 37495d5f-2a77-40bc-b45c-8163189bbe6b +:END: +#+title: technical-commonplace +#+filetags: :technical:notes:commonplace: + +* MVP and MVT + +- An **MVP** is a **minimal functional product** built to validate what customers actually want by observing real usage. +- An **MVT** (often called **Minimum Viable Experiment/Test**) is a **small, fast, low‑cost test** designed to validate a specific assumption before you build anything substantial. + +**Minimum Viable Product (MVP)** +A simplified but working version of a product that early users can interact with. +Purpose: validate product‑market fit and gather real behavioural feedback. + +**Minimum Viable Test (MVT / MVE)** +A quick experiment to validate a single assumption — often before building an MVP. +Examples: landing page, survey, fake‑door button, email test. + +- **MVT** = “Should we even build this?” +- **MVP** = “We think this is worth building — now let’s test the simplest working version.” diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c146042 --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +.PHONY: all fast clean help + +# Default target: full build with search index +all: + @echo "Building project (full rebuild with search index)..." + emacs -Q --script build.el + +# Fast build without search index +fast: + @echo "Building project (fast rebuild without search index)..." + emacs -Q --script build.el --fast + +# Clean output directory +clean: + @echo "Cleaning output directory..." + rm -rf output/ + +# Show help message +help: + @echo "Available targets:" + @echo " make - Full rebuild (with search index)" + @echo " make fast - Fast rebuild (without search index)" + @echo " make clean - Remove output directory" + @echo " make help - Show this help message" diff --git a/all-files.org b/all-files.org new file mode 100755 index 0000000..b1ba0cb --- /dev/null +++ b/all-files.org @@ -0,0 +1,117 @@ +#+title: All Files +#+options: toc:nil + +A complete alphabetical index of all published pages. + +* A +- [[id:3acffb66-bc1a-4661-904f-c5447b3c3488][advanced-networking]] +- [[id:556d10d1-1c74-4d9f-a398-39cb3bd5d935][afp]] +- [[id:f6c9e1a7-8465-4cef-9481-2b803d0c43d4][afp_lab_1]] +- [[id:3aef24fd-b220-4408-aa1e-c3538d661b62][afp_lec_1]] +- [[id:460f4a49-8ae4-444a-bf82-4e14ca7cad3f][afp_lec_2]] +- [[id:ed4c372b-0314-4b6e-9119-742f69b5e434][afp_lec_5]] +- [[id:4bc71106-1d2b-4c71-836d-54b738fe5ff5][afp_week2]] +- [[id:1f395b8c-cf55-43eb-9430-dd9449f6b575][afp_week5]] +- [[id:e7f2302b-16eb-476d-a7b9-be12f077819d][AOC Notes]] +* B +- [[id:580cc3a5-af8e-4cbe-b5ad-5b06680e6c37][Backlog]] +- [[id:275988a8-59d8-40c8-a8b4-47118d6eb834][big-o-complexity]] +- [[id:238ff7d8-db22-41e2-8aad-fc3c778e6248][book-recs]] +- [[id:363dbdfa-f23c-4f7e-a6f3-6d34f78984bb][books-org-agenda]] +- [[id:bca8e7a6-0590-4630-ab49-210306ad21a2][bowling-kata]] +* C +- [[id:5a207a1c-6f02-40d5-b42e-38daaa0aec10][c_notes]] +- [[id:f9838952-9753-471b-a2cc-d72e01a53ef6][career_capital]] +- [[id:dd55d635-59de-4ed9-8ff0-423782c2e0ae][clean-code]] +* D +- [[id:e448cd99-afee-4702-947f-644bb34dc1aa][database_moc]] +- [[id:d4f96bfb-b83d-449b-9f74-f602a1a3c2d3][deliberate_practice]] +- [[id:631b2086-4b8f-4fe3-829d-be1dc014e293][Design patterns]] +* E +- [[id:7e79e4c5-383d-450f-882c-33d4f87ba1b5][emacs-stuff-elisp]] +- [[id:45CC3AF5-5E20-4B03-A36C-8D4BDD5CBB13][emacs-stuff-evil]] +- [[id:8e5e9498-ff3c-48e7-aab5-6e94b2e41ccb][emacs-stuff-gtd]] +- [[id:966175d4-3b58-4abc-9b41-08cbf328dd87][emacs-stuff-keybindings]] +- [[id:2ab0fa3f-8ac6-4af2-8cd4-1dd490fb19c3][emacs-stuff-magit]] +- [[id:7d2e867e-f091-4362-a583-453f732207fe][emacs-stuff-org-publish Welcome to My Org Website]] +- [[id:034abe27-ca14-4dc0-9a3f-b8d0e1f26342][emacs-stuff-org-roam]] +- [[id:8fa3f476-6152-45f4-b618-50f1e4bce46c][emacs_moc]] +* F +- [[id:7d199fbe-b0e7-48fd-b8a1-793044dbea01][fyp]] +- [[id:26b2ed9a-cb81-4c43-bc63-6b3c8ffa3bf1][fyp-report-planning]] +* G +- [[id:710f65e5-0bd4-42be-b5d1-69dbe79b745e][github_notes]] +- [[id:30c28e5e-0b1c-43ae-b3bd-eb31023f8b73][gpg-encryption]] +* H +- [[id:086ca3ca-39ec-4d37-b56d-b6d9f51e6873][how-to-solve-leetcode]] +* I +- [[id:9d5aae0f-4ae1-49a5-a047-9099baad0a06][i3-wm]] +- [[id:06b2a012-4e8a-4a8a-9494-de7ed9fbe1d3][ise_week_1]] +- [[id:f308642d-fcf3-410b-b154-d60582e112a2][ise_week_2]] +- [[id:1d0fa257-579f-49f3-b8fd-a3b68ddccf10][ise_week_3]] +- [[id:ebf874d9-0554-47f0-be8b-5c9a948738bf][ise_week_4]] +- [[id:0e70c535-b145-42d9-a9ed-fe48cddbb1a5][ise_week_5]] +- [[id:9ad3f3f1-55f7-4114-bc8c-17250b6dd25d][ise_week_7]] +* J +- [[id:7b8de14c-a73e-4c92-a403-a9a1c419c0b3][java-junit-testing]] +- [[id:5cfd7f6f-f5ac-4f18-90f9-be9a31dd238e][java-portswrigger-test]] +- [[id:ae343652-96fe-4341-8a36-ec3a1abd0dc6][java_moc]] +- [[id:f9897f8e-2b63-4ad2-a55f-3787c4ac235f][job_application_cover_letters]] +* K +- [[id:0217f537-442a-4593-8c69-d481f0d1f2a8][keyboard]] +* L +- [[id:63456626-b34e-46d9-b85e-0f1f5724aa83][lazy_evaluation]] +- [[id:569a4a57-1843-4821-8259-17762855985e][linux-arch-linux]] +- [[id:bdb493df-db92-4c93-9558-0b10fdff3048][linux_moc]] +* M +- [[id:bcd41e87-120c-455c-8898-996ddaa41f75][maven-pom-file]] +- [[id:f877240e-c2c8-4087-84e5-4b1ca3fcd4ed][microlise-assessment]] +* N +- [[id:4426cc9a-1568-4fc8-9242-269654c43a3b][naqshe-hayat]] +- [[id:0880f089-a5ad-49cd-8ce3-f020a5941313][networking-moc]] +- [[id:a087da71-bcfb-4ddf-9565-b82113d5d27f][neuroplasticity]] +- [[id:56f39be4-1108-4020-be5a-1f3a0fbf96fa][nextcloud]] +- [[id:565eaccd-8cf6-4dbb-bc66-a4b37367ce6b][non_technical_moc]] +* O +- [[id:2c2d8df4-ad36-40ab-9f30-8a047b372956][old_nextcloud_server_code]] +- [[id:a9829b5d-690d-4a21-ba94-ac8beac4d439][old_nginx_code]] +* P +- [[id:939e301b-6463-46a8-b57e-0af606e7e7ef][postgres]] +- [[id:2BFB84B2-2129-4AE3-8E69-290CA5BF9747][pre_work_prep_microlise]] +- [[id:125c81dc-c14f-4b4d-93c6-0a2b157735ac][python-dictionary]] +- [[id:9d534e89-7f0b-494c-bff6-7b3be05b85d1][python-lambda]] +- [[id:3a41407c-661e-416a-80d2-4c7a137d153a][python-set]] +- [[id:3bbc6099-0187-4bf2-9282-97e5fa443f72][python-sorted-function]] +* R +- [[id:EA93341B-20C0-48A2-BD88-F24ED3C540DA][recipes-done]] +- [[id:F7D68FF4-CAD0-4791-BAE4-AC20B84A8785][recipes-ideas]] +- [[id:65F747B1-3CB2-429A-9E26-ED8BC169E689][recipes-main]] +* S +- [[id:99533f2d-a4e8-41d0-a605-c7d4cef6f995][self_hosting]] +- [[id:f09cb4ed-1407-4187-9002-de2c5db13a8f][server_moc]] +- [[id:2d7f1ccc-99d7-4c45-8fe7-4b87080edb01][so_good_they_cant_ignore_you]] +- [[id:efe0360d-8d81-4372-833d-ad58e67d17c6][socket_programming_in_c]] +- [[id:acba0d25-08db-4784-8cc2-fe5c437ba723][stanford_marshmallow_experiment]] +- [[id:bf277242-4f09-46a2-aa6b-1d75ce0025ac][systemd_services]] +* T +- [[id:2f285f04-fcf4-4ade-a1ac-2c50b43d529a][Technical MOC]] +- [[id:37495d5f-2a77-40bc-b45c-8163189bbe6b][technical-commonplace]] +- [[id:2729599d-ae2b-4f22-b73d-bf22d81e0767][test_driven_development]] +- [[id:EC9D851F-3A2E-4F32-A584-76F6F7A08E30][the_clean_coder]] +- [[id:5443ed1c-bb7f-4eb4-9c96-d12648dd2291][tpis]] +* U +- [[id:4a8edaed-9ebd-402b-9c5f-7a0cb4399102][uml_fyp]] +- [[id:797d6e3e-98eb-4bc7-88b6-e096ef7306ad][uni_moc]] +- [[id:d939e477-d1e9-43ea-960e-8727246d12a3][useful-c-imports]] +* W +- [[id:7612a9a6-ae70-4525-93a0-81bac857df39][wacom-notes]] +- [[id:c1de3972-e932-48fd-8065-3d89dad58007][wedding_moc]] +- [[id:8CE93986-280B-45BD-9DF2-5D06586DDDE7][workflow-moc]] +- [[id:b2db0b0b-c179-43ab-9e2b-22bbaac69bcb][wp-emacs-config-blorg]] +- [[id:D02B89DC-84D0-4211-A902-B9399F4179CA][wp-emotional-intelligence]] +- [[id:CD093B85-BF68-4EAB-AABE-733C7BFC99DE][wp-growth-mindset]] +- [[id:1ee754f9-f30f-4976-850b-d18d01a834d2][wp-new-emacs-config-blorg]] +- [[id:b292f5c6-0c27-439c-8274-2150eb45e20d][wp-prefront-cortex-blorg]] +- [[id:462F091B-9156-48B3-8665-0BE36C95C182][wp-sadness]] +- [[id:cfc4ce06-7862-49b7-9a4f-e515d690cd38][wp-urge-surfing-blorg]] +- [[id:8CD2F4C4-22C2-4ECC-8F5F-C4779F8AC0F1][wp-week-12-reflection]] diff --git a/assets/Big-O-Notation-3130482830.png b/assets/Big-O-Notation-3130482830.png old mode 100644 new mode 100755 diff --git a/assets/Screenshot_20251227_153037.png b/assets/Screenshot_20251227_153037.png new file mode 100755 index 0000000..6c8d9d7 Binary files /dev/null and b/assets/Screenshot_20251227_153037.png differ diff --git a/assets/gr.png b/assets/gr.png new file mode 100755 index 0000000..c8314b3 Binary files /dev/null and b/assets/gr.png differ diff --git a/assets/scripts/bigger-picture.min.js b/assets/scripts/bigger-picture.min.js new file mode 100755 index 0000000..93bcaa7 --- /dev/null +++ b/assets/scripts/bigger-picture.min.js @@ -0,0 +1 @@ +var BiggerPicture=function(){function t(){}const n=t=>t;function e(t,n){for(const e in n)t[e]=n[e];return t}function o(t){return t()}function r(t){t.forEach(o)}function i(t){return"function"==typeof t}function c(t,n){return t!=t?n==n:t!==n}function s(n,e,o){n.u.t.push(((n,...e)=>{if(null==n)return t;const o=n.subscribe(...e);return o.unsubscribe?()=>o.unsubscribe():o})(e,o))}function u(n){return n&&i(n.destroy)?n.destroy:t}let l=()=>globalThis.performance.now(),a=t=>requestAnimationFrame(t);const p=new Set;function f(t){p.forEach((n=>{n.c(t)||(p.delete(n),n.f())})),0!==p.size&&a(f)}function d(t){let n;return 0===p.size&&a(f),{promise:new Promise((e=>{p.add(n={c:t,f:e})})),abort(){p.delete(n)}}}function m(t,n){t.appendChild(n)}function b(t,n,e){t.insertBefore(n,e||null)}function h(t){t.parentNode.removeChild(t)}function g(t){return document.createElement(t)}function x(){return document.createTextNode("")}function v(t,n,e,o){return t.addEventListener(n,e,o),()=>t.removeEventListener(n,e,o)}function w(t,n,e){null==e?t.removeAttribute(n):t.getAttribute(n)!==e&&t.setAttribute(n,e)}function y(t,n,e,o){null===e?t.style.removeProperty(n):t.style.setProperty(n,e)}function $(t,n,e){t.classList[e?"add":"remove"](n)}let k,_,M=0,S={};function z(t,n,e,o,r,i,c,s=0){const u=16.666/o;let l="{\n";for(let t=0;1>=t;t+=u){const o=n+(e-n)*i(t);l+=100*t+`%{${c(o,1-o)}}\n`}const a=l+`100% {${c(e,1-e)}}\n}`,p=`_bp_${Math.round(1e9*Math.random())}_${s}`;if(!S[p]){if(!k){const t=g("style");document.head.appendChild(t),k=t.sheet}S[p]=1,k.insertRule(`@keyframes ${p} ${a}`,k.cssRules.length)}const f=t.style.animation||"";return t.style.animation=`${f?f+", ":""}${p} ${o}ms linear ${r}ms 1 both`,M+=1,p}function I(t,n){t.style.animation=(t.style.animation||"").split(", ").filter(n?t=>0>t.indexOf(n):t=>-1===t.indexOf("_bp")).join(", "),n&&!--M&&a((()=>{if(M)return;let t=k.cssRules.length;for(;t--;)k.deleteRule(t);S={}}))}function P(t){_=t}const T=[],A=[],N=[],O=[],C=Promise.resolve();let E=0;function R(t){N.push(t)}const j=new Set;let q,F=0;function J(){const t=_;do{for(;T.length>F;){const t=T[F];F++,P(t),B(t.u)}for(P(null),T.length=0,F=0;A.length;)A.pop()();for(let t=0;N.length>t;t+=1){const n=N[t];j.has(n)||(j.add(n),n())}N.length=0}while(T.length);for(;O.length;)O.pop()();E=0,j.clear(),P(t)}function B(t){if(null!==t.l){t.update(),r(t.g);const n=t.v;t.v=[-1],t.l&&t.l.p(t.$,n),t.k.forEach(R)}}function D(){return q||(q=Promise.resolve(),q.then((()=>{q=null}))),q}function K(t,n,e){t.dispatchEvent(((t,n,e=0)=>{const o=document.createEvent("CustomEvent");return o.initCustomEvent(t,e,0,n),o})(`${n?"intro":"outro"}${e}`))}const L=new Set;let W;function X(){W={r:0,c:[],p:W}}function Y(){W.r||r(W.c),W=W.p}function G(t,n){t&&t.i&&(L.delete(t),t.i(n))}function H(t,n,e,o){if(t&&t.o){if(L.has(t))return;L.add(t),W.c.push((()=>{L.delete(t),o&&(e&&t.d(1),o())})),t.o(n)}}const Q={duration:0};function U(e,o,r){let c,s,u=o(e,r),a=0,p=0;function f(){c&&I(e,c)}function m(){const{delay:o=0,duration:r=300,_:i=n,M:m=t,css:b}=u||Q;b&&(c=z(e,0,1,r,o,i,b,p++)),m(0,1);const h=l()+o,g=h+r;s&&s.abort(),a=1,R((()=>K(e,1,"start"))),s=d((t=>{if(a){if(t>=g)return m(1,0),K(e,1,"end"),f(),a=0;if(t>=h){const n=i((t-h)/r);m(n,1-n)}}return a}))}let b=0;return{start(){b||(b=1,I(e),i(u)?(u=u(),D().then(m)):m())},S(){b=0},end(){a&&(f(),a=0)}}}function V(e,o,c){let s,u=o(e,c),a=1;const p=W;function f(){const{delay:o=0,duration:i=300,_:c=n,M:f=t,css:m}=u||Q;m&&(s=z(e,1,0,i,o,c,m));const b=l()+o,h=b+i;R((()=>K(e,0,"start"))),d((t=>{if(a){if(t>=h)return f(0,1),K(e,0,"end"),--p.r||r(p.c),0;if(t>=b){const n=c((t-b)/i);f(1-n,n)}}return a}))}return p.r+=1,i(u)?D().then((()=>{u=u(),f()})):f(),{end(t){t&&u.M&&u.M(1,0),a&&(s&&I(e,s),a=0)}}}function Z(t){t&&t.c()}function tt(t,n,e,c){const{l:s,I:u,t:l,k:a}=t.u;s&&s.m(n,e),c||R((()=>{const n=u.map(o).filter(i);l?l.push(...n):r(n),t.u.I=[]})),a.forEach(R)}function nt(t,n){const e=t.u;null!==e.l&&(r(e.t),e.l&&e.l.d(n),e.t=e.l=null,e.$=[])}function et(n,e,o,i,c,s,u,l=[-1]){const a=_;P(n);const p=n.u={l:null,$:null,P:s,update:t,T:c,bound:{},I:[],t:[],A:[],g:[],k:[],context:new Map(e.context||(a?a.u.context:[])),N:{},v:l,O:0,root:e.target||a.u.root};u&&u(p.root);let f=0;p.$=o?o(n,e.P||{},((t,e,...o)=>{const r=o.length?o[0]:e;return p.$&&c(p.$[t],p.$[t]=r)&&(!p.O&&p.bound[t]&&p.bound[t](r),f&&((t,n)=>{-1===t.u.v[0]&&(T.push(t),E||(E=1,C.then(J)),t.u.v.fill(0)),t.u.v[n/31|0]|=1<{const t=e.indexOf(n);-1!==t&&e.splice(t,1)}}C(t){this.R&&0!==Object.keys(t).length&&(this.u.O=1,this.R(t),this.u.O=0)}}function rt(t){const n=t-1;return n*n*n+1}function it(t,{delay:n=0,duration:e=400,_:o=rt,x:r=0,y:i=0,opacity:c=0}={}){const s=getComputedStyle(t),u=+s.opacity,l="none"===s.transform?"":s.transform,a=u*(1-c);return{delay:n,duration:e,_:o,css(t,n){return`\n\t\t\ttransform: ${l} translate(${(1-t)*r}px, ${(1-t)*i}px);\n\t\t\topacity: ${u-a*n}`}}}const ct=[];function st(n,e=t){let o;const r=new Set;function i(t){if(c(n,t)&&(n=t,o)){const t=!ct.length;for(const t of r)t[1](),ct.push(t,n);if(t){for(let t=0;ct.length>t;t+=2)ct[t][0](ct[t+1]);ct.length=0}}}return{set:i,update(t){i(t(n))},subscribe(c,s=t){const u=[c,s];return r.add(u),1===r.size&&(o=e(i)||t),c(n),()=>{r.delete(u),0===r.size&&(o(),o=null)}}}}function ut(t,n){if(t===n||t!=t)return()=>t;const e=typeof t;if(Array.isArray(t)){const e=n.map(((n,e)=>ut(t[e],n)));return t=>e.map((n=>n(t)))}if("number"===e){const e=n-t;return n=>t+n*e}}function lt(t,o={}){const r=st(t);let i,c=t;function s(s,u){if(null==t)return r.set(t=s),Promise.resolve();c=s;let a=i,p=0,{delay:f=0,duration:m=400,_:b=n,interpolate:h=ut}=e(e({},o),u);if(0===m)return a&&(a.abort(),a=null),r.set(t=c),Promise.resolve();const g=l()+f;let x;return i=d((n=>{if(g>n)return 1;p||(x=h(t,s),"function"==typeof m&&(m=m(t,s)),p=1),a&&(a.abort(),a=null);const e=n-g;return e>m?(r.set(t=s),0):(r.set(t=x(b(e/m))),1)})),i.promise}return{set:s,update(n,e){return s(n(c,t),e)},subscribe:r.subscribe}}const at=st(0),pt=globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches,ft=t=>({_:rt,duration:pt?0:t}),dt=t=>!t.thumb||`url(${t.thumb})`,mt=(t,n)=>{if(n){"string"==typeof n&&(n=JSON.parse(n));for(const e in n)t.setAttribute(e,n[e])}};function bt(t){let n,e,o;return{c(){n=g("div"),n.innerHTML='',w(n,"class","bp-load"),y(n,"background-image",dt(t[0]))},m(t,e){b(t,n,e),o=1},p(t,e){1&e&&y(n,"background-image",dt(t[0]))},i(t){o||(e&&e.end(1),o=1)},o(t){t&&(e=V(n,it,{duration:480})),o=0},d(t){t&&h(n),t&&e&&e.end()}}}function ht(n){let e,o;return{c(){e=g("div"),w(e,"class","bp-load"),y(e,"background-image",dt(n[0]))},m(t,n){b(t,e,n)},p(t,n){1&n&&y(e,"background-image",dt(t[0]))},i(t){o||R((()=>{o=U(e,it,{duration:480}),o.start()}))},o:t,d(t){t&&h(e)}}}function gt(t){let n,e,o=!t[1]&&bt(t),r=t[2]&&ht(t);return{c(){o&&o.c(),n=x(),r&&r.c(),e=x()},m(t,i){o&&o.m(t,i),b(t,n,i),r&&r.m(t,i),b(t,e,i)},p(t,[i]){t[1]?o&&(X(),H(o,1,1,(()=>{o=null})),Y()):o?(o.p(t,i),2&i&&G(o,1)):(o=bt(t),o.c(),G(o,1),o.m(n.parentNode,n)),t[2]?r?(r.p(t,i),4&i&&G(r,1)):(r=ht(t),r.c(),G(r,1),r.m(e.parentNode,e)):r&&(r.d(1),r=null)},i(t){G(o),G(r)},o(t){H(o)},d(t){o&&o.d(t),t&&h(n),r&&r.d(t),t&&h(e)}}}function xt(t,n,e){let o;s(t,at,(t=>e(2,o=t)));let{j:r}=n,{loaded:i}=n;return t.R=t=>{"j"in t&&e(0,r=t.j),"loaded"in t&&e(1,i=t.loaded)},[r,i,o]}class vt extends ot{constructor(t){super(),et(this,t,xt,gt,c,{j:0,loaded:1})}}function wt(t){let n,e,o,i,c,s;return{c(){n=g("img"),w(n,"sizes",e=t[8].sizes||t[1]+"px"),w(n,"alt",t[7].alt)},m(e,o){b(e,n,o),i=1,c||(s=[u(t[21].call(null,n)),v(n,"error",t[27])],c=1)},p(t,o){(!i||2&o[0]&&e!==(e=t[8].sizes||t[1]+"px"))&&w(n,"sizes",e)},i(t){i||(o&&o.end(1),i=1)},o(t){o=V(n,it,{}),i=0},d(t){t&&h(n),t&&o&&o.end(),c=0,r(s)}}}function yt(t){let n,e;return n=new vt({P:{j:t[7],loaded:t[2]}}),{c(){Z(n.u.l)},m(t,o){tt(n,t,o),e=1},p(t,e){const o={};4&e[0]&&(o.loaded=t[2]),n.C(o)},i(t){e||(G(n.u.l,t),e=1)},o(t){H(n.u.l,t),e=0},d(t){nt(n,t)}}}function $t(t){let n,e,o,i,c,s,l=`translate3d(${t[0][0]/-2+t[6][0]}px, ${t[0][1]/-2+t[6][1]}px, 0)`,a=t[2]&&wt(t),p=t[3]&&yt(t);return{c(){n=g("div"),e=g("div"),a&&a.c(),o=x(),p&&p.c(),w(e,"class","bp-img"),y(e,"width",t[0][0]+"px"),y(e,"height",t[0][1]+"px"),$(e,"bp-drag",t[4]),$(e,"bp-canzoom",t[11]>1&&t[12]>t[0][0]),y(e,"background-image",dt(t[7])),y(e,"transform",l),w(n,"class","bp-img-wrap"),$(n,"bp-close",t[5])},m(r,l){b(r,n,l),m(n,e),a&&a.m(e,null),m(e,o),p&&p.m(e,null),i=1,c||(s=[u(t[20].call(null,e)),v(n,"wheel",t[15]),v(n,"pointerdown",t[16]),v(n,"pointermove",t[17]),v(n,"pointerup",t[19]),v(n,"pointercancel",t[18])],c=1)},p(t,r){t[2]?a?(a.p(t,r),4&r[0]&&G(a,1)):(a=wt(t),a.c(),G(a,1),a.m(e,o)):a&&(X(),H(a,1,1,(()=>{a=null})),Y()),t[3]?p?(p.p(t,r),8&r[0]&&G(p,1)):(p=yt(t),p.c(),G(p,1),p.m(e,null)):p&&(X(),H(p,1,1,(()=>{p=null})),Y()),(!i||1&r[0])&&y(e,"width",t[0][0]+"px"),(!i||1&r[0])&&y(e,"height",t[0][1]+"px"),(!i||16&r[0])&&$(e,"bp-drag",t[4]),(!i||6145&r[0])&&$(e,"bp-canzoom",t[11]>1&&t[12]>t[0][0]),65&r[0]&&l!==(l=`translate3d(${t[0][0]/-2+t[6][0]}px, ${t[0][1]/-2+t[6][1]}px, 0)`)&&y(e,"transform",l),(!i||32&r[0])&&$(n,"bp-close",t[5])},i(t){i||(G(a),G(p),i=1)},o(t){H(a),H(p),i=0},d(t){t&&h(n),a&&a.d(),p&&p.d(),c=0,r(s)}}}function kt(t,n,e){let o,r,i,c;s(t,at,(t=>e(26,i=t)));let{P:u}=n,{q:l}=n,{j:a,F:p,J:f,next:d,zoomed:m,container:b}=u;s(t,m,(t=>e(25,o=t)));let h,g,x,v,w,y,$,k,_,M,S,z=a.maxZoom||p.maxZoom||10,I=u.B(a),P=I[0],T=0;const A=+a.width,N=[],O=new Map,C=lt(I,ft(400));s(t,C,(t=>e(0,c=t)));const E=lt([0,0],ft(400));s(t,E,(t=>e(6,r=t)));const R=([t,n],o=c)=>{const r=(o[0]-b.w)/2,i=(o[1]-b.h)/2;return 0>r?t=0:t>r?l?(t=w?r+(t-r)/10:r)>r+20&&e(4,w=f()):t=r:-r>t&&(l?-r-20>(t=w?-r-(-r-t)/10:-r)&&e(4,w=d()):t=-r),0>i?n=0:n>i?n=i:-i>n&&(n=-i),[t,n]};function j(t=z,n){if(i)return;const o=I[0]*z;let s=c[0]+c[0]*t,u=c[1]+c[1]*t;if(t>0)s>o&&(s=o,u=I[1]*z),s>A&&(s=A,u=+a.height);else if(I[0]>s)return C.set(I),E.set([0,0]);let{x:l,y:p,width:f,height:d}=v.getBoundingClientRect();const m=n?n.clientX-l-f/2:0,b=n?n.clientY-p-d/2:0;l=s/f*-m+m,p=u/d*-b+b;const h=[s,u];C.set(h).then((()=>{e(1,P=Math.round(Math.max(P,s)))})),E.set(R([r[0]+l,r[1]+p],h))}Object.defineProperty(a,"zoom",{configurable:1,get(){return o},set(t){return j(t?z:-z)}});const q=t=>O.delete(t.pointerId);return t.R=t=>{"q"in t&&e(23,l=t.q)},t.u.update=()=>{if(16777217&t.u.v[0]&&m.set(c[0]-10>I[0]),117440512&t.u.v[0]&&i&&o&&!p.intro){const t=ft(480);E.set([0,0],t),C.set(I,t),e(5,S=1)}},[c,P,h,g,w,S,r,a,p,m,b,z,A,C,E,t=>{p.inline&&!o||(t.preventDefault(),j(t.deltaY/-300,t))},t=>{2!==t.button&&(t.preventDefault(),e(4,w=1),O.set(t.pointerId,t),$=t.clientX,k=t.clientY,_=r[0],M=r[1])},t=>{if(O.size>1)return e(4,w=0),p.noPinch?.(b.el)||(t=>{const[n,e]=O.set(t.pointerId,t).values(),o=Math.hypot(n.clientX-e.clientX,n.clientY-e.clientY);x=x||{clientX:(n.clientX+e.clientX)/2,clientY:(n.clientY+e.clientY)/2},j(((T||o)-o)/-35,x),T=o})(t);if(!w)return;let n=t.clientX,r=t.clientY;y=N.push({x:n,y:r})>2,n-=$,r-=k,o||(-90>r&&e(4,w=!p.noClose&&u.close()),30>Math.abs(r)&&(n>40&&e(4,w=f()),-40>n&&e(4,w=d()))),o&&y&&!i&&E.set(R([_+n,M+r]),{duration:0})},q,function(t){if(q(t),x&&(e(4,w=T=0),x=O.size?x:null),w){if(e(4,w=0),t.target===this&&!p.noClose)return u.close();if(y){const[t,n,e]=N.slice(-3);Math.hypot(n.x-e.x,n.y-e.y)>5&&E.set(R([r[0]-5*(t.x-e.x),r[1]-5*(t.y-e.y)]))}else p.onImageClick?.(b.el,a)||j(o?-z:z,t);y=0,N.length=0}},t=>{v=t,u.D((()=>{e(24,I=u.B(a)),!p.inline&&l||(C.set(I),E.set([0,0]))})),u.K(a).then((()=>{e(2,h=1),u.L()})),setTimeout((()=>{e(3,g=!h)}),250)},t=>{mt(t,a.attr),t.srcset=a.img},u,l,I,o,i,t=>p.onError?.(b,a,t)]}class _t extends ot{constructor(t){super(),et(this,t,kt,$t,c,{P:22,q:23},null,[-1,-1])}}function Mt(t){let n,e,o,i,c,s;return o=new vt({P:{j:t[2],loaded:t[0]}}),{c(){n=g("div"),e=g("iframe"),Z(o.u.l),w(e,"allow","autoplay; fullscreen"),w(e,"title",t[2].title),w(n,"class","bp-if"),y(n,"width",t[1][0]+"px"),y(n,"height",t[1][1]+"px")},m(r,l){b(r,n,l),m(n,e),tt(o,n,null),i=1,c||(s=[u(t[3].call(null,e)),v(e,"load",t[5])],c=1)},p(t,[e]){const r={};1&e&&(r.loaded=t[0]),o.C(r),(!i||2&e)&&y(n,"width",t[1][0]+"px"),(!i||2&e)&&y(n,"height",t[1][1]+"px")},i(t){i||(G(o.u.l,t),i=1)},o(t){H(o.u.l,t),i=0},d(t){t&&h(n),nt(o),c=0,r(s)}}}function St(t,n,e){let o,r,{P:i}=n;const{j:c}=i,s=()=>e(1,r=i.B(c));return s(),i.D(s),[o,r,c,t=>{mt(t,c.attr),t.src=c.iframe},i,()=>e(0,o=1)]}class zt extends ot{constructor(t){super(),et(this,t,St,Mt,c,{P:4})}}function It(t){let n,e,o,r,i;return e=new vt({P:{j:t[2],loaded:t[0]}}),{c(){n=g("div"),Z(e.u.l),w(n,"class","bp-vid"),y(n,"width",t[1][0]+"px"),y(n,"height",t[1][1]+"px"),y(n,"background-image",dt(t[2]))},m(c,s){b(c,n,s),tt(e,n,null),o=1,r||(i=u(t[3].call(null,n)),r=1)},p(t,[r]){const i={};1&r&&(i.loaded=t[0]),e.C(i),(!o||2&r)&&y(n,"width",t[1][0]+"px"),(!o||2&r)&&y(n,"height",t[1][1]+"px")},i(t){o||(G(e.u.l,t),o=1)},o(t){H(e.u.l,t),o=0},d(t){t&&h(n),nt(e),r=0,i()}}}function Pt(t,n,e){let o,r,{P:i}=n;const{j:c,F:s,container:u}=i,l=()=>e(1,r=i.B(c));return l(),i.D(l),[o,r,c,t=>{let n;const r=(t,e)=>{Array.isArray(e)||(e=JSON.parse(e));for(const o of e){n||(n=document.createElement(o.type?.includes("audio")?"audio":"video"),mt(n,{controls:1,autoplay:1,playsinline:1,tabindex:"0"}),mt(n,c.attr));const e=document.createElement(t);mt(e,o),"source"==t&&(e.onError=t=>s.onError?.(u,c,t)),n.append(e)}};r("source",c.sources),r("track",c.tracks||[]),n.oncanplay=()=>e(0,o=1),t.append(n)},i]}class Tt extends ot{constructor(t){super(),et(this,t,Pt,It,c,{P:4})}}function At(n){let e,o,i,s,l,a,p,f,d,x=n[6].i,y=jt(n),k=n[0].length>1&&qt(n);return{c(){e=g("div"),o=g("div"),y.c(),s=g("div"),l=g("button"),k&&k.c(),w(l,"class","bp-x"),w(l,"title","Close"),w(l,"aria-label","Close"),w(s,"class","bp-controls"),w(e,"class","bp-wrap"),$(e,"bp-zoomed",n[10]),$(e,"bp-inline",n[8]),$(e,"bp-small",n[7]),$(e,"bp-noclose",n[5].noClose)},m(t,r){b(t,e,r),m(e,o),y.m(e,null),m(e,s),m(s,l),k&&k.m(s,null),p=1,f||(d=[v(l,"click",n[1]),u(n[14].call(null,e))],f=1)},p(n,o){64&o[0]&&c(x,x=n[6].i)?(X(),H(y,1,1,t),Y(),y=jt(n),y.c(),G(y,1),y.m(e,s)):y.p(n,o),n[0].length>1?k?k.p(n,o):(k=qt(n),k.c(),k.m(s,null)):k&&(k.d(1),k=null),(!p||1024&o[0])&&$(e,"bp-zoomed",n[10]),(!p||256&o[0])&&$(e,"bp-inline",n[8]),(!p||128&o[0])&&$(e,"bp-small",n[7]),(!p||32&o[0])&&$(e,"bp-noclose",n[5].noClose)},i(t){p||(i&&i.end(1),G(y),a&&a.end(1),p=1)},o(t){t&&(i=V(o,it,{duration:480})),H(y),t&&(a=V(s,it,{})),p=0},d(t){t&&h(e),t&&i&&i.end(),y.d(t),k&&k.d(),t&&a&&a.end(),f=0,r(d)}}}function Nt(n){let e,o=(n[6].html??n[6].element.outerHTML)+"";return{c(){e=g("div"),w(e,"class","bp-html")},m(t,n){b(t,e,n),e.innerHTML=o},p(t,n){64&n[0]&&o!==(o=(t[6].html??t[6].element.outerHTML)+"")&&(e.innerHTML=o)},i:t,o:t,d(t){t&&h(e)}}}function Ot(n){let e,o;return e=new zt({P:{P:n[13]()}}),{c(){Z(e.u.l)},m(t,n){tt(e,t,n),o=1},p:t,i(t){o||(G(e.u.l,t),o=1)},o(t){H(e.u.l,t),o=0},d(t){nt(e,t)}}}function Ct(n){let e,o;return e=new Tt({P:{P:n[13]()}}),{c(){Z(e.u.l)},m(t,n){tt(e,t,n),o=1},p:t,i(t){o||(G(e.u.l,t),o=1)},o(t){H(e.u.l,t),o=0},d(t){nt(e,t)}}}function Et(t){let n,e;return n=new _t({P:{P:t[13](),q:t[7]}}),{c(){Z(n.u.l)},m(t,o){tt(n,t,o),e=1},p(t,e){const o={};128&e[0]&&(o.q=t[7]),n.C(o)},i(t){e||(G(n.u.l,t),e=1)},o(t){H(n.u.l,t),e=0},d(t){nt(n,t)}}}function Rt(t){let n,e,o,r=t[6].caption+"";return{c(){n=g("div"),w(n,"class","bp-cap")},m(t,e){b(t,n,e),n.innerHTML=r,o=1},p(t,e){(!o||64&e[0])&&r!==(r=t[6].caption+"")&&(n.innerHTML=r)},i(t){o||(e&&e.end(1),o=1)},o(t){e=V(n,it,{duration:200}),o=0},d(t){t&&h(n),t&&e&&e.end()}}}function jt(t){let n,e,o,i,c,s,u,l,a;const p=[Et,Ct,Ot,Nt],f=[];function d(t,n){return t[6].img?0:t[6].sources?1:t[6].iframe?2:3}e=d(t),o=f[e]=p[e](t);let m=t[6].caption&&Rt(t);return{c(){n=g("div"),o.c(),m&&m.c(),s=x(),w(n,"class","bp-inner")},m(o,r){b(o,n,r),f[e].m(n,null),m&&m.m(o,r),b(o,s,r),u=1,l||(a=[v(n,"pointerdown",t[20]),v(n,"pointerup",t[21])],l=1)},p(t,r){let i=e;e=d(t),e===i?f[e].p(t,r):(X(),H(f[i],1,1,(()=>{f[i]=null})),Y(),o=f[e],o?o.p(t,r):(o=f[e]=p[e](t),o.c()),G(o,1),o.m(n,null)),t[6].caption?m?(m.p(t,r),64&r[0]&&G(m,1)):(m=Rt(t),m.c(),G(m,1),m.m(s.parentNode,s)):m&&(X(),H(m,1,1,(()=>{m=null})),Y())},i(e){u||(G(o),R((()=>{c&&c.end(1),i=U(n,t[12],1),i.start()})),G(m),u=1)},o(e){H(o),i&&i.S(),c=V(n,t[12],0),H(m),u=0},d(t){t&&h(n),f[e].d(),t&&c&&c.end(),m&&m.d(t),t&&h(s),l=0,r(a)}}}function qt(t){let n,e,o,i,c,s=`${t[4]+1} / ${t[0].length}`;return{c(){n=g("div"),e=g("button"),o=g("button"),w(n,"class","bp-count"),w(e,"class","bp-prev"),w(e,"title","Previous"),w(e,"aria-label","Previous"),w(o,"class","bp-next"),w(o,"title","Next"),w(o,"aria-label","Next")},m(r,u){b(r,n,u),n.innerHTML=s,b(r,e,u),b(r,o,u),i||(c=[v(e,"click",t[2]),v(o,"click",t[3])],i=1)},p(t,e){17&e[0]&&s!==(s=`${t[4]+1} / ${t[0].length}`)&&(n.innerHTML=s)},d(t){t&&h(n),t&&h(e),t&&h(o),i=0,r(c)}}}function Ft(t){let n,e,o=t[0]&&At(t);return{c(){o&&o.c(),n=x()},m(t,r){o&&o.m(t,r),b(t,n,r),e=1},p(t,e){t[0]?o?(o.p(t,e),1&e[0]&&G(o,1)):(o=At(t),o.c(),G(o,1),o.m(n.parentNode,n)):o&&(X(),H(o,1,1,(()=>{o=null})),Y())},i(t){e||(G(o),e=1)},o(t){H(o),e=0},d(t){o&&o.d(t),t&&h(n)}}}function Jt(t,n,e){let o,{items:r}=n,{target:i}=n;const c=document.documentElement;let u,l,a,p,f,d,m,b,h;const g=()=>!h.img&&!h.sources&&!h.iframe;let x;const v=t=>x=t,w={},y=st(0);s(t,y,(t=>e(10,o=t)));const $=()=>{l.onClose?.(w.el,h),at.set(1),e(0,r=null),p?.focus({preventScroll:1})},k=()=>M(u-1),_=()=>M(u+1),M=t=>{m=t-u,e(4,u=S(t))},S=t=>(t+r.length)%r.length,z=t=>{const{key:n,shiftKey:e}=t;if("Escape"===n)!l.noClose&&$();else if("ArrowRight"===n)_();else if("ArrowLeft"===n)k();else if("Tab"===n){const{activeElement:n}=document;if(e||!n.controls){t.preventDefault();const{focusWrap:o=w.el}=l,r=[...o.querySelectorAll("*")].filter((t=>t.tabIndex>=0));let i=r.indexOf(n);i+=r.length+(e?-1:1),r[i%r.length].focus()}}},I=({width:t=1920,height:n=1080})=>{const{scale:e=.99}=l,o=Math.min(1,w.w/t*e,w.h/n*e);return[Math.round(t*o),Math.round(n*o)]},P=()=>{if(r){const t=r[S(u+1)],n=r[S(u-1)];!t.preload&&T(t),!n.preload&&T(n)}},T=t=>{if(t.img){const n=document.createElement("img");return n.sizes=l.sizes||I(t)[0]+"px",n.srcset=t.img,t.preload=1,n.decode().catch((t=>{}))}};return t.R=t=>{"items"in t&&e(0,r=t.items),"target"in t&&e(15,i=t.target)},t.u.update=()=>{786545&t.u.v[0]&&r&&(e(6,h=r[u]),a&&l.onUpdate?.(w.el,h))},[r,$,k,_,u,l,h,f,d,b,o,y,(t,n)=>a&&r?it(t,{x:(m>0?20:-20)*(n?1:-1),duration:250}):(e(18,a=n),l.intro?it(t,{y:n?10:-10}):(t=>{let n;if(g()){const e=t.firstChild.firstChild;n=[e.clientWidth,e.clientHeight]}else n=I(h);const e=(h.element||p).getBoundingClientRect(),o=e.left-(w.w-e.width)/2,r=e.top-(w.h-e.height)/2,i=e.width/n[0],c=e.height/n[1];return{duration:480,_:rt,css:(t,n)=>`transform:translate3d(${o*n}px, ${r*n}px, 0) scale3d(${i+t*(1-i)}, ${c+t*(1-c)}, 1)`}})(t)),()=>({j:h,B:I,K:T,L:P,F:l,J:k,next:_,close:$,D:v,zoomed:y,container:w}),t=>{let n;e(19,w.el=t,w),l.onOpen?.(w.el,h),d||globalThis.addEventListener("keydown",z);const o=new ResizeObserver((t=>{n&&(e(19,w.w=t[0].contentRect.width,w),e(19,w.h=t[0].contentRect.height,w),e(7,f=769>w.w),g()||x?.(),l.onResize?.(w.el,h)),n=1}));return o.observe(t),{destroy(){o.disconnect(),globalThis.removeEventListener("keydown",z),at.set(0),c.classList.remove("bp-lock"),l.onClosed?.()}}},i,t=>{e(5,l=t),e(8,d=l.inline),!d&&c.scrollHeight>c.clientHeight&&c.classList.add("bp-lock"),p=document.activeElement,e(19,w.w=i.offsetWidth,w),e(19,w.h=i===document.body?globalThis.innerHeight:i.clientHeight,w),e(7,f=769>w.w),e(4,u=l.position||0),e(0,r=[]);for(let t=0;(l.items.length||1)>t;t++){let n=l.items[t]||l.items;"dataset"in n?r.push({element:n,i:t,...n.dataset}):(n.i=t,r.push(n),n=n.element),l.el&&l.el===n&&e(4,u=t)}},M,a,w,t=>e(9,b=t.target),function(t){2!==t.button&&t.target===this&&b===this&&!l.noClose&&$()}]}class Bt extends ot{constructor(t){super(),et(this,t,Jt,Ft,c,{items:0,target:15,open:16,close:1,J:2,next:3,setPosition:17},null,[-1,-1])}get items(){return this.u.$[0]}get target(){return this.u.$[15]}get open(){return this.u.$[16]}get close(){return this.u.$[1]}get J(){return this.u.$[2]}get next(){return this.u.$[3]}get setPosition(){return this.u.$[17]}}return t=>new Bt({...t,P:t})}(); diff --git a/assets/scripts/gallery-init.js b/assets/scripts/gallery-init.js new file mode 100755 index 0000000..548a989 --- /dev/null +++ b/assets/scripts/gallery-init.js @@ -0,0 +1,255 @@ +document.addEventListener('DOMContentLoaded', () => { + if (typeof window.BiggerPicture !== 'function') { + console.error('[gallery-init] BiggerPicture not found. Check script path.'); + return; + } + + // 1) Wrap Org-exported images so they’re clickable + const imgs = document.querySelectorAll('.figure img, img.org-svg'); + imgs.forEach((img) => { + if (img.closest('a')) return; // already wrapped + const a = document.createElement('a'); + const href = img.currentSrc || img.src; + a.href = href; + a.dataset.img = href; // lets BP pre-size/raster slides + a.dataset.alt = img.alt || ''; + const setDims = () => { + a.dataset.width = img.naturalWidth || img.width || 1920; + a.dataset.height = img.naturalHeight || img.height || 1080; + }; + if (img.complete) setDims(); else img.addEventListener('load', setDims); + img.style.cursor = 'zoom-in'; + img.parentElement.insertBefore(a, img); + a.appendChild(img); + }); + + // 2) One global BP instance + const bp = BiggerPicture({ target: document.body }); + + // SVG pan/zoom handle + let activePanZoom = null; + const destroyPanZoom = () => { try { activePanZoom?.destroy(); } catch(_){} activePanZoom = null; }; + + // Simple rotate state (for non-SVG images) + let activeContainer = null; + let currentRotation = 0; + let rotateControls = null; + + + // 3) Build galleries per content container + const containers = document.querySelectorAll('main, article, .content, body'); + containers.forEach((container) => { + const links = Array.from(container.querySelectorAll('.figure a, a:has(img.org-svg)')); + if (!links.length) return; + + // Start the lightbox on click + links.forEach((link, index) => { + link.addEventListener('click', (e) => { + e.preventDefault(); + document.querySelectorAll(".theme-toggle").forEach(el => { + el.classList.add("hidden"); + }); + + bp.open({ + // IMPORTANT: pass the anchor ELEMENTS, not custom objects + items: links, + el: link, + caption: (el) => el.querySelector('img')?.alt || el.title || '', + maxZoom: 40, // for raster images (PNG/JPG); SVG handled separately + + // Fade-out polish + cleanup + onClose(containerEl) { + destroyPanZoom(); + teardownRotation(); + if (containerEl) containerEl.classList.add('bp-fadeout'); + const themeToggle = document.querySelector(".theme-toggle"); + if (themeToggle) { + themeToggle.classList.remove("hidden"); + } + }, + + // Called once after open and on every slide change + onOpen(containerEl) { setupRotation(containerEl); enhanceSVG(containerEl); }, + onUpdate(containerEl){ setupRotation(containerEl); enhanceSVG(containerEl); } + }); + }); + }); + }); + + // 4) Simple rotate buttons for raster images + function ensureRotateControls() { + if (rotateControls) return rotateControls; + + const wrapper = document.createElement('div'); + wrapper.className = 'bp-rotate-controls'; + Object.assign(wrapper.style, { + position: 'fixed', + bottom: '1.5rem', + right: '1.5rem', + display: 'flex', + gap: '0.5rem', + zIndex: '9999', + pointerEvents: 'auto' + }); + + const mkBtn = (label, title) => { + const btn = document.createElement('button'); + btn.type = 'button'; + btn.textContent = label; + btn.title = title; + btn.setAttribute('aria-label', title); + Object.assign(btn.style, { + padding: '0.4rem 0.6rem', + borderRadius: '999px', + border: 'none', + fontSize: '1.2rem', + cursor: 'pointer', + background: 'rgba(30,30,30,0.8)', + color: '#fff' + }); + return btn; + }; + + const left = mkBtn('⟲', 'Rotate image 90° left'); + const right = mkBtn('⟳', 'Rotate image 90° right'); + + left.addEventListener('click', (e) => { + e.stopPropagation(); // don’t close the lightbox + if (!activeContainer) return; + currentRotation = (currentRotation - 90 + 360) % 360; + applyRotation(); + }); + + right.addEventListener('click', (e) => { + e.stopPropagation(); + if (!activeContainer) return; + currentRotation = (currentRotation + 90) % 360; + applyRotation(); + }); + + wrapper.append(left, right); + document.body.appendChild(wrapper); + rotateControls = wrapper; + return rotateControls; + } + + function ensureRotateWrapper() { + if (!activeContainer) return null; + + const imgRoot = activeContainer.querySelector('.bp-img'); + if (!imgRoot) return null; + + let imgEl = imgRoot.querySelector('img'); + if (!imgEl) return null; + + const src = (imgEl.currentSrc || imgEl.src || '').toLowerCase(); + // We only rotate raster images; SVGs are handled via svg-pan-zoom + if (src.endsWith('.svg')) return null; + + let wrapper = imgRoot.querySelector('.bp-rotate-wrapper'); + if (!wrapper) { + wrapper = document.createElement('div'); + wrapper.className = 'bp-rotate-wrapper'; + wrapper.style.display = 'inline-block'; + wrapper.style.transformOrigin = 'center center'; + + imgRoot.appendChild(wrapper); + wrapper.appendChild(imgEl); + } else if (!wrapper.contains(imgEl)) { + // Slide changed and BiggerPicture replaced the + wrapper.innerHTML = ''; + wrapper.appendChild(imgEl); + } + + return wrapper; + } + + function applyRotation() { + const wrapper = ensureRotateWrapper(); + if (!wrapper) return; + wrapper.style.transform = `rotate(${currentRotation}deg)`; + } + + function setupRotation(containerEl) { + activeContainer = containerEl; + currentRotation = 0; + const controls = ensureRotateControls(); + controls.style.display = 'flex'; + applyRotation(); + } + + function teardownRotation() { + activeContainer = null; + currentRotation = 0; + if (rotateControls) { + rotateControls.style.display = 'none'; + } + } + + + // 4) If current slide is an SVG, swap to inline + enable svg-pan-zoom + async function enhanceSVG(containerEl) { + try { + destroyPanZoom(); + + const imgEl = containerEl.querySelector('.bp-img img'); + if (!imgEl) return; + + const src = imgEl.currentSrc || imgEl.src || ''; + const isSVG = src.toLowerCase().endsWith('.svg'); + const htmlLayer = containerEl.querySelector('.bp-html'); + if (!isSVG || !htmlLayer) { + // ensure any previous holder is removed and bitmap is visible + const old = htmlLayer?.querySelector('.bp-svg-holder'); + if (old) old.remove(); + imgEl.style.visibility = ''; + return; + } + + // Create/clear holder + let holder = htmlLayer.querySelector('.bp-svg-holder'); + if (!holder) { + holder = document.createElement('div'); + holder.className = 'bp-svg-holder'; + holder.style.maxWidth = '95vw'; + holder.style.maxHeight = '95vh'; + htmlLayer.appendChild(holder); + } + holder.innerHTML = ''; + + // Hide the bitmap so only the inline SVG shows + imgEl.style.visibility = 'hidden'; + + // Inline the SVG + const res = await fetch(src, { cache: 'force-cache' }); + const text = await res.text(); + holder.innerHTML = text; + + const svg = holder.querySelector('svg'); + if (!svg) { imgEl.style.visibility = ''; return; } + + svg.style.maxWidth = '95vw'; + svg.style.maxHeight = '95vh'; + svg.style.display = 'block'; + + if (typeof window.svgPanZoom === 'function') { + activePanZoom = svgPanZoom(svg, { + zoomEnabled: true, + controlIconsEnabled: true, + fit: true, + center: true, + minZoom: 0.05, + maxZoom: 400, // effectively "unlimited" + zoomScaleSensitivity: 0.25, + dblClickZoomEnabled: true + }); + // Keep wheel inside lightbox + holder.addEventListener('wheel', (e) => e.stopPropagation(), { passive: true }); + } else { + console.warn('[gallery-init] svg-pan-zoom not loaded'); + } + } catch (err) { + console.error('[gallery-init] SVG enhance failed:', err); + } + } +}); diff --git a/assets/scripts/script.js b/assets/scripts/script.js new file mode 100755 index 0000000..950ab7e --- /dev/null +++ b/assets/scripts/script.js @@ -0,0 +1,434 @@ +/* ========================================================= + BOOTSTRAP + ========================================================= */ + +document.addEventListener("DOMContentLoaded", () => { + initCopyButtons(); + initFootnoteSidenotes(); + initThemeToggle(); + initCountdowns(); + initTOCHighlighting(); + initStackedNavigation(); + restoreStackFromURL(); + initClearPanesButton(); + initInitialPaneControls(); + +}); + +/* ========================================================= + COPY BUTTONS (code blocks) + ========================================================= */ + +function initCopyButtons() { + document.querySelectorAll("pre.src").forEach(codeBlock => { + if (codeBlock.querySelector(".copy-btn")) return; // idempotent + + const button = document.createElement("button"); + button.className = "copy-btn"; + button.textContent = "Copy"; + codeBlock.appendChild(button); + + button.addEventListener("click", async () => { + const text = codeBlock.innerText.replace(button.innerText, "").trim(); + try { + await navigator.clipboard.writeText(text); + button.textContent = "Copied!"; + setTimeout(() => (button.textContent = "Copy"), 1500); + } catch { + button.textContent = "Failed"; + setTimeout(() => (button.textContent = "Copy"), 1500); + } + }); + }); +} + +/* ========================================================= + FOOTNOTES → SIDENOTES + ========================================================= */ + +function initFootnoteSidenotes() { + document.querySelectorAll('a.footref[href^="#fn"]').forEach(ref => { + const sup = ref.closest("sup") || ref; + + if (sup.nextElementSibling?.classList.contains("footnote-sidenote")) return; + + const targetId = ref.getAttribute("href").slice(1); + const anchor = document.getElementById(targetId); + if (!anchor) return; + + const footdef = anchor.closest(".footdef") || anchor.parentElement; + if (!footdef) return; + + let paras = footdef.querySelectorAll("p.footpara"); + if (!paras.length) { + paras = footdef.querySelectorAll(".footpara:not(:has(.footpara))"); + } + + let parts = []; + if (paras.length) { + const seen = new Set(); + parts = [...paras] + .map(p => { + const txt = p.textContent.trim().replace(/\s+/g, " "); + if (seen.has(txt)) return ""; + seen.add(txt); + return p.innerHTML.trim(); + }) + .filter(Boolean); + } + + if (!parts.length) { + const clone = footdef.cloneNode(true); + clone + .querySelectorAll("sup.footnum, a[role='doc-backlink']") + .forEach(n => n.remove()); + parts = [clone.innerHTML.trim()]; + } + + const sidenote = document.createElement("span"); + sidenote.className = "sidenote footnote-sidenote"; + sidenote.dataset.fn = ref.textContent.trim(); + sidenote.innerHTML = parts.join(" "); + + sup.insertAdjacentElement("afterend", sidenote); + }); +} + +/* ========================================================= + THEME TOGGLE + ========================================================= */ + +function initThemeToggle() { + const root = document.documentElement; + const key = "theme"; + const saved = localStorage.getItem(key); + + if (saved === "dark" || saved === "light") { + root.setAttribute("data-theme", saved); + } + + const btn = document.getElementById("theme-toggle"); + if (!btn) return; + + btn.addEventListener("click", () => { + const current = root.getAttribute("data-theme"); + const next = current === "dark" ? "light" : "dark"; + root.setAttribute("data-theme", next); + localStorage.setItem(key, next); + }); +} + +/* ========================================================= + COUNTDOWNS + ========================================================= */ + +function initCountdowns() { + const els = document.querySelectorAll("time.countdown"); + if (!els.length) return; + + const plural = (n, w) => `${n} ${w}${n === 1 ? "" : "s"}`; + + const render = el => { + const raw = el.getAttribute("datetime"); + const label = el.dataset.label || ""; + const target = new Date(raw); + if (isNaN(target)) { + el.textContent = "—"; + return; + } + + let diff = target - new Date(); + if (diff <= 0) { + el.textContent = `${label ? label + " " : ""}today`; + el.classList.add("expired"); + return; + } + + const d = Math.floor(diff / 86400000); diff %= 86400000; + const h = Math.floor(diff / 3600000); diff %= 3600000; + const m = Math.floor(diff / 60000); diff %= 60000; + const s = Math.floor(diff / 1000); + + const parts = []; + if (d) parts.push(plural(d, "day")); + parts.push(`${h}h ${m}m ${s}s`); + + el.textContent = `${label ? label + " in: " : ""}${parts.join(" ")}`; + }; + + const tick = () => els.forEach(render); + tick(); + setInterval(tick, 1000); +} + +/* ========================================================= + TABLE OF CONTENTS HIGHLIGHTING + ========================================================= */ + +function initTOCHighlighting() { + const toc = document.querySelector("#text-table-of-contents"); + if (!toc) return; + + const links = [...toc.querySelectorAll('a[href^="#"]')]; + if (!links.length) return; + + const linkById = new Map(); + links.forEach(a => { + const id = decodeURIComponent(a.hash.slice(1)); + const el = document.getElementById(id); + if (el) linkById.set(id, a); + }); + + const headings = [...document.querySelectorAll("h2[id], h3[id], h4[id]")] + .filter(h => linkById.has(h.id)); + + const setActive = id => { + links.forEach(a => { + const active = a.hash === `#${id}`; + a.classList.toggle("is-active", active); + a.toggleAttribute("aria-current", active); + }); + }; + + const headerOffset = + 6.5 * parseFloat(getComputedStyle(document.documentElement).fontSize); + + const visible = new Map(); + + const observer = new IntersectionObserver(entries => { + entries.forEach(entry => { + const id = entry.target.id; + if (entry.isIntersecting) { + visible.set(id, entry.target.getBoundingClientRect().top - headerOffset); + } else { + visible.delete(id); + } + }); + + if (visible.size) { + const [id] = [...visible.entries()] + .sort((a, b) => Math.abs(a[1]) - Math.abs(b[1]))[0]; + setActive(id); + } + }, { + rootMargin: `-${headerOffset}px 0px -70% 0px`, + threshold: [0, 0.01, 0.1] + }); + + headings.forEach(h => observer.observe(h)); + + toc.addEventListener("click", e => { + const a = e.target.closest('a[href^="#"]'); + if (!a) return; + const id = decodeURIComponent(a.hash.slice(1)); + const el = document.getElementById(id); + if (!el) return; + + e.preventDefault(); + el.scrollIntoView({ behavior: "smooth", block: "start" }); + el.setAttribute("tabindex", "-1"); + el.focus({ preventScroll: true }); + history.pushState(null, "", `#${id}`); + }); +} + +let fullscreenSnapshot = null; + + +/* ========================================================= + STACKED NAVIGATION (PANES) + ========================================================= */ + +function initStackedNavigation() { + document.addEventListener("click", e => { + const link = e.target.closest("a"); + if (!link) return; + + const href = link.getAttribute("href"); + if (!href || href.startsWith("#")) return; + + const url = new URL(href, location.href); + if (url.origin !== location.origin) return; + if (!url.pathname.endsWith(".html")) return; + + e.preventDefault(); + pushPane(url.pathname + url.hash); + }); +} + +async function pushPane(urlWithHash) { + const track = document.querySelector(".stack-track"); + if (!track) return; + + const existing = [...track.children].find(p => p.dataset.url === urlWithHash); + if (existing) { + existing.scrollIntoView({ behavior: "smooth", inline: "end" }); + return; + } + + const [url, hash] = urlWithHash.split("#"); + const res = await fetch(url); + const doc = new DOMParser().parseFromString(await res.text(), "text/html"); + + const content = doc.querySelector("#content"); + if (!content) return; + + const pane = document.createElement("article"); + pane.className = "stack-pane"; + pane.dataset.url = urlWithHash; + + pane.appendChild(content); + track.appendChild(pane); + pane.scrollIntoView({ behavior: "smooth", inline: "end" }); + + if (hash) { + requestAnimationFrame(() => { + pane.querySelector(`#${CSS.escape(hash)}`) + ?.scrollIntoView({ behavior: "smooth", block: "start" }); + }); + } + + // Find the title-section and attach event listeners to the controls + const titleSection = pane.querySelector(".title-section"); + if (titleSection) { + const closeBtn = titleSection.querySelector(".pane-close"); + const fullscreenBtn = titleSection.querySelector(".pane-fullscreen"); + + if (closeBtn) { + closeBtn.addEventListener("click", () => { + if (document.body.classList.contains("pane-fullscreen")) { + exitFullscreen({ removePane: pane }); + return; + } + pane.remove(); + updateURL(); + }); + } + + if (fullscreenBtn) { + fullscreenBtn.addEventListener("click", () => { + if (pane.classList.contains("is-fullscreen")) { + exitFullscreen(); + } else { + enterFullscreen(pane); + } + }); + } + } + + updateURL(); +} + +function initInitialPaneControls() { + // Initialize controls for the initial pane (pane-root) that's already in the HTML + const initialPane = document.querySelector(".pane-root"); + if (!initialPane) return; + + const titleSection = initialPane.querySelector(".title-section"); + if (!titleSection) return; + + const closeBtn = titleSection.querySelector(".pane-close"); + const fullscreenBtn = titleSection.querySelector(".pane-fullscreen"); + + if (closeBtn) { + closeBtn.addEventListener("click", () => { + if (document.body.classList.contains("pane-fullscreen")) { + exitFullscreen({ removePane: initialPane }); + return; + } + initialPane.remove(); + updateURL(); + }); + } + + if (fullscreenBtn) { + fullscreenBtn.addEventListener("click", () => { + if (initialPane.classList.contains("is-fullscreen")) { + exitFullscreen(); + } else { + enterFullscreen(initialPane); + } + }); + } +} + +document.addEventListener("keydown", e => { + if (e.key === "Escape" && document.body.classList.contains("pane-fullscreen")) { + exitFullscreen(); + } +}); + + +function enterFullscreen(pane) { + if (!fullscreenSnapshot) { + fullscreenSnapshot = [...document.querySelectorAll(".stack-pane")] + .map(p => p.dataset.url); + } + + document.querySelectorAll(".stack-pane").forEach(p => { + if (p !== pane) p.remove(); + }); + + document.body.classList.add("pane-fullscreen"); + pane.classList.add("is-fullscreen"); + + updateURL(); +} + + +async function exitFullscreen({ removePane } = {}) { + if (!fullscreenSnapshot) return; + + const removeUrl = removePane?.dataset.url; + + document.body.classList.remove("pane-fullscreen"); + + document + .querySelectorAll(".stack-pane.is-fullscreen") + .forEach(p => p.remove()); + + // Restore stack EXCEPT the removed pane + for (const url of fullscreenSnapshot) { + if (url === removeUrl) continue; + await pushPane(url); + } + + fullscreenSnapshot = null; + updateURL(); +} + + +function clearAllPanes() { + const panes = [...document.querySelectorAll(".stack-pane")]; + + panes.slice(1).forEach(pane => pane.remove()); + + updateURL(); +} + +function updateURL() { + const urls = [...document.querySelectorAll(".stack-pane")] + .map(p => p.dataset.url); + + const params = new URLSearchParams(location.search); + params.set("stackedNotes", urls.join("|")); + history.replaceState({}, "", "?" + params.toString()); +} + +async function restoreStackFromURL() { + const params = new URLSearchParams(location.search); + const stack = params.get("stackedNotes"); + if (!stack) return; + + for (const url of stack.split("|").slice(1)) { + await pushPane(url); + } +} +function initClearPanesButton() { + const btn = document.getElementById("close-all"); + if (!btn) return; + + btn.addEventListener("click", () => { + clearAllPanes(); + }); +} diff --git a/assets/scripts/script.js~ b/assets/scripts/script.js~ new file mode 100755 index 0000000..bf8af6c --- /dev/null +++ b/assets/scripts/script.js~ @@ -0,0 +1,335 @@ + + +/* Event listener function for the COPY BUTTON */ +document.addEventListener("DOMContentLoaded", function () { + document.querySelectorAll("pre.src").forEach(function (codeBlock) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-btn"; + + // Append button inside
+	codeBlock.appendChild(button);
+
+	button.addEventListener("click", function () {
+	    const text = codeBlock.innerText.replace(button.innerText, ""); // exclude button text
+	    navigator.clipboard.writeText(text.trim()).then(() => {
+		button.innerText = "Copied!";
+		setTimeout(() => (button.innerText = "Copy"), 1500);
+	    });
+	});
+    });
+});
+
+
+/* Event listener for footnotes and sidenotes*/
+document.addEventListener("DOMContentLoaded", () => {
+    document.querySelectorAll('a.footref[href^="#fn"]').forEach(ref => {
+	const sup = ref.closest("sup") || ref;
+	// idempotent: don't insert twice
+	if (sup.nextElementSibling && sup.nextElementSibling.classList?.contains("footnote-sidenote")) return;
+	
+	const targetId = ref.getAttribute("href").replace(/^#/, ""); // works for fn.2 or fn2
+
+	const anchor   = document.getElementById(targetId);
+	if (!anchor) return;
+	
+	const footdef = anchor.closest(".footdef") || anchor.parentElement;
+	if (!footdef) return;
+	
+	// 1) Prefer leaf paragraphs to avoid div+p duplication
+	let paras = footdef.querySelectorAll("p.footpara");
+	if (!paras.length) {
+	    // fallback: any .footpara elements that don't contain another .footpara
+	    paras = footdef.querySelectorAll(".footpara:not(:has(.footpara))");
+	}
+
+	// 2) Build HTML, de-duplicating by text content
+	let parts = [];
+	if (paras.length) {
+	    const seen = new Set();
+	    parts = Array.from(paras).map(p => {
+		const txt = p.textContent.trim().replace(/\s+/g, " ");
+		if (seen.has(txt)) return "";
+		seen.add(txt);
+		return p.innerHTML.trim();
+	    }).filter(Boolean);
+	}
+
+	// 3) Fallback: clean full block if no paras found
+	if (!parts.length) {
+	    const clone = footdef.cloneNode(true);
+	    clone.querySelectorAll("sup.footnum, a[role='doc-backlink']").forEach(n => n.remove());
+	    parts = [clone.innerHTML.trim()];
+	}
+
+	// 4) Insert the sidenote
+	const sn = document.createElement("span");
+	sn.className = "sidenote footnote-sidenote";
+	sn.setAttribute("data-fn", (ref.textContent || "").trim());
+	sn.innerHTML = parts.join(" ");
+	
+	sup.insertAdjacentElement("afterend", sn);
+    });
+});
+
+
+/* Function for setting the theme */
+(function(){
+    const root = document.documentElement;
+    const storageKey = "theme";
+    const saved = localStorage.getItem(storageKey);
+    if (saved === "dark" || saved === "light") {
+	root.setAttribute("data-theme", saved);
+    }
+    const btn = document.getElementById("theme-toggle");
+    if (!btn) return;
+    btn.addEventListener("click", () => {
+	const current = root.getAttribute("data-theme");
+	const next = current === "dark" ? "light" : "dark";
+	// If no current (auto), assume we’re toggling to dark first
+	const target = current ? next : "dark";
+	root.setAttribute("data-theme", target);
+	localStorage.setItem(storageKey, target);
+    });
+})();
+
+
+// Simple, timezone-safe if you pass UTC (…Z) in the datetime
+document.addEventListener('DOMContentLoaded', () => {
+  const els = document.querySelectorAll('time.countdown');
+  if (!els.length) return;
+
+  const plural = (n, w) => `${n} ${w}${n === 1 ? '' : 's'}`;
+
+  const render = (el) => {
+    const raw = el.getAttribute('datetime');
+    const label = el.dataset.label || '';
+    const target = new Date(raw);           // Prefer ISO like 2025-12-31T00:00:00Z
+    if (isNaN(target)) { el.textContent = '—'; return; }
+
+    const now = new Date();
+    let diff = target - now;
+
+    if (diff <= 0) {
+      el.textContent = `${label ? label + ' ' : ''}today`;
+      el.classList.add('expired');
+      return;
+    }
+
+    const d = Math.floor(diff / 86400000);  diff -= d * 86400000;
+    const h = Math.floor(diff / 3600000);   diff -= h * 3600000;
+    const m = Math.floor(diff / 60000);     diff -= m * 60000;
+    const s = Math.floor(diff / 1000);
+
+    const pieces = [];
+    if (d) pieces.push(plural(d, 'day'));
+    pieces.push(`${h}h ${m}m ${s}s`);
+
+    el.textContent = `${label ? label + ' in : ' : ''}${pieces.join(' ')}`;
+  };
+
+  const tick = () => els.forEach(render);
+  tick();
+  setInterval(tick, 1000); // update every second
+});
+
+
+
+/* Event listener for scrolling and changing the active label on the TOC */
+document.addEventListener("DOMContentLoaded", () => {
+    const toc = document.querySelector("#text-table-of-contents");
+    if (!toc) { console.warn("No #text-table-of-contents found"); return; }
+
+    const links = toc.querySelectorAll('a[href^="#"]'); // '^=' is a starts with operator.
+    // Intro   matches  
+    if (!links.length) { console.warn("No ToC links found"); return; }
+
+    // Map: id -> link
+    const linkById = new Map();
+    links.forEach(a => {
+	const id = decodeURIComponent(a.getAttribute("href").slice(1));
+	const el = document.getElementById(id);
+	if (el) linkById.set(id, a);
+    });
+    if (!linkById.size) { console.warn("No matching headings with IDs"); return; }
+
+    // Headings to observe (h2–h4 usually)
+    const headings = [...document.querySelectorAll("h2[id], h3[id], h4[id]")]
+	  .filter(h => linkById.has(h.id));
+
+    // Helper to mark active
+    const setActive = (id) => {
+	links.forEach(a => {
+	    const active = a.getAttribute("href") === `#${id}`;
+	    a.classList.toggle("is-active", active);
+	    if (active) a.setAttribute("aria-current", "true");
+	    else a.removeAttribute("aria-current");
+	});
+    };
+
+    // Calculate sticky header offset in px
+    const headerOffsetPx = 6.5 * parseFloat(getComputedStyle(document.documentElement).fontSize);
+
+    // Track visible headings (id -> distance from top)
+    const visible = new Map();
+
+    const observer = new IntersectionObserver((entries) => {
+	entries.forEach(entry => {
+	    const id = entry.target.id;
+	    if (entry.isIntersecting) {
+		// How far from the top (after header offset)
+		const dist = entry.target.getBoundingClientRect().top - headerOffsetPx;
+		visible.set(id, dist);
+	    } else {
+		visible.delete(id);
+	    }
+	});
+	
+	if (visible.size) {
+	    // Choose the heading closest to the top (>= -headerOffset)
+	    const topMost = [...visible.entries()]
+		  .sort((a,b) => Math.abs(a[1]) - Math.abs(b[1]))[0][0];
+	    setActive(topMost);
+	    // console.log("Active:", topMost, visible);
+	}
+    }, {
+	root: null,                                   // track relative to viewport
+	rootMargin: `-${headerOffsetPx}px 0px -70% 0px`,
+	threshold: [0, 0.01, 0.1]                     // fire as soon as it enters
+    });
+    
+    headings.forEach(h => observer.observe(h));
+
+    // Initial highlight (in case load mid‑page)
+    let bestId = null, bestDist = Infinity;
+    headings.forEach(h => {
+	const top = h.getBoundingClientRect().top - headerOffsetPx;
+	const dist = top < 0 ? Math.abs(top) : top + 1e6;
+	if (dist < bestDist) { bestDist = dist; bestId = h.id; }
+    });
+    if (bestId) setActive(bestId);
+    
+    // smooth-scroll ToC clicks
+    toc.addEventListener("click", (e) => {
+	const a = e.target.closest('a[href^="#"]');
+	if (!a) return;
+	const id = decodeURIComponent(a.hash.slice(1));
+	const el = document.getElementById(id);
+	if (!el) return;
+	e.preventDefault();
+	el.scrollIntoView({ behavior: "smooth", block: "start" });
+	el.setAttribute("tabindex", "-1");
+	el.focus({ preventScroll: true });
+	history.pushState(null, "", `#${id}`);
+    });
+});
+
+
+document.addEventListener("click", (e) => {
+  const link = e.target.closest("a");
+  if (!link) return;
+
+  const href = link.getAttribute("href");
+  if (!href) return;
+
+  // Ignore pure fragment links (#foo)
+  if (href.startsWith("#")) return;
+
+  // Resolve relative → absolute
+  const url = new URL(href, window.location.href);
+
+  // Only intercept same-origin HTML pages
+  if (url.origin !== window.location.origin) return;
+  if (!url.pathname.endsWith(".html")) return;
+
+  e.preventDefault();
+
+  pushPane(url.pathname + url.hash);
+});
+
+async function pushPane(urlWithHash) {
+  const [url, hash] = urlWithHash.split("#");
+
+  const track = document.querySelector(".stack-track");
+
+const existing = [...track.children].find(p => p.dataset.url === urlWithHash);
+if (existing) {
+  existing.scrollIntoView({ behavior: "smooth", inline: "end" });
+  return;
+}
+  const res = await fetch(url);
+  const html = await res.text();
+  const doc = new DOMParser().parseFromString(html, "text/html");
+
+  const content = doc.querySelector("#content");
+  if (!content) return;
+
+  const pane = document.createElement("article");
+  pane.className = "stack-pane";
+  pane.dataset.url = urlWithHash;
+  
+  pane.innerHTML = `
+  
+ +
+`; + + pane.appendChild(content); + track.appendChild(pane); + pane.scrollIntoView({ behavior: "smooth", inline: "end" }); + + // Scroll to the anchor if present + if (hash) { + requestAnimationFrame(() => { + const target = pane.querySelector(`#${CSS.escape(hash)}`); + target?.scrollIntoView({ behavior: "smooth", block: "start" }); + }); + } +pane.querySelector(".pane-close").addEventListener("click", () => { + pane.remove(); + updateURL(); +}); + + updateURL(); +} + +function updateURL() { + const panes = [...document.querySelectorAll(".stack-pane")]; + + const urls = panes.map(p => p.dataset.url); + + const params = new URLSearchParams(window.location.search); + params.set("stackedNotes", urls.join("|")); + + history.replaceState({}, "", "?" + params.toString()); +} + +window.addEventListener("DOMContentLoaded", async () => { + const params = new URLSearchParams(window.location.search); + const stack = params.get("stackedNotes"); + if (!stack) return; + + const urls = stack.split("|"); + + // First pane is already rendered by Org + const base = urls[0]; + const current = window.location.pathname + window.location.hash; + + // Only continue if URL matches base + if (base !== current && !base.startsWith(window.location.pathname)) { + console.warn("Stack base mismatch:", base, current); + return; + } + + // Load remaining panes sequentially + for (const url of urls.slice(1)) { + await pushPane(url); + } + + // Scroll to last pane + const panes = document.querySelectorAll(".stack-pane"); + panes[panes.length - 1]?.scrollIntoView({ + behavior: "auto", + inline: "end" + }); +}); diff --git a/assets/scripts/search.js b/assets/scripts/search.js new file mode 100755 index 0000000..055614c --- /dev/null +++ b/assets/scripts/search.js @@ -0,0 +1,180 @@ +/* ========================================================= + STATE + ========================================================= */ + +let index = []; +let activeIndex = -1; + +const box = document.getElementById("search-box"); +const results = document.getElementById("search-results"); + +/* ========================================================= + LOAD SEARCH INDEX + ========================================================= */ + +fetch("/search-index.json") + .then(r => r.json()) + .then(data => { + index = Array.isArray(data) ? data : []; + }) + .catch(err => { + console.error("Failed to load search index:", err); + }); + +/* ========================================================= + RENDER RESULTS + ========================================================= */ + +function renderResults(items) { + clearResults(); + + items.forEach((entry, i) => { + const row = document.createElement("div"); + row.dataset.index = i; + + const link = document.createElement("a"); + link.href = entry.url; + link.textContent = entry.title; + + link.addEventListener("click", ev => { + ev.preventDefault(); + ev.stopPropagation(); + clearSearch(); + pushPane(entry.url); + }); + + row.appendChild(link); + + row.addEventListener("mouseenter", () => setActive(i)); + row.addEventListener("mouseleave", clearActive); + + results.appendChild(row); + }); +} + +/* ========================================================= + ACTIVE ITEM HANDLING + ========================================================= */ + +function setActive(i) { + const items = [...results.children]; + + items.forEach(el => el.classList.remove("active")); + + if (items[i]) { + items[i].classList.add("active"); + activeIndex = i; + } +} + +function clearActive() { + [...results.children].forEach(el => el.classList.remove("active")); + activeIndex = -1; +} + +/* ========================================================= + INPUT HANDLER + ========================================================= */ + +box.addEventListener("input", () => { + const query = box.value.trim().toLowerCase(); + + clearResults(); + if (query.length < 2) return; + + const matches = index + .map(entry => ({ + ...entry, + score: fuzzyScore(query, entry.title) + })) + .filter(entry => entry.score > 0) + .sort((a, b) => b.score - a.score) + .slice(0, 20); // optional cap + + renderResults(matches); +}); + +/* ========================================================= + KEYBOARD NAVIGATION + ========================================================= */ + +box.addEventListener("keydown", e => { + const items = [...results.children]; + if (!items.length) return; + + switch (e.key) { + case "ArrowDown": + e.preventDefault(); + setActive((activeIndex + 1) % items.length); + break; + + case "ArrowUp": + e.preventDefault(); + setActive((activeIndex - 1 + items.length) % items.length); + break; + + case "Enter": + if (activeIndex < 0) return; + + e.preventDefault(); + e.stopPropagation(); + + const link = items[activeIndex].querySelector("a"); + if (link) { + clearSearch(); + pushPane(link.getAttribute("href")); + } + break; + + case "Escape": + clearSearch(); + break; + } +}); + +/* ========================================================= + CLICK OUTSIDE TO CLOSE + ========================================================= */ + +document.addEventListener("click", e => { + if (!e.target.closest(".banner-search")) { + clearSearch(); + } +}); + +/* ========================================================= + HELPERS + ========================================================= */ + +function clearResults() { + results.innerHTML = ""; +} + +function clearSearch() { + clearResults(); + activeIndex = -1; +} +function fuzzyScore(query, text) { + query = query.toLowerCase(); + text = text.toLowerCase(); + + let score = 0; + let qi = 0; + let consecutive = 0; + + for (let ti = 0; ti < text.length && qi < query.length; ti++) { + if (text[ti] === query[qi]) { + qi++; + consecutive++; + score += 5 + consecutive * 2; // reward runs + } else { + consecutive = 0; + } + } + + if (qi !== query.length) return 0; + + score += Math.max(0, 20 - text.length); + + return score; +} diff --git a/assets/scripts/search.js~ b/assets/scripts/search.js~ new file mode 100755 index 0000000..8255750 --- /dev/null +++ b/assets/scripts/search.js~ @@ -0,0 +1,34 @@ +let index = []; + +fetch("/search-index.json") + .then(r => r.json()) + .then(data => index = data); + +const box = document.getElementById("search-box"); +const results = document.getElementById("search-results"); + + +document.addEventListener("click", (e) => { + const searchBox = document.getElementById("search-box"); + const results = document.getElementById("search-results"); + +}); + + +box.addEventListener("input", () => { + const q = box.value.toLowerCase(); + results.innerHTML = ""; + + if (q.length < 2) return; + + index + .filter(e => + e.title.toLowerCase().includes(q) + ) + //.slice(0, 10) + .forEach(e => { + const div = document.createElement("div"); + div.innerHTML = `${e.title}`; + results.appendChild(div); + }); +}); diff --git a/assets/scripts/svg-pan-zoom.min.js b/assets/scripts/svg-pan-zoom.min.js new file mode 100755 index 0000000..844f34d --- /dev/null +++ b/assets/scripts/svg-pan-zoom.min.js @@ -0,0 +1,27 @@ +// svg-pan-zoom v3.6.2 +// https://github.com/bumbu/svg-pan-zoom +/* Copyright 2009-2010 Andrea Leofreddi +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +!function s(r,a,l){function u(e,t){if(!a[e]){if(!r[e]){var o="function"==typeof require&&require;if(!t&&o)return o(e,!0);if(h)return h(e,!0);var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var i=a[e]={exports:{}};r[e][0].call(i.exports,function(t){return u(r[e][1][t]||t)},i,i.exports,s,r,a,l)}return a[e].exports}for(var h="function"==typeof require&&require,t=0;tthis.options.maxZoom*n.zoom&&(t=this.options.maxZoom*n.zoom/this.getZoom());var i=this.viewport.getCTM(),s=e.matrixTransform(i.inverse()),r=this.svg.createSVGMatrix().translate(s.x,s.y).scale(t).translate(-s.x,-s.y),a=i.multiply(r);a.a!==i.a&&this.viewport.setCTM(a)},i.prototype.zoom=function(t,e){this.zoomAtPoint(t,a.getSvgCenterPoint(this.svg,this.width,this.height),e)},i.prototype.publicZoom=function(t,e){e&&(t=this.computeFromRelativeZoom(t)),this.zoom(t,e)},i.prototype.publicZoomAtPoint=function(t,e,o){if(o&&(t=this.computeFromRelativeZoom(t)),"SVGPoint"!==r.getType(e)){if(!("x"in e&&"y"in e))throw new Error("Given point is invalid");e=a.createSVGPoint(this.svg,e.x,e.y)}this.zoomAtPoint(t,e,o)},i.prototype.getZoom=function(){return this.viewport.getZoom()},i.prototype.getRelativeZoom=function(){return this.viewport.getRelativeZoom()},i.prototype.computeFromRelativeZoom=function(t){return t*this.viewport.getOriginalState().zoom},i.prototype.resetZoom=function(){var t=this.viewport.getOriginalState();this.zoom(t.zoom,!0)},i.prototype.resetPan=function(){this.pan(this.viewport.getOriginalState())},i.prototype.reset=function(){this.resetZoom(),this.resetPan()},i.prototype.handleDblClick=function(t){var e;if((this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),this.options.controlIconsEnabled)&&-1<(t.target.getAttribute("class")||"").indexOf("svg-pan-zoom-control"))return!1;e=t.shiftKey?1/(2*(1+this.options.zoomScaleSensitivity)):2*(1+this.options.zoomScaleSensitivity);var o=a.getEventPoint(t,this.svg).matrixTransform(this.svg.getScreenCTM().inverse());this.zoomAtPoint(e,o)},i.prototype.handleMouseDown=function(t,e){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),r.mouseAndTouchNormalize(t,this.svg),this.options.dblClickZoomEnabled&&r.isDblClick(t,e)?this.handleDblClick(t):(this.state="pan",this.firstEventCTM=this.viewport.getCTM(),this.stateOrigin=a.getEventPoint(t,this.svg).matrixTransform(this.firstEventCTM.inverse()))},i.prototype.handleMouseMove=function(t){if(this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),"pan"===this.state&&this.options.panEnabled){var e=a.getEventPoint(t,this.svg).matrixTransform(this.firstEventCTM.inverse()),o=this.firstEventCTM.translate(e.x-this.stateOrigin.x,e.y-this.stateOrigin.y);this.viewport.setCTM(o)}},i.prototype.handleMouseUp=function(t){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),"pan"===this.state&&(this.state="none")},i.prototype.fit=function(){var t=this.viewport.getViewBox(),e=Math.min(this.width/t.width,this.height/t.height);this.zoom(e,!0)},i.prototype.contain=function(){var t=this.viewport.getViewBox(),e=Math.max(this.width/t.width,this.height/t.height);this.zoom(e,!0)},i.prototype.center=function(){var t=this.viewport.getViewBox(),e=.5*(this.width-(t.width+2*t.x)*this.getZoom()),o=.5*(this.height-(t.height+2*t.y)*this.getZoom());this.getPublicInstance().pan({x:e,y:o})},i.prototype.updateBBox=function(){this.viewport.simpleViewBoxCache()},i.prototype.pan=function(t){var e=this.viewport.getCTM();e.e=t.x,e.f=t.y,this.viewport.setCTM(e)},i.prototype.panBy=function(t){var e=this.viewport.getCTM();e.e+=t.x,e.f+=t.y,this.viewport.setCTM(e)},i.prototype.getPan=function(){var t=this.viewport.getState();return{x:t.x,y:t.y}},i.prototype.resize=function(){var t=a.getBoundingClientRectNormalized(this.svg);this.width=t.width,this.height=t.height;var e=this.viewport;e.options.width=this.width,e.options.height=this.height,e.processCTM(),this.options.controlIconsEnabled&&(this.getPublicInstance().disableControlIcons(),this.getPublicInstance().enableControlIcons())},i.prototype.destroy=function(){var e=this;for(var t in this.beforeZoom=null,this.onZoom=null,this.beforePan=null,this.onPan=null,(this.onUpdatedCTM=null)!=this.options.customEventsHandler&&this.options.customEventsHandler.destroy({svgElement:this.svg,eventsListenerElement:this.options.eventsListenerElement,instance:this.getPublicInstance()}),this.eventListeners)(this.options.eventsListenerElement||this.svg).removeEventListener(t,this.eventListeners[t],!this.options.preventMouseEventsDefault&&h);this.disableMouseWheelZoom(),this.getPublicInstance().disableControlIcons(),this.reset(),c=c.filter(function(t){return t.svg!==e.svg}),delete this.options,delete this.viewport,delete this.publicInstance,delete this.pi,this.getPublicInstance=function(){return null}},i.prototype.getPublicInstance=function(){var o=this;return this.publicInstance||(this.publicInstance=this.pi={enablePan:function(){return o.options.panEnabled=!0,o.pi},disablePan:function(){return o.options.panEnabled=!1,o.pi},isPanEnabled:function(){return!!o.options.panEnabled},pan:function(t){return o.pan(t),o.pi},panBy:function(t){return o.panBy(t),o.pi},getPan:function(){return o.getPan()},setBeforePan:function(t){return o.options.beforePan=null===t?null:r.proxy(t,o.publicInstance),o.pi},setOnPan:function(t){return o.options.onPan=null===t?null:r.proxy(t,o.publicInstance),o.pi},enableZoom:function(){return o.options.zoomEnabled=!0,o.pi},disableZoom:function(){return o.options.zoomEnabled=!1,o.pi},isZoomEnabled:function(){return!!o.options.zoomEnabled},enableControlIcons:function(){return o.options.controlIconsEnabled||(o.options.controlIconsEnabled=!0,s.enable(o)),o.pi},disableControlIcons:function(){return o.options.controlIconsEnabled&&(o.options.controlIconsEnabled=!1,s.disable(o)),o.pi},isControlIconsEnabled:function(){return!!o.options.controlIconsEnabled},enableDblClickZoom:function(){return o.options.dblClickZoomEnabled=!0,o.pi},disableDblClickZoom:function(){return o.options.dblClickZoomEnabled=!1,o.pi},isDblClickZoomEnabled:function(){return!!o.options.dblClickZoomEnabled},enableMouseWheelZoom:function(){return o.enableMouseWheelZoom(),o.pi},disableMouseWheelZoom:function(){return o.disableMouseWheelZoom(),o.pi},isMouseWheelZoomEnabled:function(){return!!o.options.mouseWheelZoomEnabled},setZoomScaleSensitivity:function(t){return o.options.zoomScaleSensitivity=t,o.pi},setMinZoom:function(t){return o.options.minZoom=t,o.pi},setMaxZoom:function(t){return o.options.maxZoom=t,o.pi},setBeforeZoom:function(t){return o.options.beforeZoom=null===t?null:r.proxy(t,o.publicInstance),o.pi},setOnZoom:function(t){return o.options.onZoom=null===t?null:r.proxy(t,o.publicInstance),o.pi},zoom:function(t){return o.publicZoom(t,!0),o.pi},zoomBy:function(t){return o.publicZoom(t,!1),o.pi},zoomAtPoint:function(t,e){return o.publicZoomAtPoint(t,e,!0),o.pi},zoomAtPointBy:function(t,e){return o.publicZoomAtPoint(t,e,!1),o.pi},zoomIn:function(){return this.zoomBy(1+o.options.zoomScaleSensitivity),o.pi},zoomOut:function(){return this.zoomBy(1/(1+o.options.zoomScaleSensitivity)),o.pi},getZoom:function(){return o.getRelativeZoom()},setOnUpdatedCTM:function(t){return o.options.onUpdatedCTM=null===t?null:r.proxy(t,o.publicInstance),o.pi},resetZoom:function(){return o.resetZoom(),o.pi},resetPan:function(){return o.resetPan(),o.pi},reset:function(){return o.reset(),o.pi},fit:function(){return o.fit(),o.pi},contain:function(){return o.contain(),o.pi},center:function(){return o.center(),o.pi},updateBBox:function(){return o.updateBBox(),o.pi},resize:function(){return o.resize(),o.pi},getSizes:function(){return{width:o.width,height:o.height,realZoom:o.getZoom(),viewBox:o.viewport.getViewBox()}},destroy:function(){return o.destroy(),o.pi}}),this.publicInstance};var c=[];e.exports=function(t,e){var o=r.getSvg(t);if(null===o)return null;for(var n=c.length-1;0<=n;n--)if(c[n].svg===o)return c[n].instance.getPublicInstance();return c.push({svg:o,instance:new i(o,e)}),c[c.length-1].instance.getPublicInstance()}},{"./control-icons":1,"./shadow-viewport":2,"./svg-utilities":5,"./uniwheel":6,"./utilities":7}],5:[function(t,e,o){var l=t("./utilities"),s="unknown";document.documentMode&&(s="ie"),e.exports={svgNS:"http://www.w3.org/2000/svg",xmlNS:"http://www.w3.org/XML/1998/namespace",xmlnsNS:"http://www.w3.org/2000/xmlns/",xlinkNS:"http://www.w3.org/1999/xlink",evNS:"http://www.w3.org/2001/xml-events",getBoundingClientRectNormalized:function(t){if(t.clientWidth&&t.clientHeight)return{width:t.clientWidth,height:t.clientHeight};if(t.getBoundingClientRect())return t.getBoundingClientRect();throw new Error("Cannot get BoundingClientRect for SVG.")},getOrCreateViewport:function(t,e){var o=null;if(!(o=l.isElement(e)?e:t.querySelector(e))){var n=Array.prototype.slice.call(t.childNodes||t.children).filter(function(t){return"defs"!==t.nodeName&&"#text"!==t.nodeName});1===n.length&&"g"===n[0].nodeName&&null===n[0].getAttribute("transform")&&(o=n[0])}if(!o){var i="viewport-"+(new Date).toISOString().replace(/\D/g,"");(o=document.createElementNS(this.svgNS,"g")).setAttribute("id",i);var s=t.childNodes||t.children;if(s&&0div:first-child{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.75);animation:bp-fadein .48s cubic-bezier(.215,.61,.355,1)}.bp-vid audio{position:absolute;left:14px;width:calc(100% - 28px);bottom:14px;height:50px}.bp-inner{top:0;left:0;width:100%;height:100%;position:absolute;display:flex}.bp-html{display:contents}.bp-html>:first-child{margin:auto}.bp-img-wrap{top:0;left:0;width:100%;height:100%;position:absolute;contain:strict}.bp-img-wrap .bp-canzoom{cursor:zoom-in}.bp-img-wrap .bp-drag{cursor:grabbing}.bp-close{contain:layout size}.bp-img{position:absolute;top:50%;left:50%;user-select:none;background-size:100% 100%}.bp-img div,.bp-img img{position:absolute;top:0;left:0;width:100%;height:100%}.bp-img .bp-o{display:none}.bp-zoomed .bp-img:not(.bp-drag){cursor:grab}.bp-zoomed .bp-cap{opacity:0;animation:none!important}.bp-zoomed.bp-small .bp-controls{opacity:0}.bp-zoomed.bp-small .bp-controls button{pointer-events:none}.bp-controls{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;text-align:left;transition:opacity .3s;animation:bp-fadein .3s}.bp-controls button{pointer-events:auto;cursor:pointer;position:absolute;border:0;background:rgba(0,0,0,.15);opacity:.9;transition:all .1s;contain:content}.bp-controls button:hover{background-color:rgba(0,0,0,.2);opacity:1}.bp-controls svg{fill:#fff}.bp-count{position:absolute;color:rgba(255,255,255,.9);line-height:1;margin:16px;height:50px;width:100px}.bp-next,.bp-prev{top:50%;right:0;margin-top:-32px;height:64px;width:58px;border-radius:3px 0 0 3px}.bp-next:hover:before,.bp-prev:hover:before{transform:translateX(-2px)}.bp-next:before,.bp-prev:before{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z'/%3E%3C/svg%3E");position:absolute;left:7px;top:9px;width:46px;transition:all .2s}.bp-prev{right:auto;left:0;transform:scalex(-1)}.bp-x{top:0;right:0;height:55px;width:58px;border-radius:0 0 0 3px}.bp-x:before{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='%23fff'%3E%3Cpath d='M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z'/%3E%3C/svg%3E");position:absolute;width:37px;top:8px;right:10px}.bp-if,.bp-vid{position:relative;margin:auto;background:#000;background-size:100% 100%}.bp-if div,.bp-if iframe,.bp-if video,.bp-vid div,.bp-vid iframe,.bp-vid video{top:0;left:0;width:100%;height:100%;position:absolute;border:0}.bp-load{display:flex;background-size:100% 100%;overflow:hidden;z-index:1}.bp-bar{position:absolute;top:0;left:0;height:3px;width:100%;transform:translateX(-100%);background:rgba(255,255,255,.9);border-radius:0 3px 3px 0;animation:bp-bar 4s both}.bp-o,.bp-o:after{border-radius:50%;width:90px;height:90px}.bp-o{margin:auto;border:10px solid rgba(255,255,255,.2);border-left-color:rgba(255,255,255,.9);animation:bp-o 1s infinite linear}.bp-cap{position:absolute;bottom:2%;background:rgba(9,9,9,.8);color:rgba(255,255,255,.9);border-radius:4px;max-width:95%;line-height:1.3;padding:.6em 1.2em;left:50%;transform:translateX(-50%);width:fit-content;width:-moz-fit-content;display:table;transition:opacity .3s;animation:bp-fadein .2s}.bp-cap a{color:inherit}.bp-inline{position:absolute}.bp-lock{overflow-y:hidden}.bp-lock body{overflow:scroll}.bp-noclose .bp-x{display:none}.bp-noclose:not(.bp-zoomed){touch-action:pan-y}.bp-noclose:not(.bp-zoomed) .bp-img-wrap{cursor:zoom-in}@media (prefers-reduced-motion){.bp-wrap *{animation-duration:0s!important}}@media (max-width:500px){.bp-x{height:47px;width:47px}.bp-x:before{width:34px;top:6px;right:6px}.bp-next,.bp-prev{margin-top:-27px;height:54px;width:45px}.bp-next:before,.bp-prev:before{top:7px;left:2px;width:43px}.bp-o,.bp-o:after{border-width:6px;width:60px;height:60px}.bp-count{margin:12px 10px}} +/*# sourceMappingURL=/sm/15e96278e1e731ce40eef8d6284cefc81b81dda67c3a0aa386ec893f183bd57f.map */ \ No newline at end of file diff --git a/assets/styles/media.css b/assets/styles/media.css new file mode 100755 index 0000000..af05273 --- /dev/null +++ b/assets/styles/media.css @@ -0,0 +1,78 @@ +@media (max-width: 600px){ + .banner-header{ flex-direction: column; align-items: center; text-align: center; } + .banner-left{ margin: 0 0 .5rem 0; } + .banner-logo{ margin: 0; } + nav{ flex-wrap: wrap; justify-content: center; gap: .5rem; font-size: 1rem; } + + + .theme-toggle { + position: static; + order: 2; + margin-left: .5rem; + padding: .3rem .6rem; + background: transparent; + } + + .banner-header { + flex-wrap: wrap; + justify-content: center; + } + .banner-header nav { + display: flex; + align-items: center; + flex-wrap: wrap; + } + + body.no-sidenotes { + margin-left: 1em; + margin-right: 1em; + } + + #mobile-move-panel { + display: block; + } + +} +@media (max-width: 1250px){ + #preamble.status{ + padding-right: var(--body-pad); + } + + #content.content{ + padding-right: var(--body-pad); + } + .sidenote, + .marginnote{ + float: none; + clear: both; + width: auto; + display: block; + margin: 0.5rem 0 0.75rem; + padding-left: 0.75rem; + border-left: 3px dotted color-mix(in oklab, var(--fg) 8%, transparent); + margin-right: 0; + } + .fullwidth{ + max-width: calc(100vw - 2 * var(--body-pad)); + } + .sidenote, .marginnote{ + border-left: 3px dotted color-mix(in oklab, var(--fg) 12%, transparent); + } + .sidenote .mn-img, + .marginnote .mn-img{ + border-color: color-mix(in oklab, var(--fg) 12%, transparent); + } + + #table-of-contents{ + float: none; + position: static; + width: auto; + margin: 0 0 1rem; + padding: .5rem .75rem; + border-right: 0; + border-left: 3px dotted color-mix(in oklab, var(--fg) 12%, transparent); + background: color-mix(in oklab, var(--bg) 96%, var(--fg) 4%); + border-radius: 4px; + } + +} diff --git a/assets/styles/media.css~ b/assets/styles/media.css~ new file mode 100755 index 0000000..ac30e08 --- /dev/null +++ b/assets/styles/media.css~ @@ -0,0 +1,106 @@ +@media (max-width: 600px){ + .banner-header{ flex-direction: column; align-items: center; text-align: center; } + .banner-logo{ margin: 0 0 .5rem 0; } + nav{ flex-wrap: wrap; justify-content: center; gap: .5rem; font-size: 1rem; } + + + .theme-toggle { + position: static; + order: 2; + margin-left: .5rem; + padding: .3rem .6rem; + background: transparent; + } + + .banner-header { + flex-wrap: wrap; + justify-content: center; + } + .banner-header nav { + display: flex; + align-items: center; + flex-wrap: wrap; + } + + body.no-sidenotes { + margin-left: 1em; + margin-right: 1em; + } + + #mobile-move-panel { + display: block; + } + +} +@media (prefers-color-scheme: dark){ + :root:not([data-theme="light"]){ + --bg: #0f1115; + --fg: #e6e6e6; + --link: #8ab4ff; + --heading: #9ecbff; + --code-bg: #1a1d24; + + --note-color: #c2c7cf; + --note-bg: transparent; + + --border: #2a2f3a; + --chip-bg: #1f2330; + --chip-fg: #cfd3da; + --muted: #a9b0bb; + } + .countdown-wrap { + color: var(--fg, #ddd); + } + time.countdown { + color: var(--accent, #7abfff); + background: color-mix(in srgb, var(--accent, #7abfff) 15%, transparent); + box-shadow: 0 0 6px rgba(255,255,255,0.05); + } + time.countdown.expired { + color: #777; + } +} + +@media (max-width: 1250px){ + #preamble.status{ + padding-right: var(--body-pad); + } + + #content.content{ + padding-right: var(--body-pad); + } + .sidenote, + .marginnote{ + float: none; + clear: both; + width: auto; + display: block; + margin: 0.5rem 0 0.75rem; + padding-left: 0.75rem; + border-left: 3px solid rgba(0,0,0,.08); + margin-right: 0; + } + .fullwidth{ + max-width: calc(100vw - 2 * var(--body-pad)); + } + .sidenote, .marginnote{ + border-left: 3px solid color-mix(in oklab, var(--fg) 12%, transparent); + } + .sidenote .mn-img, + .marginnote .mn-img{ + border-color: color-mix(in oklab, var(--fg) 12%, transparent); + } + + #table-of-contents{ + float: none; + position: static; + width: auto; + margin: 0 0 1rem; + padding: .5rem .75rem; + border-right: 0; + border-left: 3px solid color-mix(in oklab, var(--fg) 12%, transparent); + background: color-mix(in oklab, var(--bg) 96%, var(--fg) 4%); + border-radius: 4px; + } + +} diff --git a/assets/styles/org.css b/assets/styles/org.css new file mode 100755 index 0000000..9229b63 --- /dev/null +++ b/assets/styles/org.css @@ -0,0 +1,2459 @@ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html { + font-family:sans-serif; + line-height:1.15; + -ms-text-size-adjust:100%; + -webkit-text-size-adjust:100% +} +body { + margin:0 +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section, +summary { + display:block +} +audio, +canvas, +progress, +video { + display:inline-block +} +audio:not([controls]) { + display:none; + height:0 +} +progress { + vertical-align:baseline +} +[hidden], +template { + display:none +} +a { + background-color:transparent; + -webkit-text-decoration-skip:objects +} +a:active, +a:hover { + outline-width:0 +} +abbr[title] { + border-bottom:none; + text-decoration:underline; + -webkit-text-decoration:underline dotted; + text-decoration:underline dotted +} +b, +strong { + font-weight:inherit; + font-weight:bolder +} +dfn { + font-style:italic +} +h1 { + font-size:2em; + margin:.67em 0 +} +mark { + background-color:#ff0; + color:#000 +} +small { + font-size:80% +} +sub, +sup { + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline +} +sub { + bottom:-.25em +} +sup { + top:-.5em +} +img { + border-style:none +} +svg:not(:root) { + overflow:hidden +} +code, +kbd, +pre, +samp { + font-family:monospace,monospace; + font-size:1em +} +figure { + margin:1em 40px +} +hr { + box-sizing:content-box; + height:0; + overflow:visible +} +button, +input, +optgroup, +select, +textarea { + font:inherit; + margin:0 +} +optgroup { + font-weight:700 +} +button, +input { + overflow:visible +} +button, +select { + text-transform:none +} +[type=reset], +[type=submit], +button, +html [type=button] { + -webkit-appearance:button +} +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style:none; + padding:0 +} +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline:1px dotted ButtonText +} +fieldset { + border:1px solid silver; + margin:0 2px; + padding:.35em .625em .75em +} +legend { + box-sizing:border-box; + color:inherit; + display:table; + max-width:100%; + padding:0; + white-space:normal +} +textarea { + overflow:auto +} +[type=checkbox], +[type=radio] { + box-sizing:border-box; + padding:0 +} +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height:auto +} +[type=search] { + -webkit-appearance:textfield; + outline-offset:-2px +} +[type=search]::-webkit-search-cancel-button, +[type=search]::-webkit-search-decoration { + -webkit-appearance:none +} +::-webkit-input-placeholder { + color:inherit; + opacity:.54 +} +::-webkit-file-upload-button { + -webkit-appearance:button; + font:inherit +} +body { + color:#000; + background-color:#fff +} +.org-alert-high { + color:#ff8c00; + font-weight:700 +} +.org-alert-low { + color:#00008b +} +.org-alert-moderate { + color:gold; + font-weight:700 +} +.org-alert-saved-fringe { + background-color:#f2f2f2 +} +.org-alert-trivial { + color:Dark purple +} +.org-alert-urgent { + color:red; + font-weight:700 +} +.org-anzu-match-1 { + color:#000; + background-color:#7fffd4 +} +.org-anzu-match-2 { + color:#000; + background-color:#00ff7f +} +.org-anzu-match-3 { + color:#000; + background-color:#ff0 +} +.org-anzu-mode-line, +.org-anzu-mode-line-no-match { + color:#008b00; + font-weight:700 +} +.org-anzu-replace-highlight { + color:#b0e2ff; + background-color:#cd00cd +} +.org-anzu-replace-to { + color:red +} +.org-bbdb-field-name { + color:sienna +} +.org-bbdb-name { + color:#00f +} +.org-bbdb-organization { + color:#b22222 +} +.org-beacon-fallback-background { + background-color:#000 +} +.org-biblio-results-header { + color:#483d8b; + font-size:150%; + font-weight:700 +} +.org-bold { + font-weight:700 +} +.org-bold-italic { + font-weight:700; + font-style:italic +} +.org-bookmark-menu-bookmark { + font-weight:700 +} +.org-bookmark-menu-heading { + color:#228b22 +} +.org-buffer-menu-buffer { + font-weight:700 +} +.org-builtin { + color:#483d8b +} +.org-button { + color:#3a5fcd; + text-decoration:underline +} +.org-c-annotation { + color:#008b8b +} +.org-cal-china-x-general-holiday { + background-color:#228b22 +} +.org-cal-china-x-important-holiday { + background-color:#8b0000 +} +.org-calendar-iso-week { + color:pink; + font-weight:700 +} +.org-calendar-iso-week-header { + color:#0ff +} +.org-calendar-month-header { + color:#00f +} +.org-calendar-today { + text-decoration:underline +} +.org-calendar-weekday-header { + color:#008b8b +} +.org-calendar-weekend-header { + color:#b22222 +} +.org-comint-highlight-input { + font-weight:700 +} +.org-comint-highlight-prompt { + color:#0000cd +} +.org-comment, +.org-comment-delimiter { + color:#b22222 +} +.org-compilation-column-number { + color:#8b2252 +} +.org-compilation-error { + color:red; + font-weight:700 +} +.org-compilation-info { + color:#228b22; + font-weight:700 +} +.org-compilation-line-number { + color:#a020f0 +} +.org-compilation-mode-line-exit { + color:#228b22; + font-weight:700 +} +.org-compilation-mode-line-fail { + color:red; + font-weight:700 +} +.org-compilation-mode-line-run, +.org-compilation-warning { + color:#ff8c00; + font-weight:700 +} +.org-completions-annotations { + font-style:italic +} +.org-completions-first-difference { + font-weight:700 +} +.org-constant { + color:#008b8b +} +.org-cursor { + background-color:#eead0e +} +.org-custom-button { + color:#000; + background-color:#d3d3d3 +} +.org-custom-button-mouse { + color:#000; + background-color:#e5e5e5 +} +.org-custom-button-pressed { + color:#000; + background-color:#d3d3d3 +} +.org-custom-button-pressed-unraised { + color:#8b008b; + text-decoration:underline +} +.org-custom-button-unraised { + text-decoration:underline +} +.org-custom-changed { + color:#fff; + background-color:#00f +} +.org-custom-comment { + background-color:#d9d9d9 +} +.org-custom-comment-tag { + color:#00008b +} +.org-custom-face-tag { + color:#00f; + font-weight:700 +} +.org-custom-group-subtitle { + font-weight:700 +} +.org-custom-group-tag { + color:#00f; + font-size:120%; + font-weight:700 +} +.org-custom-group-tag-1 { + color:red; + font-size:120%; + font-weight:700 +} +.org-custom-invalid { + color:#ff0; + background-color:red +} +.org-custom-link { + color:#3a5fcd; + text-decoration:underline +} +.org-custom-modified { + color:#fff; + background-color:#00f +} +.org-custom-rogue { + color:pink; + background-color:#000 +} +.org-custom-saved { + text-decoration:underline +} +.org-custom-set { + color:#00f; + background-color:#fff +} +.org-custom-state { + color:#006400 +} +.org-custom-themed { + color:#fff; + background-color:#00f +} +.org-custom-variable-button { + font-weight:700; + text-decoration:underline +} +.org-custom-variable-tag { + color:#00f; + font-weight:700 +} +.org-custom-visibility { + color:#3a5fcd; + font-size:80%; + text-decoration:underline +} +.org-diary { + color:red +} +.org-diary-anniversary { + color:#a020f0 +} +.org-diary-time { + color:sienna +} +.org-dired-async-failures { + color:red +} +.org-dired-async-message { + color:#ff0 +} +.org-dired-async-mode-message { + color:gold +} +.org-dired-directory { + color:#00f +} +.org-dired-flagged { + color:red; + font-weight:700 +} +.org-dired-header { + color:#228b22 +} +.org-dired-ignored { + color:#7f7f7f +} +.org-dired-mark { + color:#008b8b +} +.org-dired-marked { + color:#ff8c00; + font-weight:700 +} +.org-dired-perm-write { + color:#b22222 +} +.org-dired-symlink { + color:#a020f0 +} +.org-dired-warning { + color:red; + font-weight:700 +} +.org-doc { + color:#8b2252 +} +.org-eldoc-highlight-function-argument { + font-weight:700 +} +.org-epa-field-body { + font-style:italic +} +.org-epa-field-name, +.org-epa-mark { + font-weight:700 +} +.org-epa-mark { + color:red +} +.org-epa-string { + color:#00008b +} +.org-epa-validity-disabled { + font-style:italic +} +.org-epa-validity-high { + font-weight:700 +} +.org-epa-validity-low, +.org-epa-validity-medium { + font-style:italic +} +.org-error { + color:red; + font-weight:700 +} +.org-escape-glyph { + color:brown +} +.org-evil-ex-commands { + font-style:italic; + text-decoration:underline +} +.org-evil-ex-info { + color:red; + font-style:italic +} +.org-evil-ex-lazy-highlight { + background-color:#afeeee +} +.org-evil-ex-search { + color:#b0e2ff; + background-color:#cd00cd +} +.org-evil-ex-substitute-matches { + background-color:#afeeee +} +.org-evil-ex-substitute-replacement { + color:red; + text-decoration:underline +} +.org-ffap { + background-color:#b4eeb4 +} +.org-file-name-shadow { + color:#7f7f7f +} +.org-flycheck-error { + text-decoration:underline +} +.org-flycheck-error-list-checker-name { + color:#00f +} +.org-flycheck-error-list-column-number { + color:#008b8b +} +.org-flycheck-error-list-error { + color:red; + font-weight:700 +} +.org-flycheck-error-list-filename { + color:sienna +} +.org-flycheck-error-list-highlight { + background-color:#b4eeb4 +} +.org-flycheck-error-list-id, +.org-flycheck-error-list-id-with-explainer { + color:#228b22 +} +.org-flycheck-error-list-info { + color:#228b22; + font-weight:700 +} +.org-flycheck-error-list-line-number { + color:#008b8b +} +.org-flycheck-error-list-warning { + color:#ff8c00; + font-weight:700 +} +.org-flycheck-fringe-error { + color:red; + font-weight:700 +} +.org-flycheck-fringe-info { + color:#228b22; + font-weight:700 +} +.org-flycheck-fringe-warning { + color:#ff8c00; + font-weight:700 +} +.org-flycheck-info, +.org-flycheck-warning, +.org-flyspell-duplicate, +.org-flyspell-incorrect { + text-decoration:underline +} +.org-fringe { + background-color:#f2f2f2 +} +.org-function-name { + color:#00f +} +.org-glyphless-char { + font-size:60% +} +.org-golden-ratio-scroll-highlight-line { + color:#fff; + background-color:#53868b; + font-weight:700 +} +.org-header-line { + color:#333; + background-color:#e5e5e5 +} +.org-helm-action { + text-decoration:underline +} +.org-helm-bookmark-addressbook { + color:tomato +} +.org-helm-bookmark-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-bookmark-file { + color:#00b2ee +} +.org-helm-bookmark-file-not-found { + color:#6c7b8b +} +.org-helm-bookmark-gnus { + color:#f0f +} +.org-helm-bookmark-info { + color:#0f0 +} +.org-helm-bookmark-man { + color:#8b5a00 +} +.org-helm-bookmark-w3m { + color:#ff0 +} +.org-helm-buffer-archive { + color:gold +} +.org-helm-buffer-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-buffer-file { + color:#483d8b +} +.org-helm-buffer-modified { + color:#b22222 +} +.org-helm-buffer-not-saved { + color:#ee6363 +} +.org-helm-buffer-process { + color:#cd6839 +} +.org-helm-buffer-saved-out { + color:red; + background-color:#000 +} +.org-helm-buffer-size { + color:#708090 +} +.org-helm-candidate-number, +.org-helm-candidate-number-suspended { + color:#000; + background-color:#faffb5 +} +.org-helm-delete-async-message { + color:#ff0 +} +.org-helm-etags-file { + color:#8b814c; + text-decoration:underline +} +.org-helm-ff-denied { + color:red; + background-color:#000 +} +.org-helm-ff-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-ff-dirs { + color:#00f +} +.org-helm-ff-dotted-directory { + color:#000; + background-color:#696969 +} +.org-helm-ff-dotted-symlink-directory { + color:#ff8c00; + background-color:#696969 +} +.org-helm-ff-executable { + color:#0f0 +} +.org-helm-ff-file { + color:#483d8b +} +.org-helm-ff-invalid-symlink { + color:#000; + background-color:red +} +.org-helm-ff-pipe { + color:#ff0; + background-color:#000 +} +.org-helm-ff-prefix { + color:#000; + background-color:#ff0 +} +.org-helm-ff-socket { + color:#ff1493 +} +.org-helm-ff-suid { + color:#fff; + background-color:red +} +.org-helm-ff-symlink { + color:#b22222 +} +.org-helm-ff-truename { + color:#8b2252 +} +.org-helm-grep-cmd-line { + color:#228b22 +} +.org-helm-grep-file { + color:#8a2be2; + text-decoration:underline +} +.org-helm-grep-finish { + color:#0f0 +} +.org-helm-grep-lineno { + color:#ff7f00 +} +.org-helm-grep-match { + color:#b00000 +} +.org-helm-header { + color:#333; + background-color:#e5e5e5 +} +.org-helm-header-line-left-margin { + color:#000; + background-color:#ff0 +} +.org-helm-helper { + color:#333; + background-color:#e5e5e5 +} +.org-helm-history-deleted { + color:#000; + background-color:red +} +.org-helm-history-remote { + color:#ff6a6a +} +.org-helm-lisp-completion-info { + color:red +} +.org-helm-lisp-show-completion { + background-color:#2f4f4f +} +.org-helm-locate-finish { + color:#0f0 +} +.org-helm-m-x-key { + color:orange; + text-decoration:underline +} +.org-helm-match { + color:#b00000 +} +.org-helm-match-item { + color:#b0e2ff; + background-color:#cd00cd +} +.org-helm-minibuffer-prompt { + color:#0000cd +} +.org-helm-moccur-buffer { + color:#00ced1; + text-decoration:underline +} +.org-helm-non-file-buffer { + font-style:italic +} +.org-helm-prefarg { + color:red +} +.org-helm-resume-need-update { + background-color:red +} +.org-helm-selection { + background-color:#097209 +} +.org-helm-selection-line { + background-color:#b4eeb4 +} +.org-helm-separator { + color:#ffbfb5 +} +.org-helm-source-header { + color:#000; + background-color:#abd7f0; + font-size:130%; + font-weight:700 +} +.org-helm-visible-mark { + background-color:#d1f5ea +} +.org-help-argument-name { + font-style:italic +} +.org-highlight { + background-color:#b4eeb4 +} +.org-highlight-indent-guides-character { + color:#e6e6e6 +} +.org-highlight-indent-guides-even { + background-color:#e6e6e6 +} +.org-highlight-indent-guides-odd { + background-color:#f3f3f3 +} +.org-highlight-indent-guides-stack-character { + color:#ccc +} +.org-highlight-indent-guides-stack-even { + background-color:#ccc +} +.org-highlight-indent-guides-stack-odd { + background-color:#d9d9d9 +} +.org-highlight-indent-guides-top-character { + color:#b3b3b3 +} +.org-highlight-indent-guides-top-even { + background-color:#b3b3b3 +} +.org-highlight-indent-guides-top-odd { + background-color:silver +} +.org-highlight-numbers-number { + color:#008b8b +} +.org-hl-line { + background-color:#b4eeb4 +} +.org-holiday { + background-color:pink +} +.org-hydra-face-amaranth { + color:#e52b50; + font-weight:700 +} +.org-hydra-face-blue { + color:#00f; + font-weight:700 +} +.org-hydra-face-pink { + color:#ff6eb4; + font-weight:700 +} +.org-hydra-face-red { + color:red; + font-weight:700 +} +.org-hydra-face-teal { + color:#367588; + font-weight:700 +} +.org-ido-first-match { + font-weight:700 +} +.org-ido-incomplete-regexp { + color:red; + font-weight:700 +} +.org-ido-indicator { + color:#ff0; + background-color:red +} +.org-ido-only-match { + color:#228b22 +} +.org-ido-subdir { + color:red +} +.org-ido-virtual { + color:#483d8b +} +.org-info-header-node { + color:brown; + font-weight:700; + font-style:italic +} +.org-info-header-xref { + color:#3a5fcd; + text-decoration:underline +} +.org-info-index-match { + background-color:#ff0 +} +.org-info-menu-header { + font-weight:700 +} +.org-info-menu-star { + color:red +} +.org-info-node { + color:brown; + font-weight:700; + font-style:italic +} +.org-info-title-1 { + font-size:172%; + font-weight:700 +} +.org-info-title-2 { + font-size:144%; + font-weight:700 +} +.org-info-title-3 { + font-size:120%; + font-weight:700 +} +.org-info-title-4 { + font-weight:700 +} +.org-info-xref { + color:#3a5fcd; + text-decoration:underline +} +.org-isearch { + color:#b0e2ff; + background-color:#cd00cd +} +.org-isearch-fail { + background-color:#ffc1c1 +} +.org-italic { + font-style:italic +} +.org-keyword { + color:#a020f0 +} +.org-lazy-highlight { + background-color:#afeeee +} +.org-link { + color:#3a5fcd; + text-decoration:underline +} +.org-link-visited { + color:#8b008b; + text-decoration:underline +} +.org-lv-separator { + background-color:#ccc +} +.org-match { + background-color:#ff0 +} +.org-mcXcursor-bar { + background-color:#000 +} +.org-mcXregion { + background-color:gtk_selection_bg_color +} +.org-me-dired-dim-0 { + color:#b3b3b3 +} +.org-me-dired-dim-1 { + color:#7f7f7f +} +.org-me-dired-executable { + color:#0f0 +} +.org-message-cited-text { + color:red +} +.org-message-header-cc { + color:#191970 +} +.org-message-header-name { + color:#6495ed +} +.org-message-header-newsgroups { + color:#00008b; + font-weight:700; + font-style:italic +} +.org-message-header-other { + color:#4682b4 +} +.org-message-header-subject { + color:navy; + font-weight:700 +} +.org-message-header-to { + color:#191970; + font-weight:700 +} +.org-message-header-xheader { + color:#00f +} +.org-message-mml { + color:#228b22 +} +.org-message-separator { + color:brown +} +.org-minibuffer-prompt { + color:#0000cd +} +.org-mm-command-output { + color:#cd0000 +} +.org-mode-line { + color:#000; + background-color:#bfbfbf +} +.org-mode-line-buffer-id, +.org-mode-line-buffer-id-inactive, +.org-mode-line-emphasis { + font-weight:700 +} +.org-mode-line-inactive { + color:#333; + background-color:#e5e5e5 +} +.org-mu4e-attach-number { + color:sienna; + font-weight:700 +} +.org-mu4e-cited-1 { + color:#483d8b; + font-style:italic +} +.org-mu4e-cited-2 { + color:#5cacee; + font-style:italic +} +.org-mu4e-cited-3 { + color:sienna; + font-style:italic +} +.org-mu4e-cited-4 { + color:#a020f0; + font-style:italic +} +.org-mu4e-cited-5, +.org-mu4e-cited-6 { + color:#b22222; + font-style:italic +} +.org-mu4e-cited-7 { + color:#228b22; + font-style:italic +} +.org-mu4e-compose-header, +.org-mu4e-compose-separator { + color:brown; + font-style:italic +} +.org-mu4e-contact { + color:sienna +} +.org-mu4e-context { + color:#006400; + font-weight:700 +} +.org-mu4e-draft { + color:#8b2252 +} +.org-mu4e-flagged { + color:#008b8b; + font-weight:700 +} +.org-mu4e-footer { + color:#b22222 +} +.org-mu4e-forwarded { + color:#483d8b +} +.org-mu4e-header { + color:#000; + background-color:#fff +} +.org-mu4e-header-highlight { + background-color:#000; + font-weight:700; + text-decoration:underline +} +.org-mu4e-header-key { + color:#6495ed; + font-weight:700 +} +.org-mu4e-header-marks { + color:#483d8b +} +.org-mu4e-header-title, +.org-mu4e-header-value { + color:#228b22 +} +.org-mu4e-highlight { + background-color:#b4eeb4 +} +.org-mu4e-link { + color:#3a5fcd; + text-decoration:underline +} +.org-mu4e-modeline { + color:#8b4500; + font-weight:700 +} +.org-mu4e-moved { + color:#b22222; + font-style:italic +} +.org-mu4e-ok { + color:#b22222; + font-weight:700 +} +.org-mu4e-region-code { + background-color:#2f4f4f +} +.org-mu4e-replied, +.org-mu4e-special-header-value { + color:#483d8b +} +.org-mu4e-system { + color:#b22222; + font-style:italic +} +.org-mu4e-title { + color:#228b22; + font-weight:700 +} +.org-mu4e-trashed { + color:#b22222; + text-decoration:line-through +} +.org-mu4e-unread { + color:#a020f0; + font-weight:700 +} +.org-mu4e-url-number { + color:#008b8b; + font-weight:700 +} +.org-mu4e-view-body { + color:#000; + background-color:#fff +} +.org-mu4e-warning { + color:red; + font-weight:700 +} +.org-next-error { + background-color:gtk_selection_bg_color +} +.org-nobreak-space { + color:brown; + text-decoration:underline +} +.org-org-agenda-calendar-event, +.org-org-agenda-calendar-sexp { + color:#000; + background-color:#fff +} +.org-org-agenda-clocking { + background-color:#ff0 +} +.org-org-agenda-column-dateline { + background-color:#e5e5e5 +} +.org-org-agenda-current-time { + color:#b8860b +} +.org-org-agenda-date { + color:#00f +} +.org-org-agenda-date-today { + color:#00f; + font-weight:700; + font-style:italic +} +.org-org-agenda-date-weekend { + color:#00f; + font-weight:700 +} +.org-org-agenda-diary { + color:#000; + background-color:#fff +} +.org-org-agenda-dimmed-todo { + color:#7f7f7f +} +.org-org-agenda-done { + color:#228b22 +} +.org-org-agenda-filter-category, +.org-org-agenda-filter-effort, +.org-org-agenda-filter-regexp, +.org-org-agenda-filter-tags { + color:#000; + background-color:#bfbfbf +} +.org-org-agenda-restriction-lock { + background-color:#eee +} +.org-org-agenda-structure { + color:#00f +} +.org-org-archived { + color:#7f7f7f +} +.org-org-block { + color:#7f7f7f +} +.org-org-block-begin-line, +.org-org-block-end-line { + color:#b22222 +} +.org-org-checkbox { + font-weight:700 +} +.org-org-checkbox-statistics-done { + color:#228b22; + font-weight:700 +} +.org-org-checkbox-statistics-todo { + color:red; + font-weight:700 +} +.org-org-clock-overlay { + color:#000; + background-color:#d3d3d3 +} +.org-org-code { + color:#7f7f7f +} +.org-org-column, +.org-org-column-title { + background-color:#e5e5e5 +} +.org-org-column-title { + font-weight:700; + text-decoration:underline +} +.org-org-date { + color:#bfaf87; + text-decoration:underline +} +.org-org-date-selected { + color:red +} +.org-org-default { + color:#000; + background-color:#fff +} +.org-org-document-info { + color:#191970 +} +.org-org-document-info-keyword { + color:#7f7f7f +} +.org-org-document-title { + color:#191970; + font-weight:700 +} +.org-org-done { + color:#228b22; + font-weight:700 +} +.org-org-drawer { + color:#00f +} +.org-org-ellipsis { + color:#b8860b; + text-decoration:underline +} +.org-org-footnote { + color:#96b4cd; + text-decoration:underline +} +.org-org-formula { + color:#b22222 +} +.org-org-habit-alert { + background-color:#f5f946 +} +.org-org-habit-alert-future { + background-color:#fafca9 +} +.org-org-habit-clear { + background-color:#8270f9 +} +.org-org-habit-clear-future { + background-color:#d6e4fc +} +.org-org-habit-overdue { + background-color:#f9372d +} +.org-org-habit-overdue-future { + background-color:#fc9590 +} +.org-org-habit-ready { + background-color:#4df946 +} +.org-org-habit-ready-future { + background-color:#acfca9 +} +.org-org-headline-done { + color:#bc8f8f +} +.org-org-hide { + color:#fff +} +.org-org-latex-and-related { + color:#8b4513 +} +.org-org-level-1 { + color:#edd1c5 +} +.org-org-level-2 { + color:#ebebb7 +} +.org-org-level-3 { + color:#cce8cc +} +.org-org-level-4 { + color:#c9deec +} +.org-org-level-5 { + color:#dce3e8 +} +.org-org-level-6 { + color:#dde6dd +} +.org-org-level-7 { + color:#e8e8ce +} +.org-org-level-8 { + color:#e8dedb +} +.org-org-link { + color:#c5d2dc; + text-decoration:underline +} +.org-org-list-dt { + font-weight:700 +} +.org-org-macro { + color:#8b4513 +} +.org-org-meta-line { + color:#b22222 +} +.org-org-mode-line-clock { + color:#000; + background-color:#bfbfbf +} +.org-org-mode-line-clock-overrun { + color:#000; + background-color:red +} +.org-org-priority { + color:#a020f0 +} +.org-org-quote { + color:#7f7f7f +} +.org-org-ref-acronym { + color:#ee7600; + text-decoration:underline +} +.org-org-ref-cite { + color:#c3d5c3; + text-decoration:underline +} +.org-org-ref-glossary { + color:#8968cd; + text-decoration:underline +} +.org-org-ref-label { + color:#8b008b; + text-decoration:underline +} +.org-org-ref-ref { + color:#e1cc96; + text-decoration:underline +} +.org-org-scheduled { + color:#006400 +} +.org-org-scheduled-previously { + color:#b22222 +} +.org-org-scheduled-today { + color:#006400 +} +.org-org-sexp-date { + color:#a020f0 +} +.org-org-special-keyword { + color:#88949f +} +.org-org-table { + color:#00f +} +.org-org-tag, +.org-org-tag-group { + font-weight:700 +} +.org-org-target { + text-decoration:underline +} +.org-org-time-grid { + color:#b8860b +} +.org-org-todo { + color:red; + font-weight:700 +} +.org-org-upcoming-deadline { + color:#b22222 +} +.org-org-verbatim, +.org-org-verse { + color:#7f7f7f +} +.org-org-warning { + color:red; + font-weight:700 +} +.org-outline-1 { + color:#00f +} +.org-outline-2 { + color:sienna +} +.org-outline-3 { + color:#a020f0 +} +.org-outline-4 { + color:#b22222 +} +.org-outline-5 { + color:#228b22 +} +.org-outline-6 { + color:#008b8b +} +.org-outline-7 { + color:#483d8b +} +.org-outline-8 { + color:#8b2252 +} +.org-package-description { + color:#000; + background-color:#fff +} +.org-package-name { + color:#3a5fcd; + text-decoration:underline +} +.org-package-status-avail-obso { + color:#b22222 +} +.org-package-status-available { + color:#000; + background-color:#fff +} +.org-package-status-built-in { + color:#483d8b +} +.org-package-status-dependency { + color:#b22222 +} +.org-package-status-disabled { + color:red; + font-weight:700 +} +.org-package-status-external { + color:#483d8b +} +.org-package-status-held { + color:#008b8b +} +.org-package-status-incompat, +.org-package-status-installed { + color:#b22222 +} +.org-package-status-unsigned { + color:red; + font-weight:700 +} +.org-pdf-isearch-batch { + background-color:#ff0 +} +.org-pdf-isearch-lazy { + background-color:#afeeee +} +.org-pdf-isearch-match { + color:#b0e2ff; + background-color:#cd00cd +} +.org-pdf-occur-document { + color:#8b2252 +} +.org-pdf-occur-page { + color:#228b22 +} +.org-pdf-view-rectangle { + background-color:#b4eeb4 +} +.org-pdf-view-region { + background-color:gtk_selection_bg_color +} +.org-powerline-active0 { + color:#000; + background-color:#bfbfbf +} +.org-powerline-active1 { + color:#fff; + background-color:#2b2b2b +} +.org-powerline-active2 { + color:#fff; + background-color:#666 +} +.org-powerline-inactive0 { + color:#333; + background-color:#e5e5e5 +} +.org-powerline-inactive1 { + color:#333; + background-color:#1c1c1c +} +.org-powerline-inactive2 { + color:#333; + background-color:#333 +} +.org-preprocessor { + color:#483d8b +} +.org-query-replace { + color:#b0e2ff; + background-color:#cd00cd +} +.org-rainbow-delimiters-depth-1 { + color:#ffdead +} +.org-rainbow-delimiters-depth-2 { + color:#00bfff +} +.org-rainbow-delimiters-depth-3 { + color:#ffdead +} +.org-rainbow-delimiters-depth-4 { + color:#00bfff +} +.org-rainbow-delimiters-depth-5 { + color:#ffdead +} +.org-rainbow-delimiters-depth-6 { + color:#00bfff +} +.org-rainbow-delimiters-depth-7 { + color:#ffdead +} +.org-rainbow-delimiters-depth-8 { + color:#00bfff +} +.org-rainbow-delimiters-depth-9 { + color:#ffdead +} +.org-rainbow-delimiters-unmatched { + color:#88090b +} +.org-reb-match-0 { + background-color:#add8e6 +} +.org-reb-match-1 { + background-color:#7fffd4 +} +.org-reb-match-2 { + background-color:#00ff7f +} +.org-reb-match-3 { + background-color:#ff0 +} +.org-rectangle-preview { + background-color:gtk_selection_bg_color +} +.org-regexp-grouping-backslash, +.org-regexp-grouping-construct { + font-weight:700 +} +.org-region { + background-color:gtk_selection_bg_color +} +.org-secondary-selection { + background-color:#ff0 +} +.org-semantic-highlight-edits, +.org-semantic-highlight-func-current-tag { + background-color:#e5e5e5 +} +.org-semantic-unmatched-syntax { + text-decoration:underline +} +.org-sgml-namespace { + color:#483d8b +} +.org-sh-escaped-newline { + color:#8b2252 +} +.org-sh-heredoc { + color:#ee0 +} +.org-sh-quoted-exec { + color:#f0f +} +.org-shadow { + color:#7f7f7f +} +.org-show-paren-match { + background-color:#40e0d0 +} +.org-show-paren-mismatch { + color:#fff; + background-color:#a020f0 +} +.org-sp-pair-overlay, +.org-sp-show-pair-enclosing { + background-color:#b4eeb4 +} +.org-sp-show-pair-match { + background-color:#40e0d0 +} +.org-sp-show-pair-mismatch { + color:#fff; + background-color:#a020f0 +} +.org-sp-wrap-overlay { + background-color:#b4eeb4 +} +.org-sp-wrap-overlay-closing-pair { + color:red; + background-color:#b4eeb4 +} +.org-sp-wrap-overlay-opening-pair { + color:#0f0; + background-color:#b4eeb4 +} +.org-sp-wrap-tag-overlay { + background-color:#b4eeb4 +} +.org-spaceline-flycheck-error { + color:#fc5c94; + background-color:#333 +} +.org-spaceline-flycheck-info { + color:#8de6f7; + background-color:#333 +} +.org-spaceline-flycheck-warning { + color:#f3ea98; + background-color:#333 +} +.org-spaceline-python-venv { + color:#fbf +} +.org-speedbar-button { + color:#008b00 +} +.org-speedbar-directory { + color:#00008b +} +.org-speedbar-file { + color:#008b8b +} +.org-speedbar-highlight { + background-color:#0f0 +} +.org-speedbar-selected { + color:red; + text-decoration:underline +} +.org-speedbar-separator { + color:#fff; + background-color:#00f; + text-decoration:overline +} +.org-speedbar-tag { + color:brown +} +.org-string { + color:#8b2252 +} +.org-success { + color:#228b22; + font-weight:700 +} +.org-table-cell { + color:#e5e5e5; + background-color:#00f +} +.org-tex-math { + color:#8b2252 +} +.org-tool-bar { + color:#000; + background-color:#bfbfbf +} +.org-tooltip { + color:#000; + background-color:#ffffe0 +} +.org-trailing-whitespace { + background-color:red +} +.org-tty-menu-disabled { + color:#d3d3d3; + background-color:#00f +} +.org-tty-menu-enabled { + color:#ff0; + background-color:#00f; + font-weight:700 +} +.org-tty-menu-selected { + background-color:red +} +.org-type { + color:#228b22 +} +.org-underline { + text-decoration:underline +} +.org-undo-tree-visualizer-active-branch { + color:#000; + font-weight:700 +} +.org-undo-tree-visualizer-current { + color:red +} +.org-undo-tree-visualizer-default { + color:#bebebe +} +.org-undo-tree-visualizer-register { + color:#ff0 +} +.org-undo-tree-visualizer-unmodified { + color:#0ff +} +.org-variable-name { + color:sienna +} +.org-vhlXdefault { + background-color:#ff0 +} +.org-warning { + color:#ff8c00; + font-weight:700 +} +.org-warning-1 { + color:red; + font-weight:700 +} +.org-wgrep { + color:#fff; + background-color:#228b22 +} +.org-wgrep-delete { + color:pink; + background-color:#228b22 +} +.org-wgrep-done { + color:#00f +} +.org-wgrep-file { + color:#fff; + background-color:#228b22 +} +.org-wgrep-reject { + color:red; + font-weight:700 +} +.org-which-key-command-description { + color:#00f +} +.org-which-key-docstring { + color:#b22222 +} +.org-which-key-group-description { + color:#a020f0 +} +.org-which-key-highlighted-command { + color:#00f; + text-decoration:underline +} +.org-which-key-key { + color:#008b8b +} +.org-which-key-local-map-description { + color:#00f +} +.org-which-key-note, +.org-which-key-separator { + color:#b22222 +} +.org-which-key-special-key { + color:#008b8b; + font-weight:700 +} +.org-whitespace-big-indent { + color:#b22222; + background-color:red +} +.org-whitespace-empty { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-hspace { + color:#d3d3d3; + background-color:#cdc9a5 +} +.org-whitespace-indentation { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-line { + color:violet; + background-color:#333 +} +.org-whitespace-newline { + color:#d3d3d3 +} +.org-whitespace-space { + color:#d3d3d3; + background-color:#ffffe0 +} +.org-whitespace-space-after-tab { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-space-before-tab { + color:#b22222; + background-color:#ff8c00 +} +.org-whitespace-tab { + color:#d3d3d3; + background-color:beige +} +.org-whitespace-trailing { + color:#ff0; + background-color:red; + font-weight:700 +} +.org-widget-button { + font-weight:700 +} +.org-widget-button-pressed { + color:red +} +.org-widget-documentation { + color:#006400 +} +.org-widget-field { + background-color:#d9d9d9 +} +.org-widget-inactive { + color:#7f7f7f +} +.org-widget-single-line-field { + background-color:#d9d9d9 +} +.org-window-divider { + color:#999 +} +.org-window-divider-first-pixel { + color:#ccc +} +.org-window-divider-last-pixel { + color:#666 +} +a { + color:inherit; + background-color:inherit; + font:inherit; + text-decoration:inherit +} +a:hover { + text-decoration:underline +} +body { + //width:95%; + //margin:2% auto; + font-size:14px; + line-height:1.4em; + font-family:Georgia,serif; + color:#333 +} +@media screen and (min-width:600px) { + body { + font-size:18px + } +} +@media screen and (min-width:600px) { + body { + /*! width:900px; */ + } +} +::-moz-selection { + background:#d6edff +} +::selection { + background:#d6edff +} +p { + margin:1em auto +} +dl, +ol, +ul { + margin:0 auto +} +.title { + margin:.8em auto; + color:#000 +} +.subtitle, +.title { + text-align:center +} +.subtitle { + font-size:1.1em; + line-height:1.4; + font-weight:700; + margin:1em auto +} +.abstract { + margin:auto; + width:80%; + font-style:italic +} +.abstract p:last-of-type:before { + content:" "; + white-space:pre +} +.status { + font-size:90%; + // margin:2em auto +} +[class^=section-number-] { + margin-right:.5em +} +[id^=orgheadline] { + clear:both +} +#footnotes { + font-size:90% +} +.footpara { + display:inline; + margin:.2em auto +} +.footdef { + margin-bottom:1em +} +.footdef sup { + padding-right:.5em +} +a { + color:#527d9a; + text-decoration:none +} +a:hover { + color:#035; + border-bottom:1px dotted +} +figure { + padding:0; + margin:1em auto; + text-align:center +} +img { + max-width:100%; + vertical-align:middle +} +.MathJax_Display { + margin:0!important; + width:90%!important +} +h1, +h2, +h3, +h4, +h5, +h6 { + color:#a5573e; + line-height:1em; + font-family:Helvetica,sans-serif +} +h1, +h2, +h3 { + line-height:1.4em +} +h4, +h5, +h6 { + font-size:1em +} +@media screen and (min-width:600px) { + h1 { + font-size:2em + } + h2 { + font-size:1.5em + } + h3 { + font-size:1.3em + } + h1, + h2, + h3 { + line-height:1.4em + } + h4, + h5, + h6 { + font-size:1.1em + } +} +dt { + font-weight:700 +} +table { + margin:1em auto; + border-top:2px solid; + border-collapse:collapse +} +table, +thead { + border-bottom:2px solid +} +table td+td, +table th+th { + border-left:1px solid grey +} +table tr { + border-top:1px solid #d3d3d3 +} +td, +th { + padding:.3em .6em; + vertical-align:middle +} +caption.t-above { + caption-side:top +} +caption.t-bottom { + caption-side:bottom +} +caption { + margin-bottom:.3em +} +figcaption { + margin-top:.3em +} +th.org-center, +th.org-left, +th.org-right { + text-align:center +} +td.org-right { + text-align:right +} +td.org-left { + text-align:left +} +td.org-center { + text-align:center +} +blockquote { + margin:1em 2em; + padding-left:1em; + border-left:3px solid #ccc +} +kbd { + background-color:#f7f7f7; + font-size:80%; + margin:0 .1em; + padding:.1em .6em +} +.todo { + background-color:red +} +.done, +.todo { + color:#fff; + padding:.1em .3em; + border-radius:3px; + background-clip:padding-box; + font-size:80%; + font-family:Lucida Console,monospace; + line-height:1 +} +.done { + background-color:green +} +.priority { + color:orange; + font-family:Lucida Console,monospace +} +.tag { + font-family:Lucida Console,monospace; + font-size:.7em; + font-weight:400 +} +.tag span { + padding:.3em; + float:right; + margin-right:.5em; + border:1px solid #bbb; + border-radius:3px; + background-clip:padding-box; + color:#333; + background-color:#eee; + line-height:1 +} +.timestamp { + color:#bebebe; + font-size:90% +} +.timestamp-kwd { + color:#5f9ea0 +} +.org-right { + margin-left:auto; + margin-right:0; + text-align:right +} +.org-left { + margin-left:0; + margin-right:auto; + text-align:left +} +.org-center { + margin-left:auto; + margin-right:auto; + text-align:center +} +.underline { + text-decoration:underline +} +#postamble p, +#preamble p { + font-size:90%; + margin:.2em +} +p.verse { + margin-left:3% +} +:not(pre)>code { + padding:2px 5px; + margin:auto 1px; + border:1px solid #ddd; + border-radius:3px; + background-clip:padding-box; + color:#333; + font-size:80% +} +.org-src-container { + border:1px solid #ccc; + box-shadow:3px 3px 3px #eee; + font-family:Lucida Console,monospace; + font-size:80%; + margin:1em auto; + padding:.1em .5em; + position:relative +} +.org-src-container>pre { + overflow:auto +} +.org-src-container>pre:before { + display:block; + position:absolute; + background-color:#b3b3b3; + top:0; + right:0; + padding:0 .5em; + border-bottom-left-radius:8px; + border:0; + color:#fff; + font-size:80% +} +.org-src-container>pre.src-sh:before { + content:"sh" +} +.org-src-container>pre.src-bash:before { + content:"bash" +} +.org-src-container>pre.src-emacs-lisp:before { + content:"Emacs Lisp" +} +.org-src-container>pre.src-R:before { + content:"R" +} +.org-src-container>pre.src-cpp:before { + content:"C++" +} +.org-src-container>pre.src-c:before { + content:"C" +} +.org-src-container>pre.src-html:before { + content:"HTML" +} +.org-src-container>pre.src-javascript:before, +.org-src-container>pre.src-js:before { + content:"Javascript" +} +// More languages 0% http://orgmode.org/worg/org-contrib/babel/languages.html .org-src-container>pre.src-abc:before { + content:"ABC" +} +.org-src-container>pre.src-asymptote:before { + content:"Asymptote" +} +.org-src-container>pre.src-awk:before { + content:"Awk" +} +.org-src-container>pre.src-C:before { + content:"C" +} +.org-src-container>pre.src-calc:before { + content:"Calc" +} +.org-src-container>pre.src-clojure:before { + content:"Clojure" +} +.org-src-container>pre.src-comint:before { + content:"comint" +} +.org-src-container>pre.src-css:before { + content:"CSS" +} +.org-src-container>pre.src-D:before { + content:"D" +} +.org-src-container>pre.src-ditaa:before { + content:"Ditaa" +} +.org-src-container>pre.src-dot:before { + content:"Dot" +} +.org-src-container>pre.src-ebnf:before { + content:"ebnf" +} +.org-src-container>pre.src-forth:before { + content:"Forth" +} +.org-src-container>pre.src-F90:before { + content:"Fortran" +} +.org-src-container>pre.src-gnuplot:before { + content:"Gnuplot" +} +.org-src-container>pre.src-haskell:before { + content:"Haskell" +} +.org-src-container>pre.src-io:before { + content:"Io" +} +.org-src-container>pre.src-java:before { + content:"Java" +} +.org-src-container>pre.src-latex:before { + content:"LaTeX" +} +.org-src-container>pre.src-ledger:before { + content:"Ledger" +} +.org-src-container>pre.src-ly:before { + content:"Lilypond" +} +.org-src-container>pre.src-lisp:before { + content:"Lisp" +} +.org-src-container>pre.src-makefile:before { + content:"Make" +} +.org-src-container>pre.src-matlab:before { + content:"Matlab" +} +.org-src-container>pre.src-max:before { + content:"Maxima" +} +.org-src-container>pre.src-mscgen:before { + content:"Mscgen" +} +.org-src-container>pre.src-Caml:before { + content:"Objective" +} +.org-src-container>pre.src-octave:before { + content:"Octave" +} +.org-src-container>pre.src-org:before { + content:"Org" +} +.org-src-container>pre.src-perl:before { + content:"Perl" +} +.org-src-container>pre.src-picolisp:before { + content:"Picolisp" +} +.org-src-container>pre.src-plantuml:before { + content:"PlantUML" +} +.org-src-container>pre.src-python:before { + content:"Python" +} +.org-src-container>pre.src-ruby:before { + content:"Ruby" +} +.org-src-container>pre.src-sass:before { + content:"Sass" +} +.org-src-container>pre.src-scala:before { + content:"Scala" +} +.org-src-container>pre.src-scheme:before { + content:"Scheme" +} +.org-src-container>pre.src-screen:before { + content:"Screen" +} +.org-src-container>pre.src-sed:before { + content:"Sed" +} +.org-src-container>pre.src-shell:before { + content:"shell" +} +.org-src-container>pre.src-shen:before { + content:"Shen" +} +.org-src-container>pre.src-sql:before { + content:"SQL" +} +.org-src-container>pre.src-sqlite:before { + content:"SQLite" +} +.org-src-container>pre.src-stan:before { + content:"Stan" +} +.org-src-container>pre.src-vala:before { + content:"Vala" +} +.org-src-container>pre.src-axiom:before { + content:"Axiom" +} +.org-src-container>pre.src-browser:before { + content:"HTML" +} +.org-src-container>pre.src-cypher:before { + content:"Neo4j" +} +.org-src-container>pre.src-elixir:before { + content:"Elixir" +} +.org-src-container>pre.src-request:before { + content:"http" +} +.org-src-container>pre.src-ipython:before { + content:"iPython" +} +.org-src-container>pre.src-kotlin:before { + content:"Kotlin" +} +.org-src-container>pre.src-Flavored Erlang lfe:before { + content:"Lisp" +} +.org-src-container>pre.src-mongo:before { + content:"MongoDB" +} +.org-src-container>pre.src-prolog:before { + content:"Prolog" +} +.org-src-container>pre.src-rec:before { + content:"rec" +} +.org-src-container>pre.src-ML sml:before { + content:"Standard" +} +.org-src-container>pre.src-Translate translate:before { + content:"Google" +} +.org-src-container>pre.src-typescript:before { + content:"Typescript" +} +.org-src-container>pre.src-rust:before { + content:"Rust" +} +.inlinetask { + background:#ffc; + border:2px solid grey; + margin:10px; + padding:10px +} +#org-div-home-and-up { + font-size:70%; + text-align:right; + white-space:nowrap +} +.linenr { + font-size:90% +} +.code-highlighted { + background-color:#ff0 +} +#bibliography { + font-size:90% +} +#bibliography table { + width:100% +} +.creator { + display:block +} +@media screen and (min-width:600px) { + .creator { + display:inline; + float:right + } +} diff --git a/assets/styles/org.css~ b/assets/styles/org.css~ new file mode 100755 index 0000000..84cdf06 --- /dev/null +++ b/assets/styles/org.css~ @@ -0,0 +1,2462 @@ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html { + font-family:sans-serif; + line-height:1.15; + -ms-text-size-adjust:100%; + -webkit-text-size-adjust:100% +} +body { + margin:0 +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section, +summary { + display:block +} +audio, +canvas, +progress, +video { + display:inline-block +} +audio:not([controls]) { + display:none; + height:0 +} +progress { + vertical-align:baseline +} +[hidden], +template { + display:none +} +a { + background-color:transparent; + -webkit-text-decoration-skip:objects +} +a:active, +a:hover { + outline-width:0 +} +abbr[title] { + border-bottom:none; + text-decoration:underline; + -webkit-text-decoration:underline dotted; + text-decoration:underline dotted +} +b, +strong { + font-weight:inherit; + font-weight:bolder +} +dfn { + font-style:italic +} +h1 { + font-size:2em; + margin:.67em 0 +} +mark { + background-color:#ff0; + color:#000 +} +small { + font-size:80% +} +sub, +sup { + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline +} +sub { + bottom:-.25em +} +sup { + top:-.5em +} +img { + border-style:none +} +svg:not(:root) { + overflow:hidden +} +code, +kbd, +pre, +samp { + font-family:monospace,monospace; + font-size:1em +} +figure { + margin:1em 40px +} +hr { + box-sizing:content-box; + height:0; + overflow:visible +} +button, +input, +optgroup, +select, +textarea { + font:inherit; + margin:0 +} +optgroup { + font-weight:700 +} +button, +input { + overflow:visible +} +button, +select { + text-transform:none +} +[type=reset], +[type=submit], +button, +html [type=button] { + -webkit-appearance:button +} +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style:none; + padding:0 +} +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline:1px dotted ButtonText +} +fieldset { + border:1px solid silver; + margin:0 2px; + padding:.35em .625em .75em +} +legend { + box-sizing:border-box; + color:inherit; + display:table; + max-width:100%; + padding:0; + white-space:normal +} +textarea { + overflow:auto +} +[type=checkbox], +[type=radio] { + box-sizing:border-box; + padding:0 +} +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height:auto +} +[type=search] { + -webkit-appearance:textfield; + outline-offset:-2px +} +[type=search]::-webkit-search-cancel-button, +[type=search]::-webkit-search-decoration { + -webkit-appearance:none +} +::-webkit-input-placeholder { + color:inherit; + opacity:.54 +} +::-webkit-file-upload-button { + -webkit-appearance:button; + font:inherit +} +body { + color:#000; + background-color:#fff +} +.org-alert-high { + color:#ff8c00; + font-weight:700 +} +.org-alert-low { + color:#00008b +} +.org-alert-moderate { + color:gold; + font-weight:700 +} +.org-alert-saved-fringe { + background-color:#f2f2f2 +} +.org-alert-trivial { + color:Dark purple +} +.org-alert-urgent { + color:red; + font-weight:700 +} +.org-anzu-match-1 { + color:#000; + background-color:#7fffd4 +} +.org-anzu-match-2 { + color:#000; + background-color:#00ff7f +} +.org-anzu-match-3 { + color:#000; + background-color:#ff0 +} +.org-anzu-mode-line, +.org-anzu-mode-line-no-match { + color:#008b00; + font-weight:700 +} +.org-anzu-replace-highlight { + color:#b0e2ff; + background-color:#cd00cd +} +.org-anzu-replace-to { + color:red +} +.org-bbdb-field-name { + color:sienna +} +.org-bbdb-name { + color:#00f +} +.org-bbdb-organization { + color:#b22222 +} +.org-beacon-fallback-background { + background-color:#000 +} +.org-biblio-results-header { + color:#483d8b; + font-size:150%; + font-weight:700 +} +.org-bold { + font-weight:700 +} +.org-bold-italic { + font-weight:700; + font-style:italic +} +.org-bookmark-menu-bookmark { + font-weight:700 +} +.org-bookmark-menu-heading { + color:#228b22 +} +.org-buffer-menu-buffer { + font-weight:700 +} +.org-builtin { + color:#483d8b +} +.org-button { + color:#3a5fcd; + text-decoration:underline +} +.org-c-annotation { + color:#008b8b +} +.org-cal-china-x-general-holiday { + background-color:#228b22 +} +.org-cal-china-x-important-holiday { + background-color:#8b0000 +} +.org-calendar-iso-week { + color:pink; + font-weight:700 +} +.org-calendar-iso-week-header { + color:#0ff +} +.org-calendar-month-header { + color:#00f +} +.org-calendar-today { + text-decoration:underline +} +.org-calendar-weekday-header { + color:#008b8b +} +.org-calendar-weekend-header { + color:#b22222 +} +.org-comint-highlight-input { + font-weight:700 +} +.org-comint-highlight-prompt { + color:#0000cd +} +.org-comment, +.org-comment-delimiter { + color:#b22222 +} +.org-compilation-column-number { + color:#8b2252 +} +.org-compilation-error { + color:red; + font-weight:700 +} +.org-compilation-info { + color:#228b22; + font-weight:700 +} +.org-compilation-line-number { + color:#a020f0 +} +.org-compilation-mode-line-exit { + color:#228b22; + font-weight:700 +} +.org-compilation-mode-line-fail { + color:red; + font-weight:700 +} +.org-compilation-mode-line-run, +.org-compilation-warning { + color:#ff8c00; + font-weight:700 +} +.org-completions-annotations { + font-style:italic +} +.org-completions-first-difference { + font-weight:700 +} +.org-constant { + color:#008b8b +} +.org-cursor { + background-color:#eead0e +} +.org-custom-button { + color:#000; + background-color:#d3d3d3 +} +.org-custom-button-mouse { + color:#000; + background-color:#e5e5e5 +} +.org-custom-button-pressed { + color:#000; + background-color:#d3d3d3 +} +.org-custom-button-pressed-unraised { + color:#8b008b; + text-decoration:underline +} +.org-custom-button-unraised { + text-decoration:underline +} +.org-custom-changed { + color:#fff; + background-color:#00f +} +.org-custom-comment { + background-color:#d9d9d9 +} +.org-custom-comment-tag { + color:#00008b +} +.org-custom-face-tag { + color:#00f; + font-weight:700 +} +.org-custom-group-subtitle { + font-weight:700 +} +.org-custom-group-tag { + color:#00f; + font-size:120%; + font-weight:700 +} +.org-custom-group-tag-1 { + color:red; + font-size:120%; + font-weight:700 +} +.org-custom-invalid { + color:#ff0; + background-color:red +} +.org-custom-link { + color:#3a5fcd; + text-decoration:underline +} +.org-custom-modified { + color:#fff; + background-color:#00f +} +.org-custom-rogue { + color:pink; + background-color:#000 +} +.org-custom-saved { + text-decoration:underline +} +.org-custom-set { + color:#00f; + background-color:#fff +} +.org-custom-state { + color:#006400 +} +.org-custom-themed { + color:#fff; + background-color:#00f +} +.org-custom-variable-button { + font-weight:700; + text-decoration:underline +} +.org-custom-variable-tag { + color:#00f; + font-weight:700 +} +.org-custom-visibility { + color:#3a5fcd; + font-size:80%; + text-decoration:underline +} +.org-diary { + color:red +} +.org-diary-anniversary { + color:#a020f0 +} +.org-diary-time { + color:sienna +} +.org-dired-async-failures { + color:red +} +.org-dired-async-message { + color:#ff0 +} +.org-dired-async-mode-message { + color:gold +} +.org-dired-directory { + color:#00f +} +.org-dired-flagged { + color:red; + font-weight:700 +} +.org-dired-header { + color:#228b22 +} +.org-dired-ignored { + color:#7f7f7f +} +.org-dired-mark { + color:#008b8b +} +.org-dired-marked { + color:#ff8c00; + font-weight:700 +} +.org-dired-perm-write { + color:#b22222 +} +.org-dired-symlink { + color:#a020f0 +} +.org-dired-warning { + color:red; + font-weight:700 +} +.org-doc { + color:#8b2252 +} +.org-eldoc-highlight-function-argument { + font-weight:700 +} +.org-epa-field-body { + font-style:italic +} +.org-epa-field-name, +.org-epa-mark { + font-weight:700 +} +.org-epa-mark { + color:red +} +.org-epa-string { + color:#00008b +} +.org-epa-validity-disabled { + font-style:italic +} +.org-epa-validity-high { + font-weight:700 +} +.org-epa-validity-low, +.org-epa-validity-medium { + font-style:italic +} +.org-error { + color:red; + font-weight:700 +} +.org-escape-glyph { + color:brown +} +.org-evil-ex-commands { + font-style:italic; + text-decoration:underline +} +.org-evil-ex-info { + color:red; + font-style:italic +} +.org-evil-ex-lazy-highlight { + background-color:#afeeee +} +.org-evil-ex-search { + color:#b0e2ff; + background-color:#cd00cd +} +.org-evil-ex-substitute-matches { + background-color:#afeeee +} +.org-evil-ex-substitute-replacement { + color:red; + text-decoration:underline +} +.org-ffap { + background-color:#b4eeb4 +} +.org-file-name-shadow { + color:#7f7f7f +} +.org-flycheck-error { + text-decoration:underline +} +.org-flycheck-error-list-checker-name { + color:#00f +} +.org-flycheck-error-list-column-number { + color:#008b8b +} +.org-flycheck-error-list-error { + color:red; + font-weight:700 +} +.org-flycheck-error-list-filename { + color:sienna +} +.org-flycheck-error-list-highlight { + background-color:#b4eeb4 +} +.org-flycheck-error-list-id, +.org-flycheck-error-list-id-with-explainer { + color:#228b22 +} +.org-flycheck-error-list-info { + color:#228b22; + font-weight:700 +} +.org-flycheck-error-list-line-number { + color:#008b8b +} +.org-flycheck-error-list-warning { + color:#ff8c00; + font-weight:700 +} +.org-flycheck-fringe-error { + color:red; + font-weight:700 +} +.org-flycheck-fringe-info { + color:#228b22; + font-weight:700 +} +.org-flycheck-fringe-warning { + color:#ff8c00; + font-weight:700 +} +.org-flycheck-info, +.org-flycheck-warning, +.org-flyspell-duplicate, +.org-flyspell-incorrect { + text-decoration:underline +} +.org-fringe { + background-color:#f2f2f2 +} +.org-function-name { + color:#00f +} +.org-glyphless-char { + font-size:60% +} +.org-golden-ratio-scroll-highlight-line { + color:#fff; + background-color:#53868b; + font-weight:700 +} +.org-header-line { + color:#333; + background-color:#e5e5e5 +} +.org-helm-action { + text-decoration:underline +} +.org-helm-bookmark-addressbook { + color:tomato +} +.org-helm-bookmark-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-bookmark-file { + color:#00b2ee +} +.org-helm-bookmark-file-not-found { + color:#6c7b8b +} +.org-helm-bookmark-gnus { + color:#f0f +} +.org-helm-bookmark-info { + color:#0f0 +} +.org-helm-bookmark-man { + color:#8b5a00 +} +.org-helm-bookmark-w3m { + color:#ff0 +} +.org-helm-buffer-archive { + color:gold +} +.org-helm-buffer-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-buffer-file { + color:#483d8b +} +.org-helm-buffer-modified { + color:#b22222 +} +.org-helm-buffer-not-saved { + color:#ee6363 +} +.org-helm-buffer-process { + color:#cd6839 +} +.org-helm-buffer-saved-out { + color:red; + background-color:#000 +} +.org-helm-buffer-size { + color:#708090 +} +.org-helm-candidate-number, +.org-helm-candidate-number-suspended { + color:#000; + background-color:#faffb5 +} +.org-helm-delete-async-message { + color:#ff0 +} +.org-helm-etags-file { + color:#8b814c; + text-decoration:underline +} +.org-helm-ff-denied { + color:red; + background-color:#000 +} +.org-helm-ff-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-ff-dirs { + color:#00f +} +.org-helm-ff-dotted-directory { + color:#000; + background-color:#696969 +} +.org-helm-ff-dotted-symlink-directory { + color:#ff8c00; + background-color:#696969 +} +.org-helm-ff-executable { + color:#0f0 +} +.org-helm-ff-file { + color:#483d8b +} +.org-helm-ff-invalid-symlink { + color:#000; + background-color:red +} +.org-helm-ff-pipe { + color:#ff0; + background-color:#000 +} +.org-helm-ff-prefix { + color:#000; + background-color:#ff0 +} +.org-helm-ff-socket { + color:#ff1493 +} +.org-helm-ff-suid { + color:#fff; + background-color:red +} +.org-helm-ff-symlink { + color:#b22222 +} +.org-helm-ff-truename { + color:#8b2252 +} +.org-helm-grep-cmd-line { + color:#228b22 +} +.org-helm-grep-file { + color:#8a2be2; + text-decoration:underline +} +.org-helm-grep-finish { + color:#0f0 +} +.org-helm-grep-lineno { + color:#ff7f00 +} +.org-helm-grep-match { + color:#b00000 +} +.org-helm-header { + color:#333; + background-color:#e5e5e5 +} +.org-helm-header-line-left-margin { + color:#000; + background-color:#ff0 +} +.org-helm-helper { + color:#333; + background-color:#e5e5e5 +} +.org-helm-history-deleted { + color:#000; + background-color:red +} +.org-helm-history-remote { + color:#ff6a6a +} +.org-helm-lisp-completion-info { + color:red +} +.org-helm-lisp-show-completion { + background-color:#2f4f4f +} +.org-helm-locate-finish { + color:#0f0 +} +.org-helm-m-x-key { + color:orange; + text-decoration:underline +} +.org-helm-match { + color:#b00000 +} +.org-helm-match-item { + color:#b0e2ff; + background-color:#cd00cd +} +.org-helm-minibuffer-prompt { + color:#0000cd +} +.org-helm-moccur-buffer { + color:#00ced1; + text-decoration:underline +} +.org-helm-non-file-buffer { + font-style:italic +} +.org-helm-prefarg { + color:red +} +.org-helm-resume-need-update { + background-color:red +} +.org-helm-selection { + background-color:#097209 +} +.org-helm-selection-line { + background-color:#b4eeb4 +} +.org-helm-separator { + color:#ffbfb5 +} +.org-helm-source-header { + color:#000; + background-color:#abd7f0; + font-size:130%; + font-weight:700 +} +.org-helm-visible-mark { + background-color:#d1f5ea +} +.org-help-argument-name { + font-style:italic +} +.org-highlight { + background-color:#b4eeb4 +} +.org-highlight-indent-guides-character { + color:#e6e6e6 +} +.org-highlight-indent-guides-even { + background-color:#e6e6e6 +} +.org-highlight-indent-guides-odd { + background-color:#f3f3f3 +} +.org-highlight-indent-guides-stack-character { + color:#ccc +} +.org-highlight-indent-guides-stack-even { + background-color:#ccc +} +.org-highlight-indent-guides-stack-odd { + background-color:#d9d9d9 +} +.org-highlight-indent-guides-top-character { + color:#b3b3b3 +} +.org-highlight-indent-guides-top-even { + background-color:#b3b3b3 +} +.org-highlight-indent-guides-top-odd { + background-color:silver +} +.org-highlight-numbers-number { + color:#008b8b +} +.org-hl-line { + background-color:#b4eeb4 +} +.org-holiday { + background-color:pink +} +.org-hydra-face-amaranth { + color:#e52b50; + font-weight:700 +} +.org-hydra-face-blue { + color:#00f; + font-weight:700 +} +.org-hydra-face-pink { + color:#ff6eb4; + font-weight:700 +} +.org-hydra-face-red { + color:red; + font-weight:700 +} +.org-hydra-face-teal { + color:#367588; + font-weight:700 +} +.org-ido-first-match { + font-weight:700 +} +.org-ido-incomplete-regexp { + color:red; + font-weight:700 +} +.org-ido-indicator { + color:#ff0; + background-color:red +} +.org-ido-only-match { + color:#228b22 +} +.org-ido-subdir { + color:red +} +.org-ido-virtual { + color:#483d8b +} +.org-info-header-node { + color:brown; + font-weight:700; + font-style:italic +} +.org-info-header-xref { + color:#3a5fcd; + text-decoration:underline +} +.org-info-index-match { + background-color:#ff0 +} +.org-info-menu-header { + font-weight:700 +} +.org-info-menu-star { + color:red +} +.org-info-node { + color:brown; + font-weight:700; + font-style:italic +} +.org-info-title-1 { + font-size:172%; + font-weight:700 +} +.org-info-title-2 { + font-size:144%; + font-weight:700 +} +.org-info-title-3 { + font-size:120%; + font-weight:700 +} +.org-info-title-4 { + font-weight:700 +} +.org-info-xref { + color:#3a5fcd; + text-decoration:underline +} +.org-isearch { + color:#b0e2ff; + background-color:#cd00cd +} +.org-isearch-fail { + background-color:#ffc1c1 +} +.org-italic { + font-style:italic +} +.org-keyword { + color:#a020f0 +} +.org-lazy-highlight { + background-color:#afeeee +} +.org-link { + color:#3a5fcd; + text-decoration:underline +} +.org-link-visited { + color:#8b008b; + text-decoration:underline +} +.org-lv-separator { + background-color:#ccc +} +.org-match { + background-color:#ff0 +} +.org-mcXcursor-bar { + background-color:#000 +} +.org-mcXregion { + background-color:gtk_selection_bg_color +} +.org-me-dired-dim-0 { + color:#b3b3b3 +} +.org-me-dired-dim-1 { + color:#7f7f7f +} +.org-me-dired-executable { + color:#0f0 +} +.org-message-cited-text { + color:red +} +.org-message-header-cc { + color:#191970 +} +.org-message-header-name { + color:#6495ed +} +.org-message-header-newsgroups { + color:#00008b; + font-weight:700; + font-style:italic +} +.org-message-header-other { + color:#4682b4 +} +.org-message-header-subject { + color:navy; + font-weight:700 +} +.org-message-header-to { + color:#191970; + font-weight:700 +} +.org-message-header-xheader { + color:#00f +} +.org-message-mml { + color:#228b22 +} +.org-message-separator { + color:brown +} +.org-minibuffer-prompt { + color:#0000cd +} +.org-mm-command-output { + color:#cd0000 +} +.org-mode-line { + color:#000; + background-color:#bfbfbf +} +.org-mode-line-buffer-id, +.org-mode-line-buffer-id-inactive, +.org-mode-line-emphasis { + font-weight:700 +} +.org-mode-line-inactive { + color:#333; + background-color:#e5e5e5 +} +.org-mu4e-attach-number { + color:sienna; + font-weight:700 +} +.org-mu4e-cited-1 { + color:#483d8b; + font-style:italic +} +.org-mu4e-cited-2 { + color:#5cacee; + font-style:italic +} +.org-mu4e-cited-3 { + color:sienna; + font-style:italic +} +.org-mu4e-cited-4 { + color:#a020f0; + font-style:italic +} +.org-mu4e-cited-5, +.org-mu4e-cited-6 { + color:#b22222; + font-style:italic +} +.org-mu4e-cited-7 { + color:#228b22; + font-style:italic +} +.org-mu4e-compose-header, +.org-mu4e-compose-separator { + color:brown; + font-style:italic +} +.org-mu4e-contact { + color:sienna +} +.org-mu4e-context { + color:#006400; + font-weight:700 +} +.org-mu4e-draft { + color:#8b2252 +} +.org-mu4e-flagged { + color:#008b8b; + font-weight:700 +} +.org-mu4e-footer { + color:#b22222 +} +.org-mu4e-forwarded { + color:#483d8b +} +.org-mu4e-header { + color:#000; + background-color:#fff +} +.org-mu4e-header-highlight { + background-color:#000; + font-weight:700; + text-decoration:underline +} +.org-mu4e-header-key { + color:#6495ed; + font-weight:700 +} +.org-mu4e-header-marks { + color:#483d8b +} +.org-mu4e-header-title, +.org-mu4e-header-value { + color:#228b22 +} +.org-mu4e-highlight { + background-color:#b4eeb4 +} +.org-mu4e-link { + color:#3a5fcd; + text-decoration:underline +} +.org-mu4e-modeline { + color:#8b4500; + font-weight:700 +} +.org-mu4e-moved { + color:#b22222; + font-style:italic +} +.org-mu4e-ok { + color:#b22222; + font-weight:700 +} +.org-mu4e-region-code { + background-color:#2f4f4f +} +.org-mu4e-replied, +.org-mu4e-special-header-value { + color:#483d8b +} +.org-mu4e-system { + color:#b22222; + font-style:italic +} +.org-mu4e-title { + color:#228b22; + font-weight:700 +} +.org-mu4e-trashed { + color:#b22222; + text-decoration:line-through +} +.org-mu4e-unread { + color:#a020f0; + font-weight:700 +} +.org-mu4e-url-number { + color:#008b8b; + font-weight:700 +} +.org-mu4e-view-body { + color:#000; + background-color:#fff +} +.org-mu4e-warning { + color:red; + font-weight:700 +} +.org-next-error { + background-color:gtk_selection_bg_color +} +.org-nobreak-space { + color:brown; + text-decoration:underline +} +.org-org-agenda-calendar-event, +.org-org-agenda-calendar-sexp { + color:#000; + background-color:#fff +} +.org-org-agenda-clocking { + background-color:#ff0 +} +.org-org-agenda-column-dateline { + background-color:#e5e5e5 +} +.org-org-agenda-current-time { + color:#b8860b +} +.org-org-agenda-date { + color:#00f +} +.org-org-agenda-date-today { + color:#00f; + font-weight:700; + font-style:italic +} +.org-org-agenda-date-weekend { + color:#00f; + font-weight:700 +} +.org-org-agenda-diary { + color:#000; + background-color:#fff +} +.org-org-agenda-dimmed-todo { + color:#7f7f7f +} +.org-org-agenda-done { + color:#228b22 +} +.org-org-agenda-filter-category, +.org-org-agenda-filter-effort, +.org-org-agenda-filter-regexp, +.org-org-agenda-filter-tags { + color:#000; + background-color:#bfbfbf +} +.org-org-agenda-restriction-lock { + background-color:#eee +} +.org-org-agenda-structure { + color:#00f +} +.org-org-archived { + color:#7f7f7f +} +.org-org-block { + color:#7f7f7f +} +.org-org-block-begin-line, +.org-org-block-end-line { + color:#b22222 +} +.org-org-checkbox { + font-weight:700 +} +.org-org-checkbox-statistics-done { + color:#228b22; + font-weight:700 +} +.org-org-checkbox-statistics-todo { + color:red; + font-weight:700 +} +.org-org-clock-overlay { + color:#000; + background-color:#d3d3d3 +} +.org-org-code { + color:#7f7f7f +} +.org-org-column, +.org-org-column-title { + background-color:#e5e5e5 +} +.org-org-column-title { + font-weight:700; + text-decoration:underline +} +.org-org-date { + color:#bfaf87; + text-decoration:underline +} +.org-org-date-selected { + color:red +} +.org-org-default { + color:#000; + background-color:#fff +} +.org-org-document-info { + color:#191970 +} +.org-org-document-info-keyword { + color:#7f7f7f +} +.org-org-document-title { + color:#191970; + font-weight:700 +} +.org-org-done { + color:#228b22; + font-weight:700 +} +.org-org-drawer { + color:#00f +} +.org-org-ellipsis { + color:#b8860b; + text-decoration:underline +} +.org-org-footnote { + color:#96b4cd; + text-decoration:underline +} +.org-org-formula { + color:#b22222 +} +.org-org-habit-alert { + background-color:#f5f946 +} +.org-org-habit-alert-future { + background-color:#fafca9 +} +.org-org-habit-clear { + background-color:#8270f9 +} +.org-org-habit-clear-future { + background-color:#d6e4fc +} +.org-org-habit-overdue { + background-color:#f9372d +} +.org-org-habit-overdue-future { + background-color:#fc9590 +} +.org-org-habit-ready { + background-color:#4df946 +} +.org-org-habit-ready-future { + background-color:#acfca9 +} +.org-org-headline-done { + color:#bc8f8f +} +.org-org-hide { + color:#fff +} +.org-org-latex-and-related { + color:#8b4513 +} +.org-org-level-1 { + color:#edd1c5 +} +.org-org-level-2 { + color:#ebebb7 +} +.org-org-level-3 { + color:#cce8cc +} +.org-org-level-4 { + color:#c9deec +} +.org-org-level-5 { + color:#dce3e8 +} +.org-org-level-6 { + color:#dde6dd +} +.org-org-level-7 { + color:#e8e8ce +} +.org-org-level-8 { + color:#e8dedb +} +.org-org-link { + color:#c5d2dc; + text-decoration:underline +} +.org-org-list-dt { + font-weight:700 +} +.org-org-macro { + color:#8b4513 +} +.org-org-meta-line { + color:#b22222 +} +.org-org-mode-line-clock { + color:#000; + background-color:#bfbfbf +} +.org-org-mode-line-clock-overrun { + color:#000; + background-color:red +} +.org-org-priority { + color:#a020f0 +} +.org-org-quote { + color:#7f7f7f +} +.org-org-ref-acronym { + color:#ee7600; + text-decoration:underline +} +.org-org-ref-cite { + color:#c3d5c3; + text-decoration:underline +} +.org-org-ref-glossary { + color:#8968cd; + text-decoration:underline +} +.org-org-ref-label { + color:#8b008b; + text-decoration:underline +} +.org-org-ref-ref { + color:#e1cc96; + text-decoration:underline +} +.org-org-scheduled { + color:#006400 +} +.org-org-scheduled-previously { + color:#b22222 +} +.org-org-scheduled-today { + color:#006400 +} +.org-org-sexp-date { + color:#a020f0 +} +.org-org-special-keyword { + color:#88949f +} +.org-org-table { + color:#00f +} +.org-org-tag, +.org-org-tag-group { + font-weight:700 +} +.org-org-target { + text-decoration:underline +} +.org-org-time-grid { + color:#b8860b +} +.org-org-todo { + color:red; + font-weight:700 +} +.org-org-upcoming-deadline { + color:#b22222 +} +.org-org-verbatim, +.org-org-verse { + color:#7f7f7f +} +.org-org-warning { + color:red; + font-weight:700 +} +.org-outline-1 { + color:#00f +} +.org-outline-2 { + color:sienna +} +.org-outline-3 { + color:#a020f0 +} +.org-outline-4 { + color:#b22222 +} +.org-outline-5 { + color:#228b22 +} +.org-outline-6 { + color:#008b8b +} +.org-outline-7 { + color:#483d8b +} +.org-outline-8 { + color:#8b2252 +} +.org-package-description { + color:#000; + background-color:#fff +} +.org-package-name { + color:#3a5fcd; + text-decoration:underline +} +.org-package-status-avail-obso { + color:#b22222 +} +.org-package-status-available { + color:#000; + background-color:#fff +} +.org-package-status-built-in { + color:#483d8b +} +.org-package-status-dependency { + color:#b22222 +} +.org-package-status-disabled { + color:red; + font-weight:700 +} +.org-package-status-external { + color:#483d8b +} +.org-package-status-held { + color:#008b8b +} +.org-package-status-incompat, +.org-package-status-installed { + color:#b22222 +} +.org-package-status-unsigned { + color:red; + font-weight:700 +} +.org-pdf-isearch-batch { + background-color:#ff0 +} +.org-pdf-isearch-lazy { + background-color:#afeeee +} +.org-pdf-isearch-match { + color:#b0e2ff; + background-color:#cd00cd +} +.org-pdf-occur-document { + color:#8b2252 +} +.org-pdf-occur-page { + color:#228b22 +} +.org-pdf-view-rectangle { + background-color:#b4eeb4 +} +.org-pdf-view-region { + background-color:gtk_selection_bg_color +} +.org-powerline-active0 { + color:#000; + background-color:#bfbfbf +} +.org-powerline-active1 { + color:#fff; + background-color:#2b2b2b +} +.org-powerline-active2 { + color:#fff; + background-color:#666 +} +.org-powerline-inactive0 { + color:#333; + background-color:#e5e5e5 +} +.org-powerline-inactive1 { + color:#333; + background-color:#1c1c1c +} +.org-powerline-inactive2 { + color:#333; + background-color:#333 +} +.org-preprocessor { + color:#483d8b +} +.org-query-replace { + color:#b0e2ff; + background-color:#cd00cd +} +.org-rainbow-delimiters-depth-1 { + color:#ffdead +} +.org-rainbow-delimiters-depth-2 { + color:#00bfff +} +.org-rainbow-delimiters-depth-3 { + color:#ffdead +} +.org-rainbow-delimiters-depth-4 { + color:#00bfff +} +.org-rainbow-delimiters-depth-5 { + color:#ffdead +} +.org-rainbow-delimiters-depth-6 { + color:#00bfff +} +.org-rainbow-delimiters-depth-7 { + color:#ffdead +} +.org-rainbow-delimiters-depth-8 { + color:#00bfff +} +.org-rainbow-delimiters-depth-9 { + color:#ffdead +} +.org-rainbow-delimiters-unmatched { + color:#88090b +} +.org-reb-match-0 { + background-color:#add8e6 +} +.org-reb-match-1 { + background-color:#7fffd4 +} +.org-reb-match-2 { + background-color:#00ff7f +} +.org-reb-match-3 { + background-color:#ff0 +} +.org-rectangle-preview { + background-color:gtk_selection_bg_color +} +.org-regexp-grouping-backslash, +.org-regexp-grouping-construct { + font-weight:700 +} +.org-region { + background-color:gtk_selection_bg_color +} +.org-secondary-selection { + background-color:#ff0 +} +.org-semantic-highlight-edits, +.org-semantic-highlight-func-current-tag { + background-color:#e5e5e5 +} +.org-semantic-unmatched-syntax { + text-decoration:underline +} +.org-sgml-namespace { + color:#483d8b +} +.org-sh-escaped-newline { + color:#8b2252 +} +.org-sh-heredoc { + color:#ee0 +} +.org-sh-quoted-exec { + color:#f0f +} +.org-shadow { + color:#7f7f7f +} +.org-show-paren-match { + background-color:#40e0d0 +} +.org-show-paren-mismatch { + color:#fff; + background-color:#a020f0 +} +.org-sp-pair-overlay, +.org-sp-show-pair-enclosing { + background-color:#b4eeb4 +} +.org-sp-show-pair-match { + background-color:#40e0d0 +} +.org-sp-show-pair-mismatch { + color:#fff; + background-color:#a020f0 +} +.org-sp-wrap-overlay { + background-color:#b4eeb4 +} +.org-sp-wrap-overlay-closing-pair { + color:red; + background-color:#b4eeb4 +} +.org-sp-wrap-overlay-opening-pair { + color:#0f0; + background-color:#b4eeb4 +} +.org-sp-wrap-tag-overlay { + background-color:#b4eeb4 +} +.org-spaceline-flycheck-error { + color:#fc5c94; + background-color:#333 +} +.org-spaceline-flycheck-info { + color:#8de6f7; + background-color:#333 +} +.org-spaceline-flycheck-warning { + color:#f3ea98; + background-color:#333 +} +.org-spaceline-python-venv { + color:#fbf +} +.org-speedbar-button { + color:#008b00 +} +.org-speedbar-directory { + color:#00008b +} +.org-speedbar-file { + color:#008b8b +} +.org-speedbar-highlight { + background-color:#0f0 +} +.org-speedbar-selected { + color:red; + text-decoration:underline +} +.org-speedbar-separator { + color:#fff; + background-color:#00f; + text-decoration:overline +} +.org-speedbar-tag { + color:brown +} +.org-string { + color:#8b2252 +} +.org-success { + color:#228b22; + font-weight:700 +} +.org-table-cell { + color:#e5e5e5; + background-color:#00f +} +.org-tex-math { + color:#8b2252 +} +.org-tool-bar { + color:#000; + background-color:#bfbfbf +} +.org-tooltip { + color:#000; + background-color:#ffffe0 +} +.org-trailing-whitespace { + background-color:red +} +.org-tty-menu-disabled { + color:#d3d3d3; + background-color:#00f +} +.org-tty-menu-enabled { + color:#ff0; + background-color:#00f; + font-weight:700 +} +.org-tty-menu-selected { + background-color:red +} +.org-type { + color:#228b22 +} +.org-underline { + text-decoration:underline +} +.org-undo-tree-visualizer-active-branch { + color:#000; + font-weight:700 +} +.org-undo-tree-visualizer-current { + color:red +} +.org-undo-tree-visualizer-default { + color:#bebebe +} +.org-undo-tree-visualizer-register { + color:#ff0 +} +.org-undo-tree-visualizer-unmodified { + color:#0ff +} +.org-variable-name { + color:sienna +} +.org-vhlXdefault { + background-color:#ff0 +} +.org-warning { + color:#ff8c00; + font-weight:700 +} +.org-warning-1 { + color:red; + font-weight:700 +} +.org-wgrep { + color:#fff; + background-color:#228b22 +} +.org-wgrep-delete { + color:pink; + background-color:#228b22 +} +.org-wgrep-done { + color:#00f +} +.org-wgrep-file { + color:#fff; + background-color:#228b22 +} +.org-wgrep-reject { + color:red; + font-weight:700 +} +.org-which-key-command-description { + color:#00f +} +.org-which-key-docstring { + color:#b22222 +} +.org-which-key-group-description { + color:#a020f0 +} +.org-which-key-highlighted-command { + color:#00f; + text-decoration:underline +} +.org-which-key-key { + color:#008b8b +} +.org-which-key-local-map-description { + color:#00f +} +.org-which-key-note, +.org-which-key-separator { + color:#b22222 +} +.org-which-key-special-key { + color:#008b8b; + font-weight:700 +} +.org-whitespace-big-indent { + color:#b22222; + background-color:red +} +.org-whitespace-empty { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-hspace { + color:#d3d3d3; + background-color:#cdc9a5 +} +.org-whitespace-indentation { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-line { + color:violet; + background-color:#333 +} +.org-whitespace-newline { + color:#d3d3d3 +} +.org-whitespace-space { + color:#d3d3d3; + background-color:#ffffe0 +} +.org-whitespace-space-after-tab { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-space-before-tab { + color:#b22222; + background-color:#ff8c00 +} +.org-whitespace-tab { + color:#d3d3d3; + background-color:beige +} +.org-whitespace-trailing { + color:#ff0; + background-color:red; + font-weight:700 +} +.org-widget-button { + font-weight:700 +} +.org-widget-button-pressed { + color:red +} +.org-widget-documentation { + color:#006400 +} +.org-widget-field { + background-color:#d9d9d9 +} +.org-widget-inactive { + color:#7f7f7f +} +.org-widget-single-line-field { + background-color:#d9d9d9 +} +.org-window-divider { + color:#999 +} +.org-window-divider-first-pixel { + color:#ccc +} +.org-window-divider-last-pixel { + color:#666 +} +a { + color:inherit; + background-color:inherit; + font:inherit; + text-decoration:inherit +} +a:hover { + text-decoration:underline +} +body { + width:95%; + margin:2% auto; + font-size:14px; + line-height:1.4em; + font-family:Georgia,serif; + color:#333 +} +@media screen and (min-width:600px) { + body { + font-size:18px + } +} +@media screen and (min-width:910px) { + body { + /*! width:900px; */ + } +} +::-moz-selection { + background:#d6edff +} +::selection { + background:#d6edff +} +p { + margin:1em auto +} +dl, +ol, +ul { + margin:0 auto +} +.title { + margin:.8em auto; + color:#000 +} +.subtitle, +.title { + text-align:center +} +.subtitle { + font-size:1.1em; + line-height:1.4; + font-weight:700; + margin:1em auto +} +.abstract { + margin:auto; + width:80%; + font-style:italic +} +.abstract p:last-of-type:before { + content:" "; + white-space:pre +} +.status { + font-size:90%; + margin:2em auto +} +[class^=section-number-] { + margin-right:.5em +} +[id^=orgheadline] { + clear:both +} +#footnotes { + font-size:90% +} +.footpara { + display:inline; + margin:.2em auto +} +.footdef { + margin-bottom:1em +} +.footdef sup { + padding-right:.5em +} +a { + color:#527d9a; + text-decoration:none +} +a:hover { + color:#035; + border-bottom:1px dotted +} +figure { + padding:0; + margin:1em auto; + text-align:center +} +img { + max-width:100%; + vertical-align:middle +} +.MathJax_Display { + margin:0!important; + width:90%!important +} +h1, +h2, +h3, +h4, +h5, +h6 { + color:#a5573e; + line-height:1em; + font-family:Helvetica,sans-serif +} +h1, +h2, +h3 { + line-height:1.4em +} +h4, +h5, +h6 { + font-size:1em +} +@media screen and (min-width:600px) { + h1 { + font-size:2em + } + h2 { + font-size:1.5em + } + h3 { + font-size:1.3em + } + h1, + h2, + h3 { + line-height:1.4em + } + h4, + h5, + h6 { + font-size:1.1em + } +} +dt { + font-weight:700 +} +table { + margin:1em auto; + border-top:2px solid; + border-collapse:collapse +} +table, +thead { + border-bottom:2px solid +} +table td+td, +table th+th { + border-left:1px solid grey +} +table tr { + border-top:1px solid #d3d3d3 +} +td, +th { + padding:.3em .6em; + vertical-align:middle +} +caption.t-above { + caption-side:top +} +caption.t-bottom { + caption-side:bottom +} +caption { + margin-bottom:.3em +} +figcaption { + margin-top:.3em +} +th.org-center, +th.org-left, +th.org-right { + text-align:center +} +td.org-right { + text-align:right +} +td.org-left { + text-align:left +} +td.org-center { + text-align:center +} +blockquote { + margin:1em 2em; + padding-left:1em; + border-left:3px solid #ccc +} +kbd { + background-color:#f7f7f7; + font-size:80%; + margin:0 .1em; + padding:.1em .6em +} +.todo { + background-color:red +} +.done, +.todo { + color:#fff; + padding:.1em .3em; + border-radius:3px; + background-clip:padding-box; + font-size:80%; + font-family:Lucida Console,monospace; + line-height:1 +} +.done { + background-color:green +} +.priority { + color:orange; + font-family:Lucida Console,monospace +} +#table-of-contents li { + clear:both +} +.tag { + font-family:Lucida Console,monospace; + font-size:.7em; + font-weight:400 +} +.tag span { + padding:.3em; + float:right; + margin-right:.5em; + border:1px solid #bbb; + border-radius:3px; + background-clip:padding-box; + color:#333; + background-color:#eee; + line-height:1 +} +.timestamp { + color:#bebebe; + font-size:90% +} +.timestamp-kwd { + color:#5f9ea0 +} +.org-right { + margin-left:auto; + margin-right:0; + text-align:right +} +.org-left { + margin-left:0; + margin-right:auto; + text-align:left +} +.org-center { + margin-left:auto; + margin-right:auto; + text-align:center +} +.underline { + text-decoration:underline +} +#postamble p, +#preamble p { + font-size:90%; + margin:.2em +} +p.verse { + margin-left:3% +} +:not(pre)>code { + padding:2px 5px; + margin:auto 1px; + border:1px solid #ddd; + border-radius:3px; + background-clip:padding-box; + color:#333; + font-size:80% +} +.org-src-container { + border:1px solid #ccc; + box-shadow:3px 3px 3px #eee; + font-family:Lucida Console,monospace; + font-size:80%; + margin:1em auto; + padding:.1em .5em; + position:relative +} +.org-src-container>pre { + overflow:auto +} +.org-src-container>pre:before { + display:block; + position:absolute; + background-color:#b3b3b3; + top:0; + right:0; + padding:0 .5em; + border-bottom-left-radius:8px; + border:0; + color:#fff; + font-size:80% +} +.org-src-container>pre.src-sh:before { + content:"sh" +} +.org-src-container>pre.src-bash:before { + content:"bash" +} +.org-src-container>pre.src-emacs-lisp:before { + content:"Emacs Lisp" +} +.org-src-container>pre.src-R:before { + content:"R" +} +.org-src-container>pre.src-cpp:before { + content:"C++" +} +.org-src-container>pre.src-c:before { + content:"C" +} +.org-src-container>pre.src-html:before { + content:"HTML" +} +.org-src-container>pre.src-javascript:before, +.org-src-container>pre.src-js:before { + content:"Javascript" +} +// More languages 0% http://orgmode.org/worg/org-contrib/babel/languages.html .org-src-container>pre.src-abc:before { + content:"ABC" +} +.org-src-container>pre.src-asymptote:before { + content:"Asymptote" +} +.org-src-container>pre.src-awk:before { + content:"Awk" +} +.org-src-container>pre.src-C:before { + content:"C" +} +.org-src-container>pre.src-calc:before { + content:"Calc" +} +.org-src-container>pre.src-clojure:before { + content:"Clojure" +} +.org-src-container>pre.src-comint:before { + content:"comint" +} +.org-src-container>pre.src-css:before { + content:"CSS" +} +.org-src-container>pre.src-D:before { + content:"D" +} +.org-src-container>pre.src-ditaa:before { + content:"Ditaa" +} +.org-src-container>pre.src-dot:before { + content:"Dot" +} +.org-src-container>pre.src-ebnf:before { + content:"ebnf" +} +.org-src-container>pre.src-forth:before { + content:"Forth" +} +.org-src-container>pre.src-F90:before { + content:"Fortran" +} +.org-src-container>pre.src-gnuplot:before { + content:"Gnuplot" +} +.org-src-container>pre.src-haskell:before { + content:"Haskell" +} +.org-src-container>pre.src-io:before { + content:"Io" +} +.org-src-container>pre.src-java:before { + content:"Java" +} +.org-src-container>pre.src-latex:before { + content:"LaTeX" +} +.org-src-container>pre.src-ledger:before { + content:"Ledger" +} +.org-src-container>pre.src-ly:before { + content:"Lilypond" +} +.org-src-container>pre.src-lisp:before { + content:"Lisp" +} +.org-src-container>pre.src-makefile:before { + content:"Make" +} +.org-src-container>pre.src-matlab:before { + content:"Matlab" +} +.org-src-container>pre.src-max:before { + content:"Maxima" +} +.org-src-container>pre.src-mscgen:before { + content:"Mscgen" +} +.org-src-container>pre.src-Caml:before { + content:"Objective" +} +.org-src-container>pre.src-octave:before { + content:"Octave" +} +.org-src-container>pre.src-org:before { + content:"Org" +} +.org-src-container>pre.src-perl:before { + content:"Perl" +} +.org-src-container>pre.src-picolisp:before { + content:"Picolisp" +} +.org-src-container>pre.src-plantuml:before { + content:"PlantUML" +} +.org-src-container>pre.src-python:before { + content:"Python" +} +.org-src-container>pre.src-ruby:before { + content:"Ruby" +} +.org-src-container>pre.src-sass:before { + content:"Sass" +} +.org-src-container>pre.src-scala:before { + content:"Scala" +} +.org-src-container>pre.src-scheme:before { + content:"Scheme" +} +.org-src-container>pre.src-screen:before { + content:"Screen" +} +.org-src-container>pre.src-sed:before { + content:"Sed" +} +.org-src-container>pre.src-shell:before { + content:"shell" +} +.org-src-container>pre.src-shen:before { + content:"Shen" +} +.org-src-container>pre.src-sql:before { + content:"SQL" +} +.org-src-container>pre.src-sqlite:before { + content:"SQLite" +} +.org-src-container>pre.src-stan:before { + content:"Stan" +} +.org-src-container>pre.src-vala:before { + content:"Vala" +} +.org-src-container>pre.src-axiom:before { + content:"Axiom" +} +.org-src-container>pre.src-browser:before { + content:"HTML" +} +.org-src-container>pre.src-cypher:before { + content:"Neo4j" +} +.org-src-container>pre.src-elixir:before { + content:"Elixir" +} +.org-src-container>pre.src-request:before { + content:"http" +} +.org-src-container>pre.src-ipython:before { + content:"iPython" +} +.org-src-container>pre.src-kotlin:before { + content:"Kotlin" +} +.org-src-container>pre.src-Flavored Erlang lfe:before { + content:"Lisp" +} +.org-src-container>pre.src-mongo:before { + content:"MongoDB" +} +.org-src-container>pre.src-prolog:before { + content:"Prolog" +} +.org-src-container>pre.src-rec:before { + content:"rec" +} +.org-src-container>pre.src-ML sml:before { + content:"Standard" +} +.org-src-container>pre.src-Translate translate:before { + content:"Google" +} +.org-src-container>pre.src-typescript:before { + content:"Typescript" +} +.org-src-container>pre.src-rust:before { + content:"Rust" +} +.inlinetask { + background:#ffc; + border:2px solid grey; + margin:10px; + padding:10px +} +#org-div-home-and-up { + font-size:70%; + text-align:right; + white-space:nowrap +} +.linenr { + font-size:90% +} +.code-highlighted { + background-color:#ff0 +} +#bibliography { + font-size:90% +} +#bibliography table { + width:100% +} +.creator { + display:block +} +@media screen and (min-width:600px) { + .creator { + display:inline; + float:right + } +} diff --git a/assets/styles/style.css b/assets/styles/style.css new file mode 100755 index 0000000..43655ac --- /dev/null +++ b/assets/styles/style.css @@ -0,0 +1,716 @@ +/* ========================================================= + TOKENS / CUSTOM PROPERTIES + ========================================================= */ + +:root { + --gutter: 2rem; + --margin: 420px; + --body-pad: 1rem; + + --content-min: 60ch; + --content-max: 880px; + --content: clamp( + var(--content-min), + calc(100vi - (2 * var(--body-pad)) - (2 * (var(--margin) + var(--gutter)))), + var(--content-max) + ); + + --bleed: 48px; + --fullwidth-cap: 860px; + + --bg: #333; + --page-bg: #444; + --fg: #f3f3f3; + + --heading: #f9f9f9; + --link: lightblue; + --link-2: var(--link); + + --code-bg: #f0f0f0; + + --border: #d7d7d7; + --active-toc: #cacaca; + + --muted: #666; + --note-color: #555; + --note-bg: transparent; + + --chip-bg: #f0f0f0; + --chip-fg: #444; + + /* Compatibility aliases (you reference these later) */ + --border-color: var(--border); + --text-color: var(--fg); + --muted-text: var(--muted); + --link-color: var(--link); + --link-hover-color: var(--fg); + --bg-alt: #2a2a2a; +} + +/* ========================================================= + BASE / TYPOGRAPHY + ========================================================= */ + +html, +body { + margin: 0; + background-color: var(--page-bg); + color: var(--fg); + transition: background-color 0.3s, color 0.3s; + font-family: Inter, sans-serif; +} + +/* Keep your layout intent (column app shell) */ +body { + display: flex; + flex-direction: column; +} + +h1, +h2, +h3 { + color: var(--heading); +} + +a { + color: var(--link-2); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* ========================================================= + PREAMBLE / HEADER + ========================================================= */ + +#preamble { + top: 0; + z-index: 20; + background: var(--bg); + border-bottom: 1px dotted var(--border); +} + +#preamble .banner-header, +#preamble #updated { + max-width: 100%; +} + +.banner-header { + position: relative; /* anchor for Close All */ + display: flex; + justify-content: flex-start; /* align to left */ + align-items: center; + gap: 1rem; + + padding: 0.5rem 1rem; +} + +.banner-left { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; +} + +.banner-logo { + height: 80px; + width: auto; + border-radius: 50%; +} + +nav { + display: flex; + gap: 1rem; + font-weight: 600; + font-size: 1.1rem; +} + +#updated { + font-size: 0.75rem; + color: color-mix(in oklab, var(--muted) 30%, var(--fg) 70%); + white-space: nowrap; + text-align: center; +} + +#close-all { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + + background: transparent; + border: 1px solid var(--border); + border-radius: 4px; + + padding: 0.25rem 0.5rem; /* smaller so it doesn't dominate */ + font-size: 0.8rem; + color: color-mix(in oklab, var(--muted) 40%, var(--fg) 60%); + cursor: pointer; +} + +#close-all:hover { + color: var(--fg); + border-color: var(--fg); +} + +.banner-header > a { + display: flex; + align-items: center; +} + + +@media (max-width: 768px) { + .banner-header { + flex-direction: column; + gap: 0.75rem; + text-align: center; + align-items: center; + } + + .banner-left { + margin: 0 auto; + } + + .banner-logo { + margin: 0; + } + + #close-all { + position: static; + transform: none; + } +} + + +/* ========================================================= + CONTENT WRAPPER + ========================================================= */ + +#content.content { + max-width: var(--content); + margin-left: auto !important; + margin-right: auto !important; + padding-left: var(--body-pad); + padding-right: var(--body-pad); + box-sizing: content-box; + position: relative; +} + +/* ========================================================= + TITLE SECTION + ========================================================= */ + +.title-section { + border: 1px solid var(--border); + border-radius: 6px; + padding: 1.5rem; + padding-right: 8rem; /* Extra padding on right for controls */ + margin-bottom: 2rem; + background-color: color-mix(in oklab, var(--bg) 96%, var(--fg) 4%); + position: relative; /* For absolute positioning of controls */ +} + +.title-section .title { + margin: 0 0 1rem 0; + padding-bottom: 1rem; + border-bottom: 1px dotted var(--border); +} + +.title-metadata { + display: flex; + flex-wrap: wrap; + gap: 1.5rem; + font-size: 0.9rem; +} + +.metadata-item { + display: flex; + align-items: baseline; + gap: 0.5rem; +} + +.metadata-label { + color: var(--muted); + font-style: italic; + font-weight: 500; +} + +.metadata-value { + color: var(--fg); + font-weight: 400; +} + +#content .figure, +#content img:not(.fullwidth) { + max-width: 100%; + height: auto; +} + +/* ========================================================= + STACKED PANE LAYOUT + ========================================================= */ + +#stack-root { + position: relative; + width: 100vw; + height: calc(100vh - 120px); + overflow-x: auto; + overflow-y: hidden; + flex: 1 1 auto; + scroll-snap-type: x proximity; +} + +.stack-track { + display: flex; + flex-direction: row; + align-items: stretch; + width: max-content; + height: 100%; +} + +.stack-pane { + flex: 0 0 auto; + + width: clamp(420px, 33vw, 860px); + max-width: 100vw; + + height: 100%; + overflow-y: auto; + overflow-x: hidden; + + position: relative; /* needed for ::after positioning */ + background-color: var(--bg); + border-right: 1px dotted var(--border); +} + +.stack-pane::after { + content: ""; + position: absolute; + top: 0; + right: 0; + width: 12px; + height: 100%; + pointer-events: none; + opacity: 0.15; +} + +.stack-pane:last-child { + box-shadow: -4px 0 16px color-mix(in oklab, var(--fg) 6%, transparent); +} + +/* Scrollbar (WebKit) */ +.stack-pane::-webkit-scrollbar { + width: 8px; +} + +.stack-pane::-webkit-scrollbar-thumb { + background-color: color-mix(in oklab, var(--fg) 25%, transparent); + border-radius: 4px; +} + +/* ========================================================= + PANE HEADER + CLOSE BUTTON + ========================================================= */ + +.pane-root { + background-color: var(--bg); +} + +.pane-header { + display: none; /* Hide the old pane-header */ +} + +/* Title section controls */ +.title-controls { + position: absolute; + top: 1.5rem; + right: 1.5rem; + display: flex; + gap: 0.5rem; + z-index: 10; +} + +.title-controls button { + background: none; + border: 1px solid var(--border); + border-radius: 4px; + font-size: 0.9rem; + line-height: 1; + cursor: pointer; + color: var(--muted); + padding: 0.3rem 0.6rem; + transition: color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease; +} + +.title-controls button:hover { + color: var(--fg); + border-color: var(--fg); + background-color: color-mix(in oklab, var(--bg) 90%, var(--fg) 10%); +} + +.pane-close { + font-size: 1.2rem; +} + +.pane-fullscreen, +.pane-edit { + font-weight: 500; +} + +/* ========================================================= + FOOTER + ========================================================= */ + +footer { + color: var(--fg); + padding: 1rem; + border-radius: 6px; + text-align: center; + font-size: 0.9rem; + font-style: italic; + + flex-shrink: 0; + margin-top: 0; + + border-top: 1px dotted var(--border); + background: var(--bg); + + /* If you want it sticky later, use: + position: sticky; + bottom: 0; + */ + bottom: 0; + z-index: 10; +} + +/* ========================================================= + LISTS + ========================================================= */ + +ul, +ol { + margin: 1rem 0 1.5rem 1.5rem; + padding: 0; + line-height: 1.5; +} + +ul { + list-style: none; +} + +ul li { + position: relative; + padding-left: 1.2em; +} + +ul li::before { + content: "•"; + position: absolute; + left: 0; + top: 0; + color: var(--heading); + font-weight: bold; +} + +ol { + counter-reset: list-counter; + list-style: none; +} + +ol li { + counter-increment: list-counter; + position: relative; + padding-left: 1.8em; +} + +ol li::before { + content: counter(list-counter) "."; + position: absolute; + left: 0; + top: 0; + color: var(--heading); + font-weight: bold; +} + +li { + margin-bottom: 8px; + display: flow-root; +} + +li::after { + content: none; +} + +li ul, +li ol { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +li ul li::before { + content: "–"; + font-weight: normal; + color: var(--note-color); +} + +li ol li::before { + font-weight: normal; + color: var(--note-color); +} + +/* ========================================================= + EPIGRAPH + ========================================================= */ + +.epigraph { + margin: 2rem auto; + max-width: 80%; + font-style: italic; +} + +.epigraph blockquote { + margin: 0; + padding: 1rem 1.5rem; + border-left: 4px dotted var(--heading); + background-color: color-mix(in oklab, var(--bg) 94%, var(--fg) 6%); + color: var(--fg); + line-height: 1.6; +} + +.epigraph blockquote footer { + margin-top: 0.75rem; + font-style: normal; + font-size: 0.9em; + color: var(--muted); + text-align: right; +} + +.epigraph blockquote cite { + font-style: italic; + font-weight: 500; + color: var(--link); +} + +.epigraph blockquote::before, +.epigraph blockquote::after { + content: none; +} + +/* ========================================================= + UTILITIES / MISC + ========================================================= */ + +.hidden { + display: none !important; +} + +/* bigger-picture.js controls */ +.bp-x { + right: 72px; +} +.bp-next, +.bp-prev { + right: 8px; +} +.bp-prev { + left: 8px; +} +.bp-wrap { + transition: opacity 0.18s ease; +} +.bp-wrap.bp-fadeout { + opacity: 0; +} +.bp-controls { + padding-top: env(safe-area-inset-top, 0); + padding-right: calc(env(safe-area-inset-right, 0) + 8px); +} + +/* code copy button */ +.copy-btn { + position: absolute; + top: 0.4em; + right: 0.4em; + background-color: var(--code-bg); + color: var(--heading); + border: 1px dotted var(--heading); + border-radius: 4px; + padding: 0.2em 0.6em; + font-size: 0.8rem; + cursor: pointer; + z-index: 10; + transition: background-color 0.3s; +} + +/* ========================================================= + BACKLINKS + ========================================================= */ + +.backlinks-section { + margin-top: 4rem; + padding-top: 1.5rem; + border-top: 1px dotted var(--border); + opacity: 0.95; + color: var(--muted); +} + +.backlinks-list { + margin-top: 0.75rem; + padding-left: 0; +} + +.backlinks-list li { + margin-bottom: 0.4rem; + font-size: 0.9rem; + list-style: none; +} + +.backlinks-list li::before { + content: "↩ "; + opacity: 0.5; + margin-right: 0.2rem; +} + +.backlinks-list li a { + text-decoration: none; + font-weight: 500; + color: var(--link); + border-bottom: 1px dotted color-mix(in oklab, var(--fg) 20%, transparent); + padding-bottom: 0.05em; + transition: color 0.15s ease, border-color 0.15s ease; +} + +.backlinks-list li a:hover, +.backlinks-list li a:focus { + color: var(--fg); + border-bottom-color: currentColor; +} + +/* ========================================================= + SEARCH + ========================================================= */ + +.banner-search { + position: relative; + max-width: 28rem; +} + +#search-box { + width: 100%; + padding: 0.55rem 0.75rem; + font-size: 0.95rem; + font-family: inherit; + + background-color: var(--bg-alt); + color: var(--fg); + + border: 1px solid var(--border); + border-radius: 4px; + + transition: border-color 0.15s ease, box-shadow 0.15s ease, + background-color 0.15s ease; +} + +#search-box:focus { + outline: none; + background-color: var(--bg); + border-color: var(--link); + box-shadow: 0 0 0 2px color-mix(in oklab, var(--link) 20%, transparent); +} + +#search-box::placeholder { + color: color-mix(in oklab, var(--muted) 30%, var(--fg) 70%); + font-style: italic; +} + +#search-results { + position: absolute; + top: calc(100% + 0.3rem); + left: 0; + right: 0; + + background-color: var(--bg); + border: 1px dotted var(--border); + border-radius: 4px; + + box-shadow: 0 8px 24px color-mix(in oklab, var(--fg) 8%, transparent); + + max-height: 18rem; + overflow-y: auto; + + z-index: 1000; +} + +#search-results > * { + padding: 0.45rem 0.65rem; + font-size: 0.9rem; + line-height: 1.3; + + cursor: pointer; + border-bottom: 1px dotted color-mix(in oklab, var(--fg) 5%, transparent); +} + +#search-results > *:last-child { + border-bottom: none; +} + +#search-results > *:hover, +#search-results > *.active { + background-color: color-mix(in oklab, var(--link) 12%, transparent); +} + +/* ========================================================= + RESPONSIVE + ========================================================= */ + +@media (max-width: 768px) { + #stack-root { + overflow-x: hidden; + overflow-y: auto; + } + + .stack-track { + flex-direction: column; + width: 100%; + } + + .stack-pane { + width: 100%; + height: auto; + border-right: none; + border-bottom: 1px dotted var(--border); + } +} +/* ========================================================= + FULLSCREEN PANE MODE + ========================================================= */ + +body.pane-fullscreen #stack-root { + overflow: hidden; +} + +body.pane-fullscreen .stack-track { + width: 100%; +} + +body.pane-fullscreen .stack-pane { + width: 100% !important; + max-width: none; + border-right: none; +} + +body.pane-fullscreen .stack-pane::after { + display: none; +} + +/* Only the active fullscreen pane remains */ +body.pane-fullscreen .stack-pane:not(.is-fullscreen) { + display: none; +} + +/* Optional: make content breathe more in fullscreen */ +body.pane-fullscreen #content.content { + max-width: 900px; +} diff --git a/assets/styles/style.css~ b/assets/styles/style.css~ new file mode 100755 index 0000000..69b16d7 --- /dev/null +++ b/assets/styles/style.css~ @@ -0,0 +1,647 @@ +/* ========================================================= + TOKENS / CUSTOM PROPERTIES + ========================================================= */ + +:root { + --gutter: 2rem; + --margin: 420px; + --body-pad: 1rem; + + --content-min: 60ch; + --content-max: 880px; + --content: clamp( + var(--content-min), + calc(100vi - (2 * var(--body-pad)) - (2 * (var(--margin) + var(--gutter)))), + var(--content-max) + ); + + --bleed: 48px; + --fullwidth-cap: 860px; + + --bg: #fff; + --page-bg: #fafafc; + --fg: #000; + + --heading: #004c99; + --link: #0a84ff; + --link-2: var(--link); + + --code-bg: #f0f0f0; + + --border: #d7d7d7; + --active-toc: #cacaca; + + --muted: #666; + --note-color: #555; + --note-bg: transparent; + + --chip-bg: #f0f0f0; + --chip-fg: #444; + + /* Compatibility aliases (you reference these later) */ + --border-color: var(--border); + --text-color: var(--fg); + --muted-text: var(--muted); + --link-color: var(--link); + --link-hover-color: var(--fg); + --bg-alt: #fafafa; +} + +/* ========================================================= + BASE / TYPOGRAPHY + ========================================================= */ + +html, +body { + margin: 0; + background-color: var(--page-bg); + color: var(--fg); + transition: background-color 0.3s, color 0.3s; + font-family: Inter, sans-serif; +} + +/* Keep your layout intent (column app shell) */ +body { + display: flex; + flex-direction: column; +} + +h1, +h2, +h3 { + color: var(--heading); +} + +a { + color: var(--link-2); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* ========================================================= + PREAMBLE / HEADER + ========================================================= */ + +#preamble { + top: 0; + z-index: 20; + background: var(--bg); + border-bottom: 1px solid var(--border); +} + +#preamble .banner-header, +#preamble #updated { + max-width: 100%; +} + +.banner-header { + position: relative; /* anchor for Close All */ + display: flex; + justify-content: center; /* center main group */ + align-items: center; + gap: 1rem; + + padding: 0.5rem 1rem; +} + +.banner-logo { + height: 80px; + width: auto; + margin-right: 1.5rem; + border-radius: 50%; +} + +nav { + display: flex; + gap: 1rem; + font-weight: 600; + font-size: 1.1rem; +} + +#updated { + font-size: 0.75rem; + color: var(--muted); + opacity: 0.7; + white-space: nowrap; +} + +#close-all { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + + background: transparent; + border: 1px solid var(--border); + border-radius: 4px; + + padding: 0.25rem 0.5rem; /* smaller so it doesn’t dominate */ + font-size: 0.8rem; + color: var(--muted); + cursor: pointer; +} + +#close-all:hover { + color: var(--fg); + border-color: var(--fg); +} + +.banner-header > a { + display: flex; + align-items: center; +} + + +@media (max-width: 768px) { + .banner-header { + grid-template-columns: 1fr; + gap: 0.75rem; + text-align: center; + } + + .banner-logo { + margin: 0 auto; + } + + #close-all { + justify-self: center; + } +} + + +/* ========================================================= + CONTENT WRAPPER + ========================================================= */ + +#content.content { + max-width: var(--content); + margin-left: auto !important; + margin-right: auto !important; + padding-left: var(--body-pad); + padding-right: var(--body-pad); + box-sizing: content-box; + position: relative; +} + +#content .figure, +#content img:not(.fullwidth) { + max-width: 100%; + height: auto; +} + +/* ========================================================= + STACKED PANE LAYOUT + ========================================================= */ + +#stack-root { + position: relative; + width: 100vw; + height: calc(100vh - 120px); + overflow-x: auto; + overflow-y: hidden; + flex: 1 1 auto; + scroll-snap-type: x proximity; +} + +.stack-track { + display: flex; + flex-direction: row; + align-items: stretch; + width: max-content; + height: 100%; +} + +.stack-pane { + flex: 0 0 auto; + + width: clamp(420px, 33vw, 860px); + max-width: 100vw; + + height: 100%; + overflow-y: auto; + overflow-x: hidden; + + position: relative; /* needed for ::after positioning */ + background-color: var(--bg); + border-right: 1px solid var(--border); +} + +.stack-pane::after { + content: ""; + position: absolute; + top: 0; + right: 0; + width: 12px; + height: 100%; + pointer-events: none; + opacity: 0.15; +} + +.stack-pane:last-child { + box-shadow: -4px 0 16px rgba(0, 0, 0, 0.06); +} + +/* Scrollbar (WebKit) */ +.stack-pane::-webkit-scrollbar { + width: 8px; +} + +.stack-pane::-webkit-scrollbar-thumb { + background-color: color-mix(in oklab, var(--fg) 25%, transparent); + border-radius: 4px; +} + +/* ========================================================= + PANE HEADER + CLOSE BUTTON + ========================================================= */ + +.pane-root { + background-color: var(--bg); +} + +.pane-header { + position: sticky; + top: 0; + z-index: 5; + + display: flex; + justify-content: flex-end; + + background: inherit; + padding: 0.25rem 0.5rem; + border-bottom: 1px solid var(--border); +} + +.pane-close { + background: none; + border: none; + font-size: 1.4rem; + line-height: 1; + cursor: pointer; + + color: var(--muted); + padding: 0.1rem 0.4rem; +} + +.pane-close:hover { + color: var(--fg); +} + +/* ========================================================= + FOOTER + ========================================================= */ + +footer { + color: var(--fg); + padding: 1rem; + border-radius: 6px; + text-align: center; + font-size: 0.9rem; + font-style: italic; + + flex-shrink: 0; + margin-top: 0; + + border-top: 1px solid var(--border); + background: var(--bg); + + /* If you want it sticky later, use: + position: sticky; + bottom: 0; + */ + bottom: 0; + z-index: 10; +} + +/* ========================================================= + LISTS + ========================================================= */ + +ul, +ol { + margin: 1rem 0 1.5rem 1.5rem; + padding: 0; + line-height: 1.5; +} + +ul { + list-style: none; +} + +ul li { + position: relative; + padding-left: 1.2em; +} + +ul li::before { + content: "•"; + position: absolute; + left: 0; + top: 0; + color: var(--heading); + font-weight: bold; +} + +ol { + counter-reset: list-counter; + list-style: none; +} + +ol li { + counter-increment: list-counter; + position: relative; + padding-left: 1.8em; +} + +ol li::before { + content: counter(list-counter) "."; + position: absolute; + left: 0; + top: 0; + color: var(--heading); + font-weight: bold; +} + +li { + margin-bottom: 8px; + display: flow-root; +} + +li::after { + content: none; +} + +li ul, +li ol { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +li ul li::before { + content: "–"; + font-weight: normal; + color: var(--note-color); +} + +li ol li::before { + font-weight: normal; + color: var(--note-color); +} + +/* ========================================================= + EPIGRAPH + ========================================================= */ + +.epigraph { + margin: 2rem auto; + max-width: 80%; + font-style: italic; +} + +.epigraph blockquote { + margin: 0; + padding: 1rem 1.5rem; + border-left: 4px solid var(--heading); + background-color: color-mix(in oklab, var(--bg) 94%, var(--fg) 6%); + color: var(--fg); + line-height: 1.6; +} + +.epigraph blockquote footer { + margin-top: 0.75rem; + font-style: normal; + font-size: 0.9em; + color: var(--muted); + text-align: right; +} + +.epigraph blockquote cite { + font-style: italic; + font-weight: 500; + color: var(--link); +} + +.epigraph blockquote::before, +.epigraph blockquote::after { + content: none; +} + +/* ========================================================= + UTILITIES / MISC + ========================================================= */ + +.hidden { + display: none !important; +} + +/* bigger-picture.js controls */ +.bp-x { + right: 72px; +} +.bp-next, +.bp-prev { + right: 8px; +} +.bp-prev { + left: 8px; +} +.bp-wrap { + transition: opacity 0.18s ease; +} +.bp-wrap.bp-fadeout { + opacity: 0; +} +.bp-controls { + padding-top: env(safe-area-inset-top, 0); + padding-right: calc(env(safe-area-inset-right, 0) + 8px); +} + +/* code copy button */ +.copy-btn { + position: absolute; + top: 0.4em; + right: 0.4em; + background-color: var(--code-bg); + color: var(--heading); + border: 1px solid var(--heading); + border-radius: 4px; + padding: 0.2em 0.6em; + font-size: 0.8rem; + cursor: pointer; + z-index: 10; + transition: background-color 0.3s; +} + +/* ========================================================= + BACKLINKS + ========================================================= */ + +.backlinks-section { + margin-top: 4rem; + padding-top: 1.5rem; + border-top: 1px solid var(--border); + opacity: 0.95; + color: var(--muted); +} + +.backlinks-list { + margin-top: 0.75rem; + padding-left: 0; +} + +.backlinks-list li { + margin-bottom: 0.4rem; + font-size: 0.9rem; + list-style: none; +} + +.backlinks-list li::before { + content: "↩ "; + opacity: 0.5; + margin-right: 0.2rem; +} + +.backlinks-list li a { + text-decoration: none; + font-weight: 500; + color: var(--link); + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding-bottom: 0.05em; + transition: color 0.15s ease, border-color 0.15s ease; +} + +.backlinks-list li a:hover, +.backlinks-list li a:focus { + color: var(--fg); + border-bottom-color: currentColor; +} + +/* ========================================================= + SEARCH + ========================================================= */ + +.banner-search { + position: relative; + max-width: 28rem; +} + +#search-box { + width: 100%; + padding: 0.55rem 0.75rem; + font-size: 0.95rem; + font-family: inherit; + + background-color: var(--bg-alt); + color: var(--fg); + + border: 1px solid var(--border); + border-radius: 4px; + + transition: border-color 0.15s ease, box-shadow 0.15s ease, + background-color 0.15s ease; +} + +#search-box:focus { + outline: none; + background-color: #fff; + border-color: var(--link); + box-shadow: 0 0 0 2px rgba(42, 93, 176, 0.15); +} + +#search-box::placeholder { + color: #888; + font-style: italic; +} + +#search-results { + position: absolute; + top: calc(100% + 0.3rem); + left: 0; + right: 0; + + background-color: #fff; + border: 1px solid var(--border); + border-radius: 4px; + + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); + + max-height: 18rem; + overflow-y: auto; + + z-index: 1000; +} + +#search-results > * { + padding: 0.45rem 0.65rem; + font-size: 0.9rem; + line-height: 1.3; + + cursor: pointer; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +#search-results > *:last-child { + border-bottom: none; +} + +#search-results > *:hover, +#search-results > *.active { + background-color: rgba(42, 93, 176, 0.08); +} + +/* ========================================================= + RESPONSIVE + ========================================================= */ + +@media (max-width: 768px) { + #stack-root { + overflow-x: hidden; + overflow-y: auto; + } + + .stack-track { + flex-direction: column; + width: 100%; + } + + .stack-pane { + width: 100%; + height: auto; + border-right: none; + border-bottom: 1px solid var(--border); + } +} +/* ========================================================= + FULLSCREEN PANE MODE + ========================================================= */ + +body.pane-fullscreen #stack-root { + overflow: hidden; +} + +body.pane-fullscreen .stack-track { + width: 100%; +} + +body.pane-fullscreen .stack-pane { + width: 100% !important; + max-width: none; + border-right: none; +} + +body.pane-fullscreen .stack-pane::after { + display: none; +} + +/* Only the active fullscreen pane remains */ +body.pane-fullscreen .stack-pane:not(.is-fullscreen) { + display: none; +} + +/* Optional: make content breathe more in fullscreen */ +body.pane-fullscreen #content.content { + max-width: 900px; +} diff --git a/assets/swappy-20250805-152411.png b/assets/swappy-20250805-152411.png old mode 100644 new mode 100755 diff --git a/build.el b/build.el new file mode 100755 index 0000000..c6d7397 --- /dev/null +++ b/build.el @@ -0,0 +1,375 @@ +;; ----------------------------- +;; Package bootstrap (BATCH SAFE) +;; ----------------------------- +(require 'package) + +(setq package-user-dir (expand-file-name "./.packages")) +(setq package-archives + '(("melpa" . "https://melpa.org/packages/") + ("gnu" . "https://elpa.gnu.org/packages/"))) + +(package-initialize) + +(unless package-archive-contents + (package-refresh-contents)) + +(unless (package-installed-p 'org-roam) + (package-install 'org-roam)) + +(require 'ox-publish) +(require 'org) +(require 'ox-html) +(require 'json) +(require 'org-roam) +(require 'ob-latex) +(require 'seq) +(require 'cl-lib) + + +(setq org-id-locations-file "~/.emacs.d/.org-id-locations") + +(defun z/org-html-wrap-content-for-stack (orig-fun contents info) + "Wrap Org HTML #content in stack container, leaving postamble outside." + (let* ((html (funcall orig-fun contents info)) + (page (file-name-base (plist-get info :output-file))) + (input-file (plist-get info :input-file)) + + ;; Extract planted date from filename (format: YYYYMMDDHHMMSS-title) + (planted-date + (if (string-match "^\\([0-9]\\{14\\}\\)" page) + (let ((date-str (match-string 1 page))) + (condition-case nil + (format-time-string "%Y-%m-%d" + (encode-time + (string-to-number (substring date-str 12 14)) ; second + (string-to-number (substring date-str 10 12)) ; minute + (string-to-number (substring date-str 8 10)) ; hour + (string-to-number (substring date-str 6 8)) ; day + (string-to-number (substring date-str 4 6)) ; month + (string-to-number (substring date-str 0 4)))) ; year + (error "Unknown"))) + ;; Fallback: try to get creation date from input file + (let ((file-path (if input-file + (expand-file-name input-file (plist-get info :base-directory)) + nil))) + (if (and file-path (file-exists-p file-path)) + (format-time-string "%Y-%m-%d" (nth 4 (file-attributes file-path))) + "Unknown")))) + + ;; Get last modified date (last tended to) + (last-tended + (let ((file-path (if input-file + (expand-file-name input-file (plist-get info :base-directory)) + nil))) + (if (and file-path (file-exists-p file-path)) + (format-time-string "%Y-%m-%d" (nth 5 (file-attributes file-path))) + "Unknown"))) + + (stack-close + "")) + + (setq html + (replace-regexp-in-string + "
" + (format + "
+
+
+
" + page) + html + nil t)) + + ;; Wrap title with metadata section - use lambda to properly capture title + ;; Handle titles with nested HTML tags by matching everything between opening and closing h1 tags + ;; Use .* to match any characters (greedy) - will match up to the last which should be our closing tag + (setq html + (replace-regexp-in-string + "

\\(.*\\)

" + (lambda (match) + (let ((title-text (match-string 1 match))) + (format + "
+
+ + + +
+

%s

+
+ + +
+
" + title-text planted-date last-tended))) + html + nil t)) + + (setq html + (replace-regexp-in-string + "
" + (concat stack-close "\n
") + html + nil t)) + + html)) + +(advice-add 'org-html-template :around #'z/org-html-wrap-content-for-stack) + + +(add-to-list 'load-path default-directory) + +(defvar z-shared-head + " + + + + + + + + + +" + ) + +(defvar z-preamble + " +
+
+ \"Site +
Updated: %C
+
+ +
+ +
+
+ + +
+" + ) + +(defvar z-postamble + "
+
+
+Copyright © 2022-2025 Zaine Qayyum. All rights reserved unless otherwise noted.
+
+Created with %c on Arch GNU/Linux +
+
") + +(defvar z/build-full-rebuild t + "If non-nil, generate expensive artifacts like search-index.json.") + +(defun z/generate-all-files-page () + "Generate all-files.org from search-index.json." + (let* ((json-file "~/master-folder/org_files/org_roam/output/search-index.json") + (out-file "~/master-folder/org_files/org_roam/all-files.org") + (data (append (json-read-file json-file) nil))) + + (message "🔎 Loaded %d entries from search-index.json" (length data)) + + (with-temp-file out-file + (insert "#+title: All Files\n") + (insert "#+options: toc:nil\n\n") + (insert "A complete alphabetical index of all published pages.\n\n") + + (setq data + (sort data + (lambda (a b) + (string-lessp + (downcase (cdr (assoc 'title a))) + (downcase (cdr (assoc 'title b))))))) + + (let ((current-letter nil)) + (dolist (entry data) + (let* ((title (cdr (assoc 'title entry))) + (raw-url (cdr (assoc 'url entry))) + (id (cdr (assoc 'id entry))) + (letter (upcase (substring title 0 1)))) + + (unless (equal letter current-letter) + (setq current-letter letter) + (insert (format "* %s\n" letter))) + + (insert (format "- [[id:%s][%s]]\n" id title)))))))) + + +;; Babel language support +(org-babel-do-load-languages + 'org-babel-load-languages + '((latex . t) + (org . t))) + +(setq org-confirm-babel-evaluate nil ;; Disable confirmation for code block evaluation + org-export-with-smart-quotes t ;; turns " into curly quotes + org-html-self-link-headlines t ;; headlines link to self + org-html-validation-link nil ;; dont validate html (in order to check it is up to web standards) + org-html-inline-images t ;; self-expl + org-export-with-sub-superscripts t ;; render h_x as large h with subscript x + ) +(load-file (expand-file-name "macros.el" default-directory)) + +;; Configure LaTeX image generation +(setq org-latex-create-formula-image-program 'imagemagick) + + + + +(defun my/get-org-roam-backlinks (filename) + "Return backlinks for the given org-roam file. FILENAME should be the full path to the org-roam file." + (save-excursion + (with-current-buffer (find-file-noselect filename) + (goto-char (point-min)) + (if (and (featurep 'org-roam) (org-roam-node-at-point)) + (let* ((node (org-roam-node-at-point)) + (backlinks (org-roam-backlinks-get node))) + (mapcar (lambda (backlink) + (let ((source-node (org-roam-backlink-source-node backlink))) + (list + :file (org-roam-node-file source-node) + :title (org-roam-node-title source-node) + :content (with-current-buffer + (find-file-noselect (org-roam-node-file source-node)) + (goto-char (org-roam-backlink-point backlink)) + (thing-at-point 'sentence t)) + :link (format "[[id:%s][%s]]" + (org-roam-node-id source-node) + (org-roam-node-title source-node))))) + backlinks) + ) + nil)))) + + +(defun my/org-export-insert-backlinks (_backend) + "Insert Org-roam backlinks before export, with HTML attributes." + (when (and (featurep 'org-roam) + (org-roam-node-at-point)) + (let ((backlinks (my/get-org-roam-backlinks (buffer-file-name)))) + (when backlinks + (goto-char (point-max)) + (insert "\n#+ATTR_HTML: :class backlinks-section :id backlinks\n Backlinks\n") + (insert "#+ATTR_HTML: :class backlinks-list\n") + (dolist (bl backlinks) + (insert (format "- %s\n" + (plist-get bl :link)))))))) + + +(add-hook 'org-export-before-processing-hook + #'my/org-export-insert-backlinks) + + +(setq org-id-locations-file "~/.emacs.d/.org-id-locations") +(setq org-roam-directory "~/master-folder/org_files/org_roam/") +(org-id-update-id-locations) + +(setq org-html-link-home "") +(setq org-html-link-up "") + +(defun z/generate-search-index (&rest _) + "Generate search-index.json with title, url, and id." + (when z/build-full-rebuild + (message "Generating search-index.json...") + (let* ((org-dir "~/master-folder/org_files/org_roam/") + (out-file "~/master-folder/org_files/org_roam/output/search-index.json") + (files + (seq-filter + (lambda (f) + (not (string-match-p "/\\.#[^/]+\\.org$" f))) + (directory-files-recursively org-dir "\\.org$"))) + (index '())) + (dolist (file files) + (with-current-buffer (find-file-noselect file) + (let ((id (org-id-get nil))) + (when id + (push `((title . ,(or (org-get-title) "Untitled")) + (url . ,(concat "/" (file-name-base file) ".html")) + (id . ,id)) + index))))) + ;; De-duplicate by ID + (setq index + (cl-remove-duplicates + index + :key (lambda (e) (cdr (assoc 'id e))) + :test #'string=)) + (with-temp-file out-file + (insert (json-encode index))) + (message "search-index.json generated (%d entries)." (length index))))) + + +(add-hook 'org-publish-after-publishing-hook + #'z/generate-search-index) + + + + +(setq org-publish-project-alist + `( + ("org-roam" + :base-directory "~/master-folder/org_files/org_roam/" + :base-extension "org" + :publishing-directory "~/master-folder/org_files/org_roam/output/" + :recursive t + :publishing-function org-html-publish-to-html + + :with-author nil + :with-creator nil + :with-date t + :with-toc nil + :section-numbers nil + + :html-preamble ,z-preamble + :html-postamble ,z-postamble + :html-head ,z-shared-head) + + ("org-static" + :base-directory "~/master-folder/org_files/org_roam/assets/" + :base-extension "css\\|js\\|png\\|jpg\\|gif" + :publishing-directory "~/master-folder/org_files/org_roam/output/assets/" + :recursive t + :publishing-function org-publish-attachment))) + +;(delete-directory "~/master-folder/org_files/org_roam/output/" t) +(message "Directory deleted") + + +(defun z/build-full () + "Full rebuild: Org, assets, and search index." + (interactive) + (setq z/build-full-rebuild t) + (org-id-update-id-locations) + (z/generate-all-files-page) + (org-publish "org-roam" t) + (org-publish "org-static" t) + (message "✅ Full rebuild complete")) + +(defun z/build-fast () + "Fast rebuild: Org + assets only (no JSON)." + (interactive) + (setq z/build-full-rebuild nil) + (z/generate-all-files-page) + (org-publish "org-roam" t) + (org-publish "org-static" t) + (message "⚡ Fast rebuild complete (no search index)")) + + + +(org-id-update-id-locations) +(cond + ((member "--fast" command-line-args-left) + (z/build-fast)) + (t + (z/build-full))) diff --git a/build.el~ b/build.el~ new file mode 100755 index 0000000..57f822d --- /dev/null +++ b/build.el~ @@ -0,0 +1,311 @@ +;; ----------------------------- +;; Package bootstrap (BATCH SAFE) +;; ----------------------------- +(require 'package) + +(setq package-user-dir (expand-file-name "./.packages")) +(setq package-archives + '(("melpa" . "https://melpa.org/packages/") + ("gnu" . "https://elpa.gnu.org/packages/"))) + +(package-initialize) + +(unless package-archive-contents + (package-refresh-contents)) + +(unless (package-installed-p 'org-roam) + (package-install 'org-roam)) + +(require 'ox-publish) +(require 'org) +(require 'ox-html) +(require 'json) +(require 'org-roam) +(require 'ob-latex) +(require 'seq) +(require 'cl-lib) + + +(setq org-id-locations-file "~/.emacs.d/.org-id-locations") + +(defun z/org-html-wrap-content-for-stack (orig-fun contents info) + "Wrap Org HTML #content in stack container, leaving postamble outside." + (let* ((html (funcall orig-fun contents info)) + (page (file-name-base (plist-get info :output-file))) + + (stack-close + "
")) + + (setq html + (replace-regexp-in-string + "
" + (format + "
+
+
+
" + page) + html + nil t)) + + (setq html + (replace-regexp-in-string + "
" + (concat stack-close "\n
") + html + nil t)) + + html)) + +(advice-add 'org-html-template :around #'z/org-html-wrap-content-for-stack) + + +(add-to-list 'load-path default-directory) + +(defvar z-shared-head + " + + + + + + + + + +" + ) + +(defvar z-preamble + " +
+ \"Site + +
+ +
+
+ +
Updated: %C
+ + +
+" + ) + +(defvar z-postamble + "
+
+
+Copyright © 2022-2025 Zaine Qayyum. All rights reserved unless otherwise noted.
+
+Created with %c on Arch GNU/Linux +
+
") + +(defvar z/build-full-rebuild t + "If non-nil, generate expensive artifacts like search-index.json.") + +(defun z/generate-all-files-page () + "Generate all-files.org from search-index.json." + (let* ((json-file "~/master-folder/org_files/org_roam/output/search-index.json") + (out-file "~/master-folder/org_files/org_roam/all-files.org") + (data (append (json-read-file json-file) nil))) + + (message "🔎 Loaded %d entries from search-index.json" (length data)) + + (with-temp-file out-file + (insert "#+title: All Files\n") + (insert "#+options: toc:nil\n\n") + (insert "A complete alphabetical index of all published pages.\n\n") + + (setq data + (sort data + (lambda (a b) + (string-lessp + (downcase (cdr (assoc 'title a))) + (downcase (cdr (assoc 'title b))))))) + + (let ((current-letter nil)) + (dolist (entry data) + (let* ((title (cdr (assoc 'title entry))) + (raw-url (cdr (assoc 'url entry))) + (id (cdr (assoc 'id entry))) + (letter (upcase (substring title 0 1)))) + + (unless (equal letter current-letter) + (setq current-letter letter) + (insert (format "* %s\n" letter))) + + (insert (format "- [[id:%s][%s]]\n" id title)))))))) + + +;; Babel language support +(org-babel-do-load-languages + 'org-babel-load-languages + '((latex . t) + (org . t))) + +(setq org-confirm-babel-evaluate nil ;; Disable confirmation for code block evaluation + org-export-with-smart-quotes t ;; turns " into curly quotes + org-html-self-link-headlines t ;; headlines link to self + org-html-validation-link nil ;; dont validate html (in order to check it is up to web standards) + org-html-inline-images t ;; self-expl + org-export-with-sub-superscripts t ;; render h_x as large h with subscript x + ) +(load-file (expand-file-name "macros.el" default-directory)) + +;; Configure LaTeX image generation +(setq org-latex-create-formula-image-program 'imagemagick) + + + + +(defun my/get-org-roam-backlinks (filename) + "Return backlinks for the given org-roam file. FILENAME should be the full path to the org-roam file." + (save-excursion + (with-current-buffer (find-file-noselect filename) + (goto-char (point-min)) + (if (and (featurep 'org-roam) (org-roam-node-at-point)) + (let* ((node (org-roam-node-at-point)) + (backlinks (org-roam-backlinks-get node))) + (mapcar (lambda (backlink) + (let ((source-node (org-roam-backlink-source-node backlink))) + (list + :file (org-roam-node-file source-node) + :title (org-roam-node-title source-node) + :content (with-current-buffer + (find-file-noselect (org-roam-node-file source-node)) + (goto-char (org-roam-backlink-point backlink)) + (thing-at-point 'sentence t)) + :link (format "[[id:%s][%s]]" + (org-roam-node-id source-node) + (org-roam-node-title source-node))))) + backlinks) + ) + nil)))) + + +(defun my/org-export-insert-backlinks (_backend) + "Insert Org-roam backlinks before export, with HTML attributes." + (when (and (featurep 'org-roam) + (org-roam-node-at-point)) + (let ((backlinks (my/get-org-roam-backlinks (buffer-file-name)))) + (when backlinks + (goto-char (point-max)) + (insert "\n#+ATTR_HTML: :class backlinks-section :id backlinks\n Backlinks\n") + (insert "#+ATTR_HTML: :class backlinks-list\n") + (dolist (bl backlinks) + (insert (format "- %s\n" + (plist-get bl :link)))))))) + + +(add-hook 'org-export-before-processing-hook + #'my/org-export-insert-backlinks) + + +(setq org-id-locations-file "~/.emacs.d/.org-id-locations") +(setq org-roam-directory "~/master-folder/org_files/org_roam/") +(org-id-update-id-locations) + +(setq org-html-link-home "") +(setq org-html-link-up "") + +(defun z/generate-search-index (&rest _) + "Generate search-index.json with title, url, and id." + (when z/build-full-rebuild + (message "Generating search-index.json...") + (let* ((org-dir "~/master-folder/org_files/org_roam/") + (out-file "~/master-folder/org_files/org_roam/output/search-index.json") + (files + (seq-filter + (lambda (f) + (not (string-match-p "/\\.#[^/]+\\.org$" f))) + (directory-files-recursively org-dir "\\.org$"))) + (index '())) + (dolist (file files) + (with-current-buffer (find-file-noselect file) + (let ((id (org-id-get nil))) + (when id + (push `((title . ,(or (org-get-title) "Untitled")) + (url . ,(concat "/" (file-name-base file) ".html")) + (id . ,id)) + index))))) + ;; De-duplicate by ID + (setq index + (cl-remove-duplicates + index + :key (lambda (e) (cdr (assoc 'id e))) + :test #'string=)) + (with-temp-file out-file + (insert (json-encode index))) + (message "search-index.json generated (%d entries)." (length index))))) + + +(add-hook 'org-publish-after-publishing-hook + #'z/generate-search-index) + + + + +(setq org-publish-project-alist + `( + ("org-roam" + :base-directory "~/master-folder/org_files/org_roam/" + :base-extension "org" + :publishing-directory "~/master-folder/org_files/org_roam/output/" + :recursive t + :publishing-function org-html-publish-to-html + + :with-author nil + :with-creator nil + :with-date t + :with-toc nil + :section-numbers nil + + :html-preamble ,z-preamble + :html-postamble ,z-postamble + :html-head ,z-shared-head) + + ("org-static" + :base-directory "~/master-folder/org_files/org_roam/assets/" + :base-extension "css\\|js\\|png\\|jpg\\|gif" + :publishing-directory "~/master-folder/org_files/org_roam/output/assets/" + :recursive t + :publishing-function org-publish-attachment))) + +;(delete-directory "~/master-folder/org_files/org_roam/output/" t) +(message "Directory deleted") + + +(defun z/build-full () + "Full rebuild: Org, assets, and search index." + (interactive) + (setq z/build-full-rebuild t) + (org-id-update-id-locations) + (z/generate-all-files-page) + (org-publish "org-roam" t) + (org-publish "org-static" t) + (message "✅ Full rebuild complete")) + +(defun z/build-fast () + "Fast rebuild: Org + assets only (no JSON)." + (interactive) + (setq z/build-full-rebuild nil) + (z/generate-all-files-page) + (org-publish "org-roam" t) + (org-publish "org-static" t) + (message "⚡ Fast rebuild complete (no search index)")) + + + +(org-id-update-id-locations) +(cond + ((member "--fast" command-line-args-left) + (z/build-fast)) + (t + (z/build-full))) diff --git a/index.org b/index.org new file mode 100755 index 0000000..d8bb7bb --- /dev/null +++ b/index.org @@ -0,0 +1,12 @@ +:PROPERTIES: +:ID: DE792A73-FD00-4048-82D8-AB6E84E869F2 +:END: +#+title: Index + +* [[id:b2fb976a-c23c-4275-8a53-da343c223b97][Brain MOC]] + +* [[./all-files.org][All Files]] + +* [[https://roam.zainezq.com][Roam]] + +[[./assets/Screenshot_20251227_153037.png]] diff --git a/index.org~ b/index.org~ new file mode 100755 index 0000000..e86a420 --- /dev/null +++ b/index.org~ @@ -0,0 +1,10 @@ +:PROPERTIES: +:ID: DE792A73-FD00-4048-82D8-AB6E84E869F2 +:END: +#+title: Index + +* [[id:b2fb976a-c23c-4275-8a53-da343c223b97][Brain MOC]] + +* [[https://roam.zainezq.com][Roam]] + +[[./assets/Screenshot_20251227_153037.png]] diff --git a/ltximg/org-ltximg_01296884686849f0dd6a6f5f6e642ce4594a1438.png b/ltximg/org-ltximg_01296884686849f0dd6a6f5f6e642ce4594a1438.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_066a4488b21e9c9fcc08a16156947f5bab6d2771.png b/ltximg/org-ltximg_066a4488b21e9c9fcc08a16156947f5bab6d2771.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_0c35aa584277b44dec02ac13aacd1cd7acc851be.png b/ltximg/org-ltximg_0c35aa584277b44dec02ac13aacd1cd7acc851be.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_11860079d8dfebcc942c3e6b65b495a445d9f336.png b/ltximg/org-ltximg_11860079d8dfebcc942c3e6b65b495a445d9f336.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_1cbbff043d0cc4a14caacd74ec795c0a1ec11f2e.png b/ltximg/org-ltximg_1cbbff043d0cc4a14caacd74ec795c0a1ec11f2e.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_1d6de057eb18f33d9ce2df46505051a77488698f.png b/ltximg/org-ltximg_1d6de057eb18f33d9ce2df46505051a77488698f.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_205d81a43ad57fe5da4c786cb565a1a6ab8bb626.png b/ltximg/org-ltximg_205d81a43ad57fe5da4c786cb565a1a6ab8bb626.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_265a7c14da0eed5a277bb96aa1c253b307e54b23.png b/ltximg/org-ltximg_265a7c14da0eed5a277bb96aa1c253b307e54b23.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_26f0956210f41ec16057521ea641aa300fc99f1e.png b/ltximg/org-ltximg_26f0956210f41ec16057521ea641aa300fc99f1e.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_2d72905fd56b9a16fa7b45eb4b2b2e373d1e67d0.png b/ltximg/org-ltximg_2d72905fd56b9a16fa7b45eb4b2b2e373d1e67d0.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_32866fa9c245766194eeeb359244fd901090e1e2.png b/ltximg/org-ltximg_32866fa9c245766194eeeb359244fd901090e1e2.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_3a1f8c91afecdbe530c1d7260ada3f1c5d3b744f.png b/ltximg/org-ltximg_3a1f8c91afecdbe530c1d7260ada3f1c5d3b744f.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_3e3ac398ecab748a277726f7718afae46fe8b82f.png b/ltximg/org-ltximg_3e3ac398ecab748a277726f7718afae46fe8b82f.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_40fa37ebf75968e3cae8fa02423eeef19f520817.png b/ltximg/org-ltximg_40fa37ebf75968e3cae8fa02423eeef19f520817.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_44f5f8555490fc64077127e29eef0dff2ac4422d.png b/ltximg/org-ltximg_44f5f8555490fc64077127e29eef0dff2ac4422d.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_4741651405214cbe515cff3fa73813164cedaf2d.png b/ltximg/org-ltximg_4741651405214cbe515cff3fa73813164cedaf2d.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_55130395ce5e5040f6604cb7c3cc1f55c8fc3cfa.png b/ltximg/org-ltximg_55130395ce5e5040f6604cb7c3cc1f55c8fc3cfa.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_6026e5c1fa1d520353950d71af186956514e8701.png b/ltximg/org-ltximg_6026e5c1fa1d520353950d71af186956514e8701.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_635f0485ae2d07be9744e3e3723ecaf34f800012.png b/ltximg/org-ltximg_635f0485ae2d07be9744e3e3723ecaf34f800012.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_63dbc01f6593fc8d8a35c50f22f79f29a1dcf898.png b/ltximg/org-ltximg_63dbc01f6593fc8d8a35c50f22f79f29a1dcf898.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_6c899afd78a059b0ae4bef408a695041cedb5ddd.png b/ltximg/org-ltximg_6c899afd78a059b0ae4bef408a695041cedb5ddd.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_7425a163ba6edf4c7408c7f718f301a7150e4b11.png b/ltximg/org-ltximg_7425a163ba6edf4c7408c7f718f301a7150e4b11.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_777dd76637f98f808bbe2f69b2afd12e4c536ffb.png b/ltximg/org-ltximg_777dd76637f98f808bbe2f69b2afd12e4c536ffb.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_7ca4db7f61fd148ce02f3fd143c05b54dbf2ca7f.png b/ltximg/org-ltximg_7ca4db7f61fd148ce02f3fd143c05b54dbf2ca7f.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_81a6befc0e7d8c06857316dc32fb3d6545f3e479.png b/ltximg/org-ltximg_81a6befc0e7d8c06857316dc32fb3d6545f3e479.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_8aec0d26a12708fe99cdd5876863ff43a1c627d7.png b/ltximg/org-ltximg_8aec0d26a12708fe99cdd5876863ff43a1c627d7.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_8c4e482436a1dd4e34355f6ae5193641b99c4e3d.png b/ltximg/org-ltximg_8c4e482436a1dd4e34355f6ae5193641b99c4e3d.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_91ff4f41cef3c8d6b7c75380b409a7fdd5ce36b9.png b/ltximg/org-ltximg_91ff4f41cef3c8d6b7c75380b409a7fdd5ce36b9.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_925319670cdf886edbfb7200e6b4dab22965b101.png b/ltximg/org-ltximg_925319670cdf886edbfb7200e6b4dab22965b101.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_93b88f8eb4efd76fc90d4bd25d1ed1b7dd7a5be0.png b/ltximg/org-ltximg_93b88f8eb4efd76fc90d4bd25d1ed1b7dd7a5be0.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_9f34d39b4a163d0e868354be903873bcc6d09644.png b/ltximg/org-ltximg_9f34d39b4a163d0e868354be903873bcc6d09644.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_a16f0fcce4798bef7b2a672a7a2489381b89c772.png b/ltximg/org-ltximg_a16f0fcce4798bef7b2a672a7a2489381b89c772.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_a38b7f9ba4927f1b464c9524a68d0a691854379f.png b/ltximg/org-ltximg_a38b7f9ba4927f1b464c9524a68d0a691854379f.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_a568c360146b207a04126a214f96cd65cc970c51.png b/ltximg/org-ltximg_a568c360146b207a04126a214f96cd65cc970c51.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_b430ab391bb9b6d4b8ba2c1db82d8eaa789b83b1.png b/ltximg/org-ltximg_b430ab391bb9b6d4b8ba2c1db82d8eaa789b83b1.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_b8690ed0b5aa1efd8594d7c9747276cb01e148b9.png b/ltximg/org-ltximg_b8690ed0b5aa1efd8594d7c9747276cb01e148b9.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_b9a5e90acb8406cda2b0a9e46f45738e7fc64394.png b/ltximg/org-ltximg_b9a5e90acb8406cda2b0a9e46f45738e7fc64394.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_bc3ebf35ab016a6c7144cc6250d8f0e85d777ce6.png b/ltximg/org-ltximg_bc3ebf35ab016a6c7144cc6250d8f0e85d777ce6.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_be20bec73c3091c2b13083536db1bc184965ef8a.png b/ltximg/org-ltximg_be20bec73c3091c2b13083536db1bc184965ef8a.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_bf950c1e472fa38df910785f36c1570a75291377.png b/ltximg/org-ltximg_bf950c1e472fa38df910785f36c1570a75291377.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_c206c0d84a3df817d72c9bfc9d1bed3d99b83308.png b/ltximg/org-ltximg_c206c0d84a3df817d72c9bfc9d1bed3d99b83308.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_c3bb0e35c6ebe236afab1ca47229361e22b4e241.png b/ltximg/org-ltximg_c3bb0e35c6ebe236afab1ca47229361e22b4e241.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_c8110cbc92e7c6401dba8b38185aaa1d97011b52.png b/ltximg/org-ltximg_c8110cbc92e7c6401dba8b38185aaa1d97011b52.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_c91b4d45bde34f58aaec819408c75071c356821b.png b/ltximg/org-ltximg_c91b4d45bde34f58aaec819408c75071c356821b.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_c9200c4e7dce25a1e27e01e1ae86f4105c2fa2dc.png b/ltximg/org-ltximg_c9200c4e7dce25a1e27e01e1ae86f4105c2fa2dc.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_c92b1f9a19d301ad86f57d82beb069e849b679fd.png b/ltximg/org-ltximg_c92b1f9a19d301ad86f57d82beb069e849b679fd.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_cb453e7c12347acad1700f56cd2cb7a7438e0c11.png b/ltximg/org-ltximg_cb453e7c12347acad1700f56cd2cb7a7438e0c11.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_cbbbbd9603cb09800c1ce9bd9e87995d7c609b1d.png b/ltximg/org-ltximg_cbbbbd9603cb09800c1ce9bd9e87995d7c609b1d.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_cbf166f42dcd147a8e21383c5aed428f30ca0144.png b/ltximg/org-ltximg_cbf166f42dcd147a8e21383c5aed428f30ca0144.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_cc02e6245b6185abae501586409d2f30fc5fa61b.png b/ltximg/org-ltximg_cc02e6245b6185abae501586409d2f30fc5fa61b.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_cc9ee8e3dc18ceac67ab9b63fe21ea4ed4c0e563.png b/ltximg/org-ltximg_cc9ee8e3dc18ceac67ab9b63fe21ea4ed4c0e563.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_cfec4e7d4520ebfff12e08231870330d66e166cc.png b/ltximg/org-ltximg_cfec4e7d4520ebfff12e08231870330d66e166cc.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_d856e3330a950cdef271d8c83a94b334a11a8837.png b/ltximg/org-ltximg_d856e3330a950cdef271d8c83a94b334a11a8837.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_df2f698fcba37b4bb5ca9e15873f9f205ca53b99.png b/ltximg/org-ltximg_df2f698fcba37b4bb5ca9e15873f9f205ca53b99.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_e4d27eaf08385a5653d47c5353e882fec619834d.png b/ltximg/org-ltximg_e4d27eaf08385a5653d47c5353e882fec619834d.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_e53730ba461b03f192d1c5d7adf2c8ea141ef862.png b/ltximg/org-ltximg_e53730ba461b03f192d1c5d7adf2c8ea141ef862.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_eddc76bce6183940e7887fa7869970cce9c992e4.png b/ltximg/org-ltximg_eddc76bce6183940e7887fa7869970cce9c992e4.png old mode 100644 new mode 100755 diff --git a/ltximg/org-ltximg_f341743fe73d4f222f6c40f99ee4bb426882a0db.png b/ltximg/org-ltximg_f341743fe73d4f222f6c40f99ee4bb426882a0db.png old mode 100644 new mode 100755 diff --git a/macros.el b/macros.el new file mode 100755 index 0000000..5be6c23 --- /dev/null +++ b/macros.el @@ -0,0 +1,22 @@ +;; ----------------------------- +;; Org export macros (batch-safe) +;; ----------------------------- + +(setq org-export-global-macros + '( + ;; --- Tufte-style sidenotes --- + ("sidenote" + . "@@html:$1@@") + + ;; --- Single epigraph --- + ("epigraph_single" + . "@@html:

$1

$2
@@") + + ;; --- Multi-line epigraph (optional) --- + ("epigraph" + . "@@html:
$1
@@") + + ;; --- New thought / drop cap --- + ("newthought" + . "@@html:$1@@") + )) diff --git a/output/#search-index.json# b/output/#search-index.json# new file mode 100755 index 0000000..534f285 --- /dev/null +++ b/output/#search-index.json# @@ -0,0 +1,662 @@ +[ + { + "title": "Index", + "url": "/index.html", + "id": "d807a635-a25b-444c-9712-8144a7468b29" + }, + { + "title": "All Files", + "url": "/all-files.html", + "id": "8353c207-87dd-4b3d-81d1-2b2803999bc1" + }, + { + "title": "technical-commonplace", + "url": "/20251223220531-technical_commonplace.html", + "id": "37495d5f-2a77-40bc-b45c-8163189bbe6b" + }, + { + "title": "Design patterns", + "url": "/20251223215636-design_patterns_notes.html", + "id": "631b2086-4b8f-4fe3-829d-be1dc014e293" + }, + { + "title": "useful-c-imports", + "url": "/20251214210526-useful_c_imports.html", + "id": "d939e477-d1e9-43ea-960e-8727246d12a3" + }, + { + "title": "keyboard", + "url": "/20251122223053-keyboard.html", + "id": "0217f537-442a-4593-8c69-d481f0d1f2a8" + }, + { + "title": "old_nginx_code", + "url": "/20251109205925-old_nginx_code.html", + "id": "a9829b5d-690d-4a21-ba94-ac8beac4d439" + }, + { + "title": "Backlog", + "url": "/20251101123637-backlog.html", + "id": "580cc3a5-af8e-4cbe-b5ad-5b06680e6c37" + }, + { + "title": "old_nextcloud_server_code", + "url": "/20251019114758-old_nextcloud_server_code.html", + "id": "2c2d8df4-ad36-40ab-9f30-8a047b372956" + }, + { + "title": "server_moc", + "url": "/20251019114736-server_moc.html", + "id": "f09cb4ed-1407-4187-9002-de2c5db13a8f" + }, + { + "title": "pre_work_prep_microlise", + "url": "/20251002154204-pre_work_prep_microlise.html", + "id": "2BFB84B2-2129-4AE3-8E69-290CA5BF9747" + }, + { + "title": "microlise_moc", + "url": "/20251002154125-microlise_moc.html", + "id": "e6fd4c64-8be6-41f9-874c-662f0ee54765" + }, + { + "title": "workflow-moc", + "url": "/20250926151524-workflow_moc.html", + "id": "8CE93986-280B-45BD-9DF2-5D06586DDDE7" + }, + { + "title": "wedding_moc", + "url": "/20250918120706-wedding_moc.html", + "id": "c1de3972-e932-48fd-8065-3d89dad58007" + }, + { + "title": "misc_moc", + "url": "/20250918120519-misc_moc.html", + "id": "117aa5b3-cbfc-46b4-a51a-652744c0a8d8" + }, + { + "title": "naqshe-hayat", + "url": "/20250819174119-naqshe_hayat.html", + "id": "4426cc9a-1568-4fc8-9242-269654c43a3b" + }, + { + "title": "emacs-stuff-org-publish Welcome to My Org Website", + "url": "/20250806155335-emacs_stuff_org_publish.html", + "id": "7d2e867e-f091-4362-a583-453f732207fe" + }, + { + "title": "non_technical_moc", + "url": "/20250806111925-non_technical_moc.html", + "id": "565eaccd-8cf6-4dbb-bc66-a4b37367ce6b" + }, + { + "title": "python-lambda", + "url": "/20250805143741-python_lambda.html", + "id": "9d534e89-7f0b-494c-bff6-7b3be05b85d1" + }, + { + "title": "python-sorted-function", + "url": "/20250805143427-python_sorted_function.html", + "id": "3bbc6099-0187-4bf2-9282-97e5fa443f72" + }, + { + "title": "python-dictionary", + "url": "/20250805141906-python_dictionary.html", + "id": "125c81dc-c14f-4b4d-93c6-0a2b157735ac" + }, + { + "title": "python-set", + "url": "/20250804214537-python_set.html", + "id": "3a41407c-661e-416a-80d2-4c7a137d153a" + }, + { + "title": "leetcode-arrays", + "url": "/20250804212606-leetcode_arrays.html", + "id": "5f8f1147-5ae7-4132-a302-13c7a8c2bbde" + }, + { + "title": "how-to-solve-leetcode", + "url": "/20250804212215-how_to_solve_leetcode.html", + "id": "086ca3ca-39ec-4d37-b56d-b6d9f51e6873" + }, + { + "title": "big-o-complexity", + "url": "/20250804201706-big_o_complexity.html", + "id": "275988a8-59d8-40c8-a8b4-47118d6eb834" + }, + { + "title": "clean-code", + "url": "/20250727221512-clean_code.html", + "id": "dd55d635-59de-4ed9-8ff0-423782c2e0ae" + }, + { + "title": "book-recs", + "url": "/20250727174903-book_recs.html", + "id": "238ff7d8-db22-41e2-8aad-fc3c778e6248" + }, + { + "title": "Books MOC", + "url": "/20250727174809-books_moc.html", + "id": "8646a22b-7c8f-429b-ab67-1c2a35f68ae3" + }, + { + "title": "database_moc", + "url": "/20250727122406-database_moc.html", + "id": "e448cd99-afee-4702-947f-644bb34dc1aa" + }, + { + "title": "networking-moc", + "url": "/20250727121051-networking_moc.html", + "id": "0880f089-a5ad-49cd-8ce3-f020a5941313" + }, + { + "title": "nextcloud", + "url": "/20250727120306-nextcloud.html", + "id": "56f39be4-1108-4020-be5a-1f3a0fbf96fa" + }, + { + "title": "books-org-agenda", + "url": "/20250724230557-books_org_agenda.html", + "id": "363dbdfa-f23c-4f7e-a6f3-6d34f78984bb" + }, + { + "title": "postgres", + "url": "/20250723200800-postgres.html", + "id": "939e301b-6463-46a8-b57e-0af606e7e7ef" + }, + { + "title": "self_hosting", + "url": "/20250723190927-self_hosting.html", + "id": "99533f2d-a4e8-41d0-a605-c7d4cef6f995" + }, + { + "title": "java-junit-testing", + "url": "/20250723190656-java_junit_testing.html", + "id": "7b8de14c-a73e-4c92-a403-a9a1c419c0b3" + }, + { + "title": "java-portswrigger-test", + "url": "/20250723190203-java_portswrigger_test.html", + "id": "5cfd7f6f-f5ac-4f18-90f9-be9a31dd238e" + }, + { + "title": "bowling-kata", + "url": "/20250723185943-bowling_kata.html", + "id": "bca8e7a6-0590-4630-ab49-210306ad21a2" + }, + { + "title": "test_driven_development", + "url": "/20250723185829-test_driven_development.html", + "id": "2729599d-ae2b-4f22-b73d-bf22d81e0767" + }, + { + "title": "neuroplasticity", + "url": "/20250723185056-neuroplasticity.html", + "id": "a087da71-bcfb-4ddf-9565-b82113d5d27f" + }, + { + "title": "stanford_marshmallow_experiment", + "url": "/20250723184430-stanford_marshmallow_experiment.html", + "id": "acba0d25-08db-4784-8cc2-fe5c437ba723" + }, + { + "title": "advanced-networking", + "url": "/20250723184233-advanced_networking.html", + "id": "3acffb66-bc1a-4661-904f-c5447b3c3488" + }, + { + "title": "deliberate_practice", + "url": "/20250723183755-deliberate_practice.html", + "id": "d4f96bfb-b83d-449b-9f74-f602a1a3c2d3" + }, + { + "title": "career_capital", + "url": "/20250723183655-career_capital.html", + "id": "f9838952-9753-471b-a2cc-d72e01a53ef6" + }, + { + "title": "so_good_they_cant_ignore_you", + "url": "/20250723182408-so_good_they_cant_ignore_you.html", + "id": "2d7f1ccc-99d7-4c45-8fe7-4b87080edb01" + }, + { + "title": "so_good_they_cant_ignore_you", + "url": "/20250723182408-so-good-they-cant-ignore-you.html", + "id": "257c2ca9-80a3-43eb-87a6-6b366e1f9a5b" + }, + { + "title": "maven-pom-file", + "url": "/20250723171109-maven_pom_file.html", + "id": "bcd41e87-120c-455c-8898-996ddaa41f75" + }, + { + "title": "career_moc", + "url": "/20250722221649-career_moc.html", + "id": "04928b23-a07e-4b35-a3b9-a0c05787c38e" + }, + { + "title": "recipes-done", + "url": "/20250719175023-recipes_done.html", + "id": "EA93341B-20C0-48A2-BD88-F24ED3C540DA" + }, + { + "title": "recipes-ideas", + "url": "/20250719174944-recipes_ideas.html", + "id": "F7D68FF4-CAD0-4791-BAE4-AC20B84A8785" + }, + { + "title": "recipes-main", + "url": "/20250717230336-recipes_moc.html", + "id": "65F747B1-3CB2-429A-9E26-ED8BC169E689" + }, + { + "title": "recipes-moc", + "url": "/20250717230336-recipes_main.html", + "id": "311598c9-53e5-4ba7-87f9-b9d380ad1541" + }, + { + "title": "the_clean_coder", + "url": "/20250715223949-the_clean_coder.html", + "id": "EC9D851F-3A2E-4F32-A584-76F6F7A08E30" + }, + { + "title": "linux-arch-linux", + "url": "/20250703183239-linux_arch_linux.html", + "id": "569a4a57-1843-4821-8259-17762855985e" + }, + { + "title": "gpg-encryption", + "url": "/20250516161728-gpg_encryption.html", + "id": "30c28e5e-0b1c-43ae-b3bd-eb31023f8b73" + }, + { + "title": "microlise-assessment", + "url": "/20250430001952-microlise_assessment.html", + "id": "f877240e-c2c8-4087-84e5-4b1ca3fcd4ed" + }, + { + "title": "systemd_services", + "url": "/20250428133236-systemd_services.html", + "id": "bf277242-4f09-46a2-aa6b-1d75ce0025ac" + }, + { + "title": "emacs-stuff-evil", + "url": "/20250420012258-emacs_stuff_evil.html", + "id": "45CC3AF5-5E20-4B03-A36C-8D4BDD5CBB13" + }, + { + "title": "wacom-notes", + "url": "/20250417173821-wacom_notes.html", + "id": "7612a9a6-ae70-4525-93a0-81bac857df39" + }, + { + "title": "linux_moc", + "url": "/20250417173809-linux_stuff.html", + "id": "bdb493df-db92-4c93-9558-0b10fdff3048" + }, + { + "title": "linux_moc", + "url": "/20250417173809-linux_moc.html", + "id": "bdb493df-db92-4c93-9558-0b10fdff3048" + }, + { + "title": "wp-sadness", + "url": "/20250412234351-wp_sadness.html", + "id": "462F091B-9156-48B3-8665-0BE36C95C182" + }, + { + "title": "fyp-report-planning", + "url": "/20250403120140-fyp_report_planning.html", + "id": "26b2ed9a-cb81-4c43-bc63-6b3c8ffa3bf1" + }, + { + "title": "java_moc", + "url": "/20250402185735-technical_java_notes.html", + "id": "ae343652-96fe-4341-8a36-ec3a1abd0dc6" + }, + { + "title": "java_moc", + "url": "/20250402185735-java_moc.html", + "id": "ae343652-96fe-4341-8a36-ec3a1abd0dc6" + }, + { + "title": "ise_week_7", + "url": "/20250331202447-ise_week_7.html", + "id": "9ad3f3f1-55f7-4114-bc8c-17250b6dd25d" + }, + { + "title": "ise_week_5", + "url": "/20250331201944-ise_week_5.html", + "id": "0e70c535-b145-42d9-a9ed-fe48cddbb1a5" + }, + { + "title": "emacs-stuff-magit", + "url": "/20250329231658-emacs_stuff_magit.html", + "id": "2ab0fa3f-8ac6-4af2-8cd4-1dd490fb19c3" + }, + { + "title": "ise_week_4", + "url": "/20250329200158-ise_week_4.html", + "id": "ebf874d9-0554-47f0-be8b-5c9a948738bf" + }, + { + "title": "ise_week_3", + "url": "/20250329142725-ise_week_3.html", + "id": "1d0fa257-579f-49f3-b8fd-a3b68ddccf10" + }, + { + "title": "ise_week_2", + "url": "/20250329121843-ise_week_2.html", + "id": "f308642d-fcf3-410b-b154-d60582e112a2" + }, + { + "title": "ise_week_1", + "url": "/20250329114848-ise_week_1.html", + "id": "06b2a012-4e8a-4a8a-9494-de7ed9fbe1d3" + }, + { + "title": "ise", + "url": "/20250329114733-ise.html", + "id": "a190bab9-cf20-4bf3-b521-f20cd9cfc475" + }, + { + "title": "emacs-stuff-elisp", + "url": "/20250326002128-emacs_stuff_elisp.html", + "id": "7e79e4c5-383d-450f-882c-33d4f87ba1b5" + }, + { + "title": "wp-week-12-reflection", + "url": "/20250324041724-wp_week_12_reflections.html", + "id": "8CD2F4C4-22C2-4ECC-8F5F-C4779F8AC0F1" + }, + { + "title": "wp-emotional-intelligence", + "url": "/20250314230952-wp_emotional_intelligence.html", + "id": "D02B89DC-84D0-4211-A902-B9399F4179CA" + }, + { + "title": "wp-growth-mindset", + "url": "/20250314223811-wp_growth_mindset.html", + "id": "CD093B85-BF68-4EAB-AABE-733C7BFC99DE" + }, + { + "title": "wp-urge-surfing-blorg", + "url": "/20250226184629-wp_urge_surfing_blorg.html", + "id": "cfc4ce06-7862-49b7-9a4f-e515d690cd38" + }, + { + "title": "emacs-stuff-keybindings", + "url": "/20250218174735-emacs_stuff_keybindings.html", + "id": "966175d4-3b58-4abc-9b41-08cbf328dd87" + }, + { + "title": "afp_lec_5", + "url": "/20250218110346-afp_lec_5.html", + "id": "ed4c372b-0314-4b6e-9119-742f69b5e434" + }, + { + "title": "afp_week5", + "url": "/20250218110239-afp_week5.html", + "id": "1f395b8c-cf55-43eb-9430-dd9449f6b575" + }, + { + "title": "wp-new-emacs-config-blorg", + "url": "/20250214155617-wp_new_emacs_config_blorg.html", + "id": "1ee754f9-f30f-4976-850b-d18d01a834d2" + }, + { + "title": "i3-wm", + "url": "/20250213124335-i3_wm.html", + "id": "9d5aae0f-4ae1-49a5-a047-9099baad0a06" + }, + { + "title": "afp_lec_2", + "url": "/20250128111008-afp_lec_2.html", + "id": "460f4a49-8ae4-444a-bf82-4e14ca7cad3f" + }, + { + "title": "afp_week2", + "url": "/20250128110828-afp_week2.html", + "id": "4bc71106-1d2b-4c71-836d-54b738fe5ff5" + }, + { + "title": "afp_lec_1", + "url": "/20250121110241-afp_lec_1.html", + "id": "3aef24fd-b220-4408-aa1e-c3538d661b62" + }, + { + "title": "afp_lab_1", + "url": "/20250120113936-afp_lab_1.html", + "id": "f6c9e1a7-8465-4cef-9481-2b803d0c43d4" + }, + { + "title": "afp_week1", + "url": "/20250120111047-afp_week1.html", + "id": "7b2d8469-0e01-4427-a82e-948cf4b2fa00" + }, + { + "title": "afp", + "url": "/20250120110833-afp.html", + "id": "556d10d1-1c74-4d9f-a398-39cb3bd5d935" + }, + { + "title": "wp-prefront-cortex-blorg", + "url": "/20250111213016-wp_prefront_cortex_blog.html", + "id": "b292f5c6-0c27-439c-8274-2150eb45e20d" + }, + { + "title": "the_science_of_self_discipline", + "url": "/20241231172543-the_science_of_self_discipline.html", + "id": "1efba6c1-ca45-46e5-9562-da1c9da73e25" + }, + { + "title": "book_notes", + "url": "/20241231172511-book_notes.html", + "id": "01bd53c0-daa1-4f1c-bcab-ad6d8ce91c3c" + }, + { + "title": "github_notes", + "url": "/20241220234456-github_notes.html", + "id": "710f65e5-0bd4-42be-b5d1-69dbe79b745e" + }, + { + "title": "wp-emacs-config-blorg", + "url": "/20241217234944-wp_emacs_config_blorg.html", + "id": "b2db0b0b-c179-43ab-9e2b-22bbaac69bcb" + }, + { + "title": "web-port-notes", + "url": "/20241217234535-web_port_notes.html", + "id": "688bd830-d4d8-4e42-80ad-51b13246336a" + }, + { + "title": "socket_programming_in_c", + "url": "/20241213005156-socket_programming_in_c.html", + "id": "efe0360d-8d81-4372-833d-ad58e67d17c6" + }, + { + "title": "c_notes", + "url": "/20241213005125-c_notes.html", + "id": "5a207a1c-6f02-40d5-b42e-38daaa0aec10" + }, + { + "title": "lazy_evaluation", + "url": "/20241212013902-lazy_evaluation.html", + "id": "63456626-b34e-46d9-b85e-0f1f5724aa83" + }, + { + "title": "haskell_notes", + "url": "/20241212013207-haskell_notes.html", + "id": "8e2b6082-5578-4f87-aa5b-d60625e4eb83" + }, + { + "title": "job_application_cover_letters", + "url": "/20241211161232-applications.html", + "id": "f9897f8e-2b63-4ad2-a55f-3787c4ac235f" + }, + { + "title": "job_application_cover_letters", + "url": "/20241211161232- job_application_cover_letters.html", + "id": "f9897f8e-2b63-4ad2-a55f-3787c4ac235f" + }, + { + "title": "Brain MOC", + "url": "/20241210233721-brain_moc.html", + "id": "aa006675-4ee2-4af6-aba0-c7b4ef030770" + }, + { + "title": "uml_fyp", + "url": "/20241210232054-uml_fyp.html", + "id": "4a8edaed-9ebd-402b-9c5f-7a0cb4399102" + }, + { + "title": "tpis", + "url": "/20241210152713-tpis.html", + "id": "5443ed1c-bb7f-4eb4-9c96-d12648dd2291" + }, + { + "title": "uni_moc", + "url": "/20241210152650-uni_moc.html", + "id": "797d6e3e-98eb-4bc7-88b6-e096ef7306ad" + }, + { + "title": "uni_moc", + "url": "/20241210152650-uni.html", + "id": "3930e967-3adc-456f-907b-d99a7e1afebd" + }, + { + "title": "fyp", + "url": "/20241210012703-fyp.html", + "id": "7d199fbe-b0e7-48fd-b8a1-793044dbea01" + }, + { + "title": "emacs-stuff-gtd", + "url": "/20241210004453-gtd.html", + "id": "8e5e9498-ff3c-48e7-aab5-6e94b2e41ccb" + }, + { + "title": "emacs-stuff-org-roam", + "url": "/20241210004329-org_roam.html", + "id": "034abe27-ca14-4dc0-9a3f-b8d0e1f26342" + }, + { + "title": "emacs_moc", + "url": "/20241210004247-emacs_stuff.html", + "id": "8fa3f476-6152-45f4-b618-50f1e4bce46c" + }, + { + "title": "emacs_moc", + "url": "/20241210004247-emacs_moc.html", + "id": "8fa3f476-6152-45f4-b618-50f1e4bce46c" + }, + { + "title": "leetcode_notes", + "url": "/20241210001206-leetcode_notes.html", + "id": "7368a720-6b53-4d1e-bcfd-85520a66cf57" + }, + { + "title": "AOC Notes", + "url": "/20241210001150-aoc_notes.html", + "id": "e7f2302b-16eb-476d-a7b9-be12f077819d" + }, + { + "title": "technical_moc", + "url": "/20241210001045-technical_moc.html", + "id": "2f285f04-fcf4-4ade-a1ac-2c50b43d529a" + }, + { + "title": "Technical MOC", + "url": "/20241210001045-technical.html", + "id": "2f285f04-fcf4-4ade-a1ac-2c50b43d529a" + }, + { + "title": "Untitled", + "url": "/.#index.html", + "id": "3fc6deab-6f29-4be2-822e-6da23b50fb8b" + }, + { + "title": "Untitled", + "url": "/.#all-files.html", + "id": "72e1a17f-14f1-4574-bb69-d86f53c91089" + }, + { + "title": "Untitled", + "url": "/.#20251002154125-microlise_moc.html", + "id": "1c7aafdf-929e-42ce-ab75-02de66fabaeb" + }, + { + "title": "Untitled", + "url": "/.#20250918120519-misc_moc.html", + "id": "95e3705b-b5b4-4d1f-9c26-85dbf54ffe0c" + }, + { + "title": "Untitled", + "url": "/.#20250804212606-leetcode_arrays.html", + "id": "9d769440-3d36-4b9d-affb-b26f3ed2606d" + }, + { + "title": "Untitled", + "url": "/.#20250727174809-books_moc.html", + "id": "8fc3a93b-9343-4f29-a9a5-24d6d539cbf9" + }, + { + "title": "Untitled", + "url": "/.#20250723182408-so-good-they-cant-ignore-you.html", + "id": "977ba33e-1b95-4e81-bbcf-00c858eff777" + }, + { + "title": "Untitled", + "url": "/.#20250722221649-career_moc.html", + "id": "bfa60fd1-0726-4e95-9eec-30bcfd7217e6" + }, + { + "title": "Untitled", + "url": "/.#20250717230336-recipes_main.html", + "id": "04a83b44-e21b-4b1e-883c-49d8a39e0593" + }, + { + "title": "Untitled", + "url": "/.#20250329114733-ise.html", + "id": "9c972500-1e21-4b72-b1ab-37968c9428dd" + }, + { + "title": "Untitled", + "url": "/.#20250120111047-afp_week1.html", + "id": "93378cee-59ec-4228-9b79-df120d7652ba" + }, + { + "title": "Untitled", + "url": "/.#20241231172543-the_science_of_self_discipline.html", + "id": "64e50066-681c-4685-8715-f195f6e0d79e" + }, + { + "title": "Untitled", + "url": "/.#20241231172511-book_notes.html", + "id": "6b39e8a1-1a30-4692-afd2-100563c6c99d" + }, + { + "title": "Untitled", + "url": "/.#20241217234535-web_port_notes.html", + "id": "a7efffe8-53a9-4fbe-a8c9-99043e2b1514" + }, + { + "title": "Untitled", + "url": "/.#20241212013207-haskell_notes.html", + "id": "b46df848-810a-4ad1-b19f-8562788e81ab" + }, + { + "title": "Untitled", + "url": "/.#20241210233721-brain_moc.html", + "id": "ceab3bd6-5f3e-4272-bff4-765a2714ddc1" + }, + { + "title": "Untitled", + "url": "/.#20241210152650-uni.html", + "id": "abd0d9f1-1fdc-4324-af8a-b53964306b87" + }, + { + "title": "Untitled", + "url": "/.#20241210001206-leetcode_notes.html", + "id": "12667e33-7df2-49cb-8bc9-2a4546f56f66" + } +] diff --git a/output/20241210001045-technical.html b/output/20241210001045-technical.html new file mode 100755 index 0000000..dfb47f1 --- /dev/null +++ b/output/20241210001045-technical.html @@ -0,0 +1,290 @@ + + + + + + + +Technical MOC + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210001045-technical_moc.html b/output/20241210001045-technical_moc.html new file mode 100755 index 0000000..791bab4 --- /dev/null +++ b/output/20241210001045-technical_moc.html @@ -0,0 +1,283 @@ + + + + + + + +technical_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210001150-aoc_notes.html b/output/20241210001150-aoc_notes.html new file mode 100755 index 0000000..a7e7b05 --- /dev/null +++ b/output/20241210001150-aoc_notes.html @@ -0,0 +1,1860 @@ + + + + + + + +AOC Notes + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

AOC Notes

+ +
+

+Here are the notes for the AOC (Advent Of Code) for the year 2024. +Workspace: +

+
+
import System.Process (callCommand)
+main :: IO ()
+main = do
+    putStrLn "Launching IntelliJ in gnome-terminal with zsh..."
+    _ <- callCommand "gnome-terminal -- zsh -c 'idea /home/zaine/Documents/projects/advent_of_code'"
+    putStrLn "Terminal launched."
+
+
+
+

Day 3

+
+
+
+

point 1

+
+

+A lot of basic string and numeric manipulation was tested. +When you have a input string, and want to test weather there contains a substring, you can use +

+ +
+
// input is the string
+if (input.startsWith("mul(", i)) {
+   int endIndex = input.indexOf(")", i);
+   if (endIndex != -1) {
+       String candidate = input.substring(i, endIndex + 1);
+}
+}
+
+
+ +

+Here we can see that through the loop, an if check is being done to check if the string starts with “mul(”, if so, it gets the endIndex of it too. Then it stores that “candidate” value into a String, using the substring method. +

+
+
+
+

point 2

+
+

+some regex below: this checks if the input is of the correct format. +

+ +
+
public static boolean isValidMul(String input) {
+    // Regex to validate mul(X,Y) where X and Y are 1-3 digit numbers
+    return input.matches("mul\\(\\d{1,3},\\d{1,3}\\)");
+}
+
+
+
+
+
+
+

Day 4

+
+
+
+

part 1

+
+

+was extremely difficult. i had to load the input as a 2d array, +

+
+
int cols = lines.get(0).length(); //where lines is var
+int cols = grid[0].length; // where grid is a 2d array
+
+
+

+this allows you to get the vertical length of the 2d array. +

+
+
+

countWordOccurrences Method

+
+

+Iterates through the grid to check for occurrences of the word “XMAS” in all possible directions (horizontal, vertical, and diagonal). +Directions: Defined by the directions array, which contains 8 possible ways to traverse: + {0, 1}: Right + {0, -1}: Left + {1, 0}: Down + {-1, 0}: Up + {1, 1}: Diagonal down-right + {1, -1}: Diagonal down-left + {-1, 1}: Diagonal up-right + {-1, -1}: Diagonal up-left +

+ +

+For each starting position (row, col) in the grid: +

+ +

+The program checks each direction by calling isWordFound. +

+
+
+
+

Checking for the Word

+
+

+isWordFound Method Validates if the word exists starting from a specific position (row, col) in the grid, moving in the specified direction (dx, dy). +For each character in the word: +

+
    +
  • compute the new position (newRow, newCol) based on the direction.
  • +
  • Check bounds to ensure the position is valid (not out of the grid).
  • +
  • Compare the character at the position with the corresponding character in the word.
  • +
  • If any check fails, return false.
  • +
+ +

+If all characters match, the word is found, and the method returns true. +

+
+
+
+

Counting Matches

+
+

+For each occurrence of the word found by isWordFound, increment the count variable. +After scanning all positions and directions in the grid, the total count is returned. +

+
+
+
+
+

part 2

+
+

+was alot easier, i looped through the whole grid, and wherever there is the letter ’A’, i want to check around it, it can be in the form: +

+
+
M.S
+.A.
+M.S
+
+
+

+and this would count as one, as there is MAS twice (diagonally in the shape of an X) +

+
+
+
+
+

Day 5

+
+
+
+

Part One: Identifying Correctly Ordered Updates

+
+
+
+

Splitting Input into Rules and Updates

+
+

+Parsing the input file into two distinct sections (rules and updates) required identifying the empty line separator. +

+
+
for (String line : lines) {
+    if (line.trim().isEmpty()) {
+        emptyLineFound = true;
+        continue; // Skip the empty line itself
+    }
+    if (!emptyLineFound) {
+        firstList.add(line);
+    } else {
+        secondList.add(line);
+    }
+}
+
+
+
+
+
+

Dependency Graph Representation

+
+

+Representing the rules as a directed graph with each rule defining an edge (X|Y as X -> Y). This graph maps each page to a list of pages that must follow it. +

+
+
Map<Integer, List<Integer>> graph = new HashMap<>();
+graph.putIfAbsent(from, new ArrayList<>());
+graph.get(from).add(to);
+
+
+
+
+
+

Checking Update Validity

+
+

+Verifying if an update follows the rules using a map of page positions for quick lookup. +

+
+
for (Map.Entry<Integer, List<Integer>> entry : graph.entrySet()) {
+    int from = entry.getKey();
+    for (int to : entry.getValue()) {
+        if (positions.get(from) >= positions.get(to)) {
+            return false; // Rule violated
+        }
+    }
+}
+
+
+
+
+
+

Finding the Middle Page

+
+

+Calculating the middle page for each correctly ordered update using list indexing. +

+
+
int middlePage = pages.get(pages.size() / 2);
+
+
+
+
+
+
+

Part Two: Reordering Incorrect Updates

+
+
+
+

Topological Sorting

+
+

+Reordering pages required implementing a topological sort, which ensures all dependencies (rules) are respected. +

+
+
visiting.add(node);
+for (int neighbor : graph.getOrDefault(node, Collections.emptyList())) {
+    if (!dfs(neighbor, graph, visited, visiting, sorted)) {
+        return false; // Cycle detected
+    }
+}
+visiting.remove(node);
+visited.add(node);
+sorted.add(node);
+
+
+
+
+
+

Subgraph Creation

+
+

+Only rules involving pages in the current update were considered. This required dynamically building a subgraph for each update. +

+
+
for (int page : pages) {
+    if (graph.containsKey(page)) {
+        for (int dependent : graph.get(page)) {
+            if (pages.contains(dependent)) {
+                subGraph.get(page).add(dependent);
+            }
+        }
+    }
+}
+
+
+
+
+
+

Cycle Detection

+
+

+Ensuring no cycles existed in the dependency graph was critical for valid sorting. +

+
+
if (visiting.contains(node)) {
+    return false; // Cycle detected
+}
+
+
+
+
+
+

Finding Middle Page After Reordering

+
+

+Same approach as in Part One but applied after sorting. +

+
+
int correctedMiddlePage = reorderedPages.get(reorderedPages.size() / 2);
+
+
+
+
+
+
+
+

Day 6

+
+
+
+

Part 1

+
+
+
+

Input Parsing

+
+
+
List<String> input = Files.readAllLines(Paths.get("aoc_24/src/day_6/input"));
+int rows = input.size();
+int cols = input.get(0).length();
+char[][] map = new char[rows][cols];
+
+
+
+
+
+

Guard Initialization

+
+
+
for (int r = 0; r < rows; r++) {
+    for (int c = 0; c < cols; c++) {
+        if ("^v<>".indexOf(map[r][c]) != -1) {
+            guardRow = r;
+            guardCol = c;
+            guardFacing = map[r][c];
+            map[r][c] = '.'; // Clear the guard's position
+        }
+    }
+}
+
+
+
+
+
+

Movement Directions

+
+
+
Map<Character, int[]> directions = Map.of(
+    '^', new int[] {-1, 0},
+    'v', new int[] {1, 0},
+    '<', new int[] {0, -1},
+    '>', new int[] {0, 1}
+);
+
+
+
+
+
+

Turning Logic

+
+
+
Map<Character, Character> turnRight = Map.of(
+    '^', '>',
+    '>', 'v',
+    'v', '<',
+    '<', '^'
+);
+
+
+
+
+
+

Visited Positions Tracking

+
+
+
Set<String> visited = new HashSet<>();
+visited.add(guardRow + "," + guardCol);
+
+
+
+
+
+

Movement and Termination Logic

+
+
+
while (true) {
+    int[] move = directions.get(guardFacing);
+    int nextRow = guardRow + move[0];
+    int nextCol = guardCol + move[1];
+
+    if (nextRow < 0 || nextRow >= rows || nextCol < 0 || nextCol >= cols) {
+        break; // Guard leaves the map
+    }
+
+    if (map[nextRow][nextCol] == '#') {
+        guardFacing = turnRight.get(guardFacing); // Turn right
+    } else {
+        guardRow = nextRow;
+        guardCol = nextCol;
+        visited.add(guardRow + "," + guardCol);
+    }
+}
+
+
+
+
+
+
+

Part 2

+
+
+
+

Input Parsing

+
+
+
List<String> input = Files.readAllLines(Paths.get("aoc_24/src/day_6/input"));
+int rows = input.size();
+int cols = input.get(0).length();
+char[][] map = new char[rows][cols];
+
+
+
+
+
+

Guard Initialization

+
+
+
for (int r = 0; r < rows; r++) {
+    for (int c = 0; c < cols; c++) {
+        if ("^v<>".indexOf(map[r][c]) != -1) {
+            guardRow = r;
+            guardCol = c;
+            guardFacing = map[r][c];
+            map[r][c] = '.'; // Clear the guard's position
+        }
+    }
+}
+
+
+
+
+
+

Movement Directions

+
+
+
Map<Character, int[]> directions = Map.of(
+    '^', new int[] {-1, 0},
+    'v', new int[] {1, 0},
+    '<', new int[] {0, -1},
+    '>', new int[] {0, 1}
+);
+
+
+
+
+
+

Turning Logic

+
+
+
Map<Character, Character> turnRight = Map.of(
+    '^', '>',
+    '>', 'v',
+    'v', '<',
+    '<', '^'
+);
+
+
+
+
+
+

Valid Obstruction Positions

+
+
+
Set<String> validObstructions = new HashSet<>();
+
+for (int r = 0; r < rows; r++) {
+    for (int c = 0; c < cols; c++) {
+        if (map[r][c] == '.' && !(r == guardRow && c == guardCol)) {
+            map[r][c] = '#'; // Temporarily place obstruction
+
+            if (causesLoop(map, guardRow, guardCol, guardFacing, directions, turnRight)) {
+                validObstructions.add(r + "," + c);
+            }
+
+            map[r][c] = '.'; // Remove obstruction
+        }
+    }
+}
+System.out.println("Number of valid obstruction positions: " + validObstructions.size());
+
+
+
+
+
+

Loop Detection Helper Function

+
+
+
private static boolean causesLoop(char[][] map, int guardRow, int guardCol, char guardFacing,
+                                  Map<Character, int[]> directions, Map<Character, Character> turnRight) {
+    Set<String> seenStates = new HashSet<>();
+    int rows = map.length;
+    int cols = map[0].length;
+
+    while (true) {
+        String state = guardRow + "," + guardCol + "," + guardFacing;
+        if (seenStates.contains(state)) {
+            return true; // Loop detected
+        }
+        seenStates.add(state);
+
+        int[] move = directions.get(guardFacing);
+        int nextRow = guardRow + move[0];
+        int nextCol = guardCol + move[1];
+
+        if (nextRow < 0 || nextRow >= rows || nextCol < 0 || nextCol >= cols) {
+            return false; // Guard leaves the map
+        }
+
+        if (map[nextRow][nextCol] == '#') {
+            guardFacing = turnRight.get(guardFacing); // Turn right
+        } else {
+            guardRow = nextRow;
+            guardCol = nextCol;
+        }
+    }
+}
+
+
+
+
+
+
+
+

Day 7

+
+
+
+

Part 1

+
+
+
+

Input Parsing

+
+
    +
  • Parse the input file, where each line is in the format `<testValue>: <number1> <number2> …`
  • +
  • `testValue` is a target number, and we determine if it can be computed by combining the given numbers with `+` or `*`.
  • +
+
+
List<String> input = Files.readAllLines(Paths.get("aoc_24/src/day_7/input"));
+long totalCalibrationResult = 0;
+
+for (String line : input) {
+    String[] parts = line.split(": ");
+    long testValue = Long.parseLong(parts[0]);  // Target value
+    String[] numbers = parts[1].split(" ");
+}
+
+
+
+
+
+

Validation Logic

+
+
    +
  • The `isValidEquation` function checks if any combination of operators (`+` or `*`) between the numbers matches the `testValue`.
  • +
  • Evaluation is performed left-to-right.
  • +
+
+
private static boolean isValidEquation(long testValue, String[] numbers) {
+    List<String> operators = Arrays.asList("+", "*");
+    List<String[]> operatorCombinations = generateOperatorCombinations(numbers.length - 1, operators);
+
+    for (String[] operatorCombination : operatorCombinations) {
+        long result = Long.parseLong(numbers[0]);
+        for (int i = 1; i < numbers.length; i++) {
+            String operator = operatorCombination[i - 1];
+            long num = Long.parseLong(numbers[i]);
+
+            if (operator.equals("+")) {
+                result += num;
+            } else if (operator.equals("*")) {
+                result *= num;
+            }
+        }
+
+        if (result == testValue) {
+            return true; // Equation is valid
+        }
+    }
+    return false; // No valid equation found
+}
+
+
+
+
+
+

Operator Combination Generator

+
+
    +
  • Generate all possible combinations of `+` and `*` for `n-1` positions (where `n` is the number of numbers).
  • +
+
+
private static List<String[]> generateOperatorCombinations(int numOperators, List<String> operators) {
+    List<String[]> combinations = new ArrayList<>();
+    generateOperatorCombinationsRecursive(new String[numOperators], 0, operators, combinations);
+    return combinations;
+}
+
+private static void generateOperatorCombinationsRecursive(String[] current, int index, List<String> operators, List<String[]> combinations) {
+    if (index == current.length) {
+        combinations.add(current.clone());
+        return;
+    }
+
+    for (String operator : operators) {
+        current[index] = operator;
+        generateOperatorCombinationsRecursive(current, index + 1, operators, combinations);
+    }
+}
+
+
+
+
+
+

Main Logic

+
+
    +
  • Iterate over each line of input.
  • +
  • Parse `testValue` and numbers.
  • +
  • If a valid equation exists for the line, add the `testValue` to the total calibration result.
  • +
+
+
for (String line : input) {
+    String[] parts = line.split(": ");
+    long testValue = Long.parseLong(parts[0]);
+    String[] numbers = parts[1].split(" ");
+
+    if (isValidEquation(testValue, numbers)) {
+        totalCalibrationResult += testValue;
+    }
+}
+System.out.println("Total Calibration Result: " + totalCalibrationResult);
+
+
+
+
+
+
+

Part 2

+
+
+
+

Input Parsing

+
+
    +
  • Reads an input file where each line is formatted as `<testValue>: <number1> <number2> …`.
  • +
  • Parses `testValue` and the numbers to evaluate equations that could result in `testValue`.
  • +
+
+
List<String> input = Files.readAllLines(Paths.get("aoc_24/src/day_7/input"));
+long totalCalibrationResult = 0;
+
+for (String line : input) {
+    String[] parts = line.split(": ");
+    long testValue = Long.parseLong(parts[0]);  // Target value
+    String[] numbers = parts[1].split(" ");
+}
+
+
+
+
+
+

Validation Logic

+
+
    +
  • The `isValidEquation` function checks if any combination of operators (`+`, `*`, or `||`) between numbers can match the `testValue`.
  • +
  • Includes support for a new operator `||`: +
      +
    • Concatenates the current `result` and the next number as strings.
    • +
    • Converts the concatenated string back to `long` to update the result.
    • +
  • +
  • Evaluation is performed left-to-right.
  • +
+
+
private static boolean isValidEquation(long testValue, String[] numbers) {
+    List<String> operators = Arrays.asList("+", "*", "||");
+    List<String[]> operatorCombinations = generateOperatorCombinations(numbers.length - 1, operators);
+
+    for (String[] operatorCombination : operatorCombinations) {
+        long result = Long.parseLong(numbers[0]);
+        for (int i = 1; i < numbers.length; i++) {
+            String operator = operatorCombination[i - 1];
+            long num = Long.parseLong(numbers[i]);
+
+            if (operator.equals("+")) {
+                result += num;
+            } else if (operator.equals("*")) {
+                result *= num;
+            } else if (operator.equals("||")) {
+                result = Long.parseLong(Long.toString(result) + Long.toString(num));
+            }
+        }
+
+        if (result == testValue) {
+            return true;
+        }
+    }
+    return false;
+}
+
+
+
+
+
+

Operator Combination Generator

+
+
    +
  • Generates all possible combinations of `+`, `*`, and `||` operators for `n-1` positions (where `n` is the number of numbers).
  • +
  • Recursively builds the combinations.
  • +
+
+
private static List<String[]> generateOperatorCombinations(int numOperators, List<String> operators) {
+    List<String[]> combinations = new ArrayList<>();
+    generateOperatorCombinationsRecursive(new String[numOperators], 0, operators, combinations);
+    return combinations;
+}
+
+private static void generateOperatorCombinationsRecursive(String[] current, int index, List<String> operators, List<String[]> combinations) {
+    if (index == current.length) {
+        combinations.add(current.clone());
+        return;
+    }
+
+    for (String operator : operators) {
+        current[index] = operator;
+        generateOperatorCombinationsRecursive(current, index + 1, operators, combinations);
+    }
+}
+
+
+
+
+
+

Main Logic

+
+
    +
  • Iterates over each line of input.
  • +
  • Parses `testValue` and numbers.
  • +
  • Adds `testValue` to the total if a valid equation exists for the line.
  • +
+
+
for (String line : input) {
+    String[] parts = line.split(": ");
+    long testValue = Long.parseLong(parts[0]);
+    String[] numbers = parts[1].split(" ");
+
+    if (isValidEquation(testValue, numbers)) {
+        totalCalibrationResult += testValue;
+    }
+}
+System.out.println("Total Calibration Result: " + totalCalibrationResult);
+
+
+
+
+
+
+
+

Day 8

+
+

+Resonant Collinearity +

+
+
+

Part One

+
+
    +
  • Objective: Identify unique antinode locations within a map, considering two antennas of the same frequency in a specific configuration.
  • +
  • Key Condition: Antinode occurs if two antennas of the same frequency are aligned such that one is twice as far from the antinode as the other.
  • +
  • Steps: +
      +
    1. Parse the input map to locate antennas grouped by their frequency.
    2. +
    3. For each frequency group, iterate through all antenna pairs.
    4. +
    5. Calculate potential antinode positions based on the defined condition.
    6. +
    7. Use a Set to store unique antinode positions.
    8. +
    9. Return the size of the Set as the total unique antinode count.
    10. +
  • + +
  • Code Snippet:
  • +
+
+
for (int i = 0; i < locations.size(); i++) {
+    for (int j = i + 1; j < locations.size(); j++) {
+        int[] a = locations.get(i);
+        int[] b = locations.get(j);
+
+        // Calculate midpoints and validate conditions
+        if ((b[0] - a[0]) % 2 == 0 && (b[1] - a[1]) % 2 == 0) {
+            int midRow = (a[0] + b[0]) / 2;
+            int midCol = (a[1] + b[1]) / 2;
+            antinodes.add(midRow + "," + midCol);
+        }
+    }
+}
+
+
+
+
+
+

Part Two

+
+
    +
  • Objective: Update the model to include all positions perfectly aligned with at least two antennas of the same frequency.
  • +
  • Key Changes: +
      +
    • Antinodes occur at all positions along the straight line between antennas of the same frequency.
    • +
    • Antennas themselves are also antinodes unless they are the only instance of their frequency.
    • +
  • +
  • Steps: +
      +
    1. Parse the input map and group antennas by frequency.
    2. +
    3. For each pair of antennas of the same frequency: +
        +
      • Calculate direction vectors (reduced using GCD).
      • +
      • Traverse along the direction vector in both forward and backward directions, marking all valid positions as antinodes.
      • +
    4. +
    5. Add each antenna location directly to the set of antinodes.
    6. +
    7. Return the size of the unique antinode set.
    8. +
  • + +
  • Code Snippet:
  • +
+
+
int dr = b[0] - a[0];
+int dc = b[1] - a[1];
+int gcd = gcd(Math.abs(dr), Math.abs(dc));
+dr /= gcd;
+dc /= gcd;
+
+// Traverse along the line
+int row = a[0], col = a[1];
+while (isWithinBounds(row, col, rows, cols)) {
+    antinodes.add(row + "," + col);
+    row += dr;
+    col += dc;
+}
+
+
+
+
+
+

Notes on Implementation

+
+
    +
  • Data Structures: +
      +
    • Map<Character, List<int[]>>: Stores antenna positions by frequency.
    • +
    • Set<String>: Tracks unique antinode positions.
    • +
  • +
  • Utility Functions: +
      +
    • isWithinBounds: Ensures coordinates are within map dimensions.
    • +
    • gcd: Simplifies direction vectors to avoid redundant calculations.
    • +
  • +
+
+
+
+
+

Day 9

+
+
+
+

Part 1: Manipulating and Calculating Disk Placement

+
+

+Concept: Creating and manipulating a disk structure based on input. +Input is split into alternating “id” and “space” values. +Example of creating the disk: +

+
+
for (String character : lines.getFirst().split("")) {
+    int num = Integer.parseInt(character);
+    if (space) {
+        for (int i = 0; i < num; i++) disk.add(-1);
+    } else {
+        for (int i = 0; i < num; i++) disk.add(id);
+        id++;
+    }
+    space = !space;
+}
+
+
+ +
    +
  • Key Learning: Understanding alternating patterns in input and their translation to a data structure.
  • + +
  • Problem Solving: Adjusting misplaced items. +
      +
    • Utilize a while loop to locate and correct misplaced “-1” values in the disk.
    • +
    • +Example: +

      +
      +
      if (disk.get(i) == -1) {
      +    int val = -1;
      +    while (val == -1) {
      +        val = disk.removeLast();
      +    }
      +    disk.add(i, val);
      +}
      +
      +
    • +
  • + +
  • Final Calculation: Using BigInteger for large numbers. +
      +
    • Formula: index * value for each position in the disk.
    • +
    • +Example: +

      +
      +
      BigInteger count = BigInteger.ZERO;
      +for (int i = 0; i < disk.size(); i++) {
      +    count = count.add(BigInteger.valueOf(i).multiply(BigInteger.valueOf(disk.get(i))));
      +}
      +
      +
    • +
  • +
+
+
+
+

Part 2: Advanced Disk Rearrangement with Blocks

+
+
    +
  • Concept: Representing disk as a list of Block objects. +
      +
    • Block stores size and id.
    • +
    • +Example: +

      +
      +
      public static class Block {
      +    private int size;
      +    private int id;
      +    public Block(int size, int id) {
      +        this.size = size;
      +        this.id = id;
      +    }
      +}
      +
      +
    • +
  • + +
  • Key Learning: Encapsulating logic into objects improves clarity and scalability.
  • + +
  • Space Management: Finding and fitting blocks into available spaces. +
      +
    • Utilize a fit method to split or match blocks.
    • +
    • +Example: +

      +
      +
      public List<Block> fit(Block work) {
      +    if (work.size > this.size) return null;
      +    List<Block> newList = new ArrayList<>();
      +    newList.add(work);
      +    if (work.size < this.size) {
      +        newList.add(new Block(this.size - work.size, -1));
      +    }
      +    return newList;
      +}
      +
      +
    • +
  • + +
  • Problem Solving: Iterating backward through the disk to find and rearrange blocks into spaces. +
      +
    • Restart loop when a fit is found to ensure proper placement.
    • +
    • +Example: +

      +
      +
      for (int i = 0; i < diskPlace; i++) {
      +    Block possibleSpace = disk.get(i);
      +    if (possibleSpace.getId() == -1) {
      +        List<Block> blocks = possibleSpace.fit(work);
      +        if (blocks != null) {
      +            disk.remove(diskPlace);
      +            disk.add(diskPlace, new Block(work.getSize(), -1));
      +            for (int j = blocks.size() - 1; j >= 0; j--) {
      +                disk.add(i, blocks.get(j));
      +            }
      +            break;
      +        }
      +    }
      +}
      +
      +
    • +
  • + +
  • Final Calculation: Summing placements using block properties. +
      +
    • Ensure large calculations are done efficiently with BigInteger.
    • +
    • +Example: +

      +
      +
      BigInteger count = BigInteger.ZERO;
      +int placement = 0;
      +for (Block block : disk) {
      +    if (block.getId() != -1) {
      +        for (int j = 0; j < block.getSize(); j++) {
      +            count = count.add(BigInteger.valueOf(placement).multiply(BigInteger.valueOf(block.getId())));
      +            placement++;
      +        }
      +    } else {
      +        placement += block.getSize();
      +    }
      +}
      +
      +
    • +
  • +
+
+
+
+
+

Day 10

+
+
+
+

Part 1: Counting Trails in a 2D Grid

+
+
    +
  • Concept: Navigating and processing a 2D grid based on specific rules. +
      +
    • Input is parsed into a 2D map from a list of strings.
    • +
    • +Conversion logic for parsing: +

      +
      +
      int[] map = new int[width * height];
      +int i = 0;
      +for (String line : lines) {
      +    if (line.isBlank()) continue;
      +    for (String character : line.trim().split("")) {
      +        map[i] = Integer.parseInt(character);
      +        i++;
      +    }
      +}
      +
      +
    • +
  • + +
  • Recursive Approach: Traversing paths with a helper function countTrails. +
      +
    • Recursion halts on boundaries, invalid values, or when a sequence completes.
    • +
    • +Example: +

      +
      +
      private static Set<Point> countTrails(int[] map, int x, int y, int width, int height, int val) {
      +    if (x >= width || y >= height || x < 0 || y < 0 || map[y * width + x] != val) return new HashSet<>();
      +    if (val == 9) return Set.of(new Point(9, x, y));
      +
      +    Set<Point> result = new HashSet<>();
      +    result.addAll(countTrails(map, x + 1, y, width, height, val + 1));
      +    result.addAll(countTrails(map, x - 1, y, width, height, val + 1));
      +    result.addAll(countTrails(map, x, y + 1, width, height, val + 1));
      +    result.addAll(countTrails(map, x, y - 1, width, height, val + 1));
      +    return result;
      +}
      +
      +
    • +
  • + +
  • Key Learning: Recursive exploration of a grid with stateful logic for trail validity.
  • + +
  • Result Calculation: Sum the size of all unique trail sets. +
      +
    • +Example: +

      +
      +
      long count = 0;
      +for (int y = 0; y < height; y++) {
      +    for (int x = 0; x < width; x++) {
      +        Set<Point> set = countTrails(map, x, y, width, height, 0);
      +        count += set.size();
      +    }
      +}
      +
      +
    • +
  • +
+
+
+
+

Part 2: Enhanced Trail Counting with Weighted Points

+
+
    +
  • Concept: Counting trails with weights using a Map<Point, Integer> for aggregation. +
      +
    • Modified helper function countTrails2 tracks weights for each point.
    • +
    • +Example: +

      + +
      +
      private static Map<Point, Integer> countTrails2(int[] map, int x, int y, int width, int height, int val) {
      +    if (x >= width || y >= height || x < 0 || y < 0 || map[y * width + x] != val) return new HashMap<>();
      +    if (val == 9) return Map.of(new Point(1, x, y), 1);
      +
      +    Map<Point, Integer> result = new HashMap<>();
      +    checkDirection(map, x + 1, y, width, height, val, result);
      +    checkDirection(map, x - 1, y, width, height, val, result);
      +    checkDirection(map, x, y + 1, width, height, val, result);
      +    checkDirection(map, x, y - 1, width, height, val, result);
      +    return result;
      +}
      +
      +
    • +
  • + +
  • Helper Method: checkDirection facilitates merging results for trail continuity. +
      +
    • +Example: +

      +
      +
      private static void checkDirection(int[] map, int x, int y, int width, int height, int val, Map<Point, Integer> result) {
      +    Map<Point, Integer> res = countTrails2(map, x, y, width, height, val + 1);
      +    for (Point p : res.keySet()) {
      +        result.merge(p, res.get(p), Integer::sum);
      +    }
      +}
      +
      +
    • +
  • + +
  • Key Learning: Using a Map to manage complex trail state and weights for precise calculations.
  • + +
  • Result Calculation: Sum weighted trail counts. +
      +
    • +Example: +

      +
      +
      long count = 0;
      +for (int y = 0; y < height; y++) {
      +    for (int x = 0; x < width; x++) {
      +        Map<Point, Integer> res = countTrails2(map, x, y, width, height, 0);
      +        for (int value : res.values()) {
      +            count += value;
      +        }
      +    }
      +}
      +
      +
    • +
  • + +
  • Encapsulation of grid points as objects (Point) simplifies hash-based operations and improves code clarity.
  • +
  • Using collections like Set and Map effectively is crucial for aggregating results in a structured way.
  • +
+ + +

+Would you like to make any adjustments or add further examples? +

+
+
+
+
+

Day 12

+
+
+
+

Core Logic and Functionality

+
+
    +
  1. Coordinates Mapping: +
      +
    • +A map (coords) stores coordinates of each character from the input. For each character, all the coordinates where it appears are stored as Point objects. +

      + +
      +
      for (int i = 0; i < in.size(); i++) {
      +    for (int j = 0; j < in.get(i).length(); j++) {
      +        coords.putIfAbsent(in.get(i).charAt(j), new ArrayList<>());
      +        coords.get(in.get(i).charAt(j)).add(new Point(i, j));
      +    }
      +}
      +
      +
    • +
  2. + +
  3. Flood Fill Algorithm with Stack: +
      +
    • +A flood-fill algorithm is used to explore areas connected by the same character. The algorithm uses a stack to explore adjacent points recursively. +

      + +
      +
      ArrayDeque<Point> stack = new ArrayDeque<>();
      +stack.push(co);
      +while (!stack.isEmpty()) {
      +    var cur = stack.pop();
      +    // explore neighbors
      +}
      +
      +
    • +
  4. + +
  5. Fence Counting: +
      +
    • +For each region, the number of “fences” (edges where the character changes) is counted. The algorithm checks for boundaries or differing characters adjacent to each point. +

      + +
      +
      if (nd.x < 0 || nd.y < 0 || nd.x >= in.size() || nd.y >= in.get(0).length()) {
      +    fence++;
      +} else if (in.get(nd.x).charAt(nd.y) != ch) {
      +    fence++;
      +}
      +
      +
    • +
  6. + +
  7. Side Fetching Logic: +
      +
    • +The fetchSides() method computes the number of “sides” based on the placement of fences, counting how the fences are arranged along rows and columns. +

      + +
      +
      for (var xx : cols.keySet()) {
      +    var xl = cols.get(xx);
      +    Collections.sort(xl);
      +    // logic for sorting and counting sides
      +}
      +
      +
    • +
  8. + +
  9. Area and Fence Calculations: +
      +
    • +For each character, the area (number of connected points) and the number of fences are calculated. The result is a product of area and fence count. +

      + +
      +
      ret += area * fence;
      +p2 += area * fetchSides(fences);
      +
      +
    • +
  10. +
+
+
+

Core Logic and Functionality

+
+
    +
  • Coordinates mapping using a Map<Character, List<Point>> to track character positions.
  • +
  • Flood-fill algorithm using a stack to explore regions of connected characters.
  • +
  • Fence counting logic to identify boundaries and different characters.
  • +
  • Side fetching logic to count the number of fences arranged along rows and columns.
  • +
  • Area and fence calculations for each region to compute the final result.
  • +
+
+
+
+
+
+

Day 13

+
+
+
+

Part 1: Parsing Input and Solving Simultaneous Equations

+
+
    +
  • Goal: Parse input, extract button coefficients and prize values, solve simultaneous equations to find valid token costs.
  • +
  • Key Concepts: +
      +
    • Input parsing using BufferedReader.
    • +
    • Using determinants to solve simultaneous equations.
    • +
    • Validating solutions for constraints (non-negative integers, valid m/n).
    • +
  • +
  • Code Snippets: +
      +
    • +Parsing Input: +

      + +
      +
      if (line.startsWith("Button A:")) {
      +    String[] parts = line.split(":")[1].split(",");
      +    current = new ButtonPrize();
      +    current.buttonAX = Integer.parseInt(parts[0].trim().split("\\+")[1]);
      +    current.buttonAY = Integer.parseInt(parts[1].trim().split("\\+")[1]);
      +}
      +
      +
    • + +
    • +Solving Simultaneous Equations: +

      + +
      +
      int determinant = buttonAX * buttonBY - buttonBX * buttonAY;
      +if (determinant == 0) return 0;  // No solution
      +
      +long mNumerator = prizeX * buttonBY - prizeY * buttonBX;
      +long nNumerator = prizeY * buttonAX - prizeX * buttonAY;
      +
      +if (mNumerator % determinant != 0 || nNumerator % determinant != 0) return 0;
      +long m = mNumerator / determinant;
      +long n = nNumerator / determinant;
      +return (m < 0 || n < 0) ? 0 : m * 3 + n;  // Calculate token costs
      +
      +
    • +
  • + +
  • Challenges Faced: +
      +
    • Edge cases with determinant = 0 or invalid input format.
    • +
    • Ensuring no negative values for m/n.
    • +
  • +
+
+
+
+

Part 2: Transforming Input Data

+
+
    +
  • Goal: Modify prize values with a fixed offset before calculations.
  • +
  • Key Concepts: +
      +
    • Transforming input data programmatically.
    • +
    • Reusing the existing calculation logic after transformation.
    • +
  • +
  • Code Snippets: +
      +
    • +Prepending Offset to Prize Values: +

      + +
      +
      private void prependZeroes(ButtonPrize bp) {
      +    bp.setPrizeX(bp.getPrizeX() + 10000000000000L);
      +    bp.setPrizeY(bp.getPrizeY() + 10000000000000L);
      +}
      +
      +
    • + +
    • +Reusing Logic: +

      + +
      +
      for (ButtonPrize bp : data) {
      +    prependZeroes(bp);
      +    count_part2 += calculateSimultaneousEquations(bp.getButtonAX(), bp.getButtonAY(),
      +                                                  bp.getButtonBX(), bp.getButtonBY(),
      +                                                  bp.getPrizeX(), bp.getPrizeY());
      +}
      +
      +
    • +
  • + +
  • Challenges Faced: +
      +
    • Avoiding modification of original input logic while adding transformations.
    • +
    • Maintaining readability and modularity.
    • +
  • +
+
+
+
+
+

Day 14

+
+
+
+

Part 1: Simulating Robot Movement

+
+
    +
  • Concept: Simulating the movement of robots on a grid, wrapping their positions around the edges. +
      +
    • The grid has dimensions 101x103, and the robot positions wrap around when they move out of bounds.
    • +
    • +Wrapping is implemented using a helper method: +

      + +
      +
      public static int wrap(int value, int max) {
      +    return ((value % max) + max) % max;
      +}
      +
      +
    • +
  • + +
  • Key Learning: Efficiently handling movement on a toroidal grid (wrap-around behavior).
  • + +
  • Quadrant Assignment: +
      +
    • Robots are excluded from the middle row and column (x=50, y=51).
    • +
    • +Quadrant assignments are based on the x and y positions: +

      + +
      +
      if (x < 50 && y < 51) {
      +    quadrantCounts[0]++;  // Top-left
      +} else if (x >= 50 && y < 51) {
      +    quadrantCounts[1]++;  // Top-right
      +} else if (x < 50 && y >= 51) {
      +    quadrantCounts[2]++;  // Bottom-left
      +} else if (x >= 50 && y >= 51) {
      +    quadrantCounts[3]++;  // Bottom-right
      +}
      +
      +
    • +
  • + +
  • Safety Factor Calculation: +
      +
    • +The safety factor is the product of the number of robots in each quadrant: +

      + +
      +
      int safetyFactor = 1;
      +for (int count : quadrantCounts) {
      +    safetyFactor *= count;
      +}
      +
      +
    • +
  • +
+
+
+
+

Part 2: Identifying Patterns in Robot Positions

+
+
    +
  • Concept: Simulating grid states to find a specific pattern of robot alignment. +
      +
    • Robots move based on their initial velocity, and their positions are updated iteratively.
    • +
    • A grid is used to track robot positions, and columns are checked for specific patterns.
    • +
  • + +
  • Key Learning: Efficiently detecting consecutive robot positions in a grid column.
  • + +
  • Grid Initialization: +
      +
    • +A helper method initializes a 2D grid with given dimensions: +

      + +
      +
      private int[][] initializeGrid(int rows, int cols) {
      +    return new int[rows][cols];
      +}
      +
      +
    • +
  • + +
  • Position Calculation: +
      +
    • +New positions are computed using the robot’s velocity and current step, with wrapping: +

      + +
      +
      private int[] calculateNewPosition(int[] position, int[] velocity, int step, int[] tileDimensions) {
      +    return new int[] {
      +        (position[0] + step * (tileDimensions[0] + velocity[0])) % tileDimensions[0],
      +        (position[1] + step * (tileDimensions[1] + velocity[1])) % tileDimensions[1]
      +    };
      +}
      +
      +
    • +
  • + +
  • Pattern Detection: +
      +
    • +A helper method checks for consecutive robots in a column: +

      + +
      +
      private boolean hasConsecutiveInRow(List<Integer> positions, int requiredConsecutive) {
      +    Collections.sort(positions);
      +    int consecutiveCount = 0;
      +
      +    for (int i = 1; i < positions.size(); i++) {
      +        if (positions.get(i) - positions.get(i - 1) == 1) {
      +            consecutiveCount++;
      +            if (consecutiveCount >= requiredConsecutive) {
      +                return true;
      +            }
      +        } else {
      +            consecutiveCount = 0;
      +        }
      +    }
      +    return false;
      +}
      +
      +
    • +
  • + +
  • Stopping Condition: +
      +
    • Simulation stops when a column has at least requiredConsecutive robots aligned.
    • +
  • +
+ +

+— +

+ +

+### Supporting Components +

+ +
    +
  • Data Representation: +
      +
    • +PointAndVelocity encapsulates robot data, including position (PX, PY) and velocity (VX, VY): +

      + +
      +
      public static class PointAndVelocity {
      +    private int PX;
      +    private int PY;
      +    private int VX;
      +    private int VY;
      +
      +    // Getters and setters
      +    public int getVX() { return VX; }
      +    public void setVX(int vX) { VX = vX; }
      +    public int getVY() { return VY; }
      +    public void setVY(int vY) { VY = vY; }
      +    public int getPX() { return PX; }
      +    public void setPX(int pX) { PX = pX; }
      +    public int getPY() { return PY; }
      +    public void setPY(int pY) { PY = pY; }
      +}
      +
      +
    • +
  • + +
  • Input Parsing: +
      +
    • +Robot data is parsed from a file or input list. Each robot’s position and velocity are extracted: +

      + +
      +
      private List<PointAndVelocity> getPointAndVelocities() {
      +    List<PointAndVelocity> pvs = new ArrayList<>();
      +    try (BufferedReader reader = new BufferedReader(new FileReader(fetchFilePath()))) {
      +        String line;
      +        while ((line = reader.readLine()) != null) {
      +            String[] parts = line.split(" ");
      +            PointAndVelocity pav = new PointAndVelocity();
      +            pav.setPX(Integer.parseInt(parts[0].split(",")[0].replace("p=", "")));
      +            pav.setPY(Integer.parseInt(parts[0].split(",")[1].replace("p=", "")));
      +            pav.setVX(Integer.parseInt(parts[1].split(",")[0].replace("v=", "")));
      +            pav.setVY(Integer.parseInt(parts[1].split(",")[1].replace("v=", "")));
      +            pvs.add(pav);
      +        }
      +    } catch (IOException e) {
      +        throw new RuntimeException(e);
      +    }
      +    return pvs;
      +}
      +
      +
    • +
  • + +
  • Simulation Control: +
      +
    • Part 1 iterates for 100 steps, while Part 2 continues until a pattern is found or the maximum steps are reached.
    • +
  • +
+
+
+
+
+

+
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210001206-leetcode_notes.html b/output/20241210001206-leetcode_notes.html new file mode 100755 index 0000000..37dd650 --- /dev/null +++ b/output/20241210001206-leetcode_notes.html @@ -0,0 +1,297 @@ + + + + + + + +leetcode_notes + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210004247-emacs_moc.html b/output/20241210004247-emacs_moc.html new file mode 100755 index 0000000..d7a7421 --- /dev/null +++ b/output/20241210004247-emacs_moc.html @@ -0,0 +1,295 @@ + + + + + + + +emacs_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

emacsmoc

+ +
+

+The purpose of this file is to store things related to emacs (that being packages, or community projects that i stumble across). +

+ + + + + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210004247-emacs_stuff.html b/output/20241210004247-emacs_stuff.html new file mode 100755 index 0000000..0e6b8e2 --- /dev/null +++ b/output/20241210004247-emacs_stuff.html @@ -0,0 +1,297 @@ + + + + + + + +emacs_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

emacsmoc

+ +
+

+The purpose of this file is to store things related to emacs (that being packages, or community projects that i stumble across). +

+ +

+emacs-stuff-org-publish +

+ + + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210004329-org_roam.html b/output/20241210004329-org_roam.html new file mode 100755 index 0000000..adcee87 --- /dev/null +++ b/output/20241210004329-org_roam.html @@ -0,0 +1,304 @@ + + + + + + + +emacs-stuff-org-roam + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

emacs-stuff-org-roam

+ +
+

+This base will contain information on org roam. Although its closely linked to the emacs-stuff-gtd node, that one will contain articles, notes and videos related to how to get things done. +

+ +

+User Manual +

+ +

+Here is the current config in my init.el +

+
+
;;roam config
+(use-package org-roam
+  :ensure t
+  :custom
+  (org-roam-directory "~/master-folder/org_files/org_roam")
+  :bind (("C-c n l" . org-roam-buffer-toggle)
+         ("C-c n f" . org-roam-node-find)
+         ("C-c n i" . org-roam-node-insert))
+  :config
+  (org-roam-setup))
+
+
+ + + + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210004453-gtd.html b/output/20241210004453-gtd.html new file mode 100755 index 0000000..2da6199 --- /dev/null +++ b/output/20241210004453-gtd.html @@ -0,0 +1,273 @@ + + + + + + + +emacs-stuff-gtd + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

emacs-stuff-gtd

+ +
+
    +
  • article: gtd
  • +
+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210012703-fyp.html b/output/20241210012703-fyp.html new file mode 100755 index 0000000..ff169b1 --- /dev/null +++ b/output/20241210012703-fyp.html @@ -0,0 +1,306 @@ + + + + + + + +fyp + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

fyp

+ +
+

+In this file i will include things related to my final year project. +

+ +
    +
  • The idea:
  • +
+

+A web platform for users to take notes with an ai assistant +

+ +
    +
  • Migrating to cloud databse.
  • +
+

+I was originally intending to use AWS RDS with an e2c instance, but realised that the learning curve was too great, and that i needed a simpler solution. +On the <2024-12-09 Mon> I decided to try this: exporting the current vm i had running and run in on oracle cloud. +The results for this: +

+ +

+The UML for this project: umlfyp +@startuml +Alice -> Bob: Authentication Request +Bob –> Alice: Authentication Response +

+ +

+Alice -> Bob: Another authentication Request +Alice <– Bob: Another authentication Response +@enduml +

+ + +

+fyp-report-planning +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210152650-uni.html b/output/20241210152650-uni.html new file mode 100755 index 0000000..3f02252 --- /dev/null +++ b/output/20241210152650-uni.html @@ -0,0 +1,288 @@ + + + + + + + +uni_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210152650-uni_moc.html b/output/20241210152650-uni_moc.html new file mode 100755 index 0000000..93b54bd --- /dev/null +++ b/output/20241210152650-uni_moc.html @@ -0,0 +1,288 @@ + + + + + + + +uni_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210152713-tpis.html b/output/20241210152713-tpis.html new file mode 100755 index 0000000..ddfdcd0 --- /dev/null +++ b/output/20241210152713-tpis.html @@ -0,0 +1,276 @@ + + + + + + + +tpis + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

tpis

+ +
+

+Teaching Programming In School +

+ + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210232054-uml_fyp.html b/output/20241210232054-uml_fyp.html new file mode 100755 index 0000000..1b91784 --- /dev/null +++ b/output/20241210232054-uml_fyp.html @@ -0,0 +1,1260 @@ + + + + + + + +uml_fyp + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

umlfyp

+ +
+
+

Class diagram

+
+
+
+

class 2:

+
+

+@startuml +skinparam classAttributeIconSize 0 +skinparam packageStyle rectangle +skinparam linetype ortho +left to right direction +

+ +

+’ Entity Layer +rectangle “Entity Layer” as EntityLayer #E3F2FD { + class User { + +id: Long + +roles: Set<String> + +firstName: String + +lastName: String + +username: String + +password: String + +confirmPassword: String + +email: String + +phoneNumber: String + +picture: byte[] + } +

+ +

+class Workspace { + +id: Long + +name: String + +description: String + +fileCount: int + +noteCount: int + +lastAccessed: LocalDateTime + +dateCreated: LocalDateTime +} +

+ +

+class Library { + +id: Long + +name: String + +description: String + +dateCreated: LocalDateTime + +lastAccessed: LocalDateTime +} +

+ +

+class Page { + +id: Long + +name: String + +workspaceId: Long + +content: Text + +height: int + +width: int +} +

+ +

+class FileMetadata { + +id: Long + +fileUrl: String + +userId: String + +description: String + +fileData: byte[] + +fileName: String + +fileType: String +} +

+ +

+ class AiChat { + +id: Long + +name: String + +workspaceId: Long + +createdAt: LocalDateTime + +messages: List<AIChatMessage> + } +} +

+ +

+’ Repository Layer +rectangle “Repository Layer” as RepositoryLayer #E8F5E9 { + class AiChatRepository + class FileMetadataRepository + class LibraryRepository + class PageRepository + class UserRepository + class WorkspaceRepository + class RegisterRepository + class AuthRepository +} +

+ +

+’ Service Layer +rectangle “Service Layer” as ServiceLayer #FFF3E0 { + class AiChatService + class AuthService + class FileMetadataService + class LibraryService + class PageService + class RegisterService + class UserService + class WorkspaceService +} +

+ +

+’ Controller Layer +rectangle “Controller Layer” as ControllerLayer #F3E5F5 { + class AiChatController + class AiChatWebSocketController + class AuthController + class FileMetadataController + class LibraryController + class PageController + class RegisterController + class UserController + class WorkspaceController +} +

+ +

+’ External Python Microservice +rectangle “External NLP Module (Python FastAPI)” as ExternalNLP #FCE4EC { + class FastAPINLPServer { + +/extracttext + +/keywords + +/tfidfkeywords + +/summarize + +/ner + } +} +

+ + + +

+rectangle “Frontend Core” as FrontendCore { + class AboutComponent + class AccessibilityComponent + class ContactComponent + class ForgotPasswordComponent + class LoginComponent + class LoginService + class PrivacyComponent + class RegisterComponent + class RegisterService + class SecurityComponent + class TermsComponent +

+ +

+LoginComponent –> LoginService +RegisterComponent –> RegisterService +

+ +

+ LoginService ..> AuthController : REST + RegisterService ..> RegisterController : REST +} +

+ +

+rectangle “Frontend Entities” as FrontendEntities { + class AiChatComponent + class DashboardComponent + class DefaultLayoutComponent + class HomeComponent + class LibraryComponent + class ProfileComponent + class WorkspacePageComponent + class WorkspacesComponent +

+ +

+class AiChatServiceFE +class DashboardServiceFE +class LayoutServiceFE +class HomeServiceFE +class LibraryServiceFE +class ProfileServiceFE +class WorkspacePageServiceFE +class WorkspacesServiceFE +

+ +

+AiChatComponent –> AiChatServiceFE +DashboardComponent –> DashboardServiceFE +DefaultLayoutComponent –> LayoutServiceFE +DefaultLayoutComponent –> LoginComponent +DefaultLayoutComponent –> RegisterComponent +HomeComponent –> HomeServiceFE +LibraryComponent –> LibraryServiceFE +ProfileComponent –> ProfileServiceFE +WorkspacePageComponent –> WorkspacePageServiceFE +WorkspacesComponent –> WorkspacesServiceFE +

+ +

+ForgotPasswordComponent ..> UserController : REST +AiChatServiceFE ..> AiChatController : REST +AiChatServiceFE ..> AiChatWebSocketController : WebSocket +

+ +

+DashboardServiceFE ..> WorkspaceController : REST +DashboardServiceFE ..> PageController : REST +DashboardServiceFE ..> AiChatController : REST +

+ +

+LayoutServiceFE ..> UserController : REST +

+ +

+HomeServiceFE ..> AuthController : REST +

+ +

+LibraryServiceFE ..> LibraryController : REST +LibraryServiceFE ..> FileMetadataController : REST +

+ +

+ProfileServiceFE ..> UserController : REST +

+ +

+WorkspacePageServiceFE ..> PageController : REST +WorkspacePageServiceFE ..> FileMetadataController : REST +WorkspacePageServiceFE ..> AiChatController : REST +

+ +

+ WorkspacesServiceFE ..> WorkspaceController : REST + AboutComponent –> ContactComponent + AboutComponent –> TermsComponent + AboutComponent –> PrivacyComponent +} +

+ +

+class AngularClient +AngularClient –> FrontendCore +AngularClient –> FrontendEntities +AngularClient ..> FastAPINLPServer : REST +

+ + +

+’ Entity Relationships +User “1” –> “many” Library +User “1” –> “many” Workspace +Library “1” –> “many” Workspace +Library “1” –> “many” FileMetadata +Workspace “1” –> “many” Page +Workspace “1” –> “many” FileMetadata +Workspace “1” –> “many” AiChat +

+ +

+’ Controller → Service +AiChatController –> AiChatService +AiChatWebSocketController –> AiChatService +AuthController –> AuthService +FileMetadataController –> FileMetadataService +LibraryController –> LibraryService +PageController –> PageService +RegisterController –> RegisterService +UserController –> UserService +WorkspaceController –> WorkspaceService +

+ +

+’ Service → Repository +AiChatService –> AiChatRepository +AuthService –> AuthRepository +FileMetadataService –> FileMetadataRepository +LibraryService –> LibraryRepository +PageService –> PageRepository +RegisterService –> RegisterRepository +UserService –> UserRepository +WorkspaceService –> WorkspaceRepository +

+ +

+’ Repository → Entity +AiChatRepository –> AiChat +FileMetadataRepository –> FileMetadata +LibraryRepository –> Library +PageRepository –> Page +UserRepository –> User +WorkspaceRepository –> Workspace +RegisterRepository –> User +AuthRepository –> User +

+ +

+@enduml +

+
+
+
+

authentication sequence diagram:

+
+

+@startuml +title Full Authentication Flow - Registration to Secured Access +

+ +

+skinparam shadowing true +skinparam packageStyle rectangle +skinparam handwritten false +skinparam linetype polyline +skinparam ParticipantPadding 20 +skinparam maxMessageSize 150 +

+ +

+actor User +

+ +

+= Registration Process = +

+ +

+box “Client” #E3F2FD + participant UserClient as “User” +end box +

+ +

+box “Backend - Registration” #E8F5E9 + participant RegisterController + participant UserService +end box +

+ +

+UserClient -> RegisterController : POST /register\n(username, password, confirmPassword) +RegisterController -> RegisterController : Check if passwords match +alt Passwords do not match + RegisterController –> UserClient : 400 Bad Request (Passwords mismatch) + return +end +RegisterController -> RegisterController : Hash password (BCrypt) +RegisterController -> RegisterController : Load default profile image +RegisterController -> UserService : createUser(user) +RegisterController –> UserClient : 200 OK (User Created) +

+ +

+= Authentication Process = +

+ +

+box “Backend - Authentication” #FFF3E0 + participant AuthController + participant AuthenticationManager + participant JwtUtil +end box +

+ +

+UserClient -> AuthController : POST /auth/login\n(username, password) +AuthController -> AuthenticationManager : Authenticate credentials +alt Valid credentials + AuthController -> JwtUtil : generateToken(userDetails, userId) + AuthController –> UserClient : 200 OK + JWT +else Invalid credentials + AuthController –> UserClient : 401 Unauthorized + return +end +

+ +

+= Accessing a Protected API = +

+ +

+box “Security Filter Chain” #F3E5F5 + participant JwtRequestFilter + participant UserDetailsService + participant JwtUtilFilter as “JwtUtil” +end box +

+ +

+UserClient -> JwtRequestFilter : Request with Authorization header +JwtRequestFilter -> JwtUtilFilter : extractUsername(jwt) +JwtRequestFilter -> UserDetailsService : loadUserByUsername +JwtRequestFilter -> JwtUtilFilter : validateToken(jwt, userDetails) +alt Valid token + JwtRequestFilter -> SecurityContext : Set authentication +else Invalid token + JwtRequestFilter -> JwtRequestFilter : Log and skip authentication +end +JwtRequestFilter –> UserClient : Continue filter chain +

+ +

+= @JwtRequired Secured Method Access = +

+ +

+box “AOP - Method Security” #E1F5FE + participant JwtAspect + participant JwtUtilAspect as “JwtUtil” +end box +

+ +

+UserClient -> JwtAspect : Call method annotated with @JwtRequired +JwtAspect -> JwtAspect : Extract JWT from header +JwtAspect -> JwtUtilAspect : extractUsername(jwt) +JwtAspect -> SecurityContext : Get UserDetails +JwtAspect -> JwtUtilAspect : validateToken(jwt, userDetails) +alt Token valid and user matches + JwtAspect –> UserClient : Proceed to method execution +else Invalid/mismatched token + JwtAspect –> UserClient : Unauthorized exception + return +end +

+ +

+@enduml +

+
+
+
+

class

+
+

+@startuml +skinparam classAttributeIconSize 0 +skinparam packageStyle rectangle +

+ +

+package “High-Level Overview” { +

+ +

+’ Controller Layer +package “Controller Layer” { + class AiChatController + class AiChatWebSocketController + class AuthController + class FileMetadataController + class LibraryController + class PageController + class RegisterController + class UserController + class WorkspaceController +} +

+ +

+’ Service Layer +package “Service Layer” { + class AiChatService + class AuthService + class FileMetadataService + class LibraryService + class PageService + class RegisterService + class UserService + class WorkspaceService +} +

+ +

+’ Repository Layer +package “Repository Layer” { + class AiChatRepository + class FileMetadataRepository + class LibraryRepository + class PageRepository + class UserRepository + class WorkspaceRepository + class RegisterRepository + class AuthRepository +} +

+ +

+’ Entity Layer +package “Entity Layer” { +

+ +

+class User { + +id: Long + +roles: Set<String> + +firstName: String + +lastName: String + +username: String + +password: String + +confirmPassword: String + +email: String + +phoneNumber: String + +picture: byte[] +} +

+ +

+class Workspace { + +id: Long + +name: String + +description: String + +fileCount: int + +noteCount: int + +lastAccessed: LocalDateTime + +dateCreated: LocalDateTime +} +

+ +

+class Library { + +id: Long + +name: String + +description: String + +dateCreated: LocalDateTime + +lastAccessed: LocalDateTime +} +

+ +

+class Page { + +id: Long + +name: String + +workspaceId: Long + +content: Text + +height: int + +width: int +} +

+ +

+class FileMetadata { + +id: Long + +fileUrl: String + +userId: String + +description: String + +fileData: byte[] + +fileName: String + +fileType: String +} +

+ +

+ class AiChat { + +id: Long + +name: String + +workspaceId: Long + +createdAt: LocalDateTime + +messages: List<AIChatMessage> + } +} +

+ +

+’ Python NLP Microservice +package “External NLP Module (Python FastAPI)” { + class FastAPINLPServer { + +/extracttext + +/keywords + +/tfidfkeywords + +/summarize + +/ner + } +} +

+ +

+’ Entity Relationships +User “1” –> “many” Library +User “1” –> “many” Workspace +Library “1” –> “many” Workspace +Library “1” –> “many” FileMetadata +Workspace “1” –> “many” Page +Workspace “1” –> “many” FileMetadata +Workspace “1” –> “many” AiChat +

+ +

+’ Controller → Service +AiChatController –> AiChatService +AiChatWebSocketController –> AiChatService +AuthController –> AuthService +FileMetadataController –> FileMetadataService +LibraryController –> LibraryService +PageController –> PageService +RegisterController –> RegisterService +UserController –> UserService +WorkspaceController –> WorkspaceService +

+ +

+’ Service → Repository +AiChatService –> AiChatRepository +AuthService –> AuthRepository +FileMetadataService –> FileMetadataRepository +LibraryService –> LibraryRepository +PageService –> PageRepository +RegisterService –> RegisterRepository +UserService –> UserRepository +WorkspaceService –> WorkspaceRepository +

+ +

+’ Repository → Entity +AiChatRepository –> AiChat +FileMetadataRepository –> FileMetadata +LibraryRepository –> Library +PageRepository –> Page +UserRepository –> User +WorkspaceRepository –> Workspace +RegisterRepository –> User +AuthRepository –> User +

+ +

+’ Frontend → NLP Server +

+ +

+} +

+ +

+’ Frontend Component +package “Frontend” { + class AngularClient +} +

+ +

+’ Angular communicates with both backends +AngularClient ..> AiChatController : REST +AngularClient ..> AiChatWebSocketController : WebSocket +AngularClient ..> AuthController : REST +AngularClient ..> PageController : REST +AngularClient ..> FileMetadataController : REST +AngularClient ..> WorkspaceController : REST +AngularClient ..> LibraryController : REST +AngularClient ..> RegisterController : REST +AngularClient ..> UserController : REST +AngularClient ..> FastAPINLPServer : REST +

+ +

+@enduml +

+
+
+
+

client-server

+
+

+@startuml +!pragma layout smetana +

+ +

+actor User +

+ +

+package “Client Side (Angular)” { + [Angular App] as Frontend +} +

+ +

+package “Spring Boot Backend” { + [Auth Controller] + [Note Controller] + [NLP Proxy Service] + [Spring Boot App] as Backend +} +

+ +

+package “Database Layer” { + database “PostgreSQL Database” as DB +} +

+ +

+package “FastAPI NLP Server (Port 9010)” { + [FastAPI NLP Service] as NLP + [Summarisation Endpoint] as SumEndpoint + [Keyword Extraction] as KeywordEndpoint + [NER Endpoint] as NEREndpoint +} +

+ +

+package “External API” { + [OpenAI API] +} +

+ +

+’ Interactions +User –> Frontend : Uses Web Interface +Frontend –> Backend : REST API Calls +Backend –> [Auth Controller] : Handles Auth +Backend –> [Note Controller] : Handles Notes +Backend –> [NLP Proxy Service] : Handles NLP Requests +[Auth Controller] –> DB : Access users table +[Note Controller] –> DB : Access notes table +[NLP Proxy Service] –> NLP : HTTP (port 9010) +NLP –> SumEndpoint : /summarise +NLP –> KeywordEndpoint : /keywords +NLP –> NEREndpoint : /ner +SumEndpoint –> [OpenAI API] : API call for contextual help +

+ +

+note right of Frontend + Angular app includes: +

+
    +
  • Note Editor
  • +
  • Summary View
  • +
  • Keyword Panel
  • +
+

+end note +

+ +

+note right of Backend + Spring Boot includes: +

+
    +
  • Auth Controller
  • +
  • Note Controller
  • +
  • NLP Proxy Service (calls FastAPI)
  • +
+

+end note +

+ +

+note right of NLP + FastAPI exposes endpoints for: +

+
    +
  • Summarisation (Pegasus)
  • +
  • Keyword Extraction (TF-IDF, YAKE)
  • +
  • NER (spaCy)
  • +
+

+end note +@enduml +

+
+
+
+

high level:

+
+

+@startuml +skinparam componentStyle uml2 +skinparam packageStyle rectangle +

+ +

+package “Client (Frontend)” { + [Angular UI] +} +

+ +

+package “Java Backend (Spring Boot)” { + [REST API Controller Layer] + [WebSocket Controller] + [Service Layer] + [Repository Layer] + [JPA Entities] +} +

+ +

+package “Python NLP Service” { + [FastAPI Server] + [Summarizer (Pegasus)] + [Keyword Extractor (YAKE / TF-IDF)] + [NER (spaCy)] + [Extract Text (Canvas Object)] +} +

+ +

+package “External Services” { + [OpenAI API] + [PostgreSQL DB] +} +

+ +

+’ Communication Arrows +[Angular UI] –> [REST API Controller Layer] : REST API (JSON) +[Angular UI] –> [WebSocket Controller] : WebSocket +

+ +

+[REST API Controller Layer] –> [Service Layer] +[WebSocket Controller] –> [Service Layer] +[Service Layer] –> [Repository Layer] +[Repository Layer] ..> [JPA Entities] : uses +[Service Layer] –> [OpenAI API] : API calls +

+ +

+[Service Layer] –> [FastAPI Server] : REST (NLP Requests) +[FastAPI Server] –> [Summarizer (Pegasus)] +[FastAPI Server] –> [Keyword Extractor (YAKE / TF-IDF)] +[FastAPI Server] –> [NER (spaCy)] +[FastAPI Server] –> [Extract Text (Canvas Object)] +

+ +

+[Repository Layer] –> [PostgreSQL DB] : Hibernate ORM +@enduml +

+
+
+
+

title AI Chat + Workspace Workflow

+
+

+@startuml +title AI Chat + Workspace Workflow +

+ +

+skinparam shadowing true +skinparam packageStyle rectangle +skinparam handwritten false +skinparam linetype polyline +skinparam ParticipantPadding 20 +skinparam maxMessageSize 150 +

+ +

+actor User +

+ +

+= AI Chat Session Creation = +

+ +

+box “Client” #E3F2FD + participant AngularClient as “User” +end box +

+ +

+box “Backend - AI Chat” #E8F5E9 + participant AiChatController + participant AiChatService + participant AiChatRepository +end box +

+ +

+box “External NLP Service” #FCE4EC + participant FastAPINLPServer as “FastAPI NLP” +end box +

+ +

+User -> AngularClient : Open AI Chat page +AngularClient -> AiChatController : POST /ai-chat\n(chat metadata) +AiChatController -> AiChatService : createChat(chatDto) +AiChatService -> AiChatRepository : save(chat) +AiChatService –> AiChatController : chatId +AiChatController –> AngularClient : 200 OK + chatId +

+ +

+User -> AngularClient : Send message via WebSocket +AngularClient -> AiChatWebSocketController : message +AiChatWebSocketController -> AiChatService : handleMessage() +

+ +

+alt Message requires NLP + AiChatService -> FastAPINLPServer : POST /summarize or /ner + FastAPINLPServer –> AiChatService : NLP result +end +

+ +

+AiChatService -> AiChatRepository : update(chat with message) +AiChatWebSocketController –> AngularClient : Message response +

+ +

+= Workspace Creation = +

+ +

+box “Backend - Workspace” #FFF3E0 + participant WorkspaceController + participant WorkspaceService + participant WorkspaceRepository +end box +

+ +

+User -> AngularClient : Create Workspace +AngularClient -> WorkspaceController : POST /workspace\n(name, description) +WorkspaceController -> WorkspaceService : createWorkspace(dto) +WorkspaceService -> WorkspaceRepository : save(workspace) +WorkspaceService –> WorkspaceController : workspaceId +WorkspaceController –> AngularClient : 200 OK + workspaceId +

+ +

+@enduml +

+
+
+
+
+

Screenshots:

+
+
+
+

Draft 1:

+
+ +
+

draft1.png +

+
+ + + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241210233721-brain_moc.html b/output/20241210233721-brain_moc.html new file mode 100755 index 0000000..d90ed76 --- /dev/null +++ b/output/20241210233721-brain_moc.html @@ -0,0 +1,293 @@ + + + + + + + +Brain MOC + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241211161232- job_application_cover_letters.html b/output/20241211161232- job_application_cover_letters.html new file mode 100755 index 0000000..b170721 --- /dev/null +++ b/output/20241211161232- job_application_cover_letters.html @@ -0,0 +1,762 @@ + + + + + + + +job_application_cover_letters + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

jobapplicationcoverletters

+ +
+
+

Modules:

+
+

+1st year +

+
    +
  • Data structures and Algorithms
  • +
  • Object Oriented Programming
  • +
  • Mathematical and Logical foundations of computer science
  • +
  • Full stack software development
  • +
  • Artificial Intelligence 1
  • +
  • Theories of computation
  • +
+

+2nd year +

+
    +
  • Team Project (77%)
  • +
  • Security and Networks (72%)
  • +
  • Functional Programming (87%)
  • +
  • Software Engineering and Professional Practice (81%)
  • +
  • Artificial Intelligence 2 (75%)
  • +
  • Operating Systems and Systems Programming (66%)
  • +
+

+3rd Year +

+
    +
  • Final Year Project
  • +
  • Advanced Networking
  • +
  • Advanced Functional Programming
  • +
  • Intelligent Software Engineering
  • +
  • Teaching Computer Science in Schools
  • +
+ + +

+Mathematics A level: A +French A level: B +Business A level: A +

+ +

+Maths GCSE: 9 +English GCSE: 6 +

+
+
+
+

Stantec

+
+
+
+

Cover letter:

+
+

+File +CONTAINS SPELLING MISTAKES - USE BT ONE +I would firstly like to extend my gratidute for giving me the opportunity to apply for an amazing role. If you are looking for a passionate data analyst and problem solver with experience extending into software development, then I believe I’m the perfect candidate for the role. +

+ +

+Growing up, I have always been interested in two things: Tech and problem solving. My technical journey began when I joined the University Of Birmingham, wherein I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead, and resulted in a 14% increase in user satisfaction. In addition, I used Python for the visualization of data on a networking module and have been using PostgreSQL throughout my degree. +

+ +

+Upon inspecting the requirements from the description, I have listed below my top three skills which I believe would make me most suited for this role: +

+
    +
  • Data Analysis and Visualisation: I developed a Java based note taking application, where I used JavaFX and a database (PSQL).
  • + +
  • Database Management: Created and maintained databases using PostgreSQL for various projects, some were hosted locally, some on the cloud and some on virtual machines.
  • + +
  • Innovative Thinking: Currently integrating machine learning algorithms into a note taking platform tailored for neurodiverse students specifically.
  • +
+ +

+Stantec has a commitment to two main things which really resonate and encouraged me to apply: sustainability and innovation. The Surface Water Assessor and Flood Prediction Tools are innovations that really inspire a person, and it only encourages me more to use the knowledge I am fortunate to have gained to help and make meaningful impact to society. +

+ +

+I am enthusiastic about joining the graduate program; it is a core principle of mine that continous learning will propel one to unimaginable heights, and I firmly believe that Santec will be able to provice the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+ +

+Warm regards, +Zaine-Ul-Abideen Qayyum +

+ + +

+I am deeply drawn to the water sector because it sits at the intersection of environmental stewardship and technological innovation, offering a unique opportunity to address critical global challenges. With increasing droughts and floods revealing vulnerabilities in water systems, I am inspired by the chance to contribute to solutions that promote water conservation, resilience, and equitable access. Joining this sector allows me to apply my technical expertise in data analysis and machine learning to protect one of our most vital resources, ensuring sustainable and impactful outcomes for communities and future generations. +

+
+
+
+

Why are you interested in the sector stated above?

+
+

+What draws me to the water sector is the amount of possibilities there are when it comes to creating positive impact to society. I believe in environmental stewardship, and through the use of technology, this offers a unique chance to address critical global issues, and solve them as well! Joining this sector would allow me to grow as an individual, and to apply my technical skills and experience in data analysis and machine learning to ensure that impactful outcomes are achieved. +

+
+
+
+
+

Sinara

+
+
+
+

Use this section to describe your technical experience such as programming languages, operating systems, hardware, databases etc. Give some indication of your level of proficiency in each. Include particular reference to your skills in C#/C++ and Java.

+
+

+Technical Experience +

+ +

+C: Strong proficiency gained through academic projects focusing on operating systems and systems programming. I created a 3 tier TCP/IP client server CLI service as part of University project. C++: Moderate proficiency, developed through coursework and personal exploration of object oriented and systems programming. Currently learning more about this, I recently developped a c++ pomodorro CLI system (personal project). Java: Advanced expertise through academic projects, such as developing a note taking application (personal) using JavaFX and a database driven book catalog (University). This includes experience in object oriented programming and GUI development. TypeScript/Angular: Proficient in full stack development, notably using Angular for frontend development and integrating with Spring Boot backends. Used this for a web project that is now completed and using Spring boot with Typescript/Angular for a current web project. Databases PostgreSQL: Advanced proficiency demonstrated in team projects and personal development efforts, including a web application for football enthusiastic students (University Project) and a book catalog application. H2 Console: Experience in testing and managing in memory databases within Spring Boot applications. Operating Systems Linux: Competent in scripting and system management, with experience writing bash scripts and using Linux environments for development. I also use Linux as my daily driver, and I am getting more into emacs. +

+ + +

+What was the purpose of the program. What part did you play in its development? +

+ +

+Football Finder Web Application Purpose: The program was designed to help users locate and join local football matches based on their preferences, such as location, skill level, and availability. The goal was to increase engagement in local sports communities and make match organisation easier. My Role: As the team leader, I oversaw code commits, pull requests, and task allocations using a Kanban board. I actively contributed to both the frontend and backend, focusing on user interface enhancements and optimising the backend logic for booking pitches Lessons Learned: I improved my ability to lead a team and manage project workflows effectively. I strengthened my skills in user centered design, ensuring the interface met user expectations, this was done through collating feedback. I learned the importance of clear communication and fostering a supportive environment within the team. +

+ + +

+What steps did you take before starting to write code? +

+ +

+Before starting the Football Finder Web Application, I liaised with the team to define user requirements, focusing on features like location based match searches and skill level filtering. We researched existing solutions, identified gaps, and selected a tech stack of Angular, Spring Boot, and PostgreSQL. I created user personas, wireframes, and prototypes to visualise the UI and flow, while also designing the database schema (using JDL) and API endpoints. A Kanban board was established for task management, and we broke the project into sprints with clear milestones. Finally, we outlined a testing strategy, including unit, integration, and user acceptance testing, to ensure the application met user needs and functioned seamlessly. +

+ + +

+How was the software tested? +

+ +

+The Football Finder Web Application was tested using a strategy to ensure functionality and reliability. Unit tests were written for individual components and backend services to validate isolated functionality. To test API endpoints we used SwaggerUI. User acceptance testing involved gathering feedback from a small group of target users to evaluate the usability and effectiveness of the application. Automated tests were implemented for repetitive checks, and manual testing focused on edge cases, such as invalid input handling and network interruptions. Finally, the application was deployed in a staging environment to simulate real world usage and identify any final issues before production. +

+ + +

+What problems did you encounter and how did you deal with them? +

+ +

+During the development of the Football Finder Web Application, we encountered several challenges. One major issue was ensuring accurate location based match recommendations, which we resolved by integrating and testing multiple geolocation APIs to find the most reliable solution. Another problem was maintaining data consistency during simultaneous updates to the match database, which we addressed by implementing transaction management and locking mechanisms in PostgreSQL. Cross browser compatibility issues arose in the frontend, which we fixed by rigorously testing on different browsers and applying appropriate SCSS fixes (alot of global stylings had to be rewritten). Lastly, communication delays within the team occasionally slowed progress, so we introduced more frequent stand ups and better use of task management tools to improve collaboration and streamline workflows. +

+ + +

+With hindsight, what would you have done differently? +

+ +

+With hindsight, I would have allocated more time to user research and feedback during the initial planning stages to better align the application’s features with user needs. Additionally, I would have implemented our own automated deployment pipelines earlier to streamline the testing and staging process as opposed to using the one the University provided, allowing us to learn more about devops and have more control over the project. Lastly, setting clearer communication protocols from the outset could have minimised delays, ensuring smoother collaboration and faster resolution of blockers. +

+ +

+What are your personal career goals? +

+
    +
  • Develop expertise in full-stack development, machine learning, and cloud computing. - Contribute to open source projects (currently going into emacs and MELPA packages) - Lead impactful projects that give back to the community. - Take on leadership roles to guide teams in delivering applications and solutions.
  • +
+

+Please use this space to provide any other information you feel would support your application. For example: Other experience or awards, positions of responsibility, hobbies and interests. +

+
    +
  • I love language learning and reading literature in other languages. - I really enjoy reading about other people’s experiences with GTD (getting things done) and use these as inspiration for my own system - I am currently getting into embedded programming. - I am a regular gym goer and love cooking. - I also enjoy tinkering with cars and modding them.
  • +
+
+
+
+
+

BT

+
+
+
+

Cover Letter:

+
+

+file +Dear Hiring Manager, +

+ +

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I’m the perfect candidate for the role. +

+ +

+There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+ +

+Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at BT group, where challenges are primarily user centric. +

+ +

+What draws me most to BT group is their commitment to using technology to bring good to the community. This, I would say, is one of the reasons I decided to go into the field of tech, which was to help others. BT group achieves this in various ways, ranging from addressing climate change to enhancing cybersecurity. I would be really ecstatic to apply my skills in various programming languages and tools such as Git, Ansible, and Terraform, coupled with my foundational knowledge of cloud services like AWS and Oracle cloud to the mission of BT group, which is to develop high performance and well tested code to bring about a greater benefit to the community. +

+ +

+I am enthusiastic about joining the graduate program; it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that BT group will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+ +

+Warm regards, +Zaine-Ul-Abideen Qayyum +

+
+
+
+
+

Panoptech

+
+
+
+

Cover Letter:

+
+

+Dear Hiring Manager, +

+ +

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into DevOps, then I believe I’m the perfect candidate for the role. +

+ +

+There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+ + +

+In addition to my technical background, I have experience with DevOps tools, including Ansible, Docker, and Jenkins, gained through self learning and practical application. I am also familiar with bash scripting, which is something I find myself coming back to whenever I want to automate something; this I usually do in bash and python, occasionally, for no particular reason, I would use Haskell to write scripts. I am certain that these skills will allow me to support the development team in managing the DevOps toolchain. +

+ +

+I also use Linux as my daily drivers, I have dual booted quite a few machines, some running Ubuntu some running Mint. I also have experience in virutalisation software; this was when I needed to host a local database, hence I fired up a virtual machine running minimal Ubuntu and kept a PSQL server on there. +

+ +

+I am enthusiastic about joining the Panoptech; it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Panoptech will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+ +

+Warm regards, +Zaine-Ul-Abideen Qayyum +

+
+
+
+
+

buro happold

+
+

+file +

+
+
+

cl - SAME AS BT

+
+

+Dear Hiring Manager, +I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing +role. If you are looking for a passionate Digital Technologist and problem solver with experience +extending into other disciplines, then I believe I’m the perfect candidate for the role. +There are two things I have always been interested in growing up: Technology and Problem +solving. My technical journey began when I joined the University of Birmingham, where I have +developed solid foundations in data analysis, software development and problem solving. One +of the biggest projects I have worked on was a football finding web app which I was entrusted +to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, +Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising +data on a networking module, and for various scripting purposes. +Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to +students coming from lower socio-economic backgrounds, and who are neurodiverse. This +experience has taught me many things, two that are notable are communication and +adaptability. These two skills together have taught me the importance of understanding as well +as addressing challenges, which I believe will translate well at Buro Happold, where challenges +are primarily user centric. +What draws me most to Buro Happold is their commitment to using technology to bring good +to the community. This, I would say, is one of the reasons I decided to go into the field of tech, +which was to help others. Buro Happold achieves this in various ways, from designing modular +systems that reduce costs while enhancing the learning experience for institutions like Kuwait +University, to implementing advanced technologies at landmark sites like the Louvre Abu Dhabi, +ensuring seamless visitor experiences and operational efficiency. +I am enthusiastic about joining the company; it is a core principle of mine that continuous +learning will propel one to unimaginable heights, and I firmly believe that Buro Happold will be +able to provide the means to make that happen. Thank you for considering my application, I +look forward to discussing my candidacy further! +Warm regards, +Zaine-Ul-Abideen Qayyum +

+
+
+
+
+

Experian

+
+

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I’m the perfect candidate for the role. +

+ +

+There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction, this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+ +

+Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at Experian, where challenges are primarily user centric. +

+ +

+What draws me most to Experian is their commitment to using technology to bring good to the community. This, I would say, is one of the reasons I decided to go into the field of tech, which was to help others. Experian achieves this in various ways, ranging from addressing climate change to enhancing cybersecurity. I would be really ecstatic to apply my skills in various programming languages and tools such as Java, Angular/Typescript and git, coupled with my foundational knowledge of cloud services like AWS and Oracle cloud to the mission of Experian, which is to develop high performance and well tested code to bring about a greater benefit to the community. +

+ +

+I am enthusiastic about joining the graduate program, it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Experian will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+
+
+
+

Cambridge Consultants

+
+

+Dear Hiring Manager, +

+ + + +

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate embedded software engineer and problem solver with experience extending into DevOps and low-level programming, then I believe I’m the perfect candidate for the role. +

+ + + +

+There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+ + + +

+In addition to my technical background, I have experience with DevOps tools, including Ansible, Docker, and Jenkins, gained through self learning and practical application. I am also familiar with bash scripting, which is something I find myself coming back to whenever I want to automate something; this I usually do in bash and python, occasionally, for the purpose of challenging myself, I would use Haskell to write scripts. In addition, I write scripts that allow me to communicate with hardware connected to a raspberry Pi; whenever I have the free time, I dive into embedded programming as this is a huge interest of mine. I am certain that these skills will allow me to support the team in solving real client problems at Cambridge Consultants. +

+ + + +

+I also use Linux as my daily drivers, I have dual booted quite a few machines, some running Ubuntu some running Mint. I also have experience in virutalisation software; this was when I needed to host a local database, hence I fired up a virtual machine running minimal Ubuntu and kept a PSQL server on there. +

+ + + +

+I am enthusiastic about joining the Cambridge Consultants; it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Cambridge Consultants will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+ + + +

+Warm regards, +

+ +

+Zaine-Ul-Abideen Qayyum +

+
+
+
+

Adelphi Real World

+
+

+Dear Hiring Manager, +

+ +

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate problem solver with a strong foundation in data analysis and a drive to deliver precise and efficient solutions, I believe I am the ideal candidate for this role. +

+ +

+There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction, this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+ +

+Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at Adelphi, where challenges are primarily user centric. +

+ +

+What draws me most to Adelphi Real World is their commitment to leveraging real world data to improve healthcare outcomes. The mere prospect of contributing to this mission by using tools like SPSS, Confirmit, and Excel, and supporting fieldwork and data processing, aligns perfectly with my dream of using technology to help others. I would be really ecstatic to apply my analytical skills, programming knowledge, and meticulous attention to detail to bring about a greater benefit to Adelphi, the healthcare sector and the community. +

+ +

+I am enthusiastic about joining this esteemed organisation, it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Adelphi Real World will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+ +

+Warm regards, +

+ +

+Zaine-Ul-Abideen Qayyum +

+
+
+
+

Midland Heart

+
+

+Dear Hiring Manager, +

+ +

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate problem solver with a strong foundation in data analysis and a drive to deliver precise and efficient solutions, I believe I am the ideal candidate for this role. +

+ +

+There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction, this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+ +

+Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at Midland Heart, where challenges are primarily user centric. +

+ +

+What draws me most to Midland Heart is their commitment to leveraging real world data to improve tenancy outcomes. The mere prospect of contributing to this mission by using tools like Power Bi, Python, and Cloud Services, and supporting fieldwork and data processing, aligns perfectly with my dream of using technology to help others. I would be ecstatic to apply my analytical skills, programming knowledge, and meticulous attention to detail to bring about a greater benefit to Midland Heart, the housing sector and the community. +

+ +

+I am enthusiastic about joining this esteemed organisation, it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Midland Heart will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+ +

+Warm regards, +Zaine-Ul-Abideen Qayyum +

+
+
+
+

EDW

+
+

+Dear Hiring Manager, + +I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate Software Tester and problem solver with experience extending into other disciplines, then I believe I’m the perfect candidate for the role. +There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at EDW Technology, where challenges are primarily user centric. +What draws me most to EDW Technology is their commitment to using technology to bring good to the community. This, I would say, is one of the reasons I decided to go into the field of tech, which was to help others. EDW Technology achieves this in various ways, ranging from creating energy management tools to providing user focused solutions. I would be ecstatic to apply my skills in various programming languages and tools such as Java, Swagger, and Git, coupled with my foundational knowledge of cloud services like AWS and Oracle cloud to the mission of EDW Technology, which is to develop high performance and well tested code to bring about a greater benefit to the community. +I am enthusiastic about joining the graduate program; it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that EDW Technology will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! + +Warm regards, +Zaine-Ul-Abideen Qayyum +

+
+
+
+

DCA

+
+

+Dear Hiring Manager, + +I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I’m the perfect candidate for the role. +There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. I have also built a full stack NLP/AI powered note taking web application to address the issue of cognitive overload. +Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at DCA, where challenges are primarily user centric. +What draws me most to DCA is their commitment to using technology to bring good to the community. This, I would say, is one of the reasons I decided to go into the field of tech, which was to help others. DCA achieves this in various ways, ranging from addressing novel transport solutions to developing safety-critical medical devices. I would be really ecstatic to apply my skills in various programming languages and tools such as Git, Docker, and Nginx, coupled with my foundational knowledge of cloud services like AWS and Oracle cloud to the mission of DCA, which is to develop high performance and well tested code to bring about a greater benefit to the community +I am enthusiastic about joining the graduate program; it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that DCA will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! + +Warm regards, +Zaine-Ul-Abideen Qayyum +

+
+
+
+

emp

+
+

+Describe something you have done that you are proud of. (Word limit 250 words) +One of the proudest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. However, my proudest work to date was a full stack web application that utilises AI and NLP to reduce cognitive overload faced in students. This was an ongoing long-term project and has taken me 7 months to complete. I used Spring Boot, Angular/Typescript along with Python scripting. + +How can you demonstrate your current curiosity around technology to us? (Word Limit 250 words) +There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. I find myself more so immersed in technical related hobbies such as ‘ricing’ a Linux distro, configuration of Emacs, tinkering with embedded programming using Raspberry Pi. + +Can you describe to us a scenario where you have demonstrated either creativity, innovation or originality (Word Limit 250 words) +One of the most innovative projects I have worked on was my AI-assisted note-taking web application, designed to combat cognitive overload in students. The challenge was to create an intuitive system that could process and summarise lecture content efficiently while al-lowing students to interact with it seamlessly. I thus decided on using OpenAI’s API for basic requests (intelligence enhanced which allowed it to see what the user is doing through parsing the canvas object), natural language processing (NLP), integrating it with an Angular TypeScript frontend and a Spring Boot backend. +What made this project particularly creative was my decision to incorporate adaptive sum-marisation, meaning the AI tailors the level of detail in notes based on the user’s prefer-ences and previous study patterns. Unlike traditional note-taking applications, this one con-tinuously learns from user behavior, refining its output over time. Furthermore, I used YAKE and TF-IDF to extract keywords from the notes, as well as NER (named entity recognition). +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/20241211161232-applications.org~ b/output/20241211161232-applications.html similarity index 63% rename from 20241211161232-applications.org~ rename to output/20241211161232-applications.html index 649b5b9..777979a 100755 --- a/20241211161232-applications.org~ +++ b/output/20241211161232-applications.html @@ -1,146 +1,524 @@ -:PROPERTIES: -:ID: f9897f8e-2b63-4ad2-a55f-3787c4ac235f -:END: -#+title: Applications -#+filetags: :pre-career:applications: -#+STARTUP: overview + + + + + + + +job_application_cover_letters + + -* Modules: + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

jobapplicationcoverletters

+ +
+
+

Modules:

+
+

1st year -- Data structures and Algorithms -- Object Oriented Programming -- Mathematical and Logical foundations of computer science -- Full stack software development -- Artificial Intelligence 1 -- Theories of computation +

+
    +
  • Data structures and Algorithms
  • +
  • Object Oriented Programming
  • +
  • Mathematical and Logical foundations of computer science
  • +
  • Full stack software development
  • +
  • Artificial Intelligence 1
  • +
  • Theories of computation
  • +
+

2nd year -- Team Project (77%) -- Security and Networks (72%) -- Functional Programming (87%) -- Software Engineering and Professional Practice (81%) -- Artificial Intelligence 2 (75%) -- Operating Systems and Systems Programming (66%) +

+
    +
  • Team Project (77%)
  • +
  • Security and Networks (72%)
  • +
  • Functional Programming (87%)
  • +
  • Software Engineering and Professional Practice (81%)
  • +
  • Artificial Intelligence 2 (75%)
  • +
  • Operating Systems and Systems Programming (66%)
  • +
+

3rd Year -- Final Year Project -- Advanced Networking -- Advanced Functional Programming -- Intelligent Software Engineering -- Teaching Computer Science in Schools +

+
    +
  • Final Year Project
  • +
  • Advanced Networking
  • +
  • Advanced Functional Programming
  • +
  • Intelligent Software Engineering
  • +
  • Teaching Computer Science in Schools
  • +
+

Mathematics A level: A French A level: B Business A level: A +

+

Maths GCSE: 9 English GCSE: 6 +

+
+
+
+

Stantec

+
+
+
+

Cover letter:

+
+

+File +CONTAINS SPELLING MISTAKES - USE BT ONE +I would firstly like to extend my gratidute for giving me the opportunity to apply for an amazing role. If you are looking for a passionate data analyst and problem solver with experience extending into software development, then I believe I’m the perfect candidate for the role. +

-* Stantec -** Cover letter: -[[file:/home/zaine/master-folder/CV's/Cover Letter/Santec/Santec.pdf][File]] -*CONTAINS SPELLING MISTAKES - USE BT ONE* -I would firstly like to extend my gratidute for giving me the opportunity to apply for an amazing role. If you are looking for a passionate data analyst and problem solver with experience extending into software development, then I believe I'm the perfect candidate for the role. - +

Growing up, I have always been interested in two things: Tech and problem solving. My technical journey began when I joined the University Of Birmingham, wherein I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead, and resulted in a 14% increase in user satisfaction. In addition, I used Python for the visualization of data on a networking module and have been using PostgreSQL throughout my degree. +

+

Upon inspecting the requirements from the description, I have listed below my top three skills which I believe would make me most suited for this role: -- Data Analysis and Visualisation: I developed a Java based note taking application, where I used JavaFX and a database (PSQL). - -- Database Management: Created and maintained databases using PostgreSQL for various projects, some were hosted locally, some on the cloud and some on virtual machines. +

+
    +
  • Data Analysis and Visualisation: I developed a Java based note taking application, where I used JavaFX and a database (PSQL).
  • -- Innovative Thinking: Currently integrating machine learning algorithms into a note taking platform tailored for neurodiverse students specifically. +
  • Database Management: Created and maintained databases using PostgreSQL for various projects, some were hosted locally, some on the cloud and some on virtual machines.
  • +
  • Innovative Thinking: Currently integrating machine learning algorithms into a note taking platform tailored for neurodiverse students specifically.
  • +
+ +

Stantec has a commitment to two main things which really resonate and encouraged me to apply: sustainability and innovation. The Surface Water Assessor and Flood Prediction Tools are innovations that really inspire a person, and it only encourages me more to use the knowledge I am fortunate to have gained to help and make meaningful impact to society. +

+

I am enthusiastic about joining the graduate program; it is a core principle of mine that continous learning will propel one to unimaginable heights, and I firmly believe that Santec will be able to provice the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+

Warm regards, Zaine-Ul-Abideen Qayyum +

+

I am deeply drawn to the water sector because it sits at the intersection of environmental stewardship and technological innovation, offering a unique opportunity to address critical global challenges. With increasing droughts and floods revealing vulnerabilities in water systems, I am inspired by the chance to contribute to solutions that promote water conservation, resilience, and equitable access. Joining this sector allows me to apply my technical expertise in data analysis and machine learning to protect one of our most vital resources, ensuring sustainable and impactful outcomes for communities and future generations. - -** Why are you interested in the sector stated above? - +

+
+
+
+

Why are you interested in the sector stated above?

+
+

What draws me to the water sector is the amount of possibilities there are when it comes to creating positive impact to society. I believe in environmental stewardship, and through the use of technology, this offers a unique chance to address critical global issues, and solve them as well! Joining this sector would allow me to grow as an individual, and to apply my technical skills and experience in data analysis and machine learning to ensure that impactful outcomes are achieved. - -* Sinara -** Use this section to describe your technical experience such as programming languages, operating systems, hardware, databases etc. Give some indication of your level of proficiency in each. Include particular reference to your skills in C#/C++ and Java. +

+
+
+
+
+

Sinara

+
+
+
+

Use this section to describe your technical experience such as programming languages, operating systems, hardware, databases etc. Give some indication of your level of proficiency in each. Include particular reference to your skills in C#/C++ and Java.

+
+

Technical Experience +

+

C: Strong proficiency gained through academic projects focusing on operating systems and systems programming. I created a 3 tier TCP/IP client server CLI service as part of University project. C++: Moderate proficiency, developed through coursework and personal exploration of object oriented and systems programming. Currently learning more about this, I recently developped a c++ pomodorro CLI system (personal project). Java: Advanced expertise through academic projects, such as developing a note taking application (personal) using JavaFX and a database driven book catalog (University). This includes experience in object oriented programming and GUI development. TypeScript/Angular: Proficient in full stack development, notably using Angular for frontend development and integrating with Spring Boot backends. Used this for a web project that is now completed and using Spring boot with Typescript/Angular for a current web project. Databases PostgreSQL: Advanced proficiency demonstrated in team projects and personal development efforts, including a web application for football enthusiastic students (University Project) and a book catalog application. H2 Console: Experience in testing and managing in memory databases within Spring Boot applications. Operating Systems Linux: Competent in scripting and system management, with experience writing bash scripts and using Linux environments for development. I also use Linux as my daily driver, and I am getting more into emacs. +

+

What was the purpose of the program. What part did you play in its development? +

+

Football Finder Web Application Purpose: The program was designed to help users locate and join local football matches based on their preferences, such as location, skill level, and availability. The goal was to increase engagement in local sports communities and make match organisation easier. My Role: As the team leader, I oversaw code commits, pull requests, and task allocations using a Kanban board. I actively contributed to both the frontend and backend, focusing on user interface enhancements and optimising the backend logic for booking pitches Lessons Learned: I improved my ability to lead a team and manage project workflows effectively. I strengthened my skills in user centered design, ensuring the interface met user expectations, this was done through collating feedback. I learned the importance of clear communication and fostering a supportive environment within the team. +

+

What steps did you take before starting to write code? +

+

Before starting the Football Finder Web Application, I liaised with the team to define user requirements, focusing on features like location based match searches and skill level filtering. We researched existing solutions, identified gaps, and selected a tech stack of Angular, Spring Boot, and PostgreSQL. I created user personas, wireframes, and prototypes to visualise the UI and flow, while also designing the database schema (using JDL) and API endpoints. A Kanban board was established for task management, and we broke the project into sprints with clear milestones. Finally, we outlined a testing strategy, including unit, integration, and user acceptance testing, to ensure the application met user needs and functioned seamlessly. +

+

How was the software tested? +

+

The Football Finder Web Application was tested using a strategy to ensure functionality and reliability. Unit tests were written for individual components and backend services to validate isolated functionality. To test API endpoints we used SwaggerUI. User acceptance testing involved gathering feedback from a small group of target users to evaluate the usability and effectiveness of the application. Automated tests were implemented for repetitive checks, and manual testing focused on edge cases, such as invalid input handling and network interruptions. Finally, the application was deployed in a staging environment to simulate real world usage and identify any final issues before production. +

+

What problems did you encounter and how did you deal with them? +

+

During the development of the Football Finder Web Application, we encountered several challenges. One major issue was ensuring accurate location based match recommendations, which we resolved by integrating and testing multiple geolocation APIs to find the most reliable solution. Another problem was maintaining data consistency during simultaneous updates to the match database, which we addressed by implementing transaction management and locking mechanisms in PostgreSQL. Cross browser compatibility issues arose in the frontend, which we fixed by rigorously testing on different browsers and applying appropriate SCSS fixes (alot of global stylings had to be rewritten). Lastly, communication delays within the team occasionally slowed progress, so we introduced more frequent stand ups and better use of task management tools to improve collaboration and streamline workflows. +

+

With hindsight, what would you have done differently? +

-With hindsight, I would have allocated more time to user research and feedback during the initial planning stages to better align the application's features with user needs. Additionally, I would have implemented our own automated deployment pipelines earlier to streamline the testing and staging process as opposed to using the one the University provided, allowing us to learn more about devops and have more control over the project. Lastly, setting clearer communication protocols from the outset could have minimised delays, ensuring smoother collaboration and faster resolution of blockers. +

+With hindsight, I would have allocated more time to user research and feedback during the initial planning stages to better align the application’s features with user needs. Additionally, I would have implemented our own automated deployment pipelines earlier to streamline the testing and staging process as opposed to using the one the University provided, allowing us to learn more about devops and have more control over the project. Lastly, setting clearer communication protocols from the outset could have minimised delays, ensuring smoother collaboration and faster resolution of blockers. +

+

What are your personal career goals? -- Develop expertise in full-stack development, machine learning, and cloud computing. - Contribute to open source projects (currently going into emacs and MELPA packages) - Lead impactful projects that give back to the community. - Take on leadership roles to guide teams in delivering applications and solutions. +

+
    +
  • Develop expertise in full-stack development, machine learning, and cloud computing. - Contribute to open source projects (currently going into emacs and MELPA packages) - Lead impactful projects that give back to the community. - Take on leadership roles to guide teams in delivering applications and solutions.
  • +
+

Please use this space to provide any other information you feel would support your application. For example: Other experience or awards, positions of responsibility, hobbies and interests. -- I love language learning and reading literature in other languages. - I really enjoy reading about other people's experiences with GTD (getting things done) and use these as inspiration for my own system - I am currently getting into embedded programming. - I am a regular gym goer and love cooking. - I also enjoy tinkering with cars and modding them. -* BT -** Cover Letter: -[[file:~/master-folder/CV's/Cover Letter/btgroup/BT_group_cl.pdf][file]] +

+
    +
  • I love language learning and reading literature in other languages. - I really enjoy reading about other people’s experiences with GTD (getting things done) and use these as inspiration for my own system - I am currently getting into embedded programming. - I am a regular gym goer and love cooking. - I also enjoy tinkering with cars and modding them.
  • +
+
+
+
+
+

BT

+
+
+
+

Cover Letter:

+
+

+file Dear Hiring Manager, +

-I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I'm the perfect candidate for the role. +

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I’m the perfect candidate for the role. +

+

There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+

Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at BT group, where challenges are primarily user centric. +

+

What draws me most to BT group is their commitment to using technology to bring good to the community. This, I would say, is one of the reasons I decided to go into the field of tech, which was to help others. BT group achieves this in various ways, ranging from addressing climate change to enhancing cybersecurity. I would be really ecstatic to apply my skills in various programming languages and tools such as Git, Ansible, and Terraform, coupled with my foundational knowledge of cloud services like AWS and Oracle cloud to the mission of BT group, which is to develop high performance and well tested code to bring about a greater benefit to the community. +

+

I am enthusiastic about joining the graduate program; it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that BT group will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+

Warm regards, Zaine-Ul-Abideen Qayyum -* Panoptech -** Cover Letter: +

+
+
+
+
+

Panoptech

+
+
+
+

Cover Letter:

+
+

Dear Hiring Manager, +

-I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into DevOps, then I believe I'm the perfect candidate for the role. +

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into DevOps, then I believe I’m the perfect candidate for the role. +

+

There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+

In addition to my technical background, I have experience with DevOps tools, including Ansible, Docker, and Jenkins, gained through self learning and practical application. I am also familiar with bash scripting, which is something I find myself coming back to whenever I want to automate something; this I usually do in bash and python, occasionally, for no particular reason, I would use Haskell to write scripts. I am certain that these skills will allow me to support the development team in managing the DevOps toolchain. +

+

I also use Linux as my daily drivers, I have dual booted quite a few machines, some running Ubuntu some running Mint. I also have experience in virutalisation software; this was when I needed to host a local database, hence I fired up a virtual machine running minimal Ubuntu and kept a PSQL server on there. +

+

I am enthusiastic about joining the Panoptech; it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Panoptech will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+

Warm regards, Zaine-Ul-Abideen Qayyum -* buro happold -[[file:~/master-folder/CV's/Cover Letter/buro_happald/Buro_Happold_CL.pdf][file]] -** cl - SAME AS BT +

+
+
+
+
+

buro happold

+
+

+file +

+
+
+

cl - SAME AS BT

+
+

Dear Hiring Manager, I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate Digital Technologist and problem solver with experience -extending into other disciplines, then I believe I'm the perfect candidate for the role. +extending into other disciplines, then I believe I’m the perfect candidate for the role. There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One @@ -166,79 +544,158 @@ able to provide the means to make that happen. Thank you for considering my appl look forward to discussing my candidacy further! Warm regards, Zaine-Ul-Abideen Qayyum -* Experian -I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I'm the perfect candidate for the role. +

+
+
+
+
+

Experian

+
+

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I’m the perfect candidate for the role. +

+

There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction, this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+

Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at Experian, where challenges are primarily user centric. +

+

What draws me most to Experian is their commitment to using technology to bring good to the community. This, I would say, is one of the reasons I decided to go into the field of tech, which was to help others. Experian achieves this in various ways, ranging from addressing climate change to enhancing cybersecurity. I would be really ecstatic to apply my skills in various programming languages and tools such as Java, Angular/Typescript and git, coupled with my foundational knowledge of cloud services like AWS and Oracle cloud to the mission of Experian, which is to develop high performance and well tested code to bring about a greater benefit to the community. +

+

I am enthusiastic about joining the graduate program, it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Experian will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! -* Cambridge Consultants +

+
+
+
+

Cambridge Consultants

+
+

Dear Hiring Manager, +

- -I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate embedded software engineer and problem solver with experience extending into DevOps and low-level programming, then I believe I'm the perfect candidate for the role. - +

+I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate embedded software engineer and problem solver with experience extending into DevOps and low-level programming, then I believe I’m the perfect candidate for the role. +

+ + +

There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

- + +

In addition to my technical background, I have experience with DevOps tools, including Ansible, Docker, and Jenkins, gained through self learning and practical application. I am also familiar with bash scripting, which is something I find myself coming back to whenever I want to automate something; this I usually do in bash and python, occasionally, for the purpose of challenging myself, I would use Haskell to write scripts. In addition, I write scripts that allow me to communicate with hardware connected to a raspberry Pi; whenever I have the free time, I dive into embedded programming as this is a huge interest of mine. I am certain that these skills will allow me to support the team in solving real client problems at Cambridge Consultants. +

- + +

I also use Linux as my daily drivers, I have dual booted quite a few machines, some running Ubuntu some running Mint. I also have experience in virutalisation software; this was when I needed to host a local database, hence I fired up a virtual machine running minimal Ubuntu and kept a PSQL server on there. +

- + +

I am enthusiastic about joining the Cambridge Consultants; it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Cambridge Consultants will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

- + +

Warm regards, +

+

Zaine-Ul-Abideen Qayyum -* Adelphi Real World +

+
+
+
+

Adelphi Real World

+
+

Dear Hiring Manager, +

+

I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate problem solver with a strong foundation in data analysis and a drive to deliver precise and efficient solutions, I believe I am the ideal candidate for this role. +

+

There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction, this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+

Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at Adelphi, where challenges are primarily user centric. +

+

What draws me most to Adelphi Real World is their commitment to leveraging real world data to improve healthcare outcomes. The mere prospect of contributing to this mission by using tools like SPSS, Confirmit, and Excel, and supporting fieldwork and data processing, aligns perfectly with my dream of using technology to help others. I would be really ecstatic to apply my analytical skills, programming knowledge, and meticulous attention to detail to bring about a greater benefit to Adelphi, the healthcare sector and the community. +

+

I am enthusiastic about joining this esteemed organisation, it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Adelphi Real World will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+

Warm regards, +

+

Zaine-Ul-Abideen Qayyum -* Midland Heart +

+
+
+
+

Midland Heart

+
+

Dear Hiring Manager, +

+

I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate problem solver with a strong foundation in data analysis and a drive to deliver precise and efficient solutions, I believe I am the ideal candidate for this role. +

+

There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction, this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. +

+

Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at Midland Heart, where challenges are primarily user centric. +

+

What draws me most to Midland Heart is their commitment to leveraging real world data to improve tenancy outcomes. The mere prospect of contributing to this mission by using tools like Power Bi, Python, and Cloud Services, and supporting fieldwork and data processing, aligns perfectly with my dream of using technology to help others. I would be ecstatic to apply my analytical skills, programming knowledge, and meticulous attention to detail to bring about a greater benefit to Midland Heart, the housing sector and the community. +

+

I am enthusiastic about joining this esteemed organisation, it is a core principle of mine that continuous learning will propel one to unimaginable heights, and I firmly believe that Midland Heart will be able to provide the means to make that happen. Thank you for considering my application, I look forward to discussing my candidacy further! +

+

Warm regards, Zaine-Ul-Abideen Qayyum -* EDW +

+
+
+
+

EDW

+
+

Dear Hiring Manager, -I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate Software Tester and problem solver with experience extending into other disciplines, then I believe I'm the perfect candidate for the role. +I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate Software Tester and problem solver with experience extending into other disciplines, then I believe I’m the perfect candidate for the role. There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at EDW Technology, where challenges are primarily user centric. What draws me most to EDW Technology is their commitment to using technology to bring good to the community. This, I would say, is one of the reasons I decided to go into the field of tech, which was to help others. EDW Technology achieves this in various ways, ranging from creating energy management tools to providing user focused solutions. I would be ecstatic to apply my skills in various programming languages and tools such as Java, Swagger, and Git, coupled with my foundational knowledge of cloud services like AWS and Oracle cloud to the mission of EDW Technology, which is to develop high performance and well tested code to bring about a greater benefit to the community. @@ -246,10 +703,16 @@ I am enthusiastic about joining the graduate program; it is a core principle of Warm regards, Zaine-Ul-Abideen Qayyum -* DCA +

+
+
+
+

DCA

+
+

Dear Hiring Manager, -I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I'm the perfect candidate for the role. +I would firstly like to extend my gratitude for giving me the opportunity to apply for an amazing role. If you are looking for a passionate software engineer and problem solver with experience extending into other disciplines, then I believe I’m the perfect candidate for the role. There are two things I have always been interested in growing up: Technology and Problem solving. My technical journey began when I joined the University of Birmingham, where I have developed solid foundations in data analysis, software development and problem solving. One of the biggest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. In addition, I find myself often using Python for visualising data on a networking module, and for various scripting purposes. I have also built a full stack NLP/AI powered note taking web application to address the issue of cognitive overload. Beyond this, I also work as a tutor at Tutors United, where I teach Mathematics and English to students coming from lower socio-economic backgrounds, and who are neurodiverse. This experience has taught me many things, two that are notable are communication and adaptability. These two skills together have taught me the importance of understanding as well as addressing challenges, which I believe will translate well at DCA, where challenges are primarily user centric. What draws me most to DCA is their commitment to using technology to bring good to the community. This, I would say, is one of the reasons I decided to go into the field of tech, which was to help others. DCA achieves this in various ways, ranging from addressing novel transport solutions to developing safety-critical medical devices. I would be really ecstatic to apply my skills in various programming languages and tools such as Git, Docker, and Nginx, coupled with my foundational knowledge of cloud services like AWS and Oracle cloud to the mission of DCA, which is to develop high performance and well tested code to bring about a greater benefit to the community @@ -257,7 +720,13 @@ I am enthusiastic about joining the graduate program; it is a core principle of Warm regards, Zaine-Ul-Abideen Qayyum -* emp +

+
+
+
+

emp

+
+

Describe something you have done that you are proud of. (Word limit 250 words) One of the proudest projects I have worked on was a football finding web app which I was entrusted to lead and resulted in a 14% increase in user satisfaction; this was built using Java Spring Boot, Typescript/Angular and PostgreSQL. However, my proudest work to date was a full stack web application that utilises AI and NLP to reduce cognitive overload faced in students. This was an ongoing long-term project and has taken me 7 months to complete. I used Spring Boot, Angular/Typescript along with Python scripting. @@ -267,3 +736,27 @@ There are two things I have always been interested in growing up: Technology and Can you describe to us a scenario where you have demonstrated either creativity, innovation or originality (Word Limit 250 words) One of the most innovative projects I have worked on was my AI-assisted note-taking web application, designed to combat cognitive overload in students. The challenge was to create an intuitive system that could process and summarise lecture content efficiently while al-lowing students to interact with it seamlessly. I thus decided on using OpenAI’s API for basic requests (intelligence enhanced which allowed it to see what the user is doing through parsing the canvas object), natural language processing (NLP), integrating it with an Angular TypeScript frontend and a Spring Boot backend. What made this project particularly creative was my decision to incorporate adaptive sum-marisation, meaning the AI tailors the level of detail in notes based on the user’s prefer-ences and previous study patterns. Unlike traditional note-taking applications, this one con-tinuously learns from user behavior, refining its output over time. Furthermore, I used YAKE and TF-IDF to extract keywords from the notes, as well as NER (named entity recognition). +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241212013207-haskell_notes.html b/output/20241212013207-haskell_notes.html new file mode 100755 index 0000000..5cf71d6 --- /dev/null +++ b/output/20241212013207-haskell_notes.html @@ -0,0 +1,356 @@ + + + + + + + +haskell_notes + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

haskellnotes

+ +
+
+

Haskell Notes

+
+
+
+

Introduction

+
+

+Haskell is a purely functional programming language with strong static typing and lazyevaluation . It was named after the logician Haskell Curry. It is widely used in academia and industry for teaching and research as well as for writing industrial applications. +

+
+
+
+

Features of Haskell

+
+
    +
  • Purely Functional: Functions in Haskell are pure, meaning they don’t have side effects.
  • +
  • Strong Static Typing: Types are checked at compile time, reducing runtime errors.
  • +
  • Lazy Evaluation: Expressions are not evaluated until their values are needed.
  • +
  • Type Inference: Haskell can automatically infer types, making the code more concise.
  • +
  • Concise Syntax: Haskell’s syntax is clean and concise, making it easy to read and write.
  • +
+
+
+
+

Getting Started with Haskell

+
+
    +
  • Installation: To get started with Haskell, you need to install the Glasgow Haskell Compiler (GHC). You can download it from Download
  • +
  • Basic Syntax: +
      +
    • Comments: Single line comments start with `–`, and multi-line comments are enclosed within `{-` and `-}`.
    • +
    • Modules: Code is organized into modules, which can be imported using the `import` keyword.
    • +
  • +
+
+
+
+

Basic Concepts

+
+
    +
  • +Functions: Functions are first-class citizens in Haskell. A function definition looks like this: +

    +
    +
    add :: Int -> Int -> Int
    +add x y = x + y
    +
    +
    +

    +This defines a function add that takes two integers and returns their sum. +

  • + +
  • Types and Type Classes: Types are a crucial part of Haskell. You define types using the `data` keyword, and type classes using the `class` keyword.
  • +
+
+
+
+

Example

+
+

+Here’s a simple example to demonstrate some basic features of Haskell: +

+
+
-- Define a new data type
+data Shape = Circle Float | Rectangle Float Float
+
+-- Define a function to calculate the area of a shape
+area :: Shape -> Float
+area (Circle r) = pi * r^2
+area (Rectangle l w) = l * w
+
+-- Example usage
+main = do
+  let c = Circle 10
+  let r = Rectangle 5 7
+  print (area c)
+  print (area r)
+
+
+ +

+This example defines a new data type Shape with two constructors, Circle and Rectangle, and a function area that calculates the area of a shape. +

+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241212013902-lazy_evaluation.html b/output/20241212013902-lazy_evaluation.html new file mode 100755 index 0000000..7e4c647 --- /dev/null +++ b/output/20241212013902-lazy_evaluation.html @@ -0,0 +1,276 @@ + + + + + + + +lazy_evaluation + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

lazyevaluation

+ +
+

+See this article: Lazy eval +

+ +

+There are two types of evaluation: strict and lazy +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241213005125-c_notes.html b/output/20241213005125-c_notes.html new file mode 100755 index 0000000..e075113 --- /dev/null +++ b/output/20241213005125-c_notes.html @@ -0,0 +1,276 @@ + + + + + + + +c_notes + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241213005156-socket_programming_in_c.html b/output/20241213005156-socket_programming_in_c.html new file mode 100755 index 0000000..78433c2 --- /dev/null +++ b/output/20241213005156-socket_programming_in_c.html @@ -0,0 +1,322 @@ + + + + + + + +socket_programming_in_c + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

socketprogramminginc

+ +
+

+From: Web Link +

+
+

Steps:

+
+

+The steps involved in establishing a socket on the client side are as follows: +

+ +
    +
  1. Create a socket with the socket() system call
  2. +
  3. Connect the socket to the address of the server using the connect() system call
  4. +
  5. Send and receive data. There are a number of ways to do this, but the simplest is to use the read() and write() system calls.
  6. +
+ +

+The steps involved in establishing a socket on the server side are as follows: +

+ +
    +
  1. Create a socket with the socket() system call
  2. +
  3. Bind the socket to an address using the bind() system call. For a server socket on the Internet, an address consists of a port number on the host machine.
  4. +
  5. Listen for connections with the listen() system call
  6. +
  7. Accept a connection with the accept() system call. This call typically blocks until a client connects with the server.
  8. +
  9. Send and receive data
  10. +
+
+
+
+

Socket types:

+
+

+When you create a socket, you must specify the address domain and the socket type, the client and server can only communicate if they are of the same type and in the same domain. +

+ +

+The two most common address domains: +

+
    +
  • unix domain (they share common file system)
  • +
  • internet domain
  • +
+ +

+The two most common socket types: +

+
    +
  • stream sockets (continuous stream of characters) - uses tcp
  • +
  • datagram sockets (reads the entire messages at once) - uses dp
  • +
+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241217234535-web_port_notes.html b/output/20241217234535-web_port_notes.html new file mode 100755 index 0000000..dba3be5 --- /dev/null +++ b/output/20241217234535-web_port_notes.html @@ -0,0 +1,832 @@ + + + + + + + +web-port-notes + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

web-port-notes

+ +
+
+

<2025-11-06 Thu> old sitemap for blogs:

+
+

+(defun zz/2025-sitemap (title list) + “sitemap that lists 2025 links as bullet points with dates and tags.” + (concat + “#+TITLE: ” title “\n” + “#+OPTIONS: toc:nil num:nil \n\n” + “See the categories: Categories\n\n” + “* 2025:\n” + (mapconcat + (lambda (entry) + (let* ((link (car entry)) + ;; extract relative file name from the link + (filename (if (string-match “\\[\\[file:\\([^]]+\\)\\]” link) + (match-string 1 link) + link)) + (full-path (expand-file-name filename “~/master-folder/orgfiles/orgweb/blogs/2025/”)) + (date-str “no date”) + (tags-str “”)) + ;; Get publish date + (let ((date (org-publish-find-date full-path org-publish-project-alist))) + (when date + (setq date-str (format-time-string “%d-%m-%Y %H:%M” date)))) + ;; Get FILETAGS from file buffer + (when (file-exists-p full-path) + (with-temp-buffer + (insert-file-contents full-path) + (org-mode) + (let* ((tags (cadr (assoc “FILETAGS” (org-collect-keywords ’(“FILETAGS”)))))) + (when tags + (setq tags-str (mapconcat (lambda (tag) + (format “ %s ” tag tag)) + (split-string tags “:” t) ;; <- Splits by “:” and removes empty strings + “ ”)))))) + ;; Final line output + (format “- %s %s %s” link date-str tags-str))) + (cdr list) + “\n”))) +

+
+
+
+

Footnotes and sidenotes

+
+

+Here is a list of macros: +

+ +
+
(setq org-export-global-macros
+      (append
+       '(
+
+     ("sidenote"
+      . "@@html:<label for=\"sn$1\" class=\"margin-toggle sidenote-number\"></label><input type=\"checkbox\" id=\"sn$1\" class=\"margin-toggle\"/><span class=\"sidenote\">$2</span>@@")
+
+     ("epigraph"  . "@@html:<div class=\"epigraph\"><blockquote>$1<footer>$2</footer></blockquote></div>@@")
+
+     ("epigraph_single"  . "@@html:<div class=\"epigraph\"><blockquote>$1</blockquote></div>@@")
+
+     ("epigraph3" . "@@html:<div class=\"epigraph\"><blockquote>$1<footer>$2, <cite>$3</cite></footer></blockquote></div>@@")
+
+     ("kbd"       . "@@html:<kbd>$1</kbd>@@@@latex:\\texttt{$1}@@")
+
+     ("margimg"
+      . "@@html:<aside class=\"marginnote\"><figure class=\"mn-fig\"><img src=\"$1\" alt=\"$2\" class=\"mn-img\" loading=\"lazy\" decoding=\"async\"/>$3</figure></aside>@@")
+
+
+         org-export-global-macros)))
+
+
+
+
+ +

+They are used as follows: +

+ +

+1 +

+ +

+Use footnotes as follows: +

+
+
+
+

Blorgz

+
+
+
+

ideas:

+
+

+### Personal Growth & Self-Improvement +

+
    +
  1. The Power of Journaling: How Writing Every Day Can Transform Your Life +
      +
    • Exploring the benefits of journaling for mental clarity, goal setting, and emotional processing.
    • +
  2. + +
  3. The Science of Happiness: What Really Makes Us Happy? +
      +
    • A deep dive into the psychology and neuroscience of happiness and how to apply it to daily life.
    • +
  4. + +
  5. Building a Growth Mindset: How to Shift from a Fixed to a Growth-Oriented Outlook +
      +
    • Practical steps and insights on adopting a growth mindset for personal and professional development.
    • +
  6. + +
  7. How to Set and Achieve Long-Term Goals +
      +
    • A structured approach to setting clear, actionable goals and staying motivated over time.
    • +
  8. + +
  9. Embracing Failure: How to Learn and Grow from Setbacks +
      +
    • Understanding the importance of failure and how to reframe it as an opportunity for growth.
    • +
  10. +
+ +

+### Mental Health & Well-being +

+
    +
  1. Dealing with Anxiety: Techniques to Cope and Build Resilience +
      +
    • Mindfulness, cognitive-behavioral strategies, and lifestyle changes that help manage anxiety.
    • +
  2. + +
  3. How to Build Emotional Intelligence (EQ) for Better Relationships +
      +
    • Tips for recognizing, understanding, and managing your own emotions, and how to navigate others’ emotions.
    • +
  4. + +
  5. The Importance of Sleep for Mental and Physical Health +
      +
    • Why sleep is crucial for your overall well-being, along with tips for improving your sleep hygiene.
    • +
  6. + +
  7. How to Practice Self-Compassion and Be Kinder to Yourself +
      +
    • Exploring the importance of self-compassion and how to stop being your own harshest critic.
    • +
  8. + +
  9. Breaking the Cycle of Negative Self-Talk +
      +
    • How to identify, challenge, and reframe the negative thoughts that hold you back.
    • +
  10. +
+ +

+### Lifestyle & Balance +

+
    +
  1. Minimalism: How Decluttering Your Life Can Lead to More Freedom +
      +
    • A guide to adopting a minimalist lifestyle, including decluttering your home, work, and digital space.
    • +
  2. + +
  3. The Importance of Work-Life Balance and How to Achieve It +
      +
    • Strategies for maintaining a healthy balance between your career, personal life, and self-care.
    • +
  4. + +
  5. How to Create a Morning Routine That Sets You Up for Success +
      +
    • A step-by-step guide to designing a morning routine that boosts your productivity and mindset.
    • +
  6. + +
  7. The Power of Saying ’No’: Setting Boundaries to Protect Your Time and Energy +
      +
    • How to say no gracefully and why it’s important for your mental health and well-being.
    • +
  8. + +
  9. Building Strong Relationships: The Art of Effective Communication +
      +
    • How to communicate more clearly and empathetically in both personal and professional settings.
    • +
  10. +
+ +

+### Life Philosophy & Reflection +

+
    +
  1. Living with Purpose: How to Find Your Life’s Meaning +
      +
    • A philosophical exploration of how to align your actions with your core values and life purpose.
    • +
  2. + +
  3. Stoicism for Modern Life: How Ancient Philosophy Can Help You Thrive Today +
      +
    • Applying Stoic principles to improve resilience, clarity, and calm in the face of challenges.
    • +
  4. + +
  5. The Concept of ‘Ikigai’: Finding Joy and Fulfillment in Your Work and Life +
      +
    • Exploring the Japanese philosophy of Ikigai and how to apply it for greater fulfillment and balance.
    • +
  6. + +
  7. How to Handle Life Transitions: Moving Forward with Confidence +
      +
    • Tips for navigating big life changes, from job shifts to personal transformations.
    • +
  8. + +
  9. The Importance of Gratitude: How to Cultivate a Daily Practice for a More Positive Life +
      +
    • The science behind gratitude and how to incorporate it into your daily life to increase happiness.
    • +
  10. +
+ +

+### Productivity in Daily Life +

+
    +
  1. Time Management for Busy People: How to Get More Done Without Burning Out +
      +
    • Techniques like time blocking, prioritization, and task batching to make your day more productive.
    • +
  2. + +
  3. Overcoming Overwhelm: How to Tackle Large Tasks Without Feeling Stressed +
      +
    • Breaking down big tasks into manageable chunks to prevent feelings of stress or burnout.
    • +
  4. + +
  5. The Importance of Play and Fun in a Productive Life +
      +
    • How leisure and play are just as important for mental health and long-term productivity.
    • +
  6. + +
  7. How to Stay Motivated During Long-Term Projects +
      +
    • Strategies for maintaining motivation and momentum over the course of a long, challenging task.
    • +
  8. + +
  9. Creating a Digital Detox: How to Unplug and Recharge +
      +
    • The benefits of taking time away from screens and how to implement a healthy digital detox.
    • +
  10. +
+
+
+ + + + +
+

growth mindset

+
+

+wp-growth-mindset <2025-03-14 Fri> +

+
+
+ + +
+

sadness

+
+

+wp-sadness +

+
+
+
+
+

Commits

+
+
+
+

code:

+
+

+You can add a commit detail by doing this: +

+
+
(insert-commit-template)
+;; "SPC c i c"
+
+
+
+
+
+

Commit on <2024-12-17 Tue>

+
+
+
+

Details

+
+

+This commit was focused on getting the blog section ready. So far ive decided to go for a static approach, whereby the blogs are stored in a .json file and populated in an array. The ’slug’ property is found in: +

+
    +
  • the title of the file (blog)
  • +
  • the metadata of the blog
  • +
  • the metadata of the index.json
  • +
+

+These three must be consistent +

+
+
+
+

What to work on next:

+
+
    +
  • the rendering of the content of the blogs
  • +
  • the github project population: match the blog page stylings.
  • +
+
+
+
+

Commit message:

+
+

+“Worked on the blog page, did stylings and began to populate” +

+
+
+
+
+

Commit on <2024-12-18 Wed>

+
+
+
+

Details

+
+

+Decided to change the way the blog is rendered. Using a json index object to display the list (slug is importnant), then blog detail is displayed as a rendered HTML from a markdown file. The scss was changed as well: +

+
+
"node_modules/prismjs/themes/prism-dark.css"
+
+
+

+this loads the theme for the code blocks. +

+
+
+
+

What to work on next:

+
+
    +
  • the github project population: match the blog page stylings.
  • +
+
+
+
+

Commit message:

+
+

+“continued work on blog page, stylings are done, the rendering changed from using json to md.” +

+
+
+
+
+

Commit on <2024-12-20 Fri>

+
+
+
+

Details

+
+

+Worked on the github project display, kept the same look as the blogs. Also done the about me section in the homepage (added some random ai generated info - need to change). Also done the contacts (set up a smpt gmail server) +

+
+
+
+

What to work on next:

+
+
    +
  • Get rid of all the hardcoded blogs, and begin first blog.
  • +
+
+
+
+

Commit message:

+
+

+“finished contact section - added smtp gmail server” +

+
+
+
+
+

Commit on <2025-01-01 Wed>

+
+
+
+

Details

+
+

+Deployed (changed back to emailjs) +

+
+
+ + +
+
+

Commit on <2025-01-12 Sun>

+
+
+
+

Details

+
+
    +
  • added new blog: prefrontal cortex and self discipline
  • +
  • added a estimated time to read
  • +
+
+
+
+

What to work on next:

+
+

+more blogs +

+
+
+
+

Commit message:

+
+

+“added new blog” +

+
+
+
+
+

Commit on <2025-02-15 Sat>

+
+
+
+

Details

+
+
    +
  • added tags with persistency. Redid the whole UI (theme)
  • +
+
+
+
+

What to work on next:

+
+
    +
  • add a cv section
  • +
+
+
+ +
+
+

Commit on <2025-03-14 Fri>

+
+
+
+

Details

+
+
    +
  • added quizzes and used firebase for storage
  • +
+
+
+
+

What to work on next:

+
+
    +
  • rendering of images , spending more time on blogs and creating quizzes
  • +
+
+
+
+

Commit message:

+
+ + +
+
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241217234944-wp_emacs_config_blorg.html b/output/20241217234944-wp_emacs_config_blorg.html new file mode 100755 index 0000000..3418fa5 --- /dev/null +++ b/output/20241217234944-wp_emacs_config_blorg.html @@ -0,0 +1,272 @@ + + + + + + + +wp-emacs-config-blorg + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wp-emacs-config-blorg

+ +
+

+file +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241220234456-github_notes.html b/output/20241220234456-github_notes.html new file mode 100755 index 0000000..67d4050 --- /dev/null +++ b/output/20241220234456-github_notes.html @@ -0,0 +1,286 @@ + + + + + + + +github_notes + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241231172511-book_notes.html b/output/20241231172511-book_notes.html new file mode 100755 index 0000000..411be97 --- /dev/null +++ b/output/20241231172511-book_notes.html @@ -0,0 +1,289 @@ + + + + + + + +book_notes + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20241231172543-the_science_of_self_discipline.html b/output/20241231172543-the_science_of_self_discipline.html new file mode 100755 index 0000000..cd05de7 --- /dev/null +++ b/output/20241231172543-the_science_of_self_discipline.html @@ -0,0 +1,487 @@ + + + + + + + +the_science_of_self_discipline + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

thescienceofselfdiscipline

+ +
+
+

Introduction

+
+

+Upon completing the book titled “The Science of Self-Discipline” written by Peter Hollins, I wanted to write a +little summary of the lessons the book has to offer. +

+
+
+
+

Purpose

+
+

+The purpose of the book is to provide a framework for those wanting to build and maintain self-discipline in their +daily routine, through science-based advice and strategies. +

+
+
+
+

Biological Basis of Self-Discipline

+
+

+One of the first quotes given in the book is from Jim Rohn, who states that: +

+ +

+> “We must all suffer one of two things: the pain of discipline or the pain of regret.” +

+ +

+The very first chapter talks about the biology behind self-discipline. The reason for discussing this is that +without having an understanding of the things that cause, diminish or strengthen self-discipline, it would be +difficult to benefit from it. The concept of neuroplasticity is mentioned in the book, which +enables change. Our brain’s ability to form and reorganise neural connections alludes to the fact that +self-discipline can be developed and improved over time. The example used is that of a road being taken to and from +work every single day. The more often this road is taken, the more automatic the journey becomes, up to a point +where you will be able to get through it without conscious thought. +

+ +

+Another important point raised is the concept of willpower fatigue. Self-discipline and willpower are not two +static quantities that are fixed, they are like gas in a tank, it can be drained or replenished. Essentially this +emphasises the point that no matter how great somebody’s willpower is, it will eventually deplete. How does one +combat this then? One should prioritise important tasks when the willpower is at its highest, larger tasks should be +broken down into smaller ones, and self-care should be practiced to replenish willpower. +

+
+
+
+

Two Rules:

+
+
+
+

The 40% Rule

+
+

+This rule was developed by Navy SEALs, and states that when you feel like you’ve reached your mental or physical +limit, the reality is that you’ve only reached about 40% of your true capacity. This rule allows you to create a +shift in your mindset. Perceived limitations are no longer ones maximum capacity, but rather, this shift pushes you +to tap into hidden reserves and maximises your potential. +

+
+
+
+

10-Minute Rule

+
+

+If you ever felt like you crave something, and the urge pushes you to it, the 10 minute rules states that you should +wait for 10 minutes before getting it. If you want to eat a sugary snack, wait for 10 minutes before getting it. +This exercise removes the ’immediate’ from immediate gratification, and more-so shows that you can withstand your +urges. +

+
+
+
+
+

Discipline Drainers

+
+

+The author then goes on to mention common discipline drainers, and how to overcome them. +

+
+
+

False Hope Syndrome

+
+

+Instead of setting unrealistic expectations, set smaller achievable goals, and celebrate the wins along the way. If +you were to do the former, it can quickly lead to disappointment and a decrease in motivation. The latter approach +will give you the sense of accomplishment, build self-confidence and increase momentum, which is more sustainable +over time. +

+
+
+
+

Procrastination

+
+

+To improve self-discipline, procrastination should be avoided, one should stop waiting to be ready or for +everything to feel just right. Inaction goes hand in hand with making excuses, and ultimately sabotages the +chances of you getting the thing you want done. The 75% rule was mentioned, where you take action when you are 75% +certain of success. Embracing the imperfection allows you to act, and this action enables you to improve +self-discipline. +

+
+
+
+
+

Flex your Uncomfortable muscle

+
+

+By nature self-discipline is uncomfortable. If you were given the choice to play video games or run a mile, most +would choose the former, simply because it is easier. Methods such as urge surfing, seeking out +challenges and practicing discomfort are mentioned here that would allow you to develop self-discipline. +

+
+
+
+

Create a Disciplined Environment

+
+

+The next chapter of the book states that having an environment that is conducive to self-discipline is one of the +most effective and simplest ways to drastically improve ones life. How does one do this? The author lists and +explains ways to create such an environment. From amongst them are: +

+
    +
  • Minimising Distractions: essentially you create a clutter-free working environment, and focus on the ’out of sight, +out of mind’ principle
  • +
  • Regulate Dopamine: being mindful of the cues that trigger dopamine release, such as junk food, social media etc. +and instead creating a reward system that enforces positive behaviour and habits
  • +
  • Optimise default choices: simply put, this is streamlining disciplined behaviour and choosing the path of least +resistance
  • +
+
+
+
+

Delayed Gratification

+
+

+This chapter was titled ’Why You Should Always Eat Your Vegetables First’, and, as one can tell, this is talking +about the art of delaying gratification. The author goes on to explain how this works, and goes back to the +stanford-marshmallow-experiment. Two ways one can delay gratification are: +

+
    +
  • Visualising your future self: research goes on to state that there is a strong correlation between visualising +your future self and making better long-term decisions. This is simply putting yourself in the shoes of your +future self and imagining what you will be doing in the future
  • +
  • The 10-10-10 Rule: a question to pose to oneself, asking ’how will I feel in 10 minutes, 10 hours and 10 days?’. +This question forces a perspective shift and can allow you to prioritise long-term benefits over short-term +satisfactions
  • +
+
+
+
+

Using targeted questions

+
+

+> If you make the effort to ask yourself these four questions and to be +honest in your answers, you’ll become more aware of your tendencies to +rationalize and make excuses, and you’ll be prepared to create better +habits for leading a disciplined life. +

+ +

+The four questions are as follows: +

+ +
    +
  1. Do I want to be a disciplined person or not?
  2. +
  3. Am I doing the right thing or simply what’s easy?
  4. +
  5. These are the vegetables, so what am I getting for dessert?
  6. +
  7. Am I being self-aware?
  8. +
+
+
+
+

Mindset and Approach

+
+

+This chapter talks about how our mindset can affect weather we positively or negatively perceive our lives. Some of +the ways one can take on a more positive and optimistic outlook on life are: +

+
    +
  • The Endowed Progress Effect: perceiving advancements can make us feel more motivated and optimistic, one can do +this by recognising and acknowledging progress in the past towards a goal
  • +
  • Goal Proximity: the idea that the closer we are to a goal, the more motivated we are to reach it.
  • +
  • Think of How Your Actions Can Benefit Others: when one considers how their actions can benefit others, this can +quickly turn into a strong source of motivation and drive
  • +
  • Think Optimistically: by thinking optimistically, one can create a positive and optimistic outlook on life. The +term used in the book is ’hoping for the best while preparing for the worst’
  • +
  • Think in Terms of Effort: focus on the effort, not the outcome. When one does this, they are able to enjoy the +process regardless of the outcome
  • +
+
+
+
+

Build Routines and Habits

+
+

+Motivation is nice to have, but it is something that fluctuates based on emotion and circumstances. Habits on the +other hand, are something concrete and can be built and maintained. Research has shown that it takes 66 days to +build a habit, and requires self-discipline to get through that process. But once it is built, this habit will drive +you instead. The final thing mentioned in the book is the six sources of influence model by Joseph Grenny. These +factors are (1) personal motivation, (2) personal ability, (3) social motivation, (4) social ability, (5) structural +motivation, and (6) structural ability. +

+
+
+
+

Summary

+
+

+This book is a great read, and taught me a lot about self-discipline and the science behind it. I would definitely +recommend it to anyone who wants to improve their self-discipline. It is, however, something that should be +reflected upon, not all the approaches and strategies are a one-size-fits-all, thus, take it with a grain of salt and +adapt it to your own circumstances. +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250111213016-wp_prefront_cortex_blog.html b/output/20250111213016-wp_prefront_cortex_blog.html new file mode 100755 index 0000000..726b50f --- /dev/null +++ b/output/20250111213016-wp_prefront_cortex_blog.html @@ -0,0 +1,272 @@ + + + + + + + +wp-prefront-cortex-blorg + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wp-prefront-cortex-blorg

+ +
+

+file +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250120110833-afp.html b/output/20250120110833-afp.html new file mode 100755 index 0000000..89be6b2 --- /dev/null +++ b/output/20250120110833-afp.html @@ -0,0 +1,280 @@ + + + + + + + +afp + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

afp

+ +
+

+afpweek1 +

+ +

+afpweek2 +

+ +

+afpweek5 +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250120111047-afp_week1.html b/output/20250120111047-afp_week1.html new file mode 100755 index 0000000..855bc75 --- /dev/null +++ b/output/20250120111047-afp_week1.html @@ -0,0 +1,281 @@ + + + + + + + +afp_week1 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250120113936-afp_lab_1.html b/output/20250120113936-afp_lab_1.html new file mode 100755 index 0000000..98d2a68 --- /dev/null +++ b/output/20250120113936-afp_lab_1.html @@ -0,0 +1,475 @@ + + + + + + + +afp_lab_1 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

afplab1

+ +
+

+<2025-01-20 Mon> +

+
+

Installation of Agda:

+
+
+
+

Step 1

+
+
+
sudo apt-get install zlib1g-dev libncurses5-dev
+
+
+ +

+then install ghc +

+ + +

+Now that you have cabal installed, use it to install Agda as a Haskell package: +

+
+
cabal update
+cabal install Agda
+
+
+
+
+
+

Step 2

+
+

+Most users will want to install the standard library. You can install this as any other Agda library (see Library Management). See the agda-stdlib project’s installation instructions for the steps to take to install the latest version. +https://github.com/agda/agda-stdlib +https://agda.readthedocs.io/en/latest/tools/package-system.html#package-system +

+
+
+
+
+

Exercises:

+
+

+my lab1 +

+ + +

+```agda +data Bool : Type where + true false : Bool +``` +

+ + +

+In Agda, the snippet `data Bool : Type where true false : Bool` is a definition of a simple data type named `Bool`. Let’s break down and explain all the components and words in this snippet: +

+ +

+— +

+ +

+### 1. `data` +

+
    +
  • What it means: This keyword introduces a new data type definition in Agda.
  • +
  • Purpose: Defines a type that consists of one or more constructors, which are used to create values of the type.
  • +
  • In this case: The `data` keyword is used to define the `Bool` type.
  • +
+ +

+— +

+ +

+### 2. `Bool` +

+
    +
  • What it is: The name of the data type being defined.
  • +
  • Purpose: Represents a type that has exactly two possible values: `true` and `false`.
  • +
  • In this case: `Bool` is a common type used to represent truth values in logic (true or false).
  • +
+ +

+— +

+ +

+### 3. `:` (colon) +

+
    +
  • What it means: Indicates a type declaration in Agda.
  • +
  • Purpose: Separates the name of the data type (`Bool`) from its type (`Type`).
  • +
  • In this case: `Bool : Type` declares that `Bool` is a type itself (i.e., a type of values).
  • +
+ +

+— +

+ +

+### 4. `Type` +

+
    +
  • What it is: The universe of all types in Agda.
  • +
  • Purpose: In Agda, types are first-class citizens, and `Type` represents the “type of types.” For instance: +
      +
    • `Bool : Type` means `Bool` is a type.
    • +
    • If you define a type `ℕ : Type` for natural numbers, it also belongs to `Type`.
    • +
  • +
  • In this case: `Bool` is defined as a type that belongs to this universe.
  • +
+ +

+— +

+ +

+### 5. `where` +

+
    +
  • What it means: Introduces the constructors (values) of the type.
  • +
  • Purpose: Lists the specific ways you can construct or create values of the newly defined type.
  • +
  • In this case: `where` introduces the two constructors, `true` and `false`, which are the only possible values of the `Bool` type.
  • +
+ +

+— +

+ +

+### 6. `true false` +

+
    +
  • What they are: The constructors of the `Bool` type.
  • +
  • Purpose: Constructors are functions (or constants) that produce values of the type. Here: +
      +
    • `true : Bool` means `true` is a value of type `Bool`.
    • +
    • `false : Bool` means `false` is a value of type `Bool`.
    • +
  • +
  • In this case: These two constructors define all possible values of `Bool`.
  • +
+ +

+— +

+ +

+### 7. `Bool` after the `:` +

+
    +
  • What it means: Specifies the type of each constructor.
  • +
  • Purpose: Ensures that each constructor produces a value of the correct type (`Bool` in this case).
  • +
  • In this case: Both `true` and `false` are of type `Bool`.
  • +
+ +

+— +

+ +

+### Complete Meaning +The entire definition can be read as: +

+
    +
  1. Define a new type called `Bool`.
  2. +
  3. `Bool` belongs to the universe of types (`Type`).
  4. +
  5. The `Bool` type has two constructors: +
      +
    • `true` (a value of type `Bool`).
    • +
    • `false` (a value of type `Bool`).
    • +
  6. +
+ +

+— +

+ +

+### Example Usage in Agda +You can use `Bool` in various ways: +```agda +– A function that negates a Bool +not : Bool → Bool +not true = false +not false = true +

+ +

+– A value of type Bool +myBool : Bool +myBool = true +``` +

+ +

+This showcases how the `Bool` type and its constructors (`true` and `false`) can be used in programs. +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250121110241-afp_lec_1.html b/output/20250121110241-afp_lec_1.html new file mode 100755 index 0000000..8d89d03 --- /dev/null +++ b/output/20250121110241-afp_lec_1.html @@ -0,0 +1,517 @@ + + + + + + + +afp_lec_1 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

afplec1

+ +
+

+<2025-01-21 Tue> +Week 1 Handout +

+
+

Week 1 lec 1

+
+

+if you want to put a hole in the file (ie the { }1 ) then put a ? and load the file +

+ +

+types are default called ’sets’ in agda but we will call them types. +

+ +

+data Bool : Type where + true false : Bool +

+ +

+Here we create a type called Bool +

+ +

+– +

+ +

+data Maybe (A : Type) : Type where + nothing : Maybe A + just : A → Maybe A +

+ +

+Given the type A we produce another type +Then we have two constructors, we can actually call them whatever we want, the only rule is that it shouldnt have spaces in the middle. For example, instead of nothing we can call ’nothing’ as ’Nothingljfsdsdj’. +

+ +

+The below is known as coercion or the disjoint union +Considering Blah = Either ℕ Bool +left 0: Blah +right false: Blah +

+ +

+– +

+ +

+data ℕ : Type where + zero : ℕ + suc : ℕ → ℕ +

+ +

+– 4 = suc (suc (suc (suc zero))) +

+ +

+– +

+ +

+data List (A : Type) : Type where + [] : List A + :: : A → List A → List A +

+ +

+Below is a function that maps a type to a type: +myList : Type -> Type +myList = List +

+ +

+– N -> Type … this is called ’Dependant Type’ which depends on elements of another type. +When it comes to types, its often the case where the language we use doesnt exactly define the type we want it to. For example in haskell, the binary tree, when we want to use the binary search tree its a little difficult. In agda we can define a precise type; including the binary search tree. In summary agda can write precise types. +

+ +

+– +

+ +

+ifthenelse_ : {A : Type} → Bool → A → A → A +if true then x else y = x +if false then x else y = y +

+ +

+this above is known as mixfix operation, we use the _ to denote where the arguments of the function are going to be places +

+ +

+– +

+ +

++ : ℕ → ℕ → ℕ +zero + y = y +suc x + y = suc (x + y) +

+ +

+here we can pattern match on any of x or y +in haskell, recursion can be done and there arent restrictions on it. in Agda we have structural recursion as there is a termination on recursion. Structural recursion is when you follow the structure of the definition, for example in suc x + y, we get suc (x + y), we keep removing the x from suc until we are left with 0. scrcpy +

+ +

+– +

+ +

+* : ℕ → ℕ → ℕ +zero * y = zero +suc x * y = x * y + y +

+ +

+for suc x * y: +(1 + x) * y +y + x * y +

+ +

+in infixr, the r means the brackets are explicitly on the right, if we use infixl then its on the left: +x + y + z +x + (y + z) : r +(x + y) + z : l +

+ +

+– research implicit arguements. +

+ + +

+reverse : {A : Type} → List A → List A +reverse [] = [] +reverse (x :: xs) = reverse xs ++ [ x ] +

+ +

+although this program works, its inefficient. +

+ +

+rev-append : {A : Type} → List A → List A → List A +rev-append [] ys = ys +rev-append (x :: xs) ys = rev-append xs (x :: ys) +

+ +

+rev : {A : Type} → List A → List A +rev xs = rev-append xs [] +

+ +

+the revappend is a helper function. you can see theres no ++ (concatenation) involved. +

+
+
+
+

Week 1 lec 2

+
+

+N-Induction : (P: N -> Type) + -> P 0 + -> ((k:N) -> Pk (P (suc k)) +choose k = 0 +

+ +

+P0 : P0 +f0 p1 : P1 +f1 p2 : p2 +

+ +

+-> (n:N) -> Pn +

+ +

+This is proof by induction, +

+ +

+ℕ-induction P p0 f 0 = P0 +ℕ-induction P p0 f(suc n) = goal +where + ℍ : Pn + ℍ = ℕ-induction P p0 f n +

+ +

+ℕ-induction P p0 f 3 = + f3(f2(f1 p0)) +essentially this is a for loop. +

+ +

+– +indstep : (k:N) -> k≣k -> suc k ≣ suc k +indstep k e = e +

+ +

+ℕ-refl n = ℕ-induction (λx -> x≣x) * (λke -> e) +

+ +

+introduction and elimination rules +

+ + +

+– +List-induction : { x : Type } + -> (P : List X -> Type) + -> P [] + -> ((x:X)(xs:List X) -> Pxs -> P(x::xs)) +

+ +

+-> (xs : List X ) -> P xs +

+ +

+List-induction +

+
+
+
+

Keybindings:

+
+
    +
  • C-c C-l : to load the agda file
  • +
  • SPC-w for the windows
  • +
  • C-c C-c : case split (agda mode) (put x, or b or whatever the first one is, then use this - very useful).
  • +
  • C-c C-SPC: give: tries to fill the hole
  • +
  • C-shift - : undo
  • +
  • C-c C-r : refine
  • +
  • C-c C-, : show the context
  • +
+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250128110828-afp_week2.html b/output/20250128110828-afp_week2.html new file mode 100755 index 0000000..b897e11 --- /dev/null +++ b/output/20250128110828-afp_week2.html @@ -0,0 +1,280 @@ + + + + + + + +afp_week2 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

afpweek2

+ +
+

+<2025-01-27 Mon> +

+ +

+<2025-01-28 Tue> +

+ +

+afplec2 +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250128111008-afp_lec_2.html b/output/20250128111008-afp_lec_2.html new file mode 100755 index 0000000..0734f69 --- /dev/null +++ b/output/20250128111008-afp_lec_2.html @@ -0,0 +1,332 @@ + + + + + + + +afp_lec_2 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

afplec2

+ +
+
    +
  • List are dependant, thats what makes it so special.
  • +
+ + +

+```agda +data {X : Type} : X → X → Type where + refl : (x : X) → x ≡ x +

+ +

+infix 0 +``` +Here is the identity type. For every type X, im going to define two elements of X, and the only way to define this element the constructor of which is single. The type is like a proposition and the element is like the proof. By just having this rule we can do everything we wanna do, for example, proving that if x=y, y=x. +Definition equal : = +Type equality : ≡ +

+ + + +

+we want to write propositions as types and proofs as programs. +

+ +

+A proof is a convincing argument. How do you convince someone that something you believe is true is actually true, it ivolves reasoning. +

+
+

AND

+
+

+To prove A and B we have to prove A, and also prove B. Proof by arguments; you have to argue/justify that A is true and that B is true. +

+ +

+a : A +the little `a` is a justification of the the big `A`. little a is a way to prove that big A holds. +

+ +

+So for this it would be: +a : A +b : B +and we need that both holds, imagine them as pairs: (a , b) +cartesian product -> (a , b) : A x B +the cartesian product is just a set of pairs. The below is a translation of conjunction to cartesian product in Agda. +

+ +

+```agda +

+ +

+data _ x _ (A B : Type) : Type where + _ , _ : A -> B -> A x B +

+ +

+``` +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250213124335-i3_wm.html b/output/20250213124335-i3_wm.html new file mode 100755 index 0000000..aa2c21a --- /dev/null +++ b/output/20250213124335-i3_wm.html @@ -0,0 +1,288 @@ + + + + + + + +i3-wm + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

i3-wm

+ +
+
+

Commands:

+
+

+Mod1 = Win Key +

+ +

+$mod+Enter = Open Terminal +$mod+s = Stacked layout +$mod+e = Default layout +$mod+d = dmenu +

+
+
+
+

Config file:

+
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250214155617-wp_new_emacs_config_blorg.html b/output/20250214155617-wp_new_emacs_config_blorg.html new file mode 100755 index 0000000..734a990 --- /dev/null +++ b/output/20250214155617-wp_new_emacs_config_blorg.html @@ -0,0 +1,483 @@ + + + + + + + +wp-new-emacs-config-blorg + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wp-new-emacs-config-blorg

+ +
+

+I recently spoke about what Emacs is, and how it is useful for productivity. I wanted to write this up again and dive more into the other files that were stored in the `/scripts` directory , as well as how to set it up. +

+ +

+## Prerequisites +

+ +

+Before we begin, ensure you have Emacs installed. You can install Emacs using the following commands based on your operating system: +

+ + + +

+Additionally, ensure that `git` is installed to clone repositories and manage configurations. +

+ +

+## Download the Configuration Files +

+ +

+First let’s walk through how to set this up. +

+ +

+Clone the repository or manually download the provided configuration files into your `~/.emacs.d/` directory: +

+ +

+```sh +mkdir -p ~/.emacs.d/ +cd ~/.emacs.d/ +``` +

+ +

+The following file should be copied to `~/.emacs.d/`: +

+
    +
  • `init.el`
  • +
+ +

+And the following files should be copied into `~/.emacs.d/scripts`: +

+
    +
  • `auto-comp.el`
  • +
  • `custom-agenda.el`
  • +
  • `displays.el`
  • +
  • `keyboard.el`
  • +
  • `shells.el`
  • +
  • `window.el`
  • +
+ +

+If you are using `git`, you can clone your repository directly: +

+ +

+```sh +git clone https://github.com/zainezq/dot-files/tree/main/emacs-config +``` +## Understanding the Configuration +

+ +

+This configuration is modularised for easier maintenance. Each file handles a specific feature: +

+ +

+### `init.el`: The Core Configuration +

+ +

+The `init.el` file is the entry point of the configuration. It: +

+
    +
  • Loads package management (MELPA, `use-package`)
  • +
  • Imports additional modules (`displays`, `shells`, `auto-comp`, `window`, `keyboard`, `custom-agenda`)
  • +
  • Configures UI elements such as themes, icons, and window behavior
  • +
  • Sets up Org mode and language support
  • +
  • Enables Evil mode for Vim-like keybindings
  • +
+ +

+### `auto-comp.el`: Auto-Completion Setup +

+ +

+This file configures `company-mode` for autocompletion in Emacs. It: +

+
    +
  • Loads `company-mode` and `company-box` for a better UI
  • +
  • Sets the minimum prefix length and delay before suggestions appear
  • +
  • Enables backend support for various modes
  • +
+ +

+### `keyboard.el`: Custom Keybindings +

+ +

+This file sets up keybindings using the `general.el` package. Some useful shortcuts include: +

+
    +
  • `SPC .` → Open file finder
  • +
  • `SPC f c` → Open `init.el` for quick edits
  • +
  • `SPC b b` → Switch buffers
  • +
  • `SPC w 1` → Removes (not kills) all buffers except the current one
  • +
  • `SPC t n` → Toggle NeoTree file explorer
  • +
+ +

+### `window.el`: Window Management +

+ +

+Defines functions for moving buffers between splits using `windmove`. Functions include: +

+
    +
  • `buf-move-up` → Swap buffers up
  • +
  • `buf-move-down` → Swap buffers down
  • +
  • `buf-move-left` → Swap buffers left
  • +
  • `buf-move-right` → Swap buffers right
  • +
+ +

+### `shells.el`: Shell and Terminal Integration +

+ +

+Configures: +

+
    +
  • `vterm` as the primary terminal
  • +
  • `eshell-toggle` for quick access to Eshell
  • +
  • `vterm-toggle` for easy terminal toggling
  • +
+ +

+### `custom-agenda.el`: Org Mode Enhancements +

+ +

+This file customises Org mode agendas. It: +

+
    +
  • Configures custom agenda views
  • +
  • Hides the Org agenda startup message
  • +
  • Enables extra features such as displaying scheduled tasks
  • +
+ +

+### `displays.el`: UI Enhancements +

+ +

+This file improves the visual experience in Emacs: +

+
    +
  • Configures `dashboard.el` to show a custom startup screen, you may modify this to your liking, see: [Emacs Dashboard](https://github.com/emacs-dashboard/emacs-dashboard)
  • +
  • Enables `neotree` for file navigation
  • +
  • Hides unnecessary UI elements for a cleaner look
  • +
+ +

+## Installing Dependencies +

+ +

+Open Emacs and run the following command to install missing packages: +

+ +

+```sh +M-x package-refresh-contents +M-x package-install-selected-packages +``` +

+ +

+Alternatively, restart Emacs, and `use-package` will automatically install any missing dependencies. +

+ +

+If any issues arise, check `*Messages*` buffer (`M-x view-echo-area-messages`) or start Emacs with debugging mode enabled (`emacs –debug-init`). What I tend to do is whenever I encounter any errors, I run emacs in minimal mode: `emacs -Q`, this loads emacs without the init.el file (if I can’t pinpoint the exact error). +

+ +

+## Final Notes +

+ +

+This configuration optimises Emacs for efficient navigation, organisation, and shell integration. +Everybodies configuration will differ based on their needs, so feel free to take and leave the parts as you wish! +

+ +

+For additional customisation, refer to the official package documentation: +

+ + + + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250218110239-afp_week5.html b/output/20250218110239-afp_week5.html new file mode 100755 index 0000000..837a0cf --- /dev/null +++ b/output/20250218110239-afp_week5.html @@ -0,0 +1,272 @@ + + + + + + + +afp_week5 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

afpweek5

+ +
+

+afplec5 +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250218110346-afp_lec_5.html b/output/20250218110346-afp_lec_5.html new file mode 100755 index 0000000..de4e3f4 --- /dev/null +++ b/output/20250218110346-afp_lec_5.html @@ -0,0 +1,278 @@ + + + + + + + +afp_lec_5 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

afplec5

+ +
+
+

+
+

+the first half of the lecture we went through the practice test solutions. +for the last question we got a hint, namely to redefine the leaf and node constructors of the Rose Trees. +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250218174735-emacs_stuff_keybindings.html b/output/20250218174735-emacs_stuff_keybindings.html new file mode 100755 index 0000000..a946195 --- /dev/null +++ b/output/20250218174735-emacs_stuff_keybindings.html @@ -0,0 +1,293 @@ + + + + + + + +emacs-stuff-keybindings + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250226184629-wp_urge_surfing_blorg.html b/output/20250226184629-wp_urge_surfing_blorg.html new file mode 100755 index 0000000..58733e1 --- /dev/null +++ b/output/20250226184629-wp_urge_surfing_blorg.html @@ -0,0 +1,380 @@ + + + + + + + +wp-urge-surfing-blorg + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wp-urge-surfing-blorg

+ +
+

+By Zaine Qayyum +

+ +

+## Table of Contents +

+ +
    +
  1. [Introduction](#introduction)
  2. +
  3. [What is Urge Surfing?](#what-is-urge-surfing)
  4. +
  5. [How Urge Surfing Works](#how-urge-surfing-works)
  6. +
  7. [Conclusion](#conclusion)
  8. +
+ +

+## Introduction +

+ +

+I’ve spoken about the internal components of ’self-discipline’ in another blog, but if we take a look at this whole self-improvement topic from another angle, we can see that the underlying reason for us not being able to ’stick to things’ is due to us giving in to our urges. That may sound trivial, and we may connect the dots that if we control our impulses, we can do xyz. However, that form of thinking requires a bit of explanation. +

+ +

+Psychologists have researched and found that opposing our urges is like making them stronger because we give it that ’attention’ it wants (Wegner, 1994). In his Ironic Process Theory, Daniel Wegner demonstrated that trying to suppress thoughts such as resisting cravings or unwanted impulses paradoxically makes them more persistent (Wegner, Schneider, Carter, & White, 1987). Addiction research further emphasises this, where forcefully fighting cravings can intensify them rather than make them disappear. +

+ +

+But what if, instead of giving in or fighting them, we learned to ride them like a wave? This is the foundation of urge surfing, a mindfulness based technique developed by Dr. Alan Marlatt, which teaches individuals to observe their cravings without reacting to them, allowing them to naturally peak and fade. +

+ +

+## What is Urge Surfing? +

+ +

+Urge surfing is a concept that originated in addiction therapy and mindfulness practices. Developed by psychologist Dr. Alan Marlatt, it was designed to help people struggling with addictive behaviors by teaching them to observe their cravings rather than acting on them. +

+ +

+The fundamental aspect of the technique is based on the ideology that urges are temporary (so real), they rise, peak and then eventually fade away, which is where the term surfing intuitively comes from. +

+ +

+## How Urge Surfing Works +

+ +

+Urge surfing relies on mindfulness, where we recognise the urge, observe it, then let it fade away. +

+ +

+The process can be broken down into three main steps: +

+ +

+### 1. Recognising the Urge +The first step is to identify the urge as it arises. This means paying close attention to bodily sensations, thoughts, and emotions that signal a craving. For example: +

+
    +
  • A sudden tension in the stomach when craving sweets.
  • +
  • Restlessness and an urge to check social media.
  • +
  • A racing heart and a compulsion to lash out in anger.
  • +
+ +

+Acknowledging the urge early gives you the power to observe it rather than be consumed by it (kind of wanted to link this to “The Observer and the Observed”). +

+ +

+### 2. Riding the Wave +Once you recognise the urge, the next step is to observe it without reacting. Imagine the urge as a wave in the ocean. rather than fighting it, you ride it by: +

+
    +
  • Breathing deeply: In other words, focussing on slow deep breaths to achor yourself in the present moment
  • +
  • Noticing sensations: Where do you feel the urge? Is it in your chest, hands, or stomach?
  • +
  • Labeling the urge: Mentally note, “This is just a craving,” or “This is just an impulse.” This helps you distance yourself from it
  • +
  • Practicing non-judgment: Don’t label the urge as good or bad. Just observe it as it rises and falls
  • +
+ +

+### 3. Letting It Fade Away +With time, urges naturally subside. Like waves, they reach a peak and then fade away. The trick behind this is accepting that they come and go, and this gives you a much better control over your impulses. +

+ +

+## The Science Behind Urge Surfing +Now you might be thinking “Hey you just spouted a bunch of things but where is the scientific correlation???”. Let’s take a look at the science behind it: +

+ +
    +
  • The 90-Second Rule: Neuroscientist Dr. Jill Bolte Taylor suggests that most emotional reactions last about 90 seconds. If we can sit with an urge for that duration, it often begins to dissipate.
  • +
  • Neuroplasticity: Every time we resist an impulse instead of acting on it, we weaken the neural pathways associated with that habit. Over time, the urges become less intense.
  • +
  • The Prefrontal Cortex: Self-control is governed by the prefrontal cortex, the rational part of our brain. Practicing urge surfing strengthens this area, which improves discipline.
  • +
+ +

+![Urge Surfing Diagram](./assets/urge-surfing.png) +

+ +

+Source: [Link](https://www.thenourishedpath.com/blog/eating-mindfully-urge-surfing) +

+ +

+## Conclusion +

+ +

+Urge surfing is truly a powerful technique when mastered, not only does it allow you to control your urges without giving in, it also helps you to become more self-disciplined. If you are interested in learning more about this, I would recommend reading the book “The Science of Self-Discipline” by Peter Hollins. +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250314223811-wp_growth_mindset.html b/output/20250314223811-wp_growth_mindset.html new file mode 100755 index 0000000..a0e4ca7 --- /dev/null +++ b/output/20250314223811-wp_growth_mindset.html @@ -0,0 +1,435 @@ + + + + + + + +wp-growth-mindset + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wp-growth-mindset

+ +
+

+By Zaine Qayyum +

+ +

+— +

+ +

+This topic is something that I’ve been wanting to talk about for a while, and the reason is because of how important it is as human beings to have this growth mindset. You might ask “why? what is the need when I can just have a fixed mindset?”. The answer is simple: having a growth mindset is essential for personal and professional success. This is what I wanted to talk about in this blog, and I hope you find it useful! +

+ +

+## Table of Contents +

+ +
    +
  1. [What Is a Growth Mindset?](#what-is-a-growth-mindset)
  2. +
  3. [Why Does a Growth Mindset Matter?](#why-does-a-growth-mindset-matter)
  4. +
  5. [How to Develop a Growth Mindset](#how-to-develop-a-growth-mindset)
  6. +
  7. [Final Thoughts](#final-thoughts).
  8. +
+ +

+## What Is a Growth Mindset? +

+ +

+The term growth mindset was introduced by psychologist Dr. Carol Dweck in her research on motivation and learning. It refers to the belief that our abilities, intelligence, and talents can be developed through effort, learning, and persistence. Take for example the muscles in our body, we develop them through repeated “reps” and consistent effort. The same applies to our intelligence, talents, and abilities; we can develop them through effort, learning, and persistence. +

+ +

+This contrasts with a fixed mindset, where people believe their intelligence and talents are static traits, they either “have it” or they don’t. +

+ +

+### Growth Mindset vs. Fixed Mindset +

+ + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Growth MindsetFixed Mindset
Challenges are opportunities to growChallenges are threats to avoid
Failure is a stepping stone for learningFailure defines intelligence and worth
Effort is the path to masteryIf you have to try, you’re not naturally talented
Constructive criticism is valuableCriticism is a personal attack
Inspired by others’ successFeels threatened by others’ success
+ +

+## Why Does a Growth Mindset Matter? +The question now might arise, “why does a growth mindset matter?” +Having a growth mindset is not just motivational jargon, but it has real benefits, here are some of them: +

+ +
    +
  • Increases resilience: People with a growth mindset are more likely to persist in the face of challenges, which ultimately allows you to grow in multiple ways.
  • +
  • Encourages continuous learning: Lifelong learning is something so valued and desired (subject for another blog?), and a growth mindset goes hand in hand with it.
  • +
  • Boosts performance: Research shows that students and professionals with a growth mindset perform better over time. This “performance” can be related to arbitrary things like academic success, job performance, or personal growth.
  • +
  • Improves relationships: It helps people handle feedback better and build stronger connections with others.
  • +
+ +

+## How to Develop a Growth Mindset +

+ +

+### 1. Reframe Failure as Learning +Instead of viewing failure as proof of inadequacy, see it as feedback. Ask yourself: +

+
    +
  • What can I learn from this?
  • +
  • How can I approach this differently next time?
  • +
+ +

+The questions I always ask myself are “What did I do that went well?” and “What can I do differently next time?” +

+ +

+### 2. Challenges should be embraced +A common trap of a fixed mindset is avoiding challenges to protect your self-esteem. Instead: +

+
    +
  • Take on new projects that push your abilities.
  • +
  • Step outside your comfort zone regularly.
  • +
  • Remind yourself: Every expert was once a beginner.
  • +
+ +

+### 3. Use “Yet” to Change Your Self Talk +Pay attention to your inner dialogue (yes we all have one, even if we don’t realise it). If you catch yourself saying: +> “I’m not good at this.” +

+ +

+Reframe it to: +> "I’m not good at this *yet."* +

+ +

+This small change can shift your perspective from impossibility to potential. +

+ +

+### 4. Value Effort Over Talent +Society often glorifies natural talent, but effort is what leads to mastery. Instead of aiming to be “the best,” focus on: +

+
    +
  • Developing discipline and consistency.
  • +
  • Tracking your progress rather than comparing yourself to others.
  • +
  • Celebrating small wins along the way.
  • +
+ +

+## Final Thoughts +

+ +

+A growth mindset isn’t something you “get” overnight, it takes a while to cultivate. It’s a daily practice. It requires self awareness, patience, and a willingness to embrace discomfort. But once achieved, it can take you to unimaginable heights. +

+ +

+I honestly feel as though the best thing that worked for me was shifting my mindset, being positive about the situations I am in and learning to embrace the now. +

+ +

+I hope this inspires you even in the slightest :) +

+ +

+— +

+ + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250314230952-wp_emotional_intelligence.html b/output/20250314230952-wp_emotional_intelligence.html new file mode 100755 index 0000000..d153f52 --- /dev/null +++ b/output/20250314230952-wp_emotional_intelligence.html @@ -0,0 +1,428 @@ + + + + + + + +wp-emotional-intelligence + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wp-emotional-intelligence

+ +
+

+Someone asked me a while ago “bro, do you think I have emotional intelligence?”, and after having that conversation, I thought to myself "what exactly does mean to have emotional intelligence? Emotional Intelligence (EQ) is the ability to recognise, understand, and manage your own emotions, as well as the emotions of others. I wanted to write out this post so that this can be better understood and applied to our daily lives. +

+ +

+— +

+ +

+## What is Emotional Intelligence (EQ)? +

+ +

+Emotional Intelligence is often broken down into five key components: +

+ +
    +
  1. Self-Awareness: Recognising and understanding your own emotions.
  2. +
  3. Self-Regulation: Managing and controlling your emotional reactions.
  4. +
  5. Motivation: Harnessing emotions to pursue goals with energy and persistence.
  6. +
  7. Empathy: Understanding and sharing the feelings of others.
  8. +
  9. Social Skills: Building and maintaining healthy relationships through effective communication and conflict resolution.
  10. +
+ +

+Knowledge is of little use if not applied. These five components, one can say, are the building blocks for EQ. +

+ +

+— +

+ +

+## Why EQ Matters in Relationships +

+ +

+Relationships depend on emotional connection. Whether it’s with a partner, family member, friend, or colleague, EQ helps you: +

+ +
    +
  • Communicate more effectively.
  • +
  • Resolve conflicts constructively.
  • +
  • Build trust and intimacy.
  • +
  • Understand and meet the emotional needs of others.
  • +
+ +

+Without emotional intelligence, you may not be able to understand the emotions of others, which can ultimately lead to conflicts. +

+ +

+— +

+ +

+## How to Build Emotional Intelligence for Better Relationships +

+ +

+Based on the 5 components of EQ, here are practical steps to develop your EQ and strengthen your relationships: +

+ +

+### Self-Awareness +

+
    +
  • Reflect on Your Emotions: Take time each day to identify and label your emotions. Ask yourself, “What am I feeling right now, and why?”
  • +
  • Journal: Writing about your emotions can help you process them and identify patterns in your reactions.
  • +
  • Seek Feedback: Ask friends or family members how they perceive your emotional responses. This can provide valuable insights into blind spots.
  • +
+ +

+### Self-Regulation +

+
    +
  • Pause Before Reacting: When you feel a strong emotion, take a deep breath and give yourself a moment to respond thoughtfully rather than reacting impulsively.
  • +
  • Practice Stress Management: Techniques like meditation, exercise, or deep breathing can help you stay calm in emotionally charged situations.
  • +
  • Set Boundaries: Learn to say no and manage your emotional energy to avoid depletion.
  • +
+ +

+### Empathy +

+
    +
  • Listen Actively: Pay full attention when someone is speaking. Focus on their words, tone, and body language without interrupting or planning your response. There is a huge difference between active listening and passive listening.
  • +
  • Put Yourself in Their Shoes: Try to understand the other person’s perspective, even if you don’t agree with it.
  • +
  • Validate Their Feelings: Acknowledge their emotions by saying things like, “I understand why you’d feel that way.”
  • +
+ +

+### Social Skills +

+
    +
  • Communicate Clearly: Use “I” statements to express your feelings without blaming others (e.g., “I feel upset when…”).
  • +
  • Practice Conflict Resolution: Approach disagreements with a problem solving mindset rather than a confrontational one. Remember its you and them versus the problem, not each other!
  • +
  • Show Appreciation: Regularly express gratitude and appreciation for the people in your life.
  • +
+ +

+### Motivation +

+
    +
  • Set Personal Goals: Identify what you want to achieve in your relationships and take steps to work toward those goals.
  • +
  • Stay Positive: Focus on the good in your relationships and maintain a hopeful outlook, even during challenging times.
  • +
+ +

+— +

+ +

+## Real-Life Examples of EQ in Action +

+ +

+There are many practical examples of EQ in action in our daily lives. Take work as an example, if you notice your colleague a little stressed, offer them support and ask if they need help! Not only will they feel grateful that they’re being seen, you’ll also strengthen your professional relationship with said colleague. Another one is in a platonic relationship, when a friend shares a problem, listen without judgement and offer empathy. +

+ +

+— +

+ +

+## The Long-Term Benefits of High EQ +

+ +

+Building emotional intelligence is a lifelong journey, but the rewards are immense. Over time, you’ll notice: +

+ +
    +
  • Stronger, more meaningful relationships.
  • +
  • Improved communication.
  • +
  • Greater resilience in the face of challenges.
  • +
  • A deeper understanding of yourself and others.
  • +
  • Being able to actively listen to others.
  • +
+ +

+— +

+ +

+## Final Thoughts +

+ +

+This whole thought and discussion stemmed from that single question. I find myself becoming more intrigued in the intricacies of relationships and human interaction. EQ is one of those components that make up a considerable portion of how we interact with others, without which relationships would become stale. Thank you for reading :) +

+ + +

+— +

+ +

+“Emotional intelligence is the key to both personal and professional success.” – Daniel Goleman +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250324041724-wp_week_12_reflections.html b/output/20250324041724-wp_week_12_reflections.html new file mode 100755 index 0000000..624db5a --- /dev/null +++ b/output/20250324041724-wp_week_12_reflections.html @@ -0,0 +1,272 @@ + + + + + + + +wp-week-12-reflection + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wp-week-12-reflection

+ +
+

+12 out of the 52 weeks are now completed (following the [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601)), and I guess this blog post will be a little different from the usual information-centric posts. 12 weeks having passed from this year means there’s only 9 months left of 2025, and i’ve come to realise that time is moving quick. The question then arose, “how can I maximise the time that I have?”, the answer to which isn’t as simple as one may think. Albeit this, let’s take a look at one particularly useful equation that may serve as a guide to modelling the value of time: +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250326002128-emacs_stuff_elisp.html b/output/20250326002128-emacs_stuff_elisp.html new file mode 100755 index 0000000..6c5c020 --- /dev/null +++ b/output/20250326002128-emacs_stuff_elisp.html @@ -0,0 +1,340 @@ + + + + + + + +emacs-stuff-elisp + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

emacs-stuff-elisp

+ +
+

+– use `<s` followed by `TAB` +

+ +
+
(defun my-echo-input ()
+  "Prompt the user for input and echo it back."
+  (interactive)
+  (message "hello")) 
+
+
+ +
+
(shell-command "thunar ~/Documents/ &")
+(run-at-time "1 sec" nil #'delete-other-windows)
+
+
+ +
+
(defun open-current-dir()
+  (interactive)
+  (cond ((string-equal system-type "gnu/linux")
+           (shell-command (concat "thunar " ".")))
+          ((string-equal system-type "darwin")
+           (shell-command (concat "open " "."))))
+)
+
+
+ +
+
+  (defun test()
+    (interactive)
+    (cond ((string-equal system-type "gnu/linux")
+         (message "linux"))
+        ((string-equal system-type "darwin")
+         (message "mac"))
+  )
+    )
+
+(defun kill-other-buffers-startup ()
+  "Kill all buffers except the current one."
+  (interactive)
+  (mapc (lambda (buffer)
+          (unless (eq buffer (current-buffer))
+            (kill-buffer buffer)))
+        (buffer-list)))
+
+
+;(add-hook 'emacs-startup-hook #'kill-other-buffers-startup)
+
+
+
+ +
+
+    (defun create-weekly-entry ()
+      (interactive)
+      (let* ((current-date-time-format "[%Y-week-%V]")
+             (timestamp (format-time-string current-date-time-format))
+             (entry (concat "* Weekly Entry: " timestamp "\n"
+                            "** Tasks:\n"
+                            "** Notes:\n"
+
+)))
+        (write-region entry nil "~/master-folder/org_files/todo/master-tl.org" 'append)))
+
+
+
+
+ + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250329114733-ise.html b/output/20250329114733-ise.html new file mode 100755 index 0000000..f63dfae --- /dev/null +++ b/output/20250329114733-ise.html @@ -0,0 +1,388 @@ + + + + + + + +ise + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

ise

+ +
+
+

Intelligent Software Engineering Key Revision Points (Lectures 1-7)

+
+
+
+

DONE Lecture 8 - 10

+
+

+Test questions will be randomly chosen from these key points. Key revision points for +lecture 8-10 will be verbally covered during lectures +

+
+
+
+

DONE Lecture 1

+
+

+General Bug Report Process (page 9) +Simple Bug Report Classification Method (pages 12-20) +

+
+
+
+

DONE Lecture 2

+
+

+DiMerent Configuration Sampling Methods (pages 8-19) +Configuration Encodings (pages 21-28) +Single Environment Learning (DaL) (pages 39-46) +

+
+
+
+

DONE Lecture 3

+
+

+Classic Code Complexity Metrics (pages 8-27) +How to Mine Bugs for Learning? (pages 37-43) +Cross Project Prediction (HDP) (pages 50-60) +

+
+
+
+

DONE Lecture 4

+
+

+DiMerent Coverage Metrics and Branch Concepts (pages 6-12) +Evolutionary Algorithm (pages 24-32) +Test Case Generation (EvoSuite) (pages 44-55) +Multi/Many-objective Software Testing (Sapienz) (pages 80-97) +

+
+
+
+

DONE Lecture 5

+
+

+Model free Tuning (for ORM) (pages 9-17) +Model free Tuning (BestConfig) (pages 18-23) +

+
+
+
+

DONE Lecture 7

+
+

+Statistical Test Selection and Use (pages 21-67) +

+
+
+
+
+

Week 1

+
+

+iseweek1 +

+
+
+
+

Week 2

+
+

+iseweek2 +

+
+
+
+

Week 3

+
+

+iseweek3 +

+
+
+
+

Week 4

+
+

+iseweek4 +

+
+
+
+

Week 5

+
+

+iseweek5 +

+
+
+
+

Week 7

+
+

+iseweek7 +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250329114848-ise_week_1.html b/output/20250329114848-ise_week_1.html new file mode 100755 index 0000000..8818d90 --- /dev/null +++ b/output/20250329114848-ise_week_1.html @@ -0,0 +1,359 @@ + + + + + + + +ise_week_1 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

iseweek1

+ +
+
+

Bug report classification

+
+

+Perform bug report classification with AI following the steps +below: +

+ +
    +
  • Text filtering
  • +
  • Stemming
  • +
  • Indexing
  • +
  • Train machine learning models, i.e., Decision Tree, Naive Bayes, and Logistic +Regression
  • +
  • Prediction (after data pre-processing)
  • +
+
+
+

Text filtering:

+
+
    +
  • Punctuation removal
  • +
  • Specific transformations occur: +the myUser has no meaning, its just a word. You need to split it into two meaningful words.
  • +
  • Stop words should not be removed, as it changes the whole meaning of a bug report.
  • +
  • Unlike other NLP tasks, removing stop words may distort the meaning of bug reports.
  • +
+
+
+
+

Stemming:

+
+
    +
  • Stemming reduces different forms of a word to its common base by sequential application of stemming rules. For example: light caresses colours becomes Light caress colour
  • +
+
+
+
+

Indexing:

+
+
    +
  • Indexing: we need to convert the text into numeric representation, there are two common ways of doing this: TF and IDF
  • +
  • TF: total words / specific word . for example: “bug” appears 50 times in a 150 terms.
  • +
  • IDF: We penalise certain words based on their frequency.
  • +
  • bug report classifications here often does not use IDF but TF, because some frequent terms should not be penalized
  • + +
  • For each report, we will have a vector of indexing for words in the reports according to a dictionary
  • +
  • Example: A bug report = {“this”, “bugs”, “failure”, “interesting”, …} +Vector = <0.123, 0.34, 0.1, ….>
  • +
+
+
+
+

DT

+
+
    +
  • What is decision tree: a tree structure that split the data depending on different values.
  • +
  • Each node is a test on the attribute.
  • +
  • Each branch represents the outcome.
  • +
+
+
+
+

NB

+
+
    +
  • What is Naive Bayes? Classifier based on the conditional probability given by the Bayes theorem.
  • +
  • Calculating the probability of each class, and classify the given features into the one with higher probability.
  • +
+
+
+
+

LR

+
+
    +
  • What is logistic regression: a linear model for classification
  • +
  • Fitting the logistic growth and the sigmoid midpoint
  • +
  • Output a probability, but can use a cutoff point to decide class.
  • +
+
+
+
+

Results:

+
+

+Choose the top 20/50 words when theyre used as a feature +

+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250329121843-ise_week_2.html b/output/20250329121843-ise_week_2.html new file mode 100755 index 0000000..fa6c93e --- /dev/null +++ b/output/20250329121843-ise_week_2.html @@ -0,0 +1,749 @@ + + + + + + + +ise_week_2 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

iseweek2

+ +
+ + + + +
+

2.1

+
+
+
+

Configuration Sampling

+
+

+In general machine learning problem, we dont care where the data comes from , but here we do. +

+ +

+Configuration sampling is used to select representative samples for learning performance models. +

+ +
    +
  • Types of options: +
      +
    • Binary (e.g., on/off)
    • +
    • Numeric (e.g., value ranges)
    • +
  • +
  • Goal: Balance model accuracy with sampling effort.
  • +
+
+
+
+

Binary Sampling Strategies

+
+
+
+

Option-wise Strategy

+
+
    +
  • Each binary option is selected at least once in some configuration.
  • +
  • Minimize other options to reduce unknown interaction effects.
  • +
  • Size: Linear in the number of binary options.
  • +
+
+
+
+

T-wise Strategy

+
+
    +
  • Covers all T-wise combinations of options (T ≥ 2).
  • +
  • Example (2-wise): {001}, {010}, {100}, {111}
  • +
  • Size: Exponential in T.
  • +
+
+
+
+

Negative Option-wise Strategy

+
+
    +
  • For each option: one configuration where it is disabled, all others enabled.
  • +
  • Adds one all-yes configuration.
  • +
  • Size: Linear.
  • +
  • Example (3 options): {110}, {101}, {011}, {111}
  • +
  • you can see the 4th one is an all-yes configuration
  • +
+
+
+
+

Random (Binary)

+
+
    +
  • Select n configurations randomly.
  • +
  • Simple but may be less representative.
  • +
+
+
+
+

Difference Between Option-wise and Negative Option-wise Strategies

+
+

+Both strategies are used for sampling configurations in systems with binary options, but they focus on different aspects of option selection. +

+
+
    +
  • Option-wise Strategy
    +
    +
      +
    • Goal: Ensure each option is enabled (selected) at least once across configurations.
    • +
    • For every binary option, create a configuration where it is on.
    • +
    • Other options are minimized to avoid unknown interactions.
    • +
    • Focus: Testing the presence of each option.
    • +
    • Example (3 options): +
        +
      • {100} → Option 1 enabled, others off
      • +
      • {010} → Option 2 enabled, others off
      • +
      • {001} → Option 3 enabled, others off
      • +
    • +
    +
    +
  • +
  • Negative Option-wise Strategy
    +
    +
      +
    • Goal: Ensure each option is disabled (deselected) at least once.
    • +
    • For each option, create a configuration where it is off, and all others are on.
    • +
    • Also includes a configuration where all options are on.
    • +
    • Focus: Testing the absence of each option.
    • +
    • Example (3 options): +
        +
      • {110} → Option 3 disabled
      • +
      • {101} → Option 2 disabled
      • +
      • {011} → Option 1 disabled
      • +
      • {111} → All options enabled
      • +
    • +
    +
    +
  • +
  • Comparison Summary
    +
    + + + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureOption-wiseNegative Option-wise
    FocusPresence of each optionAbsence of each option
    What is variedEach option enabled onceEach option disabled once
    Other options in configTypically disabledTypically enabled
    Additional config?Not requiredYes, includes all-on config
    Use caseMinimal presence testingInfluence of removing options
    +
    +
  • +
+
+
+
+

Non-Binary (Numeric) Sampling Strategies

+
+
+
+

One-Factor-At-A-Time (OFAT)

+
+
    +
  • Assumes no interactions among options.
  • +
  • Varies one option at a time, others fixed at center values.
  • +
  • Size: Linear in number of options.
  • +
  • Example (values = 1,3,5): {333}, {533}, {133}, {353}, {313}, {331}, {335}
  • +
+
+
+
+

Box-Behnken Design (BBD)

+
+
    +
  • Captures quadratic effects and 2-wise interactions.
  • +
  • Uses subset of 3k full factorial (min, center, max).
  • +
  • Size: Exponential in number of options.
  • +
  • Example: {111}, {113}, {115}, {131}, {151}, etc.
  • +
+
+
+
+

Central Composite Design (CCD)

+
+
    +
  • Combines: +
      +
    • 2k factorial points
    • +
    • 2k axial points at α-distance
    • +
    • 1 center point
    • +
  • +
  • Captures curvature and interactions.
  • +
  • Example: 8 full factorial + 6 axial + {333}
  • +
+
+
+
+

Plackett-Burman Design (PBD)

+
+
    +
  • Focus on main effects, assumes negligible interactions.
  • +
  • Uses predefined seeds, e.g., PBD(9,3)
  • +
  • First config from seed, rest by right-shifting seed.
  • +
  • Uses indices only for values.
  • +
  • Example: If O = {1,100,1000,10000,100000}, index 3 could mean 1, 1000, 100000
  • +
+
+
+
+

Random (Non-Binary)

+
+
    +
  • Random selection of numeric configurations.
  • +
  • Risk of non-uniformity and clustering.
  • +
  • Can negatively impact learning performance.
  • +
+
+
+
+
+

Mixed Variable Sampling

+
+

+Some systems include both binary and non-binary (numeric) configuration options. +These are referred to as mixed systems. +

+ +
    +
  • Requires hybrid or combined strategies to ensure representative coverage.
  • +
  • One approach: Permute over the mixed space by combining possible binary and numeric value combinations.
  • +
  • This can grow combinatorially, so sampling techniques may be needed to reduce the total number of permutations.
  • +
+
+
+

Example

+
+
    +
  • Non-binary configs: {0.1, 0.4, 5}, {0.2, 0.4, 7}, {0.2, 0.7, 5}
  • +
  • Binary configs: {1,0}, {1,1}
  • +
  • Full mixed permutations: +
      +
    • {0.1, 0.4, 5, 1, 0}
    • +
    • {0.1, 0.4, 5, 1, 1}
    • +
    • {0.2, 0.4, 7, 1, 0}
    • +
    • {0.2, 0.4, 7, 1, 1}
    • +
    • {0.2, 0.7, 5, 1, 0}
    • +
    • {0.2, 0.7, 5, 1, 1}
    • +
  • +
+
+
+
+
+
+

2.2

+
+
+
+

Single Environment Learning: DeepPerf

+
+

+Source: Ha & Zhang, ICSE 2019 +

+ +

+DeepPerf is an early approach using deep neural networks (>3 layers) to predict software performance in configurable systems. +

+ +
    +
  • Designed to address: +
      +
    • Small data size: Limited measurements available.
    • +
    • Feature sparsity: Only a few configuration options significantly impact performance.
    • +
    • Network instability: Tackled with tailored hyperparameter tuning.
    • +
  • +
+
+
+
+

Limitation of DeepPerf

+
+
    +
  • Does not handle sample sparsity, a major issue in configuration performance prediction.
  • +
+
+
+
+

Improved Approach: Divide-and-Learn (DaL)

+
+

+Source: Gong & Chen, ESEC/FSE 2023 +

+
+
+

Key Problem: Sample Sparsity

+
+
    +
  • Caused by: +
      +
    • Inherited feature sparsity.
    • +
    • Small configuration changes leading to drastic performance shifts.
    • +
    • Not all configurations being valid.
    • +
  • +
  • Training data is sparse due to expensive measurements.
  • +
+
+
+
+

Key Properties of Configuration Landscape

+
+
    +
  1. Intra-division smoothness: Configurations in the same division show smooth performance variations.
  2. +
  3. Inter-division sharpness: Cross-division configurations differ significantly, possibly on key options.
  4. +
+ +

+Risk: Limited data might lead to overfitting within divisions. +

+
+
+
+

Architecture of DaL

+
+

+Three Goals: +

+
    +
  1. Divide the configuration data into meaningful divisions → function ϕ
  2. +
  3. Learn a local model for each division → function μ
  4. +
  5. Assign new configurations to the correct local model → using ϕ and μ
  6. + +
  7. Implementation: +
      +
    • CART (Decision Tree) is used for dividing.
    • +
    • DeepPerf models are trained within each division.
    • +
    • Random Forest is used for classifying unseen configurations into divisions.
    • +
  8. +
+
+
+
+

Trade-off: Number of Divisions

+
+
    +
  • More divisions → better at tackling sparsity, but less data per model → risks underfitting.
  • +
  • Need to balance: +
      +
    • Generalizability vs.
    • +
    • Specialization
    • +
  • +
+
+
+
+

Results

+
+
    +
  • DaL outperforms or matches state-of-the-art in 33 out of 40 cases.
  • +
  • Achieves up to 1.94× improvement.
  • +
  • Needs fewer training samples for same accuracy.
  • +
  • Especially beneficial in complex systems or with more training data.
  • +
+
+
+
+
+
+

2.3

+
+
+
+

Single Environment Learning: Encoding

+
+

+Source: Gong & Chen, MSR 2022 +

+ +

+A study conducted by the lab investigates how different encoding schemes impact the software performance learning pipeline. +

+
+
+

Three Common Encoding Schemes

+
+
    +
  • Label encoding
  • +
  • Scaled label encoding (e.g., max-min normalization)
  • +
  • One-hot encoding
  • +
+
+
+
+
+

Encoding Schemes Explained

+
+
+
+

Label Encoding

+
+
    +
  • Converts configuration options into numeric values.
  • +
  • Example: +
      +
    • Configuration: (cachesize, interval, ssl, datastrategy)
    • +
    • Values: cachesize = (1, 10, 10000), interval = (1–4), ssl = (0, 1), datastrategy = (strategy1, strategy2, strategy3)
    • +
    • Encoded: (10000, 2, 1, 1) → (2, 1, 1, 1) → datastrategy: (0, 1, 2)
    • +
  • +
+
+
+
+

Scaled Label Encoding

+
+
    +
  • Similar to label encoding but normalizes all values to the range [0, 1].
  • +
  • Example (10000, 2, 1, 1) becomes (1, 1/3, 1, 0.5)
  • +
+
+
+
+

One-Hot Encoding

+
+
    +
  • Transforms each categorical value into a binary vector.
  • +
  • Example: (10000, 2, 1, 1) becomes (0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0)
  • +
+
+
+
+
+

Community Debate and Justifications

+
+
    +
  • Categorical features (e.g., cachemode = memory, disk, mixed): +
      +
    • Label encoding implies false ordering (1, 2, 3)
    • +
    • One-hot encoding avoids this but may introduce multicollinearity.
    • +
  • + +
  • Numeric options (e.g., cachesize = 1, 10, 10000): +
      +
    • Label encoding maintains order but struggles with large scale differences.
    • +
    • Scaled label encoding improves numeric stability but weakens interaction with binary features.
    • +
  • +
+
+
+
+

Study Protocol

+
+
    +
  • Evaluated using 7 learning algorithms across 5 software systems.
  • +
+ + + + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250329142725-ise_week_3.html b/output/20250329142725-ise_week_3.html new file mode 100755 index 0000000..fbfe4ec --- /dev/null +++ b/output/20250329142725-ise_week_3.html @@ -0,0 +1,645 @@ + + + + + + + +ise_week_3 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

iseweek3

+ +
+ + + + +
+

3.1 Intelligent Software Engineering: Classic Metrics

+
+
+
+

Software Defect Prediction

+
+
    +
  • The foundation of software defect prediction lies in metric identification.
  • +
  • This was a key research direction in the 1980s.
  • +
  • Metrics aim to quantify properties of code to detect potential defects and improve quality.
  • +
+
+
+
+

Classic Code Metrics

+
+
+
+

1. McCabe Cyclomatic Complexity

+
+
    +
  • Purpose: Measures the complexity of code based on the number of linearly independent paths in the code’s flow graph.
  • +
+
+
    +
  • Why it Matters
    +
    +
      +
    • More conditional statements = More possible execution paths = Higher complexity.
    • +
    • Useful for identifying complex, hard-to-test, and error-prone code.
    • +
    +
    +
  • +
  • Simple Definition
    +
    +
      +
    • McCabe Complexity = Number of simple conditions + 1
    • +
    +
    +
  • +
  • What is a “Simple Condition”?
    +
    +
      +
    • A conditional without logical connectors (AND, OR).
    • +
    • Examples: +
        +
      • if (a > b)
      • +
      • while (a > b)
      • +
      • for (a=b; a > b; b++)
      • +
      • do {…} while (a > b)
      • +
    • +
    +
    +
  • +
  • Compound Conditions
    +
    +
      +
    • Count each simple condition inside: +
        +
      • if (a > b || a > 2) → 2 simple conditions
      • +
      • if (a > b && a > 2) → 2 simple conditions
      • +
    • +
    +
    +
  • +
  • Use Case
    +
    +
      +
    • Helps determine test case count needed for complete branch coverage.
    • +
    +
    +
  • +
+
+
+

2. Halstead Complexity Measures

+
+
    +
  • Purpose: Measures complexity based on the operators and operands used in code.
  • +
+
+
    +
  • Definitions:
    +
    +
      +
    • n1: Number of distinct operators (e.g., !=, !, %, /, *, +, &&, ||)
    • +
    • n2: Number of distinct operands (e.g., variable names, constants, types like bool, char)
    • +
    • N1: Total occurrences of operators
    • +
    • N2: Total occurrences of operands
    • +
    +
    +
  • +
  • Why Use Halstead?
    +
    +
      +
    • Evaluates: +
        +
      • Code length
      • +
      • Code vocabulary
      • +
      • Effort required to implement or understand the code
      • +
      • Potential bugs
      • +
    • +
    +
    +
  • +
+
+
+

3. Lines of Code (LOC)

+
+
    +
  • LOC: Total number of lines in a program.
  • +
  • Comment Lines: Lines containing only comments.
  • +
+
+
    +
  • Usefulness:
    +
    +
      +
    • Simple indicator of: +
        +
      • Code size
      • +
      • Code density
      • +
      • Maintainability and readability
      • +
    • +
    +
    +
  • +
+
+
+
+
+

3.2 Intelligent Software Engineering: Within-Project Prediction

+
+
+
+

Just-in-Time (JIT) Defect Prediction

+
+
    +
  • Based on the classic work by Kim et al. (2008).
  • +
  • Focuses on predicting defects at the commit/change level rather than file or module level.
  • +
+
+
+
+

Steps in the JIT Defect Prediction Pipeline:

+
+
    +
  1. File-level changes are extracted from a project’s revision history.
  2. +
  3. Bug fix changes are identified using keywords in SCM (Source Code Management) change log messages.
  4. +
  5. Bug-introducing and clean changes are identified by tracing backwards from the bug fix commits.
  6. +
  7. A classification model (e.g., SVM) is trained on these labeled examples.
  8. +
  9. Once trained, the classifier can predict if new code changes are likely to be buggy or clean.
  10. +
+
+
+
+

Change-wise Prediction Details

+
+
+
+

Change History Extraction

+
+
    +
  • Collected information includes: +
      +
    • Change log
    • +
    • Author
    • +
    • Change date
    • +
    • Source code
    • +
    • Change delta
    • +
    • Change metadata
    • +
  • +
+
+
+
+

Identifying Bug-Introducing Changes

+
+
+
    +
  • Step 1: Search for Bug Fixes
    +
    +
      +
    • Use keywords (e.g., “fix”, “bug”, “patch”) to find bug-fixing commits.
    • +
    +
    +
  • +
  • Step 2: Use the SZZ Algorithm
    +
    +
      +
    • Determine what was changed in bug fixes.
    • +
    • Produces a list of regions (“hunks”) showing differences between two revisions.
    • +
    • Deleted or modified code in each hunk is treated as the location of a bug.
    • +
    • Traces origin of this code to find the earlier bug-introducing changes.
    • +
    +
    +
  • +
+
+
+
+

Example Walkthrough

+
+
+
+

Revision 1:

+
+
    +
  • Initial creation of a function `bar`.
  • +
  • Introduces a bug: `if (report == null)` (should be `!=`).
  • +
  • SCM annotate shows all lines as modified in revision 1 by “kim”.
  • +
+
+
+
+

Revision 2:

+
+
    +
  • Two changes: +
      +
    • Function `bar` renamed to `foo`.
    • +
    • Argument changed from `report` to `report.str` in `println`.
    • +
  • +
  • Annotate output shows lines 1 and 4 were last modified by “ejw” in revision 2.
  • +
+
+
+
+

Revision 3:

+
+
    +
  • Bug fix applied: changes `==` to `!=` on line 3.
  • +
  • SZZ algorithm compares revisions 3 and 2, identifying line 3 as modified.
  • +
  • Traces line 3’s origin back to revision 1 — identifying the bug-introducing change.
  • +
+
+
+
+
+
+

3.3 Intelligent Software Engineering: Cross-Project Prediction (HDP)

+
+
+
+

Heterogeneous Defect Prediction (HDP)

+
+
    +
  • Based on the work by Nam and Kim (2015).
  • +
  • Motivation: Metrics used for defect prediction often differ across projects.
  • +
  • Goal: Address the metric mismatching problem across projects (heterogeneous settings).
  • +
  • Classifier agnostic — can be used with any machine learning model.
  • +
+
+
+
+

HDP Architecture

+
+
+
+

Metric Selection in Source Datasets

+
+
    +
  • Uses well-known feature selection methods: +
      +
    • Gain ratio
    • +
    • Chi-square
    • +
    • Relief-F
    • +
    • Significance attribute evaluation
    • +
  • +
  • Empirical testing used to choose the best approach.
  • +
  • Top 15% metrics per source project are selected.
  • +
  • Metric mismatching arises because each project may prioritize different metrics.
  • +
+
+
+
+

Matching Source and Target Metrics

+
+
+
    +
  • Key Steps:
    +
    +
      +
    1. Pair all metrics from source and target projects.
    2. +
    3. Remove poorly matched metrics based on a cutoff threshold for matching scores.
    4. +
    5. Apply maximum weighted bipartite matching to select the best group of matched metric pairs: +
        +
      • Goal: Maximize sum of matching scores.
      • +
      • Ensure no duplicated metrics are selected.
      • +
    6. +
    +
    +
  • +
  • Example:
    +
    +
      +
    • 2 source metrics: X1, X2
    • +
    • 2 target metrics: Y1, Y2
    • +
    • Matching pairs: (X1,Y1), (X1,Y2), (X2,Y1), (X2,Y2)
    • +
    + +

    +After applying a cutoff threshold of 0.30: +

    +
      +
    • Group 1: (X1,Y1) and (X2,Y2) with total score 1.3 (=0.8+0.5)
    • +
    • Group 2: (X2,Y1) with score 0.4 (Stands alone (can’t be paired with any other remaining pair without duplication)).
    • +
    • Group 1 is chosen as the matched metric set.
    • +
    +
    +
  • +
+
+
+
+

Methods for Calculating Matching Scores

+
+
+
+

Percentile-Based Method

+
+
    +
  • Compares 9 percentiles (10th, 20th, …, 90th) between source and target metric values.
  • +
  • Uses the formula: +Pij(n) = 1 - |spij(n) - bpij(n)| / bpij(n) +
      +
    • spij(n): smaller percentile value
    • +
    • bpij(n): bigger percentile value
    • +
  • +
  • Matching score is 1 when all percentiles are identical.
  • +
+
+
+
+

Kolmogorov-Smirnov (KS) Test Method

+
+
    +
  • Non-parametric two-sample test.
  • +
  • Useful when distributions are unknown or have unequal variances.
  • +
  • Computes a p-value to indicate the similarity.
  • +
  • Matching score derived from the p-value.
  • +
+
+
+
+

Spearman’s Rank Correlation Coefficient Method

+
+
    +
  • Measures correlation between two sets of values.
  • +
  • If dataset sizes differ, randomly sample the larger set to match sizes.
  • +
+
+
+
+
+

Classifier Independence

+
+
    +
  • HDP approach can be paired with any machine learning algorithm (e.g., SVM, RF, etc.)
  • +
+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250329200158-ise_week_4.html b/output/20250329200158-ise_week_4.html new file mode 100755 index 0000000..5898097 --- /dev/null +++ b/output/20250329200158-ise_week_4.html @@ -0,0 +1,772 @@ + + + + + + + +ise_week_4 + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

iseweek4

+ +
+ + + +
+

DONE Multi/Many-objective Software Testing (Sapienz) (pages 80-97)

+
+

+want to figure out how to translate the real world phenotype to a genotype +

+
+
+
+

4.2 Evolutionary Algorithms - Intelligent Software Engineering

+
+
+
+

1. Illustrative Optimization Problem

+
+
    +
  • Problem: Maximize the objective function \( f(x) = x^2 \)
  • +
  • Design variable: \( x \in \{-15, -14, ..., 0, 1, ..., 15\} \)
  • +
  • Search space: All integers between -15 and 15 inclusive
  • +
  • Objective function: \( f(x) = x^2 \), to be maximized
  • +
  • Constraints: None
  • +
  • This problem is simple and allows us to demonstrate the application of evolutionary algorithms without involving additional complexity from constraints.
  • +
+
+
+
+

2. Representation

+
+

+Evolutionary algorithms operate on representations of solutions called genotypes, which map to actual solutions (phenotypes). The choice of representation is crucial and problem-dependent. +

+
+
+

Binary Representation

+
+
    +
  • The solution is represented as a fixed-length binary string.
  • +
  • For the example problem (maximizing \( f(x) = x^2 \)), we use a 5-bit binary representation: +
      +
    • The first bit indicates the sign of \( x \): 0 for positive, 1 for negative.
    • +
    • The remaining bits represent the magnitude in binary.
    • +
  • +
  • The genotype space is \( \{0,1\}^L \), where L is the length of the binary string.
  • +
+
+
+
+

Other Common Representations

+
+
    +
  • Binary: Suitable for many simple problems.
  • +
  • Integer: Useful for categorical or discrete variables (e.g., car brands such as Toyota, Volkswagen, etc.).
  • +
  • Floating Point: Used for problems with continuous variables. For example, optimizing \( f(x_1, x_2) = x_1 + x_2 \), where \( x_1, x_2 \in [0,1] \).
  • +
  • Permutations: Suitable for ordering problems like the Traveling Salesman Problem.
  • +
  • Matrices: Employed in more complex problems such as staff allocation or scheduling.
  • +
+
+
+
+
+

3. Evolutionary Algorithm Steps

+
+

+The typical steps in an evolutionary algorithm include: +

+ +
    +
  1. Initialization: +
      +
    • Start with a randomly generated population of candidate solutions.
    • +
    • Ensure a diverse set of individuals to explore the search space effectively.
    • +
    • Optionally include known solutions or use heuristics to seed the initial population.
    • +
  2. + +
  3. Evaluation: +
      +
    • Each individual is evaluated using a fitness function.
    • +
    • The fitness function quantifies how well an individual performs with respect to the problem objective.
    • +
  4. + +
  5. +Main Loop (repeats until termination condition is met): +a. Selection: +

    +
      +
    • Select parent individuals based on their fitness.
    • +
    • Higher fitness individuals have a higher chance of being selected.
    • +
    + +

    +b. Recombination (Crossover): +

    +
      +
    • Combine selected parents to produce new offspring.
    • +
    • Occurs with probability \( P_c \) (crossover probability).
    • +
    + +

    +c. Mutation: +

    +
      +
    • Randomly alter offspring genes to maintain diversity.
    • +
    • Occurs with probability \( P_m \) (mutation probability).
    • +
    + +

    +d. Evaluation of Offspring: +

    +
      +
    • Assess the fitness of each newly created individual.
    • +
    + +

    +e. Survivor Selection: +

    +
      +
    • Decide which individuals (from parents and offspring) will make up the next generation.
    • +
    • Can use various strategies like elitism or generational replacement.
    • +
  6. +
+
+
+
+

4. Fitness Function

+
+
    +
  • The fitness function is derived from the problem’s objective or quality function.
  • +
  • It assigns a single real-valued score to each individual (phenotype).
  • +
  • The function reflects the degree to which a solution meets the desired criteria.
  • +
  • Typically, the aim is to maximize fitness.
  • +
  • If the problem is better posed as a minimization task, it can be transformed accordingly (e.g., minimizing \( f(x) \) is equivalent to maximizing \( -f(x) \)).
  • +
+
+
+
+
+

4.3 Test Case Generation using EvoSuite - Intelligent Software Engineering

+
+
+
+

1. Introduction to EvoSuite

+
+
    +
  • EvoSuite is a tool developed by Fraser and Arcuri (2011) for automated test case generation.
  • +
  • It generates whole test suites (not just individual test cases) for a given software system.
  • +
  • The tool accepts a list of input classes to be tested and produces corresponding JUnit test case code.
  • +
  • It leverages genetic algorithms, a form of evolutionary computation, to evolve effective test suites.
  • +
+
+
+
+

2. Motivation and Limitations of Traditional Methods

+
+
    +
  • Conventional test generation tools typically focus on single coverage goals (e.g., a single program branch).
  • +
  • Assumes: +
      +
    • All coverage goals are equally important.
    • +
    • All goals are equally difficult to reach.
    • +
    • Goals are independent of each other.
    • +
  • +
  • These assumptions are problematic: +
      +
    • The sequence in which goals are selected can significantly affect the quality of the resulting test suite.
    • +
    • Interdependencies among goals are often ignored.
    • +
  • +
+
+
+

Solution:

+
+
    +
  • Generate whole test suites rather than isolated test cases.
  • +
  • Takes into account relationships between methods/classes.
  • +
+
+
+
+
+

3. Architecture and Representation

+
+
+
+

Test Suite Representation

+
+
    +
  • A test suite \( T \) consists of multiple test cases.
  • +
  • Each test case is a sequence of statements of varying types and lengths.
  • +
  • The total length of a test suite is the sum of the lengths of its individual test cases.
  • +
+
+
+
+

Statement Types in Test Cases

+
+
    +
  1. Primitive statements: Initialize basic types (e.g., `int var0 = 54`)
  2. +
  3. Constructor statements: Create new instances (e.g., `Stack var1 = new Stack()`)
  4. +
  5. Field statements: Access object members (e.g., `int var2 = var1.size`)
  6. +
  7. Method statements: Call methods (e.g., `int var3 = var1.pop()`)
  8. +
+
+
+
+
+

4. Fitness Function

+
+
    +
  • Guides the selection of parents in the genetic algorithm.
  • +
  • Aims to maximize code coverage.
  • +
  • If two test suites achieve the same coverage, the one with fewer statements is preferred (parsimony).
  • +
  • Uses branch coverage as the primary metric.
  • +
  • Employs the branch distance heuristic: +
      +
    • Measures how close an input is to flipping a predicate’s boolean outcome.
    • +
  • +
+
+
+
+

5. Bloat Control

+
+
    +
  • A known issue in Genetic Algorithms is bloat, where test cases grow unnecessarily large.
  • +
  • Can lead to memory exhaustion and inefficiency.
  • +
+
+
+

Techniques Used:

+
+
    +
  • Set limits: +
      +
    • Maximum number of test cases \( N \)
    • +
    • Maximum length per test case \( L \)
    • +
  • +
  • Discard offspring that do not provide improved coverage.
  • +
+
+
+
+
+

6. Search Operators

+
+
+
+

Crossover Operator

+
+
    +
  • Combines two parent test suites (P1 and P2) to generate two offspring (O1 and O2).
  • +
  • O1 = first \( a \cdot |P1| \) test cases from P1 + remaining from P2.
  • +
  • O2 = similar combination from P2 and P1.
  • +
  • Valid since test cases are independent.
  • +
  • Helps reduce difference in length between resulting test suites.
  • +
+
+
+
+

Mutation Operator

+
+
    +
  • Mutation is applied with a probability of \( 1/T \), where \( T \) is the number of test cases.
  • +
  • New test cases may be added with a probability \( p \), up to a maximum count \( N \).
  • +
+
+
+
+

Mutation Operations (applied with equal probability 1/3):

+
+
    +
  1. Remove: +
      +
    • Each statement \( s_i \) is deleted with probability \( 1/n \), where \( n \) is the number of statements.
    • +
    • If needed, replace deleted statements to keep test case valid.
    • +
  2. + +
  3. Change: +
      +
    • Each statement \( s_i \) may be altered.
    • +
    • For primitives: change numeric value randomly within ±Δ.
    • +
    • For others: change to a method/field/constructor of the same type.
    • +
  4. + +
  5. Insert: +
      +
    • A new statement is inserted at a random position in the test case.
    • +
  6. +
+
+
+
+
+

7. Results and Evaluation

+
+
    +
  • Key takeaway: EvoSuite outperforms traditional single-goal test generation tools.
  • +
  • Reported improvement: Up to 18x better branch coverage than single-branch strategies.
  • +
+
+
+
+
+

4.4 Multi/Many-objective Software Testing with Sapienz - Intelligent Software Engineering

+
+
+
+

1. Introduction to Sapienz

+
+
    +
  • Sapienz is an automated software testing tool developed by Mao et al. (2016).
  • +
  • It uses evolutionary algorithms to generate test cases for Android apps.
  • +
  • Notable Achievements: +
      +
    • Tested the top 1000 most popular Google Play apps.
    • +
    • Discovered 558 unique and previously unknown app crashes.
    • +
    • Led to a commercial spinout company named MaJiCkE.
    • +
    • Acquired by Facebook/Meta.
    • +
  • + +
  • Sapienz customizes the NSGA-II algorithm (a multi-objective genetic algorithm) for test case generation.
  • +
+ +

+Reference: Mao, Ke, Mark Harman, and Yue Jia. “Sapienz: Multi-objective automated testing for android applications.” ISSTA 2016. +

+
+
+
+

2. NSGA-II: An Overview

+
+
    +
  • NSGA-II is a Genetic Algorithm (GA) adapted for multi-objective optimization.
  • +
  • Key Differences from standard GA: +
      +
    • Uses Pareto dominance for survival selection.
    • +
    • A solution a dominates solution b if: +
        +
      • \( a_i \leq b_i \) for all objectives, and
      • +
      • \( \exists j \) such that \( a_j < b_j \)
      • +
    • +
    • A Pareto optimal solution is one that is not dominated by any other in the population.
    • +
  • + +
  • NSGA-II also uses: +
      +
    • Non-dominated sorting: Separates population into Pareto fronts.
    • +
    • Crowding distance: Prefers diverse solutions within the same front.
    • +
  • +
+
+
+
+

3. Representation

+
+
    +
  • Specific representation details were not included in the slides but are tailored to represent Android GUI interaction sequences.
  • +
+
+
+
+

4. Objective Functions in Sapienz

+
+

+Sapienz optimizes multiple objectives simultaneously: +

+
+
+

a. Code Coverage

+
+
    +
  • Types of coverage used: +
      +
    • Statement Coverage: Measures how many individual code statements are executed.
    • +
    • Method Coverage: Measures the number of methods invoked.
    • +
    • Android Activity Coverage: Tracks which screens (activities) of the app are accessed. +
        +
      • Example: A dialer app may include separate activities for contacts, keypad, call history, etc.
      • +
    • +
  • +
+
+
+
+

b. Test Case Length

+
+
    +
  • Shorter test cases are generally preferred to improve efficiency and reduce overhead.
  • +
  • Multiple slides (86–89) emphasize the importance of minimizing test length.
  • +
+
+
+
+

c. Crash Discovery

+
+
    +
  • The number of test cases that lead to app crashes is also a key metric.
  • +
  • Objective: Maximize the number of crash-inducing test cases.
  • +
+
+
+
+
+

5. Search Operators

+
+
+
+

a. Crossover

+
+
    +
  • Combines parts of two parent test sequences to form new offspring.
  • +
  • Details of the crossover structure are tool-specific but follow the typical GA-style recombination.
  • +
+
+
+
+

b. Mutation

+
+
    +
  • Mutations are applied to test cases to explore new behaviors.
  • +
  • Types of Mutation: + +
      +
    1. High-Level Mutation: +
        +
      • Alters the structure or intent of test sequences.
      • +
    2. + +
    3. Low-Level Mutation (Same Size): +
        +
      • Changes test actions without altering the sequence length.
      • +
    4. + +
    5. Low-Level Mutation (Different Size): +
        +
      • Adds or removes actions to vary the length of test cases.
      • +
    6. + +
    7. Low-Level Mutation (Shuffling): +
        +
      • Reorders existing actions in the test case.
      • +
    8. +
  • +
+
+
+
+
+

6. Results and Observations

+
+
    +
  • Sapienz significantly outperforms other automated testing tools in terms of: +
      +
    • Number of crashes detected.
    • +
    • Coverage achieved.
    • +
    • Efficiency in test generation.
    • +
  • +
+ + + + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250329231658-emacs_stuff_magit.html b/output/20250329231658-emacs_stuff_magit.html new file mode 100755 index 0000000..7162b55 --- /dev/null +++ b/output/20250329231658-emacs_stuff_magit.html @@ -0,0 +1,353 @@ + + + + + + + +emacs-stuff-magit + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

emacs-stuff-magit

+ +
+
+

Magit Key Guide (Quick Reference)

+
+
+
+

Open Magit

+
+
+
C-x g
Open Magit status buffer
+
+
+
+
+

Staging & Unstaging

+
+
+
s
Stage (file or hunk)
+
u
Unstage
+
S
Stage all
+
U
Unstage all
+
+
+
+
+

Committing

+
+
+
c c
Commit
+
C-c C-c
Confirm commit (in commit buffer)
+
c a
Amend last commit
+
+
+
+
+

Branching

+
+
+
b b
Switch branch
+
b c
Create new branch
+
b m
Merge into current
+
b M
Rebase onto another branch
+
+
+
+
+

Push / Pull

+
+
+
P u
Push to upstream
+
F u
Pull from upstream
+
f u
Fetch from upstream
+
+
+
+
+

Logs & Diffs

+
+
+
l l
Show log for current branch
+
d
Show diff (between commits, etc.)
+
RET
View diff at point
+
+
+
+
+

Help & Dispatch

+
+
+
?
Show help for current buffer
+
x
Open Magit dispatch menu (magit-dispatch)
+
!
Run Git command (rebase, cherry-pick, etc.)
+
+
+
+
+

Other Essentials

+
+
+
k
Discard changes (careful)
+
q
Quit Magit buffer
+
+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250331201944-ise_week_5.html b/output/20250331201944-ise_week_5.html new file mode 100755 index 0000000..44a1b4d --- /dev/null +++ b/output/20250331201944-ise_week_5.html @@ -0,0 +1,496 @@ + + + + + + + +ise_week_5 + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

iseweek5

+ +
+ + + + +
+

5.1 Model-Free Tuning for ORM Systems - Intelligent Software Engineering

+
+
+
+

1. Introduction and Background

+
+
    +
  • This approach was proposed by Singh et al. (2016).
  • +
  • The goal is to optimize Object-Relational Mapping (ORM) systems without relying on models.
  • +
  • Uses NSGA-II, a multi-objective evolutionary algorithm, to handle multiple performance concerns.
  • +
+ +

+Reference: Singh, Ravjot et al. “Optimizing the performance-related configurations of object-relational mapping frameworks using a multi-objective genetic algorithm.” ACM/SPEC ICPE 2016. +

+
+
+
+

2. Architecture and Setup

+
+
    +
  • Focuses exclusively on binary configuration options.
  • +
  • Example of a configuration: `{0011}` – a binary vector where each bit represents a configuration toggle (on/off).
  • +
  • Evaluates performance using three objective metrics: +
      +
    • Execution time
    • +
    • CPU load
    • +
    • Memory consumption
    • +
  • +
  • Other components follow the standard NSGA-II flow: selection, crossover, mutation, and fitness evaluation.
  • +
+
+
+
+

3. Stopping Criteria

+
+

+Two specific stopping rules are proposed for determining when to terminate the evolutionary process: +

+
+
+

a. Setting 1: t-test-based Stopping

+
+
    +
  • Conducts statistical t-tests to compare changes in objective values between generations.
  • +
  • For each pair of consecutive generations \( g_i \) and \( g_j \): +
      +
    • Run a t-test on ∆CPU and ∆MEM between all configurations in both generations.
    • +
  • +
  • If all p-values > 0.05 for two consecutive generations, it indicates no statistically significant improvement, and the algorithm is stopped.
  • +
+
+
+
+

b. Setting 2: Mutual Dominance Rate (MDR)

+
+
    +
  • Measures how much progress is made by comparing the current and previous generation.
  • +
  • Let: +
      +
    • Set A = configurations from the previous generation
    • +
    • Set B = configurations from the current generation
    • +
  • +
  • Define \( dom(A,B) \) as the number of configurations in A that are dominated by any configuration in B.
  • +
+ +

+Interpretation: +

+
    +
  • MDR = 0: No progress — performance plateau
  • +
  • MDR < 0: Regression — performance is deteriorating
  • +
  • MDR > 0: Improvement — current generation is better than the last
  • +
+
+
+
+
+

4. Termination Condition

+
+
    +
  • The tuning process should stop if any of the defined stopping conditions (t-test or MDR) are met.
  • +
+
+
+
+

5. Experimental Results

+
+
    +
  • NSGA-II consistently found configurations that ranked within the top 25% of all possible configurations across tested applications.
  • +
  • Results were obtained by combining different aggregation functions and stopping rules, demonstrating strong generalization and effectiveness.
  • +
+
+
+
+
+

5.2 Model-Free Tuning with BestConfig - Intelligent Software Engineering

+
+
+
+

1. Introduction and Background

+
+
    +
  • BestConfig is a model-free configuration tuning system proposed by Zhu et al. (2017).
  • +
  • It focuses on tuning for a single performance objective (e.g., throughput, latency).
  • +
  • Utilizes local search techniques rather than global evolutionary approaches.
  • +
  • Employs label encoding for parameters (e.g., {0, 23, 100}).
  • +
  • Key strategy: aggressively explore promising regions of the configuration space.
  • +
+ +

+Reference: Zhu, Yuqing et al. “BestConfig: tapping the performance potential of systems via automatic configuration tuning.” SoCC 2017. +

+
+
+
+

2. Architecture Overview

+
+
    +
  • BestConfig is designed to intelligently search a high-dimensional configuration space.
  • +
  • Architecture relies on two core components: +
      +
    • DDS (Divide & Diverge Sampling)
    • +
    • RBS (Recursive Bound & Search)
    • +
  • +
+
+
+
+

3. DDS: Divide & Diverge Sampling

+
+
    +
  • Purpose: Ensures coverage of the entire configuration space by dividing it into subspaces.
  • +
  • Process: +
      +
    1. Each configuration parameter’s range is divided into k intervals.
    2. +
    3. These intervals are combined across all parameters, forming \( k^n \) subspaces.
    4. +
    5. One random sample is taken from each subspace.
    6. +
  • + +
  • Advantages: +
      +
    • Avoids bias in sampling (common in uniform random search).
    • +
    • More likely to sample from all areas of the space.
    • +
    • Especially useful in high-dimensional spaces.
    • +
  • +
+
+
+
+

4. RBS: Recursive Bound & Search

+
+
    +
  • Purpose: Locally refines and improves the best-known configuration.
  • +
  • Steps: +
      +
    1. Identify the best-performing configuration \( C_0 \) from the initial samples.
    2. +
    3. Define bounds for each parameter based on neighboring values around \( C_0 \).
    4. +
    5. Sample new points within this bounded space to find a better configuration \( C_1 \).
    6. +
    7. Repeat the bounding and sampling process recursively until no improvement is found.
    8. +
  • + +
  • Bound Definition: +
      +
    • For each parameter value in \( C_0 \), the closest lower and higher values in the dataset are chosen as bounds.
    • +
  • + +
  • Termination Conditions: +
      +
    • If no better configuration is found in a recursive round, the search restarts from a broader space.
    • +
    • The entire tuning process stops only when a predefined resource budget (e.g., time, evaluations) is exhausted.
    • +
  • +
+
+
+
+

5. Results and Observations

+
+
    +
  • BestConfig consistently finds configurations significantly better than the system’s default settings.
  • +
  • Achieves these improvements within a reasonable time frame, making it practical for real-world use.
  • +
+ + + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250331202447-ise_week_7.html b/output/20250331202447-ise_week_7.html new file mode 100755 index 0000000..762ab51 --- /dev/null +++ b/output/20250331202447-ise_week_7.html @@ -0,0 +1,505 @@ + + + + + + + +ise_week_7 + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

iseweek7

+ +
+ + +
+

7.1 Comparing Algorithms in Intelligent Software Engineering

+
+
+
+

1. Motivation

+
+
    +
  • Algorithms and configurations vary in performance.
  • +
  • No universally best algorithm: performance depends on the specific problem (“No Free Lunch” theorem).
  • +
  • To determine which algorithm/configuration is suitable, comparison is essential.
  • +
  • However, comparison is challenging due to the stochastic nature of computational intelligence algorithms.
  • +
+
+
+
+

2. Stochastic Behaviour in Algorithms

+
+
    +
  • Sources of randomness: +
      +
    • In the algorithm (e.g., random initial population, stochastic gradient descent, mutation/crossover probabilities).
    • +
    • In data sampling.
    • +
  • +
  • Result: Running the same algorithm multiple times on the same problem yields different results.
  • +
  • Therefore, comparisons must account for this randomness.
  • +
+
+
+
+

3. Handling Stochastic Behaviour

+
+
    +
  • To compare algorithms meaningfully: +
      +
    • Run each algorithm multiple times (e.g., 30+ runs) using different random seeds.
    • +
    • This helps capture typical performance and reduce reliance on single-run outliers.
    • +
  • +
+
+
+
+

4. Methods for Comparison

+
+
+
+

a. Mean (Average)

+
+
    +
  • Simple and common.
  • +
  • Problems: +
      +
    • Sensitive to outliers.
    • +
    • Does not represent variability in results.
    • +
  • +
+
+
+
+

b. Mean + Standard Deviation

+
+
    +
  • Adds information about variation.
  • +
  • Still affected by outliers.
  • +
  • Hard to tell whether differences are statistically significant.
  • +
+
+
+
+

c. Median

+
+
    +
  • More robust to outliers.
  • +
  • Example: +
      +
    • Sorted list: 0.000001, 0.6, 0.62, 0.65, 0.7, 0.75, 0.8, 0.8, 0.81
    • +
    • Median = 0.7
    • +
  • +
  • Problem: Ignores variation in data.
  • +
+
+
+
+

d. Median + Quartiles

+
+
    +
  • 1st and 3rd quartiles provide information about data spread.
  • +
  • Still doesn’t guarantee ability to distinguish between groups.
  • +
+
+
+
+

e. Statistical Hypothesis Testing

+
+
    +
  • Scientific method to determine if observed differences are statistically significant.
  • +
  • Necessary for robust and credible comparison of algorithms.
  • +
+
+
+
+
+

5. Statistical Hypothesis Testing: Process

+
+
    +
  1. Define what to compare (e.g., accuracy or fitness).
  2. +
  3. Ensure fair comparison: +
      +
    • Equal number of evaluations or explain why not.
    • +
    • Example: Adjust generations to equate computational budget across algorithms.
    • +
  4. +
  5. Formulate hypotheses: +
      +
    • Null hypothesis (H₀): No difference between the two groups.
    • +
    • Alternative hypothesis (H₁): A statistically significant difference exists.
    • +
  6. +
  7. Select an appropriate test based on data distribution.
  8. +
+
+
+
+

6. Choosing the Test

+
+
+
+

a. Normality Assumption

+
+
    +
  • Many statistical tests assume a normal distribution of values.
  • +
  • Visual inspection or tests (e.g., Shapiro-Wilk) can check this.
  • +
+
+
+
+

b. Parametric vs Non-parametric Tests

+
+
    +
  • Parametric tests (e.g., t-test): +
      +
    • More powerful.
    • +
    • Require assumptions (e.g., normality, homogeneity of variance).
    • +
  • +
  • Non-parametric tests (e.g., Wilcoxon, Mann-Whitney): +
      +
    • Safer for non-normal data.
    • +
    • Widely used in stochastic algorithm comparisons.
    • +
  • +
+
+
+
+

c. Paired vs Unpaired Tests

+
+
    +
  • Paired: Use when comparing results from same initial conditions.
  • +
  • Unpaired: Use when runs are completely independent.
  • +
+
+
+
+
+

7. Test Outputs

+
+
    +
  • Test produces a statistic and a p-value. +
      +
    • If p ≤ 0.05, reject H₀: significant difference exists.
    • +
    • If p > 0.05, do not reject H₀: no significant difference found.
    • +
  • +
  • Significance level is usually set to 0.05, corresponding to 95% confidence.
  • +
  • Lower significance (e.g., 0.01) may be used in critical applications.
  • +
+
+
+
+

8. Interpreting P-Values

+
+
    +
  • High p-value → Observed difference likely due to chance → Do not reject H₀.
  • +
  • Low p-value → Observed difference unlikely due to chance → Reject H₀.
  • +
+
+
+
+

9. Test Examples (in R)

+
+
    +
  • Two-tailed Wilcoxon Rank-Sum Test (unpaired).
  • +
  • Two-tailed Wilcoxon Signed-Rank Test (paired).
  • +
+
+
+
+

10. Multiple Comparisons Problem

+
+
    +
  • Comparing many algorithms or configurations increases the risk of Type I errors (false positives).
  • +
  • Correction methods: +
      +
    • Adjust the significance threshold (e.g., Bonferroni correction).
    • +
    • Downside: Conservative → reduced power (risk of missing real differences).
    • +
  • +
+
+
+
+

11. Tests for N Groups

+
+
    +
  • Stronger than multiple pairwise tests with correction.
  • +
  • Common tests: +
      +
    • Kruskal-Wallis Test: for unpaired comparisons across groups.
    • +
    • Friedman Test: for paired comparisons across groups.
    • +
  • +
+
+
+

Post-hoc Analysis

+
+
    +
  • Needed when the global test finds significant differences but doesn’t specify which pairs differ. +
      +
    • Kruskal-Wallis → Dunn post-hoc test.
    • +
    • Friedman → Nemenyi post-hoc test.
    • +
  • +
+ + + + +
+
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250402185735-java_moc.html b/output/20250402185735-java_moc.html new file mode 100755 index 0000000..5bfb6c4 --- /dev/null +++ b/output/20250402185735-java_moc.html @@ -0,0 +1,276 @@ + + + + + + + +java_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250402185735-technical_java_notes.html b/output/20250402185735-technical_java_notes.html new file mode 100755 index 0000000..ef8b1c1 --- /dev/null +++ b/output/20250402185735-technical_java_notes.html @@ -0,0 +1,276 @@ + + + + + + + +java_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250403120140-fyp_report_planning.html b/output/20250403120140-fyp_report_planning.html new file mode 100755 index 0000000..65e8f5b --- /dev/null +++ b/output/20250403120140-fyp_report_planning.html @@ -0,0 +1,668 @@ + + + + + + + +fyp-report-planning + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

fyp-report-planning

+ +
+
    +
  1. +Title Page +

    + +

    +Title: “AI-Assisted Note-Taking Web Application” +

    + +

    +Your Name +

    + +

    +Supervisor’s Name +

    + +

    +Institution/Department +

    + +

    +Date +

  2. +
+ + + +
    +
  1. +Abstract +

    + +

    +A concise summary of the project (150–250 words). +

    + +

    +Highlight the problem, solution, methods, and results. +

  2. +
+ + + + + +
    +
  1. +Table of Contents +

    + +

    +Include all headings and subheadings with page numbers. +

  2. +
+ + + +
    +
  1. +Introduction +

    + +

    +4.1 Background: Explain the context of note-taking and its challenges. +

    + +

    +4.2 Problem Statement: Describe the specific problem you aim to solve (e.g., information overload, accessibility). +

    + +

    +4.3 Objectives: Define the goals of your project. +

    + +

    +4.4 Scope: Clearly state the boundaries of the project. +

    + +

    +4.5 Dissertation Structure: Briefly outline the contents of each section. +

  2. +
+ + + +
    +
  1. +Literature Review +

    + +

    +5.1 Existing Solutions: Review existing tools for note-taking, their advantages, and limitations. +

    + +

    +5.2 Related Research: Explore research on AI, NLP, and note-taking technologies. +

    + +

    +5.3 Gaps in the Literature: Identify areas not addressed by current solutions, justifying the need for your project. +

  2. +
+ + + +
    +
  1. +Methodology +

    + +

    +6.1 Problem Analysis: Define the user requirements and personas. +

    + +

    +6.2 Proposed Solution: Describe your AI-assisted note-taking solution conceptually. +

    + +

    +6.3 Technology Stack: Outline the tools, frameworks, APIs, and databases you plan to use. +

    + +

    +6.4 System Architecture: Include diagrams for the client-server architecture and system workflow. +

    + +

    +6.5 Data Handling: Describe how the AI will process input data (e.g., text, audio) and produce outputs. +

  2. +
+ + + +
    +
  1. +Implementation +

    + +

    +7.1 Development Process: Document how you built the system (e.g., Agile methodology). +

    + +

    +7.2 Features: Detail key features, such as AI-powered summarization, search functionality, or collaboration tools. +

    + +

    +7.3 Challenges: Discuss technical challenges and how you addressed them. +

  2. +
+ + + +
    +
  1. +Evaluation +

    + +

    +8.1 Testing: Describe how you tested the application (e.g., user testing, performance metrics). +

    + +

    +8.2 Results: Present quantitative and qualitative results, including user feedback and performance benchmarks. +

    + +

    +8.3 Analysis: Critically analyze the results and their implications. +

  2. +
+ + + +
    +
  1. +Discussion +

    + +

    +9.1 Contributions: Highlight the unique aspects of your solution. +

    + +

    +9.2 Limitations: Address any shortcomings in your system. +

    + +

    +9.3 Future Work: Suggest possible enhancements and future research directions. +

  2. +
+ + + +
    +
  1. +Conclusion +

    + +

    +Summarize the problem, solution, and key findings. +

    + +

    +Reiterate the impact of your work and its importance. +

  2. +
+ + + +
    +
  1. +References +

    + +

    +List all the sources cited in the document using a consistent citation style (e.g., APA, IEEE, Harvard). +

  2. +
+ + + +
    +
  1. +Appendices +

    + +

    +Include any additional materials, such as: +

    + +

    +Code snippets +

    + +

    +User manuals +

    + +

    +Detailed testing data +

    + +

    +Wireframes or UI designs +

  2. +
+
+

intro

+
+

+## 1.1 Background +

+ +

+The digital era has revolutionized the way people consume and manage information. With the proliferation of online content, academic resources, and professional documentation, individuals are constantly processing vast amounts of data. Note-taking, a fundamental cognitive tool for organizing knowledge, has evolved from traditional pen-and-paper methods to digital platforms that offer increased accessibility, storage, and retrieval capabilities. Despite these advancements, users still face challenges such as information overload, inefficient retrieval, and lack of contextual understanding. +

+ +

+Artificial Intelligence (AI) and Natural Language Processing (NLP) have emerged as transformative technologies in optimizing information management. AI-powered note-taking applications can enhance the process by automatically summarizing content, organizing notes, and enabling intelligent search functionalities. By leveraging machine learning techniques, these systems can provide a personalized and efficient approach to note-taking, reducing cognitive load and improving productivity. +

+ +

+## 1.2 Problem Statement +

+ +

+While digital note-taking applications exist, most rely on manual input and basic text organization without leveraging AI to enhance usability. Users often struggle with the sheer volume of notes, leading to difficulties in retrieving relevant information quickly. Traditional search mechanisms lack semantic understanding, making it challenging to locate specific insights. Additionally, manually summarizing large amounts of text is time-consuming and inefficient. There is a growing need for a system that can intelligently process, categorize, and retrieve notes in an intuitive manner. +

+ +

+## 1.3 Objectives +

+ +

+This project aims to develop an AI-assisted note-taking web application that enhances knowledge management through NLP and machine learning. The primary objectives include: +

+ +
    +
  • Automated Summarization: Implement AI-powered summarization to extract key points from lengthy notes.
  • +
  • Intelligent Search: Develop a smart search function that understands context and retrieves relevant information efficiently.
  • +
  • Automated Tagging and Organization: Utilize AI to categorize and label notes for easy navigation.
  • +
  • Speech-to-Text Integration: Enable users to convert spoken content into structured notes.
  • +
  • User-Friendly Interface: Design an intuitive UI/UX for seamless interaction and accessibility.
  • +
+ +

+## 1.4 Scope +

+ +

+This project focuses on developing a web-based AI-assisted note-taking application with core functionalities such as summarization, intelligent search, and speech-to-text conversion. The system will leverage NLP models and machine learning techniques to process textual data effectively. However, the project does not aim to develop a fully autonomous AI capable of understanding handwritten notes or processing multimedia inputs such as images and videos. Future enhancements may incorporate these aspects. +

+ +

+## 1.5 Dissertation Structure +

+ +

+This dissertation is structured as follows: +

+ +
    +
  • Chapter 2: Literature Review – Discusses existing note-taking solutions, AI applications in knowledge management, and identifies gaps in the literature.
  • +
  • Chapter 3: Methodology – Outlines the technical approach, system architecture, and technologies used in developing the application.
  • +
  • Chapter 4: Implementation – Details the development process, features, and challenges encountered.
  • +
  • Chapter 5: Evaluation – Presents testing methodologies, results, and user feedback.
  • +
  • Chapter 6: Discussion – Analyzes contributions, limitations, and potential future work.
  • +
  • Chapter 7: Conclusion – Summarizes findings and the impact of the research.
  • +
+ +

+By addressing the challenges of digital note-taking with AI, this project aims to provide an innovative solution that enhances productivity and information management. +

+
+
+
+

intor 2

+
+

+Absolutely! Here’s a draft of the Introduction section for your dissertation titled “AI-Assisted Note-Taking Web Application”. This version reflects a strong academic tone and addresses all required subheadings (4.1–4.5). Feel free to tweak any specific names or phrases to better match your own work: +

+ +

+— +

+ +

+## 4. Introduction +

+ +

+### 4.1 Background +

+ +

+Note-taking plays a fundamental role in both academic and professional contexts, serving as a critical tool for learning, information retention, and productivity. Traditional methods of note-taking, whether handwritten or digital, often rely heavily on user input, which can be cognitively demanding, time-consuming, and inconsistent across users. In the age of digital information, individuals are increasingly overwhelmed by the volume and complexity of content encountered during lectures, meetings, or research. This has led to growing concerns about cognitive overload, especially when users must process, organize, and retrieve large quantities of data manually. +

+ +

+With the advancement of Artificial Intelligence (AI) and Natural Language Processing (NLP), there is a growing potential to revolutionize the way notes are captured, organized, and utilized. By leveraging machine learning algorithms, semantic understanding, and contextual summarization, AI can assist users in real-time or post-session to generate coherent and concise notes. However, the integration of such technologies into practical, user-friendly applications remains an ongoing challenge. +

+ +

+### 4.2 Problem Statement +

+ +

+Despite the availability of numerous note-taking tools, many fail to address critical user pain points such as cognitive overload, poor summarization, lack of personalization, and limited accessibility. Students, professionals, and individuals with neurodivergent needs may find it especially difficult to engage with existing solutions that require constant manual interaction. There remains a significant gap in tools that can intelligently process raw input (e.g., text or speech), summarize key points, and provide structured, searchable output that adapts to the user’s workflow. This project aims to bridge that gap by developing an AI-assisted web application that automates and enhances the note-taking process. +

+ +

+### 4.3 Objectives +

+ +

+The primary objectives of this dissertation project are: +

+ +
    +
  • To design and implement a web-based note-taking application that integrates AI capabilities for summarization and organization.
  • +
  • To explore the use of NLP and machine learning techniques for processing text-based inputs.
  • +
  • To improve accessibility and reduce cognitive load for users by automating key aspects of the note-taking process.
  • +
  • To evaluate the effectiveness and usability of the system through user feedback and performance metrics.
  • +
+ +

+### 4.4 Scope +

+ +

+This project focuses on the development of a prototype web application tailored to textual note input, though the underlying architecture may be extended to support audio input in future iterations. The system will include core features such as AI-powered summarization, keyword extraction, and searchable note archives. It will be built using Angular for the frontend, Spring Boot for the backend, and PostgreSQL for data storage. OpenAI’s API will be utilized to integrate advanced language processing capabilities. While the project does not aim to develop novel NLP models, it will focus on the integration and optimization of existing tools to deliver a practical, user-centric solution. +

+ +

+### 4.5 Dissertation Structure +

+ +

+This dissertation is structured as follows: +

+
    +
  • Chapter 5: Literature Review examines current note-taking tools, relevant AI technologies, and identifies gaps that justify this project.
  • +
  • Chapter 6: Methodology describes the user research, system design, technology stack, and system architecture.
  • +
  • Chapter 7: Implementation details the development process, key features, and technical challenges faced during the build.
  • +
  • Chapter 8: Evaluation outlines the testing methods used and presents results with analysis.
  • +
  • Chapter 9: Discussion reflects on the project’s contributions, limitations, and potential directions for future work.
  • +
  • Chapter 10: Conclusion summarizes the project and reiterates its significance.
  • +
+ +

+— +

+ +

+Would you like help tailoring this to reflect specific design decisions you’ve already made, like how your AI summarizer works or your user testing process? +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250412234351-wp_sadness.html b/output/20250412234351-wp_sadness.html new file mode 100755 index 0000000..09284eb --- /dev/null +++ b/output/20250412234351-wp_sadness.html @@ -0,0 +1,289 @@ + + + + + + + +wp-sadness + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wp-sadness

+ +
+

+Emotions. We all feel them on a daily basis. Happiness, anger, sadness, fear and disgust. They come and they go, sometimes for a long duration, and at other times merely for a few seconds. Sadness in particular is an interesting emotion; I say this for two reasons: the first is that it reminds us of what matters to us, and the second is that it makes you realise things about yourself that you never knew of before. Sadness is something that honestly makes you step out of your own body and view things in a different light, you become more perceptive despite the phyiscal and mental tang you feel. Should we strive to stop feeling sad? Who knows, some may say it’s a part of who we are, others may counter and say that it’s not a desired emotion. Regardless, we all have felt it at some point in our lives; the quantity of which varies across people, for some, it could be very minute and for some very large. +

+ +

+> “Some psychologists argue that sadness plays an evolutionary role—it slows us down, forces us to think, to reflect, to re-evaluate our priorities. It’s the brain’s way of making us pause, take stock, and reorient ourselves.” +

+ +

+There comes that word: pause. How important is it to sometimes just pause and reflect, to ponder over life and the things happening around us. When was the last time we sat in silence with no distractions, no phones, no people, nothing. We learn a lot when we tune in to our emotions, despite how much sadness may heart, and how much it makes us want to cry, we should always remember that this same sadness adds value to the happy moments in life. Like shadows on a painting, it gives dimension to our emotional world. +

+ +

+It reminds me of this verse in the noble Quran: فَإِنَّ مَعَ ٱلْعُسْرِ يُسْرًا which means: “So, surely with hardship comes ease.” The hardship we face in life always has a positive aspect to it, sometimes we become too blinded and short sighted by the trials and tribulations that we forget to look at it from another angle. +

+ +

+Anyways I’ll end this with this poetic touch: +> “Sadness doesn’t shout. It whispers. It sits beside you in silence. It tugs at your sleeve when the world moves too fast. And in that quiet tug, you find pieces of yourself you forgot existed.” +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250417173809-linux_moc.html b/output/20250417173809-linux_moc.html new file mode 100755 index 0000000..021fa2e --- /dev/null +++ b/output/20250417173809-linux_moc.html @@ -0,0 +1,276 @@ + + + + + + + +linux_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250417173809-linux_stuff.html b/output/20250417173809-linux_stuff.html new file mode 100755 index 0000000..c2097a8 --- /dev/null +++ b/output/20250417173809-linux_stuff.html @@ -0,0 +1,277 @@ + + + + + + + +linux_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250417173821-wacom_notes.html b/output/20250417173821-wacom_notes.html new file mode 100755 index 0000000..eaf4e6a --- /dev/null +++ b/output/20250417173821-wacom_notes.html @@ -0,0 +1,325 @@ + + + + + + + +wacom-notes + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

wacom-notes

+ +
+

+The command: `xsetwacom –list` gave me: +

+ +

+Wacom One by Wacom M Pen stylus id: 12 type: STYLUS +Wacom One by Wacom M Pen eraser id: 13 type: ERASER +

+ +

+Then, in order to map the stylus to a single monitor i needed to know my monitor mappings via `xrandr`: +

+ +

+Screen 0: minimum 8 x 8, current 3840 x 1080, maximum 32767 x 32767 +DP-0 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 600mm x 340mm + 1920x1080 60.00*+ 143.85 119.98 59.94 + 1680x1050 59.95 + 1440x900 59.89 + 1440x576 50.00 + 1440x480 59.94 + 1280x1024 75.02 60.02 + 1280x960 60.00 + 1280x720 60.00 59.94 + 1152x864 75.00 + 1024x768 75.03 70.07 60.00 + 800x600 75.00 72.19 60.32 56.25 + 720x480 59.94 + 640x480 75.00 72.81 59.94 59.93 +DP-1 disconnected (normal left inverted right x axis y axis) +HDMI-0 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 521mm x 293mm + 1920x1080 60.00*+ 59.94 50.00 + 1680x1050 59.95 + 1600x900 60.00 + 1440x900 59.89 + 1280x1024 60.02 + 1280x800 59.81 + 1280x720 60.00 59.94 50.00 + 1024x768 70.07 60.00 + 800x600 72.19 60.32 56.25 + 720x576 50.00 + 720x480 59.94 + 640x480 72.81 59.94 +DP-2 disconnected (normal left inverted right x axis y axis) +DP-3 disconnected (normal left inverted right x axis y axis) +DP-4 disconnected (normal left inverted right x axis y axis) +DP-5 disconnected (normal left inverted right x axis y axis) +

+ +

+Then I simply map it via: +

+ +

+`xsetwacom set “Wacom One by Wacom M Pen stylus” MapToOutput HEAD-0` +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250420012258-emacs_stuff_evil.html b/output/20250420012258-emacs_stuff_evil.html new file mode 100755 index 0000000..0ca52ba --- /dev/null +++ b/output/20250420012258-emacs_stuff_evil.html @@ -0,0 +1,340 @@ + + + + + + + +emacs-stuff-evil + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

emacs-stuff-evil

+ +
+

+C-u Cc . - timestamp +

+
+

Keybindings for moving:

+
+
+
+

Search

+
+

+To search use +Then if you want to get the hits, hit enter, then you can use ’n’ for next and ’N’ for previous hits. +

+
+
+
+

moving

+
+
    +
  • To move forward use ’e’ and ’E’
  • +
  • To move forward use ’b’ and ’B’
  • +
+

+(for beginning and end) +you can also use ’{’ and ’}’ for paragraph movement +

+ +
    +
  • To move to the next line use: ’j’
  • +
  • To move to the previous line use: ’k’
  • +
+
+
+
+

replacement

+
+

+that is a sample text +

+
    +
  • Use ’r’ To replace a single letter
  • +
  • Use ’R’ To enter replace mode and use ESC to exit it
  • +
+ +

+To do a replace all: +

+
    +
  • :%s//replacement/g
  • +
+

+thats if the ’/’ has stored the last search, the /g is for all. if you dont use it, itll just replace the first one in each line. you can also use /gc which will prompt for confirmation. +

+ +
    +
  • :’<,’>s//bar/g
  • +
+

+thats if you are in visual mode +

+ +
    +
  • :s/<searchstring>/<replacestring>/g
  • +
+

+thats a more generic one +

+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250428133236-systemd_services.html b/output/20250428133236-systemd_services.html new file mode 100755 index 0000000..8f22ee9 --- /dev/null +++ b/output/20250428133236-systemd_services.html @@ -0,0 +1,321 @@ + + + + + + + +systemd_services + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

systemdservices

+ +
+
+

To add a systemctl

+
+
    +
  • create a new systemd service file: +`sudo nano /etc/systemd/system/name.service`
  • + +
  • +example content: +[Unit] +Description=Watch TODO Directory and Update Master Task List +After=network.target +

    + +

    +[Service] +ExecStart=/usr/local/bin/watch-todo.sh +Restart=always +User=zaine +WorkingDirectory=/home/zaine/master-folder/orgfiles/todo +StandardOutput=append:/var/log/watch-todo.log +StandardError=append:/var/log/watch-todo.log +

    + +

    +[Install] +WantedBy=multi-user.target +

  • + +
  • reload and start: +sudo systemctl daemon-reload +sudo systemctl enable watch-todo.service +sudo systemctl start watch-todo.service
  • +
+
+
+
+

To remove a systemctl service:

+
+

+systemctl stop [servicename] +systemctl disable [servicename] +rm etc/systemd/system[servicename] +rm etc/systemd/system[servicename] # and symlinks that might be related +rm usr/lib/systemd/system[servicename] +rm usr/lib/systemd/system[servicename] # and symlinks that might be related +systemctl daemon-reload +systemctl reset-failed +

+ + + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250430001952-microlise_assessment.html b/output/20250430001952-microlise_assessment.html new file mode 100755 index 0000000..2201521 --- /dev/null +++ b/output/20250430001952-microlise_assessment.html @@ -0,0 +1,422 @@ + + + + + + + +microlise-assessment + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

microlise-assessment

+ +
+
    +
  1. What are you most proud of doing in the last 2 years?
  2. +
+ + + +
    +
  1. What do you think you could have done better in the last two years?
  2. +
+ + + +
    +
  1. What is the most important thing you have done in the last two years?
  2. +
+ + + +
    +
  1. +What books have you read recently? +

    + +

    +Recently, I have been reading The C Programming Language by Brian Kernighan and Dennis Ritchie to better understand low-level programming. I have been reading this book since my second year at university and have learnt many concepts that translate well into higher-level programming languages like Java. I also decided to create a GitHub repository where I store the practical applications of what was learnt from this book in an educational format so that I can share what I learnt as well test my knowledge. +

    + +

    +Another book I have been reading is The Science of Self-Discipline by Peter Hollins. What I took from this book is that despite perpetual distractions we are enveloped with, there are ways we can still remain disciplined. The structuring of the book is quite clever in the sense that it allows the reader to seamlessly flow from the relevant topics that surround the subject of ’self-discipline’. From this book, I got more into the GTD (getting things done) principle and has really helped with managing my to-dos. +

  2. +
+ + +
    +
  1. +What are the things you like about your role? +

    + +

    +The thing I like most about my current role is the fact that no two days are the same. As my current role is a part-time tutor, I meet students that really challenge me to explain complex concepts in simpler ways. There are many soft skills that I’ve picked up, such as: communication, time-management, organisation and teamworking skills. +

  2. +
+ + +
    +
  1. +What annoys you? +

    + +

    +Poor communication from peers and soiled working environments can at times be frustrating. I believe that good and innovative ideas come from open discussions, therefore I value settings where conversations flow in a respectful manner, where people can speak their thoughts and ideas regardless of their seniority. +

  2. + +
  3. +What would you like to be able to do better? +

    + +

    +I would like to improve my skills in DevOps, specifically the CI/CD and containerisation aspect of this. As I’ve worked on full-stack applications, my focus was mainly on getting the features deployed, however I want to understand more about deployment, scalability, and infrastructure. To bridge this gap, I began setting up my own homelab that hosts different services through docker-compose. I’m also looking at GitHub actions as I regularly upload to GitHub. +

    + +

    +add something non-technical +

  4. + +
  5. If we were to ask your manager, how would they describe you?
  6. +
+ +

+They’d describe me as: dependable, empathetic, and always ready to help. Someone who takes initiative in stressful situations, supports others without hesitation, and makes others smile. +

+ + +
    +
  1. +What would your manager say was the best way to manage you? +

    + +

    +Giving me the trust and space to work independently. Being given regular feedback along with constructive performance reviews with what needs to be worked on really helps. +

  2. + +
  3. +What would your manager say you need to improve on? +

    + +

    +They might say I sometimes take on too much at once. I tend to get enthusiastic about new challenges, however I need to be able to set realistic expectations with both myself and the team through assessing the workload better. +

  4. + +
  5. If we asked some of the people that worked with you, to describe you, what would
  6. +
+ +

+they say? +

+ +

+They’d likely say that I’m approachable, passionate about learning and well-organised. Someone who is easy to get along with and overall jolly. +

+ + +
    +
  1. If you could change something about your current role, what would it be?
  2. +
+ + + +
    +
  1. Why do you want to move on from your current role?
  2. +
+ + + +
    +
  1. What do you think you will like about this role?
  2. +
+ + + +
    +
  1. What do you think will be difficult about this role?
  2. +
+ + + +
    +
  1. Can you provide an example of where you have gone above and beyond the role to
  2. +
+ +

+achieve a goal? +

+ + + +
    +
  1. Can you provide an example of where you have provided exceptional internal or
  2. +
+ +

+external customer care? +

+ + + +
    +
  1. Have you done any charity work, or voluntary work to help others? If not, have you
  2. +
+ +

+examples of where you have helped someone at work? +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250516161728-gpg_encryption.html b/output/20250516161728-gpg_encryption.html new file mode 100755 index 0000000..2a7a689 --- /dev/null +++ b/output/20250516161728-gpg_encryption.html @@ -0,0 +1,310 @@ + + + + + + + +gpg-encryption + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

gpg-encryption

+ +
+

+If you want to encrypt a file, use the following command: +

+ +
+
+gpg -c file.txt
+
+# options include :
+# gpg -c file.txt : for symmetric encryption
+# gpg -d file.txt.gpg : to decrypt the file
+# gpg --batch -c --passphrase mypassphrase file.txt : accepts passphrase right from command line  
+
+
+
+ +

+and to decrypt, use: +

+ +
+
+gpg -d file.txt
+
+# You have to wait 10 minutes before you can get prompted for a password, before this, it will
+# decrypt without the passphrase.
+
+
+
+ +

+gpg –batch -c –passphrase Shakkal123! passwords.md +

+ +

+gpg –batch -d –passphrase Shakkal123! passwords.md.gpg +

+ +

+gpg –batch –output passwords.md -d –passphrase Shakkal123! passwords.md.gpg +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250703183239-linux_arch_linux.html b/output/20250703183239-linux_arch_linux.html new file mode 100755 index 0000000..9ddab14 --- /dev/null +++ b/output/20250703183239-linux_arch_linux.html @@ -0,0 +1,286 @@ + + + + + + + +linux-arch-linux + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250715223949-the_clean_coder.html b/output/20250715223949-the_clean_coder.html new file mode 100755 index 0000000..48cd388 --- /dev/null +++ b/output/20250715223949-the_clean_coder.html @@ -0,0 +1,892 @@ + + + + + + + +the_clean_coder + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

thecleancoder

+ +
+ +
+

CHAPTER 1: PROFESIONALISM

+
+
+
+

Do no harm

+
+

+No harm should be done to the function of our software. The harm comes about when there are bugs, the QA should find no bugs in the software. If the software is too complex to run without there being bugs, reduce the complexity of the software. Find ways to ensure that the code is designed so that it is easy to test. Aim for 100% test coverage, everything should be tested; automate the testing so you don’t waste too much time. +

+
+
+
+

Do no harm to the structure

+
+

+It is the structure of your code that allows it to be flexible. If you compromise the structure, you compromise the future. If you want the software to be flexible, you have to flex it. This is done by making easy changes to it all the time, which is known as merciless refactoring. +

+
+
+
+

Work ethic

+
+

+Your career is your responsability and nobody else’s. The 40 hours at work should be spent on the employers problems, and the extra 20 hours should be spent reading, practicing, learning, and otherwise enhancing your career. +

+
+
+
+

Know your field

+
+

+Do you know what a Nassi-Schneiderman chart is? If not, why not? Do you know the difference between a Mealy and a Moore state machine? You should. Could you write a quicksort without looking it up? Do you know what the term “Transform Analysis” means? Could you perform a functional decomposition with Data Flow Diagrams? What does the term “Tramp Data” mean? Have you heard the term “Conascence”? What is a Parnas Table? If you want to be a professional, you should know a sizable chunk of ideas, disciplines, techniques, tools, and terminologies and constantly be increasing the size of that chunk. +

+ +

+Here is a minimal list of the things that every software professional should be conversant with: +• Design patterns. You ought to be able to describe all 24 patterns in the GOF book and have a working knowledge of many of the patterns in the POSA books. +• Design principles. You should know the SOLID principles and have a good understanding of the component principles. +• Methods. You should understand XP, Scrum, Lean, Kanban, Waterfall, Structured Analysis, and Structured Design. +• Disciplines. You should practice TDD, Object-Oriented design, Structured Programming, Continuous Integration, and Pair Programming. +• Artifacts: You should know how to use: UML, DFDs, Structure Charts, Petri Nets, State Transition Diagrams and Tables, flow charts, and decision tables. +

+
+
+
+

Continuous learning

+
+

+Read books, articles, blogs, tweets. Go to conferences. Go to user groups. Participate in reading and study groups. Learn things that are outside your comfort zone. If you are a .NET programmer, learn Java. If you are a Java programmer, learn Ruby. If you are a C programmer, learn Lisp. If you want to really bend your brain, learn Prolog and Forth! +

+
+
+
+

Practice

+
+

+Doing your daily job is performance, not practice. Practice is when you specifically exercise your skills outside of the performance of your job for the sole purpose of refining and enhancing those skills. More on this later. +

+
+
+
+

Collaboration

+
+

+Make a speacial effort to practice, program, plan and design together (not for 100% of your time). +

+
+
+
+

Mentoring

+
+

+The best way to learn is to teach. +

+
+
+
+

Know your domain

+
+

+It is the responsibility of every software professional to understand the domain of the solutions they are programming. If you are writing an accounting system, you should know the accounting field. If you are writing a travel application, you should know the travel industry. When starting a project in a new domain, read a book or two on the topic. Interview your customer and users about the foundation and basics of the domain. Spend some time with the experts, and try to understand their principles and values. +

+
+
+
+

Identify with your Employer/Customer

+
+

+Put yourself in your employer’s shoes and make sure that the features you are developing are really going to address your employer’s needs. +

+
+
+
+

Humility

+
+

+Professionals know they are arrogant and are not falsely humble. A professional knows his job and takes pride in his work. A professional is confident in his abilities, and takes bold and calculated risks based on that confidence. A professional is not timid. However, a professional also knows that there will be times when he will fail, his risk calculations will be wrong, his abilities will fall short. Be your own critique and never ridicule others, accept ridicule when deserved and laugh it off when it’s not. +

+
+
+
+
+

CHAPTER 2: SAYING NO

+
+

+Professionals are expected to say no. Indeed, good managers crave someone who has the guts to say no. It’s the only way you can really get anything done. (tfb) +

+ +

+If you are a professional, you will pursue and defend your objectives as aggressively as you can, so will your managers/peers. The best possible outcome is the goal that you and your manager share. The trick is to find that goal, and that usually takes negotiation. +

+ +

+The most important time to say no is when the stakes are highest. The higher the stakes, the more valuable no becomes. +

+ +

+Make sure you have documentation (memos) for high stake deliverables/situations (CYA) +

+
+
+
+

CHAPTER 3: SAYING YES

+
+

+Say. Mean. Do. +There are three parts to making a commitment. +

+ +
    +
  1. You say you’ll do it.
  2. +
  3. You mean it.
  4. +
  5. You actually do it.
  6. +
+ +

+There are certain phrases used by ourselves and our peers that show a lack of commitment. Here are some common phrases: +

+ +

+• Need\should. “We need to get this done.” “I need to lose weight.” “Someone should make that happen.” +• Hope\wish. “I hope to get this done by tomorrow.” “I hope we can meet again some day.” “I wish I had time for that.” “I wish this computer was faster.” +• Let’s. (not followed by “I . . .”) “Let’s meet sometime.” “Let’s finish this thing.” +

+ +

+Real commitment will have you stating a fact about something you will do with a clear end time. If you rely on someone else to get your job done, do what you can to get what you need to move forward. Don’t let them be a blocker. +

+ +

+Professionals are not required to say yes to everything that is asked of them. However, they should work hard to find creative ways to make “yes” possible. +

+
+
+
+

CHAPTER 4: CODING

+
+

+If you are tired or distracted, do not code. You’ll only wind up redoing what you did. Instead, find a way to eliminate the distractions and settle your mind. +

+ +

+Don’t write code when you are tired. Dedication and professionalism are more about discipline than hours. Make sure that your sleep, health, and lifestyle are tuned so that you can put in eight good hours per day. +

+ +

+Spend personal time before work trying to resolve or mitigate personal issues or demands so you can focus your mental energy on being a productive problem solver at work. +

+ +

+Avoid the `flow zone`, rational faculties are diminished in the name of speed. Yes, you may be able to write more code, but you are going to end up giving up the ability to have a holistic view of the problem. You are likely to make decisions that you are going to end up having to go back and reverse. +

+ +

+Be prepared to be interrupted and help someone — it’s the professional thing to do. When you hit writer’s block make sure you are sleeping, eating, and exercising enough. Additionally, read science fiction (or another form of creative consumption other than surfing the internet or watching TV). Lean on other creative consumption outlets to help keep you creative on the job +

+ +

+It is incumbent upon you as a professional to reduce your debugging time as close to zero as you can get. Clearly zero is an asymptotic goal, but it is the goal nonetheless. +

+ +

+Software development is a marathon — not a sprint. Conserve your mental energy during the day. +

+ +

+“Hope” will get you into trouble (“I hope to have it done by…”). Don’t hope. Be direct about your timelines and realistic expectations. If you must, use an estimate/range. +

+ +

+Ask for help and ask to give help (mentor). +

+ +

+Programming is so hard, in fact, that it is beyond the capability of one person to do it well. No matter how skilled you are, you will certainly benefit from another programmer’s thoughts and ideas. +

+
+
+
+

CHAPTER 5: TDD

+
+
    +
  1. You are not allowed to write any production code until you have first written a failing unit test.
  2. +
  3. You are not allowed to write more of a unit test than is sufficient to fail—and not compiling is failing.
  4. +
  5. You are not allowed to write more production code that is sufficient to pass the currently failing unit test.
  6. +
+ +

+Good tests function like good documentation. +TDD is a discipline that enhances certainty, courage, defect reduction, documentation, and design. +It’s professional to use TDD. +

+
+
+
+

CHAPTER 6: PRACTICING

+
+

+It is not your employer’s job to keep your skills sharp for you. That responsability is on YOU. +

+ +

+http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata +

+ +

+https://codingdojo.org/ +

+ +

+A programming kata is a precise set of choreographed keystrokes and mouse movements that simulates the solving of some programming problem. You aren’t actually solving the problem because you already know the solution. Rather, you are practicing the movements and decisions involved in solving the problem. +

+ +

+Many kata are recorded at http://katas.softwarecraftsmanship.org. Others can be found at http://codekata.pragprog.com. Some of my favorites are: +

+ +

+• The Bowling Game: http://butunclebob.com/ArticleS.UncleBob.TheBowling-GameKata +• Prime Factors: http://butunclebob.com/ArticleS.UncleBob.ThePrimeFactors-Kata +• Word Wrap: http://thecleancoder.blogspot.com/2010/10/craftsman-62-dark-path.html +

+ +

+For a real challenge, try learning a kata so well that you can set it to music. Doing this well is hard. See: https://katas.softwarecraftsmanship.org/?p=71 +

+ +

+Programmers can practice in a similar fashion (wasa) using a game known as ping-pong. The two partners choose a kata, or a simple problem. One programmer writes a unit test, and then the other must make it pass. Then they reverse roles. See: https://wiki.c2.com/?PairProgrammingPingPongPattern +

+ +

+Other ways to practice: take on pro-bono work or a pet project, contribute to open source. Practice is something you do when you aren’t being paid. +

+
+
+
+

CHAPTER 7: ACCEPTANCE TESTING

+
+
+
+

Intro

+
+

+A company spends over \$1 million every 6 weeks on manual testing. +They consider cutting half the tests, risking half the product not working. +Manual test plans are unsustainable. Automating tests is far cheaper and more reliable. +Acceptance tests should be automated using tools like: +

+ +

+FitNesse, Cucumber, Selenium, robot framework, cuke4duke, etc. +These tools make tests readable and writable by non-programmers. +

+ +

+Writing acceptance tests is not extra work — it’s how you define what “done” means. +It ensures that stakeholders and developers are aligned on requirements. +

+
+
+
+

Who Writes Them and When?

+
+

+Business Analysts (BAs) often write “happy path” tests. +QAs write edge cases and “unhappy paths”. +Developers may step in if others can’t keep up. +Tests are best written just before development, typically during iteration planning. +

+
+
+
+

Developers are responsible for:

+
+

+Connecting acceptance tests to the system. +Implementing features to make tests pass. +Negotiating unclear or flawed tests with authors. +Avoid passive-aggressive compliance; collaborate to refine faulty tests. +

+
+
+
+

Realistic Expectations (e.g., Timing)

+
+

+Not all requirements can be absolute (e.g., “must respond in 2 seconds”). +Use statistical assertions (e.g., 99.5% of requests under 2 seconds). +Developers and stakeholders must agree on testable, realistic criteria. +

+
+
+
+

Acceptance Tests vs Unit Tests

+
+ + + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnit TestsAcceptance Tests
-------------------------------------------------------------------------------------
Written byDevelopersStakeholders / BAs / QA / Developers
PurposeSpecify and verify internal codeSpecify and verify business requirements
AudienceDevelopersBusiness + Developers
ScopeSmall units (functions, classes)Full system (API, UI, etc.)
Primary valueDesign documentationRequirements documentation
+ +

+Tests are not redundant even if they check similar things — their execution paths and intent differ. +

+
+
+
+

Testing GUIs

+
+

+GUIs are volatile (constantly changing), making them hard to test. +Apply Single Responsibility Principle (SRP): +

+ +

+Separate GUI aesthetics from business logic. +Test through APIs beneath the GUI whenever possible. +If GUI testing is necessary, use IDs or abstractions, not layout-specific logic. +Keep GUI tests minimal, as they’re fragile +

+
+
+
+

Continuous Integration (CI)

+
+

+Run all tests (unit + acceptance) multiple times per day via CI. +Trigger builds/tests on every commit. +A failed build/test is a “stop everything” event. +Never ignore broken tests; doing so can lead to customer-facing bugs. +

+
+
+
+
+

CHAPTER 8: TESTING STRATEGIES

+
+

+Having a full test automation policy is a feature of professional development teams which is not only composed by unit tests and acceptance tests. The test automation pyramid figure (https://codingjourneyman.com/2014/09/24/the-clean-coder-testing-strategies/) show every test types and their proportion. +

+ +

+Unit tests are written by the programmers for the programmers to ensure that the code is working at the deepest/lowest level. They should execute in milliseconds and target a 100% code coverage (at least 90%). +

+ +

+Component tests are a part of the acceptance tests and check the behavior of individual component. A component encapsulate a specific set of business rules. These kind of tests should be very quick as well because they are decoupled from the other components and should cover about half the system. +

+ +

+Integration tests are required to check the communication between components in order to verify that the “plumbing” has been done correctly. They ensure that the architectural structure of the system is correct. About 20% of the system is covered by integration tests. +

+ +

+System tests are executed at the highest level of the system, from the UI to check the whole application and its construction (load tests are in this category for instance). They check about 10% of the system. +

+ +

+Manual/exploratory tests are done by humans to explore the application for unexpected behaviors. They need the human creativity to hunt possible hidden bugs. +

+
+
+
+

CHAPTER 9: TIME MANAGEMENT

+
+

+Attending meetings is important in order to follow the life cycle of your project but you are not required in every one of them. In this case you can politely decline the invitation if your presence is not mandatory. It’s no better to be present and play with your smart-phone because you’re bored or because you’re not involved. +

+ +

+There are also some cases where you can leave a meeting. I know it might look rude to do so but it can happen that a meeting goes not as planned and take much more time that you have anticipated. In a situation like this you can politely ask if your presence is still needed and negotiate your exit. There is nothing worst than a meeting without an agenda and/or without a goal, there is no better way to waste time and energy. +

+ +

+If you use an Agile methodology such as Scrum at work you certainly have to do stand-up meetings every day (mostly at the beginning of the day). Each member of the team should answer the 3 following questions : +

+ +
    +
  1. What did I do yesterday ?
  2. +
  3. What am I going to do today ?
  4. +
  5. What’s in my way ?
  6. +
+ +

+And no more, each person should be able to answer these questions in less than one minute. With this short and simple meeting you can easily know if your project is on track or no. +

+ +

+During an iteration planning meeting a development team select and reject backlog items for the new sprint/iteration. The estimates (our next chapter) should be done for every candidate item and if possible some of the acceptance tests. The chosen tasks should be clear and ready for the development phase (coding) and this meeting aims to allow the team to briefly discuss over the items. +

+ +

+Iteration retrospective meeting are designed to share what went wrong and what went right during the last iteration and to present demos to the clients/business. It should not extend 45 minutes, 20 for the retrospective and 25 for the demos which are prepared in advance. +

+ +

+Uncle Bob defines two truths about meetings, finding the correct mix between them for your team can be challenging : +

+ +
    +
  • Meetings are necessary.
  • +
  • Meetings are huge time wasters.
  • +
+ +

+Writing code is an intellectual exercise that requires long periods of concentration and can be exhausting for your mind. But your focus is not infinite and can be depleted, if you are familiar with Role Playing Game (RPG) see this as an empty mana pool. Unfortunately unlike in RPGs you cannot drink a potion to recharge your concentration in a blink but you can refill it. +

+ +

+Sleeping is the best way to replenish your concentration, a good night of sleep (7~8 hours) can give you enough concentration for an entire day. Coffee is the developer’s best friend and can definitely help you regain a small amount of concentration for a short amount of time but don’t let this beverage send your focus in the wrong direction. +

+ +

+It’s also possible to partially recharge your mana batteries by taking breaks during your day, it allows you to de-focus. If the weather permits it you can go out for a walk, have a conversation with a friends, even meditate if you want. You can also practice a physical discipline, it also demands concentration but not intellectual focus : muscle focus. This type of focus can help you increase your mental focus and give you mana. Programming is a creative discipline then exposing yourself to other people’s creativity (books, comics, movies, etc…) is also helpful to boost your own creativity. +

+ +

+When producing code you will sometimes encounter “blind alleys”. It means that the path you’ve taken leads nowhere, in other word your algorithm does not what you want, your solution does not answer your need. It’s impossible to avoid every “blind alleys” but it’s important to realize when you are in one of them to back out. +

+ +

+What you definitely want to avoid are software “marshes”, “bogs” or “swamps”. Unlike “blind alleys” they don’t stop you, there is always a way forward that looks shorter than the way back but that is not. Sticking to a bad software design is a typical example of a swamp, the more you advance the harder it is to advance and at the end you end up with a colossal “Technical Debt“ without noticing it. It kills a team’s productivity and can sometimes kills and entire project/company because maintenance has become overwhelming. If you discover that you are in a situation like this you should definitely turn back before it’s too late. +

+
+
+
+

CHAPTER 10: ESTIMATION

+
+

+You are honor-bound to decline something you cannot commit to. Commitment is about certainty. +Professionals know the difference between estimates and commitments. +Estimates are just guesses. Estimates are ranges (not exact numbers). +Avoid the word “try”. It’s a loaded term. +Something to look into is a method like PERT to get a better estimate. +Professional software developers are very careful to set reasonable expectations despite the pressure to try to go fast. +Estimating methods: wide band delphi, flying fingers, planning poker. +

+ +

+When you estimate a task, you provide three numbers. This is called trivariate analysis: +• O: Optimistic Estimate. This number is wildly optimistic. You could only get the task done this quickly if absolutely everything went right. Indeed, in order for the math to work this number should have much less than a 1% chance of occurrence. +• N: Nominal Estimate. This is the estimate with the greatest chance of success. If you were to draw a bar chart, it would be the highest bar, +• P: Pessimistic Estimate. Once again this is wildly pessimistic. It should include everything except hurricanes, nuclear war, stray black holes, and other catastrophes. Again, the math only works if this number has much less than a 1% chance of success. +

+
+
+
+

CHAPTER 11: PRESSURE

+
+

+A professional developer is calm and decisive under pressure. As pressure grows, she adheres to disciplines knowing that they are the best way to meet the deadlines and commitments pressing on her. +Under pressure? Be sure to manage your commitments, follow disciplines, and keep code clean, communicate, and ask for help. +

+ +

+The best way to stay calm under pressure is to avoid the situations that cause +pressure. That avoidance may not eliminate the pressure completely, but it +can go a long way towards minimizing and shortening the high-pressure +periods. +

+
+
+
+

CHAPTER 12: COLLABORATION

+
+

+Programmers have difficulty working closely with other programmers. That’s no excuse, though. Being a developer means working with people. +The team owns the code, not the individual +Professionals pair (and have good pairing habits). +Pairing is a great way to share knowledge so that people don’t end up in knowledge silos. +All team members should be able to play another team members’ position in a pinch and should know each other’s code. +

+
+
+
+

CHAPTER 13: TEAMS AND PROJECTS

+
+

+Strive to have a “gelled” team. A gelled team is one that forms relationships, collaborates, and learn each other’s quirks and strengths. +Gelled teams can work miracles. They plan together, solve together, and get things done. +

+
+
+
+

CHAPTER 14: MENTORING, APPRENTICESHIP, AND CRAFTSMANSHIP

+
+

+Developers often start out by teaching themselves (books, trial & error, copying code). +

+ +

+Without mentorship, they risk missing crucial lessons—like setting expectations, meeting deadlines, and writing maintainable code. +

+ +

+Good mentors matter: they correct mistakes early, model professionalism, and guide juniors through real-world practices. +

+ +

+Software lacks true apprenticeships (unlike medicine, plumbing, or carpentry). New devs need hands-on oversight, not just “figure it out” work. +

+ +

+Professionals should seek mentors and become mentors—help others level up, share best practices, and prevent the cycle of isolated learning. +

+
+
+
+

APPENDIX A: TOOLING

+
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250717230336-recipes_main.html b/output/20250717230336-recipes_main.html new file mode 100755 index 0000000..af6bad1 --- /dev/null +++ b/output/20250717230336-recipes_main.html @@ -0,0 +1,277 @@ + + + + + + + +recipes-moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250717230336-recipes_moc.html b/output/20250717230336-recipes_moc.html new file mode 100755 index 0000000..1384414 --- /dev/null +++ b/output/20250717230336-recipes_moc.html @@ -0,0 +1,277 @@ + + + + + + + +recipes-main + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250719174944-recipes_ideas.html b/output/20250719174944-recipes_ideas.html new file mode 100755 index 0000000..e44996b --- /dev/null +++ b/output/20250719174944-recipes_ideas.html @@ -0,0 +1,383 @@ + + + + + + + +recipes-ideas + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

recipes-ideas

+ +
+
+

Spiced Potato & Pea Quesadillas

+
+

+Prep time: 20 min +Ingredients: +

+ +

+Boiled potatoes, mashed +

+ +

+Frozen peas +

+ +

+Cumin, coriander, chili flakes +

+ +

+Tortilla wraps +Method: +

+ +

+Mix mashed potatoes, peas, and spices. +

+ +

+Spread mixture on a tortilla, top with another. +

+ +

+Toast in a pan until crispy on both sides. +

+
+
+
+

Chickpea Pilaf

+
+

+Prep time: 25 min +Ingredients: +

+ +

+Cooked rice +

+ +

+Canned chickpeas +

+ +

+Onion, garlic, cumin, cinnamon +

+ +

+Optional: raisins or almonds +Method: +

+ +

+Sauté onion, garlic, spices. +

+ +

+Stir in chickpeas, then rice. +

+ +

+Heat through, serve with yogurt. +

+
+
+
+

Lentil Soup with Flatbread

+
+

+Prep time: 25 min +Ingredients: +

+ +

+Red lentils +

+ +

+Onion, garlic, carrot +

+ +

+Cumin, turmeric, black pepper +

+ +

+Vegetable stock +Method: +

+ +

+Sauté onion, garlic, and carrot. +

+ +

+Add spices and lentils. Pour in stock. +

+ +

+Simmer until soft, then blend if preferred. +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250719175023-recipes_done.html b/output/20250719175023-recipes_done.html new file mode 100755 index 0000000..e4ef5fc --- /dev/null +++ b/output/20250719175023-recipes_done.html @@ -0,0 +1,324 @@ + + + + + + + +recipes-done + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

recipes-done

+ +
+
+

Done:

+
+
+
+

<2025-07-17 Thu>

+
+

+https://spainonafork.com/healthy-creamy-tuna-wraps-recipe/ +

+ +

+Instead of 1 clove fresh garlic, i used 1/4 teaspoon garlic granules. +Also used lime juice instead of lemon juice +need to work on plating (put too much salad, its better to cut the tomatos in smaller chunks and the salad in smaller pieces) +

+
+
+
+

<2025-07-18 Fri>

+
+

+https://www.youtube.com/watch?v=wiKndVvU_Ks&list=LL&index=2&ab_channel=BrownGirlsKitchen +

+ +

+Dont use plastic sieve (as boiled water goes on it when extracting the potatos) +

+ +

+use low heat when toasting the wraps +

+ +

+served 3 large sized wraps (maybe use taco wraps next time) +

+
+
+
+

<2025-07-19 Sat>

+
+

+https://www.youtube.com/watch?v=3d6DrdOEuY4&list=LL&index=1&ab_channel=FoodFusion +

+ +

+WASH HANDS AFTER TOUCHING GREEN CHILLI. +

+ +

+juilienne : cutting the garlic into small strips +

+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250722221649-career_moc.html b/output/20250722221649-career_moc.html new file mode 100755 index 0000000..f93bdc9 --- /dev/null +++ b/output/20250722221649-career_moc.html @@ -0,0 +1,375 @@ + + + + + + + +career_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

careermoc

+ +
+

+microlisemoc +

+ + +
+

Resources:

+
+
+
+

Books:

+
+
+
+

So Good They Can’t Ignore You

+
+

+Microlise recomended me to read this +

+
+ +
+
+

Clean Coder:

+
+

+Microlise recomended me to read this +

+
+ +
+
+

The Manager’s Path

+
+

+A Guide for Tech Leaders Navigating Growth and Change +Link: +The Managers Path +

+
+
+
+

SICP

+
+

+Book link: +

+ +
+
+
+
+

Websites:

+
+
+
+

Link to free software blogging course

+
+ + + + + + + +
+
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723171109-maven_pom_file.html b/output/20250723171109-maven_pom_file.html new file mode 100755 index 0000000..c664161 --- /dev/null +++ b/output/20250723171109-maven_pom_file.html @@ -0,0 +1,351 @@ + + + + + + + +maven-pom-file + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

maven-pom-file

+ +
+ +
+

Example of pom.xml

+
+
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.mycompany.app</groupId>
+  <artifactId>my-app</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>my-app</name>
+  <!-- FIXME change it to the project's website -->
+  <url>http://www.example.com</url>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.release>17</maven.compiler.release>
+  </properties>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.junit</groupId>
+        <artifactId>junit-bom</artifactId>
+        <version>5.11.0</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+  <dependencies>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!-- Optionally: parameterized tests support -->
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-params</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
+       ... lots of helpful plugins
+    </pluginManagement>
+  </build>
+</project>
+
+
+
+
+
+
+

Commands:

+
+

+FOR TESTING +

+
+
mvn clean test
+
+
+ +

+COMPILING +

+
+
mvn compile
+
+
+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723182408-so-good-they-cant-ignore-you.html b/output/20250723182408-so-good-they-cant-ignore-you.html new file mode 100755 index 0000000..5d1a348 --- /dev/null +++ b/output/20250723182408-so-good-they-cant-ignore-you.html @@ -0,0 +1,367 @@ + + + + + + + +so_good_they_cant_ignore_you + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

sogoodtheycantignoreyou

+ +
+
+

So good they cant ignore you

+
+

+Some of these points have been inspired from this +website +

+
+
+
+

Summary

+
+

+The book focuses on the reality of how people end up loving what they do. It demystifies the concept: “follow your +passion”, and details alternative strategies. +

+
+
+

Rule 1: *Don’t Follow Your Passion

+
+
    +
  1. The Passion Hypothesis is the biggest myth in occupational happiness. It says that “The key to occupational happiness +is to first figure out what you are passionate about and then find a job that matches this passion”, the author1 +argues against this.
  2. +
  3. He mentions some incidents of people like Steve Jobs, proving that successful people like him (who is famous for the +concept “follow your passions”) didn’t start off because he had a passion for the thing they do.
  4. +
+
+
+
+

Rule *2: Be So Good They Can’t Ignore You (Or, the importance of skills)

+
+
    +
  1. The traits that define great work are rare and valuable, if you want these traits, you need rare and valuable skills. +These skills are called career-capital.
  2. +
  3. Adopt the Craftsman Mindset where instead you focus on what you can offer the world. This is in stark contrast to +the Passion Mindset where you focus on what the world can offer you. The craftsman mindset focuses on becoming +better and improving the quality of what you produce. It focuses on becoming so good they can’t ignore you, +regardless of what you do for a living.
  4. +
  5. The concept of deliberate-practice is mentioned where you deliberately stretch your +abilities beyond where you’re comfortable and then receive ruthless feedback on your performance.
  6. +
  7. 5 Steps on applying the deliberate practice in your work: + +
      +
    1. Step 1: Decide What Type of Capital Market You’re Competing In. There are two kinds of markets, a +winner-take-all market and an auction market. In a winner-take-all market, there’s only one type of career +capital available and only one that matters. In the auction market however, there are a variety of relevant +skills that could lead you to getting the job, in other words, there are a variety of career capital available.
    2. +
    3. Step 2: Identify Your Capital Type. This step makes you figure out what are the relevant skills that are +needed in order to be great at your job. In the winner-take-all market, it’s pretty straightforward that it’s +that one career capital, however in the auction market there’s more flexibility. A useful heuristic mentioned is +the open-gates opportunities present. In other words, those opportunities to build capital that are already +open to you, then you work your way up.
    4. +
    5. Step 3: Define “Good” . Having a clear view of what good means is important. This step forces you to think +about where you want to be and how you can achieve it using deliberate practice. This definition will be +different for different people.
    6. +
    7. Step 4: Stretch and Destroy. Deliberate practice requires you to be uncomfortable, as it is something that is +not enjoyable. The important thing is to push beyond your comfort zone and get immediate feedback to steer you in +the right direction.
    8. +
    9. Step 5: Patience. The acquisition of career capital will take time, therefore, it is necessary to be patient +and ensure that you pour all your effort into the capital you seek. The final sentence given in the book before +the summary is: You stretch yourself, day after day, month after month, before finally looking up and +realising, “Hey, I’ve become pretty good, and people are starting to notice”.
    10. +
  8. +
+
+
+
+

Rule *3: Turn Down a Promotion (Or, the importance of control)

+
+
    +
  1. The author here explains that once you’ve acquired a certain amount of career capital, your next step is to invest
  2. +
+

+in those traits that define great work. Discussion was made about control, and the common pitfalls that people fall +into. +

+
    +
  1. The law of financial viability: when pursuing a project or career path, it’s crucial to seek evidence that people +are willing to pay for it. If that evidence exists, it’s a good sign to proceed; if not, it’s better to reconsider or pivot.
  2. +
+
+
+
+

Rule *4: Think Small, Act Big (Or, the importance of Mission)

+
+
    +
  1. This rule focuses on the importance of having a mission in your work. Having a unifying focus for your career, a +sense of purpose, can make your work more meaningful and impactful.
  2. +
  3. A good career mission is similar to a scientific breakthrough, discovered in the adjacent possible of your field. +You will need to acquire enough career capital to be able to get into the cutting edge of your field. Once you +get into this cutting edge, you can then start to see these missions.
  4. +
  5. Think small, act big. Instead of focusing on a huge experiment with little feedback, focus on small experiments +that yield concrete feedback, and use this to guide you into the direction surrounding your general mission.
  6. +
+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723182408-so_good_they_cant_ignore_you.html b/output/20250723182408-so_good_they_cant_ignore_you.html new file mode 100755 index 0000000..b58a09d --- /dev/null +++ b/output/20250723182408-so_good_they_cant_ignore_you.html @@ -0,0 +1,367 @@ + + + + + + + +so_good_they_cant_ignore_you + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

sogoodtheycantignoreyou

+ +
+
+

So good they cant ignore you

+
+

+Some of these points have been inspired from this +website +

+
+
+
+

Summary

+
+

+The book focuses on the reality of how people end up loving what they do. It demystifies the concept: “follow your +passion”, and details alternative strategies. +

+
+
+

Rule 1: *Don’t Follow Your Passion

+
+
    +
  1. The Passion Hypothesis is the biggest myth in occupational happiness. It says that “The key to occupational happiness +is to first figure out what you are passionate about and then find a job that matches this passion”, the author1 +argues against this.
  2. +
  3. He mentions some incidents of people like Steve Jobs, proving that successful people like him (who is famous for the +concept “follow your passions”) didn’t start off because he had a passion for the thing they do.
  4. +
+
+
+
+

Rule *2: Be So Good They Can’t Ignore You (Or, the importance of skills)

+
+
    +
  1. The traits that define great work are rare and valuable, if you want these traits, you need rare and valuable skills. +These skills are called career-capital.
  2. +
  3. Adopt the Craftsman Mindset where instead you focus on what you can offer the world. This is in stark contrast to +the Passion Mindset where you focus on what the world can offer you. The craftsman mindset focuses on becoming +better and improving the quality of what you produce. It focuses on becoming so good they can’t ignore you, +regardless of what you do for a living.
  4. +
  5. The concept of deliberate-practice is mentioned where you deliberately stretch your +abilities beyond where you’re comfortable and then receive ruthless feedback on your performance.
  6. +
  7. 5 Steps on applying the deliberate practice in your work: + +
      +
    1. Step 1: Decide What Type of Capital Market You’re Competing In. There are two kinds of markets, a +winner-take-all market and an auction market. In a winner-take-all market, there’s only one type of career +capital available and only one that matters. In the auction market however, there are a variety of relevant +skills that could lead you to getting the job, in other words, there are a variety of career capital available.
    2. +
    3. Step 2: Identify Your Capital Type. This step makes you figure out what are the relevant skills that are +needed in order to be great at your job. In the winner-take-all market, it’s pretty straightforward that it’s +that one career capital, however in the auction market there’s more flexibility. A useful heuristic mentioned is +the open-gates opportunities present. In other words, those opportunities to build capital that are already +open to you, then you work your way up.
    4. +
    5. Step 3: Define “Good” . Having a clear view of what good means is important. This step forces you to think +about where you want to be and how you can achieve it using deliberate practice. This definition will be +different for different people.
    6. +
    7. Step 4: Stretch and Destroy. Deliberate practice requires you to be uncomfortable, as it is something that is +not enjoyable. The important thing is to push beyond your comfort zone and get immediate feedback to steer you in +the right direction.
    8. +
    9. Step 5: Patience. The acquisition of career capital will take time, therefore, it is necessary to be patient +and ensure that you pour all your effort into the capital you seek. The final sentence given in the book before +the summary is: You stretch yourself, day after day, month after month, before finally looking up and +realising, “Hey, I’ve become pretty good, and people are starting to notice”.
    10. +
  8. +
+
+
+
+

Rule *3: Turn Down a Promotion (Or, the importance of control)

+
+
    +
  1. The author here explains that once you’ve acquired a certain amount of career capital, your next step is to invest
  2. +
+

+in those traits that define great work. Discussion was made about control, and the common pitfalls that people fall +into. +

+
    +
  1. The law of financial viability: when pursuing a project or career path, it’s crucial to seek evidence that people +are willing to pay for it. If that evidence exists, it’s a good sign to proceed; if not, it’s better to reconsider or pivot.
  2. +
+
+
+
+

Rule *4: Think Small, Act Big (Or, the importance of Mission)

+
+
    +
  1. This rule focuses on the importance of having a mission in your work. Having a unifying focus for your career, a +sense of purpose, can make your work more meaningful and impactful.
  2. +
  3. A good career mission is similar to a scientific breakthrough, discovered in the adjacent possible of your field. +You will need to acquire enough career capital to be able to get into the cutting edge of your field. Once you +get into this cutting edge, you can then start to see these missions.
  4. +
  5. Think small, act big. Instead of focusing on a huge experiment with little feedback, focus on small experiments +that yield concrete feedback, and use this to guide you into the direction surrounding your general mission.
  6. +
+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723183655-career_capital.html b/output/20250723183655-career_capital.html new file mode 100755 index 0000000..5692cfb --- /dev/null +++ b/output/20250723183655-career_capital.html @@ -0,0 +1,279 @@ + + + + + + + +career_capital + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

careercapital

+ +
+

+Career capital refers to the abilities and resources you accumulate—whether skills, credentials, connections, or +savings—that allow you to do more with your career in the future. It’s an important consideration in long-term career +planning, especially in the early stages of your career. +

+ +

+Taken from: https://probablygood.org/core-concepts/career-capital/ +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723183755-deliberate_practice.html b/output/20250723183755-deliberate_practice.html new file mode 100755 index 0000000..2b3258f --- /dev/null +++ b/output/20250723183755-deliberate_practice.html @@ -0,0 +1,280 @@ + + + + + + + +deliberate_practice + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

deliberatepractice

+ +
+

+Deliberate practice refers to a special type of practice that is purposeful and systematic. While regular practice might +include mindless repetitions, deliberate practice requires focused attention and is conducted with the specific goal of +improving performance. +

+ +

+Taken from: https://jamesclear.com/deliberate-practice-theory +

+ + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723184233-advanced_networking.html b/output/20250723184233-advanced_networking.html new file mode 100755 index 0000000..5b65a3f --- /dev/null +++ b/output/20250723184233-advanced_networking.html @@ -0,0 +1,306 @@ + + + + + + + +advanced-networking + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

advanced-networking

+ +
+

+This module was taught in the first semester of my final year at university. There were a wide range of topics that were covered, and best efforts were made in not talking about the security aspects of networks, although it is the case that when we talk about networks we are talking about secure networks (who even needs insecure networks?). +

+ +

+The following core topics were covered: +

+ +
    +
  1. Lower Layer Protocols +
      +
    • Packet vs Circuit Switching, Ethernet, layer models (DoD 4/5, OSI 7).
    • +
    • Network Hardware: Switches, Routers, data/control/management plane. Software defined networks.
    • +
    • LAN/WAN split, Arpanet, DoD, OSI. Why OSI Failed
    • +
    • Link aggregation and VLANs
    • +
  2. +
  3. IP Addressing +
      +
    • Addressing, routing, concepts. Why IPv6 is needed
    • +
    • Address allocation, bootp, DHCP, SLAAC
    • +
    • NAT and Proxying
    • +
  4. +
  5. TCP/UDP +
      +
    • UDP: applications, advantages and disadvantages
    • +
    • TCP: applications, advantages and disadvantages, mechanisms and operation, sequence numbers, receive windows, slow start, window scaling, PAWS, timestamping, multipathing
    • +
    • Demultiplexing, multiplexing
    • +
  6. +
  7. DNS +
      +
    • DNS: concepts, resource records, RR sets, basic operation, recursive and authoritative servers, caching, DNSSEC
    • +
  8. +
  9. Higher layer protocols +
      +
    • Basic operation of HTTP, FTP, SMTP
    • +
  10. +
+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723184430-stanford_marshmallow_experiment.html b/output/20250723184430-stanford_marshmallow_experiment.html new file mode 100755 index 0000000..9a768f8 --- /dev/null +++ b/output/20250723184430-stanford_marshmallow_experiment.html @@ -0,0 +1,283 @@ + + + + + + + +stanford_marshmallow_experiment + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

stanfordmarshmallowexperiment

+ +
+

+The Stanford marshmallow experiment, conducted in the 1960s and 1970s by psychologist Walter Mischel, explored the +ability of children to delay gratification. In the experiment, preschoolers were offered a marshmallow with the promise +of a second one if they waited a designated time (typically 15 minutes) without eating the first. The study’s findings +revealed that children who waited longer to eat the marshmallow showed positive correlations with future outcomes like +higher SAT scores and better social functioning. However, later research has questioned the predictive power of the +original study, particularly when controlling for socio-economic factors. +

+ +

+Source: https://jamesclear.com/delayed-gratification +

+ + + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723185056-neuroplasticity.html b/output/20250723185056-neuroplasticity.html new file mode 100755 index 0000000..70ed11d --- /dev/null +++ b/output/20250723185056-neuroplasticity.html @@ -0,0 +1,277 @@ + + + + + + + +neuroplasticity + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

neuroplasticity

+ +
+

+The ability of the brain to form and reorganize synaptic connections, especially in response to learning or +experience or following injury. +

+ +

+“Neuroplasticity offers real hope to everyone from stroke victims to dyslexics” +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723185829-test_driven_development.html b/output/20250723185829-test_driven_development.html new file mode 100755 index 0000000..05aae8e --- /dev/null +++ b/output/20250723185829-test_driven_development.html @@ -0,0 +1,279 @@ + + + + + + + +test_driven_development + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

testdrivendevelopment

+ +
+

+Test-driven development is a way of writing code that involves writing an automated unit-level test case that fails, then writing just enough code to make the test pass, then refactoring both the test code and the production code, then repeating with another new test case. Alternative approaches to writing automated tests is to write all of the production code before starting on the test code or to write all of the test code before starting on the production code. +

+ +

+One example is: +

+ + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723185943-bowling_kata.html b/output/20250723185943-bowling_kata.html new file mode 100755 index 0000000..5b94c20 --- /dev/null +++ b/output/20250723185943-bowling_kata.html @@ -0,0 +1,278 @@ + + + + + + + +bowling-kata + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723190203-java_portswrigger_test.html b/output/20250723190203-java_portswrigger_test.html new file mode 100755 index 0000000..3d59367 --- /dev/null +++ b/output/20250723190203-java_portswrigger_test.html @@ -0,0 +1,1257 @@ + + + + + + + +java-portswrigger-test + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

java-portswrigger-test

+ +
+
+

Latest

+
+
+
+

Java concepts:

+
+

+## 1. Object-Oriented Programming Concepts +

+ +

+### Inheritance +

+
    +
  • Definition: Mechanism where a class inherits properties and behaviors from another class
  • +
  • Syntax: `public class Child extends Parent { }`
  • +
  • Types: Single, Multilevel, Hierarchical
  • +
  • ’super’ keyword: Refers to parent class objects/constructors
  • +
  • Method Overriding: Child classes can provide specific implementation of methods
  • +
+ +

+### Encapsulation +

+
    +
  • Definition: Bundling data and methods that operate on the data within a single unit
  • +
  • Implementation: Using private fields with public getters/setters
  • +
  • Benefits: Hides implementation details, controls access, reduces code coupling
  • +
+

+```java +public class Account { + private double balance; +

+ +

+public double getBalance() { + return balance; +} +

+ +

+ public void deposit(double amount) { + if (amount > 0) { + balance += amount; + } + } +} +``` +

+ +

+### Polymorphism +

+
    +
  • Definition: Ability of objects to take different forms
  • +
  • Types: +
      +
    • Compile-time (Method Overloading): Multiple methods with same name but different parameters
    • +
    • Runtime (Method Overriding): Subclass implementing parent class method
    • +
  • +
  • Example:
  • +
+

+```java +class Animal { + void makeSound() { System.out.println(“Animal sound”); } +} +class Dog extends Animal { + @Override + void makeSound() { System.out.println(“Bark”); } +} +``` +

+ +

+### Abstraction +

+
    +
  • Definition: Hiding implementation details, showing only functionality
  • +
  • Implementation: Through abstract classes and interfaces
  • +
  • Abstract Classes: Can have both concrete and abstract methods
  • +
  • Interfaces: Collection of abstract methods (default/static methods allowed in Java 8+)
  • +
+

+```java +abstract class Vehicle { + abstract void start(); + void stop() { System.out.println(“Stopping”); } +} +

+ +

+interface Flyable { + void fly(); + default void land() { System.out.println(“Landing”); } +} +``` +

+ +

+## 2. Java Syntax and Language Features +

+ +

+### Basic Structure +```java +package com.example; +

+ +

+import java.util.List; +

+ +

+public class MyClass { + // Fields + private int number; +

+ +

+// Constructor +public MyClass(int number) { + this.number = number; +} +

+ +

+/ Methods +public void doSomething() { + / Method body +} +

+ +

+ / Main method + public static void main(String[] args) { + / Program execution starts here + } +} +``` +

+ +

+### Access Modifiers +

+
    +
  • public: Accessible from anywhere
  • +
  • protected: Accessible within package and by subclasses
  • +
  • default (no modifier): Accessible only within package
  • +
  • private: Accessible only within class
  • +
+ +

+### Non-Access Modifiers +

+
    +
  • static: Belongs to class rather than instance
  • +
  • final: Cannot be extended (class), overridden (method), or changed (variable)
  • +
  • abstract: Cannot be instantiated (class), must be implemented (method)
  • +
  • synchronized: Controls thread access to method/block
  • +
  • volatile: Variable value always read from main memory
  • +
+ +

+## 3. Data Types, Variables, and Operators +

+ +

+### Primitive Data Types +

+ + + +++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSizeRangeDefault
byte8 bits-128 to 1270
short16 bits-32,768 to 32,7670
int32 bits-231 to 231-10
long64 bits-263 to 263-10L
float32 bits~3.40282347 x 10380.0f
double64 bits~1.79769313486231570 x 103080.0d
char16 bits0 to 65,535’\u0000’
boolean1 bittrue/falsefalse
+ +

+### Reference Types +

+
    +
  • Classes: `String`, custom classes
  • +
  • Arrays: `int[]`, `String[]`
  • +
  • Interfaces: Collections interfaces
  • +
  • Wrapper Classes: `Integer`, `Boolean`, etc.
  • +
+ +

+### Variable Declaration +```java +// Primitive types +int count = 10; +double price = 23.45; +

+ +

+// Reference types +String name = “John”; +Date today = new Date(); +

+ +

+// Constants +final double PI = 3.14159; +``` +

+ +

+### Operators +

+
    +
  • Arithmetic: `+`, `-`, `*`, `/`, `%`, `++`, `–`
  • +
  • Relational: `==`, `!=`, `>`, `<`, `>=`, `<=`
  • +
  • Logical: `&&`, `||`, `!`
  • +
  • Bitwise: `&`, `|`, `^`, `~`, ``, `>>>`
  • +
  • Assignment: `=`, `+=`, `-=`, `*=`, `/=`, etc.
  • +
  • Ternary: `condition ? expr1 : expr2`
  • +
  • instanceof: Tests if object is instance of class/interface
  • +
+ +

+## 4. Control Flow Statements +

+ +

+### Conditional Statements +```java +/ if-else +if (condition) { + / code block +} else if (anotherCondition) { + / code block +} else { + / code block +} +

+ +

+/ switch +switch (variable) { + case value1: + / code block + break; + case value2: + / code block + break; + default: + / code block +} +

+ +

+/ Enhanced switch (Java 14+) +switch (variable) { + case value1 -> / code or expression; + case value2 -> / code or expression; + default -> / code or expression; +} +``` +

+ +

+### Loops +```java +/ for loop +for (int i = 0; i < 10; i++) { + / code block +} +

+ +

+/ enhanced for loop (for-each) +for (String item : itemList) { + / code block +} +

+ +

+/ while loop +while (condition) { + / code block +} +

+ +

+/ do-while loop +do { + / code block +} while (condition); +``` +

+ +

+### Control Statements +

+
    +
  • break: Exits loop or switch
  • +
  • continue: Skips to next iteration
  • +
  • return: Exits method, optionally returning value
  • +
  • yield: Returns value from switch expression (Java 14+)
  • +
+ +

+## 5. Exception Handling +

+ +

+### Exception Hierarchy +

+
    +
  • Throwable: Base class for all exceptions +
      +
    • Error: Serious problems, not typically caught
    • +
    • Exception: Base for checked exceptions +
        +
      • RuntimeException: Base for unchecked exceptions
      • +
    • +
  • +
+ +

+### Try-Catch-Finally +```java +try { + / code that might throw exception +} catch (ExceptionType1 e1) { + / handle exception type 1 +} catch (ExceptionType2 | ExceptionType3 e2) { + / handle multiple exception types +} finally { + / always executed code +} +``` +

+ +

+### Try-With-Resources +```java +try (BufferedReader br = new BufferedReader(new FileReader(“file.txt”))) { + / code that uses resource + / resource automatically closed +} +``` +

+ +

+### Throwing Exceptions +```java +if (value < 0) { + throw new IllegalArgumentException(“Value cannot be negative”); +} +``` +

+ +

+### Creating Custom Exceptions +```java +public class CustomException extends Exception { + public CustomException() { super(); } + public CustomException(String message) { super(message); } + public CustomException(String message, Throwable cause) { super(message, cause); } +} +``` +

+ +

+### Checked vs. Unchecked Exceptions +

+
    +
  • Checked: Must be caught or declared (IOException, SQLException)
  • +
  • Unchecked: Not required to be caught (RuntimeException and subclasses)
  • +
+ +

+## 6. Java Collections Framework +

+ +

+### Main Interfaces +

+
    +
  • Collection: Root interface +
      +
    • List: Ordered collection (allows duplicates)
    • +
    • Set: No duplicates
    • +
    • Queue: Typically FIFO order
    • +
  • +
  • Map: Key-value pairs
  • +
+ +

+### Common Implementations +

+
    +
  • Lists: +
      +
    • `ArrayList`: Dynamic array, fast random access
    • +
    • `LinkedList`: Fast insertions/deletions
    • +
    • `Vector`: Synchronized version of ArrayList
    • +
  • +
  • Sets: +
      +
    • `HashSet`: Fast operations, no order guarantee
    • +
    • `LinkedHashSet`: Preserves insertion order
    • +
    • `TreeSet`: Sorted set (implements SortedSet)
    • +
  • +
  • Maps: +
      +
    • `HashMap`: Fast operations, no order guarantee
    • +
    • `LinkedHashMap`: Preserves insertion order
    • +
    • `TreeMap`: Sorted by keys (implements SortedMap)
    • +
    • `Hashtable`: Synchronized version of HashMap
    • +
  • +
  • Queues: +
      +
    • `ArrayDeque`: Resizable array implementation
    • +
    • `PriorityQueue`: Elements processed by priority
    • +
  • +
+ +

+### Usage Examples +```java +// ArrayList +List<String> names = new ArrayList<>(); +names.add(“Alice”); +names.add(“Bob”); +names.remove(0); +String first = names.get(0); +

+ +

+// HashMap +Map<String, Integer> ages = new HashMap<>(); +ages.put(“Alice”, 30); +ages.put(“Bob”, 25); +int aliceAge = ages.get(“Alice”); +boolean containsBob = ages.containsKey(“Bob”); +

+ +

+/ HashSet +Set<String> uniqueNames = new HashSet<>(); +uniqueNames.add(“Alice”); +uniqueNames.add(“Alice”); / Ignored (duplicate) +boolean hasAlice = uniqueNames.contains(“Alice”); +``` +

+ +

+## 7. Generics +

+ +

+### Basic Syntax +```java +// Generic class +public class Box<T> { + private T value; +

+ +

+ public void set(T value) { this.value = value; } + public T get() { return value; } +} +

+ +

+// Usage +Box<Integer> intBox = new Box<>(); +intBox.set(10); +Integer value = intBox.get(); +``` +

+ +

+### Wildcards +```java +/ Unknown type (?) +void processElements(List<?> elements) { + / Can read but not write elements +} +

+ +

+/ Upper bounded wildcard +void addNumbers(List<? extends Number> numbers) { + / Can read elements knowing they are at least Number +} +

+ +

+/ Lower bounded wildcard +void addIntegers(List<? super Integer> integers) { + integers.add(10); / Can write Integers +} +``` +

+ +

+### Type Parameters +

+
    +
  • Type Parameter Naming Conventions: +
      +
    • `E`: Element
    • +
    • `K`: Key
    • +
    • `V`: Value
    • +
    • `N`: Number
    • +
    • `T`: Type
    • +
    • `S`, `U`, `V`, etc.: Additional types
    • +
  • +
+ +

+### Type Erasure +

+
    +
  • During compilation, generic type information is removed (“erased”)
  • +
  • Runtime doesn’t have access to generic type information
  • +
+ +

+## 8. Functional Interfaces and Lambda Expressions +

+ +

+### Functional Interfaces +

+
    +
  • Interface with exactly one abstract method
  • +
  • Annotated with `@FunctionalInterface`
  • +
  • Common functional interfaces: +
      +
    • `Predicate<T>`: Takes T, returns boolean (`boolean test(T t)`)
    • +
    • `Consumer<T>`: Takes T, returns void (`void accept(T t)`)
    • +
    • `Function<T,R>`: Takes T, returns R (`R apply(T t)`)
    • +
    • `Supplier<T>`: Takes nothing, returns T (`T get()`)
    • +
    • `BinaryOperator<T>`: Takes two T, returns T (`T apply(T t1, T t2)`)
    • +
  • +
+ +

+### Lambda Expressions +```java +// Basic syntax +(parameters) -> expression +(parameters) -> { statements; } +

+ +

+// Examples +Predicate<String> isEmpty = s -> s.isEmpty(); +Consumer<String> printer = s -> System.out.println(s); +Function<String, Integer> lengthFinder = s -> s.length(); +Supplier<Double> random = () -> Math.random(); +BinaryOperator<Integer> sum = (a, b) -> a + b; +``` +

+ +

+### Method References +```java +// Static method +Function<String, Integer> parseInt = Integer::parseInt; +

+ +

+// Instance method of specific object +Consumer<String> printer = System.out::println; +

+ +

+// Instance method of arbitrary object +Function<String, Integer> length = String::length; +

+ +

+// Constructor +Supplier<List<String>> listSupplier = ArrayList::new; +``` +

+ +

+## 9. Streams API +

+ +

+### Creating Streams +```java +// From collection +List<String> list = Arrays.asList(“a”, “b”, “c”); +Stream<String> stream = list.stream(); +

+ +

+// From array +String[] array = {“a”, “b”, “c”}; +Stream<String> stream = Arrays.stream(array); +

+ +

+// Generate/iterate +Stream<Integer> numbers = Stream.iterate(0, n -> n + 1).limit(10); +Stream<Double> randoms = Stream.generate(Math::random).limit(5); +``` +

+ +

+### Common Operations +

+
    +
  • Intermediate Operations (return a stream): +
      +
    • `filter(Predicate)`: Filters elements
    • +
    • `map(Function)`: Transforms elements
    • +
    • `flatMap(Function)`: Transforms and flattens
    • +
    • `sorted()`: Sorts elements
    • +
    • `distinct()`: Removes duplicates
    • +
    • `limit(n)`: Limits size
    • +
    • `skip(n)`: Skips elements
    • +
  • +
  • Terminal Operations (produce a result): +
      +
    • `forEach(Consumer)`: Processes each element
    • +
    • `collect(Collector)`: Gathers elements
    • +
    • `reduce(BinaryOperator)`: Reduces to single value
    • +
    • `count()`: Counts elements
    • +
    • `anyMatch(Predicate)`: Tests if any match
    • +
    • `allMatch(Predicate)`: Tests if all match
    • +
    • `noneMatch(Predicate)`: Tests if none match
    • +
    • `findFirst()`, `findAny()`: Finds elements
    • +
  • +
+ +

+### Example +```java +List<String> names = Arrays.asList(“John”, “Jane”, “Jack”, “James”); +

+ +

+List<String> filteredNames = names.stream() + .filter(name -> name.startsWith(“J”)) + .filter(name -> name.length() > 3) + .map(String::toUpperCase) + .sorted() + .collect(Collectors.toList()); +``` +

+ +

+## 10. Multithreading and Concurrency +

+ +

+### Thread Creation +```java +/ Extending Thread +class MyThread extends Thread { + public void run() { + / Code to execute in thread + } +} +MyThread thread = new MyThread(); +thread.start(); +

+ +

+/ Implementing Runnable +class MyRunnable implements Runnable { + public void run() { + / Code to execute in thread + } +} +Thread thread = new Thread(new MyRunnable()); +thread.start(); +

+ +

+/ Lambda expression +Thread thread = new Thread(() -> { + / Code to execute in thread +}); +thread.start(); +``` +

+ +

+### Thread Lifecycle +

+
    +
  • New: Created but not started
  • +
  • Runnable: Started, waiting for scheduler
  • +
  • Blocked: Waiting for monitor lock
  • +
  • Waiting: Called wait() without timeout
  • +
  • Timed Waiting: Called sleep() or wait() with timeout
  • +
  • Terminated: Completed execution
  • +
+ +

+### Thread Synchronization +```java +/ Synchronized method +synchronized void method() { + / Thread-safe code +} +

+ +

+/ Synchronized block +synchronized (lockObject) { + / Thread-safe code +} +

+ +

+/ Lock interface +Lock lock = new ReentrantLock(); +lock.lock(); +try { + / Critical section +} finally { + lock.unlock(); +} +``` +

+ +

+### Concurrent Collections +

+
    +
  • ConcurrentHashMap: Thread-safe HashMap
  • +
  • CopyOnWriteArrayList: Thread-safe ArrayList
  • +
  • BlockingQueue: Queue with blocking operations
  • +
+ +

+### Thread Pools (ExecutorService) +```java +/ Fixed thread pool +ExecutorService executor = Executors.newFixedThreadPool(5); +executor.submit(() -> { + / Task to execute +}); +executor.shutdown(); +

+ +

+/ CompletableFuture +CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { + / Async computation + return “Result”; +}); +future.thenAccept(System.out::println); +``` +

+ +

+### Atomic Variables +```java +AtomicInteger counter = new AtomicInteger(0); +counter.incrementAndGet(); // Thread-safe increment +``` +

+ +

+### Thread Communication +

+
    +
  • wait(): Causes thread to wait until notify/notifyAll
  • +
  • notify(): Wakes up one waiting thread
  • +
  • notifyAll(): Wakes up all waiting threads
  • +
  • join(): Waits for thread to die
  • +
+
+
+
+
+

Original

+
+
    +
  1. Object-Oriented Programming (OOP) in Java
  2. +
  3. Encapsulation (Access Modifiers: private, protected, public, default)
  4. +
  5. Abstraction (abstract classes, interfaces, default methods in interfaces)
  6. +
  7. Inheritance (extends, method overriding, super keyword, constructor chaining)
  8. +
  9. Polymorphism (Compile-time vs. Runtime, method overloading vs. method overriding)
  10. +
  11. Composition vs. Inheritance (Why favor composition over inheritance?)
  12. +
  13. SOLID Principles (How they apply in Java)
  14. +
  15. JavaBeans and POJOs (Plain Old Java Objects)
  16. + +
  17. Java Data Types and Memory Management
  18. +
  19. Primitive vs. Reference Types
  20. +
  21. Wrapper classes (Integer, Double, Boolean, etc.)
  22. +
  23. String handling (String, StringBuilder, StringBuffer, immutability)
  24. +
  25. Autoboxing and Unboxing
  26. +
  27. Memory Allocation (Heap vs. Stack)
  28. +
  29. Garbage Collection (How it works, finalize(), weak references, types of GC algorithms)
  30. + +
  31. Java Collections Framework (JCF)
  32. +
  33. List Interface (ArrayList, LinkedList, Vector, Stack)
  34. +
  35. Set Interface (HashSet, TreeSet, LinkedHashSet)
  36. +
  37. Map Interface (HashMap, TreeMap, LinkedHashMap, Hashtable)
  38. +
  39. Queue Interface (PriorityQueue, Deque, ArrayDeque)
  40. +
  41. Concurrent Collections (ConcurrentHashMap, CopyOnWriteArrayList)
  42. +
  43. Sorting and Searching in Collections (Comparable vs. Comparator)
  44. +
  45. Big-O Complexity of Collection Operations
  46. +
  47. Immutable Collections (List.of(), Set.of(), Map.of())
  48. + +
  49. Exception Handling
  50. +
  51. Checked vs. Unchecked Exceptions
  52. +
  53. Custom Exceptions
  54. +
  55. Try-Catch-Finally vs. Try-With-Resources (AutoCloseable)
  56. +
  57. Throw vs. Throws
  58. +
  59. Multi-catch blocks (catch (IOException | SQLException e))
  60. +
  61. Best Practices for Exception Handling (Avoiding Generic Exceptions)
  62. + +
  63. Java Multithreading and Concurrency
  64. +
  65. Thread Lifecycle
  66. +
  67. Creating Threads (Thread vs. Runnable, Callable, Future)
  68. +
  69. Synchronization (synchronized keyword, locks, ReentrantLock, wait(), notify())
  70. +
  71. Thread Safety and Shared Resource Handling
  72. +
  73. Executors and Thread Pools (ExecutorService, ScheduledExecutorService)
  74. +
  75. Atomic Variables (AtomicInteger, AtomicBoolean)
  76. +
  77. Fork-Join Framework
  78. +
  79. Deadlocks, Race Conditions, and Livelocks
  80. + +
  81. Java Streams and Functional Programming
  82. +
  83. Lambda Expressions ((a, b) -> a + b)
  84. +
  85. Method References (Class::methodName)
  86. +
  87. Functional Interfaces (Predicate, Consumer, Supplier, Function, BiFunction)
  88. +
  89. Streams API (Intermediate vs. Terminal Operations)
  90. +
  91. Stream Processing (map(), filter(), reduce(), collect())
  92. +
  93. Parallel Streams (parallelStream())
  94. +
  95. Optional Class (Optional<T>, avoiding null)
  96. + +
  97. Java Input/Output (I/O) and Serialization
  98. +
  99. Byte Streams vs. Character Streams (InputStream, OutputStream, Reader, Writer)
  100. +
  101. File Handling (File, Files, BufferedReader, BufferedWriter)
  102. +
  103. Object Serialization (Serializable, transient keyword)
  104. +
  105. New I/O (NIO) (Path, Files, ByteBuffer, Channels)
  106. +
  107. Memory-Mapped Files
  108. +
  109. Java 11+ Features (Files.writeString(), Files.readString())
  110. + +
  111. Java 8+ Features
  112. +
  113. Default and Static Methods in Interfaces
  114. +
  115. Optional Class
  116. +
  117. New Date and Time API (LocalDate, LocalTime, LocalDateTime, ZonedDateTime)
  118. +
  119. CompletableFuture (thenApply(), thenAccept(), exceptionally())
  120. +
  121. New Collection Methods (List.of(), Set.of(), Map.of())
  122. +
  123. Records (Java 14+)
  124. +
  125. Pattern Matching (Java 17+)
  126. +
  127. Sealed Classes (Java 17+)
  128. + +
  129. Java Reflection and Dynamic Class Loading
  130. +
  131. Getting Class Information (.class, Class.forName())
  132. +
  133. Accessing Private Fields and Methods
  134. +
  135. Dynamic Proxy and InvocationHandler
  136. +
  137. Annotations and Annotation Processing
  138. + +
  139. Java Networking (Sockets, HTTP)
  140. +
  141. Java Sockets (ServerSocket, Socket)
  142. +
  143. URL and HttpURLConnection
  144. +
  145. HTTP Clients (Java 11 HttpClient)
  146. +
  147. Multithreaded Server Applications
  148. + +
  149. Java Security Basics
  150. +
  151. Encryption and Hashing (AES, SHA, RSA)
  152. +
  153. Java Cryptography API (MessageDigest, Cipher)
  154. +
  155. Secure Random Numbers (SecureRandom)
  156. +
  157. Security Manager (doPrivileged())
  158. +
  159. Understanding Java Classloaders and Security Policies
  160. + +
  161. Java Virtual Machine (JVM) Internals
  162. +
  163. JVM Architecture (ClassLoader, Method Area, Heap, Stack, Execution Engine, Garbage Collector)
  164. +
  165. Class Loading (ClassLoader, Bootstrap, Extensions, Application ClassLoader)
  166. +
  167. JIT Compilation (Just-In-Time Compiler)
  168. +
  169. Garbage Collection Algorithms (G1, ZGC, Epsilon GC)
  170. +
  171. JVM Performance Tuning (-Xms, -Xmx, -XX:+UseG1GC)
  172. +
+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723190656-java_junit_testing.html b/output/20250723190656-java_junit_testing.html new file mode 100755 index 0000000..7588517 --- /dev/null +++ b/output/20250723190656-java_junit_testing.html @@ -0,0 +1,273 @@ + + + + + + + +java-junit-testing + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723190927-self_hosting.html b/output/20250723190927-self_hosting.html new file mode 100755 index 0000000..d6b3919 --- /dev/null +++ b/output/20250723190927-self_hosting.html @@ -0,0 +1,276 @@ + + + + + + + +self_hosting + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250723200800-postgres.html b/output/20250723200800-postgres.html new file mode 100755 index 0000000..e4e697d --- /dev/null +++ b/output/20250723200800-postgres.html @@ -0,0 +1,384 @@ + + + + + + + +postgres + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

postgres

+ +
+
+
+
+
+ +

+Something I’ve been trying to reverse proxy ahead of time. Go to https://zserver.zapto.org/nextcloud , you’ll be prompted to login with a username and password: +Here’s your credentials: +

+ +

+Username: halima +Password: loser2104! +

+ +

+Once you’ve logged in, I’ve set up your account already, so there should be a calendar already there. +

+ +

+To get your phone logged in, there’s two ways: +

+
    +
  1. go to the following address: https://zserver.zapto.org/nextcloud/settings/user/security , scroll to the bottom, under devices and sessions, type in a random name (iphone), and click create new app password. You should then be able to generate a QR code (next to or under the password field), then you can scan that on your iphone app.
  2. + +
  3. inside the app, type the following URL: https://zserver.zapto.org/nextcloud then follow the instructions.
  4. +
+ +

+Im thinking of having this as our shared calendar and file system. The only users are us 2 and its completely off the internet (self-hosted). +

+ + +

+network issues resolved by: +

+ +

+docker network connect postgresnetwork postgres +

+ + +

+zaine@zaine-HP-ProDesk-400-G1-SFF [21:00:27] [~/docker-services/nextcloud] +-> % psql -h zserver.zapto.org -p 5432 -U zaine -d zxqdb +Password for user zaine: +psql (14.18 (Ubuntu 14.18-0ubuntu0.22.04.1), server 17.5 (Debian 17.5-1.pgdg120+1)) +WARNING: psql major version 14, server major version 17. + Some psql features might not work. +Type “help” for help. +

+ +

+zxqdb=# \c nextcloud +psql (14.18 (Ubuntu 14.18-0ubuntu0.22.04.1), server 17.5 (Debian 17.5-1.pgdg120+1)) +WARNING: psql major version 14, server major version 17. + Some psql features might not work. +You are now connected to database “nextcloud” as user “zaine”. +nextcloud=# GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud; +GRANT +nextcloud=# GRANT USAGE ON SCHEMA public TO nextcloud; +GRANT CREATE ON SCHEMA public TO nextcloud; +GRANT +GRANT +nextcloud=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO nextcloud; +GRANT +nextcloud=# GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO nextcloud; +GRANT +nextcloud=# +

+ +

+zaine +M22ZN-fmefj-RdF36-3BMfT-LfWo8 +

+ +

+zaine +zxh123! +

+ + + + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250724230557-books_org_agenda.html b/output/20250724230557-books_org_agenda.html new file mode 100755 index 0000000..71cb060 --- /dev/null +++ b/output/20250724230557-books_org_agenda.html @@ -0,0 +1,574 @@ + + + + + + + +books-org-agenda + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

books-org-agenda

+ +
+
+

Books

+
+
+ + + +
+

Guide

+
+

+:Status: Reading | To Read | Read | Studying D | Studying O | To Study D | To Study O | Studied D | Studied O | Reference | Voluminous +:Group: Reading | Study +:Agenda: Books I am Studying (Darsi) | Books I am Studying (Outside) | Books To Study (Darsi) | Books To Study (Outside) | Books Studied (Darsi) | Books Studied (Outside) | Reference Books | Voluminous Books +

+
+
+
+
+

Other Books

+
+
+ + + +
+

Clean Code

+
+
+
+ + +
+

Ikigai

+
+
+
+
+

Guide:

+
+

+:Status: Others Reading | Others Read | Others To Read +:Group: Other +

+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250727120306-nextcloud.html b/output/20250727120306-nextcloud.html new file mode 100755 index 0000000..f61149c --- /dev/null +++ b/output/20250727120306-nextcloud.html @@ -0,0 +1,332 @@ + + + + + + + +nextcloud + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

nextcloud

+ +
+
+

The docker file:

+
+
+
+version: '3.8'
+services:
+  app:
+    image: nextcloud
+    restart: unless-stopped
+    ports:
+      - 8007:80
+    volumes:
+      - nextcloud:/var/www/html
+    environment:
+      - POSTGRES_DB=nextcloud
+      - POSTGRES_USER=nextcloud
+      - POSTGRES_PASSWORD=zxq123_nextcloud
+      - POSTGRES_HOST=postgres
+    networks:
+      - postgres_network
+
+volumes:
+  nextcloud:
+
+networks:
+  postgres_network:
+    external: true
+
+
+
+
+
+
+

Database related things:

+
+
+
+zxq_db=# CREATE DATABASE nextcloud;
+CREATE DATABASE
+zxq_db=# CREATE USER nextcloud WITH PASSWORD 'zxq123_nextcloud';
+CREATE ROLE
+zxq_db=# GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud;
+GRANT
+zxq_db=# 
+
+
+
+
+
+
+

Config

+
+

+Location is: +

+ +

+sudo nano /var/lib/docker/volumes/nextcloudnextcloud/data/config/config.php +

+ + + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250727121051-networking_moc.html b/output/20250727121051-networking_moc.html new file mode 100755 index 0000000..8936385 --- /dev/null +++ b/output/20250727121051-networking_moc.html @@ -0,0 +1,273 @@ + + + + + + + +networking-moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

networking-moc

+ +
+

+selfhosting +

+ + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250727122406-database_moc.html b/output/20250727122406-database_moc.html new file mode 100755 index 0000000..23e060f --- /dev/null +++ b/output/20250727122406-database_moc.html @@ -0,0 +1,272 @@ + + + + + + + +database_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

databasemoc

+ +
+

+postgres +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250727174809-books_moc.html b/output/20250727174809-books_moc.html new file mode 100755 index 0000000..4687f64 --- /dev/null +++ b/output/20250727174809-books_moc.html @@ -0,0 +1,281 @@ + + + + + + + +Books MOC + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250727174903-book_recs.html b/output/20250727174903-book_recs.html new file mode 100755 index 0000000..0a79e10 --- /dev/null +++ b/output/20250727174903-book_recs.html @@ -0,0 +1,279 @@ + + + + + + + +book-recs + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

book-recs

+ +
+
+

Link

+
+
    +
  • The Unix Programming Environment by Brian W. Kernighan and Rob Pike
  • +
  • An Introduction to Programming in Emacs Lisp by Robert J. Chassell
  • +
  • GNU Emacs Manual by Richard M, Stallman
  • +
+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250727221512-clean_code.html b/output/20250727221512-clean_code.html new file mode 100755 index 0000000..f07e8a5 --- /dev/null +++ b/output/20250727221512-clean_code.html @@ -0,0 +1,1389 @@ + + + + + + + +clean-code + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

clean-code

+ +
+
+

Chapter 1: Clean Code

+
+

+Referenced Items: +

+
    +
  • Implementation Patterns, Kent Beck, Addison-Wesley, 2007.
  • +
  • Literate Programming, Donald E. Knuth, Center for the Study of Language and Information, Leland Stanford Junior University, 1992.
  • +
+ +

+Principles mentioned: +Single Responsibility Principle (SRP), the Open Closed Principle (OCP), and the Dependency Inversion Principle (DIP) +

+
+
+
+

Chapter 2: Meaningful Names

+
+
+
+

Use intention revealing names:

+
+

+Names should reveal intent, there is no revelation in naming an integer d, intending it stands for days. Instead, you should use the following names: +

+
+
int elapsedTimeInDays;
+int daysSinceCreation;
+int daysSinceModification;
+int fileAgeInDays;
+
+
+
+
+
+

Avoid disinformation

+
+

+Don’t postfix the word ’list’ to the name ’accounts’ unless it’s actually a list. This is because the reader will assume the data type of accountsList is indeed a list, instead choose a name like accountsGroup. +

+
+
+
+

Make Meaningful Distinctions

+
+

+While it is possible to name by being disinformative, it is also possible to name being non informative. Consider: +

+ +
+
+public static void copyChars(char a1[], char a2[]) {
+    for (int i = 0; i < a1.length; i++) {
+        a2[i] = a1[i];
+    }
+}
+
+
+
+ +

+What on earth does a[1] and a[2] even stand for? We are better off using names like source and destination (due to the function’s intent of copying the array). +

+ +

+Furthermore, noise words are redundant. We should never use the word variable when naming a variable, or table when naming a table. +

+
+
+
+

Use Pronouncable Names

+
+

+This is quite straightforward. Do not use a name like genymdhms to refer to generation date, year, month, day, hour, minute, +and second. Instead use generationTimeStamp. +

+
+
+
+

Use Searchable Names

+
+

+In modern IDE’s, it is still quite difficult to search for single-lettered variables. The writer states a personal preference of using single-letter names only as local variables and inside short methods. The following principle is given: +

+ +

+The length of a name should correspond to the size of its scope +

+
+
+
+

Avoid Encodings

+
+

+Don’t prefix variables with letters like m_ as was done in the past. Do not type encode as well, an example of this is: PhoneNumber phoneString; we can see the reader being misled into thinking the phone number is a String. +

+
+
+
+

Avoid Mental Mappings

+
+

+Clarity is king, don’t use a name for a variable that only you know what it stands for. For example: using the letter r as the lower-cased version of the url with the host and scheme +removed. That’s being smart, not professional. +

+
+
+
+

Class Names

+
+
+

+Classes and objects should have noun or noun phrase names like Customer, WikiPage, +Account, and AddressParser. Avoid words like Manager, Processor, Data, or Info in the name +of a class. A class name should not be a verb. +

+
+ +

+

Classes and objects should have noun or noun phrase names like Customer, WikiPage, Account, and AddressParser. Avoid words like Manager, Processor, Data, or Info in the name of a class. A class name should not be a verb

+

+
+
+
+

Method Names

+
+

+Methods should have verb or verb phrase names. +

+
+
+
+

Don’t be cute/Don’t use puns

+
+

+Do not use names that are only understandable to people whom you share jokes etc with. Furthermore, do not use colloquialism and slang in names. +

+
    +
  • Example: HandGrenade instead of DeleteItems
  • +
  • Example: whack() instead of kill()
  • +
+
+
+
+

Pick one word per concept

+
+

+If you have multiple choices for naming a concept, use one and stick with it. For instance if your options are fetch, get and retrieve, use one and stick with it throughout. +

+
+
+
+

Solution Domain Names and Problem Domain Names

+
+

+Where possible use solution domain names, as the people that are going to be reading the code are programmers. Therefore, do not shy away from using CS terms, algorithm names, math names and so forth. +

+ +

+However when it is not possible to use solution domain names (in other words, when there is no “programmer-eese” then use the name from the problem domain. The other programmers can ask the domain expert for clarification. If the code is more to do with the problem domain concepts, then the names should be drawn from them. +

+
+
+
+

Add Meaningful Context

+
+

+Enclose names with well-named classes, functions, or namespaces. When all else fails, then prefix with something that provides more context. +

+
+
+
+

Don’t add gratuitous context

+
+

+Shorter names are better than longer ones, generally. This is so long as the context and intent is clear. Don’t add redundant or irrelevant additions to the name in the for the sake of ’context’. +

+
+
+
+
+

Chapter 3: Functions

+
+
+
+

Functions should be small

+
+

+Functions should be extremely short—ideally just a few lines, so they remain easy to understand and maintain. +

+ +

+Avoid deeply nested blocks; keep indentation shallow (1–2 levels), often replacing blocks with descriptive function calls. +

+ +

+A small function tells a concise, self-contained story, making it easier for readers to follow the program’s intent. +

+ +

+The smaller the function, the more descriptive and accurate its name can be, improving self-documentation. +

+ +

+Large functions hide complexity and mix abstraction levels, making errors and duplication more likely. +

+
+
+
+

Do One Thing & One Level of Abstraction

+
+

+A function should do exactly one conceptual task, and all its statements should exist at the same abstraction level. +

+ +

+Mixing details (like string concatenation) with high-level actions (like rendering a page) causes confusion. +

+ +

+The Stepdown Rule: organise functions so they read like a top down narrative, each calling the next abstraction level. +

+ +

+If you can extract a subfunction with a name that isn’t a restatement, the original function is doing too much. +

+ +

+Functions that “do one thing” cannot be logically split into sections such as “initialize,” “process,” “finalize.” +

+
+
+
+

Switch Statements

+
+

+Switch statements naturally violate “do one thing” by handling multiple cases; they also grow in size over time. +

+ +

+They break the Single Responsibility Principle (multiple reasons to change) and Open-Closed Principle (must change for new cases). +

+ +

+Preferred approach: hide switch statements inside a factory and dispatch behavior polymorphically through an interface. +

+ +

+Allow only one visible switch in your system, used solely for object creation, then encapsulate it. +

+ +

+This removes duplication and keeps high-level code unaware of concrete type distinctions. +

+ +

+Example: +

+ +
+
public abstract class Employee {
+    public abstract boolean isPayday();
+    public abstract Money calculatePay();
+    public abstract void deliverPay(Money pay);
+}
+-----------------
+    public interface EmployeeFactory {
+        public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
+    }
+-----------------
+    public class EmployeeFactoryImpl implements EmployeeFactory {
+        public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
+            switch (r.type) {
+            case COMMISSIONED:
+                return new CommissionedEmployee(r) ;
+            case HOURLY:
+                return new HourlyEmployee(r);
+            case SALARIED:
+                return new SalariedEmploye(r);
+            default:
+                throw new InvalidEmployeeType(r.type);
+            }
+        }
+    }
+
+
+
+
+
+
+

Use Descriptive Names

+
+

+A function’s name should clearly state its purpose. Long, descriptive names beat short, cryptic ones. +

+ +

+Consistent naming patterns (shared verbs/nouns) help code read like a coherent story and aid predictability. +

+ +

+Descriptive names reduce the need for comments and improve comprehension without external documentation. +

+ +

+Renaming functions can reveal design improvements, so try multiple options until the best emerges. +

+ +

+IDE refactoring tools make renaming safe, encouraging experimentation. +

+
+
+
+

Function Arguments

+
+

+

The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification—and then shouldn’t be used anyway.

+

+ +

+Fewer arguments = better; aim for 0–2, avoid more than 3 unless absolutely necessary. +

+ +

+Flag arguments (booleans) are a red flag—they imply the function does multiple things. +

+ +

+Group related parameters into objects (e.g., Point for x and y) to reduce argument count and improve clarity. +

+ +

+Output arguments are confusing—prefer returning values or mutating the owning object’s state. +

+ +

+Match function/argument names in verb–noun or keyword style (e.g., writeField(name), assertExpectedEqualsActual). +

+
+
+
+

Have No Side Effects

+
+

+A function should do only what its name promises. Hidden state changes are misleading and dangerous. +

+ +

+Side effects create temporal coupling, meaning the function must be called in a certain sequence to be safe. +

+ +

+If unavoidable, make side effects explicit in the name (e.g., checkPasswordAndInitializeSession). +

+ +

+Clear separation of command and query functions avoids ambiguity in meaning and intent. +

+ +

+Functions that modify state and return information often cause confusion and should be split. +

+
+
+
+

Error Handling

+
+

+Error handling is a single responsibility—separate it from normal logic to keep both paths clear. +

+ +

+Prefer exceptions over error codes to avoid cluttering the happy path and to reduce dependency magnets. +

+ +

+Extract try/catch bodies into their own functions for cleaner structure. +

+ +

+See below: +

+ +
+
+public void delete(Page page) {
+      try {
+        deletePageAndAllReferences(page);
+      }
+      catch (Exception e) {
+        logError(e);
+      }
+  }
+
+private void deletePageAndAllReferences(Page page) throws Exception {
+    deletePage(page);
+    registry.deleteReference(page.name);
+    configKeys.deleteKey(page.name.makeKey());
+}
+private void logError(Exception e) {
+    logger.log(e.getMessage());
+}
+
+
+
+ +

+Keep functions small enough that occasional multiple return or break statements are acceptable. +

+ +

+Avoid duplication in error handling, and follow the DRY principle to ensure changes occur in one place. +

+
+
+
+
+

Chapter 4: Comments

+
+

+Comments are a necessary evil—they exist because code fails to express intent clearly. +

+ +

+Outdated comments are dangerous; they can mislead more than help. +

+ +

+Strive to write code that explains itself; comments should be minimized. +

+ +

+Truth is always in the code, not in the comments. +

+
+
+

Comments Do Not Make Up for Bad Code

+
+

+Don’t use comments to excuse messy, unclear code—clean the code instead. +

+ +

+Clear, expressive code with few comments > cluttered code with many comments. +

+ +
+
+// Check to see if the employee is eligible for full benefits
+if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
+
+// Better:
+if (employee.isEligibleForFullBenefits())
+
+
+
+
+
+
+

Good Comments

+
+

+Only write them when unavoidable. +

+
+
+
+

Legal Comments

+
+

+Sometimes required for copyright/licensing. +

+ +

+Keep them short; refer to standard licenses rather than embedding full legal text. +

+
+
+
+

Informative Comments

+
+

+Explain return values, formats, or patterns. +

+ +

+Prefer naming/structuring code to make such comments unnecessary. +

+ +
+
+// format matched kk:mm:ss EEE, MMM dd, yyyy
+Pattern timeMatcher = Pattern.compile("\\d*:\\d*:\\d* \\w*, \\w* \\d*, \\d*");
+
+
+
+
+
+
+

Explanation of Intent

+
+

+Describe why a certain approach was chosen. +

+ +

+Helps future maintainers understand reasoning behind code. +

+ +

+return 1; // we are greater because we are the right type. +

+
+
+
+

Clarification

+
+

+Translate obscure values into readable terms. +

+ +

+Useful when working with unchangeable APIs/libraries, but risky if incorrect. +

+
+
+
+

Warning of Consequences

+
+

+Alert others about performance, thread-safety, or side effects. +

+ +

+// SimpleDateFormat is not thread safe, so create each instance independently. +

+
+
+
+

\TODO\ Comments

+
+

+Mark incomplete work or planned improvements. +

+ +

+Should be reviewed regularly; not an excuse for bad code. +

+
+
+
+

Amplification

+
+

+Highlight the importance of seemingly small details. +

+ +

+// the trim is real important. It removes starting spaces… +

+
+
+
+

Javadocs in Public APIs

+
+

+Public APIs should have clear documentation. +

+ +

+Javadocs can also mislead—keep them accurate and up-to-date. +

+
+
+
+

Don’t Use a Comment When You Can Use a Function or Variable

+
+

+Replace explanatory comments with expressive variable or function names. +

+ +

+Refactor code to remove comment redundancy. +

+
+
+
+

Position Markers

+
+

+Avoid decorative banners like // Actions ///////////////////////—they add clutter. +

+ +

+Use sparingly and only for meaningful grouping. +

+ +

+Overuse makes them blend into background noise. +

+
+
+
+

Closing Brace Comments

+
+

+Comments on closing braces (} // while) are unnecessary for small, well-structured functions. +

+ +

+Prefer short, clear functions over brace markers. +

+
+
+
+

Attributions and Bylines

+
+

+Don’t add personal tags like /* Added by Rick */—use version control for authorship history. +

+ +

+Such comments become outdated and irrelevant over time. +

+
+
+
+

Commented-Out Code

+
+

+Never keep old code commented out; delete it and rely on version control history. +

+ +

+Commented-out code adds clutter and confuses future maintainers. +

+ +
+
+// Old cruft that should be deleted:
+//hdrPos = bytePos;
+//dataPos = bytePos;
+
+
+
+
+
+
+

HTML Comments

+
+

+Avoid HTML markup inside code comments—it makes them harder to read in the editor. +

+ +

+Let documentation tools (like Javadoc) handle formatting. +

+
+
+
+

Nonlocal Information

+
+

+Comments should describe nearby code only, not unrelated parts of the system. +

+ +

+Avoid embedding global/system details that the function can’t control. +

+
+
+
+

Too Much Information

+
+

+Avoid long, unnecessary historical or technical explanations. +

+ +

+Keep only relevant context (e.g., “RFC 2045” reference is fine, not the full spec). +

+
+
+
+

Inobvious Connection

+
+

+Ensure the relationship between comment and code is clear. +

+ +

+Don’t make readers guess what part of the code the comment refers to. +

+ +
+
+// plus filter bytes ... but which part is “filter”?
+this.pngBytes = new byte[((this.width + 1) * this.height * 3) + 200];
+
+
+
+
+
+
+

Function Headers

+
+

+Short, single-purpose functions with good names don’t need header comments. +

+ +

+Let the function name explain the purpose. +

+
+
+
+

Javadocs in Nonpublic Code

+
+

+Javadocs are useful for public APIs, but excessive formality in internal code is just noise. +

+ +

+Internal methods should be self-explanatory without full doc comments. +

+
+
+
+

Example: Refactored Prime Generator

+
+

+Original code: Over-commented, with redundant explanations and irrelevant history. +

+ +

+Refactored version: Only two comments remain—both explain why, not what. +

+ +

+One eases the reader into the algorithm. +

+ +

+One explains rationale for using the square root as a loop limit. +

+
+
+
+
+

Chapter 5: Formatting

+
+
+
+

Vertical Formatting (Clean Code, Ch.5)

+
+
+
+

Vertical Formatting

+
+
    +
  • Vertical openness (blank lines) separates concepts and improves readability.
  • +
  • Too much density makes code look like a muddle and harder to scan.
  • +
+
+
+
+

Vertical Density

+
+
    +
  • Tightly related lines should appear vertically dense.
  • +
  • Avoid useless comments that interrupt association.
  • +
  • Example (bad):
  • +
+
+
public class ReporterConfig {
+/**
+* The class name of the reporter listener
+*/
+private String m_className;
+
+
+ +
    +
  • Example (better):
  • +
+
+
public class ReporterConfig {
+private String m_className;
+private List<Property> m_properties = new ArrayList<>();
+
+
+
+
+
+

Vertical Distance

+
+
    +
  • Related concepts should be kept close together to reduce scrolling and searching.
  • +
  • Local variables → as close to use as possible, usually at top of function.
  • +
  • Control variables → declared inside loop headers.
  • +
  • Instance variables → declared at the top of class (common Java convention).
  • +
+ +
+
for (Test each : tests) {
+    count += each.countTestCases();
+}
+
+
+ +
    +
  • Dependent functions: caller above callee for natural top-down reading.
  • +
+
+
public Response makeResponse(...) {
+    String pageName = getPageNameOrDefault(request, "FrontPage");
+    loadPage(pageName, context);
+    return makePageResponse(context);
+}
+
+private String getPageNameOrDefault(Request request, String defaultPageName) { ... }
+
+
+
+
+
+

Conceptual Affinity

+
+
    +
  • Group functions with similar naming or shared purpose.
  • +
  • Example (JUnit assert methods):
  • +
+
+
static public void assertTrue(String message, boolean condition) { ... }
+static public void assertTrue(boolean condition) { ... }
+static public void assertFalse(String message, boolean condition) { ... }
+static public void assertFalse(boolean condition) { ... }
+
+
+
+
+
+

Vertical Ordering

+
+
    +
  • Organise code top down: +
      +
    • High-level concepts first (main logic).
    • +
    • Lower-level details later.
    • +
  • +
  • Readers can skim like a newspaper: important first, details last.
  • +
  • Contrast: C/C++ require declarations before use, Java does not.
  • +
+
+
+
+

Summary - vertical

+
+
    +
  • Use vertical openness to separate concepts.
  • +
  • Use vertical density to group related ones.
  • +
  • Keep related variables, methods, and concepts close together.
  • +
  • Order code top down for natural readability.
  • +
+
+
+
+
+

Horizontal Formatting

+
+

+Keep lines short — most professional code naturally stays within ~45 characters, with ~80 as an upper bound. Lines beyond 100–120 characters are generally careless. +

+ +

+Avoid shrinking font or overly wide monitors to fit more code — readability > fitting more characters. +

+ +

+Example limit guideline: +

+ +
+
// Good (short)
+int sum = a + b + c;
+
+// Bad (too long)
+int sum = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q;
+
+
+
+
+
+

Horizontal Openness and Density

+
+

+Use spaces to separate low-precedence operators (e.g., +, -, =) and improve readability. +

+ +

+Do not put spaces between function names and parentheses — they are closely related. +

+ +

+Example (Quadratic formula formatting): +

+ +
+
return (-b + Math.sqrt(determinant)) / (2*a);
+
+
+ +

+Separate arguments with spaces after commas to show distinct parameters. +

+
+
+
+

Horizontal Alignment

+
+

+Avoid aligning variable declarations or assignments in columns — it draws the eye to the wrong place. +

+ +

+Long aligned lists usually mean the class is too large and should be split. +

+ +

+Example (preferred unaligned): +

+ +
+
  // Prefer this:
+  private Socket socket;
+  private InputStream input;
+  private OutputStream output;
+
+//instead of:
+private Socket      socket;
+private InputStream input;
+private OutputStream output;
+
+
+
+
+
+
+

Indentation

+
+

+Indent according to scope hierarchy: +

+ +

+Classes → no indent +

+ +

+Methods → 1 level +

+ +

+Method bodies → 2 levels +

+ +

+Inner blocks → +1 for each nesting +

+ +

+Indentation makes scopes visually obvious; without it, code is hard to scan. +

+ +

+Avoid collapsing scopes onto one line — always use braces and proper indenting. +

+
+
+
+

Dummy Scopes

+
+

+Avoid dummy bodies in loops (e.g., empty while or for loops). +

+ +

+If unavoidable, place semicolon on its own indented line to make it visible. +

+ +
+
while (dis.read(buf, 0, size) != -1)
+    ;
+
+
+
+
+
+

Team Rules

+
+

+Teams must agree on a single formatting style for consistency. +

+ +

+Use IDE formatters to enforce these rules across all files. +

+ +

+Consistent formatting builds trust and reduces mental load for readers. +

+
+
+
+

Uncle Bob’s Formatting Rules (Example in CodeAnalyzer.java)

+
+

+Short, clear methods with consistent spacing and indentation. +

+ +

+Use spaces around assignment and low-precedence operators, no space for high-precedence operators. +

+ +

+Avoid deeply nested structures — prefer clear, flat logic. +

+ +

+Example snippet: +

+ +
+
private void measureLine(String line) {
+  lineCount++;
+  int lineSize = line.length();
+  totalChars += lineSize;
+  lineWidthHistogram.addLine(lineSize, lineCount);
+  recordWidestLine(lineSize);
+}
+
+
+
+
+
+ + + + + + + + + + + + +
+

Apendix A: Concurrency II

+
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250804201706-big_o_complexity.html b/output/20250804201706-big_o_complexity.html new file mode 100755 index 0000000..fe32a2f --- /dev/null +++ b/output/20250804201706-big_o_complexity.html @@ -0,0 +1,594 @@ + + + + + + + +big-o-complexity + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

big-o-complexity

+ +
+ +
+

Big (O) - Time and Space Complexity

+
+
+
+

Intro

+
+

+Time Complexity: Describes the amount of time necessary to execute an algorithm +

+ +

+Space Complexity: Describes the amount of memory or space utilized by an algorithm/program +

+ +

+Both - asymptotically +

+
+
+
+

Technical Definition of Big O

+
+

+is a mathematical notation that describes the limiting behaviour of a function when the arguments tend towards a particular value or infinity. Why do we need it? it helps us understand how the performance of an algorithm changes as the size of the input grows, providing a simple way to compare and analyse different algorithms’ efficiency. +

+ +

+Improvement in time complexity is often more important as memory is cheap and readily available +

+ +

+In Big O, there are six major types of complexities (time and space): +

+ +
    +
  • Constant: O(1)
  • + +
  • Linear time: O(n)
  • + +
  • Logarithmic time: O(n log n)
  • + +
  • Quadratic time: O(n2)
  • + +
  • Exponential time: O(2n)
  • + +
  • Factorial time: O(n!)
  • +
+
+
+
+

Big O - linear example

+
+

+Suppose we are given a problem where we have a list of `N` numbers of unknown length. We are asked to use code to find and return “True” if the number 2 is in the list and “False” otherwise. Our solution could be to go through every position in the list and check if the number at that position is equal to 2. +

+ +

+[3, 10, 2, 7] +

+ +
+
for number in list:
+   if number == 2:
+      return True
+   else:
+      continue
+return False
+
+
+ +

+This would take N time, we need to check every number in the list once, making this solution O(N) - linear time. This looks at the worst case scenarion, if 2 was at the start of the list we know it would take a constant time, however if it’s at the end then it would take N time. +

+ + +
+

Big-O-Notation-3130482830.png +

+
+ + +

+In the graph above focus on the tail end of the graphs because Big O is concerned with “as the input size grows what happens to the speed of the operations”. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+  Complexity  + +  Name          + +  Description                       + +  Common Use Cases                    + +  Performance at Scale  +
+  O(1)        + +  Constant      + +  Runtime unaffected by input size  + +  Hash tables, array access           + +  Excellent             +
+  O(log n)   
+              +
+  Logarithmic  
+                +
+  Runtime increases slowly         
+  (typically halved at each step)   +
+  Binary search, balanced trees      
+                                      +
+  Very good            
+                        +
+  O(n)       
+              +
+  Linear       
+                +
+  Runtime scales linearly          
+  (proportional)                    +
+  Linear search, array traversal     
+                                      +
+  Good                 
+                        +
+  O(n log n) 
+             
+              +
+  Linearithmic 
+               
+                +
+  Between linear and quadratic     
+  (often seen in divide and conquer
+  algorithms)                       +
+  Efficient sorting algorithms       
+                                     
+                                      +
+  Fair                 
+                       
+                        +
+  O(n²)       + +  Quadratic     + +  Runtime squares with input size   + +  Nested loops, simple sorting        + +  Poor                  +
+  O(2ⁿ)       + +  Exponential   + +  Runtime doubles with each input   + +  Recursive solutions, combinatorics  + +  Very poor             +
+  O(n!)      
+              +
+  Factorial    
+                +
+  Runtime grows by factorial       
+  (extremely slow)                  +
+  Permutations, traveling salesman   
+                                      +
+  Terrible             
+                        +
+
+
+
+

Summation of complexities:

+
+

+When you have multiple operations in an algorithm that each have a linear time complexity O(n), and these operations are sequential (not nested), the overall time complexity of the algorithm remains linear, O(n). +

+ +

+Here’s how it works: +

+ +
    +
  1. Summing Linear Operations: If your algorithm involves several separate linear operations, such as:
  2. +
+

+• First iterating over an array of n elements, +• Then, in a separate loop, iterating over the same or another array of n elements, +• And perhaps another loop doing the same, +each operation has a complexity of O(n). If you sum these, the resulting complexity for these sequential operations is O(n) + O(n) + O(n), and so on. +

+ +
    +
  1. Simplification: According to Big O notation rules, when you add complexities of the same order, the overall complexity is dominated by the term that grows fastest as n increases. For linear operations, O(n) + O(n) + O(n) simplifies to O(n) because the growth rate in terms of the largest input size n doesn’t change-it remains linear.
  2. +
+ + +

+Linear time complexity, denoted as O(n), means that the time required to complete the execution of an algorithm increases linearly with the increase in the size of the input data. In essence, if you double the size of the input, you double the time it takes to process it. +

+ +

+Suppose you have a task to sum the number 5, n times. The number of operations (in this case, additions) you perform directly corresponds to n. For instance: +

+ +
    +
  • If n = 1, you perform the operation 1 time: 5.
  • +
  • If n = 2, you perform the operation 2 times: 5+5.
  • +
  • If n = 3, you perform the operation 3 times: 5+5+5.
  • +
  • And so on…
  • +
+ +

+In each of these cases, the number of addition operations you perform is exactly equal to n. The computational cost grows directly with n, which is the very definition of linear time complexity. Here’s a breakdown: +

+ +
    +
  • When n = 1, the number of operations is 1.
  • +
  • When n = 10, the number of operations is 10.
  • +
  • When n = 100, the number of operations is 100.
  • +
  • When n = 1000, the number of operations is 1000.
  • +
+ +

+In general, the total time taken for this task can be described as a function T(n) = n, where T(n) represents the total time or total number of operations, and n is the number of times you need to add 5. This function is a straight line when plotted against n, hence it is classified under linear time complexity O(n). +

+ + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250804212215-how_to_solve_leetcode.html b/output/20250804212215-how_to_solve_leetcode.html new file mode 100755 index 0000000..4d5d9e7 --- /dev/null +++ b/output/20250804212215-how_to_solve_leetcode.html @@ -0,0 +1,289 @@ + + + + + + + +how-to-solve-leetcode + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

how-to-solve-leetcode

+ +
+
+

Process:

+
+
    +
  • Read the problem twice to understand it
  • + +
  • Try think basically of different ways to solve the problem
  • + +
  • Think end-to-end (e2e) of the best solutions based on complexity
  • + +
  • Write the algorithm from patterns in drawing
  • + +
  • Code it out
  • + +
  • Try and improve it once you think you’re finished
  • + +
  • Go through other solutions
  • +
+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250804212606-leetcode_arrays.html b/output/20250804212606-leetcode_arrays.html new file mode 100755 index 0000000..15ecb47 --- /dev/null +++ b/output/20250804212606-leetcode_arrays.html @@ -0,0 +1,790 @@ + + + + + + + +leetcode-arrays + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

leetcode-arrays

+ +
+
+

217 - Contains Duplicate:

+
+

+Given an integer array `nums`, return `true` if any value appears at least twice in the array, and return false if every element is distinct. +

+ +

+Example 1: +

+ +

+Input: nums = [1,2,3,1] +

+ +

+Output: true +

+ +

+Explanation: The element 1 occurs at the indices 0 and 3. +

+ +

+Example 2: +

+ +

+Input: nums = [1,2,3,4] +

+ +

+Output: false +

+ +

+Explanation: All elements are distinct. +

+ +

+Example 3: +

+ +

+Input: nums = [1,1,1,3,3,4,3,2,4,2] +

+ +

+Output: true +

+ +

+Constraints: +

+ +

+1 <= nums.length <= 105 +-109 <= nums[i] <= 109 +

+
+
+

Attempt:

+
+

+Two loops +Outer loop will go through each element, inner loop will check if the element in outer loop is repeated in the array. +

+ +
+
class Solution(object):
+  def containsDuplicate(self, nums):
+      """
+      :type nums: List[int]
+      :rtype: bool
+      """
+      for i in nums:
+          for j in nums[i:len(nums)]:
+              if i == j:
+                  return True
+      return False
+
+
+
+ +

+Works? Yes, but there is a better solution +

+
+
+
+

Solution:

+
+

+Use a python-set. The reason is it does not allow for duplicates (it is unique). The solution is as follows: +We create a set from the array, then check if the length of the two are different, if they are then this indicates that there are duplicate values in the array. This is O(N) and is faster than the nested loops solution above. +

+ +
+
+if len(set(nums)) == len(nums):
+    return False
+else:
+    return True
+
+
+
+
+
+
+
+

268 - Missing Number

+
+

+Given an array `nums` containing `n` distinct numbers in the range [0, n], return the only number in the range that is missing from the array. +

+ +

+Example 1: +Input: nums = [3,0,1] +

+ +

+Output: 2 +Explanation: n = 3 since there are 3 numbers, so all numbers are in the range [0,3]. 2 is the missing number in the range since it does not appear in nums. +

+ +

+Example 2: +Input: nums = [0,1] +

+ +

+Output: 2 +Explanation: n = 2 since there are 2 numbers, so all numbers are in the range [0,2]. 2 is the missing number in the range since it does not appear in nums. +

+ +

+Example 3: +Input: nums = [9,6,4,2,3,5,7,0,1] +

+ +

+Output: 8 +Explanation: n = 9 since there are 9 numbers, so all numbers are in the range [0,9]. 8 is the missing number in the range since it does not appear in nums. +

+ +

+Constraints: +

+ +

+n = nums.length + 1 < n <= 104 +0 <= nums[i] <= n +All the numbers of nums are unique. +

+ +

+Follow up: Could you implement a solution using only O(1) extra space complexity and O(n) runtime complexity? +

+
+
+

Attempt

+
+

+Sort the array, loop through it and check via the incrementor +

+ +
+
+class Solution(object):
+  def missingNumber(self, nums):
+      """
+      :type nums: List[int]
+      :rtype: int
+      """
+      nums.sort()
+      for i in range(0, len(nums) + 1):
+        if i not in nums:
+          return i      
+
+
+
+ +

+Problem here is that sort operation is O(nlogn) - too slow. +

+
+
+
+

Solution

+
+

+One optimised solution: +

+ +
+
class Solution(object):
+  def missingNumber(self, nums):
+      """
+      :type nums: List[int]
+      :rtype: int
+      """
+      nums.sort()
+      n = len(nums)
+      total_sum = n * (n + 1) // 2
+      actual_sum = sum(nums)
+      return total_sum - actual_sum
+
+
+ +

+Another: +

+
+
class Solution(object):
+    def missingNumber(self, nums):
+        return sum(range(len(nums) + 1)) - sum(nums)
+
+
+ +

+This is O(N) +len = O(1) +Range object creation is O(1) +sum is O(N) ++1 in range(n) because n would be excluded otherwise. ie if you did range(2) you get [0,1] +

+ +

+Some extra notes: +python-dictionary +

+
+
+
+
+

448 - Find all Numbers disappeared in an array

+
+

+Given an array `nums` of `n` integers where `nums[i]` is in the range [1, n], return an array of all the integers in the range [1, n] that do not appear in nums. +

+ +

+Example 1: +Input: nums = [4,3,2,7,8,2,3,1] +Output: [5,6] +

+ +

+Example 2: +Input: nums = [1,1] +Output: [2] +

+ +

+Constraints: +

+ +

+n = nums.length +1 < n <= 105 +1 <= nums[i] <= n +

+ +

+Follow up: Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space. +

+
+
+

Attempt

+
+

+Create a set, loop through the set (it wont have duplicate values), if the counter is not equal to the value in the set, add it to a new list. +

+ +
+
class Solution(object):
+    def findDisappearedNumbers(self, nums):
+        """
+        :type nums: List[int]
+        :rtype: List[int]
+        """
+        new_set = set(nums)
+        print(new_set)
+        new_list = []
+        for i in range(1, len(nums) + 1):
+            if i not in new_set:
+                new_list.append(i)
+        return new_list                  
+
+
+ +

+Time: O(N) as iterating through the range and appending to new list if not in given list. O(N) space. +

+
+
+
+
+

1 - Two Sum

+
+

+Given an array of integers `nums` and an integer `target`, return indices of the two numbers such that they add up to target. +

+ +

+You may assume that each input would have exactly one solution, and you may not use the same element twice. +

+ +

+You can return the answer in any order. +

+ +

+Example 1: +Input: nums = [2,7,11,15], target = 9 +Output: [0,1] +Explanation: Because nums[0] + nums[1] == 9, we return [0, 1]. +

+ +

+Example 2: +Input: nums = [3,2,4], target = 6 +Output: [1,2] +

+ +

+Example 3: +Input: nums = [3,3], target = 6 +Output: [0,1] +

+ +

+Constraints: +

+ +

+2 <= nums.length <= 104 +-109 <= nums[i] <= 109 +-109 <= target <= 109 +Only one valid answer exists. +

+ +

+Follow-up: Can you come up with an algorithm that is less than O(n2) time complexity? +

+
+
+

Attempt

+
+

+Outer loop and inner loop +

+ +
+
class Solution(object):
+  def twoSum(self, nums, target):
+      """
+      :type nums: List[int]
+      :type target: int
+      :rtype: List[int]
+      """
+      ret = []
+      for i in range(0, len(nums) ):
+        for j in range(i + 1, len(nums) ):
+          if nums[i] + nums[j] == target:
+            ret.append(nums[i])
+            ret.append(nums[j])
+      return ret
+
+
+
+ +

+Bad as its O(N2) +

+
+
+
+

Solution

+
+

+Use a hashmap and loop once +

+ +

+After looking through the logic: +

+
+
class Solution(object):
+  def twoSum(self, nums, target):
+      """
+      :type nums: List[int]
+      :type target: int
+      :rtype: List[int]
+      """
+      hm = {}
+      ret = []
+      for i in range(0, len(nums)):
+        if (target - nums[i]) not in hm:
+          hm.update({nums[i]: i})
+        else:
+          ret.append(i)
+          ret.append(hm.get(target - nums[i]))
+      return ret
+
+
+
+ + +
+

swappy-20250805-152411.png +

+
+ +

+Youtube solution: +

+
+
+hash_map = {}
+for i , v in enumerate(nums):
+    if target - v in hash_map:
+        return i, hash_map[target - v]
+    else:
+        hash_map[v] = i
+
+
+
+ +
+
+hashMap = {}
+for indx, val in enumerate(nums):
+    diff = target - val
+    if diff in hashMap:
+        return [indx, hashMap[diff]]
+    hashMap[val] = indx
+
+
+
+
+
+
+
+

1365 - How Many Numbers Are Smaller Than the Current Number

+
+

+Given the array `nums`, for each `nums[i]` find out how many numbers in the array are smaller than it. That is, for each `nums[i]` you have to count the number of valid j’s such that j != i and nums[j] < nums[i]. +

+ +

+Return the answer in an array. +

+ +

+Example 1: +

+ +

+Input: nums = [8,1,2,2,3] +Output: [4,0,1,1,3] +Explanation: +For nums[0]=8 there exist four smaller numbers than it (1, 2, 2 and 3). +For nums[1]=1 does not exist any smaller number than it. +For nums[2]=2 there exist one smaller number than it (1). +For nums[3]=2 there exist one smaller number than it (1). +For nums[4]=3 there exist three smaller numbers than it (1, 2 and 2). +

+ +

+Example 2: +

+ +

+Input: nums = [6,5,4,8] +Output: [2,1,0,3] +

+ +

+Example 3: +

+ +

+Input: nums = [7,7,7,7] +Output: [0,0,0,0] +

+ +

+Constraints: +

+ +

+2 <= nums.length <= 500 +0 <= nums[i] <= 100 +

+ +
+
def smallerNumbersThanCurrent(nums):
+"""
+:type nums: List[int]
+:rtype: List[int]
+"""
+
+temp = sorted(nums)
+d = {}
+
+for i, num in enumerate(temp):
+    if num not in d:
+        d[num] = i
+ret = []
+
+for i in nums: 
+    ret.append(d[i])
+return ret
+
+
+
+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250804214537-python_set.html b/output/20250804214537-python_set.html new file mode 100755 index 0000000..b593d9c --- /dev/null +++ b/output/20250804214537-python_set.html @@ -0,0 +1,305 @@ + + + + + + + +python-set + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

python-set

+ +
+

+Sets are used to store multiple items in a single variable. +

+ +

+Set is one of 4 built-in data types in Python used to store collections of data, the other 3 are List, Tuple, and Dictionary, all with different qualities and usage. +

+ +

+A set is a collection which is unordered, unchangeable*, and unindexed. +

+ +

+*Note: Set items are unchangeable, but you can remove items and add new items. +

+ +

+Sets are written with curly brackets. +Example: +

+ +
+
# Create a Set:
+thisset = {"apple", "banana", "cherry"}
+print(thisset) 
+
+
+ +

+Notes: +

+ +

+Sets are fast, Note that empty Set cannot be created through {}, it creates a dictionary, unless you include values. +set is implemented as a hash table, so you can expect lookup, insert, delete to be O(1) on average. +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250805141906-python_dictionary.html b/output/20250805141906-python_dictionary.html new file mode 100755 index 0000000..afedb40 --- /dev/null +++ b/output/20250805141906-python_dictionary.html @@ -0,0 +1,398 @@ + + + + + + + +python-dictionary + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

python-dictionary

+ +
+

+Dictionaries are used to store data values in key:value pairs. +

+ +

+A dictionary is a collection which is ordered*, changeable and do not allow duplicates. +

+ +

+*As of Python version 3.7, dictionaries are ordered. In Python 3.6 and earlier, dictionaries are unordered. +

+ +

+Dictionaries are written with curly brackets, and have keys and values: +

+ +
+
+# Create and print a dictionary:
+  thisdict =	{
+    "brand": "Ford",
+    "model": "Mustang",
+    "year": 1964
+  }
+  print(thisdict)
+
+
+
+ +

+Iterating: +

+ +

+Iterate through Value +

+ +

+To iterate through all values of a dictionary in Python using .values(), you can employ a for loop, accessing each value sequentially. This method allows you to process or display each individual value in the dictionary without explicitly referencing the corresponding keys. +

+ +

+Example: In this example, we are using the values() method to print all the values present in the dictionary. +

+ +
+
+# create a python dictionary 
+d = {"name": "Geeks", "topic": "dict", "task": "iterate"}
+
+# loop over dict values
+for val in d.values():
+    print(val)
+
+
+ +

+Iterate through keys +

+ +

+In Python, just looping through the dictionary provides you its keys. You can also iterate keys of a dictionary using built-in `.keys()` method. +

+ +
+
+# create a python dictionary 
+d = {"name": "Geeks", "topic": "dict", "task": "iterate"}
+
+# default loooping gives keys
+for keys in d:
+        print(keys)
+
+# looping through keys    
+for keys in d.keys():
+        print(keys)
+
+
+
+ +

+Iterate through both keys and values +

+ +

+You can use the built-in items() method to access both keys and items at the same time. items() method returns the view object that contains the key-value pair as tuples. +

+ +
+
+# create a python dictionary 
+d = {"name": "Geeks", "topic": "dict", "task": "iterate"}
+
+# iterating both key and values
+for key, value in d.items():
+    print(f"{key}: {value}")
+
+
+
+ +

+Sorting: +

+ +

+Lambda function accesses the key (item[0]) during sorting. It offers flexibility if you want to tweak the sorting logic later. +

+ +
+
import operator
+
+a = {"Gfg": 5, "is": 7, "Best": 2, "for": 9, "geeks": 8}
+res = dict(sorted(a.items(), key=lambda item: item[0]))
+print(res)
+
+
+
+ +

+Explanation: `lambda item: item[0]` sorts the dictionary by the first element of each tuple (the key). +

+ +

+python-sorted-function +

+ +

+python-lambda +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250805143427-python_sorted_function.html b/output/20250805143427-python_sorted_function.html new file mode 100755 index 0000000..2fb26e8 --- /dev/null +++ b/output/20250805143427-python_sorted_function.html @@ -0,0 +1,316 @@ + + + + + + + +python-sorted-function + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

python-sorted-function

+ +
+

+Syntax +

+ +

+sorted(iterable, key=key, reverse=reverse) +

+ +

+Parameter Values +

+ + + + + + + + + + + + + + + + + + + +
+  Parameter  + +  Description                                                                                  +
+  iterable   + +  Required. The sequence to sort, list, dictionary, tuple etc.                                 +
+  key        + +  Optional. A Function to execute to decide the order. Default is None                         +
+  reverse    + +  Optional. A Boolean. False will sort ascending, True will sort descending. Default is False  +
+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250805143741-python_lambda.html b/output/20250805143741-python_lambda.html new file mode 100755 index 0000000..9abc063 --- /dev/null +++ b/output/20250805143741-python_lambda.html @@ -0,0 +1,305 @@ + + + + + + + +python-lambda + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

python-lambda

+ +
+

+A lambda function is a small anonymous function. +

+ +

+A lambda function can take any number of arguments, but can only have one expression. +

+ +

+Syntax: +

+ +

+lambda arguments : expression +

+ +

+The expression is executed and the result is returned: +

+ +
+
+# Add 10 to argument a, and return the result:
+x = lambda a : a + 10
+print(x(5))
+
+# Multiply argument a with argument b and return the result:
+y = lambda a, b : a * b
+print(y(5, 6)) 
+
+# Summarize argument a, b, and c and return the result:
+z = lambda a, b, c : a + b + c
+print(z(5, 6, 2)) 
+
+
+
+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250806111925-non_technical_moc.html b/output/20250806111925-non_technical_moc.html new file mode 100755 index 0000000..2c01838 --- /dev/null +++ b/output/20250806111925-non_technical_moc.html @@ -0,0 +1,273 @@ + + + + + + + +non_technical_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

nontechnicalmoc

+ +
+

+recipes-moc +books-moc +

+ + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250806155335-emacs_stuff_org_publish.html b/output/20250806155335-emacs_stuff_org_publish.html new file mode 100755 index 0000000..0e5c305 --- /dev/null +++ b/output/20250806155335-emacs_stuff_org_publish.html @@ -0,0 +1,617 @@ + + + + + + + +emacs-stuff-org-publish + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

emacs-stuff-org-publish

+ +
+
+

How to insert footnotes:

+
+

+The Org website1 now looks a lot better than it used to. +

+
+
+ +
+

Extra snippets of code:

+
+
+
  ;; Commented out things:
+
+;; (defvar z-head
+;;   "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://gongzhitaao.org/orgcss/org.css\" />
+;; <link rel=\"stylesheet\" href=\"/style.css\" />")
+
+;; (setq org-html-validation-link nil
+;;       org-html-head-include-scripts nil
+;;       org-html-head-include-default-style nil
+;;       org-html-head z-head)
+
+;; (type-of (car '(rose violet daisy buttercup)))
+;; (cadr (assoc "FILETAGS" (org-collect-keywords '("FILETAGS"))))
+
+;; (let ((list '(("post1.org") ("post2.org"))))
+;;   (mapconcat (lambda (entry)
+;;                (format "- [[file:%s]]" (car entry)))
+;;              list
+;;              "\n"))
+
+
+        ;; ("website"
+        ;;  :components ("org-main" "org-categories-sitemap" "org-assets" "org-posts" "org-blogs" "org-static"))
+;; 	 :html-head "
+;; <link rel=\"stylesheet\" type=\"text/css\" href=\"https://gongzhitaao.org/orgcss/org.css\" />
+;; <link rel=\"stylesheet\" href=\"../style.css\" />
+;; <script src=\"../script.js\" defer></script>
+;; "
+
+
+(defun z/write-tag-pages ()
+"Generate tags/*.org pages listing posts for each tag."
+(let* ((site-root (expand-file-name "~/master-folder/org_files/org_web/"))
+       (tags-dir  (expand-file-name "tags" site-root)))
+  (unless (file-directory-p tags-dir)
+    (make-directory tags-dir t))
+  (let ((idx (z/gather-tag-index)))
+    (maphash
+     (lambda (tag items)
+       (let* ((slug (z/tag-slug tag))
+              (outfile (expand-file-name (format "%s.org" slug) tags-dir)))
+         (with-temp-file outfile
+           (insert (format "#+TITLE: Tag: %s\n#+OPTIONS: toc:nil num:nil title:nil \n\n* Posts tagged %s\n"
+                           tag tag))
+           ;; sort newest first if DATE present
+           (setq items (sort items (lambda (a b) (string> (nth 2 a) (nth 2 b)))))
+           (dolist (it items)
+             (let* ((file (nth 0 it))
+                    (title (nth 1 it))
+                    (rel   (file-relative-name file tags-dir)))
+               ;; link to the source .org; org-publish will rewrite to the .html
+               (insert (format "- [[file:%s][%s]]\n" rel title)))))))
+     idx)
+    ;; Also write an index page listing all tag pages 
+    ;; (let* ((all ()))
+    ;;   (maphash (lambda (tag _items) (push tag all)) (z/gather-tag-index))
+    ;;   (with-temp-file (expand-file-name "index.org" (expand-file-name "tags" site-root))
+    ;;     (insert "#+TITLE: All Tags\n#+OPTIONS: toc:nil num:nil\n\n* Tags\n")
+    ;;     (dolist (tag (sort all #'string-lessp))
+    ;;       (insert (format "- [[file:%s.org][%s]]\n" (z/tag-slug tag) tag)))))
+
+    )))
+
+
+
+
+
+
+
+

Options stuff:

+
+

+In Org mode, you can control per-file publishing behavior using special keywords (known as file-local metadata) at the top of the file. These are written like: +

+ +

+```org +

+

+``` +

+ +

+— +

+ +

+Here are useful options you can set per file: +

+ + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeywordPurpose
-------------------------------------------------------------------------
`#+TITLE:`Title of the document
`#+AUTHOR:`Author name
`#+EMAIL:`Email address
`#+DATE:`Date
`#+OPTIONS:`Control export behavior (e.g. toc, num, author, etc.)
`#+HTMLHEAD:`Custom HTML for `<head>` (like styles or scripts)
`#+HTMLHEADEXTRA:`Extra HTML inserted in `<head>`
`#+HTMLPREAMBLE:`Whether to include the preamble (`t`, `nil`, or HTML)
`#+HTMLPOSTAMBLE:`Same but for postamble
`#+LANGUAGE:`Language used for export
`#+DESCRIPTION:`Adds a `<meta name=“description”>` tag
`#+KEYWORDS:`Adds a `<meta name=“keywords”>` tag
+ +

+— +

+ +

+### ✅ Example: Disable TOC and Section Numbers for one file +

+ +

+You can use the `#+OPTIONS:` line like so: +

+ +

+```org +

+

+``` +

+ +

+This disables the Table of Contents and section numbers just for that file. +

+ +

+Your updated file might look like this: +

+ +
+
#+TITLE: Welcome to My Org Website
+#+OPTIONS: toc:nil num:nil
+#+HTML_HEAD: <link rel="stylesheet" href="style.css">
+#+HTML_HEAD: <script src="theme-toggle.js" defer></script>
+
+
+ +

+Here’s a reference for some values you can tweak via `#+OPTIONS:`: +

+ + + + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionMeaningExample
-------------------------------------------------------------
`toc:`Table of contents (`t` or `nil`)`toc:nil`
`num:`Section numbering`num:nil`
`author:`Show author name`author:nil`
`creator:`Show Emacs/Org creator info`creator:nil`
`date:`Show date`date:nil`
`html-style:`Disable default style`html-style:nil`
+ + + + + +
+
+
+

Footnotes:

+
+ +
1

+The link is: https://orgmode.org +

+ + +
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250819174119-naqshe_hayat.html b/output/20250819174119-naqshe_hayat.html new file mode 100755 index 0000000..428f2e9 --- /dev/null +++ b/output/20250819174119-naqshe_hayat.html @@ -0,0 +1,268 @@ + + + + + + + +naqshe-hayat + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

naqshe-hayat

+ +
+ + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250918120519-misc_moc.html b/output/20250918120519-misc_moc.html new file mode 100755 index 0000000..f3f7d03 --- /dev/null +++ b/output/20250918120519-misc_moc.html @@ -0,0 +1,277 @@ + + + + + + + +misc_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

miscmoc

+ +
+ + +
+

workflow-moc

+
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250918120706-wedding_moc.html b/output/20250918120706-wedding_moc.html new file mode 100755 index 0000000..0ce2bf4 --- /dev/null +++ b/output/20250918120706-wedding_moc.html @@ -0,0 +1,416 @@ + + + + + + + +wedding_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

weddingmoc

+ +
+ +
+

Walimah Venues

+
+
+
+

Requirements

+
+
    +
  • 250 to 350 people
  • +
  • Segregated
  • +
  • External / Internal Catering (halal)
  • +
  • Timing (Saturday evening)
  • +
  • Prayer Facility
  • +
  • Early July (or similar)
  • +
  • Deposit
  • +
+
+
+
+

Hadley Hall

+
+
+
+

Details

+
+

+Bearwood Road, Birmingham, United Kingdom B66 4ES +

+ +

+https://www.instagram.com/hadley.hall/?hl=en +https://www.facebook.com/p/Hadley-Hall-Banqueting-Suite-100063467019018/?locale=en_GB +

+ +

+Contact Details: +

+
    +
  • 0121 601 0955
  • +
  • 07522257044 (insta)
  • +
+ +

+Distance: 18 Minutes Drive / 51 Minutes Bus +

+ +

+2 Suites. One is 200 people, the other is 450 people +Segregated Yes with 300 people +Catering is £10ph +Timing is 6-11pm (and morning too). +Prayer facility included. +Early July is good time +Deposit £500 +

+ +

+Roughly £6500 (3k food, 3.5k everything else) +

+ +

+<2025-09-28 Sun> : Went to view the hall, 2 halls are given for the price of 3.5k. +

+
+
+
+
+

Bab al Hara

+
+
+
+

Details

+
+

+500 people segregated suite. one large hall. instagram has all details. 9.5k with catering, 6.2k without for 300 people. +

+ +

+<2025-09-30 Tue> : Went to view +

+
+
+
+
+

Mayfair suite

+
+

+9.3k with food +6k without food +<2025-10-01 Wed>: Went to view +

+
+
+
+

Bia Lounge

+
+
+
+

Details

+
+

+45-47 Golden Hillock Rd, Birmingham B10 0JU +

+ +

+http://www.bialoungeweddinghall.co.uk/ +

+ +

+Contact Details: +

+ +

+Tel: 0121 772 7576 +Mob: 07901 553 350 +

+ +

+Distance: 5 Min Drive / 27 Min Bus +

+ +

+400 people +Segregated yes +Catering (in house basic is 10-12ph) +Early July yes (some dates available) +Prayer Facility included +Deposit minimum 500 +

+ + + +
+
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20250926151524-workflow_moc.html b/output/20250926151524-workflow_moc.html new file mode 100755 index 0000000..b25cb96 --- /dev/null +++ b/output/20250926151524-workflow_moc.html @@ -0,0 +1,284 @@ + + + + + + + +workflow-moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

workflow-moc

+ +
+

+What are the use cases of the macbook and the pc: +

+
+

Macbook

+
+
+
+

+
+
+
+

PC

+
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251002154125-microlise_moc.html b/output/20251002154125-microlise_moc.html new file mode 100755 index 0000000..b13ae58 --- /dev/null +++ b/output/20251002154125-microlise_moc.html @@ -0,0 +1,273 @@ + + + + + + + +microlise_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

microlisemoc

+ +
+
+

preworkprepmicrolise

+
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251002154204-pre_work_prep_microlise.html b/output/20251002154204-pre_work_prep_microlise.html new file mode 100755 index 0000000..751a7c6 --- /dev/null +++ b/output/20251002154204-pre_work_prep_microlise.html @@ -0,0 +1,330 @@ + + + + + + + +pre_work_prep_microlise + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

preworkprepmicrolise

+ +
+ + + + +
+

Timings

+
+

+<2025-10-06 Mon>: 9:15pm arrival +

+
+
+
+

Petrol/Transport

+
+

+Taking two cars: +

+
    +
  • mine 2 days a week (friday and wednesday)
  • +
  • Bajis car on the rest of the week
  • +
+
+
+ + +
+

+
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251019114736-server_moc.html b/output/20251019114736-server_moc.html new file mode 100755 index 0000000..2db7dd1 --- /dev/null +++ b/output/20251019114736-server_moc.html @@ -0,0 +1,276 @@ + + + + + + + +server_moc + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251019114758-old_nextcloud_server_code.html b/output/20251019114758-old_nextcloud_server_code.html new file mode 100755 index 0000000..23a8583 --- /dev/null +++ b/output/20251019114758-old_nextcloud_server_code.html @@ -0,0 +1,402 @@ + + + + + + + +old_nextcloud_server_code + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

oldnextcloudservercode

+ +
+
+

wg

+
+

+Shakkal123! +

+ +

+docker run ghcr.io/wg-easy/wg-easy:14 node -e ’const bcrypt = require(“bcryptjs”); const hash = bcrypt.hashSync(“Shakkal123!”, 10); console.log(hash.replace(/\$/g, “\[\]”));’ +

+ +

+Unable to find image ’ghcr.io/wg-easy/wg-easy:14’ locally +14: Pulling from wg-easy/wg-easy +Digest: sha256:5f26407fd2ede54df76d63304ef184576a6c1bb73f934a58a11abdd852fab549 +Status: Downloaded newer image for ghcr.io/wg-easy/wg-easy:14 +

+ +

+\[2a\]10$$E1lkGe/IH5EnFrQLhDH2M.yKk3Q7KlgRuu.fzf/76CbWoAMy4G83u +

+
+
+
+

nextcloud:

+
+

+location ^~ nextcloud { + authbasic off; +

+ +

+proxypass http://localhost:8007/; +proxysetheader Host $host; +proxysetheader X-Real-IP $remoteaddr; +proxysetheader X-Forwarded-For $proxyaddxforwardedfor; +proxysetheader X-Forwarded-Proto $scheme; +

+ +

+proxyhttpversion 1.1; +proxysetheader Upgrade $httpupgrade; +proxysetheader Connection “upgrade”; +

+ +

+clientmaxbodysize 512M; +clientbodybuffersize 512k; +

+ +

+ addheader Referrer-Policy “no-referrer” always; + addheader X-Content-Type-Options “nosniff” always; + addheader X-Frame-Options “SAMEORIGIN” always; + addheader X-XSS-Protection “1; mode=block” always; +} +

+ + +

+location ^~ /.well-known/carddav { + return 301 $scheme://$host/nextcloud/remote.php/dav; +} +

+ +

+location ^~ /.well-known/caldav { + return 301 $scheme://$host/nextcloud/remote.php/dav; +} +

+ +

+location ^~ /.well-known { + return 301 $scheme://$host/nextcloud/index.php$uri; +} +

+
+
+
+

technitium

+
+

+location technitium { + proxypass http://localhost:5380/; + proxyhttpversion 1.1; + proxysetheader Host $host; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Forwarded-Proto $scheme; +

+ +

+ rewrite ^/technitium/(.*)$ /$1 break; +} +

+ +

+curl -X GET “https://zserver.zapto.org/portainer/api/endpoints/3/docker/containers/json?all=true” -H “X-API-Key: ptrKFQqKse9K4Nc9M5jnpc61fpAvGzdTOXTzswz9CwOF74=” -u “admin:shakkal123” +

+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251101123637-backlog.html b/output/20251101123637-backlog.html new file mode 100755 index 0000000..64f5899 --- /dev/null +++ b/output/20251101123637-backlog.html @@ -0,0 +1,277 @@ + + + + + + + +Backlog + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251109205925-old_nginx_code.html b/output/20251109205925-old_nginx_code.html new file mode 100755 index 0000000..ddab8ca --- /dev/null +++ b/output/20251109205925-old_nginx_code.html @@ -0,0 +1,590 @@ + + + + + + + +old_nginx_code + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

oldnginxcode

+ +
+

+-> % cat /etc/nginx/sites-available/zserver +

+ + +

+server { + servername zainezq.com; +

+ +

+accesslog /var/log/nginx/zserver.access.log combined; +errorlog /var/log/nginx/zserver.error.log warn; +

+ +

+authbasic “Restricted Access”; +authbasicuserfile etc/nginx.htpasswd; +

+ +

+location / { + proxysetheader Host $host; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Forwarded-Proto $scheme; + proxyredirect off; +

+ +

+ root home/zaine/master-folder/orgfiles/orgweb/output; + index index.html index.htm; + tryfiles $uri $uri =404; +} +

+ +

+location /nginxstatus { + stubstatus; + } +

+ +

+location dockge { + proxypass http://127.0.0.1:5021/; + proxysetheader Host $host; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Forwarded-Proto $scheme; +} +

+ + + +

+location guac { + proxypass http://127.0.0.1:3003/guacamole/; + proxyhttpversion 1.1; +

+ +

+proxysetheader Host $host; +proxysetheader X-Real-IP $remoteaddr; +proxysetheader X-Forwarded-For $proxyaddxforwardedfor; +proxysetheader X-Forwarded-Proto $scheme; +

+ +

+ proxysetheader Upgrade $httpupgrade; + proxysetheader Connection $connectionupgrade; +} +

+ +

+location pgadmin4 { + proxysetheader X-Script-Name /pgadmin4; + proxysetheader Host $host; + proxypass http://127.0.0.1:5050; + proxyredirect off; +} +

+ +

+location pdf { + proxypass http://127.0.0.1:8002/pdf/; + proxysetheader X-Script-Name /pdf; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader Host $host; + proxyredirect off; +} +

+ +

+location /calibre { + proxybind $serveraddr; + proxypass http://127.0.0.1:8083; + proxysetheader Host $httphost; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Scheme $scheme; + proxysetheader X-Script-Name /calibre; # IMPORTANT: path has NO trailing slash +

+ +

+ proxyredirect off; + proxyhttpversion 1.1; + clientmaxbodysize 100M; +} +

+ + +

+location codeserver { + proxypass http://localhost:8441/; + rewrite ^/codeserver(/.*)$ $1 break; +

+ +

+ proxysetheader Host $host; + proxysetheader Upgrade $httpupgrade; + proxysetheader Connection “upgrade”; + proxysetheader Accept-Encoding gzip; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Forwarded-Proto $scheme; +} +

+ +

+location /filebrowser { +

+ +

+proxybuffers 8 32k; +proxybuffersize 64k; +

+ +

+clientmaxbodysize 75M; +

+ +

+proxypass http://127.0.0.1:9991; +proxysetheader X-Real-IP $remoteaddr; +proxysetheader Host $httphost; +proxysetheader X-Forwarded-For $proxyaddxforwardedfor; +#proxysetheader X-NginX-Proxy true; +

+ +

+proxyhttpversion 1.1; +proxysetheader Upgrade $httpupgrade; +proxysetheader Connection “upgrade”; +

+ +

+ proxyreadtimeout 999999999; +} +

+ + +

+location miniflux { + proxysetheader Host $host; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Forwarded-Proto $scheme; + proxypass http://127.0.0.1:9433/miniflux/; + proxyredirect off; +} +

+ +

+location jupyter { + proxysetheader Host $host; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Forwarded-Proto $scheme; + proxypass http://127.0.0.1:8888/jupyter/; + proxyredirect off; +

+ +

+ proxyhttpversion 1.1; + proxysetheader Upgrade $httpupgrade; + proxysetheader Connection “Upgrade”; +} +

+ +

+location portainer { + proxypass https://localhost:9443/; + proxysslverify off; # Because Portainer uses a self-signed cert by default + proxysetheader Host $host; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Forwarded-Proto $scheme; + proxysetheader Authorization “”; +

+ +

+proxyhttpversion 1.1; +proxysetheader Upgrade $httpupgrade; +proxysetheader Connection “upgrade”; +

+ +

+ rewrite ^/portainer(/.*)$ $1 break; +} +

+ +

+location wireguard { + proxypass http://127.0.0.1:124/; + proxyhttpversion 1.1; + proxysetheader Upgrade $httpupgrade; + proxysetheader Connection “Upgrade”; + proxysetheader Host $host; + proxysetheader X-Real-IP $remoteaddr; + proxysetheader X-Forwarded-For $proxyaddxforwardedfor; + proxysetheader X-Forwarded-Proto $scheme; +

+ +

+ proxysetheader Accept-Encoding “”; + subfilter ’href=“’ ’href="/wireguard’; + subfilter ’src=”’ ’src="/wireguard’; + subfiltertypes text/css application/javascript; + subfilteronce off; +} +

+ +

+location = password { return 301 /password; } +

+ +

+location ^~ password { + authbasic off; +

+ +

+proxyhttpversion 1.1; +proxysetheader Host $host; +proxysetheader X-Real-IP $remoteaddr; +proxysetheader X-Forwarded-For $proxyaddxforwardedfor; +proxysetheader X-Forwarded-Proto $scheme; +

+ +

+proxysetheader Upgrade $httpupgrade; +proxysetheader Connection “upgrade”; +

+ +

+ proxypass http://127.0.0.1:8006; +} +

+ +

+location ^~ /password/notifications/hub { + authbasic off; +

+ +

+proxyhttpversion 1.1; +proxysetheader Upgrade $httpupgrade; +proxysetheader Connection “upgrade”; +proxysetheader Host $host; +

+ +

+ proxypass http://127.0.0.1:8006; +} +

+ + +

+errorpage 500 502 503 504 /50x.html; +location = /50x.html { + root /usr/share/nginx/html; +} +

+ +

+location ~ /\. { + deny all; +} +

+ +

+listen 443 ssl; # managed by Certbot +sslcertificate /etc/letsencrypt/live/zainezq.com-0001/fullchain.pem; # managed by Certbot +sslcertificatekey /etc/letsencrypt/live/zainezq.com-0001/privkey.pem; # managed by Certbot +include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot +ssldhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot +

+ + + + + +

+} +

+ + +

+server { + if ($host = zserver.zapto.org) { + return 301 https://$host$request_uri; + } # managed by Certbot +

+ +

+ listen 80; + servername zserver.zapto.org; + return 404; # managed by Certbot +} +

+ + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251122223053-keyboard.html b/output/20251122223053-keyboard.html new file mode 100755 index 0000000..5dfe859 --- /dev/null +++ b/output/20251122223053-keyboard.html @@ -0,0 +1,541 @@ + + + + + + + +keyboard + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

keyboard

+ +
+
+

Keyboard inputs

+
+

+This all comes from the fact that a “key press” isn’t one thing — it’s +a stack of specs and translations from keyboard hardware → USB/HID → +Linux kernel → userspace (XKB/Wayland) → Hyprland binds. +

+
+
+

1. Big picture: what happens when you press a key?

+
+

+When you hit a key (like your “lock” key), roughly this happens: +

+ +
+
Physical switch on keyboard
+        ↓
+Keyboard firmware → USB HID "usage" (e.g. 0x07:0xE3 = Left GUI)
+        ↓
+Linux kernel input subsystem (evdev) → KEY_LEFTMETA (code 125)
+        ↓
+libinput / xkbcommon → keysyms (like Super_L, L, etc.)
+        ↓
+Hyprland → your `bind = SUPER, L, exec, ...`
+
+
+ +

+The “topic” we’ve been poking at is basically understanding each layer +in that stack. +

+ +
+
+
+
+

2. USB HID: where 700e3 comes from

+
+

+Modern USB keyboards follow the USB HID (Human Interface Device) +specification. This spec defines Usage Tables: numerical codes for +things like keys, buttons, axes, etc. +

+ +
    +
  • The keyboard page is Usage Page 0x07 (Keyboard/Keypad).
  • + +
  • In your evtest output, MSC_SCAN value 700e3 means: + +
      +
    • 0x07 (Keyboard page)
    • +
    • 0xE3 (Left GUI / “Windows/Super” key)
    • +
  • +
+ +

+You can see the official tables here (PDF): +

+ + + +

+If you scroll to the Keyboard/Keypad Page (0x07) section, it lists all +the key usages: A, B, C, modifiers, function keys, etc. There’s also a +standalone Keyboard/Keypad-page extract people mirror, like this PDF +snippet: +(d1.amobbs.com) +

+ +

+So: +

+ +
    +
  • 700e3 = Page 0x07, Usage 0xE3Keyboard Left GUI
  • +
  • 7000f = Page 0x07, Usage 0x0FKeyboard L key
  • +
+ +

+That’s how we knew your lock key was sending Super + L. +

+ +
+
+
+
+

3. Linux input subsystem: EV_MSC, EV_KEY, KEY_LEFTMETA

+
+

+Linux has a dedicated input subsystem in the kernel (drivers/input, +drivers/hid etc.) that takes those HID usages and turns them into a +unified stream of input events. +(Linux +Kernel Documentation) +

+ +

+Key ideas: +

+ +
    +
  • Devices expose /dev/input/eventX nodes.
  • + +
  • Each event is a struct with: + +
      +
    • type (e.g. EV_KEY, EV_MSC, EV_REL, EV_SYN)
    • +
    • code (e.g. KEY_L, KEY_LEFTMETA)
    • +
    • value (pressed = 1, released = 0, repeat = 2)
    • +
  • +
+ +

+Docs worth bookmarking: +

+ + + +

+The keycode definitions (KEY_L, KEY_LEFTMETA, etc.) live in: +

+ + + +

+When evtest prints: +

+ +
+
type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e3
+type 1 (EV_KEY), code 125 (KEY_LEFTMETA), value 0
+
+
+ +

+that means: +

+ +
    +
  • EV_MSC / MSC_SCAN → “Here is the raw hardware scancode” (from USB +HID).
  • +
  • EV_KEY / KEY_LEFTMETA → “Linux mapped that scancode to logical key +LEFTMETA”.
  • +
+ +
+
+
+
+

4. XKB / xkbcommon: mapping to actual characters & modifiers

+
+

+Above the kernel, you’ve got an extra mapping layer that says: +

+ +
+

+For keycode N, with this layout, when Shift is held, produce this +character/symbol. +

+
+ +

+On X11 this is handled by XKB (X Keyboard Extension); on Wayland +compositors (including Hyprland) the same ideas are implemented via +xkbcommon. +

+ +

+Docs: +

+ + + +

+Hyprland, Sway, etc. all use libinput + xkbcommon under the hood to +interpret those keycodes and translate them into keysyms and modifiers. +

+ +
+
+
+
+

5. Hyprland / your config: where the bindings fit in

+
+

+Hyprland sits at the top of this stack: +

+ +
    +
  • It listens to the input events (via libinput).
  • +
  • It sees keysyms/modifiers (e.g. Super, L).
  • +
  • It matches them against your config:
  • +
+ +
+
bind = SUPER, L, exec, hyprlock
+
+
+ +

+So your keyboard’s “lock” key: +

+ +
    +
  1. Firmware sends HID usages 0xE3 (Left GUI) and 0x0F (L).
  2. +
  3. Linux maps them to KEY_LEFTMETA (125) and KEY_L (38).
  4. +
  5. xkbcommon maps that to Super + L.
  6. +
  7. Hyprland says: “Ah, SUPER+L → run hyprlock”.
  8. +
+ +

+The “topic” you stumbled into is just peeling back each abstraction +layer. +

+ +
+
+
+
+

6. Handy tools & libraries if you want to go deeper

+
+ + + + + +
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251214210526-useful_c_imports.html b/output/20251214210526-useful_c_imports.html new file mode 100755 index 0000000..f6c4ad7 --- /dev/null +++ b/output/20251214210526-useful_c_imports.html @@ -0,0 +1,272 @@ + + + + + + + +useful-c-imports + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

useful-c-imports

+ +
+ + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251223215636-design_patterns_notes.html b/output/20251223215636-design_patterns_notes.html new file mode 100755 index 0000000..ff5ba6b --- /dev/null +++ b/output/20251223215636-design_patterns_notes.html @@ -0,0 +1,407 @@ + + + + + + + +Design patterns + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

Design patterns

+ +
+
+

Design patterns. What are they?

+
+

+They are reusable solutions to common problems in software design. They help to make code more flexible, maintainable, and scalable. +

+ +

+Patterns allow you to say more with less. When you use a pattern in a description, other developers quickly know precisely the design you have in mind. +

+
+
+

OO concepts:

+
+
+
+

Abstraction:

+
+

+Focuses on essential features while hiding unnecessary internal details, allowing developers to work with high‑level concepts instead of implementation complexity. +

+ +

+Example: A Car class exposes start() and stop() methods without revealing how the engine ignition system works. +

+
+
+
+

Inheritance:

+
+

+Enables one class to derive properties and behaviours from another, promoting code reuse and creating natural parent–child hierarchies. +

+ +

+Example: A Dog class inherits from an Animal class, automatically gaining attributes like age and methods like eat(). +

+
+
+
+

Encapsulation:

+
+

+Protects an object’s internal state by restricting direct access to its data and exposing controlled interfaces for interaction. +

+ +

+Example: A BankAccount class keeps its balance private and provides deposit() and withdraw() methods to modify it safely. +

+
+
+
+

Polymorphism:

+
+

+Allows different objects to respond to the same interface or method call in their own unique ways, enabling flexible and extensible system design. +

+ +

+Example: Calling makeSound() on an Animal reference triggers bark() for a Dog and meow() for a Cat. +

+
+
+
+
+

OO principles:

+
+
    +
  • Encapsulate what varies
  • + +
  • Favor composition over inheritance
  • + +
  • Program to interfaces, not implementations
  • + +
  • Strive for loosely coupled designs between objects that interact
  • +
+
+
+
+

OO Patterns

+
+

+You have: +

+
    +
  • behavioural patterns
  • +
  • creational patterns
  • +
  • structural patterns
  • +
+
+
+

Behavioural patterns

+
+
+
    +
  • Structural:
    +
    +

    +The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. +

    +
    +
  • +
  • Observer:
    +
    +

    +The Observer Pattern defines a one-to-many dependency between objects so that when +one object changes state, all of its dependents are notified and updated automatically. +

    + +

    +Subjects, or as we also know them, Observables, update Observers using a common +interface +

    + +

    +Observers are loosely coupled in that the Observable knows nothing about them, +other than that they implement the Observer interface. +

    + +

    +You can push or pull data from the Observable when using the pattern (pull is +considered more “correct”). +

    + +

    +Don’t depend on a specific order of notification for your Observers. +

    + +

    +Java has several implementations of the Observer Pattern, including the general +purpose java.util.Observable +

    + + + +
    +
  • +
+
+
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/20251223220531-technical_commonplace.html b/output/20251223220531-technical_commonplace.html new file mode 100755 index 0000000..4176e66 --- /dev/null +++ b/output/20251223220531-technical_commonplace.html @@ -0,0 +1,295 @@ + + + + + + + +technical-commonplace + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

technical-commonplace

+ +
+
+

MVP and MVT

+
+
    +
  • An MVP is a minimal functional product built to validate what customers actually want by observing real usage.
  • +
  • An MVT (often called Minimum Viable Experiment/Test) is a small, fast, low‑cost test designed to validate a specific assumption before you build anything substantial.
  • +
+ +

+Minimum Viable Product (MVP) +A simplified but working version of a product that early users can interact with. +Purpose: validate product‑market fit and gather real behavioural feedback. +

+ +

+Minimum Viable Test (MVT / MVE) +A quick experiment to validate a single assumption — often before building an MVP. +Examples: landing page, survey, fake‑door button, email test. +

+ +
    +
  • MVT = “Should we even build this?”
  • +
  • MVP = “We think this is worth building — now let’s test the simplest working version.”
  • +
+ + + +
+
+
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/all-files.html b/output/all-files.html new file mode 100755 index 0000000..9310d56 --- /dev/null +++ b/output/all-files.html @@ -0,0 +1,503 @@ + + + + + + + +All Files + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

All Files

+ +
+

+A complete alphabetical index of all published pages. +

+ + + + + +
+

F

+ +
+ + + + +
+

K

+
+ +
+
+ + + + + + + + + + +
+
+
+
+ +
+Created with Emacs 30.2 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/assets/Big-O-Notation-3130482830.png b/output/assets/Big-O-Notation-3130482830.png new file mode 100755 index 0000000..eaa37ad Binary files /dev/null and b/output/assets/Big-O-Notation-3130482830.png differ diff --git a/output/assets/Screenshot_20251227_153037.png b/output/assets/Screenshot_20251227_153037.png new file mode 100755 index 0000000..6c8d9d7 Binary files /dev/null and b/output/assets/Screenshot_20251227_153037.png differ diff --git a/output/assets/gr.png b/output/assets/gr.png new file mode 100755 index 0000000..c8314b3 Binary files /dev/null and b/output/assets/gr.png differ diff --git a/output/assets/scripts/bigger-picture.min.js b/output/assets/scripts/bigger-picture.min.js new file mode 100755 index 0000000..93bcaa7 --- /dev/null +++ b/output/assets/scripts/bigger-picture.min.js @@ -0,0 +1 @@ +var BiggerPicture=function(){function t(){}const n=t=>t;function e(t,n){for(const e in n)t[e]=n[e];return t}function o(t){return t()}function r(t){t.forEach(o)}function i(t){return"function"==typeof t}function c(t,n){return t!=t?n==n:t!==n}function s(n,e,o){n.u.t.push(((n,...e)=>{if(null==n)return t;const o=n.subscribe(...e);return o.unsubscribe?()=>o.unsubscribe():o})(e,o))}function u(n){return n&&i(n.destroy)?n.destroy:t}let l=()=>globalThis.performance.now(),a=t=>requestAnimationFrame(t);const p=new Set;function f(t){p.forEach((n=>{n.c(t)||(p.delete(n),n.f())})),0!==p.size&&a(f)}function d(t){let n;return 0===p.size&&a(f),{promise:new Promise((e=>{p.add(n={c:t,f:e})})),abort(){p.delete(n)}}}function m(t,n){t.appendChild(n)}function b(t,n,e){t.insertBefore(n,e||null)}function h(t){t.parentNode.removeChild(t)}function g(t){return document.createElement(t)}function x(){return document.createTextNode("")}function v(t,n,e,o){return t.addEventListener(n,e,o),()=>t.removeEventListener(n,e,o)}function w(t,n,e){null==e?t.removeAttribute(n):t.getAttribute(n)!==e&&t.setAttribute(n,e)}function y(t,n,e,o){null===e?t.style.removeProperty(n):t.style.setProperty(n,e)}function $(t,n,e){t.classList[e?"add":"remove"](n)}let k,_,M=0,S={};function z(t,n,e,o,r,i,c,s=0){const u=16.666/o;let l="{\n";for(let t=0;1>=t;t+=u){const o=n+(e-n)*i(t);l+=100*t+`%{${c(o,1-o)}}\n`}const a=l+`100% {${c(e,1-e)}}\n}`,p=`_bp_${Math.round(1e9*Math.random())}_${s}`;if(!S[p]){if(!k){const t=g("style");document.head.appendChild(t),k=t.sheet}S[p]=1,k.insertRule(`@keyframes ${p} ${a}`,k.cssRules.length)}const f=t.style.animation||"";return t.style.animation=`${f?f+", ":""}${p} ${o}ms linear ${r}ms 1 both`,M+=1,p}function I(t,n){t.style.animation=(t.style.animation||"").split(", ").filter(n?t=>0>t.indexOf(n):t=>-1===t.indexOf("_bp")).join(", "),n&&!--M&&a((()=>{if(M)return;let t=k.cssRules.length;for(;t--;)k.deleteRule(t);S={}}))}function P(t){_=t}const T=[],A=[],N=[],O=[],C=Promise.resolve();let E=0;function R(t){N.push(t)}const j=new Set;let q,F=0;function J(){const t=_;do{for(;T.length>F;){const t=T[F];F++,P(t),B(t.u)}for(P(null),T.length=0,F=0;A.length;)A.pop()();for(let t=0;N.length>t;t+=1){const n=N[t];j.has(n)||(j.add(n),n())}N.length=0}while(T.length);for(;O.length;)O.pop()();E=0,j.clear(),P(t)}function B(t){if(null!==t.l){t.update(),r(t.g);const n=t.v;t.v=[-1],t.l&&t.l.p(t.$,n),t.k.forEach(R)}}function D(){return q||(q=Promise.resolve(),q.then((()=>{q=null}))),q}function K(t,n,e){t.dispatchEvent(((t,n,e=0)=>{const o=document.createEvent("CustomEvent");return o.initCustomEvent(t,e,0,n),o})(`${n?"intro":"outro"}${e}`))}const L=new Set;let W;function X(){W={r:0,c:[],p:W}}function Y(){W.r||r(W.c),W=W.p}function G(t,n){t&&t.i&&(L.delete(t),t.i(n))}function H(t,n,e,o){if(t&&t.o){if(L.has(t))return;L.add(t),W.c.push((()=>{L.delete(t),o&&(e&&t.d(1),o())})),t.o(n)}}const Q={duration:0};function U(e,o,r){let c,s,u=o(e,r),a=0,p=0;function f(){c&&I(e,c)}function m(){const{delay:o=0,duration:r=300,_:i=n,M:m=t,css:b}=u||Q;b&&(c=z(e,0,1,r,o,i,b,p++)),m(0,1);const h=l()+o,g=h+r;s&&s.abort(),a=1,R((()=>K(e,1,"start"))),s=d((t=>{if(a){if(t>=g)return m(1,0),K(e,1,"end"),f(),a=0;if(t>=h){const n=i((t-h)/r);m(n,1-n)}}return a}))}let b=0;return{start(){b||(b=1,I(e),i(u)?(u=u(),D().then(m)):m())},S(){b=0},end(){a&&(f(),a=0)}}}function V(e,o,c){let s,u=o(e,c),a=1;const p=W;function f(){const{delay:o=0,duration:i=300,_:c=n,M:f=t,css:m}=u||Q;m&&(s=z(e,1,0,i,o,c,m));const b=l()+o,h=b+i;R((()=>K(e,0,"start"))),d((t=>{if(a){if(t>=h)return f(0,1),K(e,0,"end"),--p.r||r(p.c),0;if(t>=b){const n=c((t-b)/i);f(1-n,n)}}return a}))}return p.r+=1,i(u)?D().then((()=>{u=u(),f()})):f(),{end(t){t&&u.M&&u.M(1,0),a&&(s&&I(e,s),a=0)}}}function Z(t){t&&t.c()}function tt(t,n,e,c){const{l:s,I:u,t:l,k:a}=t.u;s&&s.m(n,e),c||R((()=>{const n=u.map(o).filter(i);l?l.push(...n):r(n),t.u.I=[]})),a.forEach(R)}function nt(t,n){const e=t.u;null!==e.l&&(r(e.t),e.l&&e.l.d(n),e.t=e.l=null,e.$=[])}function et(n,e,o,i,c,s,u,l=[-1]){const a=_;P(n);const p=n.u={l:null,$:null,P:s,update:t,T:c,bound:{},I:[],t:[],A:[],g:[],k:[],context:new Map(e.context||(a?a.u.context:[])),N:{},v:l,O:0,root:e.target||a.u.root};u&&u(p.root);let f=0;p.$=o?o(n,e.P||{},((t,e,...o)=>{const r=o.length?o[0]:e;return p.$&&c(p.$[t],p.$[t]=r)&&(!p.O&&p.bound[t]&&p.bound[t](r),f&&((t,n)=>{-1===t.u.v[0]&&(T.push(t),E||(E=1,C.then(J)),t.u.v.fill(0)),t.u.v[n/31|0]|=1<{const t=e.indexOf(n);-1!==t&&e.splice(t,1)}}C(t){this.R&&0!==Object.keys(t).length&&(this.u.O=1,this.R(t),this.u.O=0)}}function rt(t){const n=t-1;return n*n*n+1}function it(t,{delay:n=0,duration:e=400,_:o=rt,x:r=0,y:i=0,opacity:c=0}={}){const s=getComputedStyle(t),u=+s.opacity,l="none"===s.transform?"":s.transform,a=u*(1-c);return{delay:n,duration:e,_:o,css(t,n){return`\n\t\t\ttransform: ${l} translate(${(1-t)*r}px, ${(1-t)*i}px);\n\t\t\topacity: ${u-a*n}`}}}const ct=[];function st(n,e=t){let o;const r=new Set;function i(t){if(c(n,t)&&(n=t,o)){const t=!ct.length;for(const t of r)t[1](),ct.push(t,n);if(t){for(let t=0;ct.length>t;t+=2)ct[t][0](ct[t+1]);ct.length=0}}}return{set:i,update(t){i(t(n))},subscribe(c,s=t){const u=[c,s];return r.add(u),1===r.size&&(o=e(i)||t),c(n),()=>{r.delete(u),0===r.size&&(o(),o=null)}}}}function ut(t,n){if(t===n||t!=t)return()=>t;const e=typeof t;if(Array.isArray(t)){const e=n.map(((n,e)=>ut(t[e],n)));return t=>e.map((n=>n(t)))}if("number"===e){const e=n-t;return n=>t+n*e}}function lt(t,o={}){const r=st(t);let i,c=t;function s(s,u){if(null==t)return r.set(t=s),Promise.resolve();c=s;let a=i,p=0,{delay:f=0,duration:m=400,_:b=n,interpolate:h=ut}=e(e({},o),u);if(0===m)return a&&(a.abort(),a=null),r.set(t=c),Promise.resolve();const g=l()+f;let x;return i=d((n=>{if(g>n)return 1;p||(x=h(t,s),"function"==typeof m&&(m=m(t,s)),p=1),a&&(a.abort(),a=null);const e=n-g;return e>m?(r.set(t=s),0):(r.set(t=x(b(e/m))),1)})),i.promise}return{set:s,update(n,e){return s(n(c,t),e)},subscribe:r.subscribe}}const at=st(0),pt=globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches,ft=t=>({_:rt,duration:pt?0:t}),dt=t=>!t.thumb||`url(${t.thumb})`,mt=(t,n)=>{if(n){"string"==typeof n&&(n=JSON.parse(n));for(const e in n)t.setAttribute(e,n[e])}};function bt(t){let n,e,o;return{c(){n=g("div"),n.innerHTML='',w(n,"class","bp-load"),y(n,"background-image",dt(t[0]))},m(t,e){b(t,n,e),o=1},p(t,e){1&e&&y(n,"background-image",dt(t[0]))},i(t){o||(e&&e.end(1),o=1)},o(t){t&&(e=V(n,it,{duration:480})),o=0},d(t){t&&h(n),t&&e&&e.end()}}}function ht(n){let e,o;return{c(){e=g("div"),w(e,"class","bp-load"),y(e,"background-image",dt(n[0]))},m(t,n){b(t,e,n)},p(t,n){1&n&&y(e,"background-image",dt(t[0]))},i(t){o||R((()=>{o=U(e,it,{duration:480}),o.start()}))},o:t,d(t){t&&h(e)}}}function gt(t){let n,e,o=!t[1]&&bt(t),r=t[2]&&ht(t);return{c(){o&&o.c(),n=x(),r&&r.c(),e=x()},m(t,i){o&&o.m(t,i),b(t,n,i),r&&r.m(t,i),b(t,e,i)},p(t,[i]){t[1]?o&&(X(),H(o,1,1,(()=>{o=null})),Y()):o?(o.p(t,i),2&i&&G(o,1)):(o=bt(t),o.c(),G(o,1),o.m(n.parentNode,n)),t[2]?r?(r.p(t,i),4&i&&G(r,1)):(r=ht(t),r.c(),G(r,1),r.m(e.parentNode,e)):r&&(r.d(1),r=null)},i(t){G(o),G(r)},o(t){H(o)},d(t){o&&o.d(t),t&&h(n),r&&r.d(t),t&&h(e)}}}function xt(t,n,e){let o;s(t,at,(t=>e(2,o=t)));let{j:r}=n,{loaded:i}=n;return t.R=t=>{"j"in t&&e(0,r=t.j),"loaded"in t&&e(1,i=t.loaded)},[r,i,o]}class vt extends ot{constructor(t){super(),et(this,t,xt,gt,c,{j:0,loaded:1})}}function wt(t){let n,e,o,i,c,s;return{c(){n=g("img"),w(n,"sizes",e=t[8].sizes||t[1]+"px"),w(n,"alt",t[7].alt)},m(e,o){b(e,n,o),i=1,c||(s=[u(t[21].call(null,n)),v(n,"error",t[27])],c=1)},p(t,o){(!i||2&o[0]&&e!==(e=t[8].sizes||t[1]+"px"))&&w(n,"sizes",e)},i(t){i||(o&&o.end(1),i=1)},o(t){o=V(n,it,{}),i=0},d(t){t&&h(n),t&&o&&o.end(),c=0,r(s)}}}function yt(t){let n,e;return n=new vt({P:{j:t[7],loaded:t[2]}}),{c(){Z(n.u.l)},m(t,o){tt(n,t,o),e=1},p(t,e){const o={};4&e[0]&&(o.loaded=t[2]),n.C(o)},i(t){e||(G(n.u.l,t),e=1)},o(t){H(n.u.l,t),e=0},d(t){nt(n,t)}}}function $t(t){let n,e,o,i,c,s,l=`translate3d(${t[0][0]/-2+t[6][0]}px, ${t[0][1]/-2+t[6][1]}px, 0)`,a=t[2]&&wt(t),p=t[3]&&yt(t);return{c(){n=g("div"),e=g("div"),a&&a.c(),o=x(),p&&p.c(),w(e,"class","bp-img"),y(e,"width",t[0][0]+"px"),y(e,"height",t[0][1]+"px"),$(e,"bp-drag",t[4]),$(e,"bp-canzoom",t[11]>1&&t[12]>t[0][0]),y(e,"background-image",dt(t[7])),y(e,"transform",l),w(n,"class","bp-img-wrap"),$(n,"bp-close",t[5])},m(r,l){b(r,n,l),m(n,e),a&&a.m(e,null),m(e,o),p&&p.m(e,null),i=1,c||(s=[u(t[20].call(null,e)),v(n,"wheel",t[15]),v(n,"pointerdown",t[16]),v(n,"pointermove",t[17]),v(n,"pointerup",t[19]),v(n,"pointercancel",t[18])],c=1)},p(t,r){t[2]?a?(a.p(t,r),4&r[0]&&G(a,1)):(a=wt(t),a.c(),G(a,1),a.m(e,o)):a&&(X(),H(a,1,1,(()=>{a=null})),Y()),t[3]?p?(p.p(t,r),8&r[0]&&G(p,1)):(p=yt(t),p.c(),G(p,1),p.m(e,null)):p&&(X(),H(p,1,1,(()=>{p=null})),Y()),(!i||1&r[0])&&y(e,"width",t[0][0]+"px"),(!i||1&r[0])&&y(e,"height",t[0][1]+"px"),(!i||16&r[0])&&$(e,"bp-drag",t[4]),(!i||6145&r[0])&&$(e,"bp-canzoom",t[11]>1&&t[12]>t[0][0]),65&r[0]&&l!==(l=`translate3d(${t[0][0]/-2+t[6][0]}px, ${t[0][1]/-2+t[6][1]}px, 0)`)&&y(e,"transform",l),(!i||32&r[0])&&$(n,"bp-close",t[5])},i(t){i||(G(a),G(p),i=1)},o(t){H(a),H(p),i=0},d(t){t&&h(n),a&&a.d(),p&&p.d(),c=0,r(s)}}}function kt(t,n,e){let o,r,i,c;s(t,at,(t=>e(26,i=t)));let{P:u}=n,{q:l}=n,{j:a,F:p,J:f,next:d,zoomed:m,container:b}=u;s(t,m,(t=>e(25,o=t)));let h,g,x,v,w,y,$,k,_,M,S,z=a.maxZoom||p.maxZoom||10,I=u.B(a),P=I[0],T=0;const A=+a.width,N=[],O=new Map,C=lt(I,ft(400));s(t,C,(t=>e(0,c=t)));const E=lt([0,0],ft(400));s(t,E,(t=>e(6,r=t)));const R=([t,n],o=c)=>{const r=(o[0]-b.w)/2,i=(o[1]-b.h)/2;return 0>r?t=0:t>r?l?(t=w?r+(t-r)/10:r)>r+20&&e(4,w=f()):t=r:-r>t&&(l?-r-20>(t=w?-r-(-r-t)/10:-r)&&e(4,w=d()):t=-r),0>i?n=0:n>i?n=i:-i>n&&(n=-i),[t,n]};function j(t=z,n){if(i)return;const o=I[0]*z;let s=c[0]+c[0]*t,u=c[1]+c[1]*t;if(t>0)s>o&&(s=o,u=I[1]*z),s>A&&(s=A,u=+a.height);else if(I[0]>s)return C.set(I),E.set([0,0]);let{x:l,y:p,width:f,height:d}=v.getBoundingClientRect();const m=n?n.clientX-l-f/2:0,b=n?n.clientY-p-d/2:0;l=s/f*-m+m,p=u/d*-b+b;const h=[s,u];C.set(h).then((()=>{e(1,P=Math.round(Math.max(P,s)))})),E.set(R([r[0]+l,r[1]+p],h))}Object.defineProperty(a,"zoom",{configurable:1,get(){return o},set(t){return j(t?z:-z)}});const q=t=>O.delete(t.pointerId);return t.R=t=>{"q"in t&&e(23,l=t.q)},t.u.update=()=>{if(16777217&t.u.v[0]&&m.set(c[0]-10>I[0]),117440512&t.u.v[0]&&i&&o&&!p.intro){const t=ft(480);E.set([0,0],t),C.set(I,t),e(5,S=1)}},[c,P,h,g,w,S,r,a,p,m,b,z,A,C,E,t=>{p.inline&&!o||(t.preventDefault(),j(t.deltaY/-300,t))},t=>{2!==t.button&&(t.preventDefault(),e(4,w=1),O.set(t.pointerId,t),$=t.clientX,k=t.clientY,_=r[0],M=r[1])},t=>{if(O.size>1)return e(4,w=0),p.noPinch?.(b.el)||(t=>{const[n,e]=O.set(t.pointerId,t).values(),o=Math.hypot(n.clientX-e.clientX,n.clientY-e.clientY);x=x||{clientX:(n.clientX+e.clientX)/2,clientY:(n.clientY+e.clientY)/2},j(((T||o)-o)/-35,x),T=o})(t);if(!w)return;let n=t.clientX,r=t.clientY;y=N.push({x:n,y:r})>2,n-=$,r-=k,o||(-90>r&&e(4,w=!p.noClose&&u.close()),30>Math.abs(r)&&(n>40&&e(4,w=f()),-40>n&&e(4,w=d()))),o&&y&&!i&&E.set(R([_+n,M+r]),{duration:0})},q,function(t){if(q(t),x&&(e(4,w=T=0),x=O.size?x:null),w){if(e(4,w=0),t.target===this&&!p.noClose)return u.close();if(y){const[t,n,e]=N.slice(-3);Math.hypot(n.x-e.x,n.y-e.y)>5&&E.set(R([r[0]-5*(t.x-e.x),r[1]-5*(t.y-e.y)]))}else p.onImageClick?.(b.el,a)||j(o?-z:z,t);y=0,N.length=0}},t=>{v=t,u.D((()=>{e(24,I=u.B(a)),!p.inline&&l||(C.set(I),E.set([0,0]))})),u.K(a).then((()=>{e(2,h=1),u.L()})),setTimeout((()=>{e(3,g=!h)}),250)},t=>{mt(t,a.attr),t.srcset=a.img},u,l,I,o,i,t=>p.onError?.(b,a,t)]}class _t extends ot{constructor(t){super(),et(this,t,kt,$t,c,{P:22,q:23},null,[-1,-1])}}function Mt(t){let n,e,o,i,c,s;return o=new vt({P:{j:t[2],loaded:t[0]}}),{c(){n=g("div"),e=g("iframe"),Z(o.u.l),w(e,"allow","autoplay; fullscreen"),w(e,"title",t[2].title),w(n,"class","bp-if"),y(n,"width",t[1][0]+"px"),y(n,"height",t[1][1]+"px")},m(r,l){b(r,n,l),m(n,e),tt(o,n,null),i=1,c||(s=[u(t[3].call(null,e)),v(e,"load",t[5])],c=1)},p(t,[e]){const r={};1&e&&(r.loaded=t[0]),o.C(r),(!i||2&e)&&y(n,"width",t[1][0]+"px"),(!i||2&e)&&y(n,"height",t[1][1]+"px")},i(t){i||(G(o.u.l,t),i=1)},o(t){H(o.u.l,t),i=0},d(t){t&&h(n),nt(o),c=0,r(s)}}}function St(t,n,e){let o,r,{P:i}=n;const{j:c}=i,s=()=>e(1,r=i.B(c));return s(),i.D(s),[o,r,c,t=>{mt(t,c.attr),t.src=c.iframe},i,()=>e(0,o=1)]}class zt extends ot{constructor(t){super(),et(this,t,St,Mt,c,{P:4})}}function It(t){let n,e,o,r,i;return e=new vt({P:{j:t[2],loaded:t[0]}}),{c(){n=g("div"),Z(e.u.l),w(n,"class","bp-vid"),y(n,"width",t[1][0]+"px"),y(n,"height",t[1][1]+"px"),y(n,"background-image",dt(t[2]))},m(c,s){b(c,n,s),tt(e,n,null),o=1,r||(i=u(t[3].call(null,n)),r=1)},p(t,[r]){const i={};1&r&&(i.loaded=t[0]),e.C(i),(!o||2&r)&&y(n,"width",t[1][0]+"px"),(!o||2&r)&&y(n,"height",t[1][1]+"px")},i(t){o||(G(e.u.l,t),o=1)},o(t){H(e.u.l,t),o=0},d(t){t&&h(n),nt(e),r=0,i()}}}function Pt(t,n,e){let o,r,{P:i}=n;const{j:c,F:s,container:u}=i,l=()=>e(1,r=i.B(c));return l(),i.D(l),[o,r,c,t=>{let n;const r=(t,e)=>{Array.isArray(e)||(e=JSON.parse(e));for(const o of e){n||(n=document.createElement(o.type?.includes("audio")?"audio":"video"),mt(n,{controls:1,autoplay:1,playsinline:1,tabindex:"0"}),mt(n,c.attr));const e=document.createElement(t);mt(e,o),"source"==t&&(e.onError=t=>s.onError?.(u,c,t)),n.append(e)}};r("source",c.sources),r("track",c.tracks||[]),n.oncanplay=()=>e(0,o=1),t.append(n)},i]}class Tt extends ot{constructor(t){super(),et(this,t,Pt,It,c,{P:4})}}function At(n){let e,o,i,s,l,a,p,f,d,x=n[6].i,y=jt(n),k=n[0].length>1&&qt(n);return{c(){e=g("div"),o=g("div"),y.c(),s=g("div"),l=g("button"),k&&k.c(),w(l,"class","bp-x"),w(l,"title","Close"),w(l,"aria-label","Close"),w(s,"class","bp-controls"),w(e,"class","bp-wrap"),$(e,"bp-zoomed",n[10]),$(e,"bp-inline",n[8]),$(e,"bp-small",n[7]),$(e,"bp-noclose",n[5].noClose)},m(t,r){b(t,e,r),m(e,o),y.m(e,null),m(e,s),m(s,l),k&&k.m(s,null),p=1,f||(d=[v(l,"click",n[1]),u(n[14].call(null,e))],f=1)},p(n,o){64&o[0]&&c(x,x=n[6].i)?(X(),H(y,1,1,t),Y(),y=jt(n),y.c(),G(y,1),y.m(e,s)):y.p(n,o),n[0].length>1?k?k.p(n,o):(k=qt(n),k.c(),k.m(s,null)):k&&(k.d(1),k=null),(!p||1024&o[0])&&$(e,"bp-zoomed",n[10]),(!p||256&o[0])&&$(e,"bp-inline",n[8]),(!p||128&o[0])&&$(e,"bp-small",n[7]),(!p||32&o[0])&&$(e,"bp-noclose",n[5].noClose)},i(t){p||(i&&i.end(1),G(y),a&&a.end(1),p=1)},o(t){t&&(i=V(o,it,{duration:480})),H(y),t&&(a=V(s,it,{})),p=0},d(t){t&&h(e),t&&i&&i.end(),y.d(t),k&&k.d(),t&&a&&a.end(),f=0,r(d)}}}function Nt(n){let e,o=(n[6].html??n[6].element.outerHTML)+"";return{c(){e=g("div"),w(e,"class","bp-html")},m(t,n){b(t,e,n),e.innerHTML=o},p(t,n){64&n[0]&&o!==(o=(t[6].html??t[6].element.outerHTML)+"")&&(e.innerHTML=o)},i:t,o:t,d(t){t&&h(e)}}}function Ot(n){let e,o;return e=new zt({P:{P:n[13]()}}),{c(){Z(e.u.l)},m(t,n){tt(e,t,n),o=1},p:t,i(t){o||(G(e.u.l,t),o=1)},o(t){H(e.u.l,t),o=0},d(t){nt(e,t)}}}function Ct(n){let e,o;return e=new Tt({P:{P:n[13]()}}),{c(){Z(e.u.l)},m(t,n){tt(e,t,n),o=1},p:t,i(t){o||(G(e.u.l,t),o=1)},o(t){H(e.u.l,t),o=0},d(t){nt(e,t)}}}function Et(t){let n,e;return n=new _t({P:{P:t[13](),q:t[7]}}),{c(){Z(n.u.l)},m(t,o){tt(n,t,o),e=1},p(t,e){const o={};128&e[0]&&(o.q=t[7]),n.C(o)},i(t){e||(G(n.u.l,t),e=1)},o(t){H(n.u.l,t),e=0},d(t){nt(n,t)}}}function Rt(t){let n,e,o,r=t[6].caption+"";return{c(){n=g("div"),w(n,"class","bp-cap")},m(t,e){b(t,n,e),n.innerHTML=r,o=1},p(t,e){(!o||64&e[0])&&r!==(r=t[6].caption+"")&&(n.innerHTML=r)},i(t){o||(e&&e.end(1),o=1)},o(t){e=V(n,it,{duration:200}),o=0},d(t){t&&h(n),t&&e&&e.end()}}}function jt(t){let n,e,o,i,c,s,u,l,a;const p=[Et,Ct,Ot,Nt],f=[];function d(t,n){return t[6].img?0:t[6].sources?1:t[6].iframe?2:3}e=d(t),o=f[e]=p[e](t);let m=t[6].caption&&Rt(t);return{c(){n=g("div"),o.c(),m&&m.c(),s=x(),w(n,"class","bp-inner")},m(o,r){b(o,n,r),f[e].m(n,null),m&&m.m(o,r),b(o,s,r),u=1,l||(a=[v(n,"pointerdown",t[20]),v(n,"pointerup",t[21])],l=1)},p(t,r){let i=e;e=d(t),e===i?f[e].p(t,r):(X(),H(f[i],1,1,(()=>{f[i]=null})),Y(),o=f[e],o?o.p(t,r):(o=f[e]=p[e](t),o.c()),G(o,1),o.m(n,null)),t[6].caption?m?(m.p(t,r),64&r[0]&&G(m,1)):(m=Rt(t),m.c(),G(m,1),m.m(s.parentNode,s)):m&&(X(),H(m,1,1,(()=>{m=null})),Y())},i(e){u||(G(o),R((()=>{c&&c.end(1),i=U(n,t[12],1),i.start()})),G(m),u=1)},o(e){H(o),i&&i.S(),c=V(n,t[12],0),H(m),u=0},d(t){t&&h(n),f[e].d(),t&&c&&c.end(),m&&m.d(t),t&&h(s),l=0,r(a)}}}function qt(t){let n,e,o,i,c,s=`${t[4]+1} / ${t[0].length}`;return{c(){n=g("div"),e=g("button"),o=g("button"),w(n,"class","bp-count"),w(e,"class","bp-prev"),w(e,"title","Previous"),w(e,"aria-label","Previous"),w(o,"class","bp-next"),w(o,"title","Next"),w(o,"aria-label","Next")},m(r,u){b(r,n,u),n.innerHTML=s,b(r,e,u),b(r,o,u),i||(c=[v(e,"click",t[2]),v(o,"click",t[3])],i=1)},p(t,e){17&e[0]&&s!==(s=`${t[4]+1} / ${t[0].length}`)&&(n.innerHTML=s)},d(t){t&&h(n),t&&h(e),t&&h(o),i=0,r(c)}}}function Ft(t){let n,e,o=t[0]&&At(t);return{c(){o&&o.c(),n=x()},m(t,r){o&&o.m(t,r),b(t,n,r),e=1},p(t,e){t[0]?o?(o.p(t,e),1&e[0]&&G(o,1)):(o=At(t),o.c(),G(o,1),o.m(n.parentNode,n)):o&&(X(),H(o,1,1,(()=>{o=null})),Y())},i(t){e||(G(o),e=1)},o(t){H(o),e=0},d(t){o&&o.d(t),t&&h(n)}}}function Jt(t,n,e){let o,{items:r}=n,{target:i}=n;const c=document.documentElement;let u,l,a,p,f,d,m,b,h;const g=()=>!h.img&&!h.sources&&!h.iframe;let x;const v=t=>x=t,w={},y=st(0);s(t,y,(t=>e(10,o=t)));const $=()=>{l.onClose?.(w.el,h),at.set(1),e(0,r=null),p?.focus({preventScroll:1})},k=()=>M(u-1),_=()=>M(u+1),M=t=>{m=t-u,e(4,u=S(t))},S=t=>(t+r.length)%r.length,z=t=>{const{key:n,shiftKey:e}=t;if("Escape"===n)!l.noClose&&$();else if("ArrowRight"===n)_();else if("ArrowLeft"===n)k();else if("Tab"===n){const{activeElement:n}=document;if(e||!n.controls){t.preventDefault();const{focusWrap:o=w.el}=l,r=[...o.querySelectorAll("*")].filter((t=>t.tabIndex>=0));let i=r.indexOf(n);i+=r.length+(e?-1:1),r[i%r.length].focus()}}},I=({width:t=1920,height:n=1080})=>{const{scale:e=.99}=l,o=Math.min(1,w.w/t*e,w.h/n*e);return[Math.round(t*o),Math.round(n*o)]},P=()=>{if(r){const t=r[S(u+1)],n=r[S(u-1)];!t.preload&&T(t),!n.preload&&T(n)}},T=t=>{if(t.img){const n=document.createElement("img");return n.sizes=l.sizes||I(t)[0]+"px",n.srcset=t.img,t.preload=1,n.decode().catch((t=>{}))}};return t.R=t=>{"items"in t&&e(0,r=t.items),"target"in t&&e(15,i=t.target)},t.u.update=()=>{786545&t.u.v[0]&&r&&(e(6,h=r[u]),a&&l.onUpdate?.(w.el,h))},[r,$,k,_,u,l,h,f,d,b,o,y,(t,n)=>a&&r?it(t,{x:(m>0?20:-20)*(n?1:-1),duration:250}):(e(18,a=n),l.intro?it(t,{y:n?10:-10}):(t=>{let n;if(g()){const e=t.firstChild.firstChild;n=[e.clientWidth,e.clientHeight]}else n=I(h);const e=(h.element||p).getBoundingClientRect(),o=e.left-(w.w-e.width)/2,r=e.top-(w.h-e.height)/2,i=e.width/n[0],c=e.height/n[1];return{duration:480,_:rt,css:(t,n)=>`transform:translate3d(${o*n}px, ${r*n}px, 0) scale3d(${i+t*(1-i)}, ${c+t*(1-c)}, 1)`}})(t)),()=>({j:h,B:I,K:T,L:P,F:l,J:k,next:_,close:$,D:v,zoomed:y,container:w}),t=>{let n;e(19,w.el=t,w),l.onOpen?.(w.el,h),d||globalThis.addEventListener("keydown",z);const o=new ResizeObserver((t=>{n&&(e(19,w.w=t[0].contentRect.width,w),e(19,w.h=t[0].contentRect.height,w),e(7,f=769>w.w),g()||x?.(),l.onResize?.(w.el,h)),n=1}));return o.observe(t),{destroy(){o.disconnect(),globalThis.removeEventListener("keydown",z),at.set(0),c.classList.remove("bp-lock"),l.onClosed?.()}}},i,t=>{e(5,l=t),e(8,d=l.inline),!d&&c.scrollHeight>c.clientHeight&&c.classList.add("bp-lock"),p=document.activeElement,e(19,w.w=i.offsetWidth,w),e(19,w.h=i===document.body?globalThis.innerHeight:i.clientHeight,w),e(7,f=769>w.w),e(4,u=l.position||0),e(0,r=[]);for(let t=0;(l.items.length||1)>t;t++){let n=l.items[t]||l.items;"dataset"in n?r.push({element:n,i:t,...n.dataset}):(n.i=t,r.push(n),n=n.element),l.el&&l.el===n&&e(4,u=t)}},M,a,w,t=>e(9,b=t.target),function(t){2!==t.button&&t.target===this&&b===this&&!l.noClose&&$()}]}class Bt extends ot{constructor(t){super(),et(this,t,Jt,Ft,c,{items:0,target:15,open:16,close:1,J:2,next:3,setPosition:17},null,[-1,-1])}get items(){return this.u.$[0]}get target(){return this.u.$[15]}get open(){return this.u.$[16]}get close(){return this.u.$[1]}get J(){return this.u.$[2]}get next(){return this.u.$[3]}get setPosition(){return this.u.$[17]}}return t=>new Bt({...t,P:t})}(); diff --git a/output/assets/scripts/gallery-init.js b/output/assets/scripts/gallery-init.js new file mode 100755 index 0000000..548a989 --- /dev/null +++ b/output/assets/scripts/gallery-init.js @@ -0,0 +1,255 @@ +document.addEventListener('DOMContentLoaded', () => { + if (typeof window.BiggerPicture !== 'function') { + console.error('[gallery-init] BiggerPicture not found. Check script path.'); + return; + } + + // 1) Wrap Org-exported images so they’re clickable + const imgs = document.querySelectorAll('.figure img, img.org-svg'); + imgs.forEach((img) => { + if (img.closest('a')) return; // already wrapped + const a = document.createElement('a'); + const href = img.currentSrc || img.src; + a.href = href; + a.dataset.img = href; // lets BP pre-size/raster slides + a.dataset.alt = img.alt || ''; + const setDims = () => { + a.dataset.width = img.naturalWidth || img.width || 1920; + a.dataset.height = img.naturalHeight || img.height || 1080; + }; + if (img.complete) setDims(); else img.addEventListener('load', setDims); + img.style.cursor = 'zoom-in'; + img.parentElement.insertBefore(a, img); + a.appendChild(img); + }); + + // 2) One global BP instance + const bp = BiggerPicture({ target: document.body }); + + // SVG pan/zoom handle + let activePanZoom = null; + const destroyPanZoom = () => { try { activePanZoom?.destroy(); } catch(_){} activePanZoom = null; }; + + // Simple rotate state (for non-SVG images) + let activeContainer = null; + let currentRotation = 0; + let rotateControls = null; + + + // 3) Build galleries per content container + const containers = document.querySelectorAll('main, article, .content, body'); + containers.forEach((container) => { + const links = Array.from(container.querySelectorAll('.figure a, a:has(img.org-svg)')); + if (!links.length) return; + + // Start the lightbox on click + links.forEach((link, index) => { + link.addEventListener('click', (e) => { + e.preventDefault(); + document.querySelectorAll(".theme-toggle").forEach(el => { + el.classList.add("hidden"); + }); + + bp.open({ + // IMPORTANT: pass the anchor ELEMENTS, not custom objects + items: links, + el: link, + caption: (el) => el.querySelector('img')?.alt || el.title || '', + maxZoom: 40, // for raster images (PNG/JPG); SVG handled separately + + // Fade-out polish + cleanup + onClose(containerEl) { + destroyPanZoom(); + teardownRotation(); + if (containerEl) containerEl.classList.add('bp-fadeout'); + const themeToggle = document.querySelector(".theme-toggle"); + if (themeToggle) { + themeToggle.classList.remove("hidden"); + } + }, + + // Called once after open and on every slide change + onOpen(containerEl) { setupRotation(containerEl); enhanceSVG(containerEl); }, + onUpdate(containerEl){ setupRotation(containerEl); enhanceSVG(containerEl); } + }); + }); + }); + }); + + // 4) Simple rotate buttons for raster images + function ensureRotateControls() { + if (rotateControls) return rotateControls; + + const wrapper = document.createElement('div'); + wrapper.className = 'bp-rotate-controls'; + Object.assign(wrapper.style, { + position: 'fixed', + bottom: '1.5rem', + right: '1.5rem', + display: 'flex', + gap: '0.5rem', + zIndex: '9999', + pointerEvents: 'auto' + }); + + const mkBtn = (label, title) => { + const btn = document.createElement('button'); + btn.type = 'button'; + btn.textContent = label; + btn.title = title; + btn.setAttribute('aria-label', title); + Object.assign(btn.style, { + padding: '0.4rem 0.6rem', + borderRadius: '999px', + border: 'none', + fontSize: '1.2rem', + cursor: 'pointer', + background: 'rgba(30,30,30,0.8)', + color: '#fff' + }); + return btn; + }; + + const left = mkBtn('⟲', 'Rotate image 90° left'); + const right = mkBtn('⟳', 'Rotate image 90° right'); + + left.addEventListener('click', (e) => { + e.stopPropagation(); // don’t close the lightbox + if (!activeContainer) return; + currentRotation = (currentRotation - 90 + 360) % 360; + applyRotation(); + }); + + right.addEventListener('click', (e) => { + e.stopPropagation(); + if (!activeContainer) return; + currentRotation = (currentRotation + 90) % 360; + applyRotation(); + }); + + wrapper.append(left, right); + document.body.appendChild(wrapper); + rotateControls = wrapper; + return rotateControls; + } + + function ensureRotateWrapper() { + if (!activeContainer) return null; + + const imgRoot = activeContainer.querySelector('.bp-img'); + if (!imgRoot) return null; + + let imgEl = imgRoot.querySelector('img'); + if (!imgEl) return null; + + const src = (imgEl.currentSrc || imgEl.src || '').toLowerCase(); + // We only rotate raster images; SVGs are handled via svg-pan-zoom + if (src.endsWith('.svg')) return null; + + let wrapper = imgRoot.querySelector('.bp-rotate-wrapper'); + if (!wrapper) { + wrapper = document.createElement('div'); + wrapper.className = 'bp-rotate-wrapper'; + wrapper.style.display = 'inline-block'; + wrapper.style.transformOrigin = 'center center'; + + imgRoot.appendChild(wrapper); + wrapper.appendChild(imgEl); + } else if (!wrapper.contains(imgEl)) { + // Slide changed and BiggerPicture replaced the + wrapper.innerHTML = ''; + wrapper.appendChild(imgEl); + } + + return wrapper; + } + + function applyRotation() { + const wrapper = ensureRotateWrapper(); + if (!wrapper) return; + wrapper.style.transform = `rotate(${currentRotation}deg)`; + } + + function setupRotation(containerEl) { + activeContainer = containerEl; + currentRotation = 0; + const controls = ensureRotateControls(); + controls.style.display = 'flex'; + applyRotation(); + } + + function teardownRotation() { + activeContainer = null; + currentRotation = 0; + if (rotateControls) { + rotateControls.style.display = 'none'; + } + } + + + // 4) If current slide is an SVG, swap to inline + enable svg-pan-zoom + async function enhanceSVG(containerEl) { + try { + destroyPanZoom(); + + const imgEl = containerEl.querySelector('.bp-img img'); + if (!imgEl) return; + + const src = imgEl.currentSrc || imgEl.src || ''; + const isSVG = src.toLowerCase().endsWith('.svg'); + const htmlLayer = containerEl.querySelector('.bp-html'); + if (!isSVG || !htmlLayer) { + // ensure any previous holder is removed and bitmap is visible + const old = htmlLayer?.querySelector('.bp-svg-holder'); + if (old) old.remove(); + imgEl.style.visibility = ''; + return; + } + + // Create/clear holder + let holder = htmlLayer.querySelector('.bp-svg-holder'); + if (!holder) { + holder = document.createElement('div'); + holder.className = 'bp-svg-holder'; + holder.style.maxWidth = '95vw'; + holder.style.maxHeight = '95vh'; + htmlLayer.appendChild(holder); + } + holder.innerHTML = ''; + + // Hide the bitmap so only the inline SVG shows + imgEl.style.visibility = 'hidden'; + + // Inline the SVG + const res = await fetch(src, { cache: 'force-cache' }); + const text = await res.text(); + holder.innerHTML = text; + + const svg = holder.querySelector('svg'); + if (!svg) { imgEl.style.visibility = ''; return; } + + svg.style.maxWidth = '95vw'; + svg.style.maxHeight = '95vh'; + svg.style.display = 'block'; + + if (typeof window.svgPanZoom === 'function') { + activePanZoom = svgPanZoom(svg, { + zoomEnabled: true, + controlIconsEnabled: true, + fit: true, + center: true, + minZoom: 0.05, + maxZoom: 400, // effectively "unlimited" + zoomScaleSensitivity: 0.25, + dblClickZoomEnabled: true + }); + // Keep wheel inside lightbox + holder.addEventListener('wheel', (e) => e.stopPropagation(), { passive: true }); + } else { + console.warn('[gallery-init] svg-pan-zoom not loaded'); + } + } catch (err) { + console.error('[gallery-init] SVG enhance failed:', err); + } + } +}); diff --git a/output/assets/scripts/script.js b/output/assets/scripts/script.js new file mode 100755 index 0000000..950ab7e --- /dev/null +++ b/output/assets/scripts/script.js @@ -0,0 +1,434 @@ +/* ========================================================= + BOOTSTRAP + ========================================================= */ + +document.addEventListener("DOMContentLoaded", () => { + initCopyButtons(); + initFootnoteSidenotes(); + initThemeToggle(); + initCountdowns(); + initTOCHighlighting(); + initStackedNavigation(); + restoreStackFromURL(); + initClearPanesButton(); + initInitialPaneControls(); + +}); + +/* ========================================================= + COPY BUTTONS (code blocks) + ========================================================= */ + +function initCopyButtons() { + document.querySelectorAll("pre.src").forEach(codeBlock => { + if (codeBlock.querySelector(".copy-btn")) return; // idempotent + + const button = document.createElement("button"); + button.className = "copy-btn"; + button.textContent = "Copy"; + codeBlock.appendChild(button); + + button.addEventListener("click", async () => { + const text = codeBlock.innerText.replace(button.innerText, "").trim(); + try { + await navigator.clipboard.writeText(text); + button.textContent = "Copied!"; + setTimeout(() => (button.textContent = "Copy"), 1500); + } catch { + button.textContent = "Failed"; + setTimeout(() => (button.textContent = "Copy"), 1500); + } + }); + }); +} + +/* ========================================================= + FOOTNOTES → SIDENOTES + ========================================================= */ + +function initFootnoteSidenotes() { + document.querySelectorAll('a.footref[href^="#fn"]').forEach(ref => { + const sup = ref.closest("sup") || ref; + + if (sup.nextElementSibling?.classList.contains("footnote-sidenote")) return; + + const targetId = ref.getAttribute("href").slice(1); + const anchor = document.getElementById(targetId); + if (!anchor) return; + + const footdef = anchor.closest(".footdef") || anchor.parentElement; + if (!footdef) return; + + let paras = footdef.querySelectorAll("p.footpara"); + if (!paras.length) { + paras = footdef.querySelectorAll(".footpara:not(:has(.footpara))"); + } + + let parts = []; + if (paras.length) { + const seen = new Set(); + parts = [...paras] + .map(p => { + const txt = p.textContent.trim().replace(/\s+/g, " "); + if (seen.has(txt)) return ""; + seen.add(txt); + return p.innerHTML.trim(); + }) + .filter(Boolean); + } + + if (!parts.length) { + const clone = footdef.cloneNode(true); + clone + .querySelectorAll("sup.footnum, a[role='doc-backlink']") + .forEach(n => n.remove()); + parts = [clone.innerHTML.trim()]; + } + + const sidenote = document.createElement("span"); + sidenote.className = "sidenote footnote-sidenote"; + sidenote.dataset.fn = ref.textContent.trim(); + sidenote.innerHTML = parts.join(" "); + + sup.insertAdjacentElement("afterend", sidenote); + }); +} + +/* ========================================================= + THEME TOGGLE + ========================================================= */ + +function initThemeToggle() { + const root = document.documentElement; + const key = "theme"; + const saved = localStorage.getItem(key); + + if (saved === "dark" || saved === "light") { + root.setAttribute("data-theme", saved); + } + + const btn = document.getElementById("theme-toggle"); + if (!btn) return; + + btn.addEventListener("click", () => { + const current = root.getAttribute("data-theme"); + const next = current === "dark" ? "light" : "dark"; + root.setAttribute("data-theme", next); + localStorage.setItem(key, next); + }); +} + +/* ========================================================= + COUNTDOWNS + ========================================================= */ + +function initCountdowns() { + const els = document.querySelectorAll("time.countdown"); + if (!els.length) return; + + const plural = (n, w) => `${n} ${w}${n === 1 ? "" : "s"}`; + + const render = el => { + const raw = el.getAttribute("datetime"); + const label = el.dataset.label || ""; + const target = new Date(raw); + if (isNaN(target)) { + el.textContent = "—"; + return; + } + + let diff = target - new Date(); + if (diff <= 0) { + el.textContent = `${label ? label + " " : ""}today`; + el.classList.add("expired"); + return; + } + + const d = Math.floor(diff / 86400000); diff %= 86400000; + const h = Math.floor(diff / 3600000); diff %= 3600000; + const m = Math.floor(diff / 60000); diff %= 60000; + const s = Math.floor(diff / 1000); + + const parts = []; + if (d) parts.push(plural(d, "day")); + parts.push(`${h}h ${m}m ${s}s`); + + el.textContent = `${label ? label + " in: " : ""}${parts.join(" ")}`; + }; + + const tick = () => els.forEach(render); + tick(); + setInterval(tick, 1000); +} + +/* ========================================================= + TABLE OF CONTENTS HIGHLIGHTING + ========================================================= */ + +function initTOCHighlighting() { + const toc = document.querySelector("#text-table-of-contents"); + if (!toc) return; + + const links = [...toc.querySelectorAll('a[href^="#"]')]; + if (!links.length) return; + + const linkById = new Map(); + links.forEach(a => { + const id = decodeURIComponent(a.hash.slice(1)); + const el = document.getElementById(id); + if (el) linkById.set(id, a); + }); + + const headings = [...document.querySelectorAll("h2[id], h3[id], h4[id]")] + .filter(h => linkById.has(h.id)); + + const setActive = id => { + links.forEach(a => { + const active = a.hash === `#${id}`; + a.classList.toggle("is-active", active); + a.toggleAttribute("aria-current", active); + }); + }; + + const headerOffset = + 6.5 * parseFloat(getComputedStyle(document.documentElement).fontSize); + + const visible = new Map(); + + const observer = new IntersectionObserver(entries => { + entries.forEach(entry => { + const id = entry.target.id; + if (entry.isIntersecting) { + visible.set(id, entry.target.getBoundingClientRect().top - headerOffset); + } else { + visible.delete(id); + } + }); + + if (visible.size) { + const [id] = [...visible.entries()] + .sort((a, b) => Math.abs(a[1]) - Math.abs(b[1]))[0]; + setActive(id); + } + }, { + rootMargin: `-${headerOffset}px 0px -70% 0px`, + threshold: [0, 0.01, 0.1] + }); + + headings.forEach(h => observer.observe(h)); + + toc.addEventListener("click", e => { + const a = e.target.closest('a[href^="#"]'); + if (!a) return; + const id = decodeURIComponent(a.hash.slice(1)); + const el = document.getElementById(id); + if (!el) return; + + e.preventDefault(); + el.scrollIntoView({ behavior: "smooth", block: "start" }); + el.setAttribute("tabindex", "-1"); + el.focus({ preventScroll: true }); + history.pushState(null, "", `#${id}`); + }); +} + +let fullscreenSnapshot = null; + + +/* ========================================================= + STACKED NAVIGATION (PANES) + ========================================================= */ + +function initStackedNavigation() { + document.addEventListener("click", e => { + const link = e.target.closest("a"); + if (!link) return; + + const href = link.getAttribute("href"); + if (!href || href.startsWith("#")) return; + + const url = new URL(href, location.href); + if (url.origin !== location.origin) return; + if (!url.pathname.endsWith(".html")) return; + + e.preventDefault(); + pushPane(url.pathname + url.hash); + }); +} + +async function pushPane(urlWithHash) { + const track = document.querySelector(".stack-track"); + if (!track) return; + + const existing = [...track.children].find(p => p.dataset.url === urlWithHash); + if (existing) { + existing.scrollIntoView({ behavior: "smooth", inline: "end" }); + return; + } + + const [url, hash] = urlWithHash.split("#"); + const res = await fetch(url); + const doc = new DOMParser().parseFromString(await res.text(), "text/html"); + + const content = doc.querySelector("#content"); + if (!content) return; + + const pane = document.createElement("article"); + pane.className = "stack-pane"; + pane.dataset.url = urlWithHash; + + pane.appendChild(content); + track.appendChild(pane); + pane.scrollIntoView({ behavior: "smooth", inline: "end" }); + + if (hash) { + requestAnimationFrame(() => { + pane.querySelector(`#${CSS.escape(hash)}`) + ?.scrollIntoView({ behavior: "smooth", block: "start" }); + }); + } + + // Find the title-section and attach event listeners to the controls + const titleSection = pane.querySelector(".title-section"); + if (titleSection) { + const closeBtn = titleSection.querySelector(".pane-close"); + const fullscreenBtn = titleSection.querySelector(".pane-fullscreen"); + + if (closeBtn) { + closeBtn.addEventListener("click", () => { + if (document.body.classList.contains("pane-fullscreen")) { + exitFullscreen({ removePane: pane }); + return; + } + pane.remove(); + updateURL(); + }); + } + + if (fullscreenBtn) { + fullscreenBtn.addEventListener("click", () => { + if (pane.classList.contains("is-fullscreen")) { + exitFullscreen(); + } else { + enterFullscreen(pane); + } + }); + } + } + + updateURL(); +} + +function initInitialPaneControls() { + // Initialize controls for the initial pane (pane-root) that's already in the HTML + const initialPane = document.querySelector(".pane-root"); + if (!initialPane) return; + + const titleSection = initialPane.querySelector(".title-section"); + if (!titleSection) return; + + const closeBtn = titleSection.querySelector(".pane-close"); + const fullscreenBtn = titleSection.querySelector(".pane-fullscreen"); + + if (closeBtn) { + closeBtn.addEventListener("click", () => { + if (document.body.classList.contains("pane-fullscreen")) { + exitFullscreen({ removePane: initialPane }); + return; + } + initialPane.remove(); + updateURL(); + }); + } + + if (fullscreenBtn) { + fullscreenBtn.addEventListener("click", () => { + if (initialPane.classList.contains("is-fullscreen")) { + exitFullscreen(); + } else { + enterFullscreen(initialPane); + } + }); + } +} + +document.addEventListener("keydown", e => { + if (e.key === "Escape" && document.body.classList.contains("pane-fullscreen")) { + exitFullscreen(); + } +}); + + +function enterFullscreen(pane) { + if (!fullscreenSnapshot) { + fullscreenSnapshot = [...document.querySelectorAll(".stack-pane")] + .map(p => p.dataset.url); + } + + document.querySelectorAll(".stack-pane").forEach(p => { + if (p !== pane) p.remove(); + }); + + document.body.classList.add("pane-fullscreen"); + pane.classList.add("is-fullscreen"); + + updateURL(); +} + + +async function exitFullscreen({ removePane } = {}) { + if (!fullscreenSnapshot) return; + + const removeUrl = removePane?.dataset.url; + + document.body.classList.remove("pane-fullscreen"); + + document + .querySelectorAll(".stack-pane.is-fullscreen") + .forEach(p => p.remove()); + + // Restore stack EXCEPT the removed pane + for (const url of fullscreenSnapshot) { + if (url === removeUrl) continue; + await pushPane(url); + } + + fullscreenSnapshot = null; + updateURL(); +} + + +function clearAllPanes() { + const panes = [...document.querySelectorAll(".stack-pane")]; + + panes.slice(1).forEach(pane => pane.remove()); + + updateURL(); +} + +function updateURL() { + const urls = [...document.querySelectorAll(".stack-pane")] + .map(p => p.dataset.url); + + const params = new URLSearchParams(location.search); + params.set("stackedNotes", urls.join("|")); + history.replaceState({}, "", "?" + params.toString()); +} + +async function restoreStackFromURL() { + const params = new URLSearchParams(location.search); + const stack = params.get("stackedNotes"); + if (!stack) return; + + for (const url of stack.split("|").slice(1)) { + await pushPane(url); + } +} +function initClearPanesButton() { + const btn = document.getElementById("close-all"); + if (!btn) return; + + btn.addEventListener("click", () => { + clearAllPanes(); + }); +} diff --git a/output/assets/scripts/search.js b/output/assets/scripts/search.js new file mode 100755 index 0000000..055614c --- /dev/null +++ b/output/assets/scripts/search.js @@ -0,0 +1,180 @@ +/* ========================================================= + STATE + ========================================================= */ + +let index = []; +let activeIndex = -1; + +const box = document.getElementById("search-box"); +const results = document.getElementById("search-results"); + +/* ========================================================= + LOAD SEARCH INDEX + ========================================================= */ + +fetch("/search-index.json") + .then(r => r.json()) + .then(data => { + index = Array.isArray(data) ? data : []; + }) + .catch(err => { + console.error("Failed to load search index:", err); + }); + +/* ========================================================= + RENDER RESULTS + ========================================================= */ + +function renderResults(items) { + clearResults(); + + items.forEach((entry, i) => { + const row = document.createElement("div"); + row.dataset.index = i; + + const link = document.createElement("a"); + link.href = entry.url; + link.textContent = entry.title; + + link.addEventListener("click", ev => { + ev.preventDefault(); + ev.stopPropagation(); + clearSearch(); + pushPane(entry.url); + }); + + row.appendChild(link); + + row.addEventListener("mouseenter", () => setActive(i)); + row.addEventListener("mouseleave", clearActive); + + results.appendChild(row); + }); +} + +/* ========================================================= + ACTIVE ITEM HANDLING + ========================================================= */ + +function setActive(i) { + const items = [...results.children]; + + items.forEach(el => el.classList.remove("active")); + + if (items[i]) { + items[i].classList.add("active"); + activeIndex = i; + } +} + +function clearActive() { + [...results.children].forEach(el => el.classList.remove("active")); + activeIndex = -1; +} + +/* ========================================================= + INPUT HANDLER + ========================================================= */ + +box.addEventListener("input", () => { + const query = box.value.trim().toLowerCase(); + + clearResults(); + if (query.length < 2) return; + + const matches = index + .map(entry => ({ + ...entry, + score: fuzzyScore(query, entry.title) + })) + .filter(entry => entry.score > 0) + .sort((a, b) => b.score - a.score) + .slice(0, 20); // optional cap + + renderResults(matches); +}); + +/* ========================================================= + KEYBOARD NAVIGATION + ========================================================= */ + +box.addEventListener("keydown", e => { + const items = [...results.children]; + if (!items.length) return; + + switch (e.key) { + case "ArrowDown": + e.preventDefault(); + setActive((activeIndex + 1) % items.length); + break; + + case "ArrowUp": + e.preventDefault(); + setActive((activeIndex - 1 + items.length) % items.length); + break; + + case "Enter": + if (activeIndex < 0) return; + + e.preventDefault(); + e.stopPropagation(); + + const link = items[activeIndex].querySelector("a"); + if (link) { + clearSearch(); + pushPane(link.getAttribute("href")); + } + break; + + case "Escape": + clearSearch(); + break; + } +}); + +/* ========================================================= + CLICK OUTSIDE TO CLOSE + ========================================================= */ + +document.addEventListener("click", e => { + if (!e.target.closest(".banner-search")) { + clearSearch(); + } +}); + +/* ========================================================= + HELPERS + ========================================================= */ + +function clearResults() { + results.innerHTML = ""; +} + +function clearSearch() { + clearResults(); + activeIndex = -1; +} +function fuzzyScore(query, text) { + query = query.toLowerCase(); + text = text.toLowerCase(); + + let score = 0; + let qi = 0; + let consecutive = 0; + + for (let ti = 0; ti < text.length && qi < query.length; ti++) { + if (text[ti] === query[qi]) { + qi++; + consecutive++; + score += 5 + consecutive * 2; // reward runs + } else { + consecutive = 0; + } + } + + if (qi !== query.length) return 0; + + score += Math.max(0, 20 - text.length); + + return score; +} diff --git a/output/assets/scripts/svg-pan-zoom.min.js b/output/assets/scripts/svg-pan-zoom.min.js new file mode 100755 index 0000000..844f34d --- /dev/null +++ b/output/assets/scripts/svg-pan-zoom.min.js @@ -0,0 +1,27 @@ +// svg-pan-zoom v3.6.2 +// https://github.com/bumbu/svg-pan-zoom +/* Copyright 2009-2010 Andrea Leofreddi +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +!function s(r,a,l){function u(e,t){if(!a[e]){if(!r[e]){var o="function"==typeof require&&require;if(!t&&o)return o(e,!0);if(h)return h(e,!0);var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var i=a[e]={exports:{}};r[e][0].call(i.exports,function(t){return u(r[e][1][t]||t)},i,i.exports,s,r,a,l)}return a[e].exports}for(var h="function"==typeof require&&require,t=0;tthis.options.maxZoom*n.zoom&&(t=this.options.maxZoom*n.zoom/this.getZoom());var i=this.viewport.getCTM(),s=e.matrixTransform(i.inverse()),r=this.svg.createSVGMatrix().translate(s.x,s.y).scale(t).translate(-s.x,-s.y),a=i.multiply(r);a.a!==i.a&&this.viewport.setCTM(a)},i.prototype.zoom=function(t,e){this.zoomAtPoint(t,a.getSvgCenterPoint(this.svg,this.width,this.height),e)},i.prototype.publicZoom=function(t,e){e&&(t=this.computeFromRelativeZoom(t)),this.zoom(t,e)},i.prototype.publicZoomAtPoint=function(t,e,o){if(o&&(t=this.computeFromRelativeZoom(t)),"SVGPoint"!==r.getType(e)){if(!("x"in e&&"y"in e))throw new Error("Given point is invalid");e=a.createSVGPoint(this.svg,e.x,e.y)}this.zoomAtPoint(t,e,o)},i.prototype.getZoom=function(){return this.viewport.getZoom()},i.prototype.getRelativeZoom=function(){return this.viewport.getRelativeZoom()},i.prototype.computeFromRelativeZoom=function(t){return t*this.viewport.getOriginalState().zoom},i.prototype.resetZoom=function(){var t=this.viewport.getOriginalState();this.zoom(t.zoom,!0)},i.prototype.resetPan=function(){this.pan(this.viewport.getOriginalState())},i.prototype.reset=function(){this.resetZoom(),this.resetPan()},i.prototype.handleDblClick=function(t){var e;if((this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),this.options.controlIconsEnabled)&&-1<(t.target.getAttribute("class")||"").indexOf("svg-pan-zoom-control"))return!1;e=t.shiftKey?1/(2*(1+this.options.zoomScaleSensitivity)):2*(1+this.options.zoomScaleSensitivity);var o=a.getEventPoint(t,this.svg).matrixTransform(this.svg.getScreenCTM().inverse());this.zoomAtPoint(e,o)},i.prototype.handleMouseDown=function(t,e){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),r.mouseAndTouchNormalize(t,this.svg),this.options.dblClickZoomEnabled&&r.isDblClick(t,e)?this.handleDblClick(t):(this.state="pan",this.firstEventCTM=this.viewport.getCTM(),this.stateOrigin=a.getEventPoint(t,this.svg).matrixTransform(this.firstEventCTM.inverse()))},i.prototype.handleMouseMove=function(t){if(this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),"pan"===this.state&&this.options.panEnabled){var e=a.getEventPoint(t,this.svg).matrixTransform(this.firstEventCTM.inverse()),o=this.firstEventCTM.translate(e.x-this.stateOrigin.x,e.y-this.stateOrigin.y);this.viewport.setCTM(o)}},i.prototype.handleMouseUp=function(t){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),"pan"===this.state&&(this.state="none")},i.prototype.fit=function(){var t=this.viewport.getViewBox(),e=Math.min(this.width/t.width,this.height/t.height);this.zoom(e,!0)},i.prototype.contain=function(){var t=this.viewport.getViewBox(),e=Math.max(this.width/t.width,this.height/t.height);this.zoom(e,!0)},i.prototype.center=function(){var t=this.viewport.getViewBox(),e=.5*(this.width-(t.width+2*t.x)*this.getZoom()),o=.5*(this.height-(t.height+2*t.y)*this.getZoom());this.getPublicInstance().pan({x:e,y:o})},i.prototype.updateBBox=function(){this.viewport.simpleViewBoxCache()},i.prototype.pan=function(t){var e=this.viewport.getCTM();e.e=t.x,e.f=t.y,this.viewport.setCTM(e)},i.prototype.panBy=function(t){var e=this.viewport.getCTM();e.e+=t.x,e.f+=t.y,this.viewport.setCTM(e)},i.prototype.getPan=function(){var t=this.viewport.getState();return{x:t.x,y:t.y}},i.prototype.resize=function(){var t=a.getBoundingClientRectNormalized(this.svg);this.width=t.width,this.height=t.height;var e=this.viewport;e.options.width=this.width,e.options.height=this.height,e.processCTM(),this.options.controlIconsEnabled&&(this.getPublicInstance().disableControlIcons(),this.getPublicInstance().enableControlIcons())},i.prototype.destroy=function(){var e=this;for(var t in this.beforeZoom=null,this.onZoom=null,this.beforePan=null,this.onPan=null,(this.onUpdatedCTM=null)!=this.options.customEventsHandler&&this.options.customEventsHandler.destroy({svgElement:this.svg,eventsListenerElement:this.options.eventsListenerElement,instance:this.getPublicInstance()}),this.eventListeners)(this.options.eventsListenerElement||this.svg).removeEventListener(t,this.eventListeners[t],!this.options.preventMouseEventsDefault&&h);this.disableMouseWheelZoom(),this.getPublicInstance().disableControlIcons(),this.reset(),c=c.filter(function(t){return t.svg!==e.svg}),delete this.options,delete this.viewport,delete this.publicInstance,delete this.pi,this.getPublicInstance=function(){return null}},i.prototype.getPublicInstance=function(){var o=this;return this.publicInstance||(this.publicInstance=this.pi={enablePan:function(){return o.options.panEnabled=!0,o.pi},disablePan:function(){return o.options.panEnabled=!1,o.pi},isPanEnabled:function(){return!!o.options.panEnabled},pan:function(t){return o.pan(t),o.pi},panBy:function(t){return o.panBy(t),o.pi},getPan:function(){return o.getPan()},setBeforePan:function(t){return o.options.beforePan=null===t?null:r.proxy(t,o.publicInstance),o.pi},setOnPan:function(t){return o.options.onPan=null===t?null:r.proxy(t,o.publicInstance),o.pi},enableZoom:function(){return o.options.zoomEnabled=!0,o.pi},disableZoom:function(){return o.options.zoomEnabled=!1,o.pi},isZoomEnabled:function(){return!!o.options.zoomEnabled},enableControlIcons:function(){return o.options.controlIconsEnabled||(o.options.controlIconsEnabled=!0,s.enable(o)),o.pi},disableControlIcons:function(){return o.options.controlIconsEnabled&&(o.options.controlIconsEnabled=!1,s.disable(o)),o.pi},isControlIconsEnabled:function(){return!!o.options.controlIconsEnabled},enableDblClickZoom:function(){return o.options.dblClickZoomEnabled=!0,o.pi},disableDblClickZoom:function(){return o.options.dblClickZoomEnabled=!1,o.pi},isDblClickZoomEnabled:function(){return!!o.options.dblClickZoomEnabled},enableMouseWheelZoom:function(){return o.enableMouseWheelZoom(),o.pi},disableMouseWheelZoom:function(){return o.disableMouseWheelZoom(),o.pi},isMouseWheelZoomEnabled:function(){return!!o.options.mouseWheelZoomEnabled},setZoomScaleSensitivity:function(t){return o.options.zoomScaleSensitivity=t,o.pi},setMinZoom:function(t){return o.options.minZoom=t,o.pi},setMaxZoom:function(t){return o.options.maxZoom=t,o.pi},setBeforeZoom:function(t){return o.options.beforeZoom=null===t?null:r.proxy(t,o.publicInstance),o.pi},setOnZoom:function(t){return o.options.onZoom=null===t?null:r.proxy(t,o.publicInstance),o.pi},zoom:function(t){return o.publicZoom(t,!0),o.pi},zoomBy:function(t){return o.publicZoom(t,!1),o.pi},zoomAtPoint:function(t,e){return o.publicZoomAtPoint(t,e,!0),o.pi},zoomAtPointBy:function(t,e){return o.publicZoomAtPoint(t,e,!1),o.pi},zoomIn:function(){return this.zoomBy(1+o.options.zoomScaleSensitivity),o.pi},zoomOut:function(){return this.zoomBy(1/(1+o.options.zoomScaleSensitivity)),o.pi},getZoom:function(){return o.getRelativeZoom()},setOnUpdatedCTM:function(t){return o.options.onUpdatedCTM=null===t?null:r.proxy(t,o.publicInstance),o.pi},resetZoom:function(){return o.resetZoom(),o.pi},resetPan:function(){return o.resetPan(),o.pi},reset:function(){return o.reset(),o.pi},fit:function(){return o.fit(),o.pi},contain:function(){return o.contain(),o.pi},center:function(){return o.center(),o.pi},updateBBox:function(){return o.updateBBox(),o.pi},resize:function(){return o.resize(),o.pi},getSizes:function(){return{width:o.width,height:o.height,realZoom:o.getZoom(),viewBox:o.viewport.getViewBox()}},destroy:function(){return o.destroy(),o.pi}}),this.publicInstance};var c=[];e.exports=function(t,e){var o=r.getSvg(t);if(null===o)return null;for(var n=c.length-1;0<=n;n--)if(c[n].svg===o)return c[n].instance.getPublicInstance();return c.push({svg:o,instance:new i(o,e)}),c[c.length-1].instance.getPublicInstance()}},{"./control-icons":1,"./shadow-viewport":2,"./svg-utilities":5,"./uniwheel":6,"./utilities":7}],5:[function(t,e,o){var l=t("./utilities"),s="unknown";document.documentMode&&(s="ie"),e.exports={svgNS:"http://www.w3.org/2000/svg",xmlNS:"http://www.w3.org/XML/1998/namespace",xmlnsNS:"http://www.w3.org/2000/xmlns/",xlinkNS:"http://www.w3.org/1999/xlink",evNS:"http://www.w3.org/2001/xml-events",getBoundingClientRectNormalized:function(t){if(t.clientWidth&&t.clientHeight)return{width:t.clientWidth,height:t.clientHeight};if(t.getBoundingClientRect())return t.getBoundingClientRect();throw new Error("Cannot get BoundingClientRect for SVG.")},getOrCreateViewport:function(t,e){var o=null;if(!(o=l.isElement(e)?e:t.querySelector(e))){var n=Array.prototype.slice.call(t.childNodes||t.children).filter(function(t){return"defs"!==t.nodeName&&"#text"!==t.nodeName});1===n.length&&"g"===n[0].nodeName&&null===n[0].getAttribute("transform")&&(o=n[0])}if(!o){var i="viewport-"+(new Date).toISOString().replace(/\D/g,"");(o=document.createElementNS(this.svgNS,"g")).setAttribute("id",i);var s=t.childNodes||t.children;if(s&&0div:first-child{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.75);animation:bp-fadein .48s cubic-bezier(.215,.61,.355,1)}.bp-vid audio{position:absolute;left:14px;width:calc(100% - 28px);bottom:14px;height:50px}.bp-inner{top:0;left:0;width:100%;height:100%;position:absolute;display:flex}.bp-html{display:contents}.bp-html>:first-child{margin:auto}.bp-img-wrap{top:0;left:0;width:100%;height:100%;position:absolute;contain:strict}.bp-img-wrap .bp-canzoom{cursor:zoom-in}.bp-img-wrap .bp-drag{cursor:grabbing}.bp-close{contain:layout size}.bp-img{position:absolute;top:50%;left:50%;user-select:none;background-size:100% 100%}.bp-img div,.bp-img img{position:absolute;top:0;left:0;width:100%;height:100%}.bp-img .bp-o{display:none}.bp-zoomed .bp-img:not(.bp-drag){cursor:grab}.bp-zoomed .bp-cap{opacity:0;animation:none!important}.bp-zoomed.bp-small .bp-controls{opacity:0}.bp-zoomed.bp-small .bp-controls button{pointer-events:none}.bp-controls{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;text-align:left;transition:opacity .3s;animation:bp-fadein .3s}.bp-controls button{pointer-events:auto;cursor:pointer;position:absolute;border:0;background:rgba(0,0,0,.15);opacity:.9;transition:all .1s;contain:content}.bp-controls button:hover{background-color:rgba(0,0,0,.2);opacity:1}.bp-controls svg{fill:#fff}.bp-count{position:absolute;color:rgba(255,255,255,.9);line-height:1;margin:16px;height:50px;width:100px}.bp-next,.bp-prev{top:50%;right:0;margin-top:-32px;height:64px;width:58px;border-radius:3px 0 0 3px}.bp-next:hover:before,.bp-prev:hover:before{transform:translateX(-2px)}.bp-next:before,.bp-prev:before{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z'/%3E%3C/svg%3E");position:absolute;left:7px;top:9px;width:46px;transition:all .2s}.bp-prev{right:auto;left:0;transform:scalex(-1)}.bp-x{top:0;right:0;height:55px;width:58px;border-radius:0 0 0 3px}.bp-x:before{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='%23fff'%3E%3Cpath d='M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z'/%3E%3C/svg%3E");position:absolute;width:37px;top:8px;right:10px}.bp-if,.bp-vid{position:relative;margin:auto;background:#000;background-size:100% 100%}.bp-if div,.bp-if iframe,.bp-if video,.bp-vid div,.bp-vid iframe,.bp-vid video{top:0;left:0;width:100%;height:100%;position:absolute;border:0}.bp-load{display:flex;background-size:100% 100%;overflow:hidden;z-index:1}.bp-bar{position:absolute;top:0;left:0;height:3px;width:100%;transform:translateX(-100%);background:rgba(255,255,255,.9);border-radius:0 3px 3px 0;animation:bp-bar 4s both}.bp-o,.bp-o:after{border-radius:50%;width:90px;height:90px}.bp-o{margin:auto;border:10px solid rgba(255,255,255,.2);border-left-color:rgba(255,255,255,.9);animation:bp-o 1s infinite linear}.bp-cap{position:absolute;bottom:2%;background:rgba(9,9,9,.8);color:rgba(255,255,255,.9);border-radius:4px;max-width:95%;line-height:1.3;padding:.6em 1.2em;left:50%;transform:translateX(-50%);width:fit-content;width:-moz-fit-content;display:table;transition:opacity .3s;animation:bp-fadein .2s}.bp-cap a{color:inherit}.bp-inline{position:absolute}.bp-lock{overflow-y:hidden}.bp-lock body{overflow:scroll}.bp-noclose .bp-x{display:none}.bp-noclose:not(.bp-zoomed){touch-action:pan-y}.bp-noclose:not(.bp-zoomed) .bp-img-wrap{cursor:zoom-in}@media (prefers-reduced-motion){.bp-wrap *{animation-duration:0s!important}}@media (max-width:500px){.bp-x{height:47px;width:47px}.bp-x:before{width:34px;top:6px;right:6px}.bp-next,.bp-prev{margin-top:-27px;height:54px;width:45px}.bp-next:before,.bp-prev:before{top:7px;left:2px;width:43px}.bp-o,.bp-o:after{border-width:6px;width:60px;height:60px}.bp-count{margin:12px 10px}} +/*# sourceMappingURL=/sm/15e96278e1e731ce40eef8d6284cefc81b81dda67c3a0aa386ec893f183bd57f.map */ \ No newline at end of file diff --git a/output/assets/styles/media.css b/output/assets/styles/media.css new file mode 100755 index 0000000..af05273 --- /dev/null +++ b/output/assets/styles/media.css @@ -0,0 +1,78 @@ +@media (max-width: 600px){ + .banner-header{ flex-direction: column; align-items: center; text-align: center; } + .banner-left{ margin: 0 0 .5rem 0; } + .banner-logo{ margin: 0; } + nav{ flex-wrap: wrap; justify-content: center; gap: .5rem; font-size: 1rem; } + + + .theme-toggle { + position: static; + order: 2; + margin-left: .5rem; + padding: .3rem .6rem; + background: transparent; + } + + .banner-header { + flex-wrap: wrap; + justify-content: center; + } + .banner-header nav { + display: flex; + align-items: center; + flex-wrap: wrap; + } + + body.no-sidenotes { + margin-left: 1em; + margin-right: 1em; + } + + #mobile-move-panel { + display: block; + } + +} +@media (max-width: 1250px){ + #preamble.status{ + padding-right: var(--body-pad); + } + + #content.content{ + padding-right: var(--body-pad); + } + .sidenote, + .marginnote{ + float: none; + clear: both; + width: auto; + display: block; + margin: 0.5rem 0 0.75rem; + padding-left: 0.75rem; + border-left: 3px dotted color-mix(in oklab, var(--fg) 8%, transparent); + margin-right: 0; + } + .fullwidth{ + max-width: calc(100vw - 2 * var(--body-pad)); + } + .sidenote, .marginnote{ + border-left: 3px dotted color-mix(in oklab, var(--fg) 12%, transparent); + } + .sidenote .mn-img, + .marginnote .mn-img{ + border-color: color-mix(in oklab, var(--fg) 12%, transparent); + } + + #table-of-contents{ + float: none; + position: static; + width: auto; + margin: 0 0 1rem; + padding: .5rem .75rem; + border-right: 0; + border-left: 3px dotted color-mix(in oklab, var(--fg) 12%, transparent); + background: color-mix(in oklab, var(--bg) 96%, var(--fg) 4%); + border-radius: 4px; + } + +} diff --git a/output/assets/styles/org.css b/output/assets/styles/org.css new file mode 100755 index 0000000..9229b63 --- /dev/null +++ b/output/assets/styles/org.css @@ -0,0 +1,2459 @@ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html { + font-family:sans-serif; + line-height:1.15; + -ms-text-size-adjust:100%; + -webkit-text-size-adjust:100% +} +body { + margin:0 +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section, +summary { + display:block +} +audio, +canvas, +progress, +video { + display:inline-block +} +audio:not([controls]) { + display:none; + height:0 +} +progress { + vertical-align:baseline +} +[hidden], +template { + display:none +} +a { + background-color:transparent; + -webkit-text-decoration-skip:objects +} +a:active, +a:hover { + outline-width:0 +} +abbr[title] { + border-bottom:none; + text-decoration:underline; + -webkit-text-decoration:underline dotted; + text-decoration:underline dotted +} +b, +strong { + font-weight:inherit; + font-weight:bolder +} +dfn { + font-style:italic +} +h1 { + font-size:2em; + margin:.67em 0 +} +mark { + background-color:#ff0; + color:#000 +} +small { + font-size:80% +} +sub, +sup { + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline +} +sub { + bottom:-.25em +} +sup { + top:-.5em +} +img { + border-style:none +} +svg:not(:root) { + overflow:hidden +} +code, +kbd, +pre, +samp { + font-family:monospace,monospace; + font-size:1em +} +figure { + margin:1em 40px +} +hr { + box-sizing:content-box; + height:0; + overflow:visible +} +button, +input, +optgroup, +select, +textarea { + font:inherit; + margin:0 +} +optgroup { + font-weight:700 +} +button, +input { + overflow:visible +} +button, +select { + text-transform:none +} +[type=reset], +[type=submit], +button, +html [type=button] { + -webkit-appearance:button +} +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style:none; + padding:0 +} +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline:1px dotted ButtonText +} +fieldset { + border:1px solid silver; + margin:0 2px; + padding:.35em .625em .75em +} +legend { + box-sizing:border-box; + color:inherit; + display:table; + max-width:100%; + padding:0; + white-space:normal +} +textarea { + overflow:auto +} +[type=checkbox], +[type=radio] { + box-sizing:border-box; + padding:0 +} +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height:auto +} +[type=search] { + -webkit-appearance:textfield; + outline-offset:-2px +} +[type=search]::-webkit-search-cancel-button, +[type=search]::-webkit-search-decoration { + -webkit-appearance:none +} +::-webkit-input-placeholder { + color:inherit; + opacity:.54 +} +::-webkit-file-upload-button { + -webkit-appearance:button; + font:inherit +} +body { + color:#000; + background-color:#fff +} +.org-alert-high { + color:#ff8c00; + font-weight:700 +} +.org-alert-low { + color:#00008b +} +.org-alert-moderate { + color:gold; + font-weight:700 +} +.org-alert-saved-fringe { + background-color:#f2f2f2 +} +.org-alert-trivial { + color:Dark purple +} +.org-alert-urgent { + color:red; + font-weight:700 +} +.org-anzu-match-1 { + color:#000; + background-color:#7fffd4 +} +.org-anzu-match-2 { + color:#000; + background-color:#00ff7f +} +.org-anzu-match-3 { + color:#000; + background-color:#ff0 +} +.org-anzu-mode-line, +.org-anzu-mode-line-no-match { + color:#008b00; + font-weight:700 +} +.org-anzu-replace-highlight { + color:#b0e2ff; + background-color:#cd00cd +} +.org-anzu-replace-to { + color:red +} +.org-bbdb-field-name { + color:sienna +} +.org-bbdb-name { + color:#00f +} +.org-bbdb-organization { + color:#b22222 +} +.org-beacon-fallback-background { + background-color:#000 +} +.org-biblio-results-header { + color:#483d8b; + font-size:150%; + font-weight:700 +} +.org-bold { + font-weight:700 +} +.org-bold-italic { + font-weight:700; + font-style:italic +} +.org-bookmark-menu-bookmark { + font-weight:700 +} +.org-bookmark-menu-heading { + color:#228b22 +} +.org-buffer-menu-buffer { + font-weight:700 +} +.org-builtin { + color:#483d8b +} +.org-button { + color:#3a5fcd; + text-decoration:underline +} +.org-c-annotation { + color:#008b8b +} +.org-cal-china-x-general-holiday { + background-color:#228b22 +} +.org-cal-china-x-important-holiday { + background-color:#8b0000 +} +.org-calendar-iso-week { + color:pink; + font-weight:700 +} +.org-calendar-iso-week-header { + color:#0ff +} +.org-calendar-month-header { + color:#00f +} +.org-calendar-today { + text-decoration:underline +} +.org-calendar-weekday-header { + color:#008b8b +} +.org-calendar-weekend-header { + color:#b22222 +} +.org-comint-highlight-input { + font-weight:700 +} +.org-comint-highlight-prompt { + color:#0000cd +} +.org-comment, +.org-comment-delimiter { + color:#b22222 +} +.org-compilation-column-number { + color:#8b2252 +} +.org-compilation-error { + color:red; + font-weight:700 +} +.org-compilation-info { + color:#228b22; + font-weight:700 +} +.org-compilation-line-number { + color:#a020f0 +} +.org-compilation-mode-line-exit { + color:#228b22; + font-weight:700 +} +.org-compilation-mode-line-fail { + color:red; + font-weight:700 +} +.org-compilation-mode-line-run, +.org-compilation-warning { + color:#ff8c00; + font-weight:700 +} +.org-completions-annotations { + font-style:italic +} +.org-completions-first-difference { + font-weight:700 +} +.org-constant { + color:#008b8b +} +.org-cursor { + background-color:#eead0e +} +.org-custom-button { + color:#000; + background-color:#d3d3d3 +} +.org-custom-button-mouse { + color:#000; + background-color:#e5e5e5 +} +.org-custom-button-pressed { + color:#000; + background-color:#d3d3d3 +} +.org-custom-button-pressed-unraised { + color:#8b008b; + text-decoration:underline +} +.org-custom-button-unraised { + text-decoration:underline +} +.org-custom-changed { + color:#fff; + background-color:#00f +} +.org-custom-comment { + background-color:#d9d9d9 +} +.org-custom-comment-tag { + color:#00008b +} +.org-custom-face-tag { + color:#00f; + font-weight:700 +} +.org-custom-group-subtitle { + font-weight:700 +} +.org-custom-group-tag { + color:#00f; + font-size:120%; + font-weight:700 +} +.org-custom-group-tag-1 { + color:red; + font-size:120%; + font-weight:700 +} +.org-custom-invalid { + color:#ff0; + background-color:red +} +.org-custom-link { + color:#3a5fcd; + text-decoration:underline +} +.org-custom-modified { + color:#fff; + background-color:#00f +} +.org-custom-rogue { + color:pink; + background-color:#000 +} +.org-custom-saved { + text-decoration:underline +} +.org-custom-set { + color:#00f; + background-color:#fff +} +.org-custom-state { + color:#006400 +} +.org-custom-themed { + color:#fff; + background-color:#00f +} +.org-custom-variable-button { + font-weight:700; + text-decoration:underline +} +.org-custom-variable-tag { + color:#00f; + font-weight:700 +} +.org-custom-visibility { + color:#3a5fcd; + font-size:80%; + text-decoration:underline +} +.org-diary { + color:red +} +.org-diary-anniversary { + color:#a020f0 +} +.org-diary-time { + color:sienna +} +.org-dired-async-failures { + color:red +} +.org-dired-async-message { + color:#ff0 +} +.org-dired-async-mode-message { + color:gold +} +.org-dired-directory { + color:#00f +} +.org-dired-flagged { + color:red; + font-weight:700 +} +.org-dired-header { + color:#228b22 +} +.org-dired-ignored { + color:#7f7f7f +} +.org-dired-mark { + color:#008b8b +} +.org-dired-marked { + color:#ff8c00; + font-weight:700 +} +.org-dired-perm-write { + color:#b22222 +} +.org-dired-symlink { + color:#a020f0 +} +.org-dired-warning { + color:red; + font-weight:700 +} +.org-doc { + color:#8b2252 +} +.org-eldoc-highlight-function-argument { + font-weight:700 +} +.org-epa-field-body { + font-style:italic +} +.org-epa-field-name, +.org-epa-mark { + font-weight:700 +} +.org-epa-mark { + color:red +} +.org-epa-string { + color:#00008b +} +.org-epa-validity-disabled { + font-style:italic +} +.org-epa-validity-high { + font-weight:700 +} +.org-epa-validity-low, +.org-epa-validity-medium { + font-style:italic +} +.org-error { + color:red; + font-weight:700 +} +.org-escape-glyph { + color:brown +} +.org-evil-ex-commands { + font-style:italic; + text-decoration:underline +} +.org-evil-ex-info { + color:red; + font-style:italic +} +.org-evil-ex-lazy-highlight { + background-color:#afeeee +} +.org-evil-ex-search { + color:#b0e2ff; + background-color:#cd00cd +} +.org-evil-ex-substitute-matches { + background-color:#afeeee +} +.org-evil-ex-substitute-replacement { + color:red; + text-decoration:underline +} +.org-ffap { + background-color:#b4eeb4 +} +.org-file-name-shadow { + color:#7f7f7f +} +.org-flycheck-error { + text-decoration:underline +} +.org-flycheck-error-list-checker-name { + color:#00f +} +.org-flycheck-error-list-column-number { + color:#008b8b +} +.org-flycheck-error-list-error { + color:red; + font-weight:700 +} +.org-flycheck-error-list-filename { + color:sienna +} +.org-flycheck-error-list-highlight { + background-color:#b4eeb4 +} +.org-flycheck-error-list-id, +.org-flycheck-error-list-id-with-explainer { + color:#228b22 +} +.org-flycheck-error-list-info { + color:#228b22; + font-weight:700 +} +.org-flycheck-error-list-line-number { + color:#008b8b +} +.org-flycheck-error-list-warning { + color:#ff8c00; + font-weight:700 +} +.org-flycheck-fringe-error { + color:red; + font-weight:700 +} +.org-flycheck-fringe-info { + color:#228b22; + font-weight:700 +} +.org-flycheck-fringe-warning { + color:#ff8c00; + font-weight:700 +} +.org-flycheck-info, +.org-flycheck-warning, +.org-flyspell-duplicate, +.org-flyspell-incorrect { + text-decoration:underline +} +.org-fringe { + background-color:#f2f2f2 +} +.org-function-name { + color:#00f +} +.org-glyphless-char { + font-size:60% +} +.org-golden-ratio-scroll-highlight-line { + color:#fff; + background-color:#53868b; + font-weight:700 +} +.org-header-line { + color:#333; + background-color:#e5e5e5 +} +.org-helm-action { + text-decoration:underline +} +.org-helm-bookmark-addressbook { + color:tomato +} +.org-helm-bookmark-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-bookmark-file { + color:#00b2ee +} +.org-helm-bookmark-file-not-found { + color:#6c7b8b +} +.org-helm-bookmark-gnus { + color:#f0f +} +.org-helm-bookmark-info { + color:#0f0 +} +.org-helm-bookmark-man { + color:#8b5a00 +} +.org-helm-bookmark-w3m { + color:#ff0 +} +.org-helm-buffer-archive { + color:gold +} +.org-helm-buffer-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-buffer-file { + color:#483d8b +} +.org-helm-buffer-modified { + color:#b22222 +} +.org-helm-buffer-not-saved { + color:#ee6363 +} +.org-helm-buffer-process { + color:#cd6839 +} +.org-helm-buffer-saved-out { + color:red; + background-color:#000 +} +.org-helm-buffer-size { + color:#708090 +} +.org-helm-candidate-number, +.org-helm-candidate-number-suspended { + color:#000; + background-color:#faffb5 +} +.org-helm-delete-async-message { + color:#ff0 +} +.org-helm-etags-file { + color:#8b814c; + text-decoration:underline +} +.org-helm-ff-denied { + color:red; + background-color:#000 +} +.org-helm-ff-directory { + color:#8b0000; + background-color:#d3d3d3 +} +.org-helm-ff-dirs { + color:#00f +} +.org-helm-ff-dotted-directory { + color:#000; + background-color:#696969 +} +.org-helm-ff-dotted-symlink-directory { + color:#ff8c00; + background-color:#696969 +} +.org-helm-ff-executable { + color:#0f0 +} +.org-helm-ff-file { + color:#483d8b +} +.org-helm-ff-invalid-symlink { + color:#000; + background-color:red +} +.org-helm-ff-pipe { + color:#ff0; + background-color:#000 +} +.org-helm-ff-prefix { + color:#000; + background-color:#ff0 +} +.org-helm-ff-socket { + color:#ff1493 +} +.org-helm-ff-suid { + color:#fff; + background-color:red +} +.org-helm-ff-symlink { + color:#b22222 +} +.org-helm-ff-truename { + color:#8b2252 +} +.org-helm-grep-cmd-line { + color:#228b22 +} +.org-helm-grep-file { + color:#8a2be2; + text-decoration:underline +} +.org-helm-grep-finish { + color:#0f0 +} +.org-helm-grep-lineno { + color:#ff7f00 +} +.org-helm-grep-match { + color:#b00000 +} +.org-helm-header { + color:#333; + background-color:#e5e5e5 +} +.org-helm-header-line-left-margin { + color:#000; + background-color:#ff0 +} +.org-helm-helper { + color:#333; + background-color:#e5e5e5 +} +.org-helm-history-deleted { + color:#000; + background-color:red +} +.org-helm-history-remote { + color:#ff6a6a +} +.org-helm-lisp-completion-info { + color:red +} +.org-helm-lisp-show-completion { + background-color:#2f4f4f +} +.org-helm-locate-finish { + color:#0f0 +} +.org-helm-m-x-key { + color:orange; + text-decoration:underline +} +.org-helm-match { + color:#b00000 +} +.org-helm-match-item { + color:#b0e2ff; + background-color:#cd00cd +} +.org-helm-minibuffer-prompt { + color:#0000cd +} +.org-helm-moccur-buffer { + color:#00ced1; + text-decoration:underline +} +.org-helm-non-file-buffer { + font-style:italic +} +.org-helm-prefarg { + color:red +} +.org-helm-resume-need-update { + background-color:red +} +.org-helm-selection { + background-color:#097209 +} +.org-helm-selection-line { + background-color:#b4eeb4 +} +.org-helm-separator { + color:#ffbfb5 +} +.org-helm-source-header { + color:#000; + background-color:#abd7f0; + font-size:130%; + font-weight:700 +} +.org-helm-visible-mark { + background-color:#d1f5ea +} +.org-help-argument-name { + font-style:italic +} +.org-highlight { + background-color:#b4eeb4 +} +.org-highlight-indent-guides-character { + color:#e6e6e6 +} +.org-highlight-indent-guides-even { + background-color:#e6e6e6 +} +.org-highlight-indent-guides-odd { + background-color:#f3f3f3 +} +.org-highlight-indent-guides-stack-character { + color:#ccc +} +.org-highlight-indent-guides-stack-even { + background-color:#ccc +} +.org-highlight-indent-guides-stack-odd { + background-color:#d9d9d9 +} +.org-highlight-indent-guides-top-character { + color:#b3b3b3 +} +.org-highlight-indent-guides-top-even { + background-color:#b3b3b3 +} +.org-highlight-indent-guides-top-odd { + background-color:silver +} +.org-highlight-numbers-number { + color:#008b8b +} +.org-hl-line { + background-color:#b4eeb4 +} +.org-holiday { + background-color:pink +} +.org-hydra-face-amaranth { + color:#e52b50; + font-weight:700 +} +.org-hydra-face-blue { + color:#00f; + font-weight:700 +} +.org-hydra-face-pink { + color:#ff6eb4; + font-weight:700 +} +.org-hydra-face-red { + color:red; + font-weight:700 +} +.org-hydra-face-teal { + color:#367588; + font-weight:700 +} +.org-ido-first-match { + font-weight:700 +} +.org-ido-incomplete-regexp { + color:red; + font-weight:700 +} +.org-ido-indicator { + color:#ff0; + background-color:red +} +.org-ido-only-match { + color:#228b22 +} +.org-ido-subdir { + color:red +} +.org-ido-virtual { + color:#483d8b +} +.org-info-header-node { + color:brown; + font-weight:700; + font-style:italic +} +.org-info-header-xref { + color:#3a5fcd; + text-decoration:underline +} +.org-info-index-match { + background-color:#ff0 +} +.org-info-menu-header { + font-weight:700 +} +.org-info-menu-star { + color:red +} +.org-info-node { + color:brown; + font-weight:700; + font-style:italic +} +.org-info-title-1 { + font-size:172%; + font-weight:700 +} +.org-info-title-2 { + font-size:144%; + font-weight:700 +} +.org-info-title-3 { + font-size:120%; + font-weight:700 +} +.org-info-title-4 { + font-weight:700 +} +.org-info-xref { + color:#3a5fcd; + text-decoration:underline +} +.org-isearch { + color:#b0e2ff; + background-color:#cd00cd +} +.org-isearch-fail { + background-color:#ffc1c1 +} +.org-italic { + font-style:italic +} +.org-keyword { + color:#a020f0 +} +.org-lazy-highlight { + background-color:#afeeee +} +.org-link { + color:#3a5fcd; + text-decoration:underline +} +.org-link-visited { + color:#8b008b; + text-decoration:underline +} +.org-lv-separator { + background-color:#ccc +} +.org-match { + background-color:#ff0 +} +.org-mcXcursor-bar { + background-color:#000 +} +.org-mcXregion { + background-color:gtk_selection_bg_color +} +.org-me-dired-dim-0 { + color:#b3b3b3 +} +.org-me-dired-dim-1 { + color:#7f7f7f +} +.org-me-dired-executable { + color:#0f0 +} +.org-message-cited-text { + color:red +} +.org-message-header-cc { + color:#191970 +} +.org-message-header-name { + color:#6495ed +} +.org-message-header-newsgroups { + color:#00008b; + font-weight:700; + font-style:italic +} +.org-message-header-other { + color:#4682b4 +} +.org-message-header-subject { + color:navy; + font-weight:700 +} +.org-message-header-to { + color:#191970; + font-weight:700 +} +.org-message-header-xheader { + color:#00f +} +.org-message-mml { + color:#228b22 +} +.org-message-separator { + color:brown +} +.org-minibuffer-prompt { + color:#0000cd +} +.org-mm-command-output { + color:#cd0000 +} +.org-mode-line { + color:#000; + background-color:#bfbfbf +} +.org-mode-line-buffer-id, +.org-mode-line-buffer-id-inactive, +.org-mode-line-emphasis { + font-weight:700 +} +.org-mode-line-inactive { + color:#333; + background-color:#e5e5e5 +} +.org-mu4e-attach-number { + color:sienna; + font-weight:700 +} +.org-mu4e-cited-1 { + color:#483d8b; + font-style:italic +} +.org-mu4e-cited-2 { + color:#5cacee; + font-style:italic +} +.org-mu4e-cited-3 { + color:sienna; + font-style:italic +} +.org-mu4e-cited-4 { + color:#a020f0; + font-style:italic +} +.org-mu4e-cited-5, +.org-mu4e-cited-6 { + color:#b22222; + font-style:italic +} +.org-mu4e-cited-7 { + color:#228b22; + font-style:italic +} +.org-mu4e-compose-header, +.org-mu4e-compose-separator { + color:brown; + font-style:italic +} +.org-mu4e-contact { + color:sienna +} +.org-mu4e-context { + color:#006400; + font-weight:700 +} +.org-mu4e-draft { + color:#8b2252 +} +.org-mu4e-flagged { + color:#008b8b; + font-weight:700 +} +.org-mu4e-footer { + color:#b22222 +} +.org-mu4e-forwarded { + color:#483d8b +} +.org-mu4e-header { + color:#000; + background-color:#fff +} +.org-mu4e-header-highlight { + background-color:#000; + font-weight:700; + text-decoration:underline +} +.org-mu4e-header-key { + color:#6495ed; + font-weight:700 +} +.org-mu4e-header-marks { + color:#483d8b +} +.org-mu4e-header-title, +.org-mu4e-header-value { + color:#228b22 +} +.org-mu4e-highlight { + background-color:#b4eeb4 +} +.org-mu4e-link { + color:#3a5fcd; + text-decoration:underline +} +.org-mu4e-modeline { + color:#8b4500; + font-weight:700 +} +.org-mu4e-moved { + color:#b22222; + font-style:italic +} +.org-mu4e-ok { + color:#b22222; + font-weight:700 +} +.org-mu4e-region-code { + background-color:#2f4f4f +} +.org-mu4e-replied, +.org-mu4e-special-header-value { + color:#483d8b +} +.org-mu4e-system { + color:#b22222; + font-style:italic +} +.org-mu4e-title { + color:#228b22; + font-weight:700 +} +.org-mu4e-trashed { + color:#b22222; + text-decoration:line-through +} +.org-mu4e-unread { + color:#a020f0; + font-weight:700 +} +.org-mu4e-url-number { + color:#008b8b; + font-weight:700 +} +.org-mu4e-view-body { + color:#000; + background-color:#fff +} +.org-mu4e-warning { + color:red; + font-weight:700 +} +.org-next-error { + background-color:gtk_selection_bg_color +} +.org-nobreak-space { + color:brown; + text-decoration:underline +} +.org-org-agenda-calendar-event, +.org-org-agenda-calendar-sexp { + color:#000; + background-color:#fff +} +.org-org-agenda-clocking { + background-color:#ff0 +} +.org-org-agenda-column-dateline { + background-color:#e5e5e5 +} +.org-org-agenda-current-time { + color:#b8860b +} +.org-org-agenda-date { + color:#00f +} +.org-org-agenda-date-today { + color:#00f; + font-weight:700; + font-style:italic +} +.org-org-agenda-date-weekend { + color:#00f; + font-weight:700 +} +.org-org-agenda-diary { + color:#000; + background-color:#fff +} +.org-org-agenda-dimmed-todo { + color:#7f7f7f +} +.org-org-agenda-done { + color:#228b22 +} +.org-org-agenda-filter-category, +.org-org-agenda-filter-effort, +.org-org-agenda-filter-regexp, +.org-org-agenda-filter-tags { + color:#000; + background-color:#bfbfbf +} +.org-org-agenda-restriction-lock { + background-color:#eee +} +.org-org-agenda-structure { + color:#00f +} +.org-org-archived { + color:#7f7f7f +} +.org-org-block { + color:#7f7f7f +} +.org-org-block-begin-line, +.org-org-block-end-line { + color:#b22222 +} +.org-org-checkbox { + font-weight:700 +} +.org-org-checkbox-statistics-done { + color:#228b22; + font-weight:700 +} +.org-org-checkbox-statistics-todo { + color:red; + font-weight:700 +} +.org-org-clock-overlay { + color:#000; + background-color:#d3d3d3 +} +.org-org-code { + color:#7f7f7f +} +.org-org-column, +.org-org-column-title { + background-color:#e5e5e5 +} +.org-org-column-title { + font-weight:700; + text-decoration:underline +} +.org-org-date { + color:#bfaf87; + text-decoration:underline +} +.org-org-date-selected { + color:red +} +.org-org-default { + color:#000; + background-color:#fff +} +.org-org-document-info { + color:#191970 +} +.org-org-document-info-keyword { + color:#7f7f7f +} +.org-org-document-title { + color:#191970; + font-weight:700 +} +.org-org-done { + color:#228b22; + font-weight:700 +} +.org-org-drawer { + color:#00f +} +.org-org-ellipsis { + color:#b8860b; + text-decoration:underline +} +.org-org-footnote { + color:#96b4cd; + text-decoration:underline +} +.org-org-formula { + color:#b22222 +} +.org-org-habit-alert { + background-color:#f5f946 +} +.org-org-habit-alert-future { + background-color:#fafca9 +} +.org-org-habit-clear { + background-color:#8270f9 +} +.org-org-habit-clear-future { + background-color:#d6e4fc +} +.org-org-habit-overdue { + background-color:#f9372d +} +.org-org-habit-overdue-future { + background-color:#fc9590 +} +.org-org-habit-ready { + background-color:#4df946 +} +.org-org-habit-ready-future { + background-color:#acfca9 +} +.org-org-headline-done { + color:#bc8f8f +} +.org-org-hide { + color:#fff +} +.org-org-latex-and-related { + color:#8b4513 +} +.org-org-level-1 { + color:#edd1c5 +} +.org-org-level-2 { + color:#ebebb7 +} +.org-org-level-3 { + color:#cce8cc +} +.org-org-level-4 { + color:#c9deec +} +.org-org-level-5 { + color:#dce3e8 +} +.org-org-level-6 { + color:#dde6dd +} +.org-org-level-7 { + color:#e8e8ce +} +.org-org-level-8 { + color:#e8dedb +} +.org-org-link { + color:#c5d2dc; + text-decoration:underline +} +.org-org-list-dt { + font-weight:700 +} +.org-org-macro { + color:#8b4513 +} +.org-org-meta-line { + color:#b22222 +} +.org-org-mode-line-clock { + color:#000; + background-color:#bfbfbf +} +.org-org-mode-line-clock-overrun { + color:#000; + background-color:red +} +.org-org-priority { + color:#a020f0 +} +.org-org-quote { + color:#7f7f7f +} +.org-org-ref-acronym { + color:#ee7600; + text-decoration:underline +} +.org-org-ref-cite { + color:#c3d5c3; + text-decoration:underline +} +.org-org-ref-glossary { + color:#8968cd; + text-decoration:underline +} +.org-org-ref-label { + color:#8b008b; + text-decoration:underline +} +.org-org-ref-ref { + color:#e1cc96; + text-decoration:underline +} +.org-org-scheduled { + color:#006400 +} +.org-org-scheduled-previously { + color:#b22222 +} +.org-org-scheduled-today { + color:#006400 +} +.org-org-sexp-date { + color:#a020f0 +} +.org-org-special-keyword { + color:#88949f +} +.org-org-table { + color:#00f +} +.org-org-tag, +.org-org-tag-group { + font-weight:700 +} +.org-org-target { + text-decoration:underline +} +.org-org-time-grid { + color:#b8860b +} +.org-org-todo { + color:red; + font-weight:700 +} +.org-org-upcoming-deadline { + color:#b22222 +} +.org-org-verbatim, +.org-org-verse { + color:#7f7f7f +} +.org-org-warning { + color:red; + font-weight:700 +} +.org-outline-1 { + color:#00f +} +.org-outline-2 { + color:sienna +} +.org-outline-3 { + color:#a020f0 +} +.org-outline-4 { + color:#b22222 +} +.org-outline-5 { + color:#228b22 +} +.org-outline-6 { + color:#008b8b +} +.org-outline-7 { + color:#483d8b +} +.org-outline-8 { + color:#8b2252 +} +.org-package-description { + color:#000; + background-color:#fff +} +.org-package-name { + color:#3a5fcd; + text-decoration:underline +} +.org-package-status-avail-obso { + color:#b22222 +} +.org-package-status-available { + color:#000; + background-color:#fff +} +.org-package-status-built-in { + color:#483d8b +} +.org-package-status-dependency { + color:#b22222 +} +.org-package-status-disabled { + color:red; + font-weight:700 +} +.org-package-status-external { + color:#483d8b +} +.org-package-status-held { + color:#008b8b +} +.org-package-status-incompat, +.org-package-status-installed { + color:#b22222 +} +.org-package-status-unsigned { + color:red; + font-weight:700 +} +.org-pdf-isearch-batch { + background-color:#ff0 +} +.org-pdf-isearch-lazy { + background-color:#afeeee +} +.org-pdf-isearch-match { + color:#b0e2ff; + background-color:#cd00cd +} +.org-pdf-occur-document { + color:#8b2252 +} +.org-pdf-occur-page { + color:#228b22 +} +.org-pdf-view-rectangle { + background-color:#b4eeb4 +} +.org-pdf-view-region { + background-color:gtk_selection_bg_color +} +.org-powerline-active0 { + color:#000; + background-color:#bfbfbf +} +.org-powerline-active1 { + color:#fff; + background-color:#2b2b2b +} +.org-powerline-active2 { + color:#fff; + background-color:#666 +} +.org-powerline-inactive0 { + color:#333; + background-color:#e5e5e5 +} +.org-powerline-inactive1 { + color:#333; + background-color:#1c1c1c +} +.org-powerline-inactive2 { + color:#333; + background-color:#333 +} +.org-preprocessor { + color:#483d8b +} +.org-query-replace { + color:#b0e2ff; + background-color:#cd00cd +} +.org-rainbow-delimiters-depth-1 { + color:#ffdead +} +.org-rainbow-delimiters-depth-2 { + color:#00bfff +} +.org-rainbow-delimiters-depth-3 { + color:#ffdead +} +.org-rainbow-delimiters-depth-4 { + color:#00bfff +} +.org-rainbow-delimiters-depth-5 { + color:#ffdead +} +.org-rainbow-delimiters-depth-6 { + color:#00bfff +} +.org-rainbow-delimiters-depth-7 { + color:#ffdead +} +.org-rainbow-delimiters-depth-8 { + color:#00bfff +} +.org-rainbow-delimiters-depth-9 { + color:#ffdead +} +.org-rainbow-delimiters-unmatched { + color:#88090b +} +.org-reb-match-0 { + background-color:#add8e6 +} +.org-reb-match-1 { + background-color:#7fffd4 +} +.org-reb-match-2 { + background-color:#00ff7f +} +.org-reb-match-3 { + background-color:#ff0 +} +.org-rectangle-preview { + background-color:gtk_selection_bg_color +} +.org-regexp-grouping-backslash, +.org-regexp-grouping-construct { + font-weight:700 +} +.org-region { + background-color:gtk_selection_bg_color +} +.org-secondary-selection { + background-color:#ff0 +} +.org-semantic-highlight-edits, +.org-semantic-highlight-func-current-tag { + background-color:#e5e5e5 +} +.org-semantic-unmatched-syntax { + text-decoration:underline +} +.org-sgml-namespace { + color:#483d8b +} +.org-sh-escaped-newline { + color:#8b2252 +} +.org-sh-heredoc { + color:#ee0 +} +.org-sh-quoted-exec { + color:#f0f +} +.org-shadow { + color:#7f7f7f +} +.org-show-paren-match { + background-color:#40e0d0 +} +.org-show-paren-mismatch { + color:#fff; + background-color:#a020f0 +} +.org-sp-pair-overlay, +.org-sp-show-pair-enclosing { + background-color:#b4eeb4 +} +.org-sp-show-pair-match { + background-color:#40e0d0 +} +.org-sp-show-pair-mismatch { + color:#fff; + background-color:#a020f0 +} +.org-sp-wrap-overlay { + background-color:#b4eeb4 +} +.org-sp-wrap-overlay-closing-pair { + color:red; + background-color:#b4eeb4 +} +.org-sp-wrap-overlay-opening-pair { + color:#0f0; + background-color:#b4eeb4 +} +.org-sp-wrap-tag-overlay { + background-color:#b4eeb4 +} +.org-spaceline-flycheck-error { + color:#fc5c94; + background-color:#333 +} +.org-spaceline-flycheck-info { + color:#8de6f7; + background-color:#333 +} +.org-spaceline-flycheck-warning { + color:#f3ea98; + background-color:#333 +} +.org-spaceline-python-venv { + color:#fbf +} +.org-speedbar-button { + color:#008b00 +} +.org-speedbar-directory { + color:#00008b +} +.org-speedbar-file { + color:#008b8b +} +.org-speedbar-highlight { + background-color:#0f0 +} +.org-speedbar-selected { + color:red; + text-decoration:underline +} +.org-speedbar-separator { + color:#fff; + background-color:#00f; + text-decoration:overline +} +.org-speedbar-tag { + color:brown +} +.org-string { + color:#8b2252 +} +.org-success { + color:#228b22; + font-weight:700 +} +.org-table-cell { + color:#e5e5e5; + background-color:#00f +} +.org-tex-math { + color:#8b2252 +} +.org-tool-bar { + color:#000; + background-color:#bfbfbf +} +.org-tooltip { + color:#000; + background-color:#ffffe0 +} +.org-trailing-whitespace { + background-color:red +} +.org-tty-menu-disabled { + color:#d3d3d3; + background-color:#00f +} +.org-tty-menu-enabled { + color:#ff0; + background-color:#00f; + font-weight:700 +} +.org-tty-menu-selected { + background-color:red +} +.org-type { + color:#228b22 +} +.org-underline { + text-decoration:underline +} +.org-undo-tree-visualizer-active-branch { + color:#000; + font-weight:700 +} +.org-undo-tree-visualizer-current { + color:red +} +.org-undo-tree-visualizer-default { + color:#bebebe +} +.org-undo-tree-visualizer-register { + color:#ff0 +} +.org-undo-tree-visualizer-unmodified { + color:#0ff +} +.org-variable-name { + color:sienna +} +.org-vhlXdefault { + background-color:#ff0 +} +.org-warning { + color:#ff8c00; + font-weight:700 +} +.org-warning-1 { + color:red; + font-weight:700 +} +.org-wgrep { + color:#fff; + background-color:#228b22 +} +.org-wgrep-delete { + color:pink; + background-color:#228b22 +} +.org-wgrep-done { + color:#00f +} +.org-wgrep-file { + color:#fff; + background-color:#228b22 +} +.org-wgrep-reject { + color:red; + font-weight:700 +} +.org-which-key-command-description { + color:#00f +} +.org-which-key-docstring { + color:#b22222 +} +.org-which-key-group-description { + color:#a020f0 +} +.org-which-key-highlighted-command { + color:#00f; + text-decoration:underline +} +.org-which-key-key { + color:#008b8b +} +.org-which-key-local-map-description { + color:#00f +} +.org-which-key-note, +.org-which-key-separator { + color:#b22222 +} +.org-which-key-special-key { + color:#008b8b; + font-weight:700 +} +.org-whitespace-big-indent { + color:#b22222; + background-color:red +} +.org-whitespace-empty { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-hspace { + color:#d3d3d3; + background-color:#cdc9a5 +} +.org-whitespace-indentation { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-line { + color:violet; + background-color:#333 +} +.org-whitespace-newline { + color:#d3d3d3 +} +.org-whitespace-space { + color:#d3d3d3; + background-color:#ffffe0 +} +.org-whitespace-space-after-tab { + color:#b22222; + background-color:#ff0 +} +.org-whitespace-space-before-tab { + color:#b22222; + background-color:#ff8c00 +} +.org-whitespace-tab { + color:#d3d3d3; + background-color:beige +} +.org-whitespace-trailing { + color:#ff0; + background-color:red; + font-weight:700 +} +.org-widget-button { + font-weight:700 +} +.org-widget-button-pressed { + color:red +} +.org-widget-documentation { + color:#006400 +} +.org-widget-field { + background-color:#d9d9d9 +} +.org-widget-inactive { + color:#7f7f7f +} +.org-widget-single-line-field { + background-color:#d9d9d9 +} +.org-window-divider { + color:#999 +} +.org-window-divider-first-pixel { + color:#ccc +} +.org-window-divider-last-pixel { + color:#666 +} +a { + color:inherit; + background-color:inherit; + font:inherit; + text-decoration:inherit +} +a:hover { + text-decoration:underline +} +body { + //width:95%; + //margin:2% auto; + font-size:14px; + line-height:1.4em; + font-family:Georgia,serif; + color:#333 +} +@media screen and (min-width:600px) { + body { + font-size:18px + } +} +@media screen and (min-width:600px) { + body { + /*! width:900px; */ + } +} +::-moz-selection { + background:#d6edff +} +::selection { + background:#d6edff +} +p { + margin:1em auto +} +dl, +ol, +ul { + margin:0 auto +} +.title { + margin:.8em auto; + color:#000 +} +.subtitle, +.title { + text-align:center +} +.subtitle { + font-size:1.1em; + line-height:1.4; + font-weight:700; + margin:1em auto +} +.abstract { + margin:auto; + width:80%; + font-style:italic +} +.abstract p:last-of-type:before { + content:" "; + white-space:pre +} +.status { + font-size:90%; + // margin:2em auto +} +[class^=section-number-] { + margin-right:.5em +} +[id^=orgheadline] { + clear:both +} +#footnotes { + font-size:90% +} +.footpara { + display:inline; + margin:.2em auto +} +.footdef { + margin-bottom:1em +} +.footdef sup { + padding-right:.5em +} +a { + color:#527d9a; + text-decoration:none +} +a:hover { + color:#035; + border-bottom:1px dotted +} +figure { + padding:0; + margin:1em auto; + text-align:center +} +img { + max-width:100%; + vertical-align:middle +} +.MathJax_Display { + margin:0!important; + width:90%!important +} +h1, +h2, +h3, +h4, +h5, +h6 { + color:#a5573e; + line-height:1em; + font-family:Helvetica,sans-serif +} +h1, +h2, +h3 { + line-height:1.4em +} +h4, +h5, +h6 { + font-size:1em +} +@media screen and (min-width:600px) { + h1 { + font-size:2em + } + h2 { + font-size:1.5em + } + h3 { + font-size:1.3em + } + h1, + h2, + h3 { + line-height:1.4em + } + h4, + h5, + h6 { + font-size:1.1em + } +} +dt { + font-weight:700 +} +table { + margin:1em auto; + border-top:2px solid; + border-collapse:collapse +} +table, +thead { + border-bottom:2px solid +} +table td+td, +table th+th { + border-left:1px solid grey +} +table tr { + border-top:1px solid #d3d3d3 +} +td, +th { + padding:.3em .6em; + vertical-align:middle +} +caption.t-above { + caption-side:top +} +caption.t-bottom { + caption-side:bottom +} +caption { + margin-bottom:.3em +} +figcaption { + margin-top:.3em +} +th.org-center, +th.org-left, +th.org-right { + text-align:center +} +td.org-right { + text-align:right +} +td.org-left { + text-align:left +} +td.org-center { + text-align:center +} +blockquote { + margin:1em 2em; + padding-left:1em; + border-left:3px solid #ccc +} +kbd { + background-color:#f7f7f7; + font-size:80%; + margin:0 .1em; + padding:.1em .6em +} +.todo { + background-color:red +} +.done, +.todo { + color:#fff; + padding:.1em .3em; + border-radius:3px; + background-clip:padding-box; + font-size:80%; + font-family:Lucida Console,monospace; + line-height:1 +} +.done { + background-color:green +} +.priority { + color:orange; + font-family:Lucida Console,monospace +} +.tag { + font-family:Lucida Console,monospace; + font-size:.7em; + font-weight:400 +} +.tag span { + padding:.3em; + float:right; + margin-right:.5em; + border:1px solid #bbb; + border-radius:3px; + background-clip:padding-box; + color:#333; + background-color:#eee; + line-height:1 +} +.timestamp { + color:#bebebe; + font-size:90% +} +.timestamp-kwd { + color:#5f9ea0 +} +.org-right { + margin-left:auto; + margin-right:0; + text-align:right +} +.org-left { + margin-left:0; + margin-right:auto; + text-align:left +} +.org-center { + margin-left:auto; + margin-right:auto; + text-align:center +} +.underline { + text-decoration:underline +} +#postamble p, +#preamble p { + font-size:90%; + margin:.2em +} +p.verse { + margin-left:3% +} +:not(pre)>code { + padding:2px 5px; + margin:auto 1px; + border:1px solid #ddd; + border-radius:3px; + background-clip:padding-box; + color:#333; + font-size:80% +} +.org-src-container { + border:1px solid #ccc; + box-shadow:3px 3px 3px #eee; + font-family:Lucida Console,monospace; + font-size:80%; + margin:1em auto; + padding:.1em .5em; + position:relative +} +.org-src-container>pre { + overflow:auto +} +.org-src-container>pre:before { + display:block; + position:absolute; + background-color:#b3b3b3; + top:0; + right:0; + padding:0 .5em; + border-bottom-left-radius:8px; + border:0; + color:#fff; + font-size:80% +} +.org-src-container>pre.src-sh:before { + content:"sh" +} +.org-src-container>pre.src-bash:before { + content:"bash" +} +.org-src-container>pre.src-emacs-lisp:before { + content:"Emacs Lisp" +} +.org-src-container>pre.src-R:before { + content:"R" +} +.org-src-container>pre.src-cpp:before { + content:"C++" +} +.org-src-container>pre.src-c:before { + content:"C" +} +.org-src-container>pre.src-html:before { + content:"HTML" +} +.org-src-container>pre.src-javascript:before, +.org-src-container>pre.src-js:before { + content:"Javascript" +} +// More languages 0% http://orgmode.org/worg/org-contrib/babel/languages.html .org-src-container>pre.src-abc:before { + content:"ABC" +} +.org-src-container>pre.src-asymptote:before { + content:"Asymptote" +} +.org-src-container>pre.src-awk:before { + content:"Awk" +} +.org-src-container>pre.src-C:before { + content:"C" +} +.org-src-container>pre.src-calc:before { + content:"Calc" +} +.org-src-container>pre.src-clojure:before { + content:"Clojure" +} +.org-src-container>pre.src-comint:before { + content:"comint" +} +.org-src-container>pre.src-css:before { + content:"CSS" +} +.org-src-container>pre.src-D:before { + content:"D" +} +.org-src-container>pre.src-ditaa:before { + content:"Ditaa" +} +.org-src-container>pre.src-dot:before { + content:"Dot" +} +.org-src-container>pre.src-ebnf:before { + content:"ebnf" +} +.org-src-container>pre.src-forth:before { + content:"Forth" +} +.org-src-container>pre.src-F90:before { + content:"Fortran" +} +.org-src-container>pre.src-gnuplot:before { + content:"Gnuplot" +} +.org-src-container>pre.src-haskell:before { + content:"Haskell" +} +.org-src-container>pre.src-io:before { + content:"Io" +} +.org-src-container>pre.src-java:before { + content:"Java" +} +.org-src-container>pre.src-latex:before { + content:"LaTeX" +} +.org-src-container>pre.src-ledger:before { + content:"Ledger" +} +.org-src-container>pre.src-ly:before { + content:"Lilypond" +} +.org-src-container>pre.src-lisp:before { + content:"Lisp" +} +.org-src-container>pre.src-makefile:before { + content:"Make" +} +.org-src-container>pre.src-matlab:before { + content:"Matlab" +} +.org-src-container>pre.src-max:before { + content:"Maxima" +} +.org-src-container>pre.src-mscgen:before { + content:"Mscgen" +} +.org-src-container>pre.src-Caml:before { + content:"Objective" +} +.org-src-container>pre.src-octave:before { + content:"Octave" +} +.org-src-container>pre.src-org:before { + content:"Org" +} +.org-src-container>pre.src-perl:before { + content:"Perl" +} +.org-src-container>pre.src-picolisp:before { + content:"Picolisp" +} +.org-src-container>pre.src-plantuml:before { + content:"PlantUML" +} +.org-src-container>pre.src-python:before { + content:"Python" +} +.org-src-container>pre.src-ruby:before { + content:"Ruby" +} +.org-src-container>pre.src-sass:before { + content:"Sass" +} +.org-src-container>pre.src-scala:before { + content:"Scala" +} +.org-src-container>pre.src-scheme:before { + content:"Scheme" +} +.org-src-container>pre.src-screen:before { + content:"Screen" +} +.org-src-container>pre.src-sed:before { + content:"Sed" +} +.org-src-container>pre.src-shell:before { + content:"shell" +} +.org-src-container>pre.src-shen:before { + content:"Shen" +} +.org-src-container>pre.src-sql:before { + content:"SQL" +} +.org-src-container>pre.src-sqlite:before { + content:"SQLite" +} +.org-src-container>pre.src-stan:before { + content:"Stan" +} +.org-src-container>pre.src-vala:before { + content:"Vala" +} +.org-src-container>pre.src-axiom:before { + content:"Axiom" +} +.org-src-container>pre.src-browser:before { + content:"HTML" +} +.org-src-container>pre.src-cypher:before { + content:"Neo4j" +} +.org-src-container>pre.src-elixir:before { + content:"Elixir" +} +.org-src-container>pre.src-request:before { + content:"http" +} +.org-src-container>pre.src-ipython:before { + content:"iPython" +} +.org-src-container>pre.src-kotlin:before { + content:"Kotlin" +} +.org-src-container>pre.src-Flavored Erlang lfe:before { + content:"Lisp" +} +.org-src-container>pre.src-mongo:before { + content:"MongoDB" +} +.org-src-container>pre.src-prolog:before { + content:"Prolog" +} +.org-src-container>pre.src-rec:before { + content:"rec" +} +.org-src-container>pre.src-ML sml:before { + content:"Standard" +} +.org-src-container>pre.src-Translate translate:before { + content:"Google" +} +.org-src-container>pre.src-typescript:before { + content:"Typescript" +} +.org-src-container>pre.src-rust:before { + content:"Rust" +} +.inlinetask { + background:#ffc; + border:2px solid grey; + margin:10px; + padding:10px +} +#org-div-home-and-up { + font-size:70%; + text-align:right; + white-space:nowrap +} +.linenr { + font-size:90% +} +.code-highlighted { + background-color:#ff0 +} +#bibliography { + font-size:90% +} +#bibliography table { + width:100% +} +.creator { + display:block +} +@media screen and (min-width:600px) { + .creator { + display:inline; + float:right + } +} diff --git a/output/assets/styles/style.css b/output/assets/styles/style.css new file mode 100755 index 0000000..43655ac --- /dev/null +++ b/output/assets/styles/style.css @@ -0,0 +1,716 @@ +/* ========================================================= + TOKENS / CUSTOM PROPERTIES + ========================================================= */ + +:root { + --gutter: 2rem; + --margin: 420px; + --body-pad: 1rem; + + --content-min: 60ch; + --content-max: 880px; + --content: clamp( + var(--content-min), + calc(100vi - (2 * var(--body-pad)) - (2 * (var(--margin) + var(--gutter)))), + var(--content-max) + ); + + --bleed: 48px; + --fullwidth-cap: 860px; + + --bg: #333; + --page-bg: #444; + --fg: #f3f3f3; + + --heading: #f9f9f9; + --link: lightblue; + --link-2: var(--link); + + --code-bg: #f0f0f0; + + --border: #d7d7d7; + --active-toc: #cacaca; + + --muted: #666; + --note-color: #555; + --note-bg: transparent; + + --chip-bg: #f0f0f0; + --chip-fg: #444; + + /* Compatibility aliases (you reference these later) */ + --border-color: var(--border); + --text-color: var(--fg); + --muted-text: var(--muted); + --link-color: var(--link); + --link-hover-color: var(--fg); + --bg-alt: #2a2a2a; +} + +/* ========================================================= + BASE / TYPOGRAPHY + ========================================================= */ + +html, +body { + margin: 0; + background-color: var(--page-bg); + color: var(--fg); + transition: background-color 0.3s, color 0.3s; + font-family: Inter, sans-serif; +} + +/* Keep your layout intent (column app shell) */ +body { + display: flex; + flex-direction: column; +} + +h1, +h2, +h3 { + color: var(--heading); +} + +a { + color: var(--link-2); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* ========================================================= + PREAMBLE / HEADER + ========================================================= */ + +#preamble { + top: 0; + z-index: 20; + background: var(--bg); + border-bottom: 1px dotted var(--border); +} + +#preamble .banner-header, +#preamble #updated { + max-width: 100%; +} + +.banner-header { + position: relative; /* anchor for Close All */ + display: flex; + justify-content: flex-start; /* align to left */ + align-items: center; + gap: 1rem; + + padding: 0.5rem 1rem; +} + +.banner-left { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; +} + +.banner-logo { + height: 80px; + width: auto; + border-radius: 50%; +} + +nav { + display: flex; + gap: 1rem; + font-weight: 600; + font-size: 1.1rem; +} + +#updated { + font-size: 0.75rem; + color: color-mix(in oklab, var(--muted) 30%, var(--fg) 70%); + white-space: nowrap; + text-align: center; +} + +#close-all { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + + background: transparent; + border: 1px solid var(--border); + border-radius: 4px; + + padding: 0.25rem 0.5rem; /* smaller so it doesn't dominate */ + font-size: 0.8rem; + color: color-mix(in oklab, var(--muted) 40%, var(--fg) 60%); + cursor: pointer; +} + +#close-all:hover { + color: var(--fg); + border-color: var(--fg); +} + +.banner-header > a { + display: flex; + align-items: center; +} + + +@media (max-width: 768px) { + .banner-header { + flex-direction: column; + gap: 0.75rem; + text-align: center; + align-items: center; + } + + .banner-left { + margin: 0 auto; + } + + .banner-logo { + margin: 0; + } + + #close-all { + position: static; + transform: none; + } +} + + +/* ========================================================= + CONTENT WRAPPER + ========================================================= */ + +#content.content { + max-width: var(--content); + margin-left: auto !important; + margin-right: auto !important; + padding-left: var(--body-pad); + padding-right: var(--body-pad); + box-sizing: content-box; + position: relative; +} + +/* ========================================================= + TITLE SECTION + ========================================================= */ + +.title-section { + border: 1px solid var(--border); + border-radius: 6px; + padding: 1.5rem; + padding-right: 8rem; /* Extra padding on right for controls */ + margin-bottom: 2rem; + background-color: color-mix(in oklab, var(--bg) 96%, var(--fg) 4%); + position: relative; /* For absolute positioning of controls */ +} + +.title-section .title { + margin: 0 0 1rem 0; + padding-bottom: 1rem; + border-bottom: 1px dotted var(--border); +} + +.title-metadata { + display: flex; + flex-wrap: wrap; + gap: 1.5rem; + font-size: 0.9rem; +} + +.metadata-item { + display: flex; + align-items: baseline; + gap: 0.5rem; +} + +.metadata-label { + color: var(--muted); + font-style: italic; + font-weight: 500; +} + +.metadata-value { + color: var(--fg); + font-weight: 400; +} + +#content .figure, +#content img:not(.fullwidth) { + max-width: 100%; + height: auto; +} + +/* ========================================================= + STACKED PANE LAYOUT + ========================================================= */ + +#stack-root { + position: relative; + width: 100vw; + height: calc(100vh - 120px); + overflow-x: auto; + overflow-y: hidden; + flex: 1 1 auto; + scroll-snap-type: x proximity; +} + +.stack-track { + display: flex; + flex-direction: row; + align-items: stretch; + width: max-content; + height: 100%; +} + +.stack-pane { + flex: 0 0 auto; + + width: clamp(420px, 33vw, 860px); + max-width: 100vw; + + height: 100%; + overflow-y: auto; + overflow-x: hidden; + + position: relative; /* needed for ::after positioning */ + background-color: var(--bg); + border-right: 1px dotted var(--border); +} + +.stack-pane::after { + content: ""; + position: absolute; + top: 0; + right: 0; + width: 12px; + height: 100%; + pointer-events: none; + opacity: 0.15; +} + +.stack-pane:last-child { + box-shadow: -4px 0 16px color-mix(in oklab, var(--fg) 6%, transparent); +} + +/* Scrollbar (WebKit) */ +.stack-pane::-webkit-scrollbar { + width: 8px; +} + +.stack-pane::-webkit-scrollbar-thumb { + background-color: color-mix(in oklab, var(--fg) 25%, transparent); + border-radius: 4px; +} + +/* ========================================================= + PANE HEADER + CLOSE BUTTON + ========================================================= */ + +.pane-root { + background-color: var(--bg); +} + +.pane-header { + display: none; /* Hide the old pane-header */ +} + +/* Title section controls */ +.title-controls { + position: absolute; + top: 1.5rem; + right: 1.5rem; + display: flex; + gap: 0.5rem; + z-index: 10; +} + +.title-controls button { + background: none; + border: 1px solid var(--border); + border-radius: 4px; + font-size: 0.9rem; + line-height: 1; + cursor: pointer; + color: var(--muted); + padding: 0.3rem 0.6rem; + transition: color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease; +} + +.title-controls button:hover { + color: var(--fg); + border-color: var(--fg); + background-color: color-mix(in oklab, var(--bg) 90%, var(--fg) 10%); +} + +.pane-close { + font-size: 1.2rem; +} + +.pane-fullscreen, +.pane-edit { + font-weight: 500; +} + +/* ========================================================= + FOOTER + ========================================================= */ + +footer { + color: var(--fg); + padding: 1rem; + border-radius: 6px; + text-align: center; + font-size: 0.9rem; + font-style: italic; + + flex-shrink: 0; + margin-top: 0; + + border-top: 1px dotted var(--border); + background: var(--bg); + + /* If you want it sticky later, use: + position: sticky; + bottom: 0; + */ + bottom: 0; + z-index: 10; +} + +/* ========================================================= + LISTS + ========================================================= */ + +ul, +ol { + margin: 1rem 0 1.5rem 1.5rem; + padding: 0; + line-height: 1.5; +} + +ul { + list-style: none; +} + +ul li { + position: relative; + padding-left: 1.2em; +} + +ul li::before { + content: "•"; + position: absolute; + left: 0; + top: 0; + color: var(--heading); + font-weight: bold; +} + +ol { + counter-reset: list-counter; + list-style: none; +} + +ol li { + counter-increment: list-counter; + position: relative; + padding-left: 1.8em; +} + +ol li::before { + content: counter(list-counter) "."; + position: absolute; + left: 0; + top: 0; + color: var(--heading); + font-weight: bold; +} + +li { + margin-bottom: 8px; + display: flow-root; +} + +li::after { + content: none; +} + +li ul, +li ol { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +li ul li::before { + content: "–"; + font-weight: normal; + color: var(--note-color); +} + +li ol li::before { + font-weight: normal; + color: var(--note-color); +} + +/* ========================================================= + EPIGRAPH + ========================================================= */ + +.epigraph { + margin: 2rem auto; + max-width: 80%; + font-style: italic; +} + +.epigraph blockquote { + margin: 0; + padding: 1rem 1.5rem; + border-left: 4px dotted var(--heading); + background-color: color-mix(in oklab, var(--bg) 94%, var(--fg) 6%); + color: var(--fg); + line-height: 1.6; +} + +.epigraph blockquote footer { + margin-top: 0.75rem; + font-style: normal; + font-size: 0.9em; + color: var(--muted); + text-align: right; +} + +.epigraph blockquote cite { + font-style: italic; + font-weight: 500; + color: var(--link); +} + +.epigraph blockquote::before, +.epigraph blockquote::after { + content: none; +} + +/* ========================================================= + UTILITIES / MISC + ========================================================= */ + +.hidden { + display: none !important; +} + +/* bigger-picture.js controls */ +.bp-x { + right: 72px; +} +.bp-next, +.bp-prev { + right: 8px; +} +.bp-prev { + left: 8px; +} +.bp-wrap { + transition: opacity 0.18s ease; +} +.bp-wrap.bp-fadeout { + opacity: 0; +} +.bp-controls { + padding-top: env(safe-area-inset-top, 0); + padding-right: calc(env(safe-area-inset-right, 0) + 8px); +} + +/* code copy button */ +.copy-btn { + position: absolute; + top: 0.4em; + right: 0.4em; + background-color: var(--code-bg); + color: var(--heading); + border: 1px dotted var(--heading); + border-radius: 4px; + padding: 0.2em 0.6em; + font-size: 0.8rem; + cursor: pointer; + z-index: 10; + transition: background-color 0.3s; +} + +/* ========================================================= + BACKLINKS + ========================================================= */ + +.backlinks-section { + margin-top: 4rem; + padding-top: 1.5rem; + border-top: 1px dotted var(--border); + opacity: 0.95; + color: var(--muted); +} + +.backlinks-list { + margin-top: 0.75rem; + padding-left: 0; +} + +.backlinks-list li { + margin-bottom: 0.4rem; + font-size: 0.9rem; + list-style: none; +} + +.backlinks-list li::before { + content: "↩ "; + opacity: 0.5; + margin-right: 0.2rem; +} + +.backlinks-list li a { + text-decoration: none; + font-weight: 500; + color: var(--link); + border-bottom: 1px dotted color-mix(in oklab, var(--fg) 20%, transparent); + padding-bottom: 0.05em; + transition: color 0.15s ease, border-color 0.15s ease; +} + +.backlinks-list li a:hover, +.backlinks-list li a:focus { + color: var(--fg); + border-bottom-color: currentColor; +} + +/* ========================================================= + SEARCH + ========================================================= */ + +.banner-search { + position: relative; + max-width: 28rem; +} + +#search-box { + width: 100%; + padding: 0.55rem 0.75rem; + font-size: 0.95rem; + font-family: inherit; + + background-color: var(--bg-alt); + color: var(--fg); + + border: 1px solid var(--border); + border-radius: 4px; + + transition: border-color 0.15s ease, box-shadow 0.15s ease, + background-color 0.15s ease; +} + +#search-box:focus { + outline: none; + background-color: var(--bg); + border-color: var(--link); + box-shadow: 0 0 0 2px color-mix(in oklab, var(--link) 20%, transparent); +} + +#search-box::placeholder { + color: color-mix(in oklab, var(--muted) 30%, var(--fg) 70%); + font-style: italic; +} + +#search-results { + position: absolute; + top: calc(100% + 0.3rem); + left: 0; + right: 0; + + background-color: var(--bg); + border: 1px dotted var(--border); + border-radius: 4px; + + box-shadow: 0 8px 24px color-mix(in oklab, var(--fg) 8%, transparent); + + max-height: 18rem; + overflow-y: auto; + + z-index: 1000; +} + +#search-results > * { + padding: 0.45rem 0.65rem; + font-size: 0.9rem; + line-height: 1.3; + + cursor: pointer; + border-bottom: 1px dotted color-mix(in oklab, var(--fg) 5%, transparent); +} + +#search-results > *:last-child { + border-bottom: none; +} + +#search-results > *:hover, +#search-results > *.active { + background-color: color-mix(in oklab, var(--link) 12%, transparent); +} + +/* ========================================================= + RESPONSIVE + ========================================================= */ + +@media (max-width: 768px) { + #stack-root { + overflow-x: hidden; + overflow-y: auto; + } + + .stack-track { + flex-direction: column; + width: 100%; + } + + .stack-pane { + width: 100%; + height: auto; + border-right: none; + border-bottom: 1px dotted var(--border); + } +} +/* ========================================================= + FULLSCREEN PANE MODE + ========================================================= */ + +body.pane-fullscreen #stack-root { + overflow: hidden; +} + +body.pane-fullscreen .stack-track { + width: 100%; +} + +body.pane-fullscreen .stack-pane { + width: 100% !important; + max-width: none; + border-right: none; +} + +body.pane-fullscreen .stack-pane::after { + display: none; +} + +/* Only the active fullscreen pane remains */ +body.pane-fullscreen .stack-pane:not(.is-fullscreen) { + display: none; +} + +/* Optional: make content breathe more in fullscreen */ +body.pane-fullscreen #content.content { + max-width: 900px; +} diff --git a/output/assets/swappy-20250805-152411.png b/output/assets/swappy-20250805-152411.png new file mode 100755 index 0000000..2624622 Binary files /dev/null and b/output/assets/swappy-20250805-152411.png differ diff --git a/output/index.html b/output/index.html new file mode 100755 index 0000000..9a2a90b --- /dev/null +++ b/output/index.html @@ -0,0 +1,280 @@ + + + + + + + +Index + + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+ + + +
+

Index

+ +
+ + + + +
+

Roam

+
+ +
+

Screenshot_20251227_153037.png +

+
+
+
+
+
+
+ +
+ + diff --git a/output/search-index.json b/output/search-index.json new file mode 100755 index 0000000..8428a21 --- /dev/null +++ b/output/search-index.json @@ -0,0 +1 @@ +[{"title":"technical-commonplace","url":"/20251223220531-technical_commonplace.html","id":"37495d5f-2a77-40bc-b45c-8163189bbe6b"},{"title":"Design patterns","url":"/20251223215636-design_patterns_notes.html","id":"631b2086-4b8f-4fe3-829d-be1dc014e293"},{"title":"useful-c-imports","url":"/20251214210526-useful_c_imports.html","id":"d939e477-d1e9-43ea-960e-8727246d12a3"},{"title":"keyboard","url":"/20251122223053-keyboard.html","id":"0217f537-442a-4593-8c69-d481f0d1f2a8"},{"title":"old_nginx_code","url":"/20251109205925-old_nginx_code.html","id":"a9829b5d-690d-4a21-ba94-ac8beac4d439"},{"title":"Backlog","url":"/20251101123637-backlog.html","id":"580cc3a5-af8e-4cbe-b5ad-5b06680e6c37"},{"title":"old_nextcloud_server_code","url":"/20251019114758-old_nextcloud_server_code.html","id":"2c2d8df4-ad36-40ab-9f30-8a047b372956"},{"title":"server_moc","url":"/20251019114736-server_moc.html","id":"f09cb4ed-1407-4187-9002-de2c5db13a8f"},{"title":"pre_work_prep_microlise","url":"/20251002154204-pre_work_prep_microlise.html","id":"2BFB84B2-2129-4AE3-8E69-290CA5BF9747"},{"title":"workflow-moc","url":"/20250926151524-workflow_moc.html","id":"8CE93986-280B-45BD-9DF2-5D06586DDDE7"},{"title":"wedding_moc","url":"/20250918120706-wedding_moc.html","id":"c1de3972-e932-48fd-8065-3d89dad58007"},{"title":"naqshe-hayat","url":"/20250819174119-naqshe_hayat.html","id":"4426cc9a-1568-4fc8-9242-269654c43a3b"},{"title":"emacs-stuff-org-publish Welcome to My Org Website","url":"/20250806155335-emacs_stuff_org_publish.html","id":"7d2e867e-f091-4362-a583-453f732207fe"},{"title":"non_technical_moc","url":"/20250806111925-non_technical_moc.html","id":"565eaccd-8cf6-4dbb-bc66-a4b37367ce6b"},{"title":"python-lambda","url":"/20250805143741-python_lambda.html","id":"9d534e89-7f0b-494c-bff6-7b3be05b85d1"},{"title":"python-sorted-function","url":"/20250805143427-python_sorted_function.html","id":"3bbc6099-0187-4bf2-9282-97e5fa443f72"},{"title":"python-dictionary","url":"/20250805141906-python_dictionary.html","id":"125c81dc-c14f-4b4d-93c6-0a2b157735ac"},{"title":"python-set","url":"/20250804214537-python_set.html","id":"3a41407c-661e-416a-80d2-4c7a137d153a"},{"title":"how-to-solve-leetcode","url":"/20250804212215-how_to_solve_leetcode.html","id":"086ca3ca-39ec-4d37-b56d-b6d9f51e6873"},{"title":"big-o-complexity","url":"/20250804201706-big_o_complexity.html","id":"275988a8-59d8-40c8-a8b4-47118d6eb834"},{"title":"clean-code","url":"/20250727221512-clean_code.html","id":"dd55d635-59de-4ed9-8ff0-423782c2e0ae"},{"title":"book-recs","url":"/20250727174903-book_recs.html","id":"238ff7d8-db22-41e2-8aad-fc3c778e6248"},{"title":"database_moc","url":"/20250727122406-database_moc.html","id":"e448cd99-afee-4702-947f-644bb34dc1aa"},{"title":"networking-moc","url":"/20250727121051-networking_moc.html","id":"0880f089-a5ad-49cd-8ce3-f020a5941313"},{"title":"nextcloud","url":"/20250727120306-nextcloud.html","id":"56f39be4-1108-4020-be5a-1f3a0fbf96fa"},{"title":"books-org-agenda","url":"/20250724230557-books_org_agenda.html","id":"363dbdfa-f23c-4f7e-a6f3-6d34f78984bb"},{"title":"postgres","url":"/20250723200800-postgres.html","id":"939e301b-6463-46a8-b57e-0af606e7e7ef"},{"title":"self_hosting","url":"/20250723190927-self_hosting.html","id":"99533f2d-a4e8-41d0-a605-c7d4cef6f995"},{"title":"java-junit-testing","url":"/20250723190656-java_junit_testing.html","id":"7b8de14c-a73e-4c92-a403-a9a1c419c0b3"},{"title":"java-portswrigger-test","url":"/20250723190203-java_portswrigger_test.html","id":"5cfd7f6f-f5ac-4f18-90f9-be9a31dd238e"},{"title":"bowling-kata","url":"/20250723185943-bowling_kata.html","id":"bca8e7a6-0590-4630-ab49-210306ad21a2"},{"title":"test_driven_development","url":"/20250723185829-test_driven_development.html","id":"2729599d-ae2b-4f22-b73d-bf22d81e0767"},{"title":"neuroplasticity","url":"/20250723185056-neuroplasticity.html","id":"a087da71-bcfb-4ddf-9565-b82113d5d27f"},{"title":"stanford_marshmallow_experiment","url":"/20250723184430-stanford_marshmallow_experiment.html","id":"acba0d25-08db-4784-8cc2-fe5c437ba723"},{"title":"advanced-networking","url":"/20250723184233-advanced_networking.html","id":"3acffb66-bc1a-4661-904f-c5447b3c3488"},{"title":"deliberate_practice","url":"/20250723183755-deliberate_practice.html","id":"d4f96bfb-b83d-449b-9f74-f602a1a3c2d3"},{"title":"career_capital","url":"/20250723183655-career_capital.html","id":"f9838952-9753-471b-a2cc-d72e01a53ef6"},{"title":"so_good_they_cant_ignore_you","url":"/20250723182408-so_good_they_cant_ignore_you.html","id":"2d7f1ccc-99d7-4c45-8fe7-4b87080edb01"},{"title":"maven-pom-file","url":"/20250723171109-maven_pom_file.html","id":"bcd41e87-120c-455c-8898-996ddaa41f75"},{"title":"recipes-done","url":"/20250719175023-recipes_done.html","id":"EA93341B-20C0-48A2-BD88-F24ED3C540DA"},{"title":"recipes-ideas","url":"/20250719174944-recipes_ideas.html","id":"F7D68FF4-CAD0-4791-BAE4-AC20B84A8785"},{"title":"recipes-main","url":"/20250717230336-recipes_moc.html","id":"65F747B1-3CB2-429A-9E26-ED8BC169E689"},{"title":"the_clean_coder","url":"/20250715223949-the_clean_coder.html","id":"EC9D851F-3A2E-4F32-A584-76F6F7A08E30"},{"title":"linux-arch-linux","url":"/20250703183239-linux_arch_linux.html","id":"569a4a57-1843-4821-8259-17762855985e"},{"title":"gpg-encryption","url":"/20250516161728-gpg_encryption.html","id":"30c28e5e-0b1c-43ae-b3bd-eb31023f8b73"},{"title":"microlise-assessment","url":"/20250430001952-microlise_assessment.html","id":"f877240e-c2c8-4087-84e5-4b1ca3fcd4ed"},{"title":"systemd_services","url":"/20250428133236-systemd_services.html","id":"bf277242-4f09-46a2-aa6b-1d75ce0025ac"},{"title":"emacs-stuff-evil","url":"/20250420012258-emacs_stuff_evil.html","id":"45CC3AF5-5E20-4B03-A36C-8D4BDD5CBB13"},{"title":"wacom-notes","url":"/20250417173821-wacom_notes.html","id":"7612a9a6-ae70-4525-93a0-81bac857df39"},{"title":"linux_moc","url":"/20250417173809-linux_moc.html","id":"bdb493df-db92-4c93-9558-0b10fdff3048"},{"title":"wp-sadness","url":"/20250412234351-wp_sadness.html","id":"462F091B-9156-48B3-8665-0BE36C95C182"},{"title":"fyp-report-planning","url":"/20250403120140-fyp_report_planning.html","id":"26b2ed9a-cb81-4c43-bc63-6b3c8ffa3bf1"},{"title":"java_moc","url":"/20250402185735-java_moc.html","id":"ae343652-96fe-4341-8a36-ec3a1abd0dc6"},{"title":"ise_week_7","url":"/20250331202447-ise_week_7.html","id":"9ad3f3f1-55f7-4114-bc8c-17250b6dd25d"},{"title":"ise_week_5","url":"/20250331201944-ise_week_5.html","id":"0e70c535-b145-42d9-a9ed-fe48cddbb1a5"},{"title":"emacs-stuff-magit","url":"/20250329231658-emacs_stuff_magit.html","id":"2ab0fa3f-8ac6-4af2-8cd4-1dd490fb19c3"},{"title":"ise_week_4","url":"/20250329200158-ise_week_4.html","id":"ebf874d9-0554-47f0-be8b-5c9a948738bf"},{"title":"ise_week_3","url":"/20250329142725-ise_week_3.html","id":"1d0fa257-579f-49f3-b8fd-a3b68ddccf10"},{"title":"ise_week_2","url":"/20250329121843-ise_week_2.html","id":"f308642d-fcf3-410b-b154-d60582e112a2"},{"title":"ise_week_1","url":"/20250329114848-ise_week_1.html","id":"06b2a012-4e8a-4a8a-9494-de7ed9fbe1d3"},{"title":"emacs-stuff-elisp","url":"/20250326002128-emacs_stuff_elisp.html","id":"7e79e4c5-383d-450f-882c-33d4f87ba1b5"},{"title":"wp-week-12-reflection","url":"/20250324041724-wp_week_12_reflections.html","id":"8CD2F4C4-22C2-4ECC-8F5F-C4779F8AC0F1"},{"title":"wp-emotional-intelligence","url":"/20250314230952-wp_emotional_intelligence.html","id":"D02B89DC-84D0-4211-A902-B9399F4179CA"},{"title":"wp-growth-mindset","url":"/20250314223811-wp_growth_mindset.html","id":"CD093B85-BF68-4EAB-AABE-733C7BFC99DE"},{"title":"wp-urge-surfing-blorg","url":"/20250226184629-wp_urge_surfing_blorg.html","id":"cfc4ce06-7862-49b7-9a4f-e515d690cd38"},{"title":"emacs-stuff-keybindings","url":"/20250218174735-emacs_stuff_keybindings.html","id":"966175d4-3b58-4abc-9b41-08cbf328dd87"},{"title":"afp_lec_5","url":"/20250218110346-afp_lec_5.html","id":"ed4c372b-0314-4b6e-9119-742f69b5e434"},{"title":"afp_week5","url":"/20250218110239-afp_week5.html","id":"1f395b8c-cf55-43eb-9430-dd9449f6b575"},{"title":"wp-new-emacs-config-blorg","url":"/20250214155617-wp_new_emacs_config_blorg.html","id":"1ee754f9-f30f-4976-850b-d18d01a834d2"},{"title":"i3-wm","url":"/20250213124335-i3_wm.html","id":"9d5aae0f-4ae1-49a5-a047-9099baad0a06"},{"title":"afp_lec_2","url":"/20250128111008-afp_lec_2.html","id":"460f4a49-8ae4-444a-bf82-4e14ca7cad3f"},{"title":"afp_week2","url":"/20250128110828-afp_week2.html","id":"4bc71106-1d2b-4c71-836d-54b738fe5ff5"},{"title":"afp_lec_1","url":"/20250121110241-afp_lec_1.html","id":"3aef24fd-b220-4408-aa1e-c3538d661b62"},{"title":"afp_lab_1","url":"/20250120113936-afp_lab_1.html","id":"f6c9e1a7-8465-4cef-9481-2b803d0c43d4"},{"title":"afp","url":"/20250120110833-afp.html","id":"556d10d1-1c74-4d9f-a398-39cb3bd5d935"},{"title":"wp-prefront-cortex-blorg","url":"/20250111213016-wp_prefront_cortex_blog.html","id":"b292f5c6-0c27-439c-8274-2150eb45e20d"},{"title":"github_notes","url":"/20241220234456-github_notes.html","id":"710f65e5-0bd4-42be-b5d1-69dbe79b745e"},{"title":"wp-emacs-config-blorg","url":"/20241217234944-wp_emacs_config_blorg.html","id":"b2db0b0b-c179-43ab-9e2b-22bbaac69bcb"},{"title":"socket_programming_in_c","url":"/20241213005156-socket_programming_in_c.html","id":"efe0360d-8d81-4372-833d-ad58e67d17c6"},{"title":"c_notes","url":"/20241213005125-c_notes.html","id":"5a207a1c-6f02-40d5-b42e-38daaa0aec10"},{"title":"lazy_evaluation","url":"/20241212013902-lazy_evaluation.html","id":"63456626-b34e-46d9-b85e-0f1f5724aa83"},{"title":"job_application_cover_letters","url":"/20241211161232- job_application_cover_letters.html","id":"f9897f8e-2b63-4ad2-a55f-3787c4ac235f"},{"title":"uml_fyp","url":"/20241210232054-uml_fyp.html","id":"4a8edaed-9ebd-402b-9c5f-7a0cb4399102"},{"title":"tpis","url":"/20241210152713-tpis.html","id":"5443ed1c-bb7f-4eb4-9c96-d12648dd2291"},{"title":"uni_moc","url":"/20241210152650-uni_moc.html","id":"797d6e3e-98eb-4bc7-88b6-e096ef7306ad"},{"title":"fyp","url":"/20241210012703-fyp.html","id":"7d199fbe-b0e7-48fd-b8a1-793044dbea01"},{"title":"emacs-stuff-gtd","url":"/20241210004453-gtd.html","id":"8e5e9498-ff3c-48e7-aab5-6e94b2e41ccb"},{"title":"emacs-stuff-org-roam","url":"/20241210004329-org_roam.html","id":"034abe27-ca14-4dc0-9a3f-b8d0e1f26342"},{"title":"emacs_moc","url":"/20241210004247-emacs_moc.html","id":"8fa3f476-6152-45f4-b618-50f1e4bce46c"},{"title":"AOC Notes","url":"/20241210001150-aoc_notes.html","id":"e7f2302b-16eb-476d-a7b9-be12f077819d"},{"title":"Technical MOC","url":"/20241210001045-technical.html","id":"2f285f04-fcf4-4ade-a1ac-2c50b43d529a"}] \ No newline at end of file diff --git a/output/search-index.json~ b/output/search-index.json~ new file mode 100755 index 0000000..8428a21 --- /dev/null +++ b/output/search-index.json~ @@ -0,0 +1 @@ +[{"title":"technical-commonplace","url":"/20251223220531-technical_commonplace.html","id":"37495d5f-2a77-40bc-b45c-8163189bbe6b"},{"title":"Design patterns","url":"/20251223215636-design_patterns_notes.html","id":"631b2086-4b8f-4fe3-829d-be1dc014e293"},{"title":"useful-c-imports","url":"/20251214210526-useful_c_imports.html","id":"d939e477-d1e9-43ea-960e-8727246d12a3"},{"title":"keyboard","url":"/20251122223053-keyboard.html","id":"0217f537-442a-4593-8c69-d481f0d1f2a8"},{"title":"old_nginx_code","url":"/20251109205925-old_nginx_code.html","id":"a9829b5d-690d-4a21-ba94-ac8beac4d439"},{"title":"Backlog","url":"/20251101123637-backlog.html","id":"580cc3a5-af8e-4cbe-b5ad-5b06680e6c37"},{"title":"old_nextcloud_server_code","url":"/20251019114758-old_nextcloud_server_code.html","id":"2c2d8df4-ad36-40ab-9f30-8a047b372956"},{"title":"server_moc","url":"/20251019114736-server_moc.html","id":"f09cb4ed-1407-4187-9002-de2c5db13a8f"},{"title":"pre_work_prep_microlise","url":"/20251002154204-pre_work_prep_microlise.html","id":"2BFB84B2-2129-4AE3-8E69-290CA5BF9747"},{"title":"workflow-moc","url":"/20250926151524-workflow_moc.html","id":"8CE93986-280B-45BD-9DF2-5D06586DDDE7"},{"title":"wedding_moc","url":"/20250918120706-wedding_moc.html","id":"c1de3972-e932-48fd-8065-3d89dad58007"},{"title":"naqshe-hayat","url":"/20250819174119-naqshe_hayat.html","id":"4426cc9a-1568-4fc8-9242-269654c43a3b"},{"title":"emacs-stuff-org-publish Welcome to My Org Website","url":"/20250806155335-emacs_stuff_org_publish.html","id":"7d2e867e-f091-4362-a583-453f732207fe"},{"title":"non_technical_moc","url":"/20250806111925-non_technical_moc.html","id":"565eaccd-8cf6-4dbb-bc66-a4b37367ce6b"},{"title":"python-lambda","url":"/20250805143741-python_lambda.html","id":"9d534e89-7f0b-494c-bff6-7b3be05b85d1"},{"title":"python-sorted-function","url":"/20250805143427-python_sorted_function.html","id":"3bbc6099-0187-4bf2-9282-97e5fa443f72"},{"title":"python-dictionary","url":"/20250805141906-python_dictionary.html","id":"125c81dc-c14f-4b4d-93c6-0a2b157735ac"},{"title":"python-set","url":"/20250804214537-python_set.html","id":"3a41407c-661e-416a-80d2-4c7a137d153a"},{"title":"how-to-solve-leetcode","url":"/20250804212215-how_to_solve_leetcode.html","id":"086ca3ca-39ec-4d37-b56d-b6d9f51e6873"},{"title":"big-o-complexity","url":"/20250804201706-big_o_complexity.html","id":"275988a8-59d8-40c8-a8b4-47118d6eb834"},{"title":"clean-code","url":"/20250727221512-clean_code.html","id":"dd55d635-59de-4ed9-8ff0-423782c2e0ae"},{"title":"book-recs","url":"/20250727174903-book_recs.html","id":"238ff7d8-db22-41e2-8aad-fc3c778e6248"},{"title":"database_moc","url":"/20250727122406-database_moc.html","id":"e448cd99-afee-4702-947f-644bb34dc1aa"},{"title":"networking-moc","url":"/20250727121051-networking_moc.html","id":"0880f089-a5ad-49cd-8ce3-f020a5941313"},{"title":"nextcloud","url":"/20250727120306-nextcloud.html","id":"56f39be4-1108-4020-be5a-1f3a0fbf96fa"},{"title":"books-org-agenda","url":"/20250724230557-books_org_agenda.html","id":"363dbdfa-f23c-4f7e-a6f3-6d34f78984bb"},{"title":"postgres","url":"/20250723200800-postgres.html","id":"939e301b-6463-46a8-b57e-0af606e7e7ef"},{"title":"self_hosting","url":"/20250723190927-self_hosting.html","id":"99533f2d-a4e8-41d0-a605-c7d4cef6f995"},{"title":"java-junit-testing","url":"/20250723190656-java_junit_testing.html","id":"7b8de14c-a73e-4c92-a403-a9a1c419c0b3"},{"title":"java-portswrigger-test","url":"/20250723190203-java_portswrigger_test.html","id":"5cfd7f6f-f5ac-4f18-90f9-be9a31dd238e"},{"title":"bowling-kata","url":"/20250723185943-bowling_kata.html","id":"bca8e7a6-0590-4630-ab49-210306ad21a2"},{"title":"test_driven_development","url":"/20250723185829-test_driven_development.html","id":"2729599d-ae2b-4f22-b73d-bf22d81e0767"},{"title":"neuroplasticity","url":"/20250723185056-neuroplasticity.html","id":"a087da71-bcfb-4ddf-9565-b82113d5d27f"},{"title":"stanford_marshmallow_experiment","url":"/20250723184430-stanford_marshmallow_experiment.html","id":"acba0d25-08db-4784-8cc2-fe5c437ba723"},{"title":"advanced-networking","url":"/20250723184233-advanced_networking.html","id":"3acffb66-bc1a-4661-904f-c5447b3c3488"},{"title":"deliberate_practice","url":"/20250723183755-deliberate_practice.html","id":"d4f96bfb-b83d-449b-9f74-f602a1a3c2d3"},{"title":"career_capital","url":"/20250723183655-career_capital.html","id":"f9838952-9753-471b-a2cc-d72e01a53ef6"},{"title":"so_good_they_cant_ignore_you","url":"/20250723182408-so_good_they_cant_ignore_you.html","id":"2d7f1ccc-99d7-4c45-8fe7-4b87080edb01"},{"title":"maven-pom-file","url":"/20250723171109-maven_pom_file.html","id":"bcd41e87-120c-455c-8898-996ddaa41f75"},{"title":"recipes-done","url":"/20250719175023-recipes_done.html","id":"EA93341B-20C0-48A2-BD88-F24ED3C540DA"},{"title":"recipes-ideas","url":"/20250719174944-recipes_ideas.html","id":"F7D68FF4-CAD0-4791-BAE4-AC20B84A8785"},{"title":"recipes-main","url":"/20250717230336-recipes_moc.html","id":"65F747B1-3CB2-429A-9E26-ED8BC169E689"},{"title":"the_clean_coder","url":"/20250715223949-the_clean_coder.html","id":"EC9D851F-3A2E-4F32-A584-76F6F7A08E30"},{"title":"linux-arch-linux","url":"/20250703183239-linux_arch_linux.html","id":"569a4a57-1843-4821-8259-17762855985e"},{"title":"gpg-encryption","url":"/20250516161728-gpg_encryption.html","id":"30c28e5e-0b1c-43ae-b3bd-eb31023f8b73"},{"title":"microlise-assessment","url":"/20250430001952-microlise_assessment.html","id":"f877240e-c2c8-4087-84e5-4b1ca3fcd4ed"},{"title":"systemd_services","url":"/20250428133236-systemd_services.html","id":"bf277242-4f09-46a2-aa6b-1d75ce0025ac"},{"title":"emacs-stuff-evil","url":"/20250420012258-emacs_stuff_evil.html","id":"45CC3AF5-5E20-4B03-A36C-8D4BDD5CBB13"},{"title":"wacom-notes","url":"/20250417173821-wacom_notes.html","id":"7612a9a6-ae70-4525-93a0-81bac857df39"},{"title":"linux_moc","url":"/20250417173809-linux_moc.html","id":"bdb493df-db92-4c93-9558-0b10fdff3048"},{"title":"wp-sadness","url":"/20250412234351-wp_sadness.html","id":"462F091B-9156-48B3-8665-0BE36C95C182"},{"title":"fyp-report-planning","url":"/20250403120140-fyp_report_planning.html","id":"26b2ed9a-cb81-4c43-bc63-6b3c8ffa3bf1"},{"title":"java_moc","url":"/20250402185735-java_moc.html","id":"ae343652-96fe-4341-8a36-ec3a1abd0dc6"},{"title":"ise_week_7","url":"/20250331202447-ise_week_7.html","id":"9ad3f3f1-55f7-4114-bc8c-17250b6dd25d"},{"title":"ise_week_5","url":"/20250331201944-ise_week_5.html","id":"0e70c535-b145-42d9-a9ed-fe48cddbb1a5"},{"title":"emacs-stuff-magit","url":"/20250329231658-emacs_stuff_magit.html","id":"2ab0fa3f-8ac6-4af2-8cd4-1dd490fb19c3"},{"title":"ise_week_4","url":"/20250329200158-ise_week_4.html","id":"ebf874d9-0554-47f0-be8b-5c9a948738bf"},{"title":"ise_week_3","url":"/20250329142725-ise_week_3.html","id":"1d0fa257-579f-49f3-b8fd-a3b68ddccf10"},{"title":"ise_week_2","url":"/20250329121843-ise_week_2.html","id":"f308642d-fcf3-410b-b154-d60582e112a2"},{"title":"ise_week_1","url":"/20250329114848-ise_week_1.html","id":"06b2a012-4e8a-4a8a-9494-de7ed9fbe1d3"},{"title":"emacs-stuff-elisp","url":"/20250326002128-emacs_stuff_elisp.html","id":"7e79e4c5-383d-450f-882c-33d4f87ba1b5"},{"title":"wp-week-12-reflection","url":"/20250324041724-wp_week_12_reflections.html","id":"8CD2F4C4-22C2-4ECC-8F5F-C4779F8AC0F1"},{"title":"wp-emotional-intelligence","url":"/20250314230952-wp_emotional_intelligence.html","id":"D02B89DC-84D0-4211-A902-B9399F4179CA"},{"title":"wp-growth-mindset","url":"/20250314223811-wp_growth_mindset.html","id":"CD093B85-BF68-4EAB-AABE-733C7BFC99DE"},{"title":"wp-urge-surfing-blorg","url":"/20250226184629-wp_urge_surfing_blorg.html","id":"cfc4ce06-7862-49b7-9a4f-e515d690cd38"},{"title":"emacs-stuff-keybindings","url":"/20250218174735-emacs_stuff_keybindings.html","id":"966175d4-3b58-4abc-9b41-08cbf328dd87"},{"title":"afp_lec_5","url":"/20250218110346-afp_lec_5.html","id":"ed4c372b-0314-4b6e-9119-742f69b5e434"},{"title":"afp_week5","url":"/20250218110239-afp_week5.html","id":"1f395b8c-cf55-43eb-9430-dd9449f6b575"},{"title":"wp-new-emacs-config-blorg","url":"/20250214155617-wp_new_emacs_config_blorg.html","id":"1ee754f9-f30f-4976-850b-d18d01a834d2"},{"title":"i3-wm","url":"/20250213124335-i3_wm.html","id":"9d5aae0f-4ae1-49a5-a047-9099baad0a06"},{"title":"afp_lec_2","url":"/20250128111008-afp_lec_2.html","id":"460f4a49-8ae4-444a-bf82-4e14ca7cad3f"},{"title":"afp_week2","url":"/20250128110828-afp_week2.html","id":"4bc71106-1d2b-4c71-836d-54b738fe5ff5"},{"title":"afp_lec_1","url":"/20250121110241-afp_lec_1.html","id":"3aef24fd-b220-4408-aa1e-c3538d661b62"},{"title":"afp_lab_1","url":"/20250120113936-afp_lab_1.html","id":"f6c9e1a7-8465-4cef-9481-2b803d0c43d4"},{"title":"afp","url":"/20250120110833-afp.html","id":"556d10d1-1c74-4d9f-a398-39cb3bd5d935"},{"title":"wp-prefront-cortex-blorg","url":"/20250111213016-wp_prefront_cortex_blog.html","id":"b292f5c6-0c27-439c-8274-2150eb45e20d"},{"title":"github_notes","url":"/20241220234456-github_notes.html","id":"710f65e5-0bd4-42be-b5d1-69dbe79b745e"},{"title":"wp-emacs-config-blorg","url":"/20241217234944-wp_emacs_config_blorg.html","id":"b2db0b0b-c179-43ab-9e2b-22bbaac69bcb"},{"title":"socket_programming_in_c","url":"/20241213005156-socket_programming_in_c.html","id":"efe0360d-8d81-4372-833d-ad58e67d17c6"},{"title":"c_notes","url":"/20241213005125-c_notes.html","id":"5a207a1c-6f02-40d5-b42e-38daaa0aec10"},{"title":"lazy_evaluation","url":"/20241212013902-lazy_evaluation.html","id":"63456626-b34e-46d9-b85e-0f1f5724aa83"},{"title":"job_application_cover_letters","url":"/20241211161232- job_application_cover_letters.html","id":"f9897f8e-2b63-4ad2-a55f-3787c4ac235f"},{"title":"uml_fyp","url":"/20241210232054-uml_fyp.html","id":"4a8edaed-9ebd-402b-9c5f-7a0cb4399102"},{"title":"tpis","url":"/20241210152713-tpis.html","id":"5443ed1c-bb7f-4eb4-9c96-d12648dd2291"},{"title":"uni_moc","url":"/20241210152650-uni_moc.html","id":"797d6e3e-98eb-4bc7-88b6-e096ef7306ad"},{"title":"fyp","url":"/20241210012703-fyp.html","id":"7d199fbe-b0e7-48fd-b8a1-793044dbea01"},{"title":"emacs-stuff-gtd","url":"/20241210004453-gtd.html","id":"8e5e9498-ff3c-48e7-aab5-6e94b2e41ccb"},{"title":"emacs-stuff-org-roam","url":"/20241210004329-org_roam.html","id":"034abe27-ca14-4dc0-9a3f-b8d0e1f26342"},{"title":"emacs_moc","url":"/20241210004247-emacs_moc.html","id":"8fa3f476-6152-45f4-b618-50f1e4bce46c"},{"title":"AOC Notes","url":"/20241210001150-aoc_notes.html","id":"e7f2302b-16eb-476d-a7b9-be12f077819d"},{"title":"Technical MOC","url":"/20241210001045-technical.html","id":"2f285f04-fcf4-4ade-a1ac-2c50b43d529a"}] \ No newline at end of file