<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>GitHub Emacs Lisp Monthly Trending</title>
    <description>Monthly Trending of Emacs Lisp in GitHub</description>
    <pubDate>Fri, 15 May 2026 01:56:21 GMT</pubDate>
    <link>http://mshibanami.github.io/GitHubTrendingRSS</link>
    
    <item>
      <title>doomemacs/doomemacs</title>
      <link>https://github.com/doomemacs/doomemacs</link>
      <description>&lt;p&gt;An Emacs framework for the stubborn martian hacker&lt;/p&gt;&lt;hr&gt;&lt;div align=&quot;center&quot;&gt; 
 &lt;h1&gt;Doom Emacs&lt;/h1&gt; 
 &lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#install&quot;&gt;Install&lt;/a&gt; • &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/index.org&quot;&gt;Documentation&lt;/a&gt; • &lt;a href=&quot;https://github.com/doomemacs/doomemacs/raw/master/docs/faq.org&quot;&gt;FAQ&lt;/a&gt; • &lt;a href=&quot;https://github.com/doomemacs/doomemacs/tree/screenshots#emacsd-screenshots&quot;&gt;Screenshots&lt;/a&gt; • &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#contribute&quot;&gt;Contribute&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/tag/doomemacs/doomemacs.svg?style=flat-square&amp;amp;label=release&amp;amp;color=58839b&quot; alt=&quot;Made with Doom Emacs&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/Supports-Emacs_27.1%E2%80%9330.2-blueviolet.svg?style=flat-square&amp;amp;logo=GNU%20Emacs&amp;amp;logoColor=white&quot; alt=&quot;Supports Emacs 27.1–30.2&quot; /&gt; &lt;img src=&quot;https://img.shields.io/github/last-commit/doomemacs/doomemacs?style=flat-square&quot; alt=&quot;Latest commit&quot; /&gt;&lt;/p&gt; 
 &lt;!-- ![Build status: master](https://img.shields.io/github/workflow/status/doomemacs/doomemacs/CI/master?style=flat-square) --&gt; 
 &lt;p&gt;&lt;a href=&quot;https://doomemacs.org/discord&quot;&gt;&lt;img src=&quot;https://img.shields.io/discord/406534637242810369?color=738adb&amp;amp;label=Discord&amp;amp;logo=discord&amp;amp;logoColor=white&amp;amp;style=flat-square&quot; alt=&quot;Discord Server&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://doomemacs.org/discuss&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/discussions/doomemacs/community?label=Discussions&amp;amp;logo=github&amp;amp;style=flat-square&quot; alt=&quot;Discussions board&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/screenshots/main.png&quot; alt=&quot;Doom Emacs Screenshot&quot; /&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;hr /&gt; 
&lt;h3&gt;Table of Contents&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#introduction&quot;&gt;Introduction&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#features&quot;&gt;Features&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#prerequisites&quot;&gt;Prerequisites&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#install&quot;&gt;Install&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#roadmap&quot;&gt;Roadmap&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#getting-help&quot;&gt;Getting help&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/#contribute&quot;&gt;Contribute&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Introduction&lt;/h1&gt; 
&lt;a href=&quot;http://ultravioletbat.deviantart.com/art/Yay-Evil-111710573&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/screenshots/cacochan.png&quot; align=&quot;right&quot; /&gt; &lt;/a&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;It is a story as old as time. A stubborn, shell-dwelling, and melodramatic vimmer—envious of the features of modern text editors—spirals into despair before he succumbs to the &lt;a href=&quot;https://github.com/emacs-evil/evil&quot;&gt;dark side&lt;/a&gt;. This is his config.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Doom is a configuration framework for &lt;a href=&quot;https://www.gnu.org/software/emacs/&quot;&gt;GNU Emacs&lt;/a&gt; tailored for Emacs bankruptcy veterans who want less framework in their frameworks, a modicum of stability (and reproducibility) from their package manager, and the performance of a hand rolled config (or better). It can be a foundation for your own config or a resource for Emacs enthusiasts to learn more about our favorite operating system.&lt;/p&gt; 
&lt;p&gt;Its design is guided by these mantras:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Gotta go fast.&lt;/strong&gt; Startup and run-time performance are priorities. Doom goes beyond by modifying packages to be snappier and load lazier.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Close to metal.&lt;/strong&gt; There&#39;s less between you and vanilla Emacs by design. That&#39;s less to grok and less to work around when you tinker. Internals ought to be written as if reading them were part of Doom&#39;s UX, and it is!&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Opinionated, but not stubborn.&lt;/strong&gt; Doom is about reasonable defaults and curated opinions, but use as little or as much of it as you like.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Your system, your rules.&lt;/strong&gt; You know better. At least, Doom hopes so! It won&#39;t &lt;em&gt;automatically&lt;/em&gt; install system dependencies (and will force plugins not to either). Rely on &lt;code&gt;doom doctor&lt;/code&gt; to tell you what&#39;s missing.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Nix/Guix is a great idea!&lt;/strong&gt; The Emacs ecosystem is temperamental. Things break and they break often. Disaster recovery should be a priority! Doom&#39;s package management should be declarative and your private config reproducible, and comes with a means to roll back releases and updates (still a WIP).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Check out &lt;a href=&quot;https://github.com/doomemacs/doomemacs/raw/master/docs/faq.org&quot;&gt;the FAQ&lt;/a&gt; for answers to common questions about the project.&lt;/p&gt; 
&lt;h1&gt;Features&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;Minimalistic good looks inspired by modern editors.&lt;/li&gt; 
 &lt;li&gt;Curated and sane defaults for many packages, (major) OSes, and Emacs itself.&lt;/li&gt; 
 &lt;li&gt;A modular organizational structure for separating concerns in your config.&lt;/li&gt; 
 &lt;li&gt;A standard library designed to simplify your elisp bike shedding.&lt;/li&gt; 
 &lt;li&gt;A declarative &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/getting_started.org#package-management&quot;&gt;package management system&lt;/a&gt; (powered by &lt;a href=&quot;https://github.com/radian-software/straight.el&quot;&gt;straight.el&lt;/a&gt;) with a command line interface. Install packages from anywhere, not just (M)ELPA, and pin them to any commit.&lt;/li&gt; 
 &lt;li&gt;Optional vim emulation powered by &lt;a href=&quot;https://github.com/emacs-evil/evil&quot;&gt;evil-mode&lt;/a&gt;, including ports of popular vim plugins like &lt;a href=&quot;https://github.com/justinmk/vim-sneak&quot;&gt;vim-sneak&lt;/a&gt;, &lt;a href=&quot;https://github.com/easymotion/vim-easymotion&quot;&gt;vim-easymotion&lt;/a&gt;, &lt;a href=&quot;https://github.com/tpope/vim-unimpaired&quot;&gt;vim-unimpaired&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/modules/editor/evil/README.org#ported-vim-plugins&quot;&gt;more&lt;/a&gt;!&lt;/li&gt; 
 &lt;li&gt;Opt-in LSP integration for many languages, using &lt;a href=&quot;https://github.com/emacs-lsp/lsp-mode&quot;&gt;lsp-mode&lt;/a&gt; or &lt;a href=&quot;https://github.com/joaotavora/eglot&quot;&gt;eglot&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Support for &lt;em&gt;many&lt;/em&gt; programming languages. Includes syntax highlighting, linters/checker integration, inline code evaluation, code completion (where possible), REPLs, documentation lookups, snippets, and more!&lt;/li&gt; 
 &lt;li&gt;Support for &lt;em&gt;many&lt;/em&gt; tools, like docker, pass, ansible, terraform, and more.&lt;/li&gt; 
 &lt;li&gt;A Spacemacs-esque &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/modules/config/default/+evil-bindings.el&quot;&gt;keybinding scheme&lt;/a&gt;, centered around leader and localleader prefix keys (&lt;kbd&gt;SPC&lt;/kbd&gt; and &lt;kbd&gt;SPC&lt;/kbd&gt;&lt;kbd&gt;m&lt;/kbd&gt; for evil users, &lt;kbd&gt;C-c&lt;/kbd&gt; and &lt;kbd&gt;C-c l&lt;/kbd&gt; for vanilla users).&lt;/li&gt; 
 &lt;li&gt;A rule-based &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/modules/ui/popup/README.org&quot;&gt;popup manager&lt;/a&gt; to control how temporary buffers are displayed (and disposed of).&lt;/li&gt; 
 &lt;li&gt;Per-file indentation style detection and &lt;a href=&quot;http://editorconfig.org/&quot;&gt;editorconfig&lt;/a&gt; integration. Let someone else argue about tabs vs &lt;strong&gt;&lt;em&gt;spaces&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt; 
 &lt;li&gt;Project-management tools and framework-specific minor modes with their own snippets libraries.&lt;/li&gt; 
 &lt;li&gt;Project search (and replace) utilities, powered by &lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep&lt;/a&gt; and &lt;a href=&quot;https://github.com/abo-abo/swiper&quot;&gt;ivy&lt;/a&gt; or &lt;a href=&quot;https://github.com/emacs-helm/helm&quot;&gt;helm&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Isolated and persistent workspaces (also substitutes for vim tabs).&lt;/li&gt; 
 &lt;li&gt;Support for Chinese and Japanese input systems.&lt;/li&gt; 
 &lt;li&gt;Save a snapshot of your shell environment to a file for Emacs to load at startup. No more struggling to get Emacs to inherit your &lt;code&gt;PATH&lt;/code&gt;, among other things.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Prerequisites&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Required:&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;GNU Emacs 27.1–30.2 (30.2 is recommended) 
    &lt;ul&gt; 
     &lt;li&gt;If only using Doom&#39;s core, 27.1+ is required.&lt;/li&gt; 
     &lt;li&gt;If using Doom&#39;s modules (especially tree-sitter support), 29.1+ is required.&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;Git &amp;gt;= 2.23&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep&lt;/a&gt; &amp;gt;= 11.0&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Optional, but recommended:&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/sharkdp/fd&quot;&gt;fd&lt;/a&gt; 7.3.0+ (used to improve file indexing performance)&lt;/li&gt; 
   &lt;li&gt;GNU variants of &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, and &lt;code&gt;tar&lt;/code&gt; (on MacOS and BSD *nix)&lt;/li&gt; 
   &lt;li&gt;Symbola font (Emacs&#39; fallback font for glyphs it can&#39;t display)&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-warning&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-alert mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Warning&lt;/p&gt;
 &lt;p&gt;&lt;strong&gt;Avoid unstable and pre-release builds of Emacs.&lt;/strong&gt; These end in &lt;code&gt;.50&lt;/code&gt;, &lt;code&gt;.60&lt;/code&gt;, or &lt;code&gt;.9X&lt;/code&gt; (e.g. &lt;code&gt;28.1.91&lt;/code&gt;). Doom should generally work on Emacs HEAD (the maintainer dogfoods it), but support lags behind the bleeding edge by at least a month or so.&lt;/p&gt; 
&lt;/div&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;Doom is comprised of &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/modules.org&quot;&gt;~150 optional modules&lt;/a&gt;, some of which may have additional dependencies. &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/modules.org&quot;&gt;Visit their documentation&lt;/a&gt; or run &lt;code&gt;bin/doom doctor&lt;/code&gt; to check for any that you may have missed.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h1&gt;Install&lt;/h1&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
~/.config/emacs/bin/doom install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/getting_started.org&quot;&gt;read our Getting Started guide&lt;/a&gt; to be walked through installing, configuring and maintaining Doom Emacs.&lt;/p&gt; 
&lt;p&gt;It&#39;s a good idea to add &lt;code&gt;~/.config/emacs/bin&lt;/code&gt; to your &lt;code&gt;PATH&lt;/code&gt;! Other &lt;code&gt;bin/doom&lt;/code&gt; commands you should know about:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;doom sync&lt;/code&gt; to synchronize your private config with Doom by installing missing packages, removing orphaned packages, and regenerating caches. Run this whenever you modify your private &lt;code&gt;init.el&lt;/code&gt; or &lt;code&gt;packages.el&lt;/code&gt;, or install/remove an Emacs package through your OS package manager (e.g. mu4e or agda).&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;doom upgrade&lt;/code&gt; to update Doom to the latest release &amp;amp; all installed packages.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;doom doctor&lt;/code&gt; to diagnose common issues with your system and config.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;doom env&lt;/code&gt; to dump a snapshot of your shell environment to a file that Doom will load at startup. This allows Emacs to inherit your &lt;code&gt;PATH&lt;/code&gt;, among other things.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Roadmap&lt;/h1&gt; 
&lt;p&gt;Doom is an active and ongoing project. To make that development more transparent, its roadmap (and other concerns) are published across three github project boards and a newsletter:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://doomemacs.org/roadmap&quot;&gt;Development Roadmap&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://doomemacs.org/packages-under-review&quot;&gt;Packages under review&lt;/a&gt;: lists plugins we are watching and considering for inclusion, and what their status for inclusion is. Please consult this list before requesting new packages/features.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/orgs/doomemacs/projects/7&quot;&gt;Upstream bugs&lt;/a&gt;: lists issues that originate from elsewhere, and whether or not we have local workarounds or temporary fixes for them.&lt;/li&gt; 
 &lt;li&gt;&lt;s&gt;Doom&#39;s newsletter&lt;/s&gt; (not finished) will contain changelogs in between releases.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Getting help&lt;/h1&gt; 
&lt;p&gt;Emacs is no journey of a mere thousand miles. You &lt;em&gt;will&lt;/em&gt; run into problems and mysterious errors. When you do, here are some places you can look for help:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/index.org&quot;&gt;Our documentation&lt;/a&gt; covers many use cases. 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/getting_started.org#configuring-doom&quot;&gt;The Configuration section&lt;/a&gt; covers how to configure Doom and its packages.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/getting_started.org#package-management&quot;&gt;The Package Management section&lt;/a&gt; covers how to install and disable packages.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/getting_started.org#the-bindoom-utility&quot;&gt;This section&lt;/a&gt; explains the &lt;code&gt;bin/doom&lt;/code&gt; script&#39;s most important commands.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/getting_started.org#common-mistakes-when-configuring-doom-emacs&quot;&gt;This section&lt;/a&gt; lists some common configuration mistakes new users make, when migrating a config from another distro or their own.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/faq.org#how-do-i-change-the-theme&quot;&gt;This answer&lt;/a&gt; shows you how to add your own themes to your private config.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/faq.org#how-do-i-change-the-fonts&quot;&gt;This answer&lt;/a&gt; shows you how to change the default font.&lt;/li&gt; 
   &lt;li&gt;Your issue may be documented in the &lt;a href=&quot;https://github.com/doomemacs/doomemacs/raw/master/docs/faq.org&quot;&gt;FAQ&lt;/a&gt;.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;With Emacs built-in help system documentation is a keystroke away: 
  &lt;ul&gt; 
   &lt;li&gt;For functions: &lt;kbd&gt;SPC h f&lt;/kbd&gt; or &lt;kbd&gt;C-h f&lt;/kbd&gt;&lt;/li&gt; 
   &lt;li&gt;For variables: &lt;kbd&gt;SPC h v&lt;/kbd&gt; or &lt;kbd&gt;C-h v&lt;/kbd&gt;&lt;/li&gt; 
   &lt;li&gt;For a keybind: &lt;kbd&gt;SPC h k&lt;/kbd&gt; or &lt;kbd&gt;C-h k&lt;/kbd&gt;&lt;/li&gt; 
   &lt;li&gt;To search available keybinds: &lt;kbd&gt;SPC h b b&lt;/kbd&gt; or &lt;kbd&gt;C-h b b&lt;/kbd&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Run &lt;code&gt;bin/doom doctor&lt;/code&gt; to detect common issues with your development environment and private config.&lt;/li&gt; 
 &lt;li&gt;Check out the &lt;a href=&quot;https://github.com/doomemacs/doomemacs/raw/master/docs/faq.org&quot;&gt;FAQ&lt;/a&gt; or &lt;a href=&quot;https://github.com/doomemacs/community?tab=readme-ov-file#frequently-asked-questions&quot;&gt;Community FAQs&lt;/a&gt;, in case your question has already been answered.&lt;/li&gt; 
 &lt;li&gt;Search &lt;a href=&quot;https://github.com/doomemacs/doomemacs/issues&quot;&gt;Doom&#39;s issue tracker&lt;/a&gt; in case your issue was already reported.&lt;/li&gt; 
 &lt;li&gt;Hop on &lt;a href=&quot;https://doomemacs.org/discord&quot;&gt;our Discord server&lt;/a&gt;; it&#39;s active and friendly! Keep an eye on the #announcements channel, where I announce breaking updates and releases.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Contribute&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;http://makeapullrequest.com&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square&quot; alt=&quot;PRs Welcome&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/bbatsov/emacs-lisp-style-guide&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/elisp-style%20guide-purple?style=flat-square&quot; alt=&quot;Elisp styleguide&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://liberapay.com/hlissner/donate&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/liberapay-donate-1.svg?style=flat-square&amp;amp;logo=liberapay&amp;amp;color=blue&quot; alt=&quot;Donate on liberapay&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://paypal.me/hlissner/10&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/paypal-donate-1?style=flat-square&amp;amp;logo=paypal&amp;amp;color=blue&quot; alt=&quot;Donate on paypal&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Doom is a labor of love and incurable madness, but I&#39;m only one guy. Doom wouldn&#39;t be where it is today without your help. I welcome contributions of any kind!&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;I ❤️ pull requests and bug reports (see the &lt;a href=&quot;https://raw.githubusercontent.com/doomemacs/doomemacs/master/docs/contributing.org&quot;&gt;Contributing Guidelines&lt;/a&gt;)!&lt;/li&gt; 
 &lt;li&gt;Don&#39;t hesitate to &lt;a href=&quot;https://github.com/doomemacs/doomemacs/issues/new/choose&quot;&gt;tell me my Elisp-fu sucks&lt;/a&gt;, but please tell me why.&lt;/li&gt; 
 &lt;li&gt;Hop on &lt;a href=&quot;https://doomemacs.org/discord&quot;&gt;our Discord server&lt;/a&gt; and say hi! Help others, hang out or talk to me about Emacs, gamedev, programming, physics, pixel art, anime, gaming -- anything you like. Nourish this lonely soul.&lt;/li&gt; 
 &lt;li&gt;If you&#39;d like to support my work financially, buy me a drink through &lt;a href=&quot;https://liberapay.com/hlissner/donate&quot;&gt;liberapay&lt;/a&gt; or &lt;a href=&quot;https://paypal.me/hlissner/10&quot;&gt;paypal&lt;/a&gt;. My work contends with studies, adventures in indie gamedev and freelance work. Donations help me allocate more time to my Emacs and OSS capers.&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/21763822/47152a00-a255-11e9-9ca0-37fec3ef82cc" medium="image" />
      
    </item>
    
    <item>
      <title>melpa/melpa</title>
      <link>https://github.com/melpa/melpa</link>
      <description>&lt;p&gt;Recipes and build machinery for the biggest Emacs package repo&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;MELPA&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/melpa/melpa/actions/workflows/ci.yml&quot;&gt;&lt;img src=&quot;https://github.com/melpa/melpa/actions/workflows/ci.yml/badge.svg?sanitize=true&quot; alt=&quot;Build Status&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;MELPA is a growing collection of &lt;code&gt;package.el&lt;/code&gt;-compatible Emacs Lisp packages built automatically on our server from the upstream source code using simple recipes. (Think of it as a server-side version of &lt;a href=&quot;https://github.com/dimitri/el-get/&quot;&gt;&lt;code&gt;el-get&lt;/code&gt;&lt;/a&gt;, or even &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt;.)&lt;/p&gt; 
&lt;p&gt;Packages are updated at intervals throughout the day.&lt;/p&gt; 
&lt;p&gt;To browse available packages, check out the &lt;a href=&quot;https://melpa.org/&quot;&gt;archive index page&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Adding packages is as simple as submitting a new recipe as a pull request; read on for details.&lt;/p&gt; 
&lt;h2&gt;Table of Contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#usage&quot;&gt;Usage&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#contributing&quot;&gt;Contributing&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#recipe-format&quot;&gt;Recipe Format&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#build-scripts&quot;&gt;Build Scripts&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#api&quot;&gt;API&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#configuration&quot;&gt;Configuration&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#mirrors&quot;&gt;Mirrors&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#about&quot;&gt;About&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;p&gt;To use the MELPA repository, you&#39;ll need an Emacs with &lt;code&gt;package.el&lt;/code&gt;, i.e., Emacs 24.1 or greater. To test TLS support you can visit a HTTPS URL, for example with &lt;code&gt;M-x eww RET https://wikipedia.org RET&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Enable installation of packages from MELPA by adding an entry to &lt;code&gt;package-archives&lt;/code&gt; after &lt;code&gt;(require &#39;package)&lt;/code&gt; and before the call to &lt;code&gt;package-initialize&lt;/code&gt; in your &lt;code&gt;init.el&lt;/code&gt; or &lt;code&gt;.emacs&lt;/code&gt; file:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(require &#39;package)
(add-to-list &#39;package-archives &#39;(&quot;melpa&quot; . &quot;https://melpa.org/packages/&quot;) t)
;; Comment/uncomment this line to enable MELPA Stable if desired.
;; See `package-archive-priorities` and `package-pinned-packages`.
;; Most users will not need or want to do this.
;; (add-to-list &#39;package-archives
;;              &#39;(&quot;melpa-stable&quot; . &quot;https://stable.melpa.org/packages/&quot;) t)
(package-initialize)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then just use &lt;code&gt;M-x package-list-packages&lt;/code&gt; to browse and install packages from MELPA and elsewhere.&lt;/p&gt; 
&lt;p&gt;Note that you&#39;ll need to run &lt;code&gt;M-x package-refresh-contents&lt;/code&gt; or &lt;code&gt;M-x package-list-packages&lt;/code&gt; to ensure that Emacs has fetched the MELPA package list before you can install packages with &lt;code&gt;M-x package-install&lt;/code&gt; or similar.&lt;/p&gt; 
&lt;h3&gt;MELPA Stable&lt;/h3&gt; 
&lt;p&gt;Packages in MELPA are built directly from the latest package source code in the upstream repositories, but we also build and publish packages corresponding to the latest tagged code in those repositories, where version tags exist. These packages are published in a separate package archive called &lt;a href=&quot;https://stable.melpa.org/&quot;&gt;MELPA Stable&lt;/a&gt;. Most users should prefer MELPA over MELPA Stable.&lt;/p&gt; 
&lt;p&gt;Some notes:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;If you leave the original MELPA server in your &lt;code&gt;package-archives&lt;/code&gt; then by default you will get the &lt;em&gt;development&lt;/em&gt; versions of packages and not the stable ones, because the development versions are higher.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;If your Emacs has the variables &lt;code&gt;package-pinned-packages&lt;/code&gt; (available in 24.4 and later) and/or &lt;code&gt;package-archive-priorities&lt;/code&gt;, you can customize or modify those variables as needed.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;You will probably want to remove all packages and then reinstall them. Any packages you already have installed from MELPA will never get &quot;updated&quot; to the stable version because of the way version numbering is handled.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Note that the MELPA maintainers do not use MELPA Stable themselves, and do not particularly recommend its use.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;See the &lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/CONTRIBUTING.org&quot;&gt;CONTRIBUTING.org&lt;/a&gt; document.&lt;/p&gt; 
&lt;h2&gt;Recipe Format&lt;/h2&gt; 
&lt;p&gt;Packages are specified by files in the &lt;code&gt;recipes&lt;/code&gt; directory. You can contribute a new package by adding a new file under &lt;code&gt;recipes&lt;/code&gt; using the following form (&lt;code&gt;[...]&lt;/code&gt; denotes optional or conditional values),&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(&amp;lt;package-name&amp;gt;
 :fetcher [git|github|gitlab|codeberg|sourcehut|hg]
 [:url &quot;&amp;lt;repo url&amp;gt;&quot;]
 [:repo &quot;user-name/repo-name&quot;]
 [:commit &quot;commit&quot;]
 [:branch &quot;branch&quot;]
 [:version-regexp &quot;&amp;lt;regexp&amp;gt;&quot;]
 [:files (&quot;&amp;lt;file1&amp;gt;&quot; ...)]
 [:old-names (&amp;lt;old-name&amp;gt; ...)])
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;package-name&lt;/code&gt; a lisp symbol that has the same name as the package being specified.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;:fetcher&lt;/code&gt; specifies the type of repository the package is being maintained in.&lt;/p&gt; &lt;p&gt;Melpa supports the Git and Mercurial version control systems and provides generic fetcher types for them: &lt;code&gt;git&lt;/code&gt; and &lt;code&gt;hg&lt;/code&gt;. When you use one of these fetchers, you must specify the &lt;code&gt;:url&lt;/code&gt; property.&lt;/p&gt; &lt;p&gt;Melpa also provides dedicated fetchers for certain Git forges (aka &quot;Git repository hosting platforms&quot;), which should always be preferred over the generic &lt;code&gt;git&lt;/code&gt; fetcher. When using a dedicated fetcher, you must specify &lt;code&gt;:repo&lt;/code&gt;, not &lt;code&gt;:url&lt;/code&gt;. Currently these Git forge fetchers exist: &lt;a href=&quot;https://github.com/&quot;&gt;&lt;code&gt;github&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/&quot;&gt;&lt;code&gt;gitlab&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://codeberg.org/&quot;&gt;&lt;code&gt;codeberg&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://git.sr.ht/&quot;&gt;&lt;code&gt;sourcehut&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;There are no dedicated fetchers for Mercurial. When a forge supports both Git and Mercurial, then the respective fetcher can only be used for Git repositories. For Mercurial repositories always use the &lt;code&gt;hg&lt;/code&gt; fetcher.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;:url&lt;/code&gt; specifies the URL of the version control repository. It is required for the generic &lt;code&gt;git&lt;/code&gt; and &lt;code&gt;hg&lt;/code&gt; fetchers and is invalid for forge-specific fetchers.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;:repo&lt;/code&gt; specifies the repository used by forge-specific fetchers and is of the form &lt;code&gt;user-name/repo-name&lt;/code&gt;. It is required for forge-specific fetchers and is invalid for the generic fetchers.&lt;/p&gt; &lt;p&gt;Note that user names in Sourcehut URLs are prefixed with &lt;code&gt;~&lt;/code&gt;, that has to be omitted in the value of this property.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;:commit&lt;/code&gt; specifies the commit of the Git repository to checkout. The value will be passed to &lt;code&gt;git reset&lt;/code&gt; in a repo where &lt;code&gt;upstream&lt;/code&gt; is the original repository. Can therefore be either a SHA, if pointing at a specific commit, or a full ref prefixed with &quot;origin/&quot;. Only used by the &lt;code&gt;git&lt;/code&gt;-based fetchers.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;:branch&lt;/code&gt; specifies the branch of the Git repository to use. This is like &lt;code&gt;:commit&lt;/code&gt;, but it adds the &quot;origin/&quot; prefix automatically. This must be specified when using a branch other than the default branch.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;:version-regexp&lt;/code&gt; is a regular expression for extracting a version-string from the repository tags. The default matches typical version tags such as &lt;code&gt;1.0&lt;/code&gt;, &lt;code&gt;R16&lt;/code&gt; or &lt;code&gt;v4.3.5&lt;/code&gt;, so you should not override it unless necessary. For an unusual tag like &quot;OTP-18.1.5&quot;, we might add &lt;code&gt;:version-regexp &quot;[^0-9]*\\(.*\\)&quot;&lt;/code&gt; to strip the &quot;OTP-&quot; prefix. The captured portion of the regexp must be parseable by Emacs&#39; &lt;code&gt;version-to-list&lt;/code&gt; function.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;:files&lt;/code&gt; optional property specifying the Emacs Lisp libraries and info files used to build the package. Please do not override this if the default value (below) is adequate, which it should usually be:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;&#39;(&quot;*.el&quot; &quot;lisp/*.el&quot;
  &quot;dir&quot; &quot;*.info&quot; &quot;*.texi&quot; &quot;*.texinfo&quot;
  &quot;doc/dir&quot; &quot;doc/*.info&quot; &quot;doc/*.texi&quot; &quot;doc/*.texinfo&quot;
  &quot;docs/dir&quot; &quot;docs/*.info&quot; &quot;docs/*.texi&quot; &quot;docs/*.texinfo&quot;
  (:exclude
   &quot;.*.el&quot; &quot;lisp/.*.el&quot;
   &quot;test.el&quot; &quot;tests.el&quot; &quot;*-test.el&quot; &quot;*-tests.el&quot;
   &quot;lisp/test.el&quot; &quot;lisp/tests.el&quot; &quot;lisp/*-test.el&quot; &quot;lisp/*-tests.el&quot;))
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Note that you should place Emacs Lisp libraries in the root of the repository or in the &lt;code&gt;lisp/&lt;/code&gt; directory. Test files should be placed in the &lt;code&gt;test/&lt;/code&gt; directory and they should not provide a feature. Note that all Emacs Lisp files whose name begin with a period are excluded.&lt;/p&gt; &lt;p&gt;No &lt;code&gt;NAME-pkg.el&lt;/code&gt; should be checked into version control. This file is generated from metadata found in the &quot;main library&quot; (&lt;code&gt;NAME.el&lt;/code&gt;). This is true not only for MELPA, but also GNU ELPA and NonGNU ELPA.&lt;/p&gt; &lt;p&gt;Please do not track any third-party libraries and test utilities in your repository. If you absolutely must do it, then place these files in a directory dedicated to that purpose, alongside a file named &lt;code&gt;.nosearch&lt;/code&gt;. The latter prevents various tools from adding the containing directory to the &lt;code&gt;load-path&lt;/code&gt; or from otherwise getting confused.&lt;/p&gt; &lt;p&gt;The elements of the &lt;code&gt;:files&lt;/code&gt; list are glob-expanded to make a list of paths that will be copied into the root of the new package. This means a file like &lt;code&gt;lisp/foo.el&lt;/code&gt; would become &lt;code&gt;foo.el&lt;/code&gt; in the new package. To specify a destination subdirectory, use a list element of the form &lt;code&gt;(TARGET-DIR SOURCE-PATH ...)&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;To exclude certain paths, use &lt;code&gt;(:exclude SOURCE-PATH ...)&lt;/code&gt;. There should only be one element that begins with &lt;code&gt;:exclude&lt;/code&gt; and it should be the last element, though that is not enforced at this time.&lt;/p&gt; &lt;p&gt;If your package requires some additional files, but is otherwise fine with the defaults, use the special element &lt;code&gt;:defaults&lt;/code&gt; as the first element of the &lt;code&gt;:files&lt;/code&gt; list. This causes the default value shown above to be prepended to the specified file list. For example &lt;code&gt;:files (:defaults &quot;snippets&quot;)&lt;/code&gt; would cause the &lt;code&gt;snippets&lt;/code&gt; subdir to be copied in addition to the defaults.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Elements of &lt;code&gt;:files&lt;/code&gt; are (no longer) processed in order because we feed these globs to &lt;code&gt;git log&lt;/code&gt; or &lt;code&gt;hg log&lt;/code&gt; to determine the last commit that touched a relevant file. These commands unfortunately process all exclude globs after all include globs. Therefore it is not possible to override the &lt;code&gt;:exclude&lt;/code&gt; element that appears in &lt;code&gt;:defaults&lt;/code&gt; in a later element of &lt;code&gt;:files&lt;/code&gt;. This means that a package whose name ends with &lt;code&gt;-test&lt;/code&gt; cannot use &lt;code&gt;:defaults&lt;/code&gt;. Likewise if the name of a &lt;em&gt;library&lt;/em&gt; (as opposed to a file implementing tests) ends with &lt;code&gt;-test.el&lt;/code&gt;, then &lt;code&gt;:defaults&lt;/code&gt; cannot be used.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Once the appropriate commit has been determined &lt;code&gt;file-expand-wildcards&lt;/code&gt; is used to determine the files matched by each glob. Unfortunately (unlike in a shell) a glob that begins with &lt;code&gt;*&lt;/code&gt; may also match filenames that begin with &lt;code&gt;.&lt;/code&gt;, so you might have to add exclude globs to prevent those from being included. &lt;code&gt;:defaults&lt;/code&gt; takes care to exclude &lt;code&gt;.dir-locals.el&lt;/code&gt;; if you don&#39;t use &lt;code&gt;:defaults&lt;/code&gt;, then you might have to exclude that explicitly.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;:old-names&lt;/code&gt; specifies former names of the package, if any. The value is a list of symbols.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Example: Single File Repository&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;smex&lt;/code&gt; is a repository that contains two files:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;README.markdown&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;smex.el&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Since there is only one &lt;code&gt;.el&lt;/code&gt; file, this package only needs the &lt;code&gt;:fetcher&lt;/code&gt; and &lt;code&gt;:repo&lt;/code&gt; specified,&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(smex :fetcher github :repo &quot;nonsequitur/smex&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Example: Multiple Packages in one Repository&lt;/h3&gt; 
&lt;p&gt;Assume we have a repository containing three libraries &lt;code&gt;mypackage.el&lt;/code&gt;, &lt;code&gt;helm-mypackage.el&lt;/code&gt;, and &lt;code&gt;persp-mypackage.el&lt;/code&gt;. The latter two libraries are optional and users who don&#39;t want to use the packages &lt;code&gt;helm&lt;/code&gt; and/or &lt;code&gt;perspective&lt;/code&gt; should not be forced to install them just so they can install &lt;code&gt;mypackage&lt;/code&gt;. These libraries should therefore be distributed as separate packages.&lt;/p&gt; 
&lt;p&gt;The three packages have to be declared in three separate files &lt;code&gt;recipes/mypackage&lt;/code&gt;, &lt;code&gt;recipes/helm-mypackage&lt;/code&gt;, and &lt;code&gt;recipes/persp-mypackage&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(mypackage
 :fetcher github
 :repo &quot;someuser/mypackage&quot;
 :files (&quot;mypackage.el&quot;))
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(helm-mypackage
 :fetcher github
 :repo &quot;someuser/mypackage&quot;
 :files (&quot;helm-mypackage.el&quot;))
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(persp-mypackage
 :fetcher github
 :repo &quot;someuser/mypackage&quot;
 :files (&quot;persp-mypackage.el&quot;))
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Example: Multiple Files in Multiple Directories&lt;/h3&gt; 
&lt;p&gt;There are special cases where creation of the package comes from many different sub-directories in the repository and the destination sub-directories need to be explicitly set.&lt;/p&gt; 
&lt;p&gt;Consider the &lt;code&gt;flymake-perlcritic&lt;/code&gt; recipe,&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(flymake-perlcritic
 :fetcher github
 :repo &quot;illusori/emacs-flymake-perlcritic&quot;
 :files (&quot;*.el&quot; (&quot;bin&quot; &quot;bin/flymake_perlcritic&quot;)))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;which will result in a package structure of,&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;flymake-perlcritic-YYYYMMDD
|-- bin
|   `-- flymake_perlcritic
|-- flymake-perlcritic-pkg.el
`-- flymake-perlcritic.el
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Notice that specifying an entry in &lt;code&gt;:files&lt;/code&gt; that is a list takes the first element to be the destination directory.&lt;/p&gt; 
&lt;p&gt;But a better solution, given that we probably want to copy the &lt;em&gt;entire&lt;/em&gt; &lt;code&gt;snippets&lt;/code&gt; directory to the root of the package, we could just specify that directory. Consider the &lt;code&gt;pony-mode&lt;/code&gt; recipe,&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(pony-mode
 :fetcher github
 :repo &quot;davidmiller/pony-mode&quot;
 :files (&quot;src/*.el&quot; &quot;snippets&quot;))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;which generates the package,&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pony-mode-YYYYMMDD
|-- pony-mode-pkg.el
|-- pony-mode.el
|-- pony-tpl.el
`-- snippets
    |-- html-mode
    |   |-- bl
    |   |-- ex
    |   |-- for
    |   |-- if
    |   |-- loa
    |   |-- sup
    |   |-- testc
    |   `-- {{
    `-- python-mode
        |-- auth-view
        |-- bn
        |-- model
        |-- modelform
        |-- render-to
        |-- testc
        `-- view
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Build Scripts&lt;/h2&gt; 
&lt;p&gt;Building MELPA is all based around using the &lt;code&gt;Makefile&lt;/code&gt; included in the root repository directory. Described below are the actions that accepted by the &lt;code&gt;Makefile&lt;/code&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;all&lt;/code&gt; — build all packages under the &lt;code&gt;recipes/&lt;/code&gt; directory and compiles the &lt;code&gt;index.html&lt;/code&gt; file for the &lt;a href=&quot;https://melpa.org/&quot;&gt;MELPA&lt;/a&gt; website.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;recipes/&amp;lt;NAME&amp;gt;&lt;/code&gt; — build individual recipe &lt;code&gt;&amp;lt;NAME&amp;gt;&lt;/code&gt;. Built packages are put in the &lt;code&gt;packages/&lt;/code&gt; folder with version corresponding to the date of the latest commit that modified at least one of the files specified by the recipe; given according to the &lt;code&gt;%Y%m%d&lt;/code&gt; format.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;json&lt;/code&gt; — build all JSON files.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;archive.json&lt;/code&gt; — construct the &lt;code&gt;archive.json&lt;/code&gt; file that will contain a JSON object of all compiled packages.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;recipes.json&lt;/code&gt; — construct the &lt;code&gt;recipes.json&lt;/code&gt; file containing a JSON object of all packages available for building.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;clean&lt;/code&gt; — clean everything.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;html&lt;/code&gt; — build &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;clean-working&lt;/code&gt; — remove all repositories that have been checked out to the &lt;code&gt;working/&lt;/code&gt; directory.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;clean-packages&lt;/code&gt; — remove all compiled packages from the &lt;code&gt;packages&lt;/code&gt; directory.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;clean-json&lt;/code&gt; — remove all JSON files.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Note that these scripts require an Emacs with &lt;code&gt;package.el&lt;/code&gt; installed, such as Emacs 24. If you have an older version of Emacs, you can get a suitable &lt;code&gt;package.el&lt;/code&gt; &lt;a href=&quot;https://git.savannah.gnu.org/gitweb/?p=emacs.git;a=blob_plain;hb=ba08b24186711eaeb3748f3d1f23e2c2d9ed0d09;f=lisp/emacs-lisp/package.el&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;API&lt;/h2&gt; 
&lt;p&gt;All repository code is contained in the file &lt;code&gt;package-build/package-build.el&lt;/code&gt;. That code is maintained in a &lt;a href=&quot;https://github.com/melpa/package-build/&quot;&gt;separate repository&lt;/a&gt;: the version in the MELPA repository is imported using &lt;code&gt;git subtree&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Functions&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;(package-build-all)&lt;/code&gt; — build packages for all recipes in the directory specified by &lt;code&gt;package-build-recipes-dir&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;(package-build-archive NAME)&lt;/code&gt; — interactive Emacs Lisp function to build a single archive. NAME is a symbol for the package to be built. Packages are staged in the directory specified by &lt;code&gt;package-build-working-dir&lt;/code&gt; and built packages are placed in the directory specified by &lt;code&gt;package-build-archive-dir&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Packages are versioned based on the most recent commit date to package files based on commits to upstream package repository.&lt;/p&gt; &lt;p&gt;A file named &lt;code&gt;&amp;lt;NAME&amp;gt;-pkg.el&lt;/code&gt;, which contains &lt;em&gt;description&lt;/em&gt;, &lt;em&gt;version&lt;/em&gt;, and &lt;em&gt;requires&lt;/em&gt; information about the package is automatically generated. The information is extracted from the summary line and headers of &lt;code&gt;&amp;lt;NAME&amp;gt;.el&lt;/code&gt;. For historic reasons, if some of these values cannot be extracted from that file, then Melpa also extracts information from &lt;code&gt;&amp;lt;NAME&amp;gt;-pkg.el&lt;/code&gt; if such a file is tracked in the upstream repository (but this fallback will be removed eventually).&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Variables&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;package-build-working-dir&lt;/code&gt; — Staging area containing package repositories and package directories being built.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;package-build-archive-dir&lt;/code&gt; — Location to store &lt;code&gt;archive-contents&lt;/code&gt; and any built packages.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;package-build-recipes-dir&lt;/code&gt; — Directory containing MELPA compatible recipes. See &lt;a href=&quot;https://raw.githubusercontent.com/melpa/melpa/master/#recipe-format&quot;&gt;Recipe Format&lt;/a&gt; section for more details.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Configuration&lt;/h2&gt; 
&lt;p&gt;Packages end up in the &lt;code&gt;packages/&lt;/code&gt; directory by default. This can be configured using the &lt;code&gt;package-build-archive-dir&lt;/code&gt; variable.&lt;/p&gt; 
&lt;p&gt;Repositories are checked out to the &lt;code&gt;working/&lt;/code&gt; directory by default. This can be configured using the &lt;code&gt;package-build-working-dir&lt;/code&gt; variable.&lt;/p&gt; 
&lt;h2&gt;Mirrors&lt;/h2&gt; 
&lt;p&gt;Official mirrors are available (with many thanks to &lt;a href=&quot;http://mirrorservice.org&quot;&gt;mirrorservice.org&lt;/a&gt;) so that if &lt;a href=&quot;http://melpa.org&quot;&gt;melpa.org&lt;/a&gt; is down, packages can still be installed. The following are the HTTP/HTTPS URLs to use in &lt;code&gt;package-archives&lt;/code&gt; for MELPA and MELPA Stable respectively:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.mirrorservice.org/sites/melpa.org/packages/&quot;&gt;http://www.mirrorservice.org/sites/melpa.org/packages/&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.mirrorservice.org/sites/melpa.org/packages/&quot;&gt;https://www.mirrorservice.org/sites/melpa.org/packages/&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.mirrorservice.org/sites/stable.melpa.org/packages/&quot;&gt;http://www.mirrorservice.org/sites/stable.melpa.org/packages/&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.mirrorservice.org/sites/stable.melpa.org/packages/&quot;&gt;https://www.mirrorservice.org/sites/stable.melpa.org/packages/&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Only the packages are mirrored, not the web site front-end itself.&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;We are NOT responsible for the contents of any UNOFFICIAL mirror of our packages.&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;Use &lt;code&gt;rsync&lt;/code&gt; to get started with your own mirror:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rsync -avz --delete rsync://melpa.org/packages/ snapshots/
rsync -avz --delete rsync://melpa.org/packages-stable/ releases/
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;About&lt;/h2&gt; 
&lt;p&gt;&lt;em&gt;MELPA&lt;/em&gt; is &lt;em&gt;Milkypostman&#39;s ELPA&lt;/em&gt; or &lt;em&gt;Milkypostman&#39;s Experimental Lisp Package Archive&lt;/em&gt; if you&#39;re not into the whole brevity thing.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/1e3680511c1e37f7d69f680a599c5f0e8b7944531d8cc441c41b0acfe0dd5022/melpa/melpa" medium="image" />
      
    </item>
    
    <item>
      <title>NixOS/nix-mode</title>
      <link>https://github.com/NixOS/nix-mode</link>
      <description>&lt;p&gt;An Emacs major mode for editing Nix expressions.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;nix-mode&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://melpa.org/#/nix-mode&quot;&gt;&lt;img src=&quot;https://melpa.org/packages/nix-mode-badge.svg?sanitize=true&quot; alt=&quot;MELPA&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://stable.melpa.org/#/nix-mode&quot;&gt;&lt;img src=&quot;https://stable.melpa.org/packages/nix-mode-badge.svg?sanitize=true&quot; alt=&quot;MELPA Stable&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://travis-ci.com/NixOS/nix-mode&quot;&gt;&lt;img src=&quot;https://travis-ci.com/NixOS/nix-mode.svg?branch=master&quot; alt=&quot;Build Status&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;An Emacs major mode for editing Nix expressions. There is also a manual available at &lt;a href=&quot;https://raw.githubusercontent.com/NixOS/nix-mode/master/nix-mode.org&quot;&gt;nix-mode.org&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Submodes&lt;/h2&gt; 
&lt;p&gt;A quick list of what is provided.&lt;/p&gt; 
&lt;h3&gt;nix-mode.el&lt;/h3&gt; 
&lt;p&gt;This is the main usage of nix-mode. This provides basic handling of .nix files. Syntax highlighting and indentation support using SMIE are provided. nix-mode can be used with the following snippet:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(require &#39;nix-mode)
(add-to-list &#39;auto-mode-alist &#39;(&quot;\\.nix\\&#39;&quot; . nix-mode))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;or with use-package:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(use-package nix-mode
  :mode &quot;\\.nix\\&#39;&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;nix.el&lt;/h3&gt; 
&lt;p&gt;nix.el contains some miscellaneous tools for Nix developers. Interactive functions include:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;nix-unpack - unpack source of a Nix attribute.&lt;/p&gt; &lt;p&gt;To use this just type:&lt;/p&gt; &lt;p&gt;M-x nix-unpack
   &lt;ret&gt;&lt;/ret&gt;&lt;/p&gt; &lt;p&gt;Followed by your Nix path &amp;amp; attribute path.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;nix-build - build a Nix derivation.&lt;/p&gt; &lt;p&gt;This is meant to work similarly to M-x compile. It will use your current directory &amp;amp; build it if there is a default.nix there.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;nix.el also provides some basic functions for interfacing with Nix. Some variables are provided to point to the Nix binaries that can be used in Lisp code:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;nix-executable&lt;/li&gt; 
 &lt;li&gt;nix-build-executable&lt;/li&gt; 
 &lt;li&gt;nix-instantiate-executable&lt;/li&gt; 
 &lt;li&gt;nix-store-executable&lt;/li&gt; 
 &lt;li&gt;nix-shell-executable&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Other useful functions for Lisp scripts are provided:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;nix-system - Get the current system, detected by Nix&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;nix-flake.el&lt;/h3&gt; 
&lt;p&gt;nix-flake.el provides support for flake commands. These commands are experimental as of Nix 2.4.&lt;/p&gt; 
&lt;p&gt;It uses transient.el to provide a magit-like interface. To run a command on the current flake, type:&lt;/p&gt; 
&lt;p&gt;M-x nix-flake
 &lt;ret&gt;&lt;/ret&gt;&lt;/p&gt; 
&lt;p&gt;You can also initialize a flake from a template:&lt;/p&gt; 
&lt;p&gt;M-x nix-flake-init
 &lt;ret&gt;&lt;/ret&gt;&lt;/p&gt; 
&lt;h3&gt;nix-repl.el&lt;/h3&gt; 
&lt;p&gt;nix-repl.el has two purposes.&lt;/p&gt; 
&lt;p&gt;First, it provides an interface for completion, used by nix-company.el.&lt;/p&gt; 
&lt;p&gt;Second, it provides an interactive function to open a repl. You can open this with:&lt;/p&gt; 
&lt;p&gt;M-x nix-repl
 &lt;ret&gt;&lt;/ret&gt;&lt;/p&gt; 
&lt;h3&gt;nix-store.el&lt;/h3&gt; 
&lt;p&gt;This file provides a command &lt;code&gt;M-x nix-store-show-path&lt;/code&gt;. The command displays an overview of a store path. The information it shows is the realisation status, the hash and the size of the store path. Also it shows lists of derivers, references, referrers and requisites of the respective path.&lt;/p&gt; 
&lt;p&gt;You can change the order in which that information is shown. See the documentation of the function &lt;code&gt;nix-store-show-path&lt;/code&gt; for more information.&lt;/p&gt; 
&lt;p&gt;When viewing a store buffer, the command &lt;code&gt;M-x nix-store-show-log&lt;/code&gt; opens a local log file associated with a derivation.&lt;/p&gt; 
&lt;h3&gt;nix-prettify-mode.el&lt;/h3&gt; 
&lt;p&gt;When nix-prettify-mode is enabled, hash-parts of the Nix store file names are prettified, i.e. displayed as &lt;code&gt;nix-prettify-char&lt;/code&gt; character (&lt;code&gt;…&lt;/code&gt; by default.).&lt;/p&gt; 
&lt;p&gt;This is based on a similar mode for Guix: &lt;a href=&quot;https://emacs-guix.gitlab.io/website/manual/0.4/html_node/Prettify-Mode.html&quot;&gt;Prettify Mode (Emacs-Guix Reference Manual)&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Origins&lt;/h2&gt; 
&lt;p&gt;This repository is based off of the nix-mode.el file originally located in the &lt;a href=&quot;https://github.com/NixOS/nix&quot;&gt;Nix repository&lt;/a&gt; at &lt;a href=&quot;https://github.com/NixOS/nix/raw/master/misc/emacs/nix-mode.el&quot;&gt;misc/emacs/nix-mode.el&lt;/a&gt;. Please see &lt;a href=&quot;https://github.com/NixOS/nix-mode/raw/master/CHANGELOG.md&quot;&gt;the CHANGELOG file&lt;/a&gt; for a list of changes.&lt;/p&gt; 
&lt;h2&gt;Other Emacs packages&lt;/h2&gt; 
&lt;p&gt;@shlevy has an excellent package for integrating nix-shell into emacs. It is available at &lt;a href=&quot;https://github.com/shlevy/nix-buffer&quot;&gt;shlevy/nix-buffer&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;@travisbhartwell also has some package dealing with Nix. They are available at &lt;a href=&quot;https://github.com/travisbhartwell/nix-emacs&quot;&gt;travisbhartwell/nix-emacs&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/ad036afcf5136c91bea6794522b980e63bbcc606705654acc31edb7f21959c5d/NixOS/nix-mode" medium="image" />
      
    </item>
    
    <item>
      <title>manzaltu/claude-code-ide.el</title>
      <link>https://github.com/manzaltu/claude-code-ide.el</link>
      <description>&lt;p&gt;Claude Code IDE integration for Emacs&lt;/p&gt;&lt;hr&gt;&lt;p&gt;#+TITLE: Claude Code IDE for Emacs #+AUTHOR: Yoav Orot #+EMAIL: &lt;a href=&quot;mailto:orot.yoav@gmail.com&quot;&gt;orot.yoav@gmail.com&lt;/a&gt; #+DESCRIPTION: Claude Code integration for Emacs #+KEYWORDS: emacs, claude, ai, code-assistant #+OPTIONS: toc:t num:nil&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://github.com/manzaltu/claude-code-ide.el/actions/workflows/test.yml&quot;&gt;https://github.com/manzaltu/claude-code-ide.el/actions/workflows/test.yml&lt;/a&gt;][file:&lt;a href=&quot;https://github.com/manzaltu/claude-code-ide.el/workflows/CI/badge.svg&quot;&gt;https://github.com/manzaltu/claude-code-ide.el/workflows/CI/badge.svg&lt;/a&gt;]] [[&lt;a href=&quot;https://www.gnu.org/software/emacs/&quot;&gt;https://www.gnu.org/software/emacs/&lt;/a&gt;][file:&lt;a href=&quot;https://img.shields.io/badge/GNU%20Emacs-28--30-blueviolet.svg&quot;&gt;https://img.shields.io/badge/GNU Emacs-28--30-blueviolet.svg&lt;/a&gt;]] [[&lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0&quot;&gt;https://www.gnu.org/licenses/gpl-3.0&lt;/a&gt;][file:&lt;a href=&quot;https://img.shields.io/badge/License-GPL%20v3-blue.svg&quot;&gt;https://img.shields.io/badge/License-GPL v3-blue.svg&lt;/a&gt;]]&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Overview&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Claude Code IDE for Emacs provides native integration with Claude Code CLI through the Model Context Protocol (MCP). Unlike simple terminal wrappers, this package creates a bidirectional bridge between Claude and Emacs, enabling Claude to understand and leverage Emacs&#39; powerful features—from LSP and project management to custom Elisp functions. This transforms Claude into a true Emacs-aware AI assistant that works within your existing workflow and can interact with your entire Emacs ecosystem.&lt;/p&gt; 
&lt;p&gt;** Features&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Automatic project detection and session management&lt;/li&gt; 
 &lt;li&gt;Terminal integration with full color support using =vterm= or =eat=&lt;/li&gt; 
 &lt;li&gt;MCP protocol implementation for IDE integration&lt;/li&gt; 
 &lt;li&gt;Tool support for file operations, editor state, and workspace info&lt;/li&gt; 
 &lt;li&gt;Extensible MCP tools server for accessing Emacs commands (xrefs, tree-sitter, project info, e.g.)&lt;/li&gt; 
 &lt;li&gt;Diagnostic integration with Flycheck and Flymake&lt;/li&gt; 
 &lt;li&gt;Advanced diff view with ediff integration (modify suggestions before applying)&lt;/li&gt; 
 &lt;li&gt;Tab-bar support for proper context switching&lt;/li&gt; 
 &lt;li&gt;Selection and buffer tracking for better context awareness&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Emacs Tool Integration&lt;/p&gt; 
&lt;p&gt;This package enables Claude Code to leverage the full power of Emacs through MCP tools integration. Claude can directly access and utilize Emacs capabilities including:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;em&gt;Language Server Protocol (LSP)&lt;/em&gt; integration through xref commands for intelligent code navigation (eglot, lsp-mode and others)&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Tree-sitter&lt;/em&gt; for syntax tree analysis and understanding code structure at the AST level&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Imenu&lt;/em&gt; for structured symbol listing and navigation within files&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Project&lt;/em&gt; integration for project-aware operations&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Any Emacs command or function&lt;/em&gt; can be exposed as an MCP tool, allowing Claude to: 
  &lt;ul&gt; 
   &lt;li&gt;Perform project-wide searches and refactoring&lt;/li&gt; 
   &lt;li&gt;Access specialized modes and their features&lt;/li&gt; 
   &lt;li&gt;Execute custom Elisp functions tailored to your workflow&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;This deep integration means Claude Code understands your project context and can leverage Emacs&#39; extensive ecosystem to provide more intelligent and context-aware assistance.&lt;/p&gt; 
&lt;p&gt;** Screenshots&lt;/p&gt; 
&lt;p&gt;*** Active File Awareness #+CAPTION: Claude Code automatically knows which file you&#39;re currently viewing in Emacs #+html: &lt;img src=&quot;https://github.com/manzaltu/claude-code-ide.el/raw/fb517ac3700f92f8d5481f0bcf9fe4a3c26c91ab/screenshots/file.png&quot; /&gt; #+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Claude Code automatically knows which file you&#39;re currently viewing in Emacs&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;*** Code Selection Context #+CAPTION: Claude Code can access and work with selected text in your buffers #+html: &lt;img src=&quot;https://github.com/manzaltu/claude-code-ide.el/raw/fb517ac3700f92f8d5481f0bcf9fe4a3c26c91ab/screenshots/selection.png&quot; /&gt; #+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Claude Code can access and work with selected text in your buffers&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;*** Advanced Diff View with Diagnostics #+CAPTION: Integrated ediff view for code changes, with Claude Code able to directly access diagnostic data (errors, warnings, etc.) from opened files #+html: &lt;img src=&quot;https://github.com/manzaltu/claude-code-ide.el/raw/fb517ac3700f92f8d5481f0bcf9fe4a3c26c91ab/screenshots/ediff_diag.png&quot; /&gt; #+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Integrated ediff view for code changes, with Claude Code able to directly access diagnostic data (errors, warnings, etc.) from opened files&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;*** Automatic Text Mentions #+CAPTION: Automatically mention and reference selected text in Claude conversations #+html: &lt;img src=&quot;https://github.com/manzaltu/claude-code-ide.el/raw/fb517ac3700f92f8d5481f0bcf9fe4a3c26c91ab/screenshots/mentions.png&quot; /&gt; #+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Automatically mention and reference selected text in Claude conversations&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;*** Session Restoration #+CAPTION: Resume previous Claude Code conversations with the --resume flag #+html: &lt;img src=&quot;https://github.com/manzaltu/claude-code-ide.el/raw/fb517ac3700f92f8d5481f0bcf9fe4a3c26c91ab/screenshots/restore.png&quot; /&gt; #+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Resume previous Claude Code conversations with the --resume flag&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Installation&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Prerequisites&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Emacs 28.1 or higher&lt;/li&gt; 
 &lt;li&gt;Claude Code CLI installed and available in PATH&lt;/li&gt; 
 &lt;li&gt;=vterm= or =eat= package (for terminal support)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Installing Claude Code CLI&lt;/p&gt; 
&lt;p&gt;Follow the installation instructions at [[&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code&quot;&gt;https://docs.anthropic.com/en/docs/claude-code&lt;/a&gt;][Claude Code Documentation]].&lt;/p&gt; 
&lt;p&gt;** Installing the Emacs Package&lt;/p&gt; 
&lt;p&gt;Currently, this package is in early development.&lt;/p&gt; 
&lt;p&gt;To install using =emacs-version= &amp;gt;= 30 and =use-package= with the =vc= binding:&lt;/p&gt; 
&lt;p&gt;#+begin_src elisp (use-package claude-code-ide :vc (:url &quot;&lt;a href=&quot;https://github.com/manzaltu/claude-code-ide.el&quot;&gt;https://github.com/manzaltu/claude-code-ide.el&lt;/a&gt;&quot; :rev :newest) :bind (&quot;C-c C-&#39;&quot; . claude-code-ide-menu) ; Set your favorite keybinding :config (claude-code-ide-emacs-tools-setup)) ; Optionally enable Emacs MCP tools #+end_src&lt;/p&gt; 
&lt;p&gt;To install using =use-package= and [[&lt;a href=&quot;https://github.com/raxod502/straight.el&quot;&gt;https://github.com/raxod502/straight.el&lt;/a&gt;][straight.el]]:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (use-package claude-code-ide :straight (:type git :host github :repo &quot;manzaltu/claude-code-ide.el&quot;) :bind (&quot;C-c C-&#39;&quot; . claude-code-ide-menu) ; Set your favorite keybinding :config (claude-code-ide-emacs-tools-setup)) ; Optionally enable Emacs MCP tools #+end_src&lt;/p&gt; 
&lt;p&gt;*** Doom Emacs&lt;/p&gt; 
&lt;p&gt;In =packages.el=:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (package! claude-code-ide :recipe (:host github :repo &quot;manzaltu/claude-code-ide.el&quot;)) #+end_src&lt;/p&gt; 
&lt;p&gt;In =config.el=: #+begin_src emacs-lisp (use-package! claude-code-ide :bind (&quot;C-c C-&#39;&quot; . claude-code-ide-menu) ; Set your favorite keybinding :config (claude-code-ide-emacs-tools-setup)) ; Optionally enable Emacs MCP tools #+end_src&lt;/p&gt; 
&lt;p&gt;After saving the above, run: =doom sync= in the terminal.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Usage&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Basic Commands&lt;/p&gt; 
&lt;p&gt;The easiest way to interact with Claude Code IDE is through the transient menu interface, which provides visual access to all available commands. Simply run =M-x claude-code-ide-menu= to open the interactive menu.&lt;/p&gt; 
&lt;p&gt;| Command | Description | |-----------------------------------------+---------------------------------------------------| | =M-x claude-code-ide-menu= | Open transient menu with all Claude Code commands | | =M-x claude-code-ide-emacs-tools-setup= | Set up built-in MCP tools (e.g. xref, project) | | =M-x claude-code-ide= | Start Claude Code for the current project | | =M-x claude-code-ide-send-prompt= | Send prompt to Claude from minibuffer input | | =M-x claude-code-ide-continue= | Continue most recent conversation in directory | | =M-x claude-code-ide-resume= | Resume Claude Code with previous conversation | | =M-x claude-code-ide-stop= | Stop Claude Code for the current project | | =M-x claude-code-ide-switch-to-buffer= | Switch to project&#39;s Claude buffer | | =M-x claude-code-ide-list-sessions= | List all active Claude Code sessions and switch | | =M-x claude-code-ide-check-status= | Check if Claude Code CLI is installed and working | | =M-x claude-code-ide-insert-at-mentioned= | Send selected text to Claude prompt | | =M-x claude-code-ide-send-escape= | Send escape key to Claude terminal | | =M-x claude-code-ide-insert-newline= | Insert newline in Claude prompt (sends \ + Enter) | | =M-x claude-code-ide-toggle= | Toggle visibility of Claude Code window | | =M-x claude-code-ide-toggle-recent= | Toggle most recent Claude window globally | | =M-x claude-code-ide-show-debug= | Show the debug buffer with WebSocket messages | | =M-x claude-code-ide-clear-debug= | Clear the debug buffer |&lt;/p&gt; 
&lt;p&gt;** Multi-Project Support&lt;/p&gt; 
&lt;p&gt;Claude Code IDE automatically detects your project using Emacs&#39; built-in =project.el=. Each project gets its own Claude Code instance with a unique buffer name like =&lt;em&gt;claude-code[project-name]&lt;/em&gt;=.&lt;/p&gt; 
&lt;p&gt;You can run multiple Claude Code instances simultaneously for different projects. Use =claude-code-ide-list-sessions= to see all active sessions and switch between them.&lt;/p&gt; 
&lt;p&gt;** Window Management&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Running =claude-code-ide= when a session is already active will toggle the window visibility&lt;/li&gt; 
 &lt;li&gt;The window can be closed with standard Emacs window commands (=C-x 0=) without stopping Claude&lt;/li&gt; 
 &lt;li&gt;Use =claude-code-ide-toggle-recent= to toggle the most recent Claude window from anywhere, regardless of your current project context. This is useful when you&#39;re outside a project directory but want to quickly hide/show Claude&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Diff Viewing with Ediff&lt;/p&gt; 
&lt;p&gt;When =claude-code-ide-use-ide-diff= is enabled (default), Claude&#39;s code suggestions are displayed using Emacs&#39; powerful =ediff= interface. This provides two key advantages:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;em&gt;Visual diff comparison&lt;/em&gt; - See exactly what Claude wants to change with side-by-side or unified diff views&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Interactive editing&lt;/em&gt; - You can modify Claude&#39;s suggestions before applying them&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;*** How to use ediff:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;When Claude suggests code changes, =ediff= opens automatically&lt;/li&gt; 
 &lt;li&gt;The ediff control buffer becomes active (a small window with ediff commands)&lt;/li&gt; 
 &lt;li&gt;Buffer A shows the current code, Buffer B shows Claude&#39;s suggestion&lt;/li&gt; 
 &lt;li&gt;You can modify Buffer B to refine Claude&#39;s proposed changes&lt;/li&gt; 
 &lt;li&gt;Press =q= in the ediff control buffer to quit&lt;/li&gt; 
 &lt;li&gt;When prompted, choose whether to accept the changes (=y= or =n=)&lt;/li&gt; 
 &lt;li&gt;If you accept (=y=), any changes from Buffer B will be sent back to Claude to be applied on the original file&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;This allows you to refine Claude&#39;s suggestions before they&#39;re applied, ensuring the final code meets your exact requirements.&lt;/p&gt; 
&lt;p&gt;** Configuration&lt;/p&gt; 
&lt;p&gt;*** Configuration Variables&lt;/p&gt; 
&lt;p&gt;| Variable | Description | Default | |-----------------------------------------------+---------------------------------------------+--------------------------------------| | ~claude-code-ide-cli-path~ | Path to Claude Code CLI | ~&quot;claude&quot;~ | | ~claude-code-ide-buffer-name-function~ | Function for buffer naming | ~claude-code-ide--default-buffer-name~ | | ~claude-code-ide-cli-debug~ | Enable CLI debug mode (-d flag) | ~nil~ | | ~claude-code-ide-cli-extra-flags~ | Additional CLI flags (e.g. &quot;--model&quot;) | ~&quot;&quot;~ | | ~claude-code-ide-debug~ | Enable debug logging | ~nil~ | | ~claude-code-ide-terminal-backend~ | Terminal backend (vterm or eat) | ~&#39;vterm~ | | ~claude-code-ide-vterm-anti-flicker~ | Enable vterm flicker reduction | ~t~ | | ~claude-code-ide-vterm-render-delay~ | vterm render batching delay (seconds) | ~0.005~ | | ~claude-code-ide-terminal-initialization-delay~ | Initialization delay for terminals | ~0.1~ | | ~claude-code-ide-log-with-context~ | Include session context in log messages | ~t~ | | ~claude-code-ide-debug-buffer~ | Buffer name for debug output | ~&quot;&lt;em&gt;claude-code-ide-debug&lt;/em&gt;&quot;~ | | ~claude-code-ide-use-side-window~ | Use side window vs regular buffer | ~t~ | | ~claude-code-ide-window-side~ | Side for Claude window | ~&#39;right~ | | ~claude-code-ide-window-width~ | Body width for side windows (left/right) | ~100~ | | ~claude-code-ide-window-height~ | Height for side windows (top/bottom) | ~20~ | | ~claude-code-ide-focus-on-open~ | Focus Claude window when opened | ~t~ | | ~claude-code-ide-focus-claude-after-ediff~ | Focus Claude window after opening ediff | ~t~ | | ~claude-code-ide-show-claude-window-in-ediff~ | Show Claude window during ediff | ~t~ | | ~claude-code-ide-use-ide-diff~ | Use IDE diff viewer instead of terminal | ~t~ | | ~claude-code-ide-switch-tab-on-ediff~ | Switch to Claude&#39;s tab when opening ediff | ~t~ | | ~claude-code-ide-system-prompt~ | Custom system prompt to append | ~nil~ | | ~claude-code-ide-enable-mcp-server~ | Enable MCP tools server | ~nil~ | | ~claude-code-ide-mcp-server-port~ | Port for MCP tools server | ~nil~ (auto-select) | | ~claude-code-ide-mcp-server-tools~ | Alist of exposed Emacs functions | ~nil~ | | ~claude-code-ide-diagnostics-backend~ | Diagnostics backend (auto/flycheck/flymake) | ~&#39;auto~ | | ~claude-code-ide-no-flicker~ | Enable flicker-free terminal renderer | ~nil~ | | ~claude-code-ide-prevent-reflow-glitch~ | Prevent terminal reflow glitch (bug #1422) | ~t~ | | ~claude-code-ide-enable-execute-code~ | Allow model to evaluate Elisp in Emacs | ~t~ |&lt;/p&gt; 
&lt;p&gt;*** Side Window Configuration&lt;/p&gt; 
&lt;p&gt;Claude Code buffers open in a side window by default. You can customize the placement:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Open Claude on the left side (setq claude-code-ide-window-side &#39;left)&lt;/p&gt; 
&lt;p&gt;;; Open Claude at the bottom with custom height (setq claude-code-ide-window-side &#39;bottom claude-code-ide-window-height 30)&lt;/p&gt; 
&lt;p&gt;;; Open Claude on the right with custom width (setq claude-code-ide-window-side &#39;right claude-code-ide-window-width 100)&lt;/p&gt; 
&lt;p&gt;;; Don&#39;t automatically focus the Claude window (setq claude-code-ide-focus-on-open nil)&lt;/p&gt; 
&lt;p&gt;;; Keep focus on ediff control window when opening diffs (setq claude-code-ide-focus-claude-after-ediff nil)&lt;/p&gt; 
&lt;p&gt;;; Hide Claude window during ediff for more screen space (setq claude-code-ide-show-claude-window-in-ediff nil)&lt;/p&gt; 
&lt;p&gt;;; Disable IDE diff viewer to show diffs in terminal instead (setq claude-code-ide-use-ide-diff nil) #+end_src&lt;/p&gt; 
&lt;p&gt;Or, if you&#39;d prefer to use a regular window:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Use regular window instead of side window (setq claude-code-ide-use-side-window nil) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Terminal Backend Configuration&lt;/p&gt; 
&lt;p&gt;Claude Code IDE supports both =vterm= and =eat= as terminal backends. By default, it uses =vterm=, but you can switch to =eat= if preferred:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Use eat instead of vterm (setq claude-code-ide-terminal-backend &#39;eat)&lt;/p&gt; 
&lt;p&gt;;; Or switch back to vterm (default) (setq claude-code-ide-terminal-backend &#39;vterm) #+end_src&lt;/p&gt; 
&lt;p&gt;The =eat= backend is a pure Elisp terminal emulator that may work better in some environments where =vterm= compilation is problematic. Both backends provide full terminal functionality including color support and special key handling.&lt;/p&gt; 
&lt;p&gt;**** Flicker-Free Renderer (Experimental)&lt;/p&gt; 
&lt;p&gt;Claude Code includes an experimental alternative terminal renderer that eliminates flickering. To enable it:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq claude-code-ide-no-flicker t) #+end_src&lt;/p&gt; 
&lt;p&gt;Note that with this renderer, normal Emacs buffer scrolling and search (=C-s=, =C-r=) will not work in the terminal buffer. Instead, use Claude Code&#39;s built-in keybindings:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;=C-o j= / =C-o k= - Scroll up/down through the transcript&lt;/li&gt; 
 &lt;li&gt;=C-o /= - Search the transcript&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;**** vterm Rendering Optimization&lt;/p&gt; 
&lt;p&gt;Claude Code IDE includes intelligent flicker reduction for vterm terminals to provide smoother visual output:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Enable/disable vterm anti-flicker optimization (enabled by default) (setq claude-code-ide-vterm-anti-flicker t)&lt;/p&gt; 
&lt;p&gt;;; Adjust the render delay for batching updates (default is 0.005 seconds) (setq claude-code-ide-vterm-render-delay 0.01) ; Increase for smoother but less responsive #+end_src&lt;/p&gt; 
&lt;p&gt;This optimization detects rapid terminal redraw sequences (like when Claude expands text areas) and batches them for smoother rendering. The 5ms default delay provides optimal visual quality with imperceptible latency.&lt;/p&gt; 
&lt;p&gt;**** Terminal Initialization Delay&lt;/p&gt; 
&lt;p&gt;Claude Code IDE includes a brief initialization delay when launching terminals to ensure proper layout rendering:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Adjust the terminal initialization delay (default is 0.1 seconds) (setq claude-code-ide-terminal-initialization-delay 0.15)&lt;/p&gt; 
&lt;p&gt;;; Or disable it entirely (may cause visual glitches) (setq claude-code-ide-terminal-initialization-delay 0) #+end_src&lt;/p&gt; 
&lt;p&gt;This delay prevents display artifacts such as misaligned prompts and incorrect cursor positioning that can occur when terminal emulation is initializing. The default 100ms delay is imperceptible but ensures reliable terminal startup.&lt;/p&gt; 
&lt;p&gt;**** Terminal Keybindings&lt;/p&gt; 
&lt;p&gt;Claude Code IDE adds custom keybindings to the terminal for easier interaction:&lt;/p&gt; 
&lt;p&gt;| Keybinding | Command | Description | |------------+--------------------------------+--------------------------------------| | =M-RET= | =claude-code-ide-insert-newline= | Insert a newline in the prompt | | =C-
 &lt;escape&gt;
  = | =claude-code-ide-send-escape= | Send escape key to cancel operations |
 &lt;/escape&gt;&lt;/p&gt; 
&lt;p&gt;These keybindings are automatically set up for both =vterm= and =eat= backends and only apply within Claude Code terminal buffers.&lt;/p&gt; 
&lt;p&gt;**** Terminal Reflow Glitch Prevention (Temporary)&lt;/p&gt; 
&lt;p&gt;Claude Code IDE includes a temporary workaround for a known Claude Code bug ([[&lt;a href=&quot;https://github.com/anthropics/claude-code/issues/1422&quot;&gt;https://github.com/anthropics/claude-code/issues/1422&lt;/a&gt;][#1422]]) where terminal reflows during window resizes can cause uncontrollable scrolling. This workaround is enabled by default but can be disabled if needed:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Disable the terminal reflow glitch prevention (not recommended until bug is fixed) (setq claude-code-ide-prevent-reflow-glitch nil) #+end_src&lt;/p&gt; 
&lt;p&gt;The workaround will be removed once the upstream bug is fixed.&lt;/p&gt; 
&lt;p&gt;*** Diagnostics Configuration&lt;/p&gt; 
&lt;p&gt;Claude Code IDE supports both Flycheck and Flymake for code diagnostics. By default, it will automatically detect which one is active:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Let Claude Code automatically detect the active diagnostics backend (setq claude-code-ide-diagnostics-backend &#39;auto) ; default&lt;/p&gt; 
&lt;p&gt;;; Or force a specific backend (setq claude-code-ide-diagnostics-backend &#39;flycheck) (setq claude-code-ide-diagnostics-backend &#39;flymake) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Elisp Code Execution&lt;/p&gt; 
&lt;p&gt;Claude Code can evaluate Elisp expressions directly in your running Emacs session via the =executeCode= MCP tool. This is enabled by default.&lt;/p&gt; 
&lt;p&gt;To disable it:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq claude-code-ide-enable-execute-code nil) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Custom Buffer Naming&lt;/p&gt; 
&lt;p&gt;You can customize how Claude Code buffers are named:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq claude-code-ide-buffer-name-function (lambda (directory) (if directory (format &quot;&lt;em&gt;Claude:%s&lt;/em&gt;&quot; (file-name-nondirectory (directory-file-name directory))) &quot;&lt;em&gt;Claude:Global&lt;/em&gt;&quot;))) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Custom CLI Flags&lt;/p&gt; 
&lt;p&gt;You can pass additional flags to the Claude Code CLI:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Use a specific model (setq claude-code-ide-cli-extra-flags &quot;--model opus&quot;)&lt;/p&gt; 
&lt;p&gt;;; Pass multiple flags (setq claude-code-ide-cli-extra-flags &quot;--model opus --no-cache&quot;)&lt;/p&gt; 
&lt;p&gt;;; Flags are added to all Claude Code sessions #+end_src&lt;/p&gt; 
&lt;p&gt;Note: These flags are appended to the Claude command after any built-in flags like =-d= (debug) or =-r= (resume).&lt;/p&gt; 
&lt;p&gt;*** Custom System Prompt&lt;/p&gt; 
&lt;p&gt;You can append a custom system prompt to Claude&#39;s default prompt, allowing you to customize Claude&#39;s behavior for specific projects or contexts:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Set a custom system prompt (setq claude-code-ide-system-prompt &quot;You are an expert in Elisp and Emacs development.&quot;)&lt;/p&gt; 
&lt;p&gt;;; Or configure it per-project using dir-locals.el ;; In .dir-locals.el: ((nil . ((claude-code-ide-system-prompt . &quot;Focus on functional programming patterns and avoid mutations.&quot;))))&lt;/p&gt; 
&lt;p&gt;;; Set via the transient menu: M-x claude-code-ide-menu → Configuration → Set system prompt #+end_src&lt;/p&gt; 
&lt;p&gt;When set, this adds the =--append-system-prompt= flag to the Claude command. Set to =nil= to disable (default).&lt;/p&gt; 
&lt;p&gt;*** Debugging&lt;/p&gt; 
&lt;p&gt;**** Claude CLI Debug Mode&lt;/p&gt; 
&lt;p&gt;To enable debug mode for Claude Code CLI (passes the =-d= flag):&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq claude-code-ide-cli-debug t) #+end_src&lt;/p&gt; 
&lt;p&gt;**** Emacs Debug Logging&lt;/p&gt; 
&lt;p&gt;To enable debug logging within Emacs (logs WebSocket messages and JSON-RPC communication):&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq claude-code-ide-debug t) #+end_src&lt;/p&gt; 
&lt;p&gt;Then view debug logs with:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;=M-x claude-code-ide-show-debug= - Show the debug buffer&lt;/li&gt; 
 &lt;li&gt;=M-x claude-code-ide-clear-debug= - Clear the debug buffer&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The debug buffer shows:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;WebSocket connection events&lt;/li&gt; 
 &lt;li&gt;All JSON-RPC messages (requests/responses)&lt;/li&gt; 
 &lt;li&gt;Error messages and diagnostics&lt;/li&gt; 
 &lt;li&gt;General debug information with session context&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Multiple Claude Code Instances on One Project&lt;/p&gt; 
&lt;p&gt;Using git worktrees is the recommended way for running multiple Claude Code instances on different branches of the same project. This allows you to develop features or fix bugs in parallel:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash&lt;/p&gt; 
&lt;h1&gt;Create a new worktree for a feature branch&lt;/h1&gt; 
&lt;p&gt;git worktree add ../myproject-worktree feature-branch #+end_src&lt;/p&gt; 
&lt;p&gt;#+begin_src elisp ;; Start Claude Code in the main project find-file /path/to/myproject M-x claude-code-ide&lt;/p&gt; 
&lt;p&gt;;; Start another Claude Code instance in the worktree find-file /path/to/myproject-worktree M-x claude-code-ide #+end_src&lt;/p&gt; 
&lt;p&gt;Each worktree is treated as a separate project by =project.el=, allowing you to have independent Claude Code sessions with their own buffers (e.g., =&lt;em&gt;claude-code[myproject]&lt;/em&gt;= and =&lt;em&gt;claude-code[myproject-worktree]&lt;/em&gt;=).&lt;/p&gt; 
&lt;p&gt;** Emacs MCP Tools&lt;/p&gt; 
&lt;p&gt;Claude Code IDE includes built-in MCP tools that expose Emacs functionality to Claude, enabling powerful code navigation and analysis capabilities:&lt;/p&gt; 
&lt;p&gt;*** Built-in Tools&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;=xref-find-references= - Find all references to a symbol throughout the project&lt;/li&gt; 
 &lt;li&gt;=xref-find-apropos= - Find symbols matching a pattern across the entire project&lt;/li&gt; 
 &lt;li&gt;=treesit-info= - Get tree-sitter syntax tree information for deep code structure analysis&lt;/li&gt; 
 &lt;li&gt;=imenu-list-symbols= - List all symbols (functions, classes, variables) in a file using imenu&lt;/li&gt; 
 &lt;li&gt;=project-info= - Get information about the current project (directory, files, etc.)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;*** Enabling MCP Tools&lt;/p&gt; 
&lt;p&gt;To enable these tools, add to your configuration:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Set up the built-in Emacs tools (claude-code-ide-emacs-tools-setup) #+end_src&lt;/p&gt; 
&lt;p&gt;Once enabled, Claude can use these tools to navigate your codebase. For example:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&quot;Find the definition of function foo&quot;&lt;/li&gt; 
 &lt;li&gt;&quot;Show me all places where this variable is used&quot;&lt;/li&gt; 
 &lt;li&gt;&quot;What type of AST node is under the cursor?&quot;&lt;/li&gt; 
 &lt;li&gt;&quot;Analyze the parse tree of this entire file&quot;&lt;/li&gt; 
 &lt;li&gt;&quot;List all functions and variables in this file&quot;&lt;/li&gt; 
 &lt;li&gt;&quot;How many files are in this project?&quot;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Creating Custom MCP Tools&lt;/p&gt; 
&lt;p&gt;You can expose your own Emacs functions to Claude through the MCP tools system. This allows Claude to interact with specialized Emacs features, custom commands, or domain-specific functionality.&lt;/p&gt; 
&lt;p&gt;*** Tool Definition Format&lt;/p&gt; 
&lt;p&gt;Define tools using the =claude-code-ide-make-tool= function:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (claude-code-ide-make-tool :function #&#39;function-name ; The Emacs function to call :name &quot;tool_name&quot; ; Name for Claude to use (snake_case recommended) :description &quot;...&quot; ; Human-readable description :args &#39;((:name &quot;param1&quot; ; List of argument specifications :type string ; Type: string, number, integer, boolean, etc. :description &quot;...&quot; ; What this parameter does :optional t))) ; Optional parameters marked with :optional t #+end_src&lt;/p&gt; 
&lt;p&gt;Available argument types: =string=, =number=, =integer=, =boolean=, =array=, =object=, =null=&lt;/p&gt; 
&lt;p&gt;*** Context-Aware Tool Example&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Define a context-aware function that operates in the session&#39;s project (defun my-project-grep (pattern) &quot;Search for PATTERN in the current session&#39;s project.&quot; (claude-code-ide-mcp-server-with-session-context nil ;; This executes with the session&#39;s project directory as default-directory (let* ((project-dir default-directory) (results (shell-command-to-string (format &quot;rg -n &#39;%s&#39; %s&quot; pattern project-dir)))) results)))&lt;/p&gt; 
&lt;p&gt;;; Define and register the tool (automatically added to claude-code-ide-mcp-server-tools) (claude-code-ide-make-tool :function #&#39;my-project-grep :name &quot;my_project_grep&quot; :description &quot;Search for pattern in project files&quot; :args &#39;((:name &quot;pattern&quot; :type string :description &quot;Pattern to search for&quot;)))&lt;/p&gt; 
&lt;p&gt;;; Enable Emacs tool MCP server (claude-code-ide-emacs-tools-setup) #+end_src&lt;/p&gt; 
&lt;p&gt;The =claude-code-ide-mcp-server-with-session-context= macro ensures your tool executes in the correct project context.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;License&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;This project is licensed under the GNU General Public License v3.0 or later. See the LICENSE file for details.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Trademark Notice&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Claude® is a registered trademark of Anthropic, PBC. Claude Code is an application developed by Anthropic, PBC.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Related Projects&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code&quot;&gt;https://docs.anthropic.com/en/docs/claude-code&lt;/a&gt;][Claude Code CLI]]&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/anthropics/claude-code&quot;&gt;https://github.com/anthropics/claude-code&lt;/a&gt;][Claude Code VS Code Extension]]&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/coder/claudecode.nvim&quot;&gt;https://github.com/coder/claudecode.nvim&lt;/a&gt;][claudecode.nvim]] - Neovim integration&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/83478c34ae3ceec09ffa04190a52f48f42b115f361fb0e04c60abd7f8be736e9/manzaltu/claude-code-ide.el" medium="image" />
      
    </item>
    
    <item>
      <title>rust-lang/rust-mode</title>
      <link>https://github.com/rust-lang/rust-mode</link>
      <description>&lt;p&gt;Emacs configuration for Rust&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;rust-mode&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://elpa.nongnu.org/nongnu/rust-mode.html&quot;&gt;&lt;img src=&quot;https://elpa.nongnu.org/nongnu/rust-mode.svg?sanitize=true&quot; alt=&quot;NonGNU ELPA&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://melpa.org/#/rust-mode&quot;&gt;&lt;img src=&quot;https://melpa.org/packages/rust-mode-badge.svg?sanitize=true&quot; alt=&quot;MELPA&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/rust-lang/rust-mode/actions?query=workflow%3ACI&quot;&gt;&lt;img src=&quot;https://github.com/rust-lang/rust-mode/workflows/CI/badge.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;!-- markdown-toc start - Don&#39;t edit this section. Run M-x markdown-toc-refresh-toc --&gt; 
&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#rust-mode&quot;&gt;rust-mode&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#introduction&quot;&gt;Introduction&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#known-issues&quot;&gt;Known issues&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#installation&quot;&gt;Installation&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#melpa&quot;&gt;Melpa&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#manual-installation&quot;&gt;Manual installation&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#feature-guide&quot;&gt;Feature guide&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#indentation&quot;&gt;Indentation&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#code-formatting&quot;&gt;Code formatting&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#prettifying&quot;&gt;Prettifying&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#running--testing--compiling-code&quot;&gt;Running / testing / compiling code&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#clippy&quot;&gt;Clippy&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#easy-insertion-of-dbg&quot;&gt;Easy insertion of dbg!&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#more-commands&quot;&gt;More commands&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#tree-sitter&quot;&gt;tree-sitter&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#lsp&quot;&gt;LSP&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#eglot&quot;&gt;eglot&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#lsp-mode&quot;&gt;lsp-mode&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#auto-completion&quot;&gt;Auto-completion&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#other-recommended-packages&quot;&gt;Other recommended packages&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#flycheck&quot;&gt;flycheck&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#cargoel&quot;&gt;cargo.el&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#cargo-mode&quot;&gt;cargo-mode&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#rustic&quot;&gt;rustic&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#optional-features&quot;&gt;Optional features&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#for-package-maintainers&quot;&gt;For package maintainers&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#tests&quot;&gt;Tests&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#contributing&quot;&gt;Contributing&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- markdown-toc end --&gt; 
&lt;h2&gt;Introduction&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;rust-mode&lt;/code&gt; makes editing &lt;a href=&quot;http://rust-lang.org&quot;&gt;Rust&lt;/a&gt; code with Emacs enjoyable. It requires Emacs 25 or later, and is included in both &lt;a href=&quot;https://github.com/bbatsov/prelude&quot;&gt;Emacs Prelude&lt;/a&gt; and &lt;a href=&quot;https://github.com/syl20bnr/spacemacs&quot;&gt;Spacemacs&lt;/a&gt; by default.&lt;/p&gt; 
&lt;p&gt;This mode provides:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Syntax highlighting (for Font Lock Mode)&lt;/li&gt; 
 &lt;li&gt;Indentation&lt;/li&gt; 
 &lt;li&gt;Integration with Cargo, clippy and rustfmt&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;This mode does &lt;em&gt;not&lt;/em&gt; provide auto completion, or jumping to function / trait definitions. See &lt;a href=&quot;https://raw.githubusercontent.com/rust-lang/rust-mode/master/#auto-completion&quot;&gt;Auto-completion&lt;/a&gt; below for tips on how to enable this.&lt;/p&gt; 
&lt;p&gt;If you are missing features in rust-mode, please check out &lt;a href=&quot;https://github.com/emacs-rustic/rustic&quot;&gt;rustic&lt;/a&gt; before you open a feature request. It depends on rust-mode and provides additional features. This allows us to keep rust-mode light-weight for users that are happy with basic functionality.&lt;/p&gt; 
&lt;h2&gt;Known issues&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;rust-syntax-propertize&lt;/code&gt; and &lt;code&gt;adaptive-wrap-prefix-mode&lt;/code&gt; can lead to severe lag when editing larger files (&lt;a href=&quot;https://github.com/brotzeit/rustic/issues/107&quot;&gt;https://github.com/brotzeit/rustic/issues/107&lt;/a&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;h3&gt;Melpa&lt;/h3&gt; 
&lt;p&gt;The package is available on MELPA. Add this to your init.el.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(require &#39;package)
(add-to-list &#39;package-archives
             &#39;(&quot;melpa&quot; . &quot;https://melpa.org/packages/&quot;) t)
(package-initialize)
(package-refresh-contents)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Now you can install &lt;code&gt;rust-mode&lt;/code&gt; with:&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;M-x package-install rust-mode&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;And put this in your config to load rust-mode automatically:&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;(require &#39;rust-mode)&lt;/code&gt;&lt;/p&gt; 
&lt;h3&gt;NonGNU ELPA&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://elpa.nongnu.org/&quot;&gt;NonGNU ELPA&lt;/a&gt; can be used out of the box in emacs28.&lt;/p&gt; 
&lt;p&gt;For older versions you need to add something like the following to your init file:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(with-eval-after-load &#39;package (add-to-list &#39;package-archives &#39;(&quot;nongnu&quot; . &quot;https://elpa.nongnu.org/nongnu/&quot;)))
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Manual installation&lt;/h3&gt; 
&lt;p&gt;Clone this repository locally, and add this to your init.el:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(add-to-list &#39;load-path &quot;/path/to/rust-mode/&quot;)
(autoload &#39;rust-mode &quot;rust-mode&quot; nil t)
(add-to-list &#39;auto-mode-alist &#39;(&quot;\\.rs\\&#39;&quot; . rust-mode))
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Feature guide&lt;/h2&gt; 
&lt;h3&gt;Indentation&lt;/h3&gt; 
&lt;p&gt;Commands like &lt;kbd&gt;TAB&lt;/kbd&gt; should indent correctly.&lt;/p&gt; 
&lt;p&gt;The Rust style guide recommends spaces rather than tabs for indentation; to follow the recommendation add this to your init.el, which forces indentation to always use spaces.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(add-hook &#39;rust-mode-hook
          (lambda () (setq indent-tabs-mode nil)))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Since Emacs ≥ 24.4, &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Indent-Convenience.html&quot;&gt;&lt;code&gt;electric-indent-mode&lt;/code&gt;&lt;/a&gt; is turned on by default. If you do not like it, call &lt;code&gt;(electric-indent-mode 0)&lt;/code&gt; in &lt;code&gt;rust-mode-hook&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Code formatting&lt;/h3&gt; 
&lt;p&gt;The &lt;code&gt;rust-format-buffer&lt;/code&gt; function will format your code with &lt;a href=&quot;https://github.com/rust-lang/rustfmt&quot;&gt;rustfmt&lt;/a&gt; if installed. By default, this is bound to &lt;kbd&gt;C-c C-f&lt;/kbd&gt;.&lt;/p&gt; 
&lt;p&gt;The variable &lt;code&gt;rust-format-on-save&lt;/code&gt; enables automatic formatting on save. For example, add the following in your init.el to enable format on save:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(setq rust-format-on-save t)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Prettifying&lt;/h3&gt; 
&lt;p&gt;You can toggle prettification of your code by running &lt;code&gt;M-x prettify-symbols-mode&lt;/code&gt;. If you&#39;d like to automatically enable this for all rust files, add the following to your init.el.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(add-hook &#39;rust-mode-hook
          (lambda () (prettify-symbols-mode)))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can add your own prettifications to &lt;code&gt;rust-prettify-symbols-alist&lt;/code&gt;. For example, to display &lt;code&gt;x.add(y)&lt;/code&gt; as &lt;code&gt;x∔(y)&lt;/code&gt;, simply add to your init file &lt;code&gt;(push &#39;(&quot;.add&quot; . ?∔) rust-prettify-symbols-alist)&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Running / testing / compiling code&lt;/h3&gt; 
&lt;p&gt;The &lt;code&gt;rust-run&lt;/code&gt;, &lt;code&gt;rust-test&lt;/code&gt;, &lt;code&gt;rust-compile&lt;/code&gt; and &lt;code&gt;rust-check&lt;/code&gt; functions shell out to Cargo to run, test, build and check your code. Under the hood, these use the standard Emacs &lt;code&gt;compile&lt;/code&gt; function.&lt;/p&gt; 
&lt;p&gt;By default these are bound to:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;kbd&gt;C-c C-c C-u&lt;/kbd&gt; &lt;code&gt;rust-compile&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;kbd&gt;C-c C-c C-k&lt;/kbd&gt; &lt;code&gt;rust-check&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;kbd&gt;C-c C-c C-t&lt;/kbd&gt; &lt;code&gt;rust-test&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;kbd&gt;C-c C-c C-r&lt;/kbd&gt; &lt;code&gt;rust-run&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;To run programs requiring user input use universal argument when invoking &lt;code&gt;rust-run&lt;/code&gt; (&lt;kbd&gt;C-u C-c C-c C-r&lt;/kbd&gt;).&lt;/p&gt; 
&lt;h3&gt;Clippy&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;rust-run-clippy&lt;/code&gt; runs &lt;a href=&quot;https://github.com/rust-lang/rust-clippy&quot;&gt;Clippy&lt;/a&gt;, a linter. By default, this is bound to &lt;kbd&gt;C-c C-c C-l&lt;/kbd&gt;.&lt;/p&gt; 
&lt;h3&gt;Easy insertion of dbg!&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;rust-dbg-wrap-or-unwrap&lt;/code&gt; either wraps or unwraps the current region in &lt;code&gt;dbg!&lt;/code&gt;. This can be useful for easily adding debug lines to your program.&lt;/p&gt; 
&lt;p&gt;This is bound to &lt;kbd&gt;C-c C-d&lt;/kbd&gt; by default.&lt;/p&gt; 
&lt;h3&gt;More commands&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;rust-toggle-mutability&lt;/code&gt; toggle mut for var defined at current line&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;tree-sitter&lt;/h2&gt; 
&lt;p&gt;You can try the new native treesitter mode &lt;code&gt;rust-ts-mode&lt;/code&gt; with:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(use-package rust-mode
  :init
  (setq rust-mode-treesitter-derive t))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;In case you want to use treesitter but can&#39;t use Emacs 29.1, you can take a look at &lt;a href=&quot;https://github.com/emacs-tree-sitter/elisp-tree-sitter&quot;&gt;tree-sitter&lt;/a&gt;. When the dependencies are installed you can activate the feature with:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(use-package tree-sitter
  :config
  (require &#39;tree-sitter-langs)
  (global-tree-sitter-mode)
  (add-hook &#39;tree-sitter-after-on-hook #&#39;tree-sitter-hl-mode))
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;LSP&lt;/h2&gt; 
&lt;h3&gt;eglot&lt;/h3&gt; 
&lt;p&gt;A lightweight lsp client.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(add-hook &#39;rust-mode-hook &#39;eglot-ensure)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;lsp-mode&lt;/h3&gt; 
&lt;p&gt;Provides more features and you can enhance the functionality by using additional packages. You can find more information in the &lt;a href=&quot;https://emacs-lsp.github.io/lsp-mode/page/installation/#vanilla-emacs&quot;&gt;lsp-mode wiki&lt;/a&gt;.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(add-hook &#39;rust-mode-hook #&#39;lsp)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Auto-completion&lt;/h2&gt; 
&lt;p&gt;You can either use a lsp client or &lt;a href=&quot;https://github.com/racer-rust/racer&quot;&gt;racer&lt;/a&gt; with &lt;a href=&quot;https://github.com/racer-rust/emacs-racer#installation&quot;&gt;emacs-racer&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Note that racer and rls are considered deprecated. You should use rust-analyzer instead.&lt;/p&gt; 
&lt;h2&gt;Other recommended packages&lt;/h2&gt; 
&lt;h3&gt;flycheck&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/flycheck/flycheck&quot;&gt;flycheck&lt;/a&gt; allows highlighting compile errors and Clippy lints inline.&lt;/p&gt; 
&lt;h3&gt;cargo.el&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/kwrooijen/cargo.el&quot;&gt;cargo.el&lt;/a&gt; provides a minor mode for integration with Cargo, Rust&#39;s package manager.&lt;/p&gt; 
&lt;h3&gt;cargo-mode&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/ayrat555/cargo-mode&quot;&gt;cargo-mode&lt;/a&gt; is an Emacs minor mode which allows to dynamically select a Cargo command. The reasons behind this package can be found in &lt;a href=&quot;https://www.badykov.com/emacs/2021/05/29/emacs-cargo-mode/&quot;&gt;the post&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;rustic&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/emacs-rustic/rustic&quot;&gt;rustic&lt;/a&gt; is based on rust-mode, extending it with other features such as integration with LSP and with flycheck.&lt;/p&gt; 
&lt;h2&gt;Optional features&lt;/h2&gt; 
&lt;p&gt;The features of the following files can be disabled with &lt;code&gt;rust-load-optional-libraries&lt;/code&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;rust-cargo.el&lt;/li&gt; 
 &lt;li&gt;rust-compile.el&lt;/li&gt; 
 &lt;li&gt;rust-playpen.el&lt;/li&gt; 
 &lt;li&gt;rust-rustfmt.el&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;They are disabled by default when you use rustic as it has its own implementations for those features.&lt;/p&gt; 
&lt;h2&gt;Customization&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;rust-cargo-default-arguments&lt;/code&gt; set additional cargo args used for check,compile,run,test&lt;/p&gt; 
&lt;h2&gt;For package maintainers&lt;/h2&gt; 
&lt;h3&gt;Tests&lt;/h3&gt; 
&lt;p&gt;Run elisp tests:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;make test
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Contributions are very welcome. We are also looking for additional maintainers.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/cde88f19b8b71df1cb1774f2efc92760632c15d4f8ddc7eb3fd433d8cd535c85/rust-lang/rust-mode" medium="image" />
      
    </item>
    
    <item>
      <title>progfolio/elpaca</title>
      <link>https://github.com/progfolio/elpaca</link>
      <description>&lt;p&gt;An elisp package manager&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Elpaca: An Elisp Package Manager&lt;/h1&gt; 
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/images/elpaca.svg?sanitize=true&quot; /&gt;&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt;&quot;Chews data, spits packages.&quot;&lt;/p&gt; 
&lt;p&gt;Elpaca is an elisp package manager. It allows users to find, install, update, and remove third-party packages for Emacs. It is a replacement for the built-in Emacs package manager, package.el.&lt;/p&gt; 
&lt;p&gt;Elpaca:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Installs packages asynchronously, in parallel for fast, non-blocking installations.&lt;/li&gt; 
 &lt;li&gt;Includes a flexible UI for finding and operating on packages.&lt;/li&gt; 
 &lt;li&gt;Downloads packages from their sources for convenient elisp development.&lt;/li&gt; 
 &lt;li&gt;Supports thousands of elisp packages out of the box (MELPA, NonGNU/GNU ELPA, Org/org-contrib).&lt;/li&gt; 
 &lt;li&gt;Makes it easy for users to create their own ELPAs.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;See the &lt;a href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/doc/manual.md&quot;&gt;manual&lt;/a&gt; and &lt;a href=&quot;https://github.com/progfolio/elpaca/wiki&quot;&gt;wiki&lt;/a&gt; for in-depth information on Elpaca usage, customization, and development. Users who wish to experiment with Elpaca may find the example &lt;a href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/doc/init.el&quot;&gt;init.el&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/doc/early-init.el&quot;&gt;early-init.el&lt;/a&gt; files useful.&lt;/p&gt; 
&lt;h1&gt;Video Tour&lt;/h1&gt; 
&lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=5Ud-TE3iIQY&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/images/elpaca-manager-install.gif&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;h3&gt;Requirements&lt;/h3&gt; 
&lt;p&gt;Elpaca requires:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Emacs &amp;gt;= 27.1&lt;/li&gt; 
 &lt;li&gt;git (minimum version TBD)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;a id=&quot;installer&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;Installer&lt;/h3&gt; 
&lt;p&gt;To install Elpaca, add the following elisp to your init.el. It must come before any calls to other Elpaca functions/macros. This will clone Elpaca into your &lt;code&gt;user-emacs-directory&lt;/code&gt; under the &lt;code&gt;elpaca&lt;/code&gt; subdirectory. It then builds and activates Elpaca.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(defvar elpaca-installer-version 0.12)
(defvar elpaca-directory (expand-file-name &quot;elpaca/&quot; user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name &quot;builds/&quot; elpaca-directory))
(defvar elpaca-sources-directory (expand-file-name &quot;sources/&quot; elpaca-directory))
(defvar elpaca-order &#39;(elpaca :repo &quot;https://github.com/progfolio/elpaca.git&quot;
                              :ref nil :depth 1 :inherit ignore
                              :files (:defaults &quot;elpaca-test.el&quot; (:exclude &quot;extensions&quot;))
                              :build (:not elpaca-activate)))
(let* ((repo  (expand-file-name &quot;elpaca/&quot; elpaca-sources-directory))
       (build (expand-file-name &quot;elpaca/&quot; elpaca-builds-directory))
       (order (cdr elpaca-order))
       (default-directory repo))
  (add-to-list &#39;load-path (if (file-exists-p build) build repo))
  (unless (file-exists-p repo)
    (make-directory repo t)
    (when (&amp;lt;= emacs-major-version 28) (require &#39;subr-x))
    (condition-case-unless-debug err
        (if-let* ((buffer (pop-to-buffer-same-window &quot;*elpaca-bootstrap*&quot;))
                  ((zerop (apply #&#39;call-process `(&quot;git&quot; nil ,buffer t &quot;clone&quot;
                                                  ,@(when-let* ((depth (plist-get order :depth)))
                                                      (list (format &quot;--depth=%d&quot; depth) &quot;--no-single-branch&quot;))
                                                  ,(plist-get order :repo) ,repo))))
                  ((zerop (call-process &quot;git&quot; nil buffer t &quot;checkout&quot;
                                        (or (plist-get order :ref) &quot;--&quot;))))
                  (emacs (concat invocation-directory invocation-name))
                  ((zerop (call-process emacs nil buffer nil &quot;-Q&quot; &quot;-L&quot; &quot;.&quot; &quot;--batch&quot;
                                        &quot;--eval&quot; &quot;(byte-recompile-directory \&quot;.\&quot; 0 &#39;force)&quot;)))
                  ((require &#39;elpaca))
                  ((elpaca-generate-autoloads &quot;elpaca&quot; repo)))
            (progn (message &quot;%s&quot; (buffer-string)) (kill-buffer buffer))
          (error &quot;%s&quot; (with-current-buffer buffer (buffer-string))))
      ((error) (warn &quot;%s&quot; err) (delete-directory repo &#39;recursive))))
  (unless (require &#39;elpaca-autoloads nil t)
    (require &#39;elpaca)
    (elpaca-generate-autoloads &quot;elpaca&quot; repo)
    (let ((load-source-file-function nil)) (load &quot;./elpaca-autoloads&quot;))))
(add-hook &#39;after-init-hook #&#39;elpaca-process-queues)
(elpaca `(,@elpaca-order))
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Windows users must be able to create symlinks&lt;sup&gt;&lt;a id=&quot;fnr.-0-1&quot; class=&quot;footref&quot; href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/#fn.-0-1&quot; role=&quot;doc-backlink&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, or enable &lt;code&gt;elpaca-no-symlink-mode&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;;; Uncomment for systems which cannot create symlinks:
;; (elpaca-no-symlink-mode)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You&#39;ll also want to disable package.el in your early-init file&lt;sup&gt;&lt;a id=&quot;fnr.-0-2&quot; class=&quot;footref&quot; href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/#fn.-0-2&quot; role=&quot;doc-backlink&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(setq package-enable-at-startup nil)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;And remove anything related to package.el in your init file. e.g. calls to &lt;code&gt;(package-activate-all)&lt;/code&gt;.&lt;/p&gt; 
&lt;h2&gt;Quick Start&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Operation&lt;/th&gt; 
   &lt;th&gt;UI (keys apply in elpaca-ui-mode)&lt;/th&gt; 
   &lt;th&gt;completing-read interface commands&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Finding Packages&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;g&lt;/code&gt; &lt;code&gt;m&lt;/code&gt; (or &lt;code&gt;M-x&lt;/code&gt; &lt;code&gt;elpaca-manager&lt;/code&gt;)&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-info&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Trying Packages (for current session)&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;i&lt;/code&gt; &lt;code&gt;x&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-try&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Fetching Package Updates&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;f&lt;/code&gt; &lt;code&gt;x&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-fetch&lt;/code&gt; or &lt;code&gt;elpaca-fetch-all&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Merging Updates&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;m&lt;/code&gt; &lt;code&gt;x&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-merge&lt;/code&gt; or &lt;code&gt;elpaca-merge-all&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Updating Packages&lt;sup&gt;*&lt;/sup&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;p&lt;/code&gt; &lt;code&gt;x&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-update&lt;/code&gt; or &lt;code&gt;elpaca-update-all&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Rebuilding Packages&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;r&lt;/code&gt; &lt;code&gt;x&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-rebuild&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Deleting Packages&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;d&lt;/code&gt; &lt;code&gt;x&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-delete&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;View Package Logs&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;g&lt;/code&gt; &lt;code&gt;l&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-log&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Visit Package Source Directory&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;v&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-visit&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Visit Package Build Directory&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;C-u&lt;/code&gt; &lt;code&gt;v&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;C-u M-x&lt;/code&gt; &lt;code&gt;elpaca-visit&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Browse Package Website&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;b&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;elpaca-browse&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;​* Update is an alias for &quot;pull&quot;. It&#39;s encouraged to fetch, review, and &lt;strong&gt;then&lt;/strong&gt; merge package updates rather than pulling.&lt;/p&gt; 
&lt;p&gt;Packages installed via the above commands are not loaded on subsequent Emacs sessions (after restarting). To install and load packages persistently (across Emacs restarts), use the &lt;code&gt;elpaca&lt;/code&gt; macro in your init file after the installer. (&lt;a href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/#installer&quot;&gt;installer&lt;/a&gt;)&lt;/p&gt; 
&lt;p&gt;For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;;; Install a package via the elpaca macro
;; See the &quot;recipes&quot; section of the manual for more details.

;; (elpaca example-package)

;; Install use-package support
(elpaca elpaca-use-package
  ;; Enable use-package :ensure support for Elpaca.
  (elpaca-use-package-mode))

;;When installing a package used in the init file itself,
;;e.g. a package which adds a use-package key word,
;;use the :wait recipe keyword to block until that package is installed/configured.
;;For example:
;;(use-package general :ensure (:wait t) :demand t)

;; Expands to: (elpaca evil (use-package evil :demand t))
(use-package evil :ensure t :demand t)

;;Turns off elpaca-use-package-mode current declaration
;;Note this will cause evaluate the declaration immediately. It is not deferred.
;;Useful for configuring built-in emacs features.
(use-package emacs :ensure nil :config (setq ring-bell-function #&#39;ignore))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;IMPORTANT&lt;/strong&gt;:&lt;/p&gt; 
&lt;p&gt;Elpaca installs and activates packages asynchronously. Elpaca processes its package queues &lt;em&gt;after&lt;/em&gt; Emacs reads the init file.&lt;sup&gt;&lt;a id=&quot;fnr.-0-3&quot; class=&quot;footref&quot; href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/#fn.-0-3&quot; role=&quot;doc-backlink&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; Consider the following example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(elpaca package-a (message &quot;First&quot;)) ; Queue First
(message &quot;Second&quot;) ; Second messaged
(elpaca package-b (message &quot;Third&quot;)) ; Queue Third
(elpaca-process-queues) ; Process queue: First messaged, Third messaged.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&quot;Second&quot; will be message &lt;em&gt;before&lt;/em&gt; &quot;First&quot; and &quot;Third&quot;. If a form should be evaluated after a package is installed/activated, put it in that package declaration&#39;s &lt;em&gt;BODY&lt;/em&gt;. Declaration &lt;em&gt;BODY&lt;/em&gt; forms are evaluated synchronously in declared order. e.g.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(elpaca package-a (message &quot;First&quot;) (message &quot;Second&quot;))  ; Queue First, Second
(elpaca package-b (message &quot;Third&quot;))  ; Queue Third
(elpaca-process-queues) ; Process queue: First, Second, then Third messaged.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Add configuration which relies on &lt;code&gt;after-init-hook&lt;/code&gt;, &lt;code&gt;emacs-startup-hook&lt;/code&gt;, etc to &lt;code&gt;elpaca-after-init-hook&lt;/code&gt; so it runs after Elpaca has activated all queued packages. This includes loading of saved customizations. e.g.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(setq custom-file (expand-file-name &quot;customs.el&quot; user-emacs-directory))
(add-hook &#39;elpaca-after-init-hook (lambda () (load custom-file &#39;noerror)))
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Footnotes&lt;/h2&gt; 
&lt;p&gt;&lt;sup&gt;&lt;a id=&quot;fn.1&quot; class=&quot;footnum&quot; href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/#fnr.1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;a href=&quot;https://www.howtogeek.com/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/&quot;&gt;windows symlink guide&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;sup&gt;&lt;a id=&quot;fn.2&quot; class=&quot;footnum&quot; href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/#fnr.2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Early-Init-File.html&quot;&gt;early-init file&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;sup&gt;&lt;a id=&quot;fn.3&quot; class=&quot;footnum&quot; href=&quot;https://raw.githubusercontent.com/progfolio/elpaca/master/#fnr.3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; This is so Elpaca can build a proper dependency tree. It ensures packages the user explicitly requests are not preempted by dependencies of other packages.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/b8ed2cd08828ee79077b6f50f2b1cec8f231c305b5dc2dda893ebb45a9603ea2/progfolio/elpaca" medium="image" />
      
    </item>
    
    <item>
      <title>karthink/gptel</title>
      <link>https://github.com/karthink/gptel</link>
      <description>&lt;p&gt;A simple, extensible LLM client for Emacs&lt;/p&gt;&lt;hr&gt;&lt;p&gt;#+title: gptel: A simple LLM client for Emacs&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://elpa.nongnu.org/nongnu/gptel.html&quot;&gt;https://elpa.nongnu.org/nongnu/gptel.html&lt;/a&gt;][file:&lt;a href=&quot;https://elpa.nongnu.org/nongnu/gptel.svg&quot;&gt;https://elpa.nongnu.org/nongnu/gptel.svg&lt;/a&gt;]] [[&lt;a href=&quot;https://elpa.nongnu.org/nongnu-devel/gptel.html&quot;&gt;https://elpa.nongnu.org/nongnu-devel/gptel.html&lt;/a&gt;][file:&lt;a href=&quot;https://elpa.nongnu.org/nongnu-devel/gptel.svg&quot;&gt;https://elpa.nongnu.org/nongnu-devel/gptel.svg&lt;/a&gt;]] [[&lt;a href=&quot;https://stable.melpa.org/#/gptel&quot;&gt;https://stable.melpa.org/#/gptel&lt;/a&gt;][file:&lt;a href=&quot;https://stable.melpa.org/packages/gptel-badge.svg&quot;&gt;https://stable.melpa.org/packages/gptel-badge.svg&lt;/a&gt;]] [[&lt;a href=&quot;https://melpa.org/#/gptel&quot;&gt;https://melpa.org/#/gptel&lt;/a&gt;][file:&lt;a href=&quot;https://melpa.org/packages/gptel-badge.svg&quot;&gt;https://melpa.org/packages/gptel-badge.svg&lt;/a&gt;]]&lt;/p&gt; 
&lt;p&gt;gptel is a simple Large Language Model chat client for Emacs, with support for multiple models and backends. It works in the spirit of Emacs, available at any time and uniformly in any buffer.&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;General usage&lt;/em&gt;: ([[&lt;a href=&quot;https://www.youtube.com/watch?v=bsRnh_brggM&quot;&gt;https://www.youtube.com/watch?v=bsRnh_brggM&lt;/a&gt;][YouTube Demo]])&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://user-images.githubusercontent.com/8607532/230516812-86510a09-a2fb-4cbd-b53f-cc2522d05a13.mp4&quot;&gt;https://user-images.githubusercontent.com/8607532/230516812-86510a09-a2fb-4cbd-b53f-cc2522d05a13.mp4&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://user-images.githubusercontent.com/8607532/230516816-ae4a613a-4d01-4073-ad3f-b66fa73c6e45.mp4&quot;&gt;https://user-images.githubusercontent.com/8607532/230516816-ae4a613a-4d01-4073-ad3f-b66fa73c6e45.mp4&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;In-place usage&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/user-attachments/assets/cec11aec-52f6-412e-9e7a-9358e8b9b1bf&quot;&gt;https://github.com/user-attachments/assets/cec11aec-52f6-412e-9e7a-9358e8b9b1bf&lt;/a&gt; #+html: &lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Tool use&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/user-attachments/assets/5f993659-4cfd-49fa-b5cd-19c55766b9b2&quot;&gt;https://github.com/user-attachments/assets/5f993659-4cfd-49fa-b5cd-19c55766b9b2&lt;/a&gt; #+html: &lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/user-attachments/assets/8f57c20b-e1b0-4d86-b972-f46fb90ae1e7&quot;&gt;https://github.com/user-attachments/assets/8f57c20b-e1b0-4d86-b972-f46fb90ae1e7&lt;/a&gt; #+html: &lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;See also [[&lt;a href=&quot;https://youtu.be/g1VMGhC5gRU&quot;&gt;https://youtu.be/g1VMGhC5gRU&lt;/a&gt;][this youtube demo (2 minutes)]] by Armin Darvish.&lt;/p&gt; 
&lt;h1&gt;&lt;em&gt;Media support&lt;/em&gt;&lt;/h1&gt; 
&lt;h1&gt;#+html: &lt;p align=&quot;center&quot;&gt;&lt;/p&gt;&lt;/h1&gt; 
&lt;h1&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/1fd947e1-226b-4be2-bc68-7b22b2e3215f&quot;&gt;https://github.com/user-attachments/assets/1fd947e1-226b-4be2-bc68-7b22b2e3215f&lt;/a&gt;&lt;/h1&gt; 
&lt;h1&gt;#+html: &lt;p&gt;&lt;/p&gt;&lt;/h1&gt; 
&lt;h1&gt;&lt;em&gt;Multi-LLM support demo&lt;/em&gt;:&lt;/h1&gt; 
&lt;h1&gt;&lt;a href=&quot;https://github-production-user-asset-6210df.s3.amazonaws.com/8607532/278854024-ae1336c4-5b87-41f2-83e9-e415349d6a43.mp4&quot;&gt;https://github-production-user-asset-6210df.s3.amazonaws.com/8607532/278854024-ae1336c4-5b87-41f2-83e9-e415349d6a43.mp4&lt;/a&gt;&lt;/h1&gt; 
&lt;hr /&gt; 
&lt;ul&gt; 
 &lt;li&gt;Interact with LLMs from anywhere in Emacs (any buffer, shell, minibuffer, wherever).&lt;/li&gt; 
 &lt;li&gt;LLM responses are in Markdown or Org markup.&lt;/li&gt; 
 &lt;li&gt;Supports multiple independent conversations, one-off ad hoc interactions and anything in between.&lt;/li&gt; 
 &lt;li&gt;Supports tool-use to equip LLMs with agentic capabilities.&lt;/li&gt; 
 &lt;li&gt;Supports Model Context Protocol (MCP) integration using [[&lt;a href=&quot;https://github.com/lizqwerscott/mcp.el&quot;&gt;https://github.com/lizqwerscott/mcp.el&lt;/a&gt;][mcp.el]].&lt;/li&gt; 
 &lt;li&gt;Supports multi-modal input (include images, documents).&lt;/li&gt; 
 &lt;li&gt;Supports &quot;reasoning&quot; content in LLM responses.&lt;/li&gt; 
 &lt;li&gt;Save chats as regular Markdown/Org/Text files and resume them later.&lt;/li&gt; 
 &lt;li&gt;Edit your previous prompts or LLM responses when continuing a conversation. These will be fed back to the model.&lt;/li&gt; 
 &lt;li&gt;Supports introspection, so you can see /exactly/ what will be sent. Inspect and modify queries before sending them.&lt;/li&gt; 
 &lt;li&gt;Pause multi-stage requests at an intermediate stage and resume them later.&lt;/li&gt; 
 &lt;li&gt;Don&#39;t like gptel&#39;s workflow? Use it to create your own for any supported model/backend with a [[&lt;a href=&quot;https://github.com/karthink/gptel/wiki/Defining-custom-gptel-commands&quot;&gt;https://github.com/karthink/gptel/wiki/Defining-custom-gptel-commands&lt;/a&gt;][simple API]].&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;gptel uses Curl if available, but falls back to the built-in url-retrieve to work without external dependencies.&lt;/p&gt; 
&lt;p&gt;** Contents :toc:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[#installation][Installation]] 
  &lt;ul&gt; 
   &lt;li&gt;[[#straight][Straight]]&lt;/li&gt; 
   &lt;li&gt;[[#manual][Manual]]&lt;/li&gt; 
   &lt;li&gt;[[#doom-emacs][Doom Emacs]]&lt;/li&gt; 
   &lt;li&gt;[[#spacemacs][Spacemacs]]&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;[[#setup][Setup]] 
  &lt;ul&gt; 
   &lt;li&gt;[[#chatgpt][ChatGPT]]&lt;/li&gt; 
   &lt;li&gt;[[#other-llm-backends][Other LLM backends]] 
    &lt;ul&gt; 
     &lt;li&gt;[[#optional-securing-api-keys-with-authinfo][(Optional) Securing API keys with =authinfo=]]&lt;/li&gt; 
     &lt;li&gt;[[#optional-reading-api-keys-from-environment-variables][(Optional) Reading API keys from environment variables]]&lt;/li&gt; 
     &lt;li&gt;[[#azure][Azure]]&lt;/li&gt; 
     &lt;li&gt;[[#gpt4all][GPT4All]]&lt;/li&gt; 
     &lt;li&gt;[[#ollama][Ollama]]&lt;/li&gt; 
     &lt;li&gt;[[#open-webui][Open WebUI]]&lt;/li&gt; 
     &lt;li&gt;[[#gemini][Gemini]]&lt;/li&gt; 
     &lt;li&gt;[[#llamacpp-or-llamafile][Llama.cpp or Llamafile]]&lt;/li&gt; 
     &lt;li&gt;[[#kagi-fastgpt--summarizer][Kagi (FastGPT &amp;amp; Summarizer)]]&lt;/li&gt; 
     &lt;li&gt;[[#togetherai][&lt;a href=&quot;http://together.ai&quot;&gt;together.ai&lt;/a&gt;]]&lt;/li&gt; 
     &lt;li&gt;[[#anyscale][Anyscale]]&lt;/li&gt; 
     &lt;li&gt;[[#perplexity][Perplexity]]&lt;/li&gt; 
     &lt;li&gt;[[#anthropic-claude][Anthropic (Claude)]]&lt;/li&gt; 
     &lt;li&gt;[[#groq][Groq]]&lt;/li&gt; 
     &lt;li&gt;[[#mistral-le-chat][Mistral Le Chat]]&lt;/li&gt; 
     &lt;li&gt;[[#openrouter][OpenRouter]]&lt;/li&gt; 
     &lt;li&gt;[[#privategpt][PrivateGPT]]&lt;/li&gt; 
     &lt;li&gt;[[#deepseek][DeepSeek]]&lt;/li&gt; 
     &lt;li&gt;[[#sambanova-deepseek][Sambanova (Deepseek)]]&lt;/li&gt; 
     &lt;li&gt;[[#cerebras][Cerebras]]&lt;/li&gt; 
     &lt;li&gt;[[#github-models][Github Models]]&lt;/li&gt; 
     &lt;li&gt;[[#novita-ai][Novita AI]]&lt;/li&gt; 
     &lt;li&gt;[[#xai][xAI]]&lt;/li&gt; 
     &lt;li&gt;[[#aiml-api][AI/ML API]]&lt;/li&gt; 
     &lt;li&gt;[[#github-copilotchat][GitHub CopilotChat]]&lt;/li&gt; 
     &lt;li&gt;[[#aws-bedrock][AWS Bedrock]]&lt;/li&gt; 
     &lt;li&gt;[[#moonshot-kimi][Moonshot (Kimi)]]&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;[[#usage][Usage]] 
  &lt;ul&gt; 
   &lt;li&gt;[[#in-any-buffer][In any buffer:]]&lt;/li&gt; 
   &lt;li&gt;[[#in-a-dedicated-chat-buffer][In a dedicated chat buffer:]] 
    &lt;ul&gt; 
     &lt;li&gt;[[#including-media-images-documents-or-plain-text-files-with-requests][Including media (images, documents or plain-text files) with requests]]&lt;/li&gt; 
     &lt;li&gt;[[#save-and-restore-your-chat-sessions][Save and restore your chat sessions]]&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;[[#setting-options-backend-model-request-parameters-system-prompts-and-more][Setting options (backend, model, request parameters, system prompts and more)]]&lt;/li&gt; 
   &lt;li&gt;[[#include-more-context-with-requests][Include more context with requests]]&lt;/li&gt; 
   &lt;li&gt;[[#handle-reasoning-content][Handle &quot;reasoning&quot; content]]&lt;/li&gt; 
   &lt;li&gt;[[#tool-use][Tool use]] 
    &lt;ul&gt; 
     &lt;li&gt;[[#defining-gptel-tools][Defining gptel tools]]&lt;/li&gt; 
     &lt;li&gt;[[#selecting-tools][Selecting tools]]&lt;/li&gt; 
     &lt;li&gt;[[#llm-tool-collections][LLM tool collections]]&lt;/li&gt; 
     &lt;li&gt;[[#model-context-protocol-mcp-integration][Model Context Protocol (MCP) integration]]&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;[[#rewrite-refactor-or-fill-in-a-region][Rewrite, refactor or fill in a region]]&lt;/li&gt; 
   &lt;li&gt;[[#extra-org-mode-conveniences][Extra Org mode conveniences]]&lt;/li&gt; 
   &lt;li&gt;[[#introspection-examine-debug-or-modify-requests][Introspection (examine, debug or modify requests)]]&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;[[#faq][FAQ]] 
  &lt;ul&gt; 
   &lt;li&gt;[[#chat-buffer-ui][Chat buffer UI]] 
    &lt;ul&gt; 
     &lt;li&gt;[[#i-want-the-window-to-scroll-automatically-as-the-response-is-inserted][I want the window to scroll automatically as the response is inserted]]&lt;/li&gt; 
     &lt;li&gt;[[#i-want-the-cursor-to-move-to-the-next-prompt-after-the-response-is-inserted][I want the cursor to move to the next prompt after the response is inserted]]&lt;/li&gt; 
     &lt;li&gt;[[#i-want-to-change-the-formatting-of-the-prompt-and-llm-response][I want to change the formatting of the prompt and LLM response]]&lt;/li&gt; 
     &lt;li&gt;[[#how-does-gptel-distinguish-between-user-prompts-and-llm-responses][How does gptel distinguish between user prompts and LLM responses?]]&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;[[#transient-menu-behavior][Transient menu behavior]] 
    &lt;ul&gt; 
     &lt;li&gt;[[#i-want-to-set-gptel-options-but-only-for-this-buffer][I want to set gptel options but only for this buffer]]&lt;/li&gt; 
     &lt;li&gt;[[#i-want-the-transient-menu-options-to-be-saved-so-i-only-need-to-set-them-once][I want the transient menu options to be saved so I only need to set them once]]&lt;/li&gt; 
     &lt;li&gt;[[#using-the-transient-menu-leaves-behind-extra-windows][Using the transient menu leaves behind extra windows]]&lt;/li&gt; 
     &lt;li&gt;[[#can-i-change-the-transient-menu-key-bindings][Can I change the transient menu key bindings?]]&lt;/li&gt; 
     &lt;li&gt;[[#doom-emacs-sending-a-query-from-the-gptel-menu-fails-because-of-a-key-conflict-with-org-mode][(Doom Emacs) Sending a query from the gptel menu fails because of a key conflict with Org mode]]&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;[[#miscellaneous][Miscellaneous]] 
    &lt;ul&gt; 
     &lt;li&gt;[[#i-want-to-use-gptel-in-a-way-thats-not-supported-by-gptel-send-or-the-options-menu][I want to use gptel in a way that&#39;s not supported by =gptel-send= or the options menu]]&lt;/li&gt; 
     &lt;li&gt;[[#chatgpt-i-get-the-error-http2-429-you-exceeded-your-current-quota][(ChatGPT) I get the error &quot;(HTTP/2 429) You exceeded your current quota&quot;]]&lt;/li&gt; 
     &lt;li&gt;[[#why-another-llm-client][Why another LLM client?]]&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;[[#additional-configuration][Additional Configuration]] 
  &lt;ul&gt; 
   &lt;li&gt;[[#option-presets][Option presets]] 
    &lt;ul&gt; 
     &lt;li&gt;[[#applying-presets-to-requests-automatically][Applying presets to requests automatically]]&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;[[#alternatives][Alternatives]] 
  &lt;ul&gt; 
   &lt;li&gt;[[#packages-using-gptel][Packages using gptel]]&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;[[#acknowledgments][Acknowledgments]]&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Installation&lt;/p&gt; 
&lt;p&gt;Note: gptel requires Transient 0.7.4 or higher. Transient is a built-in package and Emacs does not update it by default. Ensure that =package-install-upgrade-built-in= is true, or update Transient manually.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;em&gt;Release version&lt;/em&gt;: =M-x package-install= ⏎ =gptel= in Emacs.&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Development snapshot&lt;/em&gt;: Add MELPA or NonGNU-devel ELPA to your list of package sources, then install with =M-x package-install= ⏎ =gptel=.&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Optional:&lt;/em&gt; Install =markdown-mode=.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;details&gt;
 &lt;summary&gt; *** Straight #+html: &lt;/summary&gt; #+begin_src emacs-lisp (straight-use-package &#39;gptel) #+end_src #+html: 
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; *** Manual #+html: &lt;/summary&gt; Note: gptel requires Transient 0.7.4 or higher. Transient is a built-in package and Emacs does not update it by default. Ensure that =package-install-upgrade-built-in= is true, or update Transient manually.
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Clone or download this repository and run =M-x package-install-file⏎= on the repository directory. #+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; *** Doom Emacs #+html: &lt;/summary&gt; In =packages.el=
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (package! gptel :recipe (:nonrecursive t)) #+end_src&lt;/p&gt; 
 &lt;p&gt;In =config.el=&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (use-package! gptel :config (setq! gptel-api-key &quot;your key&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;&quot;your key&quot; can be the API key itself, or (safer) a function that returns the key. Setting =gptel-api-key= is optional, you will be asked for a key if it&#39;s not found.&lt;/p&gt; 
 &lt;p&gt;Alternatively, Doom Emacs provides a built-in =:tools llm= [[&lt;a href=&quot;https://github.com/doomemacs/doomemacs/tree/master/modules/tools/llm&quot;&gt;https://github.com/doomemacs/doomemacs/tree/master/modules/tools/llm&lt;/a&gt;][module]] powered by gptel. Enable it in your =init.el= in the =doom!= block:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (doom! :tools llm) #+end_src&lt;/p&gt; 
 &lt;p&gt;This installs gptel with preconfigured keybindings (=
  &lt;leader&gt;
    o l=), magit integration for generating commit messages (=M-g= in commit buffers), and packages =gptel-quick= and =gptel-magit=. Run =doom/help-modules= (=
   &lt;leader&gt;
     h d m=) and select =:tools llm= for full documentation.
   &lt;/leader&gt;
  &lt;/leader&gt;&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; *** Spacemacs #+html: &lt;/summary&gt; In your =.spacemacs= file, add =llm-client= to =dotspacemacs-configuration-layers=.
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (llm-client :variables llm-client-enable-gptel t) #+end_src #+html: &lt;/p&gt;
&lt;/details&gt; ** Setup
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;gptel supports a number of LLM providers:&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;
  | LLM Backend | Requires | |----------------------+----------------------------| | ChatGPT | [[
 &lt;a href=&quot;https://platform.openai.com/account/api-keys&quot;&gt;https://platform.openai.com/account/api-keys&lt;/a&gt;][API key]] | | Anthropic (Claude) | [[
 &lt;a href=&quot;https://www.anthropic.com/api&quot;&gt;https://www.anthropic.com/api&lt;/a&gt;][API key]] | | Gemini | [[
 &lt;a href=&quot;https://makersuite.google.com/app/apikey&quot;&gt;https://makersuite.google.com/app/apikey&lt;/a&gt;][API key]] | | Ollama | [[
 &lt;a href=&quot;https://ollama.ai/&quot;&gt;https://ollama.ai/&lt;/a&gt;][Ollama running locally]] | | Open WebUI | [[
 &lt;a href=&quot;https://openwebui.com/&quot;&gt;https://openwebui.com/&lt;/a&gt;][Open WebUI running locally]] | | Llama.cpp | [[
 &lt;a href=&quot;https://github.com/ggml-org/llama.cpp/tree/master/tools/server#quick-start&quot;&gt;https://github.com/ggml-org/llama.cpp/tree/master/tools/server#quick-start&lt;/a&gt;][Llama.cpp running locally]] | | Llamafile | [[
 &lt;a href=&quot;https://github.com/Mozilla-Ocho/llamafile#quickstart&quot;&gt;https://github.com/Mozilla-Ocho/llamafile#quickstart&lt;/a&gt;][Local Llamafile server]] | | GPT4All | [[
 &lt;a href=&quot;https://gpt4all.io/index.html&quot;&gt;https://gpt4all.io/index.html&lt;/a&gt;][GPT4All running locally]] | | Kagi FastGPT | [[
 &lt;a href=&quot;https://kagi.com/settings?p=api&quot;&gt;https://kagi.com/settings?p=api&lt;/a&gt;][API key]] | | Kagi Summarizer | [[
 &lt;a href=&quot;https://kagi.com/settings?p=api&quot;&gt;https://kagi.com/settings?p=api&lt;/a&gt;][API key]] | | Azure | Deployment and API key | | Groq | [[
 &lt;a href=&quot;https://console.groq.com/keys&quot;&gt;https://console.groq.com/keys&lt;/a&gt;][API key]] | | Mistral Le Chat | [[
 &lt;a href=&quot;https://console.mistral.ai/api-keys&quot;&gt;https://console.mistral.ai/api-keys&lt;/a&gt;][API key]] | | Perplexity | [[
 &lt;a href=&quot;https://docs.perplexity.ai/docs/getting-started&quot;&gt;https://docs.perplexity.ai/docs/getting-started&lt;/a&gt;][API key]] | | OpenRouter | [[
 &lt;a href=&quot;https://openrouter.ai/keys&quot;&gt;https://openrouter.ai/keys&lt;/a&gt;][API key]] | | AI/ML API | [[
 &lt;a href=&quot;https://aimlapi.com/app/?utm_source=gptel&amp;amp;utm_medium=github&amp;amp;utm_campaign=integration&quot;&gt;https://aimlapi.com/app/?utm_source=gptel&amp;amp;utm_medium=github&amp;amp;utm_campaign=integration&lt;/a&gt;][API key]] | | 
 &lt;a href=&quot;http://together.ai&quot;&gt;together.ai&lt;/a&gt; | [[
 &lt;a href=&quot;https://api.together.xyz/settings/api-keys&quot;&gt;https://api.together.xyz/settings/api-keys&lt;/a&gt;][API key]] | | Anyscale | [[
 &lt;a href=&quot;https://docs.endpoints.anyscale.com/&quot;&gt;https://docs.endpoints.anyscale.com/&lt;/a&gt;][API key]] | | PrivateGPT | [[
 &lt;a href=&quot;https://github.com/zylon-ai/private-gpt#-documentation&quot;&gt;https://github.com/zylon-ai/private-gpt#-documentation&lt;/a&gt;][PrivateGPT running locally]] | | DeepSeek | [[
 &lt;a href=&quot;https://platform.deepseek.com/api_keys&quot;&gt;https://platform.deepseek.com/api_keys&lt;/a&gt;][API key]] | | Sambanova (Deepseek) | [[
 &lt;a href=&quot;https://cloud.sambanova.ai/apis&quot;&gt;https://cloud.sambanova.ai/apis&lt;/a&gt;][API key]] | | Cerebras | [[
 &lt;a href=&quot;https://cloud.cerebras.ai/&quot;&gt;https://cloud.cerebras.ai/&lt;/a&gt;][API key]] | | Github Models | [[
 &lt;a href=&quot;https://github.com/settings/tokens&quot;&gt;https://github.com/settings/tokens&lt;/a&gt;][Token]] | | Novita AI | [[
 &lt;a href=&quot;https://novita.ai/model-api/product/llm-api?utm_source=github_gptel&amp;amp;utm_medium=github_readme&amp;amp;utm_campaign=link&quot;&gt;https://novita.ai/model-api/product/llm-api?utm_source=github_gptel&amp;amp;utm_medium=github_readme&amp;amp;utm_campaign=link&lt;/a&gt;][Token]] | | xAI | [[
 &lt;a href=&quot;https://console.x.ai?utm_source=github_gptel&amp;amp;utm_medium=github_readme&amp;amp;utm_campaign=link&quot;&gt;https://console.x.ai?utm_source=github_gptel&amp;amp;utm_medium=github_readme&amp;amp;utm_campaign=link&lt;/a&gt;][API key]] | | GitHub CopilotChat | GitHub account | | Bedrock | AWS credentials | | Moonshot (Kimi) | API key ([[
 &lt;a href=&quot;https://platform.moonshot.cn/console&quot;&gt;https://platform.moonshot.cn/console&lt;/a&gt;][CN]] or [[
 &lt;a href=&quot;https://platform.moonshot.ai/console&quot;&gt;https://platform.moonshot.ai/console&lt;/a&gt;][Global]]) | #+html: 
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;*** ChatGPT Procure an [[&lt;a href=&quot;https://platform.openai.com/account/api-keys&quot;&gt;https://platform.openai.com/account/api-keys&lt;/a&gt;][OpenAI API key]].&lt;/p&gt; 
&lt;p&gt;Optional: Set =gptel-api-key= to the key. Alternatively, you may choose a more secure method such as:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Setting it to a custom function that returns the key.&lt;/li&gt; 
 &lt;li&gt;Leaving it set to the default =gptel-api-key-from-auth-source= function which reads keys from =~/.authinfo=. (See [[#optional-securing-api-keys-with-authinfo][authinfo details]])&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;*** Other LLM backends&lt;/p&gt; 
&lt;p&gt;ChatGPT is configured out of the box. If you want to use other LLM backends (like Ollama, Claude/Anthropic or Gemini) you need to register and configure them first.&lt;/p&gt; 
&lt;p&gt;As an example, registering a backend typically looks like the following:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (gptel-make-anthropic &quot;Claude&quot; :stream t :key gptel-api-key) #+end_src&lt;/p&gt; 
&lt;p&gt;Once this backend is registered, you&#39;ll see model names prefixed by &quot;Claude:&quot; appear in gptel&#39;s menu.&lt;/p&gt; 
&lt;p&gt;See below for details on your preferred LLM provider, including local LLMs.&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;details&gt;
 &lt;summary&gt; **** (Optional) Securing API keys with =authinfo= #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;You can use Emacs&#39; built-in support for =authinfo= to store API keys required by gptel. Add your API keys to =~/.authinfo=, and leave =gptel-api-key= set to its default. By default, the API endpoint DNS name (e.g. &quot;&lt;a href=&quot;http://api.openai.com&quot;&gt;api.openai.com&lt;/a&gt;&quot;) is used as HOST and &quot;apikey&quot; as USER.&lt;/p&gt; 
 &lt;p&gt;#+begin_src authinfo machine &lt;a href=&quot;http://api.openai.com&quot;&gt;api.openai.com&lt;/a&gt; login apikey password sk-secret-openai-api-key-goes-here machine &lt;a href=&quot;http://api.anthropic.com&quot;&gt;api.anthropic.com&lt;/a&gt; login apikey password sk-secret-anthropic-api-key-goes-here #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** (Optional) Reading API keys from environment variables #+html: &lt;/summary&gt; Alternatively, you can fetch API keys from variables in Emacs&#39; environment (such as =OPENAI_API_KEY=) using a function like this:
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (defun gptel-api-key-from-environment (&amp;amp;optional var) (lambda () (getenv (or var ;provided key (thread-first ;or fall back to 
  &lt;type&gt;
   _API_KEY (type-of gptel-backend) (symbol-name) (substring 6) (upcase) (concat &quot;_API_KEY&quot;)))))) #+end_src
  &lt;/type&gt;&lt;/p&gt; 
 &lt;p&gt;Then set the =:key= when defining backend to the appropriate environment variable:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-anthropic &quot;My-Claude-backend&quot; :key (gptel-api-key-from-environment &quot;ANTHROPIC_API_KEY&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;If no environment variable is provided:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-gemini &quot;My-Gemini-backend&quot; :key (gptel-api-key-from-environment)) #+end_src&lt;/p&gt; 
 &lt;p&gt;it will try to guess the key from the backend type, /i.e./ try to use =GEMINI_API_KEY= when using the Gemini backend, and so on.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Azure #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-azure &quot;Azure-1&quot; ;Name, whatever you&#39;d like :protocol &quot;https&quot; ;Optional -- https is the default :host &quot;YOUR_RESOURCE_NAME.openai.azure.com&quot; :endpoint &quot;/openai/deployments/YOUR_DEPLOYMENT_NAME/chat/completions?api-version=2023-05-15&quot; ;or equivalent :stream t ;Enable streaming responses :key #&#39;gptel-api-key :models &#39;(gpt-3.5-turbo gpt-4)) #+end_src&lt;/p&gt; 
 &lt;p&gt;Refer to the documentation of =gptel-make-azure= to set more parameters.&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel. (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;gpt-3.5-turbo gptel-backend (gptel-make-azure &quot;Azure-1&quot; :protocol &quot;https&quot; :host &quot;YOUR_RESOURCE_NAME.openai.azure.com&quot; :endpoint &quot;/openai/deployments/YOUR_DEPLOYMENT_NAME/chat/completions?api-version=2023-05-15&quot; :stream t :key #&#39;gptel-api-key :models &#39;(gpt-3.5-turbo gpt-4))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** GPT4All #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-gpt4all &quot;GPT4All&quot; ;Name of your choosing :protocol &quot;http&quot; :host &quot;localhost:4891&quot; ;Where it&#39;s running :models &#39;(mistral-7b-openorca.Q4_0.gguf)) ;Available models #+end_src&lt;/p&gt; 
 &lt;p&gt;These are the required parameters, refer to the documentation of =gptel-make-gpt4all= for more.&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above. Additionally you may want to increase the response token size since GPT4All uses very short (often truncated) responses by default.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-max-tokens 500 gptel-model &#39;mistral-7b-openorca.Q4_0.gguf gptel-backend (gptel-make-gpt4all &quot;GPT4All&quot; :protocol &quot;http&quot; :host &quot;localhost:4891&quot; :models &#39;(mistral-7b-openorca.Q4_0.gguf))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Ollama #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with #+begin_src emacs-lisp (gptel-make-ollama &quot;Ollama&quot; ;Any name of your choosing :host &quot;localhost:11434&quot; ;Where it&#39;s running :stream t ;Stream responses :models &#39;(mistral:latest)) ;List of models #+end_src&lt;/p&gt; 
 &lt;p&gt;These are the required parameters, refer to the documentation of =gptel-make-ollama= for more.&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;mistral:latest gptel-backend (gptel-make-ollama &quot;Ollama&quot; :host &quot;localhost:11434&quot; :stream t :models &#39;(mistral:latest))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;details&gt;
 &lt;summary&gt; **** Open WebUI #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;[[&lt;a href=&quot;https://openwebui.com/&quot;&gt;https://openwebui.com/&lt;/a&gt;][Open WebUI]] is an open source, self-hosted system which provides a multi-user web chat interface and an API endpoint for accessing LLMs, especially LLMs running locally on inference servers like Ollama.&lt;/p&gt; 
 &lt;p&gt;Because it presents an OpenAI-compatible endpoint, you use ~gptel-make-openai~ to register it as a backend.&lt;/p&gt; 
 &lt;p&gt;For instance, you can use this form to register a backend for a local instance of Open Web UI served via http on port 3000:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-openai &quot;OpenWebUI&quot; :host &quot;localhost:3000&quot; :protocol &quot;http&quot; :key &quot;KEY_FOR_ACCESSING_OPENWEBUI&quot; :endpoint &quot;/api/chat/completions&quot; :stream t :models &#39;(&quot;gemma3n:latest&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;Or if you are running Open Web UI on another host on your local network (~box.local~), serving via https with self-signed certificates, this will work:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-openai &quot;OpenWebUI&quot; :host &quot;box.local&quot; :curl-args &#39;(&quot;--insecure&quot;) ; needed for self-signed certs :key &quot;KEY_FOR_ACCESSING_OPENWEBUI&quot; :endpoint &quot;/api/chat/completions&quot; :stream t :models &#39;(&quot;gemma3n:latest&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;To find your API key in Open WebUI, click the user name in the bottom left, Settings, Account, and then Show by API Keys section.&lt;/p&gt; 
 &lt;p&gt;Refer to the documentation of =gptel-make-openai= for more configuration options.&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &quot;gemma3n:latest&quot; gptel-backend (gptel-make-openai &quot;OpenWebUI&quot; :host &quot;localhost:3000&quot; :protocol &quot;http&quot; :key &quot;KEY_FOR_ACCESSING_OPENWEBUI&quot; :endpoint &quot;/api/chat/completions&quot; :stream t :models &#39;(&quot;gemma3n:latest&quot;))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;details&gt;
 &lt;summary&gt; **** Gemini #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; :key can be a function that returns the API key. (gptel-make-gemini &quot;Gemini&quot; :key &quot;YOUR_GEMINI_API_KEY&quot; :stream t) #+end_src&lt;/p&gt; 
 &lt;p&gt;These are the required parameters, refer to the documentation of =gptel-make-gemini= for more.&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;gemini-2.5-pro-exp-03-25 gptel-backend (gptel-make-gemini &quot;Gemini&quot; :key &quot;YOUR_GEMINI_API_KEY&quot; :stream t)) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;details&gt;
  #+html: 
 &lt;summary&gt; **** Llama.cpp or Llamafile #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;(If using a llamafile, run a [[&lt;a href=&quot;https://github.com/Mozilla-Ocho/llamafile#other-example-llamafiles&quot;&gt;https://github.com/Mozilla-Ocho/llamafile#other-example-llamafiles&lt;/a&gt;][server llamafile]] instead of a &quot;command-line llamafile&quot;, and a model that supports text generation.)&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; Llama.cpp offers an OpenAI compatible API (gptel-make-openai &quot;llama-cpp&quot; ;Any name :stream t ;Stream responses :protocol &quot;http&quot; :host &quot;localhost:8000&quot; ;Llama.cpp server location :models &#39;(test)) ;Any names, doesn&#39;t matter for Llama #+end_src&lt;/p&gt; 
 &lt;p&gt;These are the required parameters, refer to the documentation of =gptel-make-openai= for more.&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;test gptel-backend (gptel-make-openai &quot;llama-cpp&quot; :stream t :protocol &quot;http&quot; :host &quot;localhost:8000&quot; :models &#39;(test))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Kagi (FastGPT &amp;amp; Summarizer) #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Kagi&#39;s FastGPT model and the Universal Summarizer are both supported. A couple of notes:&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt; &lt;p&gt;Universal Summarizer: If there is a URL at point, the summarizer will summarize the contents of the URL. Otherwise the context sent to the model is the same as always: the buffer text upto point, or the contents of the region if the region is active.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;Kagi models do not support multi-turn conversations, interactions are &quot;one-shot&quot;. They also do not support streaming responses.&lt;/p&gt; &lt;/li&gt; 
 &lt;/ol&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-kagi &quot;Kagi&quot; ;any name :key &quot;YOUR_KAGI_API_KEY&quot;) ;can be a function that returns the key #+end_src&lt;/p&gt; 
 &lt;p&gt;These are the required parameters, refer to the documentation of =gptel-make-kagi= for more.&lt;/p&gt; 
 &lt;p&gt;You can pick this backend and the model (fastgpt/summarizer) from the transient menu when using gptel.&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;fastgpt gptel-backend (gptel-make-kagi &quot;Kagi&quot; :key &quot;YOUR_KAGI_API_KEY&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;The alternatives to =fastgpt= include =summarize:cecil=, =summarize:agnes=, =summarize:daphne= and =summarize:muriel=. The difference between the summarizer engines is [[&lt;a href=&quot;https://help.kagi.com/kagi/api/summarizer.html#summarization-engines&quot;&gt;https://help.kagi.com/kagi/api/summarizer.html#summarization-engines&lt;/a&gt;][documented here]].&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** &lt;a href=&quot;http://together.ai&quot;&gt;together.ai&lt;/a&gt; #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; &lt;a href=&quot;http://Together.ai&quot;&gt;Together.ai&lt;/a&gt; offers an OpenAI compatible API (gptel-make-openai &quot;TogetherAI&quot; ;Any name you want :host &quot;api.together.xyz&quot; :key &quot;your-api-key&quot; ;can be a function that returns the key :stream t :models &#39;(;; has many more, check &lt;a href=&quot;http://together.ai&quot;&gt;together.ai&lt;/a&gt; mistralai/Mixtral-8x7B-Instruct-v0.1 codellama/CodeLlama-13b-Instruct-hf codellama/CodeLlama-34b-Instruct-hf)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;mistralai/Mixtral-8x7B-Instruct-v0.1 gptel-backend (gptel-make-openai &quot;TogetherAI&quot;&lt;br /&gt; :host &quot;api.together.xyz&quot; :key &quot;your-api-key&quot;&lt;br /&gt; :stream t :models &#39;(;; has many more, check &lt;a href=&quot;http://together.ai&quot;&gt;together.ai&lt;/a&gt; mistralai/Mixtral-8x7B-Instruct-v0.1 codellama/CodeLlama-13b-Instruct-hf codellama/CodeLlama-34b-Instruct-hf))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Anyscale #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; Anyscale offers an OpenAI compatible API (gptel-make-openai &quot;Anyscale&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://api.endpoints.anyscale.com&quot;&gt;api.endpoints.anyscale.com&lt;/a&gt;&quot; :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(;; has many more, check anyscale mistralai/Mixtral-8x7B-Instruct-v0.1)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;mistralai/Mixtral-8x7B-Instruct-v0.1 gptel-backend (gptel-make-openai &quot;Anyscale&quot; :host &quot;&lt;a href=&quot;http://api.endpoints.anyscale.com&quot;&gt;api.endpoints.anyscale.com&lt;/a&gt;&quot; :key &quot;your-api-key&quot; :models &#39;(;; has many more, check anyscale mistralai/Mixtral-8x7B-Instruct-v0.1))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Perplexity #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-perplexity &quot;Perplexity&quot; ;Any name you want :key &quot;your-api-key&quot; ;can be a function that returns the key :stream t) ;If you want responses to be streamed #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;sonar gptel-backend (gptel-make-perplexity &quot;Perplexity&quot; :key &quot;your-api-key&quot; :stream t)) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Anthropic (Claude) #+html: &lt;/summary&gt; Register a backend with
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-anthropic &quot;Claude&quot; ;Any name you want :stream t ;Streaming responses :key &quot;your-api-key&quot;) #+end_src The =:key= can be a function that returns the key (more secure).&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;claude-3-sonnet-20240229 ; &quot;claude-3-opus-20240229&quot; also available gptel-backend (gptel-make-anthropic &quot;Claude&quot; :stream t :key &quot;your-api-key&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Interim support for Claude 3.7 Sonnet&lt;/p&gt; 
 &lt;p&gt;To use Claude 3.7 Sonnet model in its &quot;thinking&quot; mode, you can define a second Claude backend and select it via the UI or elisp:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-anthropic &quot;Claude-thinking&quot; ;Any name you want :key &quot;your-API-key&quot; :stream t :models &#39;(claude-sonnet-4-20250514 claude-3-7-sonnet-20250219) :request-params &#39;(:thinking (:type &quot;enabled&quot; :budget_tokens 2048) :max_tokens 4096)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can set the reasoning budget tokens and max tokens for this usage via the =:budget_tokens= and =:max_tokens= keys here, respectively.&lt;/p&gt; 
 &lt;p&gt;You can control whether/how the reasoning output is shown via gptel&#39;s menu or =gptel-include-reasoning=, see [[#handle-reasoning-content][handling reasoning content]].&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Groq #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; Groq offers an OpenAI compatible API (gptel-make-openai &quot;Groq&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://api.groq.com&quot;&gt;api.groq.com&lt;/a&gt;&quot; :endpoint &quot;/openai/v1/chat/completions&quot; :stream t :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(llama-3.3-70b-versatile llama-3.1-8b-instant llama3-70b-8192 llama3-8b-8192 mixtral-8x7b-32768 gemma-7b-it)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]). Note that Groq is fast enough that you could easily set =:stream nil= and still get near-instant responses.&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;mixtral-8x7b-32768 gptel-backend (gptel-make-openai &quot;Groq&quot; :host &quot;&lt;a href=&quot;http://api.groq.com&quot;&gt;api.groq.com&lt;/a&gt;&quot; :endpoint &quot;/openai/v1/chat/completions&quot; :stream t :key &quot;your-api-key&quot; :models &#39;(llama-3.1-70b-versatile llama-3.1-8b-instant llama3-8b-8192 mixtral-8x7b-32768 gemma-7b-it))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Mistral Le Chat #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; Mistral offers an OpenAI compatible API (gptel-make-openai &quot;MistralLeChat&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://api.mistral.ai&quot;&gt;api.mistral.ai&lt;/a&gt;&quot; :endpoint &quot;/v1/chat/completions&quot; :protocol &quot;https&quot; :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(&quot;mistral-small&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;mistral-small gptel-backend (gptel-make-openai &quot;MistralLeChat&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://api.mistral.ai&quot;&gt;api.mistral.ai&lt;/a&gt;&quot; :endpoint &quot;/v1/chat/completions&quot; :protocol &quot;https&quot; :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(&quot;mistral-small&quot;))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt;&lt;p&gt;&lt;/p&gt; &lt;p&gt;**** OpenRouter #+html: &lt;/p&gt;&lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OpenRouter offers an OpenAI compatible API (gptel-make-openai &quot;OpenRouter&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://openrouter.ai&quot;&gt;openrouter.ai&lt;/a&gt;&quot; :endpoint &quot;/api/v1/chat/completions&quot; :stream t :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(openai/gpt-3.5-turbo mistralai/mixtral-8x7b-instruct meta-llama/codellama-34b-instruct codellama/codellama-70b-instruct google/palm-2-codechat-bison-32k google/gemini-pro))&lt;/p&gt; 
 &lt;p&gt;#+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;mixtral-8x7b-32768 gptel-backend (gptel-make-openai &quot;OpenRouter&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://openrouter.ai&quot;&gt;openrouter.ai&lt;/a&gt;&quot; :endpoint &quot;/api/v1/chat/completions&quot; :stream t :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(openai/gpt-3.5-turbo mistralai/mixtral-8x7b-instruct meta-llama/codellama-34b-instruct codellama/codellama-70b-instruct google/palm-2-codechat-bison-32k google/gemini-pro)))&lt;/p&gt; 
 &lt;p&gt;#+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** PrivateGPT #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-privategpt &quot;privateGPT&quot; ;Any name you want :protocol &quot;http&quot; :host &quot;localhost:8001&quot; :stream t :context t ;Use context provided by embeddings :sources t ;Return information about source documents :models &#39;(private-gpt))&lt;/p&gt; 
 &lt;p&gt;#+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;private-gpt gptel-backend (gptel-make-privategpt &quot;privateGPT&quot; ;Any name you want :protocol &quot;http&quot; :host &quot;localhost:8001&quot; :stream t :context t ;Use context provided by embeddings :sources t ;Return information about source documents :models &#39;(private-gpt)))&lt;/p&gt; 
 &lt;p&gt;#+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** DeepSeek #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-deepseek &quot;DeepSeek&quot; ;Any name you want :stream t ;for streaming responses :key &quot;your-api-key&quot;) ;can be a function that returns the key #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;deepseek-reasoner gptel-backend (gptel-make-deepseek &quot;DeepSeek&quot; :stream t :key &quot;your-api-key&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt;&lt;p&gt;&lt;/p&gt; &lt;p&gt;**** Sambanova (Deepseek) #+html: &lt;/p&gt;&lt;/summary&gt; Sambanova offers various LLMs through their Samba Nova Cloud offering, with Deepseek-R1 being one of them. The token speed for Deepseek R1 via Sambanova is about 6 times faster than when accessed through 
 &lt;a href=&quot;http://deepseek.com&quot;&gt;deepseek.com&lt;/a&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-openai &quot;Sambanova&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://api.sambanova.ai&quot;&gt;api.sambanova.ai&lt;/a&gt;&quot; :endpoint &quot;/v1/chat/completions&quot; :stream t ;for streaming responses :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(DeepSeek-R1)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend The code aboves makes the backend available for selection. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Add these two lines to your configuration:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;DeepSeek-R1) (setq gptel-backend (gptel-get-backend &quot;Sambanova&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt;&lt;p&gt;&lt;/p&gt; &lt;p&gt;**** Cerebras #+html: &lt;/p&gt;&lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; Cerebras offers an instant OpenAI compatible API (gptel-make-openai &quot;Cerebras&quot; :host &quot;&lt;a href=&quot;http://api.cerebras.ai&quot;&gt;api.cerebras.ai&lt;/a&gt;&quot; :endpoint &quot;/v1/chat/completions&quot; :stream t ;optionally nil as Cerebras is instant AI :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(llama3.1-70b llama3.1-8b)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;llama3.1-8b gptel-backend (gptel-make-openai &quot;Cerebras&quot; :host &quot;&lt;a href=&quot;http://api.cerebras.ai&quot;&gt;api.cerebras.ai&lt;/a&gt;&quot; :endpoint &quot;/v1/chat/completions&quot; :stream nil :key &quot;your-api-key&quot; :models &#39;(llama3.1-70b llama3.1-8b))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Github Models #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;NOTE: [[&lt;a href=&quot;https://docs.github.com/en/github-models/about-github-models&quot;&gt;https://docs.github.com/en/github-models/about-github-models&lt;/a&gt;][GitHub Models]] is /not/ GitHub Copilot! If you want to use GitHub Copilot chat via gptel, look at the instructions for GitHub CopilotChat below instead.&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; Github Models offers an OpenAI compatible API (gptel-make-openai &quot;Github Models&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://models.inference.ai.azure.com&quot;&gt;models.inference.ai.azure.com&lt;/a&gt;&quot; :endpoint &quot;/chat/completions?api-version=2024-05-01-preview&quot; :stream t :key &quot;your-github-token&quot; :models &#39;(gpt-4o)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You will need to create a github [[&lt;a href=&quot;https://github.com/settings/personal-access-tokens&quot;&gt;https://github.com/settings/personal-access-tokens&lt;/a&gt;][token]].&lt;/p&gt; 
 &lt;p&gt;For all the available models, check the [[&lt;a href=&quot;https://github.com/marketplace/models&quot;&gt;https://github.com/marketplace/models&lt;/a&gt;][marketplace]].&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;gpt-4o gptel-backend (gptel-make-openai &quot;Github Models&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://models.inference.ai.azure.com&quot;&gt;models.inference.ai.azure.com&lt;/a&gt;&quot; :endpoint &quot;/chat/completions?api-version=2024-05-01-preview&quot; :stream t :key &quot;your-github-token&quot; :models &#39;(gpt-4o)) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Novita AI #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; Novita AI offers an OpenAI compatible API (gptel-make-openai &quot;NovitaAI&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://api.novita.ai&quot;&gt;api.novita.ai&lt;/a&gt;&quot; :endpoint &quot;/v3/openai&quot; :key &quot;your-api-key&quot; ;can be a function that returns the key :stream t :models &#39;(;; has many more, check &lt;a href=&quot;https://novita.ai/llm-api&quot;&gt;https://novita.ai/llm-api&lt;/a&gt; gryphe/mythomax-l2-13b meta-llama/llama-3-70b-instruct meta-llama/llama-3.1-70b-instruct)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;gryphe/mythomax-l2-13b gptel-backend (gptel-make-openai &quot;NovitaAI&quot;&lt;br /&gt; :host &quot;&lt;a href=&quot;http://api.novita.ai&quot;&gt;api.novita.ai&lt;/a&gt;&quot; :endpoint &quot;/v3/openai&quot; :key &quot;your-api-key&quot;&lt;br /&gt; :stream t :models &#39;(;; has many more, check &lt;a href=&quot;https://novita.ai/llm-api&quot;&gt;https://novita.ai/llm-api&lt;/a&gt; mistralai/Mixtral-8x7B-Instruct-v0.1 meta-llama/llama-3-70b-instruct meta-llama/llama-3.1-70b-instruct))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** xAI #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-xai &quot;xAI&quot; ; Any name you want :stream t :key &quot;your-api-key&quot;) ; can be a function that returns the key #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]])&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (setq gptel-model &#39;grok-3-latest gptel-backend (gptel-make-xai &quot;xAI&quot; ; Any name you want :key &quot;your-api-key&quot; ; can be a function that returns the key :stream t)) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** AI/ML API #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;AI/ML API provides 300+ AI models including Deepseek, Gemini, ChatGPT. The models run at enterprise-grade rate limits and uptimes.&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; AI/ML API offers an OpenAI compatible API (gptel-make-openai &quot;AI/ML API&quot; ;Any name you want :host &quot;&lt;a href=&quot;http://api.aimlapi.com&quot;&gt;api.aimlapi.com&lt;/a&gt;&quot; :endpoint &quot;/v1/chat/completions&quot; :stream t :key &quot;your-api-key&quot; ;can be a function that returns the key :models &#39;(deepseek-chat gemini-pro gpt-4o)) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;gpt-4o gptel-backend (gptel-make-openai &quot;AI/ML API&quot; :host &quot;&lt;a href=&quot;http://api.aimlapi.com&quot;&gt;api.aimlapi.com&lt;/a&gt;&quot; :endpoint &quot;/v1/chat/completions&quot; :stream t :key &quot;your-api-key&quot; :models &#39;(deepseek-chat gemini-pro gpt-4o))) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** GitHub CopilotChat #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-gh-copilot &quot;Copilot&quot;) #+end_src&lt;/p&gt; 
 &lt;p&gt;Github copilot is configured to use the public endpoint =api.githubcopilot.com=. Depending on your plan, you may need to use a different host (see [[&lt;a href=&quot;https://github.blog/changelog/2026-02-13-network-configuration-changes-for-copilot-coding-agent/#whats-changing&quot;&gt;https://github.blog/changelog/2026-02-13-network-configuration-changes-for-copilot-coding-agent/#whats-changing&lt;/a&gt;][Copilot plan changes]]):&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Copilot Business: =api.business.githubcopilot.com=&lt;/li&gt; 
  &lt;li&gt;Copilot Enterprise: =api.enterprise.githubcopilot.com=&lt;/li&gt; 
  &lt;li&gt;Copilot Pro and Pro+: =api.individual.githubcopilot.com=&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;You can do this as follows: #+begin_src emacs-lisp (gptel-make-gh-copilot &quot;Copilot&quot; :host &quot;&lt;a href=&quot;http://api.business.githubcopilot.com&quot;&gt;api.business.githubcopilot.com&lt;/a&gt;&quot;) #+end_src&lt;/p&gt; 
 &lt;p&gt;You will be informed to login into =GitHub= as required. You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;claude-3.7-sonnet gptel-backend (gptel-make-gh-copilot &quot;Copilot&quot;)) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** AWS Bedrock #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-bedrock &quot;AWS&quot; ;; optionally enable streaming :stream t :region &quot;ap-northeast-1&quot; ;; subset of gptel--bedrock-models :models &#39;(claude-sonnet-4-20250514) ;; Model region for cross-region inference profiles. Required for models such ;; as Claude without on-demand throughput support. One of &#39;apac, &#39;eu or &#39;us. ;; &lt;a href=&quot;https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-use.html&quot;&gt;https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-use.html&lt;/a&gt; :model-region &#39;apac) #+end_src&lt;/p&gt; 
 &lt;p&gt;AWS has numerous credential provisions; we follow this order precedence,&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;(argument) ~:aws-bearer-token~&lt;/li&gt; 
  &lt;li&gt;(env. variable) ~AWS_BEARER_TOKEN_BEDROCK~&lt;/li&gt; 
  &lt;li&gt;(argument) ~:aws-profile~ If this option is specified, the Bedrock-backend uses the shared AWS config and credentials files to obtain credentials based on the AWS Profile selected. If ~:aws-profile~ is set to the keyword ~:static~, the IAM credentials are imported without a profile argument.&lt;/li&gt; 
  &lt;li&gt;(env. varible) ~AWS_PROFILE~&lt;/li&gt; 
  &lt;li&gt;(env. varible) ~AWS_ACCESS_KEY_ID~, ~AWS_SECRET_ACCESS_KEY~ and ~AWS_SESSION_TOKEN~&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;NOTE: Unless ~AWS_BEARER_TOKEN_BEDROCK~ token is used, the Bedrock backend needs curl &amp;gt;= 8.9 in order for the sigv4 signing to work properly, &lt;a href=&quot;https://github.com/curl/curl/issues/11794&quot;&gt;https://github.com/curl/curl/issues/11794&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;An error will be signalled if ~gptel-use-curl~ is ~NIL~.&lt;/p&gt; 
 &lt;p&gt;You can pick this backend from the menu when using gptel (see [[#usage][Usage]]).&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Set as the default gptel backend&lt;/p&gt; 
 &lt;p&gt;The above code makes the backend available to select. If you want it to be the default backend for gptel, you can set this as the value of =gptel-backend=. Use this instead of the above.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; OPTIONAL configuration (setq gptel-model &#39;claude-sonnet-4-20250514 gptel-backend (gptel-make-bedrock &quot;AWS&quot; ;; optionally enable streaming :stream t ;; optionally specify the aws profile ;; :profile :region &quot;ap-northeast-1&quot; ;; subset of gptel--bedrock-models :models &#39;(claude-sonnet-4-20250514) ;; Model region for cross-region inference profiles. Required for models such ;; as Claude without on-demand throughput support. One of &#39;apac, &#39;eu or &#39;us. ;; &lt;a href=&quot;https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-use.html&quot;&gt;https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-use.html&lt;/a&gt; :model-region &#39;apac)) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Moonshot (Kimi) #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Register a backend with&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-openai &quot;Moonshot&quot; :host &quot;&lt;a href=&quot;http://api.moonshot.cn&quot;&gt;api.moonshot.cn&lt;/a&gt;&quot; ;; or &quot;&lt;a href=&quot;http://api.moonshot.ai&quot;&gt;api.moonshot.ai&lt;/a&gt;&quot; for the global site :key &quot;your-api-key&quot; :stream t ;; optionally enable streaming :models &#39;(kimi-latest kimi-k2-0711-preview)) #+end_src&lt;/p&gt; 
 &lt;p&gt;See [[&lt;a href=&quot;https://platform.moonshot.ai/docs/pricing/chat&quot;&gt;https://platform.moonshot.ai/docs/pricing/chat&lt;/a&gt;][&lt;a href=&quot;http://Moonshot.ai&quot;&gt;Moonshot.ai&lt;/a&gt; document]] for a complete list of models.&lt;/p&gt; 
 &lt;p&gt;***** (Optional) Use the builtin search tool&lt;/p&gt; 
 &lt;p&gt;Moonshot supports a builtin search tool that does not requires the user to provide the tool implementation. To use that, you first need to define the tool and add to =gptel-tools= (while it does not requires the client to provide the search implementation, it does expects the client to reply a tool call message with its given argument, to be consistent with other tool calls):&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (setq gptel-tools (list (gptel-make-tool :name &quot;$web_search&quot; :function (lambda (&amp;amp;optional search_result) (json-serialize `(:search_result ,search_result))) :description &quot;Moonshot builtin web search. Only usable by moonshot model (kimi), ignore this if you are not.&quot; :args &#39;((:name &quot;search_result&quot; :type object :optional t)) :category &quot;web&quot;))) #+end_src&lt;/p&gt; 
 &lt;p&gt;Then you also need to add the tool declaration via =:request-params= because it needs a special =builtin_function= type:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-openai &quot;Moonshot&quot; :host &quot;&lt;a href=&quot;http://api.moonshot.cn&quot;&gt;api.moonshot.cn&lt;/a&gt;&quot; ;; or &quot;&lt;a href=&quot;http://api.moonshot.ai&quot;&gt;api.moonshot.ai&lt;/a&gt;&quot; for the global site :key &quot;your-api-key&quot; :stream t ;; optionally enable streaming :models &#39;(kimi-latest kimi-k2-0711-preview) :request-params &#39;(:tools [(:type &quot;builtin_function&quot; :function (:name &quot;$web_search&quot;))])) #+end_src&lt;/p&gt; 
 &lt;p&gt;Now the chat should be able to automatically use search. Try &quot;what&#39;s new today&quot; and you should expect the up-to-date news in response.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; ** Usage
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;gptel provides a few powerful, general purpose and flexible commands. You can dynamically tweak their behavior to the needs of your task with /directives/, redirection options and more. There is a [[&lt;a href=&quot;https://www.youtube.com/watch?v=bsRnh_brggM&quot;&gt;https://www.youtube.com/watch?v=bsRnh_brggM&lt;/a&gt;][video demo]] showing various uses of gptel -- but =gptel-send= might be all you need.&lt;/p&gt; 
&lt;p&gt;|-------------------+---------------------------------------------------------------------------------------------------| | &lt;em&gt;To send queries&lt;/em&gt; | Description | |-------------------+---------------------------------------------------------------------------------------------------| | =gptel-send= | Send all text up to =(point)=, or the selection if region is active. Works anywhere in Emacs. | | =gptel= | Create a new dedicated chat buffer. Not required to use gptel. | | =gptel-rewrite= | Rewrite, refactor or change the selected region. Can diff/ediff changes before merging/applying. | |-------------------+---------------------------------------------------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;|---------------------+---------------------------------------------------------------| | &lt;em&gt;To tweak behavior&lt;/em&gt; | | |---------------------+---------------------------------------------------------------| | =C-u= =gptel-send= | Transient menu for preferences, input/output redirection etc. | | =gptel-menu= | /(Same)/ | |---------------------+---------------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;|------------------+--------------------------------------------------------------------------------------------------------| | &lt;em&gt;To add context&lt;/em&gt; | | |------------------+--------------------------------------------------------------------------------------------------------| | =gptel-add= | Add/remove a region or buffer to gptel&#39;s context. In Dired, add/remove marked files. | | =gptel-add-file= | Add a file (text or supported media type) to gptel&#39;s context. Also available from the transient menu. | |------------------+--------------------------------------------------------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;|----------------------------+-----------------------------------------------------------------------------------------| | &lt;em&gt;Org mode bonuses&lt;/em&gt; | | |----------------------------+-----------------------------------------------------------------------------------------| | =gptel-org-set-topic= | Limit conversation context to an Org heading. (For branching conversations see below.) | | =gptel-org-set-properties= | Write gptel configuration as Org properties, for per-heading chat configuration. | |----------------------------+-----------------------------------------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;|------------------+-------------------------------------------------------------------------------------------| | &lt;em&gt;GitHub Copilot&lt;/em&gt; | | |------------------+-------------------------------------------------------------------------------------------| | =gptel-gh-login= | Authenticate with GitHub Copilot. (Automatically handled, but can be forced if required.) | |------------------+-------------------------------------------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;*** In any buffer:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Call =M-x gptel-send= to send the text up to the cursor. The response will be inserted below. Continue the conversation by typing below the response.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;If a region is selected, the conversation will be limited to its contents.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Call =M-x gptel-send= with a prefix argument (~C-u~)&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;to set chat parameters (model, backend, system message etc) for this buffer,&lt;/li&gt; 
   &lt;li&gt;include quick instructions for the next request only,&lt;/li&gt; 
   &lt;li&gt;to add additional context -- regions, buffers or files -- to gptel,&lt;/li&gt; 
   &lt;li&gt;to read the prompt from or redirect the response elsewhere,&lt;/li&gt; 
   &lt;li&gt;or to replace the prompt with the response.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;#+html: &lt;img src=&quot;https://github.com/karthink/gptel/assets/8607532/3562a6e2-7a5c-4f7e-8e57-bf3c11589c73&quot; align=&quot;center&quot; alt=&quot;Image showing gptel&#39;s menu with some of the available query options.&quot; /&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;p&gt;You can use =gptel-highlight-mode= to highlight LLM responses in different ways:&lt;/p&gt; 
&lt;p&gt;#+html: &lt;img width=&quot;1226&quot; height=&quot;764&quot; alt=&quot;Image&quot; src=&quot;https://github.com/user-attachments/assets/1a3d5411-3cbc-41cf-b9fa-5089a1ffa096&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;You can also define a &quot;preset&quot; bundle of options that are applied together, see [[#option-presets][Option presets]] below.&lt;/p&gt; 
&lt;p&gt;*** In a dedicated chat buffer:&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: gptel works anywhere in Emacs. The dedicated chat buffer only adds some conveniences.&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Run =M-x gptel= to start or switch to the chat buffer. It will ask you for the key if you skipped the previous step. Run it with a prefix-arg (=C-u M-x gptel=) to start a new session.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;In the gptel buffer, send your prompt with =M-x gptel-send=, bound to =C-c RET=.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Set chat parameters (LLM provider, model, directives etc) for the session by calling =gptel-send= with a prefix argument (=C-u C-c RET=):&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;#+html: &lt;img src=&quot;https://github.com/karthink/gptel/assets/8607532/eb4867e5-30ac-455f-999f-e17123afb810&quot; align=&quot;center&quot; alt=&quot;Image showing gptel&#39;s menu with some of the available query options.&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;That&#39;s it. You can go back and edit previous prompts and responses if you want.&lt;/p&gt; 
&lt;p&gt;The default mode is =markdown-mode= if available, else =text-mode=. You can set =gptel-default-mode= to =org-mode= if desired.&lt;/p&gt; 
&lt;p&gt;You can use =gptel-highlight-mode= to highlight LLM responses in different ways.&lt;/p&gt; 
&lt;p&gt;You can also define a &quot;preset&quot; bundle of options that are applied together, see [[#option-presets][Option presets]] below.&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;details&gt;
 &lt;summary&gt; **** Including media (images, documents or plain-text files) with requests #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;gptel supports sending media in Markdown and Org chat buffers, but this feature is disabled by default.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;You can enable it globally, for all models that support it, by setting =gptel-track-media=.&lt;/li&gt; 
  &lt;li&gt;Or you can set it locally, just for the chat buffer, via the header line or gptel&#39;s transient menu:&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/91f6aaab-2ea4-4806-9cc9-39b4b46a8e6c&quot; align=&quot;center&quot; alt=&quot;Image showing a gptel chat buffer&#39;s header line with the button to toggle media support&quot; /&gt;&lt;/p&gt; 
 &lt;hr /&gt; 
 &lt;p&gt;There are two ways to include media or plain-text files with requests:&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt; &lt;p&gt;Add files to gptel&#39;s context with =gptel-add-file=, described further below.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;Include links to media in chat buffers. gptel will annotate the link to indicate that the linked files will be sent along with the prompt. If a link cannot be sent for some reason, that will be indicated too, and the reason will be shown in a tooltip:&lt;/p&gt; &lt;/li&gt; 
 &lt;/ol&gt; 
 &lt;p&gt;#+html: &lt;img width=&quot;848&quot; height=&quot;336&quot; alt=&quot;Image showing a gptel chat buffer with annotated links, two of which are marked with SEND.  A third link will not be sent, and the echo area contains an explanation for why.&quot; src=&quot;https://github.com/user-attachments/assets/00fd0187-f964-4f55-a392-0a1562bb9118&quot; align=&quot;center&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;Most ways of specifying links to files/URLs are respected by gptel:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;In Markdown mode: 
   &lt;ul&gt; 
    &lt;li&gt;=[](file:///path/to/file.txt)= and =&lt;a href=&quot;https://raw.githubusercontent.com/karthink/gptel/master/path/to/file.txt&quot;&gt;&lt;/a&gt;=&lt;/li&gt; 
    &lt;li&gt;=[Description](file:///path/to/file.txt)= and =&lt;a href=&quot;https://raw.githubusercontent.com/karthink/gptel/master/path/to/file.txt&quot;&gt;Description&lt;/a&gt;=&lt;/li&gt; 
    &lt;li&gt;=&amp;lt;file:///path/to/file.txt&amp;gt;= &quot;Plain&quot; links of the form =file:///path/to/file.txt= will not be recognized.&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt;In Org mode: 
   &lt;ul&gt; 
    &lt;li&gt;=[[file:/path/to/file.txt]]=&lt;/li&gt; 
    &lt;li&gt;=[[file:/path/to/file.txt][Description]]=&lt;/li&gt; 
    &lt;li&gt;=&amp;lt;file:/path/to/file.txt&amp;gt;=&lt;/li&gt; 
    &lt;li&gt;=[[attachment:data.txt]]= &quot;Plain&quot; links of the form =file:/path/to/file.txt= will not be recognized.&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;Support for custom Org link types is planned.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Save and restore your chat sessions #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Saving the file will save the state of the conversation as well. To resume the chat, open the file and turn on =gptel-mode= before editing the buffer.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; *** Setting options (backend, model, request parameters, system prompts and more)
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;Most gptel options can be set from gptel&#39;s transient menu, available by calling =gptel-send= with a prefix-argument, or via =gptel-menu=. To change their default values in your configuration, see [[#additional-configuration][Additional Configuration]]. Chat buffer-specific options are also available via the header-line in chat buffers.&lt;/p&gt; 
&lt;h1&gt;TODO Remove this when writing the manual.&lt;/h1&gt; 
&lt;p&gt;Selecting a model and backend can be done interactively via the =-m= command of =gptel-menu=. Available registered models are prefixed by the name of their backend with a string like =ChatGPT:gpt-4o-mini=, where =ChatGPT= is the backend name you used to register it and =gpt-4o-mini= is the name of the model.&lt;/p&gt; 
&lt;p&gt;*** Include more context with requests :PROPERTIES: :CUSTOM_ID: include-context :END:&lt;/p&gt; 
&lt;p&gt;By default, gptel will query the LLM with the active region or the buffer contents up to the cursor. Often it can be helpful to provide the LLM with additional context from outside the current buffer. For example, when you&#39;re in a chat buffer but want to ask questions about a (possibly changing) code buffer and auxiliary project files.&lt;/p&gt; 
&lt;p&gt;You can include additional text regions, buffers or files with gptel&#39;s queries in two ways. The first is via links in chat buffers, as described above (see &quot;Including media with requests&quot;).&lt;/p&gt; 
&lt;p&gt;The second is globally via dedicated context commands: you can add a selected region, buffer or file to gptel&#39;s context from the menu, or call =gptel-add=. To add a file use =gptel-add= in Dired, or use the dedicated =gptel-add-file= command. Directories will have their files added recursively after prompting for confirmation.&lt;/p&gt; 
&lt;p&gt;This additional context is &quot;live&quot; and not a snapshot. Once added, the regions, buffers or files are scanned and included at the time of each query. When using multi-modal models, added files can be of any supported type -- typically images.&lt;/p&gt; 
&lt;p&gt;You can examine the active context from the menu: #+html: &amp;lt;img src=&quot;&lt;a href=&quot;https://github.com/karthink/gptel/assets/8607532/63cd7fc8-6b3e-42ae-b6ca-06ff935bae9c&quot;&gt;https://github.com/karthink/gptel/assets/8607532/63cd7fc8-6b3e-42ae-b6ca-06ff935bae9c&lt;/a&gt;&quot; align=&quot;center&quot; alt=&quot;Image showing gptel&#39;s menu with the &quot;inspect context&quot; command.&quot;&amp;gt;&lt;/p&gt; 
&lt;p&gt;And then browse through or remove context from the context buffer: #+html: &lt;img src=&quot;https://github.com/karthink/gptel/assets/8607532/79a5ffe8-3d63-4bf7-9bf6-0457ab61bf2a&quot; align=&quot;center&quot; alt=&quot;Image showing gptel&#39;s context buffer.&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;By default, files in a version control system that are not project files (&quot;gitignored&quot; files) will not be added to the context. To be able to add these files, set =gptel-context-restrict-to-project-files= to =nil=. Note that remote files are always included, regardless of the value of =gptel-context-restrict-to-project-files=.&lt;/p&gt; 
&lt;p&gt;*** Handle &quot;reasoning&quot; content&lt;/p&gt; 
&lt;p&gt;Some LLMs include in their response a &quot;thinking&quot; or &quot;reasoning&quot; block. This text improves the quality of the LLM’s final output, but may not be interesting to you by itself. You can decide how you would like this &quot;reasoning&quot; content to be handled by gptel by setting the user option =gptel-include-reasoning=. You can include it in the LLM response (the default), omit it entirely, include it in the buffer but ignore it on subsequent conversation turns, or redirect it to another buffer. As with most options, you can specify this behavior from gptel&#39;s transient menu globally, buffer-locally or for the next request only.&lt;/p&gt; 
&lt;p&gt;When included with the response, reasoning content will be delimited by Org blocks or markdown backticks.&lt;/p&gt; 
&lt;p&gt;*** Tool use&lt;/p&gt; 
&lt;p&gt;gptel can provide the LLM with client-side elisp &quot;tools&quot;, or function specifications, along with the request. If the LLM decides to run the tool, it supplies the tool call arguments, which gptel uses to run the tool in your Emacs session. The result is optionally returned to the LLM to complete the task.&lt;/p&gt; 
&lt;p&gt;This exchange can be used to equip the LLM with capabilities or knowledge beyond what is available out of the box -- for instance, you can get the LLM to control your Emacs frame, create or modify files and directories, or look up information relevant to your request via web search or in a local database. Here is a very simple example:&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/user-attachments/assets/d1f8e2ac-62bb-49bc-850d-0a67aa0cd4c3&quot;&gt;https://github.com/user-attachments/assets/d1f8e2ac-62bb-49bc-850d-0a67aa0cd4c3&lt;/a&gt; #+html: &lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;To use tools in gptel, you need&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;a model that supports this usage. All the flagship models support tool use, as do many of the smaller open models.&lt;/li&gt; 
 &lt;li&gt;Tool specifications that gptel understands. gptel does not currently include any tools out of the box.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;details&gt;
 &lt;summary&gt; **** Defining gptel tools #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Defining a gptel tool requires an elisp function and associated metadata. Here are two simple tool definitions:&lt;/p&gt; 
 &lt;p&gt;&lt;em&gt;To read the contents of an Emacs buffer&lt;/em&gt;:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-tool :name &quot;read_buffer&quot; ; javascript-style snake_case name :function (lambda (buffer) ; the function that will run (unless (buffer-live-p (get-buffer buffer)) (error &quot;error: buffer %s is not live.&quot; buffer)) (with-current-buffer buffer (buffer-substring-no-properties (point-min) (point-max)))) :description &quot;return the contents of an emacs buffer&quot; :args (list &#39;(:name &quot;buffer&quot; :type string ; :type value must be a symbol :description &quot;the name of the buffer whose contents are to be retrieved&quot;)) :category &quot;emacs&quot;) ; An arbitrary label for grouping #+end_src&lt;/p&gt; 
 &lt;p&gt;Besides the function itself, which can be named or anonymous (as above), the tool specification requires a =:name=, =:description= and a list of argument specifications in =:args=. Each argument specification is a plist with atleast the keys =:name=, =:type= and =:description=.&lt;/p&gt; 
 &lt;p&gt;&lt;em&gt;To create a text file&lt;/em&gt;:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (gptel-make-tool :name &quot;create_file&quot; ; javascript-style snake_case name :function (lambda (path filename content) ; the function that runs (let ((full-path (expand-file-name filename path))) (with-temp-buffer (insert content) (write-file full-path)) (format &quot;Created file %s in %s&quot; filename path))) :description &quot;Create a new file with the specified content&quot; :args (list &#39;(:name &quot;path&quot; ; a list of argument specifications :type string :description &quot;The directory where to create the file&quot;) &#39;(:name &quot;filename&quot; :type string :description &quot;The name of the file to create&quot;) &#39;(:name &quot;content&quot; :type string :description &quot;The content to write to the file&quot;)) :category &quot;filesystem&quot;) ; An arbitrary label for grouping #+end_src&lt;/p&gt; 
 &lt;p&gt;With some prompting, you can get an LLM to write these tools for you.&lt;/p&gt; 
 &lt;p&gt;Tools can also be asynchronous, use optional arguments and arguments with more structure (enums, arrays, objects etc). See =gptel-make-tool= for details.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Selecting tools #+html: &lt;/summary&gt; Once defined, tools can be selected (globally, buffer-locally or for the next request only) from gptel&#39;s transient menu:
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/fd878596-b313-4385-b675-3d6546909d8b&quot; align=&quot;center&quot; alt=&quot;Image showing gptel&#39;s tool selection menu.&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;From here you can also require confirmation for all tool calls, and decide if tool call results should be included in the LLM response.&lt;/p&gt; 
 &lt;p&gt;Alternatively, you can add/remove tools via&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Elisp, see [[#additional-configuration][Additional Configuration]].&lt;/li&gt; 
  &lt;li&gt;gptel presets, see [[#option-presets][Option presets]].&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** LLM tool collections #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;The following repositories provide collections of tools written by gptel users.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;[[&lt;a href=&quot;https://github.com/skissue/llm-tool-collection&quot;&gt;https://github.com/skissue/llm-tool-collection&lt;/a&gt;][llm-tool-collection]] :: A community collection of tools for use with LLM clients in Emacs. Includes LLM tools for interacting with files, Emacs buffers and running system commands.&lt;/li&gt; 
  &lt;li&gt;[[&lt;a href=&quot;https://github.com/karthink/gptel-agent&quot;&gt;https://github.com/karthink/gptel-agent&lt;/a&gt;][gptel-agent]] :: A collection of tools meant for agentic LLM use. Includes tools for filesystem access and manipulation, running Bash commands, Emacs introspection and Elisp evaluation, web search and YouTube.&lt;/li&gt; 
  &lt;li&gt;[[&lt;a href=&quot;https://github.com/ultronozm/codel.el&quot;&gt;https://github.com/ultronozm/codel.el&lt;/a&gt;][codel.el]] :: A collection of code editing tools.&lt;/li&gt; 
  &lt;li&gt;[[&lt;a href=&quot;https://codeberg.org/bajsicki/gptel-org-tools&quot;&gt;https://codeberg.org/bajsicki/gptel-org-tools&lt;/a&gt;][gptel-org-tools]] :: Tools for interacting with Org files.&lt;/li&gt; 
  &lt;li&gt;[[&lt;a href=&quot;https://github.com/positron-solutions/ragmacs&quot;&gt;https://github.com/positron-solutions/ragmacs&lt;/a&gt;][ragmacs]] :: A collection of tools for Emacs introspection.&lt;/li&gt; 
  &lt;li&gt;[[&lt;a href=&quot;https://github.com/munen/emacs.d?tab=readme-ov-file#tool-use&quot;&gt;https://github.com/munen/emacs.d?tab=readme-ov-file#tool-use&lt;/a&gt;][Alain Lafon’s tool collection]]&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;Additionally, the [[&lt;a href=&quot;https://github.com/karthink/gptel/wiki/Tools-collection&quot;&gt;https://github.com/karthink/gptel/wiki/Tools-collection&lt;/a&gt;][wiki has some examples]] of common tools. These are not maintained, but might serve instructional when writing custom tools.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Model Context Protocol (MCP) integration #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;The [[&lt;a href=&quot;https://modelcontextprotocol.io/introduction&quot;&gt;https://modelcontextprotocol.io/introduction&lt;/a&gt;][Model Context Protocol]] (MCP) is a protocol for providing resources and tools to LLMs, and [[&lt;a href=&quot;https://github.com/appcypher/awesome-mcp-servers&quot;&gt;https://github.com/appcypher/awesome-mcp-servers&lt;/a&gt;][many MCP servers exist]] that provide LLM tools for file access, database connections, API integrations etc. The [[mcp.el]] package for Emacs can act as an MCP client and manage these tool calls for gptel.&lt;/p&gt; 
 &lt;p&gt;To use MCP servers with gptel, you thus need three pieces:&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt;The [[&lt;a href=&quot;https://github.com/lizqwerscott/mcp.el&quot;&gt;https://github.com/lizqwerscott/mcp.el&lt;/a&gt;][mcp.el]] package for Emacs, [[&lt;a href=&quot;https://melpa.org/#/mcp&quot;&gt;https://melpa.org/#/mcp&lt;/a&gt;][available on MELPA]].&lt;/li&gt; 
  &lt;li&gt;MCP servers configured for and running via mcp.el.&lt;/li&gt; 
  &lt;li&gt;gptel and access to an LLM&lt;/li&gt; 
 &lt;/ol&gt; 
 &lt;p&gt;gptel includes =gptel-integrations=, a small library to make this more convenient. This library is not automatically loaded by gptel, so if you would like to use it you have to require it:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (require &#39;gptel-integrations) #+end_src&lt;/p&gt; 
 &lt;p&gt;Once loaded, you can run the =gptel-mcp-connect= and =gptel-mcp-disconnect= commands to register and unregister MCP-provided tools in gptel. These will also show up in the tools menu in gptel, accessed via =M-x gptel-menu= or =M-x gptel-tools=:&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/2cbbf8a0-49c7-49a5-ba24-514ad7e08799&quot; align=&quot;center&quot; alt=&quot;Image showing MCP tool registration commands in gptel&#39;s tool selection menu.&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;MCP-provided tools can be used as normal with gptel. Here is a screencast of the process. (In this example the &quot;github&quot; MCP server is installed separately using npm.)&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
 &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/user-attachments/assets/f3ea7ac0-a322-4a59-b5b2-b3f592554f8a&quot;&gt;https://github.com/user-attachments/assets/f3ea7ac0-a322-4a59-b5b2-b3f592554f8a&lt;/a&gt; #+html: &lt;/p&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Here&#39;s an example of using these tools:&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
 &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/user-attachments/assets/b48a6a24-a130-4da7-a2ee-6ea568e10c85&quot;&gt;https://github.com/user-attachments/assets/b48a6a24-a130-4da7-a2ee-6ea568e10c85&lt;/a&gt; #+html: &lt;/p&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;*** Rewrite, refactor or fill in a region&lt;/p&gt; 
&lt;p&gt;In any buffer: with a region selected, you can modify text, rewrite prose or refactor code with =gptel-rewrite=. Example with prose:&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/user-attachments/assets/e3b436b3-9bde-4c1f-b2ce-3f7df1984933&quot;&gt;https://github.com/user-attachments/assets/e3b436b3-9bde-4c1f-b2ce-3f7df1984933&lt;/a&gt; #+html: &lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;The result is previewed over the original text. By default, the buffer is not modified.&lt;/p&gt; 
&lt;p&gt;Pressing =RET= or clicking in the rewritten region should give you a list of options: you can &lt;em&gt;iterate&lt;/em&gt; on, &lt;em&gt;diff&lt;/em&gt;, &lt;em&gt;ediff&lt;/em&gt;, &lt;em&gt;merge&lt;/em&gt; or &lt;em&gt;accept&lt;/em&gt; the replacement. Example with code:&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/user-attachments/assets/4067fdb8-85d3-4264-9b64-d727353f68f9&quot;&gt;https://github.com/user-attachments/assets/4067fdb8-85d3-4264-9b64-d727353f68f9&lt;/a&gt; #+html: &lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Acting on the LLM response&lt;/em&gt;:&lt;/p&gt; 
&lt;p&gt;If you would like one of these things to happen automatically, you can customize =gptel-rewrite-default-action=.&lt;/p&gt; 
&lt;p&gt;These options are also available from =gptel-rewrite=:&lt;/p&gt; 
&lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/589785b9-aa3f-414a-98dd-d26b7509de08&quot; align=&quot;center&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;And you can call them directly when the cursor is in the rewritten region:&lt;/p&gt; 
&lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/f5b3ca47-e146-45fe-8584-f11035fa4dbc&quot; align=&quot;center&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;*** Extra Org mode conveniences&lt;/p&gt; 
&lt;p&gt;gptel offers a few extra conveniences in Org mode.&lt;/p&gt; 
&lt;p&gt;***** Limit conversation context to an Org heading&lt;/p&gt; 
&lt;p&gt;You can limit the conversation context to an Org heading with the command =gptel-org-set-topic=.&lt;/p&gt; 
&lt;p&gt;(This sets an Org property (=GPTEL_TOPIC=) under the heading. You can also add this property manually instead.)&lt;/p&gt; 
&lt;p&gt;***** Use branching context in Org mode (tree of conversations)&lt;/p&gt; 
&lt;p&gt;You can have branching conversations in Org mode, where each hierarchical outline path through the document is a separate conversation branch. This is also useful for limiting the context size of each query. See the variable =gptel-org-branching-context=.&lt;/p&gt; 
&lt;p&gt;If this variable is non-nil, you should probably edit =gptel-prompt-prefix-alist= and =gptel-response-prefix-alist= so that the prefix strings for org-mode are not Org headings, e.g.&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setf (alist-get &#39;org-mode gptel-prompt-prefix-alist) &quot;@user\n&quot;) (setf (alist-get &#39;org-mode gptel-response-prefix-alist) &quot;@assistant\n&quot;) #+end_src&lt;/p&gt; 
&lt;p&gt;Otherwise, the default prompt prefix will make successive prompts sibling headings, and therefore on different conversation branches, which probably isn&#39;t what you want.&lt;/p&gt; 
&lt;p&gt;Note: using this option requires Org 9.7 or higher to be available. The [[&lt;a href=&quot;https://github.com/ultronozm/ai-org-chat.el&quot;&gt;https://github.com/ultronozm/ai-org-chat.el&lt;/a&gt;][ai-org-chat]] package uses gptel to provide this branching conversation behavior for older versions of Org.&lt;/p&gt; 
&lt;p&gt;***** Save gptel parameters to Org headings (reproducible chats)&lt;/p&gt; 
&lt;p&gt;You can declare the gptel model, backend, temperature, system message and other parameters as Org properties with the command =gptel-org-set-properties=. gptel queries under the corresponding heading will always use these settings, allowing you to create mostly reproducible LLM chat notebooks, and to have simultaneous chats with different models, model settings and directives under different Org headings.&lt;/p&gt; 
&lt;p&gt;*** Introspection (examine, debug or modify requests)&lt;/p&gt; 
&lt;p&gt;Set =gptel-expert-commands= to =t= to display additional options in gptel&#39;s transient menu. #+html: &lt;img width=&quot;800&quot; height=&quot;403&quot; alt=&quot;Image&quot; src=&quot;https://github.com/user-attachments/assets/636ff77c-73d9-449b-9d49-bb792d8abd45&quot; align=&quot;center&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Examining prompts&lt;/em&gt;: you can examine and edit gptel request payloads before sending them.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Pick one of the &quot;dry run&quot; options in the menu to produce a buffer containing the request payload.&lt;/li&gt; 
 &lt;li&gt;You can edit this buffer as you would like and send the request.&lt;/li&gt; 
 &lt;li&gt;You can also copy a Curl command corresponding to the request and invoke it from the shell.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Examining responses&lt;/em&gt;: You can turn on logging to examine the full response from an LLM.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Set =gptel-log-level= to =info= or =debug=.&lt;/li&gt; 
 &lt;li&gt;Send a request.&lt;/li&gt; 
 &lt;li&gt;Open the log buffer from gptel&#39;s transient menu, or switch to the =&lt;em&gt;gptel-log&lt;/em&gt;= buffer.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** FAQ *** Chat buffer UI #+html: &lt;/p&gt;
&lt;details&gt;
 &lt;summary&gt; **** I want the window to scroll automatically as the response is inserted #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;To be minimally annoying, gptel does not move the cursor by default. Add the following to your configuration to enable auto-scrolling.&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (add-hook &#39;gptel-post-stream-hook &#39;gptel-auto-scroll) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** I want the cursor to move to the next prompt after the response is inserted #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;To be minimally annoying, gptel does not move the cursor by default. Add the following to your configuration to move the cursor:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp (add-hook &#39;gptel-post-response-functions &#39;gptel-end-of-response) #+end_src&lt;/p&gt; 
 &lt;p&gt;You can also call =gptel-end-of-response= as a command at any time.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** I want to change the formatting of the prompt and LLM response #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Anywhere in Emacs: Turn on =gptel-highlight-mode=. See its documentation for customization options.&lt;/p&gt; 
 &lt;p&gt;In dedicated chat buffers: you can additionally customize =gptel-prompt-prefix-alist= and =gptel-response-prefix-alist=, which are prefixes inserted before the prompt and response. You can set a different pair for each major-mode.&lt;/p&gt; 
 &lt;p&gt;For more custom formatting, use =gptel-pre-response-hook= and =gptel-post-response-functions=.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** How does gptel distinguish between user prompts and LLM responses? #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;gptel uses [[&lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Properties.html&quot;&gt;https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Properties.html&lt;/a&gt;][text-properties]] to watermark LLM responses. Thus this text is interpreted as a response even if you copy it into another buffer. In regular buffers (buffers without =gptel-mode= enabled), you can turn off this tracking by unsetting =gptel-track-response=.&lt;/p&gt; 
 &lt;p&gt;When restoring a chat state from a file on disk, gptel will apply these properties from saved metadata in the file when you turn on =gptel-mode=.&lt;/p&gt; 
 &lt;p&gt;gptel does /not/ use any prefix or semantic/syntax element in the buffer (such as headings) to separate prompts and responses. The reason for this is that gptel aims to integrate as seamlessly as possible into your regular Emacs usage: LLM interaction is not the objective, it&#39;s just another tool at your disposal. So requiring a bunch of &quot;user&quot; and &quot;assistant&quot; tags in the buffer is noisy and restrictive. If you want these demarcations, you can customize =gptel-prompt-prefix-alist= and =gptel-response-prefix-alist=. Note that these prefixes are for your readability only and purely cosmetic.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; *** Transient menu behavior #+html: 
&lt;details&gt;
 &lt;summary&gt; **** I want to set gptel options but only for this buffer :PROPERTIES: :ID: 748cbc00-0c92-4705-8839-619b2c80e566 :END: #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;In every menu used to set options, gptel provides a &quot;scope&quot; option, bound to the ~=~ key:&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/f9904134-2905-4b1d-ad37-b64c777af8ac&quot; align=&quot;center&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/c0950035-bf65-43ae-b649-8e3b651ce3f1&quot; align=&quot;center&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/fa3b1246-e00f-4c5e-88c7-46557b3507ef&quot; align=&quot;center&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;You can flip this switch before setting the option to =buffer= or =oneshot=. You only need to flip this switch once, it&#39;s a persistent setting. =buffer= sets the option buffer-locally, =oneshot= will set it for the next gptel request only. The default scope is global.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** I want the transient menu options to be saved so I only need to set them once #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Any model options you set are saved according to the scope (see previous question). But the redirection options in the menu are set for the next query only:&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;img src=&quot;https://github.com/karthink/gptel/assets/8607532/2ecc6be9-aa52-4287-a739-ba06e1369ec2&quot; alt=&quot;https://github.com/karthink/gptel/assets/8607532/2ecc6be9-aa52-4287-a739-ba06e1369ec2&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;You can make them persistent across this Emacs session by pressing ~C-x C-s~:&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;img src=&quot;https://github.com/karthink/gptel/assets/8607532/b8bcb6ad-c974-41e1-9336-fdba0098a2fe&quot; alt=&quot;https://github.com/karthink/gptel/assets/8607532/b8bcb6ad-c974-41e1-9336-fdba0098a2fe&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;(You can also cycle through presets you&#39;ve saved with ~C-x p~ and ~C-x n~.)&lt;/p&gt; 
 &lt;p&gt;Now these will be enabled whenever you send a query from the transient menu. If you want to use these saved options without invoking the transient menu, you can use a keyboard macro:&lt;/p&gt; 
 &lt;p&gt;#+begin_src emacs-lisp ;; Replace with your key to invoke the transient menu: (keymap-global-set &quot;
  &lt;f6&gt;
   &quot; &quot;C-u C-c 
   &lt;return&gt; 
    &lt;return&gt;
     &quot;) #+end_src
    &lt;/return&gt;
   &lt;/return&gt;
  &lt;/f6&gt;&lt;/p&gt; 
 &lt;p&gt;Or see this [[&lt;a href=&quot;https://github.com/karthink/gptel/wiki/Commonly-requested-features#save-transient-flags&quot;&gt;https://github.com/karthink/gptel/wiki/Commonly-requested-features#save-transient-flags&lt;/a&gt;][wiki entry]].&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Using the transient menu leaves behind extra windows #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;If using gptel&#39;s transient menus causes new/extra window splits to be created, check your value of =transient-display-buffer-action=. [[&lt;a href=&quot;https://github.com/magit/transient/discussions/358&quot;&gt;https://github.com/magit/transient/discussions/358&lt;/a&gt;][See this discussion]] for more context.&lt;/p&gt; 
 &lt;p&gt;If you are using Helm, see [[&lt;a href=&quot;https://github.com/magit/transient/discussions/361&quot;&gt;https://github.com/magit/transient/discussions/361&lt;/a&gt;][Transient#361]].&lt;/p&gt; 
 &lt;p&gt;In general, do not customize this Transient option unless you know what you&#39;re doing!&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Can I change the transient menu key bindings? #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Yes, see =transient-suffix-put=. This changes the key to select a backend/model from &quot;-m&quot; to &quot;M&quot; in gptel&#39;s menu: #+begin_src emacs-lisp (transient-suffix-put &#39;gptel-menu (kbd &quot;-m&quot;) :key &quot;M&quot;) #+end_src&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** (Doom Emacs) Sending a query from the gptel menu fails because of a key conflict with Org mode #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Doom binds ~RET~ in Org mode to =+org/dwim-at-point=, which appears to conflict with gptel&#39;s transient menu bindings for some reason.&lt;/p&gt; 
 &lt;p&gt;Two solutions:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Press ~C-m~ instead of the return key.&lt;/li&gt; 
  &lt;li&gt;Change the send key from return to a key of your choice: #+begin_src emacs-lisp (transient-suffix-put &#39;gptel-menu (kbd &quot;RET&quot;) :key &quot;
   &lt;f8&gt;
    &quot;) #+end_src
   &lt;/f8&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; *** Miscellaneous #+html: 
&lt;details&gt;
 &lt;summary&gt; **** I want to use gptel in a way that&#39;s not supported by =gptel-send= or the options menu #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;gptel&#39;s default usage pattern is simple, and will stay this way: Read input in any buffer and insert the response below it. Some custom behavior is possible with the transient menu (=C-u M-x gptel-send=).&lt;/p&gt; 
 &lt;p&gt;For more programmable usage, gptel provides a general =gptel-request= function that accepts a custom prompt and a callback to act on the response. You can use this to build custom workflows not supported by =gptel-send=. See the documentation of =gptel-request=, and the [[&lt;a href=&quot;https://github.com/karthink/gptel/wiki/Defining-custom-gptel-commands&quot;&gt;https://github.com/karthink/gptel/wiki/Defining-custom-gptel-commands&lt;/a&gt;][wiki]] for examples.&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** (ChatGPT) I get the error &quot;(HTTP/2 429) You exceeded your current quota&quot; #+html:&lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;#+begin_quote (HTTP/2 429) You exceeded your current quota, please check your plan and billing details. #+end_quote&lt;/p&gt; 
 &lt;p&gt;Using the ChatGPT (or any OpenAI) API requires [[&lt;a href=&quot;https://platform.openai.com/account/billing/overview&quot;&gt;https://platform.openai.com/account/billing/overview&lt;/a&gt;][adding credit to your account]].&lt;/p&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt; #+html: 
&lt;details&gt;
 &lt;summary&gt; **** Why another LLM client? #+html: &lt;/summary&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;Other Emacs clients for LLMs prescribe the format of the interaction (a comint shell, org-babel blocks, etc). I wanted:&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt;Something that is as free-form as possible: query the model using any text in any buffer, and redirect the response as required. Using a dedicated =gptel= buffer just adds some visual flair to the interaction.&lt;/li&gt; 
  &lt;li&gt;Integration with org-mode, not using a walled-off org-babel block, but as regular text. This way the model can generate code blocks that I can run.&lt;/li&gt; 
 &lt;/ol&gt; 
 &lt;p&gt;#+html: &lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;** Additional Configuration :PROPERTIES: :ID: f885adac-58a3-4eba-a6b7-91e9e7a17829 :END: #+html: &lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp :exports none :results list (let ((all)) (mapatoms (lambda (sym) (when (and (string-match-p &quot;^gptel-[^-]&quot; (symbol-name sym)) (get sym &#39;variable-documentation)) (push sym all)))) all) #+end_src&lt;/p&gt; 
&lt;p&gt;|-------------------------+--------------------------------------------------------------------| | &lt;em&gt;Connection options&lt;/em&gt; | | |-------------------------+--------------------------------------------------------------------| | =gptel-use-curl= | Use Curl? (default), fallback to Emacs&#39; built-in =url=. | | | You can also specify the Curl path here. | | =gptel-proxy= | Proxy server for requests, passed to curl via =--proxy=. | | =gptel-curl-extra-args= | Extra arguments passed to Curl. | | =gptel-api-key= | Variable/function that returns the API key for the active backend. | |-------------------------+--------------------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;|-----------------------+---------------------------------------------------------| | &lt;em&gt;LLM request options&lt;/em&gt; | /(Note: not supported uniformly across LLMs)/ | |-----------------------+---------------------------------------------------------| | =gptel-backend= | Default LLM Backend. | | =gptel-model= | Default model to use, depends on the backend. | | =gptel-stream= | Enable streaming responses, if the backend supports it. | | =gptel-directives= | Alist of system directives, can switch on the fly. | | =gptel-max-tokens= | Maximum token count (in query + response). | | =gptel-temperature= | Randomness in response text, 0 to 2. | | =gptel-cache= | Cache prompts, system message or tools (Anthropic only) | | =gptel-use-context= | How/whether to include additional context | | =gptel-context= | List of context sources (files/buffers) for queries | | =gptel-use-tools= | Disable, allow or force LLM tool-use | | =gptel-tools= | List of tools to include with requests | |-----------------------+---------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;|--------------------------------+----------------------------------------------------------------| | &lt;em&gt;Chat UI options&lt;/em&gt; | | |--------------------------------+----------------------------------------------------------------| | =gptel-default-mode= | Major mode for dedicated chat buffers. | | =gptel-highlight-methods= | Response highlighting used by =gptel-highlight-mode= | | =gptel-prompt-prefix-alist= | Text inserted before queries. | | =gptel-response-prefix-alist= | Text inserted before responses. | | =gptel-track-response= | Distinguish between user messages and LLM responses? | | =gptel-track-media= | Send text, images or other media from links? | | =gptel-markdown-validate-link= | Function to validate links to include with queries | | =gptel-confirm-tool-calls= | Confirm all tool calls? | | =gptel-include-tool-results= | Include tool results in the LLM response? | | =gptel-use-header-line= | Display status messages in header-line (default) or minibuffer | | =gptel-display-buffer-action= | Placement of the gptel chat buffer. | |--------------------------------+----------------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;|-------------------------------+-------------------------------------------------------| | &lt;em&gt;Org mode UI options&lt;/em&gt; | | |-------------------------------+-------------------------------------------------------| | =gptel-org-branching-context= | Make each outline path a separate conversation branch | | =gptel-org-ignore-elements= | Ignore parts of the buffer when sending a query | | =gptel-org-validate-link= | Function to validate links to include with queries | |-------------------------------+-------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;|------------------------------------+-------------------------------------------------------------| | &lt;em&gt;Hooks for customization&lt;/em&gt; | | |------------------------------------+-------------------------------------------------------------| | =gptel-save-state-hook= | Runs before saving the chat state to a file on disk | | =gptel-prompt-transform-functions= | Runs in a temp buffer to transform text before sending | | =gptel-post-request-hook= | Runs immediately after dispatching a =gptel-request=. | | =gptel-pre-response-hook= | Runs before inserting the LLM response into the buffer | | =gptel-post-response-functions= | Runs after inserting the full LLM response into the buffer | | =gptel-post-stream-hook= | Runs after each streaming insertion | | =gptel-pre-tool-call-functions= | Runs before each tool call, can block or modify it | | =gptel-post-tool-call-functions= | Runs after each tool call, can block or modify results | | =gptel-context-wrap-function= | To include additional context formatted your way | | =gptel-rewrite-default-action= | Automatically diff, ediff, merge or replace refactored text | | =gptel-post-rewrite-functions= | Runs after a =gptel-rewrite= request succeeds | |------------------------------------+-------------------------------------------------------------|&lt;/p&gt; 
&lt;p&gt;#+html: &lt;/p&gt; 
&lt;p&gt;*** Option presets&lt;/p&gt; 
&lt;p&gt;If you use several LLMs for different tasks with accompanying system prompts (instructions) and tool configurations, manually adjusting =gptel= settings each time can become tedious. Presets are a bundle of gptel settings -- such as the model, backend, system message, and enabled tools -- that you can switch to at once.&lt;/p&gt; 
&lt;p&gt;Once defined, presets can be applied from gptel&#39;s transient menu:&lt;/p&gt; 
&lt;p&gt;#+html: &lt;img src=&quot;https://github.com/user-attachments/assets/e0cf6a32-d999-4138-8369-23512f5e9311&quot; align=&quot;center&quot; /&gt; #+html: &lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;To define a preset, use the =gptel-make-preset= function, which takes a name and keyword-value pairs of settings.&lt;/p&gt; 
&lt;p&gt;Presets can be used to set individual options. Here is an example of a preset to set the system message (and do nothing else): #+begin_src emacs-lisp (gptel-make-preset &#39;explain :system &quot;Explain what this code does to a novice programmer.&quot;) #+end_src&lt;/p&gt; 
&lt;p&gt;More generally, you can specify a bundle of options: #+begin_src emacs-lisp (gptel-make-preset &#39;gpt4coding ;preset name, a symbol :description &quot;A preset optimized for coding tasks&quot; ;for your reference :backend &quot;Claude&quot; ;gptel backend or backend name :model &#39;claude-3-7-sonnet-20250219.1 :system &quot;You are an expert coding assistant. Your role is to provide high-quality code solutions, refactorings, and explanations.&quot; :tools &#39;(&quot;read_buffer&quot; &quot;modify_buffer&quot;)) ;gptel tools or tool names #+end_src&lt;/p&gt; 
&lt;p&gt;Besides a couple of special keys (=:description=, =:parents= to inherit other presets), there is no predefined list of keys. Instead, the key =:foo= corresponds to setting =gptel-foo= (preferred) or =gptel--foo=. So the preset can include the value of any gptel option. For example, the following preset sets =gptel-temperature=, =gptel-use-context= and =gptel-context=, a list of files to include as context:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (gptel-make-preset &#39;proofreader :description &quot;Preset for proofreading tasks&quot; :backend &quot;ChatGPT&quot; :model &#39;gpt-4.1-mini :tools &#39;(&quot;read_buffer&quot; &quot;spell_check&quot; &quot;grammar_check&quot;) :use-context &#39;system ;sets gptel-use-context :context &#39;(&quot;./.grammar_rules.md&quot; &quot;./jargonfile.md&quot;) ;sets gptel-context :temperature 0.2) ;sets gptel-temperature #+end_src&lt;/p&gt; 
&lt;p&gt;Switching to a preset applies the specified settings without affecting other settings. Depending on the scope option (~=~ in gptel&#39;s transient menu), presets can be applied globally, buffer-locally or for the next request only.&lt;/p&gt; 
&lt;p&gt;**** Applying presets to requests automatically&lt;/p&gt; 
&lt;p&gt;You can apply a preset to a /single/ query by including =@preset-name= in the prompt, where =preset-name= is the name of the preset. (The =oneshot= scope option in gptel&#39;s transient menus is another way to do this, [[id:748cbc00-0c92-4705-8839-619b2c80e566][see the FAQ.]])&lt;/p&gt; 
&lt;p&gt;For example, if you have a preset named =websearch= defined which includes tools for web access and search: #+begin_src emacs-lisp (gptel-make-preset &#39;websearch :description &quot;Haiku with basic web search capability.&quot; :backend &quot;Claude&quot; :model &#39;claude-3-5-haiku-20241022 :tools &#39;(&quot;search_web&quot; &quot;read_url&quot; &quot;get_youtube_meta&quot;)) #+end_src&lt;/p&gt; 
&lt;p&gt;The following query is sent with this preset applied:&lt;/p&gt; 
&lt;p&gt;#+begin_quote @websearch Are there any 13&quot; e-ink monitors on the market? Create a table comparing them, sourcing specs and reviews from online sources. Also do the same for &quot;transreflective-LCD&quot; displays -- I&#39;m not sure what exactly they&#39;re called but they&#39;re comparable to e-ink. #+end_quote&lt;/p&gt; 
&lt;p&gt;This =@preset-name= cookie only applies to the final user turn of the coversation that is sent. So the presence of the cookie in past messages/turns is not significant.&lt;/p&gt; 
&lt;p&gt;The =@preset-name= cookie can be anywhere in the prompt. For example: #+begin_quote 
 &lt;long piece of text&gt;&lt;/long&gt;&lt;/p&gt; 
&lt;p&gt;What do you make of the above description, @proofreader? #+end_quote&lt;/p&gt; 
&lt;p&gt;In chat buffers this prefix will be offered as a completion and fontified, making it easy to use and spot.&lt;/p&gt; 
&lt;p&gt;** Alternatives&lt;/p&gt; 
&lt;p&gt;Other LLM clients for Emacs include&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Libraries&lt;/em&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/ahyatt/llm&quot;&gt;https://github.com/ahyatt/llm&lt;/a&gt;][llm]]: llm provides a uniform API across language model providers for building LLM clients in Emacs, and is intended as a library for use by package authors. For similar scripting purposes, gptel provides the command =gptel-request=.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Chat clients&lt;/em&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/s-kostyaev/ellama&quot;&gt;https://github.com/s-kostyaev/ellama&lt;/a&gt;][Ellama]]: A full-fledged LLM client built on llm, that supports many LLM providers (Ollama, Open AI, Vertex, GPT4All and more). Its usage differs from gptel in that it provides separate commands for dozens of common tasks, like general chat, summarizing code/text, refactoring code, improving grammar, translation and so on.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/xenodium/chatgpt-shell&quot;&gt;https://github.com/xenodium/chatgpt-shell&lt;/a&gt;][chatgpt-shell]]: comint-shell based interaction with ChatGPT. Also supports DALL-E, executable code blocks in the responses, and more.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/rksm/org-ai&quot;&gt;https://github.com/rksm/org-ai&lt;/a&gt;][org-ai]]: Interaction through special =#+begin_ai ... #+end_ai= Org-mode blocks. Also supports DALL-E, querying ChatGPT with the contents of project files, and more.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/yibie/superchat&quot;&gt;https://github.com/yibie/superchat&lt;/a&gt;][Superchat]]: A Claude Code style chat UI for gptel in Emacs, focusing on making structured prompts and file‑grounded conversations effortless.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;There are several more: [[&lt;a href=&quot;https://github.com/iwahbe/chat.el&quot;&gt;https://github.com/iwahbe/chat.el&lt;/a&gt;][chat.el]], [[&lt;a href=&quot;https://github.com/stuhlmueller/gpt.el&quot;&gt;https://github.com/stuhlmueller/gpt.el&lt;/a&gt;][gpt.el]], [[&lt;a href=&quot;https://github.com/AnselmC/le-gpt.el&quot;&gt;https://github.com/AnselmC/le-gpt.el&lt;/a&gt;][le-gpt]], [[&lt;a href=&quot;https://github.com/stevemolitor/robby&quot;&gt;https://github.com/stevemolitor/robby&lt;/a&gt;][robby]].&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Coding agents&lt;/em&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/manzaltu/claude-code-ide.el&quot;&gt;https://github.com/manzaltu/claude-code-ide.el&lt;/a&gt;][claude-code-ide]] and [[&lt;a href=&quot;https://github.com/stevemolitor/claude-code.el&quot;&gt;https://github.com/stevemolitor/claude-code.el&lt;/a&gt;][claude-code.el]]: Emacs interfaces to Claude Code.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/xenodium/agent-shell&quot;&gt;https://github.com/xenodium/agent-shell&lt;/a&gt;][agent-shell]]: Emacs interface to various coding agents, like Claude Code, Gemini, Codex, Opencode, Goose and more.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/MatthewZMD/aidermacs&quot;&gt;https://github.com/MatthewZMD/aidermacs&lt;/a&gt;][Aidermacs]] and [[&lt;a href=&quot;https://github.com/tninja/aider.el&quot;&gt;https://github.com/tninja/aider.el&lt;/a&gt;][aider.el]]: Emacs interfaces to [[&lt;a href=&quot;https://aider.chat/&quot;&gt;https://aider.chat/&lt;/a&gt;][Aider]].&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Completion at point&lt;/em&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/copilot-emacs/copilot.el&quot;&gt;https://github.com/copilot-emacs/copilot.el&lt;/a&gt;][copilot.el]]: Code completion using Copilot.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/milanglacier/minuet-ai.el&quot;&gt;https://github.com/milanglacier/minuet-ai.el&lt;/a&gt;][Minuet]]: Code-completion using LLM. Supports fill-in-the-middle (FIM) completion for compatible models such as DeepSeek and Codestral.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;*** Packages using gptel&lt;/p&gt; 
&lt;p&gt;gptel is a general-purpose package for chat and ad-hoc LLM interaction. The following packages use gptel to provide additional or specialized functionality:&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Lookup helpers&lt;/em&gt;: Calling gptel quickly for one-off interactions&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/karthink/gptel-quick&quot;&gt;https://github.com/karthink/gptel-quick&lt;/a&gt;][gptel-quick]]: Quickly look up the region or text at point.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Task-driven workflows&lt;/em&gt;: Different interfaces to specify tasks for LLMs.&lt;/p&gt; 
&lt;p&gt;These differ from full &quot;agentic&quot; use in that the interactions are &quot;one-shot&quot;, not chained.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/dolmens/gptel-aibo/&quot;&gt;https://github.com/dolmens/gptel-aibo/&lt;/a&gt;][gptel-aibo]]: A writing assistant system built on top of gptel.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/daedsidog/evedel&quot;&gt;https://github.com/daedsidog/evedel&lt;/a&gt;][Evedel]]: Instructed LLM Programmer/Assistant.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/lanceberge/elysium&quot;&gt;https://github.com/lanceberge/elysium&lt;/a&gt;][Elysium]]: Request AI-generated changes as you code.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/ISouthRain/gptel-watch&quot;&gt;https://github.com/ISouthRain/gptel-watch&lt;/a&gt;][gptel-watch]]: Automatically call gptel when typing lines that indicate intent.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Agentic use&lt;/em&gt;: Use LLMs as agents, with tool-use&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/kmontag/macher&quot;&gt;https://github.com/kmontag/macher&lt;/a&gt;][Macher]]: Project-aware multi-file LLM editing for Emacs.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/karthink/gptel-agent&quot;&gt;https://github.com/karthink/gptel-agent&lt;/a&gt;][gptel-agent]]: Tools, presets and configuration for general agentic LLM use.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Text completion&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/JDNdeveloper/gptel-autocomplete&quot;&gt;https://github.com/JDNdeveloper/gptel-autocomplete&lt;/a&gt;][gptel-autocomplete]]: Inline completions using gptel.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Integration with major-modes&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/jwiegley/ob-gptel&quot;&gt;https://github.com/jwiegley/ob-gptel&lt;/a&gt;][ob-gptel]]: Org-babel backend for running gptel queries.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/kamushadenes/ai-blog.el&quot;&gt;https://github.com/kamushadenes/ai-blog.el&lt;/a&gt;][ai-blog.el]]: Streamline generation of blog posts in Hugo.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/lakkiy/gptel-commit&quot;&gt;https://github.com/lakkiy/gptel-commit&lt;/a&gt;][gptel-commit]]: Generate commit messages using gptel.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/douo/magit-gptcommit&quot;&gt;https://github.com/douo/magit-gptcommit&lt;/a&gt;][magit-gptcommit]]: Generate commit messages within magit-status Buffer using gptel.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/ragnard/gptel-magit/&quot;&gt;https://github.com/ragnard/gptel-magit/&lt;/a&gt;][gptel-magit]]: Generate commit messages for magit using gptel.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/ArthurHeymans/gptel-forge-prs&quot;&gt;https://github.com/ArthurHeymans/gptel-forge-prs&lt;/a&gt;][gptel-forge-prs]]: Generate pull request message for forge using gptel.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Chat interface addons&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/rob137/Corsair&quot;&gt;https://github.com/rob137/Corsair&lt;/a&gt;][Corsair]]: Helps gather text to populate LLM prompts for gptel.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/ultronozm/ai-org-chat.el&quot;&gt;https://github.com/ultronozm/ai-org-chat.el&lt;/a&gt;][ai-org-chat]]: Provides branching conversations in Org buffers using gptel. Note that gptel includes this feature as well (see =gptel-org-branching-context=), but requires a recent version of Org mode 9.7 or later to be installed.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Integration with other packages&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/armindarvish/consult-omni&quot;&gt;https://github.com/armindarvish/consult-omni&lt;/a&gt;][consult-omni]]: Versatile multi-source search package. It includes gptel as one of its many sources.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;gptel configuration management&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/jwiegley/gptel-prompts&quot;&gt;https://github.com/jwiegley/gptel-prompts&lt;/a&gt;][gptel-prompts]]: System prompt manager for gptel.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** COMMENT Older Breaking Changes&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;=gptel-post-response-hook= has been renamed to =gptel-post-response-functions=, and functions in this hook are now called with two arguments: the start and end buffer positions of the response. This should make it easy to act on the response text without having to locate it first.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Possible breakage, see #120: If streaming responses stop working for you after upgrading to v0.5, try reinstalling gptel and deleting its native comp eln cache in =native-comp-eln-load-path=.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;The user option =gptel-host= is deprecated. If the defaults don&#39;t work for you, use =gptel-make-openai= to customize server settings.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;=gptel-api-key-from-auth-source= now searches for the API key using the host address for the active LLM backend, /i.e./ &quot;&lt;a href=&quot;http://api.openai.com&quot;&gt;api.openai.com&lt;/a&gt;&quot; when using ChatGPT. You may need to update your =~/.authinfo=.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Acknowledgments&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/felipeochoa&quot;&gt;https://github.com/felipeochoa&lt;/a&gt;][Felipe Ochoa]] and [[&lt;a href=&quot;https://github.com/akssri&quot;&gt;https://github.com/akssri&lt;/a&gt;][akssri]] for adding AWS Bedrock support to gptel.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/jwiegley&quot;&gt;https://github.com/jwiegley&lt;/a&gt;][John Wiegley]] for the design of gptel&#39;s presets and gptel-request&#39;s async pipeline, but also for loads of general feedback and advice.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/pabl0&quot;&gt;https://github.com/pabl0&lt;/a&gt;][Henrik Ahlgren]] for a keen eye to detail and polish applied to gptel&#39;s UI.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/psionic-k&quot;&gt;https://github.com/psionic-k&lt;/a&gt;][psionic-k]] for extensive testing of the tool use feature and the design of gptel&#39;s in-buffer tool use records.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/jdtsmith&quot;&gt;https://github.com/jdtsmith&lt;/a&gt;][JD Smith]] for feedback and code assistance with gptel-menu&#39;s redesign&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/meain&quot;&gt;https://github.com/meain&lt;/a&gt;][Abin Simon]] for extensive feedback on improving gptel&#39;s directives and UI.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/algal&quot;&gt;https://github.com/algal&lt;/a&gt;][Alexis Gallagher]] and [[&lt;a href=&quot;https://github.com/d1egoaz&quot;&gt;https://github.com/d1egoaz&lt;/a&gt;][Diego Alvarez]] for fixing a nasty multi-byte bug with =url-retrieve=.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/tarsius&quot;&gt;https://github.com/tarsius&lt;/a&gt;][Jonas Bernoulli]] for the Transient library.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/daedsidog&quot;&gt;https://github.com/daedsidog&lt;/a&gt;][daedsidog]] for adding context support to gptel.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/Aquan1412&quot;&gt;https://github.com/Aquan1412&lt;/a&gt;][Aquan1412]] for adding PrivateGPT support to gptel.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/r0man&quot;&gt;https://github.com/r0man&lt;/a&gt;][r0man]] for improving gptel&#39;s Curl integration.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Local Variables:&lt;/h1&gt; 
&lt;h1&gt;toc-org-max-depth: 4&lt;/h1&gt; 
&lt;h1&gt;eval: (and (fboundp &#39;toc-org-mode) (toc-org-mode 1))&lt;/h1&gt; 
&lt;h1&gt;End:&lt;/h1&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/610038902/2af098f1-9230-4166-ad18-f02cc3ca2a85" medium="image" />
      
    </item>
    
    <item>
      <title>emacs-mirror/emacs</title>
      <link>https://github.com/emacs-mirror/emacs</link>
      <description>&lt;p&gt;Mirror of GNU Emacs&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Copyright (C) 2001-2026 Free Software Foundation, Inc. See the end of the file for license conditions.&lt;/p&gt; 
&lt;p&gt;This directory tree holds version 32.0.50 of GNU Emacs, the extensible, customizable, self-documenting real-time display editor.&lt;/p&gt; 
&lt;p&gt;The file INSTALL in this directory says how to build and install GNU Emacs on various systems, once you have unpacked or checked out the entire Emacs file tree.&lt;/p&gt; 
&lt;p&gt;See the file etc/NEWS for information on new features and other user-visible changes in recent versions of Emacs.&lt;/p&gt; 
&lt;p&gt;The file etc/PROBLEMS contains information on many common problems that occur in building, installing and running Emacs.&lt;/p&gt; 
&lt;p&gt;The file CONTRIBUTE contains information on contributing to Emacs as a developer.&lt;/p&gt; 
&lt;p&gt;You may encounter bugs in this release. If you do, please report them; your bug reports are valuable contributions to the FSF, since they allow us to notice and fix problems on machines we don&#39;t have, or in code we don&#39;t use often. Please send bug reports to the mailing list &lt;a href=&quot;mailto:bug-gnu-emacs@gnu.org&quot;&gt;bug-gnu-emacs@gnu.org&lt;/a&gt;. If possible, use M-x report-emacs-bug.&lt;/p&gt; 
&lt;p&gt;See the &quot;Bugs&quot; section of the Emacs manual for more information on how to report bugs. (The file &#39;BUGS&#39; in this directory explains how you can find and read that section using the Info files that come with Emacs.) For a list of mailing lists related to Emacs, see &lt;a href=&quot;https://savannah.gnu.org/mail/?group=emacs&quot;&gt;https://savannah.gnu.org/mail/?group=emacs&lt;/a&gt;. For the complete list of GNU mailing lists, see &lt;a href=&quot;https://lists.gnu.org/&quot;&gt;https://lists.gnu.org/&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;The &#39;etc&#39; subdirectory contains several other files, named in capital letters, which you might consider looking at when installing GNU Emacs.&lt;/p&gt; 
&lt;p&gt;The file &#39;configure&#39; is a shell script to acclimate Emacs to the oddities of your processor and operating system. It creates the file &#39;Makefile&#39; (a script for the &#39;make&#39; program), which automates the process of building and installing Emacs. See INSTALL for more detailed information.&lt;/p&gt; 
&lt;p&gt;The file &#39;&lt;a href=&quot;http://configure.ac&quot;&gt;configure.ac&lt;/a&gt;&#39; is the input used by the autoconf program to construct the &#39;configure&#39; script.&lt;/p&gt; 
&lt;p&gt;The shell script &#39;&lt;a href=&quot;http://autogen.sh&quot;&gt;autogen.sh&lt;/a&gt;&#39; generates &#39;configure&#39; and other files by running Autoconf (which in turn uses GNU m4), and configures files in the .git subdirectory if you are using Git. If you want to use it, you will need to install recent versions of these build tools. This should be needed only if you edit files like &#39;&lt;a href=&quot;http://configure.ac&quot;&gt;configure.ac&lt;/a&gt;&#39; that specify Emacs&#39;s autobuild procedure.&lt;/p&gt; 
&lt;p&gt;The file &#39;&lt;a href=&quot;http://Makefile.in&quot;&gt;Makefile.in&lt;/a&gt;&#39; is a template used by &#39;configure&#39; to create &#39;Makefile&#39;.&lt;/p&gt; 
&lt;p&gt;The file &#39;make-dist&#39; is a shell script to build a distribution tar file from the current Emacs tree, containing only those files appropriate for distribution. If you make extensive changes to Emacs, this script will help you distribute your version to others.&lt;/p&gt; 
&lt;p&gt;There are several subdirectories:&lt;/p&gt; 
&lt;p&gt;&#39;src&#39; holds the C code for Emacs (the Emacs Lisp interpreter and its primitives, the redisplay code, and some basic editing functions). &#39;lisp&#39; holds the Emacs Lisp code for Emacs (most everything else). &#39;leim&#39; holds the original source files for the generated files in lisp/leim. These form the library of Emacs input methods, required to type international characters that can&#39;t be directly produced by your keyboard. &#39;lib&#39; holds source code for libraries used by Emacs and its utilities &#39;lib-src&#39; holds the source code for some utility programs for use by or with Emacs, like movemail and etags. &#39;lwlib&#39; holds the sources of the Lucid Widget Library used on X. &#39;oldXMenu&#39; source files from X11R2 XMenu library, used in non-toolkit builds. &#39;etc&#39; holds miscellaneous architecture-independent data files Emacs uses, like the tutorial text and tool bar images. The contents of the &#39;lisp&#39;, &#39;leim&#39;, &#39;info&#39;, and &#39;doc&#39; subdirectories are architecture-independent too. &#39;info&#39; holds the Info documentation tree for Emacs. &#39;doc/emacs&#39; holds the source code for the Emacs Manual. If you modify the manual sources, you will need the &#39;makeinfo&#39; program to produce an updated manual. &#39;makeinfo&#39; is part of the GNU Texinfo package; you need a suitably recent version of Texinfo. &#39;doc/lispref&#39; holds the source code for the Emacs Lisp reference manual. &#39;doc/lispintro&#39; holds the source code for the Introduction to Programming in Emacs Lisp manual. &#39;msdos&#39; holds configuration files for compiling Emacs under MS-DOS. &#39;nextstep&#39; holds instructions and some other files for compiling the Nextstep port of Emacs, for GNUstep and macOS Cocoa. &#39;nt&#39; holds code and documentation for building Emacs on MS-Windows. &#39;test&#39; holds tests for various aspects of Emacs&#39;s functionality. &#39;modules&#39; holds the &lt;a href=&quot;http://modhelp.py&quot;&gt;modhelp.py&lt;/a&gt; helper script. &#39;admin&#39; holds files used by Emacs developers, and Unicode data files. &#39;build-aux&#39; holds auxiliary files used during the build. &#39;m4&#39; holds Autoconf macros used for generating the configure script. &#39;java&#39; holds the Java code for the Emacs port to Android. &#39;cross&#39; holds Makefiles and an additional copy of gnulib used to build Emacs for Android devices. &#39;exec&#39; holds the source code to several helper executables used to run user-installed programs on Android.&lt;/p&gt; 
&lt;p&gt;Building Emacs on non-Posix platforms requires tools that aren&#39;t part of the standard distribution of the OS. The platform-specific README files and installation instructions should list the required tools.&lt;/p&gt; 
&lt;p&gt;NOTE ON COPYRIGHT YEARS&lt;/p&gt; 
&lt;p&gt;In copyright notices where the copyright holder is the Free Software Foundation, then where a range of years appears, this is an inclusive range that applies to every year in the range. For example: 2005-2008 represents the years 2005, 2006, 2007, and 2008.&lt;/p&gt; 
&lt;p&gt;This file is part of GNU Emacs.&lt;/p&gt; 
&lt;p&gt;GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.&lt;/p&gt; 
&lt;p&gt;GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.&lt;/p&gt; 
&lt;p&gt;You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see &lt;a href=&quot;https://www.gnu.org/licenses/&quot;&gt;https://www.gnu.org/licenses/&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/a087b9eb8ab393bf45245550165087e6ef8780cbf042c1e04f2fc902ff401d92/emacs-mirror/emacs" medium="image" />
      
    </item>
    
    <item>
      <title>syl20bnr/spacemacs</title>
      <link>https://github.com/syl20bnr/spacemacs</link>
      <description>&lt;p&gt;A community-driven Emacs distribution - The best editor is neither Emacs nor Vim, it&#39;s Emacs *and* Vim!&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;a name=&quot;top&quot; id=&quot;fork-destination-box&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://spacemacs.org&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/assets/spacemacs-badge.svg?sanitize=true&quot; alt=&quot;Made with Spacemacs&quot; height=&quot;20&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.en.html&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/assets/gplv3.png&quot; alt=&quot;GPLv3 Software&quot; align=&quot;right&quot; height=&quot;20&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.twitter.com/spacemacs&quot;&gt;&lt;img src=&quot;https://i.imgur.com/tXSoThF.png&quot; alt=&quot;Twitter&quot; align=&quot;right&quot; height=&quot;20&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;!-- logo and links --&gt; 
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/img/title2.png&quot; alt=&quot;Spacemacs&quot; /&gt;&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;b&gt;&lt;a href=&quot;https://spacemacs.org/doc/DOCUMENTATION#core-pillars&quot;&gt;philosophy&lt;/a&gt;&lt;/b&gt; | &lt;b&gt;&lt;a href=&quot;https://spacemacs.org/doc/DOCUMENTATION#who-can-benefit-from-this&quot;&gt;for whom?&lt;/a&gt;&lt;/b&gt; | &lt;b&gt;&lt;a href=&quot;https://spacemacs.org/doc/DOCUMENTATION#screenshots&quot;&gt;screenshots&lt;/a&gt;&lt;/b&gt; | &lt;b&gt;&lt;a href=&quot;https://spacemacs.org/doc/DOCUMENTATION.html&quot;&gt;documentation&lt;/a&gt;&lt;/b&gt; | &lt;b&gt;&lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/CONTRIBUTING.org&quot;&gt;contribute&lt;/a&gt;&lt;/b&gt; | &lt;b&gt;&lt;a href=&quot;https://spacemacs.org/doc/DOCUMENTATION#achievements&quot;&gt;achievements&lt;/a&gt;&lt;/b&gt; | &lt;b&gt;&lt;a href=&quot;https://spacemacs.org/doc/FAQ&quot;&gt;FAQ&lt;/a&gt;&lt;/b&gt; &lt;/p&gt; 
&lt;!-- badges --&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://gitter.im/syl20bnr/spacemacs?utm_source=badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=pr-badge&amp;amp;utm_content=badge&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/Join Chat.svg&quot; alt=&quot;Gitter&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/p4MddFu6Ag&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/chat-on%20discord-7289da.svg?sanitize=true&quot; alt=&quot;Discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/syl20bnr/spacemacs/actions/workflows/elisp_test.yml&quot;&gt;&lt;img src=&quot;https://github.com/syl20bnr/spacemacs/actions/workflows/elisp_test.yml/badge.svg?branch=develop&quot; alt=&quot;elisp state&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;amp;hosted_button_id=ESFVNPKP4Y742&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Paypal-Donate-blue.svg?sanitize=true&quot; alt=&quot;Donate&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://shop.spreadshirt.com/spacemacs-shop&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Shop-T--Shirts-blue.svg?sanitize=true&quot; alt=&quot;Merchandise&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.slant.co/topics/12/~what-are-the-best-programming-text-editors&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Slant-Recommend-ff69b4.svg?sanitize=true&quot; alt=&quot;Recommend it&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;hr /&gt; 
&lt;p&gt;&lt;strong&gt;Quick Start&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;If you &lt;em&gt;don&#39;t&lt;/em&gt; have an existing Emacs setup and want to run Spacemacs as your configuration, and if you have all &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/#prerequisites&quot;&gt;prerequisites&lt;/a&gt; installed, you can install Spacemacs with one line:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;shell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git clone https://github.com/syl20bnr/spacemacs $HOME/.emacs.d
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Windows PowerShell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;git clone https://github.com/syl20bnr/spacemacs $HOME/.emacs.d
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;If &lt;code&gt;HOME&lt;/code&gt; is not set in environment or in registry:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;git clone https://github.com/syl20bnr/spacemacs $env:APPDATA/.emacs.d
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If you do have an existing Emacs configuration, look at the &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/#install&quot;&gt;full installation instructions&lt;/a&gt; for other options.&lt;/p&gt; 
&lt;h1&gt;Introduction&lt;/h1&gt; 
&lt;p&gt;Spacemacs is a new way of experiencing Emacs -- it&#39;s a sophisticated and polished set-up, focused on &lt;em&gt;ergonomics&lt;/em&gt;, &lt;em&gt;mnemonics&lt;/em&gt; and &lt;em&gt;consistency&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;Just clone and launch it, then press the space bar to explore the interactive list of carefully-chosen key bindings. You can also press the home buffer&#39;s &lt;code&gt;[?]&lt;/code&gt; button for some great first key bindings to try.&lt;/p&gt; 
&lt;p&gt;Spacemacs can be used naturally by both Emacs and Vim users -- you can even mix the two editing styles. Being able to quickly switch between input styles, makes Spacemacs a great tool for pair-programming.&lt;/p&gt; 
&lt;p&gt;Spacemacs is currently in beta, and any contributions are very welcome.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/img/spacemacs-python.png&quot; alt=&quot;spacemacs_python&quot; /&gt;&lt;/p&gt; 
&lt;h1&gt;Features&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Great documentation:&lt;/strong&gt; access the Spacemacs documentation with &lt;kbd&gt;SPC h SPC&lt;/kbd&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Beautiful GUI:&lt;/strong&gt; you&#39;ll love the distraction free UI and its functional mode-line.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Excellent ergonomics:&lt;/strong&gt; all the key bindings are accessible by pressing the &lt;kbd&gt;SPC&lt;/kbd&gt; or &lt;kbd&gt;Alt-m&lt;/kbd&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Mnemonic key bindings:&lt;/strong&gt; commands have mnemonic prefixes like &lt;kbd&gt;SPC b&lt;/kbd&gt; for all the buffer commands or &lt;kbd&gt;SPC p&lt;/kbd&gt; for the project commands.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Batteries included:&lt;/strong&gt; discover hundreds of ready-to-use packages nicely organized in configuration layers following a set of &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/CONVENTIONS.org&quot;&gt;conventions &lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Documentation&lt;/h1&gt; 
&lt;p&gt;Comprehensive documentation is available for each layer by pressing &lt;kbd&gt;SPC h SPC&lt;/kbd&gt;.&lt;/p&gt; 
&lt;p&gt;You can also check the &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/DOCUMENTATION.org&quot;&gt;general documentation&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/QUICK_START.org&quot;&gt;quick start guide&lt;/a&gt; and the &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/FAQ.org&quot;&gt;FAQ&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Getting Help&lt;/h1&gt; 
&lt;p&gt;If you need help, ask your questions in the &lt;a href=&quot;https://gitter.im/syl20bnr/spacemacs&quot;&gt;Gitter Chat&lt;/a&gt; and a member of the community will help you out.&lt;/p&gt; 
&lt;p&gt;If you prefer IRC, connect to the &lt;a href=&quot;https://irc.gitter.im/&quot;&gt;Gitter Chat IRC server&lt;/a&gt; and join the &lt;code&gt;#syl20bnr/spacemacs&lt;/code&gt; channel.&lt;/p&gt; 
&lt;p&gt;Last but not least there are a lot of high class tutorials available on YouTube:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Jack of Some&#39;s &lt;a href=&quot;https://www.youtube.com/watch?v=r-BHx7VNX5s&amp;amp;list=PLd_Oyt6lAQ8Rxb0HUnGbRrn6R4Cdt2yoI&quot;&gt;Spacemacs tutorial videos&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;GDQuest&#39;s &lt;a href=&quot;https://www.youtube.com/watch?v=hCNOB5jjtmc&amp;amp;list=PLhqJJNjsQ7KFkMVBunWWzFD8SlH714qm4&quot;&gt;Game Design oriented tutorials &lt;/a&gt; to Spacemacs.&lt;/li&gt; 
 &lt;li&gt;Practicalli&#39;s &lt;a href=&quot;https://www.youtube.com/watch?v=jMJ58Gcc1RI&amp;amp;list=PLpr9V-R8ZxiCHMl2_dn1Fovcd34Oz45su&quot;&gt;Clojure tutorials based on Spacemacs&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Eivind Fonn&#39;s classic &lt;a href=&quot;https://www.youtube.com/watch?v=ZFV5EqpZ6_s&amp;amp;list=PLrJ2YN5y27KLhd3yNs2dR8_inqtEiEweE&quot;&gt;Spacemacs ABC&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Prerequisites&lt;/h1&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;A package manager if the OS doesn&#39;t have one already.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Spacemacs is an extension of a popular text editor called &lt;a href=&quot;https://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt;. So you&#39;ll need Emacs installed first.&lt;/p&gt; &lt;p&gt;Spacemacs requires Emacs 28.2 or above. The development version of Emacs is not &lt;em&gt;officially&lt;/em&gt; supported, but it should nevertheless be expected to work.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://git-scm.com/downloads&quot;&gt;git&lt;/a&gt; is required to download and update Spacemacs.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Tar, in particular &lt;a href=&quot;https://www.gnu.org/software/tar/&quot;&gt;GNU Tar&lt;/a&gt;, is required to install and update Emacs packages used by Spacemacs.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;em&gt;(Optional)&lt;/em&gt; The default font used by Spacemacs is &lt;a href=&quot;https://adobe-fonts.github.io/source-code-pro/&quot;&gt;Source Code Pro&lt;/a&gt;. You may customize your own font settings and choose another font. If you want to use this default font, it must be installed.&lt;/p&gt; &lt;p&gt;Spacemacs also uses fallback fonts to ensure certain Unicode symbols it uses symbols appear correctly. The fonts used are determined by the OS:&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Linux: &lt;a href=&quot;https://fonts.google.com/specimen/Nanum+Gothic&quot;&gt;Nanum Gothic&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;macOS: &lt;a href=&quot;https://docs.microsoft.com/en-us/typography/font-list/arial-unicode-ms&quot;&gt;Arial Unicode MS&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;Windows: &lt;a href=&quot;https://docs.microsoft.com/en-us/typography/font-list/ms-gothic&quot;&gt;MS Gothic&lt;/a&gt; and &lt;a href=&quot;https://docs.microsoft.com/en-us/typography/font-list/lucida-sans-unicode&quot;&gt;Lucida Sans Unicode&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;p&gt;If the mode-line doesn&#39;t look similar to the &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/#introduction&quot;&gt;picture at the top of this page&lt;/a&gt;, make sure you have the correct fallback font installed.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;em&gt;(Optional)&lt;/em&gt; Various commands in Spacemacs needs one of the following line searching program:&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep (rg)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/ggreer/the_silver_searcher&quot;&gt;The silver searcher (ag)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/beyondgrep/ack3&quot;&gt;ack&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/grep/&quot;&gt;GNU Grep&lt;/a&gt; or &lt;a href=&quot;https://man.openbsd.org/grep&quot;&gt;BSD Grep&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;p&gt;Grep is very slow but it&#39;s widely available on most systems and is used as an fallback option.&lt;/p&gt; &lt;p&gt;We strongly recommend &lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep&lt;/a&gt; over other line searching programs, for its blazing fast speed. The following subsections helps you to install it.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Linux&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Most Linux distribution ships a package manager already and if this is the case you are all set for this step.&lt;/p&gt; &lt;p&gt;If it doesn&#39;t, you may need to build the softwares mentioned below from their sources.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;In most distributions, Emacs is installed via an &lt;code&gt;emacs&lt;/code&gt; package from the package manager.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;N.B.&lt;/strong&gt; DO not install &lt;a href=&quot;https://www.xemacs.org&quot;&gt;XEmacs&lt;/a&gt; because it&#39;s not supported by Spacemacs. XEmacs is an old fork of Emacs with various &lt;a href=&quot;https://www.emacswiki.org/emacs/EmacsAndXEmacs&quot;&gt;subtle differences&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;N.B.&lt;/strong&gt; Some Linux distributions support only Emacs versions older than 28.2. In this case you should &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/efaq/Installing-Emacs.html&quot;&gt;build it from source&lt;/a&gt; instead.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Very likely Git is already installed on your system. Otherwise, you should be able to install &lt;code&gt;git&lt;/code&gt; from your system&#39;s package manager.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Very likely Tar is already installed on your system. Otherwise, you should be able to install &lt;code&gt;tar&lt;/code&gt; from your system&#39;s package manager.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;em&gt;(Optional)&lt;/em&gt; If Nerd Fonts and Nanum Gothic are available from your distribution&#39;s package manager, you should install it there.&lt;/p&gt; &lt;p&gt;Otherwise, the generic way to install it is:&lt;/p&gt; 
  &lt;ol&gt; 
   &lt;li&gt; &lt;p&gt;Download the latest pre-built &lt;code&gt;TTF&lt;/code&gt; font from &lt;a href=&quot;https://github.com/adobe-fonts/source-code-pro/releases/latest&quot;&gt;https://github.com/adobe-fonts/source-code-pro/releases/latest&lt;/a&gt; and &lt;a href=&quot;https://fonts.google.com/specimen/Nanum+Gothic&quot;&gt;https://fonts.google.com/specimen/Nanum+Gothic&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; 
   &lt;li&gt; &lt;p&gt;Extract the archive and move the font files to &lt;code&gt;~/.fonts&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
   &lt;li&gt; &lt;p&gt;Refresh font cache with:&lt;/p&gt; &lt;/li&gt; 
  &lt;/ol&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;fc-cache -fv
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;em&gt;(Optional)&lt;/em&gt; If your distribution is listed &lt;a href=&quot;https://github.com/BurntSushi/ripgrep#installation=&quot;&gt;here&lt;/a&gt;, follow the instructions. Otherwise, you can download its pre-built binary or build it from source.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;macOS&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;The most popular package manager on macOS is &lt;a href=&quot;https://brew.sh&quot;&gt;Homebrew&lt;/a&gt;, to install it:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Several options exist for installing Emacs on macOS:&lt;/p&gt; 
  &lt;ol&gt; 
   &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/d12frosted/homebrew-emacs-plus&quot;&gt;Emacs Plus&lt;/a&gt; features &lt;a href=&quot;https://github.com/d12frosted/homebrew-emacs-plus#features-explained&quot;&gt;additional functionalities&lt;/a&gt; over base Emacs.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew tap d12frosted/emacs-plus

# install latest stable release, with Spacemacs icon and native compilation
brew install emacs-plus --with-spacemacs-icon --with-native-comp
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;You will require the latest version of Xcode Command Line tools, which can be downloaded from the &lt;a href=&quot;https://developer.apple.com/download/all/&quot;&gt;Apple Developer Portal&lt;/a&gt; or by running the following command:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;softwareupdate --all --install --force
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
   &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/railwaycat/homebrew-emacsmacport&quot;&gt;Emacs Mac Port&lt;/a&gt; adds native GUI support to Emacs 28. And the full list of features is available &lt;a href=&quot;https://bitbucket.org/mituharu/emacs-mac/src/master/README-mac&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew tap railwaycat/emacsmacport
brew install emacs-mac
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
   &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://emacsformacosx.com/&quot;&gt;Emacs for Mac OS X&lt;/a&gt; is the binary build of GNU Emacs, &lt;em&gt;without&lt;/em&gt; any extra feature.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew install --cask emacs
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;/ol&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;To install &lt;code&gt;git&lt;/code&gt;:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew install git
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;macOS ships with &lt;a href=&quot;https://man.openbsd.org/tar&quot;&gt;BSD Tar&lt;/a&gt;, but there are reports of weird issues so we require &lt;a href=&quot;https://www.gnu.org/software/tar/&quot;&gt;GNU Tar&lt;/a&gt; instead.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew install gnu-tar
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;em&gt;(Optional)&lt;/em&gt; To install Source Code Pro Font:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew tap homebrew/cask-fonts
brew install --cask font-source-code-pro
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Arial Unicode MS is shipped with macOS v10.5 and later so you don&#39;t need to install it manually.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;em&gt;(Optional)&lt;/em&gt; You can install &lt;code&gt;ripgrep&lt;/code&gt; via &lt;code&gt;Homebrew&lt;/code&gt;:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew install ripgrep
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Windows&lt;/h3&gt; 
&lt;p&gt;We recommend using wsl2 with wslg support especially with a pgtk build of emacs and wayland. For the installation please refer to the linux installation section. When running emacs within your wsl2 environment emacs will be handled like any other windows application.&lt;/p&gt; 
&lt;p&gt;If this is not possible you can fallback to a native windows installation, however note that this will create a lot of subtle bugs especially with tls which we will most likely not be able to help with.&lt;/p&gt; 
&lt;p&gt;If you need to follow that path we recommend to at least use a package manager like &lt;a href=&quot;https://scoop.sh&quot;&gt;Scoop&lt;/a&gt; to install the needed packages.&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;You can install &lt;a href=&quot;https://scoop.sh&quot;&gt;Scoop&lt;/a&gt; via PowerShell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first time
irm get.scoop.sh | iex
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Emacs can be installed in PowerShell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;scoop bucket add extras
scoop install emacs
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;To install &lt;code&gt;git&lt;/code&gt; in PowerShell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;scoop bucket add main
scoop install git
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Windows 10 build 17063 and later ships with &lt;a href=&quot;https://man.openbsd.org/tar&quot;&gt;BSD Tar&lt;/a&gt;, but it&#39;s required to install &lt;a href=&quot;https://www.gnu.org/software/tar/&quot;&gt;GNU Tar&lt;/a&gt; instead to avoid possible issues. Alternatively, if you are running an earlier version of Windows, Tar isn&#39;t installed. In either case, you can install GNU Tar via:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;scoop bucket add main
scoop install tar
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;To install Source Code Pro Font in PowerShell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;scoop bucket add KnotUntied_scoop-fonts https://github.com/KnotUntied/scoop-fonts
scoop install sourcecodepro
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;MS Gothic and Lucida Sans Unicode are shipped with Windows 2003 and later so you don&#39;t need to install it manually.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;em&gt;(Optional)&lt;/em&gt; You can install &lt;code&gt;ripgrep&lt;/code&gt; in PowerShell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;scoop bucket add main
scoop install ripgrep
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h1&gt;Install&lt;/h1&gt; 
&lt;h2&gt;Default Install&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;The default installation downloads Spacemacs to the &lt;code&gt;.emacs.d&lt;/code&gt; directory in your &lt;code&gt;HOME&lt;/code&gt; directory.&lt;/p&gt; &lt;p&gt;But in the case of Windows, &lt;code&gt;HOME&lt;/code&gt; is not set out-of-box. We recommend you to set it as an environment variable, with the same value as environment variable &lt;code&gt;HOMEPATH&lt;/code&gt;, which usually looks like &lt;code&gt;C:\Users\&amp;lt;username&amp;gt;&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Since Spacemacs will now be downloaded at &lt;code&gt;$HOME/.emacs.d&lt;/code&gt;, if it already exists it&#39;ll be overridden.&lt;/p&gt; &lt;p&gt;Also, if you have either &lt;code&gt;$HOME/.emacs.el&lt;/code&gt; or &lt;code&gt;$HOME/.emacs&lt;/code&gt;, they will appear before Spacemacs in Emacs&#39;s initialization steps. Thus they must be renamed in order for Spacemacs to load correctly.&lt;/p&gt; &lt;p&gt;To backup/rename the aforementioned files/directory, in shell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;[ -d $HOME/.emacs.d ] &amp;amp;&amp;amp; mv $HOME/.emacs.d $HOME/.emacs.d.bak
[ -f $HOME/.emacs.el ] &amp;amp;&amp;amp; mv $HOME/.emacs.el .emacs.el.bak
[ -f $HOME/.emacs ] &amp;amp;&amp;amp; mv $HOME/.emacs $HOME/.emacs.bak
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;or in PowerShell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;if( Test-Path -Path $HOME/.emacs.d )
{
    Rename-Item $HOME/.emacs.d $HOME/.emacs.d.bak
}
if( Test-Path -Path $HOME/.emacs.el )
{
    Rename-Item $HOME/.emacs.el $HOME/.emacs.el.bak
}
if( Test-Path -Path $HOME/.emacs )
{
    Rename-Item $HOME/.emacs $HOME/.emacs.bak
}
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Now clone this repository with Git. The following work for both shell and PowerShell:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git clone https://github.com/syl20bnr/spacemacs $HOME/.emacs.d
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;In case you have a limited internet connection or limited speed:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git clone --depth 1 https://github.com/syl20bnr/spacemacs ~/.emacs.d
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Now you can launch Emacs and Spacemacs will be loaded.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Alternative Install Location&lt;/h2&gt; 
&lt;p&gt;To install Spacemacs in a different location, we first need to introduce how Spacemacs is loaded:&lt;/p&gt; 
&lt;p&gt;When Emacs is started, it looks for the init file &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Init.html&quot;&gt;in a deterministic way&lt;/a&gt;. The &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/#default-install&quot;&gt;default installation&lt;/a&gt; exploits it by occupying &lt;code&gt;$HOME/.emacs.d/init.el&lt;/code&gt; and let Emacs use it as its init file.&lt;/p&gt; 
&lt;p&gt;In other word, in default installation, Emacs find and load &lt;code&gt;$HOME/.emacs.d/init.el&lt;/code&gt;, which is then responsible to load other files in &lt;code&gt;$HOME/.emacs.d&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;If you want to install Spacemacs to a different location, you need to make sure it&#39;s loaded by Emacs in one of its &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Init.html&quot;&gt;init file&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;For example, if you&#39;ve cloned Spacemacs to &lt;code&gt;$HOME/Spacemacs&lt;/code&gt;, and if you use &lt;code&gt;$HOME/.emacs.el&lt;/code&gt; as Emacs init file, then the following lines in &lt;code&gt;$HOME/.emacs.el&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;;; load Spacemacs&#39;s initialization file, &quot;~&quot; is equivalent to &quot;$HOME&quot;
(load-file &quot;~/Spacemacs/init.el&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;First Launch and Configuration&lt;/h1&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;After cloning Spacemacs, the first time when you launch Emacs, Spacemacs will automatically install the essential packages it requires. This step is the bootstrap.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Once the bootstrap packages are installed, Spacemacs checks whether you have an customization file &lt;code&gt;$HOME/.spacemacs&lt;/code&gt;, known as &lt;code&gt;dotspacemacs&lt;/code&gt;:&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;If it already exists, Spacemacs loads it as the configuration.&lt;/li&gt; 
   &lt;li&gt;Otherwise, you need to answer a few questions and Spacemacs will generate the &lt;code&gt;dotspacemacs&lt;/code&gt; file for you.&lt;/li&gt; 
  &lt;/ul&gt; &lt;p&gt;If you are new to Emacs and/or Spacemacs, it&#39;s fine to just accept the default choices. They can be changed in the &lt;code&gt;dotspacemacs&lt;/code&gt; file later.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Spacemacs will download and install remaining packages it will require, according to your &lt;code&gt;dotspacemacs&lt;/code&gt;. When the all the packages have been installed, restart Emacs to complete the installation.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;dotspacemacs&lt;/code&gt; is the configuration file for Spacemacs, it&#39;s self explanatory and is written in Emacs Lisp. Read &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/DOCUMENTATION.org&quot;&gt;general documentation&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/QUICK_START.org&quot;&gt;quick start guide&lt;/a&gt; for more information.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;In case you want to store your &lt;code&gt;dotspacemacs&lt;/code&gt; at another location, say under &lt;code&gt;$HOME/.spacemacs.d&lt;/code&gt;:&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;First set the environment variable &lt;code&gt;SPACEMACSDIR&lt;/code&gt; to &lt;code&gt;$HOME/.spacemacs.d&lt;/code&gt;.&lt;/li&gt; 
   &lt;li&gt;Move &lt;code&gt;$HOME/.spacemacs&lt;/code&gt; to &lt;code&gt;$HOME/.spacemacs.d/init.el&lt;/code&gt;.&lt;/li&gt; 
  &lt;/ul&gt; &lt;p&gt;In other word, set &lt;code&gt;SPACEMACSDIR&lt;/code&gt; to the parent directory of your &lt;code&gt;dotspacemacs&lt;/code&gt;, and move &lt;code&gt;dotspacemacs&lt;/code&gt; to the said directory.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Spacemacs logo&lt;/h2&gt; 
&lt;p&gt;For Linux users, create &lt;code&gt;spacemacs.desktop&lt;/code&gt; in &lt;code&gt;~/.local/share/applications/&lt;/code&gt; using &lt;a href=&quot;https://github.com/emacs-mirror/emacs/raw/master/etc/emacs.desktop&quot;&gt;this .desktop file&lt;/a&gt; as a reference. Change the &lt;code&gt;Name&lt;/code&gt; parameter to &lt;code&gt;Name=Spacemacs&lt;/code&gt; and the &lt;code&gt;Icon&lt;/code&gt; parameter to &lt;code&gt;Icon=/PATH/TO/EMACSD/core/banners/img/spacemacs.png&lt;/code&gt; where &lt;code&gt;PATH/TO/EMACSD&lt;/code&gt; is the path to your &lt;code&gt;.emacs.d&lt;/code&gt; directory, by default &lt;code&gt;~/.emacs.d&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;For macOS users, you need to &lt;a href=&quot;https://github.com/nashamri/spacemacs-logo&quot;&gt;download the .icns version of the logo&lt;/a&gt; and simply &lt;a href=&quot;https://www.idownloadblog.com/2014/07/16/how-to-change-app-icon-mac/&quot;&gt;change the logo on the Dock&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Notes&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;Depending on the installed version of GnuTLS, securely installing Emacs packages may fail. If this happens to you please update your OS and Emacs. If you are behind a company proxy please trust the company firewall cert. We do not longer support disabling https due to security reasons.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;(&lt;em&gt;Windows)&lt;/em&gt; If the following error occurs after starting Emacs:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;The directory ~/.emacs.d/server is unsafe
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Fix it by changing the owner of the directory &lt;code&gt;~/.emacs.d/server&lt;/code&gt;:&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;From Properties select the Tab “Security”,&lt;/li&gt; 
   &lt;li&gt;Select the button “Advanced”,&lt;/li&gt; 
   &lt;li&gt;Select the Tab “Owner”&lt;/li&gt; 
   &lt;li&gt;Change the owner to your account name&lt;/li&gt; 
  &lt;/ul&gt; &lt;p&gt;Source: &lt;a href=&quot;https://stackoverflow.com/questions/885793/emacs-error-when-calling-server-start&quot;&gt;Stack Overflow&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;(&lt;em&gt;Windows&lt;/em&gt;) The period (dot) before a file or folder name means that it&#39;s a hidden file or folder. To show hidden files and folders:&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Press the Windows key&lt;/li&gt; 
   &lt;li&gt;Type &lt;code&gt;File explorer options&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;Select the &lt;code&gt;View&lt;/code&gt; tab at the top&lt;/li&gt; 
   &lt;li&gt;Check &lt;code&gt;Show hidden files, folders and drives&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;Click &lt;code&gt;OK&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Update&lt;/h1&gt; 
&lt;p&gt;Spacemacs relies solely on a rolling update scheme based on the latest changes available. To update Spacemacs, simply pull the latest changes from the &lt;code&gt;develop&lt;/code&gt; branch:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Close Emacs and update the git repository:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git pull --rebase
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Restart Emacs to complete the upgrade.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong&gt;After updating Spacemacs, you should also check if any updates are available for your packages. On the Spacemacs Home Buffer &lt;kbd&gt;SPC b h&lt;/kbd&gt;, click (press &lt;kbd&gt;RET&lt;/kbd&gt;) on the &lt;code&gt;[Update Packages]&lt;/code&gt; button, or use the convenient keybinding &lt;kbd&gt;SPC f e U&lt;/kbd&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;h2&gt;Upgrading from the deprecated &lt;code&gt;master&lt;/code&gt; branch&lt;/h2&gt; 
&lt;p&gt;If you are still on the old &lt;code&gt;master&lt;/code&gt; branch (i.e., if &lt;code&gt;git branch --show-current&lt;/code&gt; shows &lt;code&gt;master&lt;/code&gt; instead of &lt;code&gt;develop&lt;/code&gt;), you need to &lt;a href=&quot;https://practical.li/spacemacs/reference/switch-to-develop/&quot;&gt;upgrade to &lt;code&gt;develop&lt;/code&gt;&lt;/a&gt; first.&lt;/p&gt; 
&lt;h1&gt;Quotes&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://gitter.im/syl20bnr/spacemacs?at=568e627a0cdaaa62045a7df6&quot;&gt;Quote&lt;/a&gt; by &lt;a href=&quot;https://github.com/ashnur&quot;&gt;ashnur&lt;/a&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;«I feel that spacemacs is an aircraft carrier and I am playing table tennis
on the deck as a freerider.»
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://gitter.im/syl20bnr/spacemacs?at=5768456c6577f032450cfedb&quot;&gt;Quote&lt;/a&gt; by &lt;a href=&quot;https://github.com/deuill&quot;&gt;deuill&lt;/a&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;«I LOVE SPACEMACS AND MAGIT

 That is all»
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;Contributions&lt;/h1&gt; 
&lt;p&gt;Spacemacs is a community-driven project, it needs &lt;em&gt;you&lt;/em&gt; to keep it up to date and to propose great and useful configurations for all the things!&lt;/p&gt; 
&lt;p&gt;Before contributing, be sure to consult the &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/CONTRIBUTING.org&quot;&gt;contribution guidelines&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/doc/CONVENTIONS.org&quot;&gt;conventions&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Communities&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gitter.im/syl20bnr/spacemacs&quot;&gt;Gitter Chat&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://emacs.stackexchange.com/questions/tagged/spacemacs&quot;&gt;Stack Exchange&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/spacemacs&quot;&gt;Reddit&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Spacemacs Everywhere&lt;/h1&gt; 
&lt;p&gt;Once you&#39;ve learned the Spacemacs key bindings, you can use them in other IDEs/tools, thanks to the following projects:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/MarcoIeni/intellimacs&quot;&gt;Intellimacs&lt;/a&gt; - Spacemacs&#39; like key bindings for IntelliJ platform&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/MarcoIeni/spaceclipse&quot;&gt;Spaceclipse&lt;/a&gt; - Spacemacs’ like key bindings for Eclipse&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/SpaceVim/SpaceVim&quot;&gt;SpaceVim&lt;/a&gt; - A community-driven modular vim distribution&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/VSpaceCode/VSpaceCode&quot;&gt;VSpaceCode&lt;/a&gt; - Spacemacs’ like key bindings for Visual Studio Code&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;License&lt;/h1&gt; 
&lt;p&gt;The license is GPLv3 for all parts specific to Spacemacs, this includes:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;the initialization and core files&lt;/li&gt; 
 &lt;li&gt;all the layer files&lt;/li&gt; 
 &lt;li&gt;the documentation&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For the packages shipped in this repository, you can refer to the files header.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/nashamri/spacemacs-logo&quot;&gt;Spacemacs logo&lt;/a&gt; by &lt;a href=&quot;https://github.com/nashamri&quot;&gt;Nasser Alshammari&lt;/a&gt; released under a &lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;Creative Commons Attribution-ShareAlike 4.0 International License.&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;Supporting Spacemacs&lt;/h1&gt; 
&lt;p&gt;The best way to support Spacemacs is to contribute to it either by reporting bugs, helping the community on the &lt;a href=&quot;https://gitter.im/syl20bnr/spacemacs&quot;&gt;Gitter Chat&lt;/a&gt; or sending pull requests.&lt;/p&gt; 
&lt;p&gt;You can show your love for the project by getting cool Spacemacs t-shirts, mugs and more in the &lt;a href=&quot;https://shop.spreadshirt.com/spacemacs-shop&quot;&gt;Spacemacs Shop&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;If you want to show your support financially, then you can contribute to &lt;a href=&quot;https://salt.bountysource.com/teams/spacemacs&quot;&gt;Bountysource&lt;/a&gt;, or buy a drink for the maintainer by clicking on the &lt;a href=&quot;https://raw.githubusercontent.com/syl20bnr/spacemacs/develop/#top&quot;&gt;Paypal badge&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;If you used Spacemacs in a project, and you want to show that fact, you can use the Spacemacs badge: &lt;a href=&quot;https://spacemacs.org&quot;&gt;&lt;img src=&quot;https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg?sanitize=true&quot; alt=&quot;Built with
Spacemacs&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;For Markdown:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[![Built with Spacemacs](https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg)](https://spacemacs.org)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;For HTML:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;a href=&quot;https://spacemacs.org&quot;&amp;gt;&amp;lt;img alt=&quot;Built with Spacemacs&quot; src=&quot;https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg&quot; /&amp;gt;&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;For Org-mode:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-org&quot;&gt;[[https://spacemacs.org][file:https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg]]
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Thank you!&lt;/p&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/7212645/2911bf00-6169-11e9-96b0-2f3dbe77ffb5" medium="image" />
      
    </item>
    
    <item>
      <title>xenodium/agent-shell</title>
      <link>https://github.com/xenodium/agent-shell</link>
      <description>&lt;p&gt;A native Emacs buffer to interact with LLM agents powered by ACP&lt;/p&gt;&lt;hr&gt;&lt;p&gt;#+TITLE: Emacs Agent Shell #+AUTHOR: Álvaro Ramírez&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://melpa.org/#/agent-shell&quot;&gt;https://melpa.org/#/agent-shell&lt;/a&gt;][file:&lt;a href=&quot;https://melpa.org/packages/agent-shell-badge.svg&quot;&gt;https://melpa.org/packages/agent-shell-badge.svg&lt;/a&gt;]]&lt;/p&gt; 
&lt;p&gt;👉 [[&lt;a href=&quot;https://github.com/sponsors/xenodium&quot;&gt;https://github.com/sponsors/xenodium&lt;/a&gt;][Support this work via GitHub Sponsors]] by [[&lt;a href=&quot;https://github.com/xenodium&quot;&gt;https://github.com/xenodium&lt;/a&gt;][@xenodium]] (check out my [[&lt;a href=&quot;https://xenodium.com&quot;&gt;https://xenodium.com&lt;/a&gt;][blog]])&lt;/p&gt; 
&lt;p&gt;[[file:agent-shell.png]]&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;This project needs your funding&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;As you pay for those useful LLM tokens, consider [[&lt;a href=&quot;https://github.com/sponsors/xenodium&quot;&gt;https://github.com/sponsors/xenodium&lt;/a&gt;][sponsoring]] development and maintenance of this project. With your help, I can make this effort more [[&lt;a href=&quot;https://github.com/sponsors/xenodium&quot;&gt;https://github.com/sponsors/xenodium&lt;/a&gt;][sustainable]].&lt;/p&gt; 
&lt;p&gt;Thank you!&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://xenodium.com/&quot;&gt;https://xenodium.com/&lt;/a&gt;][Alvaro]]&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;agent-shell&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;A native Emacs shell to interact with LLM agents powered by ACP ([[&lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;https://agentclientprotocol.com&lt;/a&gt;][Agent Client Protocol]]).&lt;/p&gt; 
&lt;p&gt;With agent-shell, you can chat with the likes of Gemini CLI, Claude Agent, Auggie, Mistral Vibe, or any other ACP-driven agent.&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://www.youtube.com/watch?v=R2Ucr3amgGg&quot;&gt;https://www.youtube.com/watch?v=R2Ucr3amgGg&lt;/a&gt;][agent-shell - YouTube]]&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://www.youtube.com/watch?v=R2Ucr3amgGg&quot;&gt;https://www.youtube.com/watch?v=R2Ucr3amgGg&lt;/a&gt;][file:yt.png]]&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://www.youtube.com/watch?v=ymMlftdGx4I&quot;&gt;https://www.youtube.com/watch?v=ymMlftdGx4I&lt;/a&gt;][agent-shell + Claude Skills - YouTube]]&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://www.youtube.com/watch?v=ymMlftdGx4I&quot;&gt;https://www.youtube.com/watch?v=ymMlftdGx4I&lt;/a&gt;][&lt;a href=&quot;https://img.youtube.com/vi/ymMlftdGx4I/0.jpg&quot;&gt;https://img.youtube.com/vi/ymMlftdGx4I/0.jpg&lt;/a&gt;]]&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://www.youtube.com/watch?v=HJQ86HuSIJI&quot;&gt;https://www.youtube.com/watch?v=HJQ86HuSIJI&lt;/a&gt;][agent-shell + Claude Skills + Charts - YouTube]]&lt;/p&gt; 
&lt;p&gt;[[&lt;a href=&quot;https://www.youtube.com/watch?v=HJQ86HuSIJI&quot;&gt;https://www.youtube.com/watch?v=HJQ86HuSIJI&lt;/a&gt;][&lt;a href=&quot;https://img.youtube.com/vi/HJQ86HuSIJI/0.jpg&quot;&gt;https://img.youtube.com/vi/HJQ86HuSIJI/0.jpg&lt;/a&gt;]]&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;News&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://xenodium.com/agent-shell-0-47-1-updates&quot;&gt;https://xenodium.com/agent-shell-0-47-1-updates&lt;/a&gt;][agent-shell 0.47 updates]].&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://xenodium.com/agent-shell-0-25-updates&quot;&gt;https://xenodium.com/agent-shell-0-25-updates&lt;/a&gt;][agent-shell 0.25 updates]].&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://xenodium.com/agent-shell-016-improvements-melpa&quot;&gt;https://xenodium.com/agent-shell-016-improvements-melpa&lt;/a&gt;][agent-shell 0.17 improvements + MELPA]].&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://xenodium.com/agent-shell-0-5-improvements&quot;&gt;https://xenodium.com/agent-shell-0-5-improvements&lt;/a&gt;][agent-shell 0.5 improvements]].&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://xenodium.com/introducing-agent-shell&quot;&gt;https://xenodium.com/introducing-agent-shell&lt;/a&gt;][Introducing Emacs agent-shell (powered by ACP)]].&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://xenodium.com/introducing-acpel&quot;&gt;https://xenodium.com/introducing-acpel&lt;/a&gt;][Introducing acp.el]].&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li&gt;Related projects&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;=agent-shell= relies on [[&lt;a href=&quot;https://github.com/xenodium/acp.el&quot;&gt;https://github.com/xenodium/acp.el&lt;/a&gt;][acp.el]] to communicate with agents via ACP ([[&lt;a href=&quot;https://agentclientprotocol.com/&quot;&gt;https://agentclientprotocol.com/&lt;/a&gt;][Agent Client Protocol]]).&lt;/p&gt; 
&lt;p&gt;We now have a handful of additional packages to extend the =agent-shell= experience:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/xenodium/emacs-skills&quot;&gt;https://github.com/xenodium/emacs-skills&lt;/a&gt;][emacs-skills]]: Claude Agent skills for Emacs.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/ElleNajt/agent-shell-to-go&quot;&gt;https://github.com/ElleNajt/agent-shell-to-go&lt;/a&gt;][agent-shell-to-go]]: Interact with =agent-shell= sessions from your mobile or any other device via Slack.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/Embedded-Focus/agent-circus&quot;&gt;https://github.com/Embedded-Focus/agent-circus&lt;/a&gt;][agent-circus]]: Run AI coding agents in sandboxed Docker containers.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/cmacrae/agent-shell-sidebar&quot;&gt;https://github.com/cmacrae/agent-shell-sidebar&lt;/a&gt;][agent-shell-sidebar]]: A sidebar add-on for =agent-shell=.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/dcluna/agent-shell-bookmark&quot;&gt;https://github.com/dcluna/agent-shell-bookmark&lt;/a&gt;][agent-shell-bookmark]]: Bookmark support for agent-shell sessions.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/gveres/agent-shell-workspace&quot;&gt;https://github.com/gveres/agent-shell-workspace&lt;/a&gt;][agent-shell-workspace]]: Dedicated tab-bar workspace for managing multiple =agent-shell= sessions.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/jethrokuan/agent-shell-manager&quot;&gt;https://github.com/jethrokuan/agent-shell-manager&lt;/a&gt;][agent-shell-manager]]: Tabulated view and management of =agent-shell= buffers.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/nineluj/agent-review&quot;&gt;https://github.com/nineluj/agent-review&lt;/a&gt;][agent-review]]: Code review interface for =agent-shell=.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/ultronozm/agent-shell-attention.el&quot;&gt;https://github.com/ultronozm/agent-shell-attention.el&lt;/a&gt;][agent-shell-attention.el]]: Mode-line attention tracker for =agent-shell=.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/xenodium/agent-shell-knockknock&quot;&gt;https://github.com/xenodium/agent-shell-knockknock&lt;/a&gt;][agent-shell-knockknock]]: Notifications for =agent-shell= via [[&lt;a href=&quot;https://github.com/konrad1977/knockknock&quot;&gt;https://github.com/konrad1977/knockknock&lt;/a&gt;][knockknock.el]].&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/zackattackz/agent-shell-notifications&quot;&gt;https://github.com/zackattackz/agent-shell-notifications&lt;/a&gt;][agent-shell-notifications]]: Desktop notifications for =agent-shell= events.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/ElleNajt/meta-agent-shell&quot;&gt;https://github.com/ElleNajt/meta-agent-shell&lt;/a&gt;][meta-agent-shell]]: Multi-agent coordination system for =agent-shell= with inter-agent communication, task tracking, and project-level dispatching.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/cxa/agent-shell-macext&quot;&gt;https://github.com/cxa/agent-shell-macext&lt;/a&gt;][agent-shell-macext]]: macOS-specific enhancements for =agent-shell=.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/lllShamanlll/agent-shell-org-transcript&quot;&gt;https://github.com/lllShamanlll/agent-shell-org-transcript&lt;/a&gt;][agent-shell-org-transcript]]: Org-mode transcripts for =agent-shell= sessions, with org-roam integration.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/eddof13/ob-agent-shell&quot;&gt;https://github.com/eddof13/ob-agent-shell&lt;/a&gt;][ob-agent-shell]]: Org Babel backend for executing =agent-shell= source blocks.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/Marx-A00/agent-recall&quot;&gt;https://github.com/Marx-A00/agent-recall&lt;/a&gt;][agent-recall]]: Search, browse, and resume =agent-shell= conversation transcripts.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/lgmoneda/agent-shell-pet&quot;&gt;https://github.com/lgmoneda/agent-shell-pet&lt;/a&gt;][agent-shell-pet]]: Codex-like pets that broadcast agent-shell session states.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li&gt;Articles&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li&gt;20Y: [[&lt;a href=&quot;https://20y.hu/~slink/journal/agent-shell/index.html&quot;&gt;https://20y.hu/~slink/journal/agent-shell/index.html&lt;/a&gt;][Agentic development workflow in Emacs]]&lt;/li&gt; 
 &lt;li&gt;Skye: [[&lt;a href=&quot;https://skyefreeman.com/blog/2026/04/15/how-im-using-llms-with-emacs&quot;&gt;https://skyefreeman.com/blog/2026/04/15/how-im-using-llms-with-emacs&lt;/a&gt;][How I&#39;m using LLM&#39;s via Emacs]].&lt;/li&gt; 
 &lt;li&gt;sincebyte: [[&lt;a href=&quot;https://neoemacs.com/posts/agent-shell-cursor-agent-cli/&quot;&gt;https://neoemacs.com/posts/agent-shell-cursor-agent-cli/&lt;/a&gt;][Agent Shell Cursor Agent Cli]].&lt;/li&gt; 
 &lt;li&gt;Naputo: [[&lt;a href=&quot;https://blog.n-daisuke897.com/posts/2026-03-01-agent-shell-session-selection/&quot;&gt;https://blog.n-daisuke897.com/posts/2026-03-01-agent-shell-session-selection/&lt;/a&gt;][How to Select Sessions When Starting the agent-shell ACP Client Running on Emacs]]&lt;/li&gt; 
 &lt;li&gt;vandee: [[&lt;a href=&quot;https://www.vandee.art/blog/2026-01-23-my-agent-practice-with-opencode-in-emacs.html&quot;&gt;https://www.vandee.art/blog/2026-01-23-my-agent-practice-with-opencode-in-emacs.html&lt;/a&gt;][My Agent Practice with OpenCode in Emacs]].&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li&gt;Icons&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Thanks to [[&lt;a href=&quot;https://github.com/lobehub/lobe-icons&quot;&gt;https://github.com/lobehub/lobe-icons&lt;/a&gt;][Lobe Icons]] for the lovely icons.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Setup&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** External dependencies&lt;/p&gt; 
&lt;p&gt;*** Claude Agent SDK&lt;/p&gt; 
&lt;p&gt;For Anthropic&#39;s [[&lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;https://code.claude.com/docs/en/overview&lt;/a&gt;][Claude Agent]] (formerly known as the Claude Code), follow [[&lt;a href=&quot;https://github.com/agentclientprotocol/claude-agent-acp&quot;&gt;https://github.com/agentclientprotocol/claude-agent-acp&lt;/a&gt;][claude-agent-acp instructions]], typically something like:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash npm install -g @agentclientprotocol/claude-agent-acp #+end_src&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; The =-g= flag is required to install the binary globally so it&#39;s available in your PATH. After installation, verify it&#39;s available by running =which claude-agent-acp= in your terminal.&lt;/p&gt; 
&lt;p&gt;Optionally: You may also need [[&lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;https://code.claude.com/docs/en/overview&lt;/a&gt;][Claude Agent]] itself if you want to use a Claude subscription (run the CLI outside of Emacs at least once to log in to your subscription and then use =agent-shell= from Emacs). Follow Claude Agent&#39;s [[&lt;a href=&quot;https://code.claude.com/docs/en/overview#get-started&quot;&gt;https://code.claude.com/docs/en/overview#get-started&lt;/a&gt;][get started]] for installation.&lt;/p&gt; 
&lt;p&gt;*** Codex&lt;/p&gt; 
&lt;p&gt;For OpenAI&#39;s Codex, install [[&lt;a href=&quot;https://github.com/zed-industries/codex-acp&quot;&gt;https://github.com/zed-industries/codex-acp&lt;/a&gt;][zed/codex-acp]] and ensure the &lt;code&gt;codex-acp&lt;/code&gt; executable is in PATH.&lt;/p&gt; 
&lt;p&gt;*** Gemini CLI&lt;/p&gt; 
&lt;p&gt;For Google&#39;s [[&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;https://github.com/google-gemini/gemini-cli&lt;/a&gt;][Gemini CLI]], be sure to get a recent release supporting the =--experimental-acp= flag.&lt;/p&gt; 
&lt;p&gt;*** Goose&lt;/p&gt; 
&lt;p&gt;For Goose CLI, install [[&lt;a href=&quot;https://block.github.io/goose/docs/getting-started/installation&quot;&gt;https://block.github.io/goose/docs/getting-started/installation&lt;/a&gt;][goose]] and ensure the &lt;code&gt;goose&lt;/code&gt; executable is in PATH.&lt;/p&gt; 
&lt;p&gt;*** Cursor&lt;/p&gt; 
&lt;p&gt;For Cursor agent, install with:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash npm install -g @blowmage/cursor-agent-acp #+end_src&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://github.com/blowmage/cursor-agent-acp-npm&quot;&gt;https://github.com/blowmage/cursor-agent-acp-npm&lt;/a&gt; for details.&lt;/p&gt; 
&lt;p&gt;*** Kimi Code CLI&lt;/p&gt; 
&lt;p&gt;For Kimi Code CLI, install with:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash curl -L &lt;a href=&quot;http://code.kimi.com/install.sh&quot;&gt;code.kimi.com/install.sh&lt;/a&gt; | bash #+end_src&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://www.kimi.com/code&quot;&gt;https://www.kimi.com/code&lt;/a&gt; for details.&lt;/p&gt; 
&lt;p&gt;*** Kiro CLI&lt;/p&gt; 
&lt;p&gt;For Kiro CLI, install with:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash curl -fsSL &lt;a href=&quot;https://cli.kiro.dev/install&quot;&gt;https://cli.kiro.dev/install&lt;/a&gt; | bash #+end_src&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://kiro.dev/docs/cli/acp/&quot;&gt;https://kiro.dev/docs/cli/acp/&lt;/a&gt; for details.&lt;/p&gt; 
&lt;p&gt;*** Qwen Code&lt;/p&gt; 
&lt;p&gt;For Qwen Code, install with:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash npm install -g @qwen-code/qwen-code@latest #+end_src&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://github.com/QwenLM/qwen-code&quot;&gt;https://github.com/QwenLM/qwen-code&lt;/a&gt; for details.&lt;/p&gt; 
&lt;p&gt;*** Auggie&lt;/p&gt; 
&lt;p&gt;For Auggie CLI, install with:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash npm install -g @augmentcode/auggie #+end_src&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://docs.augmentcode.com/cli/overview&quot;&gt;https://docs.augmentcode.com/cli/overview&lt;/a&gt; for details. *** Mistral Vibe&lt;/p&gt; 
&lt;p&gt;For Mistral Vibe, install with:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash uv tool install mistral-vibe #+end_src&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://github.com/mistralai/mistral-vibe&quot;&gt;https://github.com/mistralai/mistral-vibe&lt;/a&gt; for details.&lt;/p&gt; 
&lt;p&gt;*** Factory Droid&lt;/p&gt; 
&lt;p&gt;For Factory Droid, install Droid:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash curl -fsSL &lt;a href=&quot;https://app.factory.ai/cli&quot;&gt;https://app.factory.ai/cli&lt;/a&gt; | sh #+end_src&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://factory.ai&quot;&gt;https://factory.ai&lt;/a&gt; for details.&lt;/p&gt; 
&lt;p&gt;*** Pi&lt;/p&gt; 
&lt;p&gt;For Pi coding agent, install the =pi-acp= adapter:&lt;/p&gt; 
&lt;p&gt;#+begin_src bash npm install -g pi-acp #+end_src&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://github.com/svkozak/pi-acp&quot;&gt;https://github.com/svkozak/pi-acp&lt;/a&gt; for details.&lt;/p&gt; 
&lt;p&gt;** Installation&lt;/p&gt; 
&lt;p&gt;=agent-shell= is powered by built-in =comint-shell=, via [[&lt;a href=&quot;https://github.com/xenodium/shell-maker&quot;&gt;https://github.com/xenodium/shell-maker&lt;/a&gt;][shell-maker]], available on [[&lt;a href=&quot;https://melpa.org/#/shell-maker&quot;&gt;https://melpa.org/#/shell-maker&lt;/a&gt;][MELPA]].&lt;/p&gt; 
&lt;p&gt;Both [[&lt;a href=&quot;https://melpa.org/#/agent-shell&quot;&gt;https://melpa.org/#/agent-shell&lt;/a&gt;][agent-shell]] and its dependency [[&lt;a href=&quot;https://melpa.org/#/acp&quot;&gt;https://melpa.org/#/acp&lt;/a&gt;][acp.el]] are now available on MELPA.&lt;/p&gt; 
&lt;p&gt;You can install via:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (use-package agent-shell :ensure t :ensure-system-package ;; Add agent installation configs here ((claude . &quot;brew install claude-code&quot;) (claude-agent-acp . &quot;npm install -g @agentclientprotocol/claude-agent-acp&quot;))) #+end_src&lt;/p&gt; 
&lt;p&gt;This will automatically install the required dependencies ([[&lt;a href=&quot;https://melpa.org/#/acp&quot;&gt;https://melpa.org/#/acp&lt;/a&gt;][acp.el]] and [[&lt;a href=&quot;https://melpa.org/#/shell-maker&quot;&gt;https://melpa.org/#/shell-maker&lt;/a&gt;][shell-maker]]).&lt;/p&gt; 
&lt;p&gt;*** Doom Emacs&lt;/p&gt; 
&lt;p&gt;If you are using Doom Emacs and would like to use the =package!= macro:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (package! shell-maker) (package! acp) (package! agent-shell) #+end_src&lt;/p&gt; 
&lt;p&gt;Run =doom sync= and restart.&lt;/p&gt; 
&lt;p&gt;Include =require= before configuration:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (require &#39;acp) (require &#39;agent-shell) ;; rest of config... #+end_src&lt;/p&gt; 
&lt;p&gt;** Configuration&lt;/p&gt; 
&lt;p&gt;Configure authentication for the agent providers you want to use.&lt;/p&gt; 
&lt;p&gt;*** Environment variables&lt;/p&gt; 
&lt;p&gt;Pass environment variables to the spawned agent process by customizing the &lt;code&gt;agent-shell-*-environment&lt;/code&gt; variable with &lt;code&gt;agent-shell-make-environment-variables&lt;/code&gt;. The helper accepts key/value pairs and exports them when the agent starts.&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-anthropic-claude-environment (agent-shell-make-environment-variables &quot;ANTHROPIC_API_KEY&quot; (auth-source-pass-get &#39;secret &quot;anthropic-api-key&quot;) &quot;HTTPS_PROXY&quot; &quot;&lt;a href=&quot;http://proxy.example.com:8080&quot;&gt;http://proxy.example.com:8080&lt;/a&gt;&quot;)) #+end_src&lt;/p&gt; 
&lt;p&gt;**** Inheriting environment variables&lt;/p&gt; 
&lt;p&gt;By default, the agent process starts with a minimal environment. To inherit environment variables from the parent Emacs process, use the &lt;code&gt;:inherit-env t&lt;/code&gt; parameter in &lt;code&gt;agent-shell-make-environment-variables&lt;/code&gt;:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setenv &quot;ANTHROPIC_API_KEY&quot; (auth-source-pass-get &#39;secret &quot;anthropic-api-key&quot;))&lt;/p&gt; 
&lt;p&gt;(setq agent-shell-anthropic-claude-environment (agent-shell-make-environment-variables :inherit-env t)) #+end_src&lt;/p&gt; 
&lt;p&gt;This ensures that environment variables like &lt;code&gt;PATH&lt;/code&gt;, &lt;code&gt;HOME&lt;/code&gt;, and others from your Emacs session are available to the agent process, while still allowing you to override or add specific variables.&lt;/p&gt; 
&lt;p&gt;**** Loading environment variables from files&lt;/p&gt; 
&lt;p&gt;You can load environment variables from .env files using the &lt;code&gt;:load-env&lt;/code&gt; parameter. This supports both single and multiple files:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; Load from a single .env file (setq agent-shell-anthropic-claude-environment (agent-shell-make-environment-variables :load-env &quot;~/.env&quot; &quot;CUSTOM_VAR&quot; &quot;custom_value&quot;))&lt;/p&gt; 
&lt;p&gt;;; Load from multiple .env files (setq agent-shell-anthropic-claude-environment (agent-shell-make-environment-variables :load-env &#39;(&quot;~/.env&quot; &quot;.env.local&quot;) :inherit-env t)) #+end_src&lt;/p&gt; 
&lt;p&gt;The .env files should contain variables in the format &lt;code&gt;KEY=value&lt;/code&gt;, with one variable per line. Comments (lines starting with &lt;code&gt;#&lt;/code&gt;) and empty lines are ignored.&lt;/p&gt; 
&lt;p&gt;*** Anthropic Claude&lt;/p&gt; 
&lt;p&gt;For login-based authentication (default):&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-anthropic-authentication (agent-shell-anthropic-make-authentication :login t)) #+end_src&lt;/p&gt; 
&lt;p&gt;For API key authentication:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; With string (setq agent-shell-anthropic-authentication (agent-shell-anthropic-make-authentication :api-key &quot;your-anthropic-api-key-here&quot;))&lt;/p&gt; 
&lt;p&gt;;; With function (setq agent-shell-anthropic-authentication (agent-shell-anthropic-make-authentication :api-key (lambda () (auth-source-pass-get &#39;secret &quot;anthropic-api-key&quot;)))) #+end_src&lt;/p&gt; 
&lt;p&gt;For OAuth token authentication (the =CLAUDE_CODE_OAUTH_TOKEN= we get from =claude setup-token=):&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; With string (setq agent-shell-anthropic-authentication (agent-shell-anthropic-make-authentication :oauth &quot;your-oauth-token-here&quot;))&lt;/p&gt; 
&lt;p&gt;;; With function (setq agent-shell-anthropic-authentication (agent-shell-anthropic-make-authentication :oauth (lambda () (auth-source-pass-get &quot;secret&quot; &quot;anthropic-oauth-token&quot;)))) #+end_src&lt;/p&gt; 
&lt;p&gt;For alternative Anthropic-compatible API endpoints, configure via environment variables:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-anthropic-claude-environment (agent-shell-make-environment-variables &quot;ANTHROPIC_BASE_URL&quot; &quot;&lt;a href=&quot;https://api.moonshot.cn/anthropic&quot;&gt;https://api.moonshot.cn/anthropic&lt;/a&gt;&quot; &quot;ANTHROPIC_MODEL&quot; &quot;kimi-k2-turbo-preview&quot; &quot;ANTHROPIC_SMALL_FAST_MODEL&quot; &quot;kimi-k2-turbo-preview&quot;)) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Google Gemini&lt;/p&gt; 
&lt;p&gt;For login-based authentication (default):&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-google-authentication (agent-shell-google-make-authentication :login t)) #+end_src&lt;/p&gt; 
&lt;p&gt;For API key authentication:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; With string (setq agent-shell-google-authentication (agent-shell-google-make-authentication :api-key &quot;your-google-api-key-here&quot;))&lt;/p&gt; 
&lt;p&gt;;; With function (setq agent-shell-google-authentication (agent-shell-google-make-authentication :api-key (lambda () (auth-source-pass-get &#39;secret &quot;google-api-key&quot;)))) #+end_src&lt;/p&gt; 
&lt;p&gt;For Vertex AI authentication:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-google-authentication (agent-shell-google-make-authentication :vertex-ai t)) #+end_src&lt;/p&gt; 
&lt;p&gt;*** OpenAI Codex&lt;/p&gt; 
&lt;p&gt;For login-based authentication (default):&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-openai-authentication (agent-shell-openai-make-authentication :login t)) #+end_src&lt;/p&gt; 
&lt;p&gt;For API key authentication:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; With string (setq agent-shell-openai-authentication (agent-shell-openai-make-authentication :api-key &quot;your-openai-api-key-here&quot;))&lt;/p&gt; 
&lt;p&gt;;; With function (setq agent-shell-openai-authentication (agent-shell-openai-make-authentication :api-key (lambda () (auth-source-pass-get &#39;secret &quot;openai-api-key&quot;)))) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Goose&lt;/p&gt; 
&lt;p&gt;For OpenAI API key authentication:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; With string (setq agent-shell-goose-authentication (agent-shell-make-goose-authentication :openai-api-key &quot;your-openai-api-key-here&quot;))&lt;/p&gt; 
&lt;p&gt;;; With function (setq agent-shell-goose-authentication (agent-shell-make-goose-authentication :openai-api-key (lambda () (auth-source-pass-get &#39;secret &quot;openai-api-key&quot;)))) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Qwen Code&lt;/p&gt; 
&lt;p&gt;For OAuth login-based authentication:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-qwen-authentication (agent-shell-qwen-make-authentication :login t)) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Auggie&lt;/p&gt; 
&lt;p&gt;For login-based authentication (default):&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-auggie-authentication (agent-shell-make-auggie-authentication :login t)) #+end_src&lt;/p&gt; 
&lt;p&gt;For no authentication (when using alternative authentication methods):&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-auggie-authentication (agent-shell-make-auggie-authentication :none t)) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Mistral Vibe&lt;/p&gt; 
&lt;p&gt;For API key authentication:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp ;; With string (setq agent-shell-mistral-authentication (agent-shell-mistral-make-authentication :api-key &quot;your-mistral-api-key-here&quot;))&lt;/p&gt; 
&lt;p&gt;;; With function (reusing the API key configured in vibe) (setq agent-shell-mistral-authentication (agent-shell-mistral-make-authentication :api-key (lambda () (string-trim (shell-command-to-string &quot;source ~/.vibe/.env; echo $MISTRAL_API_KEY&quot;))))) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Customizing Available Agents&lt;/p&gt; 
&lt;p&gt;By default, =agent-shell= includes configurations for all supported agents (Claude Agent, Gemini CLI, Codex, Goose, Qwen Code, and Auggie). You can customize which agents are available through the =agent-shell-agent-configs= variable.&lt;/p&gt; 
&lt;p&gt;** Usage&lt;/p&gt; 
&lt;p&gt;*** Quick Start&lt;/p&gt; 
&lt;p&gt;=M-x agent-shell= - Start or reuse any of the known agents.&lt;/p&gt; 
&lt;p&gt;You can select and start any of the known agent shells (see =agent-shell-agent-configs=) via the =agent-shell= interactive command and enables reusing existing shells when available. With a prefix argument (=C-u M-x agent-shell=), it forces starting a new shell session, thus instantiating multiple agent shells.&lt;/p&gt; 
&lt;p&gt;*** Specific Agent Commands&lt;/p&gt; 
&lt;p&gt;Start a specific agent shell session directly:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;=M-x agent-shell-anthropic-start-claude-code= - Start a Claude Agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-auggie-start-agent= - Start an Auggie agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-openai-start-codex= - Start a Codex agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-google-start-gemini= - Start a Gemini agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-goose-start-agent= - Start a Goose agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-cursor-start-agent= - Start a Cursor agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-kiro-start-agent= - Start a Kiro CLI agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-mistral-start-vibe= - Start a Mistral Vibe agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-qwen-start= - Start a Qwen Code agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-droid-start-agent= - Start a Factory Droid agent session&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-pi-start-agent= - Start a Pi coding agent session&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;*** Setting a default agent for all new shells&lt;/p&gt; 
&lt;p&gt;You can set a default agent to use for all new shells started via =agent-shell= like so:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-preferred-agent-config (agent-shell-anthropic-make-claude-code-config)) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Configuring MCP servers&lt;/p&gt; 
&lt;p&gt;You can configure MCP servers directly via =agent-shell=. This allows you to avoid having to repeat configurations across every agent that you use.&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-mcp-servers &#39;(((name . &quot;notion&quot;) (type . &quot;http&quot;) (headers . []) (url . &quot;&lt;a href=&quot;https://mcp.notion.com/mcp&quot;&gt;https://mcp.notion.com/mcp&lt;/a&gt;&quot;)))) #+end_src&lt;/p&gt; 
&lt;p&gt;** Running agents in Devcontainers / Docker containers (Experimental)&lt;/p&gt; 
&lt;p&gt;=agent-shell= provides rudimentary support for running agents and shell commands in containers.&lt;/p&gt; 
&lt;p&gt;Use =agent-shell-command-prefix= to prefix the command that starts the agent, or a shell command that should be run so it is executed inside the container.&lt;/p&gt; 
&lt;p&gt;*** Static command list&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-command-prefix &#39;(&quot;devcontainer&quot; &quot;exec&quot; &quot;--workspace-folder&quot; &quot;.&quot;)) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Function-based configuration&lt;/p&gt; 
&lt;p&gt;For dynamic per-agent containers, provide a function that takes the current agent-shell buffer and returns the command list:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-command-prefix (lambda (buffer) (let ((config (agent-shell-get-config buffer))) (pcase (map-elt config :identifier) (&#39;claude-code &#39;(&quot;docker&quot; &quot;exec&quot; &quot;claude-dev&quot; &quot;--&quot;)) (&#39;gemini-cli &#39;(&quot;docker&quot; &quot;exec&quot; &quot;gemini-dev&quot; &quot;--&quot;)) (_ &#39;(&quot;devcontainer&quot; &quot;exec&quot; &quot;.&quot;)))))) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Per-session containers&lt;/p&gt; 
&lt;p&gt;You can use different containers for different shell sessions, even of the same agent type:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-command-prefix (lambda (buffer) ;; Different container based on project (if (string-match &quot;project-a&quot; (buffer-name buffer)) &#39;(&quot;docker&quot; &quot;exec&quot; &quot;project-a-dev&quot; &quot;--&quot;) &#39;(&quot;docker&quot; &quot;exec&quot; &quot;project-b-dev&quot; &quot;--&quot;)))) #+end_src&lt;/p&gt; 
&lt;p&gt;Note that any =:environment-variables= you may have passed to =acp-make-client= will not apply to the agent process running inside the container. It&#39;s expected to inject environment variables by means of your devcontainer configuration / Dockerfile.&lt;/p&gt; 
&lt;p&gt;Next, set an =agent-shell-path-resolver-function= that resolves container paths in the local working directory, and vice versa. Agent shell provides the =agent-shell-devcontainer-resolve-path= function for use with devcontainers specifically: it reads the =workspaceFolder= specified in =.devcontainer/devcontainer.json=, or uses the default value of =/workspaces/
 &lt;repository-name&gt;
  = otherwise.
 &lt;/repository-name&gt;&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-path-resolver-function #&#39;agent-shell-devcontainer-resolve-path) #+end_src&lt;/p&gt; 
&lt;p&gt;Note that this allows the agent to access files on your local file-system. While care has been taken to restrict access to files in the local working directory, it&#39;s probably possible for a malicious agent to circumvent this restriction.&lt;/p&gt; 
&lt;p&gt;Optional: to prevent the agent running inside the container to access your local file-system altogether and to have it read/modify files inside the container directly, in addition to setting the resolver function, disable the &quot;read/write text file&quot; client capabilities:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq agent-shell-text-file-capabilities nil) #+end_src&lt;/p&gt; 
&lt;p&gt;*** Data storage location&lt;/p&gt; 
&lt;p&gt;By default, agent-shell stores per-project data (transcripts, screenshots, etc.) under a =.agent-shell/= directory in the project root, and automatically adds that directory to =.gitignore= the first time it is created. This is a one-time operation: removing the entry from =.gitignore= will not cause it to be re-added.&lt;/p&gt; 
&lt;p&gt;You can change where this data is stored by setting =agent-shell-dot-subdir-function= to a custom function. The function receives one argument, SUBDIR (e.g. =&quot;screenshots&quot;=), and must return the absolute path to that subdirectory (without creating it).&lt;/p&gt; 
&lt;p&gt;For example, to store data under =user-emacs-directory= instead of the project tree, flattening the project path into a directory name:&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (defun my/agent-shell-dot-subdir (subdir) (let* ((cwd (string-remove-suffix &quot;/&quot; (agent-shell-cwd))) (sanitized (replace-regexp-in-string &quot;/&quot; &quot;-&quot; (string-remove-prefix &quot;/&quot; cwd)))) (expand-file-name subdir (locate-user-emacs-file (concat &quot;agent-shell/&quot; sanitized)))))&lt;/p&gt; 
&lt;p&gt;(setopt agent-shell-dot-subdir-function #&#39;my/agent-shell-dot-subdir) #+end_src&lt;/p&gt; 
&lt;p&gt;This stores data at a path like =~/.emacs.d/agent-shell/home-user-src-myproject/screenshots/=.&lt;/p&gt; 
&lt;p&gt;*** Screenshots from clipboard&lt;/p&gt; 
&lt;p&gt;You can send a screenshot from your clipboard to your shell with =agent-shell-send-clipboard-image=. Call with =C-u= to =agent-shell-send-clipboard-image-to= to select from your shells. agent-shell relies on external programs to write an image from clipboard to file as configured in =agent-shell-clipboard-image-handlers=. Preconfigured handlers are&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;=wl-paste= for Wayland desktops,&lt;/li&gt; 
 &lt;li&gt;=xclip= for Xorg,&lt;/li&gt; 
 &lt;li&gt;=pngpaste= for MacOS.&lt;/li&gt; 
 &lt;li&gt;=powershell= for Windows.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;*** Inhibiting minor modes during file writes&lt;/p&gt; 
&lt;p&gt;Some minor modes (for example, =aggressive-indent-mode=) can interfere with an agent&#39;s edits. Agent Shell can temporarily disable selected per-buffer minor modes while applying edits.&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setopt agent-shell-write-inhibit-minor-modes &#39;(aggressive-indent-mode)) #+end_src&lt;/p&gt; 
&lt;p&gt;All of the above settings can be applied on a per-project basis using [[&lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html&quot;&gt;https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html&lt;/a&gt;][directory-local variables]].&lt;/p&gt; 
&lt;p&gt;** Key bindings&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;=RET= - Submits prompt.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;=M-J= - Iserts newline.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;=C-c C-c= - Interrupt current agent operation&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;=TAB and Shift-TAB= - Navigate interactive elements&lt;/p&gt; &lt;p&gt;To customize =RET= binding behaviour, you can use something like:&lt;/p&gt; &lt;p&gt;#+begin_src emacs-lisp :lexical no (use-package agent-shell :bind (:map agent-shell-mode-map (&quot;RET&quot; . newline) (&quot;M-RET&quot; . shell-maker-submit))) #+end_src&lt;/p&gt; &lt;p&gt;Or if you prefer C-c C-c to send and C-c C-k to interrupt, use the following:&lt;/p&gt; &lt;p&gt;#+begin_src emacs-lisp :lexical no (use-package agent-shell :bind (:map agent-shell-mode-map (&quot;RET&quot; . newline) (&quot;C-c C-c&quot; . shell-maker-submit) (&quot;C-c C-k&quot; . agent-shell-interrupt))) #+end_src&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;*** Evil Evil users may want to rebind ~RET~ for inserting a new line in =insert mode= and sending the prompt in =normal mode=.&lt;/p&gt; 
&lt;p&gt;Also, when viewing diffs (before accepting changes) it may be annoying having to enter =insert mode= to send keys (~y/n/p/q/etc~). If this is your case, you can make these buffers start in Emacs mode (you can always go to Evil modes if you need to with ~C-z~). #+begin_src emacs-lisp (use-package agent-shell :config ;; Evil state-specific RET behavior: insert mode = newline, normal mode = send (evil-define-key &#39;insert agent-shell-mode-map (kbd &quot;RET&quot;) #&#39;newline) (evil-define-key &#39;normal agent-shell-mode-map (kbd &quot;RET&quot;) #&#39;comint-send-input)&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;;; Configure *agent-shell-diff* buffers to start in Emacs state
(add-hook &#39;diff-mode-hook
    (lambda ()
      (when (string-match-p &quot;\\*agent-shell-diff\\*&quot; (buffer-name))
	(evil-emacs-state)))))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;#+end_src&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Customizations&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;#+BEGIN_SRC emacs-lisp :results table :colnames &#39;(&quot;Custom variable&quot; &quot;Description&quot;) :exports results (let ((rows)) (mapatoms (lambda (symbol) (when (and (string-match &quot;^agent-shell&quot; (symbol-name symbol)) (custom-variable-p symbol)) (push `(,symbol ,(car (split-string (or (documentation-property symbol &#39;variable-documentation) (get (indirect-variable symbol) &#39;variable-documentation) (get symbol &#39;variable-documentation) &quot;&quot;) &quot;\n&quot;))) rows)))) (sort rows (lambda (a b) (string&amp;lt; (symbol-name (car a)) (symbol-name (car b)))))) #+END_SRC&lt;/p&gt; 
&lt;p&gt;#+RESULTS: | Custom variable | Description | |-----------------------------------------------+---------------------------------------------------------------------------------| | agent-shell-agent-configs | The list of known agent configurations. | | agent-shell-anthropic-authentication | Configuration for Anthropic authentication. | | agent-shell-anthropic-claude-acp-command | Command and parameters for the Anthropic Claude client. | | agent-shell-anthropic-claude-command | Command and parameters for the Anthropic Claude client. | | agent-shell-anthropic-claude-environment | Environment variables for the Anthropic Claude client. | | agent-shell-anthropic-default-model-id | Default Anthropic model ID. | | agent-shell-anthropic-default-session-mode-id | Default Anthropic session mode ID. | | agent-shell-auggie-acp-command | Command and parameters for the Auggie client. | | agent-shell-auggie-authentication | Configuration for Auggie authentication. | | agent-shell-auggie-environment | Environment variables for the Auggie client. | | agent-shell-buffer-name-format | Format to use when generating agent shell buffer names. | | agent-shell-busy-indicator-frames | Frames for the busy indicator animation. | | agent-shell-clipboard-image-handlers | Handlers for saving clipboard images to a file. | | agent-shell-completion-mode-hook | Hook run after entering or leaving ‘agent-shell-completion-mode’. | | agent-shell-command-prefix | Command prefix for executing commands in a container. | | agent-shell-context-sources | Sources to consider when determining M-x agent-shell automatic context. | | agent-shell-cursor-acp-command | Command and parameters for the Cursor agent client. | | agent-shell-cursor-environment | Environment variables for the Cursor agent client. | | agent-shell-display-action | Display action for agent shell buffers. | | agent-shell-droid-acp-command | Command and parameters for the Factory Droid ACP client. | | agent-shell-droid-authentication | Configuration for Factory Droid authentication. | | agent-shell-droid-environment | Environment variables for the Factory Droid ACP client. | | agent-shell-embed-file-size-limit | Maximum file size in bytes for embedding with ContentBlock::Resource. | | agent-shell-file-completion-enabled | Non-nil automatically enables file completion when starting shells. | | agent-shell-github-acp-command | Command and parameters for the GitHub Copilot agent client. | | agent-shell-github-default-model-id | Default GitHub Copilot model ID. | | agent-shell-github-default-session-mode-id | Default GitHub Copilot session mode ID. | | agent-shell-github-environment | Environment variables for the GitHub Copilot agent client. | | agent-shell-google-authentication | Configuration for Google authentication. | | agent-shell-google-gemini-acp-command | Command and parameters for the Gemini client. | | agent-shell-google-gemini-environment | Environment variables for the Google Gemini client. | | agent-shell-goose-acp-command | Command and parameters for the Goose client. | | agent-shell-goose-authentication | Configuration for Goose authentication. | | agent-shell-goose-environment | Environment variables for the Goose client. | | agent-shell-header-style | Style for agent shell buffer headers. | | agent-shell-highlight-blocks | Whether or not to highlight source blocks. | | agent-shell-mcp-servers | List of MCP servers to initialize when creating a new session. | | agent-shell-mistral-acp-command | Command and parameters for the Mistral Vibe client. | | agent-shell-mistral-authentication | Configuration for Mistral AI authentication. | | agent-shell-mistral-default-model-id | Default Mistral AI model ID. | | agent-shell-mistral-default-session-mode-id | Default Mistral AI session mode ID. | | agent-shell-mistral-environment | Environment variables for the Mistral Vibe client. | | agent-shell-openai-authentication | Configuration for OpenAI authentication. | | agent-shell-openai-codex-acp-command | Command and parameters for the OpenAI Codex client. | | agent-shell-openai-codex-environment | Environment variables for the OpenAI Codex client. | | agent-shell-openai-default-model-id | Default Codex model ID. | | agent-shell-openai-default-session-mode-id | Default Codex session mode ID. | | agent-shell-opencode-acp-command | Command and parameters for the OpenCode client. | | agent-shell-opencode-authentication | Configuration for OpenCode authentication. | | agent-shell-opencode-default-model-id | Default OpenCode model ID. | | agent-shell-opencode-default-session-mode-id | Default OpenCode session mode ID. | | agent-shell-opencode-environment | Environment variables for the OpenCode client. | | agent-shell-path-resolver-function | Function for resolving remote paths on the local file-system, and vice versa. | | agent-shell-permission-icon | Icon displayed when shell commands require permission to execute. | | agent-shell-pi-acp-command | Command and parameters for the Pi ACP client. | | agent-shell-pi-environment | Environment variables for the Pi client. | | agent-shell-prefer-session-resume | Prefer ACP session resume over session load when both are available. | | agent-shell-prefer-viewport-interaction | Non-nil makes ‘agent-shell’ prefer viewport interaction over shell interaction. | | agent-shell-preferred-agent-config | Default agent to use for all new shells. | | agent-shell-qwen-acp-command | Command and parameters for the Qwen Code client. | | agent-shell-qwen-authentication | Configuration for Qwen Code authentication. | | agent-shell-qwen-environment | Environment variables for the Qwen Code client. | | agent-shell-screenshot-command | The program to use for capturing screenshots. | | agent-shell-section-functions | Abnormal hook run after overlays are applied (experimental). | | agent-shell-session-strategy | How to handle sessions when starting a new shell. | | agent-shell-show-busy-indicator | Non-nil to show the busy indicator animation in the header and mode line. | | agent-shell-show-config-icons | Whether to show icons in agent config selection. | | agent-shell-show-context-usage-indicator | Non-nil to show the context usage indicator in the header and mode line. | | agent-shell-show-usage-at-turn-end | Whether to display usage information when agent turn ends. | | agent-shell-show-welcome-message | Non-nil to show welcome message. | | agent-shell-text-file-capabilities | Whether agents are initialized with read/write text file capabilities. | | agent-shell-thought-process-expand-by-default | Whether thought process sections should be expanded by default. | | agent-shell-thought-process-icon | Icon displayed during the AI’s thought process. | | agent-shell-tool-use-expand-by-default | Whether tool use sections should be expanded by default. | | agent-shell-transcript-file-path-function | Function to generate the full transcript file path. | | agent-shell-ui-mode-hook | Hook run after entering or leaving ‘agent-shell-ui-mode’. | | agent-shell-user-message-expand-by-default | Whether user message sections should be expanded by default. | | agent-shell-write-inhibit-minor-modes | List of minor mode commands to inhibit during ‘fs/write_text_file’ edits. |&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Commands #+BEGIN_SRC emacs-lisp :results table :colnames &#39;(&quot;Binding&quot; &quot;Command&quot; &quot;Description&quot;) :exports results (let ((rows)) (mapatoms (lambda (symbol) (when (and (string-match &quot;^agent-shell&quot; (symbol-name symbol)) (commandp symbol)) (push `(,(string-join (seq-filter (lambda (symbol) (not (string-match &quot;menu&quot; symbol))) (mapcar (lambda (keys) (key-description keys)) (or (where-is-internal (symbol-function symbol) comint-mode-map nil nil (command-remapping &#39;comint-next-input)) (where-is-internal symbol agent-shell-mode-map nil nil (command-remapping symbol)) (where-is-internal (symbol-function symbol) agent-shell-mode-map nil nil (command-remapping symbol))))) &quot; or &quot;) ,(symbol-name symbol) ,(car (split-string (or (documentation symbol t) &quot;&quot;) &quot;\n&quot;))) rows)))) (sort rows (lambda (a b) (string&amp;lt; (cadr a) (cadr b))))) #+END_SRC&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;#+RESULTS: | Binding | Command | Description | |-----------------+---------------------------------------------------------+-------------------------------------------------------------------------------| | | agent-shell | Start or reuse an existing agent shell. | | | agent-shell--display-buffer | Toggle agent SHELL-BUFFER display. | | | agent-shell-anthropic-start-claude-code | Start an interactive Claude Agent shell. | | | agent-shell-auggie-start-agent | Start an interactive Auggie agent shell. | | | agent-shell-clear-buffer | Clear the current shell buffer. | | | agent-shell-completion-mode | Toggle agent shell completion with @ or / prefix. | | | agent-shell-cursor-start-agent | Start an interactive Cursor agent shell. | | C-
 &lt;tab&gt;
   | agent-shell-cycle-session-mode | Cycle through available session modes for the current 
  &lt;code&gt;agent-shell&#39; session. | | | agent-shell-delete-interaction-at-point | Delete interaction (request and response) at point. | | | agent-shell-droid-start-agent | Start an interactive Factory Droid agent shell. | | | agent-shell-fakes-load-session | Load and replay a traffic session from file. | | | agent-shell-github-start-copilot | Start an interactive GitHub Copilot agent shell. | | | agent-shell-google-start-gemini | Start an interactive Gemini CLI agent shell. | | | agent-shell-goose-start-agent | Start an interactive Goose agent shell. | | | agent-shell-help-menu | Transient menu for &lt;/code&gt;agent-shell&#39; commands. | | | agent-shell-insert-file | Insert a file into 
  &lt;code&gt;agent-shell&#39;. | | | agent-shell-insert-shell-command-output | Execute a shell command and insert output as a code block. | | C-c C-c | agent-shell-interrupt | Interrupt in-progress request and reject all pending permissions. | | | agent-shell-jump-to-latest-permission-button-row | Jump to the latest permission button row. | | | agent-shell-mistral-start-vibe | Start an interactive Mistral Vibe agent shell. | | | agent-shell-mode | Major mode for agent shell. | | | agent-shell-new-shell | Start a new agent shell. | | S-&amp;lt;return&amp;gt; | agent-shell-newline | Insert a newline, and move to left margin of the new line. | | C-&amp;lt;down&amp;gt; or M-n | agent-shell-next-input | Cycle forwards through input history. | | n or TAB | agent-shell-next-item | Go to next item. | | | agent-shell-next-permission-button | Jump to the next button. | | | agent-shell-open-transcript | Open the transcript file for the current &lt;/code&gt;agent-shell&#39; buffer. | | | agent-shell-openai-start-codex | Start an interactive Codex agent shell. | | | agent-shell-opencode-start-agent | Start an interactive OpenCode agent shell. | | C-c C-o | agent-shell-other-buffer | Switch to other associated buffer (viewport vs shell). | | C-
  &lt;up&gt;
    or M-p | agent-shell-previous-input | Cycle backwards through input history, saving input. | | p or 
   &lt;backtab&gt;
     | agent-shell-previous-item | Go to previous item. | | | agent-shell-previous-permission-button | Jump to the previous button. | | | agent-shell-prompt-compose | Compose an 
    &lt;code&gt;agent-shell&#39; prompt in a dedicated buffer. | | | agent-shell-queue-request | Queue or immediately send a request depending on shell busy state. | | | agent-shell-qwen-start | Start an interactive Qwen Code CLI agent shell. | | | agent-shell-remove-pending-request | Remove all pending requests or a specific request by REMOVE-INDEX. | | C-x x r | agent-shell-rename-buffer | Rename current shell buffer. | | | agent-shell-reset-logs | Reset all log buffers. | | | agent-shell-resume-pending-requests | Resume processing pending requests in the queue. | | | agent-shell-run-all-tests | Run all agent-shell tests in batch mode. | | M-r | agent-shell-search-history | Search previous input history. | | | agent-shell-send-current-file | Insert a file into &lt;/code&gt;agent-shell&#39;. | | | agent-shell-send-dwim | Send region or error at point to last accessed shell buffer in project. | | | agent-shell-send-file | Insert a file into 
    &lt;code&gt;agent-shell&#39;. | | | agent-shell-send-other-file | Prompt to send a file into &lt;/code&gt;agent-shell&#39;. | | | agent-shell-send-region | Send region to last accessed shell buffer in project. | | | agent-shell-send-screenshot | Capture a screenshot and insert it into 
    &lt;code&gt;agent-shell&#39;. | | C-c RET | agent-shell-set-session-mode | Set session mode (if any available). | | C-c C-v | agent-shell-set-session-model | Set session model. | | RET | agent-shell-submit | Submit current input. | | | agent-shell-toggle | Toggle agent shell display. | | | agent-shell-toggle-logging | Toggle logging. | | | agent-shell-ui-backward-block | Jump to the previous block. | | | agent-shell-ui-forward-block | Jump to the next block. | | | agent-shell-ui-mode | Minor mode for SUI block navigation. | | | agent-shell-ui-toggle-fragment-at-point | Toggle visibility of fragment body at point. | | | agent-shell-version | Show &lt;/code&gt;agent-shell&#39; mode version. | | | agent-shell-view-acp-logs | View agent shell ACP logs buffer. | | | agent-shell-view-traffic | View agent shell traffic buffer. | | | agent-shell-viewport-compose-cancel | Cancel prompt composition. | | | agent-shell-viewport-compose-send | Send the viewport composed prompt to the agent shell. | | | agent-shell-viewport-compose-send-and-kill | Send the viewport composed prompt to the agent shell and kill compose buffer. | | | agent-shell-viewport-compose-send-and-wait-for-response | Send the viewport composed prompt and display response in viewport. | | | agent-shell-viewport-cycle-session-mode | Cycle through available session modes. | | | agent-shell-viewport-edit-mode | Major mode for composing agent shell prompts. | | | agent-shell-viewport-interrupt | Interrupt active agent shell request. | | | agent-shell-viewport-next-item | Go to next item. | | | agent-shell-viewport-next-page | Show next interaction (request / response). | | | agent-shell-viewport-previous-item | Go to previous item. | | | agent-shell-viewport-previous-page | Show previous interaction (request / response). | | | agent-shell-viewport-refresh | Refresh viewport buffer content with current item from shell. | | | agent-shell-viewport-reply | Reply as a follow-up and compose another prompt/query. | | | agent-shell-viewport-set-session-mode | Set session mode. | | | agent-shell-viewport-set-session-model | Set session model. | | | agent-shell-viewport-view-last | Display the last request/response interaction. | | | agent-shell-viewport-view-mode | Major mode for viewing agent shell prompts (read-only). |
   &lt;/backtab&gt;
  &lt;/up&gt;
 &lt;/tab&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Filing issues When filing an issue, please keep the checkboxes from the [[&lt;a href=&quot;https://github.com/xenodium/agent-shell/raw/main/.github/ISSUE_TEMPLATE/issue.md&quot;&gt;https://github.com/xenodium/agent-shell/blob/main/.github/ISSUE_TEMPLATE/issue.md&lt;/a&gt;][issue template]] and check them off as applicable. They help ensure I have enough information to help.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Please read through this section before filing issues or feature requests. I won&#39;t be able to help unless I have enough information to help. This section shows how to get the details I need.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;em&gt;Versions&lt;/em&gt;: What version of =agent-shell=, =acp.el=, the ACP package (e.g. =claude-code-acp=), and the agent CLI (e.g. =claude=, =gemini=) are you running?&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Steps to reproduce&lt;/em&gt;: What exact steps lead to the issue? Be specific about what you did and in what order.&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;ACP traffic&lt;/em&gt;: See [[&lt;a href=&quot;https://github.com/xenodium/agent-shell?tab=readme-ov-file#how-do-i-viewget-agent-client-protocol-traffic&quot;&gt;https://github.com/xenodium/agent-shell?tab=readme-ov-file#how-do-i-viewget-agent-client-protocol-traffic&lt;/a&gt;][how to get ACP traffic]] above. This is the most useful piece of information for diagnosing issues.&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Screenshots&lt;/em&gt;: A screenshot helps correlate what you see with the protocol data.&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Your agent-shell config&lt;/em&gt;: Share any relevant =agent-shell= variable settings from your Emacs config.&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Profiling data&lt;/em&gt; (for performance issues): Use =M-x profiler-start=, reproduce the issue, then =M-x profiler-report= (and =M-x profiler-stop=). Share the report.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li&gt;FAQ&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Why doesn&#39;t =agent-shell= offer all slash commands/skills available in CLI agent?&lt;/p&gt; 
&lt;p&gt;=agent-shell= can only offer the slash commands/skills advertised by the agent via [[&lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;https://agentclientprotocol.com&lt;/a&gt;][Agent Client Protocol]]. To view what&#39;s exposed by your agent, expand the &quot;Available /commands&quot; section. Is the command you&#39;re after missing? Please consider filing a feature-request with the respective agent (ie. Gemini CLI) or their ACP layer (claude-code-acp).&lt;/p&gt; 
&lt;p&gt;[[file:slash-commands.png]]&lt;/p&gt; 
&lt;p&gt;** Can you add support for another agent?&lt;/p&gt; 
&lt;p&gt;Does the agent support ACP ([[&lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;https://agentclientprotocol.com&lt;/a&gt;][Agent Client Protocol]])? If so, =agent-shell= can likely support this agent. Some agents have ACP support built-in (like [[&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;https://github.com/google-gemini/gemini-cli&lt;/a&gt;][gemini-cli]]). Others require a separate ACP package (like [[&lt;a href=&quot;https://github.com/zed-industries/claude-code-acp&quot;&gt;https://github.com/zed-industries/claude-code-acp&lt;/a&gt;][claude-code-acp]] for [[&lt;a href=&quot;https://github.com/anthropics/claude-code&quot;&gt;https://github.com/anthropics/claude-code&lt;/a&gt;][claude-code]]). When filing a feature request to add a new agent, please include a link to the project supporting [[&lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;https://agentclientprotocol.com&lt;/a&gt;][Agent Client Protocol]] (built-in or otherwise).&lt;/p&gt; 
&lt;p&gt;Agents without ACP support are out of scope for integrating with =agent-shell=. Having said that, if you do build an ACP layer like =claude-agent-acp=, then =agent-shell= can work with it.&lt;/p&gt; 
&lt;p&gt;** =agent-shell= not behaving as expected?&lt;/p&gt; 
&lt;p&gt;Could be the agent itself missing an [[&lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;https://agentclientprotocol.com&lt;/a&gt;][Agent Client Protocol]] feature, =agent-shell= missing the feature, or both 😃 So which one is it? It&#39;s hard to tell unless we look at [[&lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;https://agentclientprotocol.com&lt;/a&gt;][Agent Client Protocol]] traffic between the two.&lt;/p&gt; 
&lt;p&gt;** Is shx supported? No. There are reports that [[&lt;a href=&quot;https://github.com/xenodium/agent-shell/issues/543&quot;&gt;https://github.com/xenodium/agent-shell/issues/543&lt;/a&gt;][it does not work]] with agent-shell. ** How do I view/get [[&lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;https://agentclientprotocol.com&lt;/a&gt;][Agent Client Protocol]] traffic?&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;=M-x agent-shell-toggle-logging= (make sure logging is ON).&lt;/li&gt; 
 &lt;li&gt;Reproduce the issue&lt;/li&gt; 
 &lt;li&gt;=M-x agent-shell-view-traffic=&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Browse through traffic and see if you can spot the issue. For example, if you see a request sent by the agent asking for user permission, but =agent-shell= isn&#39;t surfacing this permission, it looks like perhaps =agent-shell= is missing a feature.&lt;/p&gt; 
&lt;p&gt;For example, here&#39;s what a [[&lt;a href=&quot;https://agentclientprotocol.com/protocol/schema#session%2Frequest-permission&quot;&gt;https://agentclientprotocol.com/protocol/schema#session%2Frequest-permission&lt;/a&gt;][session/request_permission]] request would look like from the traffic viewer.&lt;/p&gt; 
&lt;p&gt;[[file:traffic.png]]&lt;/p&gt; 
&lt;p&gt;Sometimes including a traffic screenshot in an issue is enough. Other times including the full traffic is needed. From the traffic viewer, you can =M-x acp-traffic-save-to= to save as =.traffic=.&lt;/p&gt; 
&lt;p&gt;** Where should I file bug or feature request?&lt;/p&gt; 
&lt;p&gt;*** Agent issues or feature requests&lt;/p&gt; 
&lt;p&gt;If you&#39;re able to determine the agent is missing a feature (or a bug is present) in their [[&lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;https://agentclientprotocol.com&lt;/a&gt;][Agent Client Protocol]] implementation, please file an issue directly with the agent folks. For example:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/agentclientprotocol/claude-agent-acp&quot;&gt;https://github.com/agentclientprotocol/claude-agent-acp&lt;/a&gt;][claude-agent-acp]]: For Claude Agent.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/zed-industries/codex-acp&quot;&gt;https://github.com/zed-industries/codex-acp&lt;/a&gt;][codex-acp]]: For Codex.&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;https://github.com/google-gemini/gemini-cli&lt;/a&gt;][Gemini CLI]].&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://block.github.io/goose/docs/getting-started/installation&quot;&gt;https://block.github.io/goose/docs/getting-started/installation&lt;/a&gt;][Goose]].&lt;/li&gt; 
 &lt;li&gt;[[&lt;a href=&quot;https://github.com/QwenLM/qwen-code&quot;&gt;https://github.com/QwenLM/qwen-code&lt;/a&gt;][Qwen Code]].&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;*** =agent-shell= issues or feature requests&lt;/p&gt; 
&lt;p&gt;Alternatively, if you noticed =agent-shell= is missing a feature (or has a bug), please [[&lt;a href=&quot;https://github.com/xenodium/agent-shell/issues&quot;&gt;https://github.com/xenodium/agent-shell/issues&lt;/a&gt;][file an agent-shell issue]].&lt;/p&gt; 
&lt;p&gt;*** Not sure where to file an issue?&lt;/p&gt; 
&lt;p&gt;File [[&lt;a href=&quot;https://github.com/xenodium/agent-shell/issues&quot;&gt;https://github.com/xenodium/agent-shell/issues&lt;/a&gt;][in agent-shell]], but please try to provide details, so I can determine whether =agent-shell= or the agent itself needs work. Traffic data would be very useful here. Provide a screenshot or a .traffic file if you think it&#39;ll help. See [[&lt;a href=&quot;https://github.com/xenodium/agent-shell?tab=readme-ov-file#how-do-i-viewget-agent-client-protocol-traffic&quot;&gt;https://github.com/xenodium/agent-shell?tab=readme-ov-file#how-do-i-viewget-agent-client-protocol-traffic&lt;/a&gt;][how to get ACP traffic]].&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Contributing&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;See [[file:CONTRIBUTING.org][&lt;a href=&quot;http://CONTRIBUTING.org&quot;&gt;CONTRIBUTING.org&lt;/a&gt;]].&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Contributors&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;#+HTML: &lt;a href=&quot;https://github.com/xenodium/agent-shell/graphs/contributors&quot;&gt; #+HTML: &lt;img src=&quot;https://contrib.rocks/image?repo=xenodium/agent-shell&quot; /&gt; #+HTML: &lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Made with [[&lt;a href=&quot;https://contrib.rocks&quot;&gt;https://contrib.rocks&lt;/a&gt;][contrib.rocks]].&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/f57b362937a6d367d7b626d1855bdbc1239bb94a3c932a3701aea6b8e6ce630c/xenodium/agent-shell" medium="image" />
      
    </item>
    
    <item>
      <title>qjcg/awesome-typst</title>
      <link>https://github.com/qjcg/awesome-typst</link>
      <description>&lt;p&gt;Awesome Typst Links&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/README.md&quot; hreflang=&quot;en&quot; lang=&quot;en&quot;&gt;English&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/README_ZH.md&quot; hreflang=&quot;zh&quot; lang=&quot;zh&quot;&gt;简体中文&lt;/a&gt; &lt;/p&gt; 
&lt;h1&gt;Awesome Typst&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/sindresorhus/awesome#readme&quot;&gt;&lt;img src=&quot;https://awesome.re/badge.svg?sanitize=true&quot; alt=&quot;Awesome&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Curated collection of useful links for &lt;a href=&quot;https://github.com/typst/typst&quot;&gt;Typst&lt;/a&gt; users.&lt;/p&gt; 
&lt;p&gt;Contributions are welcome!&lt;/p&gt; 
&lt;!-- markdown-toc start - Don&#39;t edit this section. Run M-x markdown-toc-refresh-toc --&gt; 
&lt;h2&gt;Contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#official-project-links&quot;&gt;Official Project Links&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#typst-community-links&quot;&gt;Typst Community Links&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#integrations--tools&quot;&gt;Integrations &amp;amp; Tools&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#browser-extensions&quot;&gt;Browser Extensions&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#chatbots&quot;&gt;Chatbots&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#cicd&quot;&gt;CI/CD&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#cli-tools&quot;&gt;CLI Tools&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#editors&quot;&gt;Editors&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#editor-integrations&quot;&gt;Editor Integrations&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#online-tools&quot;&gt;Online Tools&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#office&quot;&gt;Office&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#programming&quot;&gt;Programming&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#typst-as-a-service&quot;&gt;Typst As A Service&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#templates--libraries&quot;&gt;Templates &amp;amp; Libraries&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#official&quot;&gt;Official&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#general&quot;&gt;General&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#assignments&quot;&gt;Assignments&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#cv&quot;&gt;CV&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#examples&quot;&gt;Examples&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#templates&quot;&gt;Templates&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#calendar--timetable&quot;&gt;Calendar / Timetable&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#footnotes--endnotes&quot;&gt;Footnotes &amp;amp; Endnotes&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#formatting&quot;&gt;Formatting&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#graphics&quot;&gt;Graphics&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#letters&quot;&gt;Letters&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#linguistics&quot;&gt;Linguistics&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#music&quot;&gt;Music&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#plotting&quot;&gt;Plotting&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#posters&quot;&gt;Posters&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#science-technology-engineering--math-stem&quot;&gt;Science, Technology, Engineering &amp;amp; Math (STEM)&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#chemistry&quot;&gt;Chemistry&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#engineering&quot;&gt;Engineering&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#mathematics&quot;&gt;Mathematics&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#physics&quot;&gt;Physics&lt;/a&gt; 
      &lt;ul&gt; 
       &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#conferences&quot;&gt;Conferences&lt;/a&gt;&lt;/li&gt; 
       &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#journals&quot;&gt;Journals&lt;/a&gt;&lt;/li&gt; 
       &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#grantsproposals&quot;&gt;Grants/Proposals&lt;/a&gt;&lt;/li&gt; 
      &lt;/ul&gt; &lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#scripting&quot;&gt;Scripting&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/qjcg/awesome-typst/main/#slides&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- markdown-toc end --&gt; 
&lt;h2&gt;Official Project Links&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://typst.app&quot;&gt;typst.app&lt;/a&gt; - The Typst web app&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://typst.app/docs&quot;&gt;Typst Documentation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/typst/typst&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://typst.app/blog/&quot;&gt;Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Social - &lt;a href=&quot;https://discord.com/invite/2uDybryKPe&quot;&gt;Discord&lt;/a&gt; &lt;a href=&quot;https://www.instagram.com/typstapp/&quot;&gt;Instagram&lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/company/typst/&quot;&gt;LinkedIn&lt;/a&gt; &lt;a href=&quot;https://mastodon.social/@typst&quot;&gt;Mastodon&lt;/a&gt; &lt;a href=&quot;https://bsky.app/profile/typst.app&quot;&gt;Bluesky&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Typst Community Links&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://matrix.to/#/%23typst:matrix.org&quot;&gt;#typst:matrix.org&lt;/a&gt; - Matrix room for Typst.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://sitandr.github.io/typst-examples-book/book/&quot;&gt;Typst Examples Book&lt;/a&gt; - An online book with Typst snippets, including extended tutorial and useful hacks.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://typst-jp.github.io/docs/&quot;&gt;Typst Japanese Community&lt;/a&gt; - Typst Japanese community docs and resources.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://t.me/typst_ru&quot;&gt;Typst-telegram-russian-chat&lt;/a&gt; - Chat about Typst in Telegram in russian&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/YDX-2147483647/best-of-typst&quot;&gt;best-of-typst&lt;/a&gt; - A ranked list of awesome projects related to Typst.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/typst/&quot;&gt;Typst Reddit Commuity&lt;/a&gt; - An English speaking subreddit about Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/SylvanFranklin/nonsense&quot;&gt;Nonsense&lt;/a&gt; - Funny and visually stunning generator of random fake math papers.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Integrations &amp;amp; Tools&lt;/h2&gt; 
&lt;h3&gt;Browser Extensions&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;(FireFox) &lt;a href=&quot;https://github.com/MordragT/bib_kit&quot;&gt;bib-kit&lt;/a&gt; - Retrieve website information to create citations in the hayagriva format&lt;/li&gt; 
 &lt;li&gt;(FireFox) &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/yank/&quot;&gt;yank&lt;/a&gt; - Yank URL and title of current tab, format to a chosen markup language, and copy to clipboard (supports typst link format)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Chatbots&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/mattfbacon/typst-bot&quot;&gt;typst-bot&lt;/a&gt; - A discord bot to render Typst code&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://t.me/ru_rend_bot&quot;&gt;typst-bot-telegram&lt;/a&gt; - A telegram bot to render Typst code&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/daskol/typst-telegram-bot&quot;&gt;typst-telegram-bot&lt;/a&gt; - A &lt;a href=&quot;https://t.me/TypstBot&quot;&gt;telegram bot&lt;/a&gt; with focus in rendering math expression in Typst.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;CI/CD&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gitlab.com/IvanSanchez/gitlab-ci-typst&quot;&gt;gitlab-ci-typst&lt;/a&gt; - Build Typst documents using GitLab CI pipelines&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/typst-community/setup-typst&quot;&gt;setup-typst&lt;/a&gt; - 📑 Install Typst for use in GitHub Actions&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/lvignoli/typst-action&quot;&gt;typst-action&lt;/a&gt; - Build Typst documents using GitHub actions&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;CLI Tools&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/brendandebeasi/em-dee-pdf&quot;&gt;em-dee-pdf&lt;/a&gt; - Markdown to PDF converter with 18 built-in themes, LaTeX math, syntax highlighting, and table of contents.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/typstyle-rs/typstyle&quot;&gt;typstyle&lt;/a&gt; - Opinionated typst code formatter focusing on aesthetic, convergence and correctness.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ItsEthra/typst-live&quot;&gt;typst-live&lt;/a&gt; - Hot reloading of pdf in web browser&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/lvignoli/typst-pandoc&quot;&gt;typst-pandoc&lt;/a&gt; - Typst custom reader and writer for Pandoc&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/scipenai/tylax&quot;&gt;Tylax&lt;/a&gt; - A bidirectional LaTeX-Typst converter based on AST parsing, with support for TikZ graphics.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/typst-community/utpm&quot;&gt;utpm&lt;/a&gt; - &lt;em&gt;Package manager&lt;/em&gt; for &lt;strong&gt;&lt;a href=&quot;https://github.com/typst/packages#local-packages&quot;&gt;local&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://github.com/typst/packages&quot;&gt;remote&lt;/a&gt;&lt;/strong&gt; Typst packages.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/mkpoli/tyler&quot;&gt;Tyler&lt;/a&gt; - Package compiler for the ease of packaging and publishing Typst libraries and templates.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/textlint/textlint-plugin-typst&quot;&gt;textlint-plugin-typst&lt;/a&gt; - &lt;a href=&quot;https://textlint.org/&quot;&gt;textlint&lt;/a&gt; plugin to lint Typst&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Editors&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/IgKh/katvan&quot;&gt;Katvan&lt;/a&gt; - A bare-bones editor for Typst files, with a bias for Right-to-Left editing.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Bzero/typstwriter&quot;&gt;Typstwriter&lt;/a&gt; - An integrated desktop editor for typst projects.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/soupslurpr/BeauTyXT&quot;&gt;BeauTyXT&lt;/a&gt; - A private, secure, minimalistic Text, Markdown, and Typst editor for Android&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Academic-ID/sapienAI&quot;&gt;AcademicID&lt;/a&gt; - A self-hosted academic-focused AI chatbot and research workspace with a Typst, Markdown, and Text editor.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/SuperMegaFort/TypstEdit&quot;&gt;TypstEdit&lt;/a&gt; - A native MacOS Typst editor&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://typesetter.trowell.net/&quot;&gt;Typesetter&lt;/a&gt; - A minimalist, local-first Typst editor for Linux&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/dailydaniel/typos&quot;&gt;typos&lt;/a&gt; - A Typst-native note-taking system powered by Rust and Tauri with typed metadata, cross-references, backlinks, and knowledge graph visualization.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Editor Integrations&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/SeniorMars/tree-sitter-typst&quot;&gt;SeniorMars/tree-sitter-typst&lt;/a&gt; - A TreeSitter parser for the Typst File Format&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=myriad-dreamin.tinymist&quot;&gt;Tinymist VS Code Extension&lt;/a&gt; - A vscode extension for Tinymist integration&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Myriad-Dreamin/tinymist&quot;&gt;Tinymist&lt;/a&gt; - A language server for typst with integrations for Emacs, Helix, NeoVim, Sublime Text, VsCode/VsCodium, and Zed&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/OrangeX4/vscode-typst-sync&quot;&gt;Typst Sync&lt;/a&gt; - A vscode extension for Typst local packages management and synchronization.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/frozolotl/tree-sitter-typst&quot;&gt;frozolotl/tree-sitter-typst&lt;/a&gt; - A tree-sitter grammar with a focus on correctness.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/herlev/inktyp&quot;&gt;inktyp&lt;/a&gt; - An Inkscape plugin to insert and edit Typst equations&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/fenjalien/obsidian-typst&quot;&gt;obsidian-typst&lt;/a&gt; - Renders typst code blocks in Obsidian into images using Typst through the power of WASM!&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/remimimimimi/org-typst-preview.el&quot;&gt;org-typst-preview&lt;/a&gt; - Typst preview in org-mode&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/arne314/typstar&quot;&gt;typstar&lt;/a&gt; - Neovim plugin providing autosnippets, excalidraw integration and [standalone] Anki flashcard export&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/MrPicklePinosaur/typst-conceal.vim&quot;&gt;typst-conceal.vim&lt;/a&gt; - Vim/Nvim plugin for replacing long typst symbol names with unicode characters&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=surv.typst-math&quot;&gt;typst-math&lt;/a&gt; - A VS Code extension to simplify math writing in Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/OrangeX4/vscode-typst-sympy-calculator&quot;&gt;typst-sympy-calculator&lt;/a&gt; - VS Code extension for Typst math calculating, includes Arithmetic, Calculus, Matrix, Custom Variances and Functions by yourself&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://git.sr.ht/~meow_king/typst-ts-mode&quot;&gt;typst-ts-mode&lt;/a&gt; - Typst tree sitter major mode for Emacs&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/SeniorMars/typst.nvim&quot;&gt;typst.nvim&lt;/a&gt; - WIP. Goals: Treesitter highlighting, snippets, and a smooth integration with neovim&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/kaarmu/typst.vim&quot;&gt;typst.vim&lt;/a&gt; - Vim plugin for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/daskol/typstd&quot;&gt;typstd&lt;/a&gt; - Yet another Typst language server.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/uben0/tree-sitter-typst&quot;&gt;uben0/tree-sitter-typst&lt;/a&gt; - A TreeSitter grammar for the Typst language, used by Helix&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/lentilus/zeta&quot;&gt;zeta&lt;/a&gt; - A language server for Zettelkasten-style note-taking, featuring fast navigation, and a graph view.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Online Tools&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/QuarticCat/detypify&quot;&gt;Detypify&lt;/a&gt; - Typst symbol classifier&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Mapaor/online-typst-editor&quot;&gt;online-typst-editor&lt;/a&gt; - A serverless (client-side) typst editor powered by WebAssembly (&lt;a href=&quot;https://github.com/Myriad-Dreamin/typst.ts&quot;&gt;typst.ts&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/hongjr03/excel-to-typst&quot;&gt;excel-to-typst&lt;/a&gt; - A tool that convert Excel tables to Typst table, can work in uploading .xlsx file or pasting.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Office&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Splines/pptypst&quot;&gt;pptypst&lt;/a&gt; - Bring the power of Typst to PowerPoint&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Programming&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/loqusion/typix&quot;&gt;Typix&lt;/a&gt; - Deterministic Typst compilation with Nix&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jakobjpeters/Typstry.jl&quot;&gt;Typstry.jl&lt;/a&gt; - The Julia to Typst interface&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/lucifer1004/leetcode.typ&quot;&gt;leetcode.typ&lt;/a&gt; - Solving Leetcode problems in Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/daskol/mpl-typst&quot;&gt;mpl-typst&lt;/a&gt; - A Typst backend for Matplotlib.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/tilman151/pypst&quot;&gt;pypst&lt;/a&gt; - Declarative Typst in Python with Pandas data frame support.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/messense/typst-py&quot;&gt;typst-py&lt;/a&gt; - Python binding to typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/actsasflinn/typst-rb&quot;&gt;typst-rb&lt;/a&gt; - Ruby binding to typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Myriad-Dreamin/typst.ts&quot;&gt;typst.ts&lt;/a&gt; - JavaScript binding to typst&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Typst As A Service&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/slashformotion/typst-http-api&quot;&gt;typst-http-api&lt;/a&gt; - An simple docker containing an API to compile typst markup&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/daskol/typst-telegram-bot&quot;&gt;typst-telegram-bot&lt;/a&gt; - A plain and simple HTTP API for rendering math with Typst.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Templates &amp;amp; Libraries&lt;/h2&gt; 
&lt;h3&gt;Official&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/typst/templates&quot;&gt;typst/templates&lt;/a&gt; - The templates that ship with the Typst web app&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;General&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/onefact/datathinking.org-report-template&quot;&gt;Data Thinking Report Template&lt;/a&gt; - a template for artificial intelligence whitepapers with collaborative bibliographies using Zotero&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/mst2k/HSOS-PTP-Typst-Template&quot;&gt;HSOS-PTP-Typst-Template&lt;/a&gt; - A German template for writing papers, overfitted for the Osnabrück University of Applied Scien&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/SkytAsul/INSA-Typst-Template&quot;&gt;INSA Typst Template&lt;/a&gt; - A template for INSA (Institut National des Sciences Appliquées), a french public engineering school.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/LaPreprint/typst&quot;&gt;LaPreprint&lt;/a&gt; - Beautiful preprints for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jneug/typst-mantys&quot;&gt;Mantys&lt;/a&gt; - A template for writing manuals for Typst packages.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/aurghya-0/Project-Report-Typst&quot;&gt;Project-Report-Typst&lt;/a&gt; - A simple template for college or university level project report.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jinhao-huang/SimplePaper&quot;&gt;SimplePaper&lt;/a&gt; - A Chinese template for writing simple paper&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jxpeng98/Typst-Paper-Template&quot;&gt;Typst-Paper-Template&lt;/a&gt; - Typst template for Working Paper&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gitlab.com/waterlubber/aiaa-typst-template&quot;&gt;aiaa-typst-template&lt;/a&gt; - A template for AIAA (American Institute of Aeronautics and Astronautics) papers.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/hzkonor/bubble-template&quot;&gt;bubble-template&lt;/a&gt; - A simple and colorful template for reports&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/vanilla-extracts/typst-association-statuts&quot;&gt;french-association-status&lt;/a&gt; - A Template to write status for french associations.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/RolfBremer/gloss-awe&quot;&gt;gloss-awe&lt;/a&gt; - Automatically Generated Glossary Page (renamed from typst-glossary)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/RolfBremer/in-dexter&quot;&gt;in-dexter&lt;/a&gt; - Automatically Generated Index Page (renamed from typst-index)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/DawnEver/mcm-icm-typst-template&quot;&gt;mcm-icm-typst-template&lt;/a&gt; - A template for Mathematical Contest in Modeling (MCM) and the Interdisciplinary Contest in Modeling(ICM).&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/zagoli/simple-typst-thesis&quot;&gt;simple-typst-thesis&lt;/a&gt; - A template useful for writing simple thesis in Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ls1intum/thesis-template-typst&quot;&gt;thesis-template-typst&lt;/a&gt; - Technical University of Munich thesis Template with cover, titlepage, tables, figures, appendix, etc.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/fredguth/tufte-typst&quot;&gt;tufte-typst&lt;/a&gt; - A Tufte-inspired template for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/nogula/tufte-memo&quot;&gt;tufte-memo&lt;/a&gt; - A memo document template inspired by the design of Edward Tufte&#39;s books.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/lkndl/typst-bioinfo-thesis&quot;&gt;typst-bioinfo-thesis&lt;/a&gt; - Flexible section headers and page numbers; pretty outlines and a &lt;code&gt;wrapfig&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/sajjon/klirr&quot;&gt;klirr&lt;/a&gt; - Zero-maintenance and smart FOSS generating beautiful invoices for services and expenses.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/erictapen/typst-invoice&quot;&gt;typst-invoice&lt;/a&gt; - Generate invoices from TOML files&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/wychwitch/typst-mla9-template&quot;&gt;typst-mla9-template&lt;/a&gt; - An MLA 9th edition template&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/flavio20002/typst-orange-template&quot;&gt;typst-orange-template&lt;/a&gt; - A Typst book template inspired by The Legrand Orange Book&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/kaarmu/splash&quot;&gt;typst-palettes&lt;/a&gt; - A library of color palettes for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/daskol/typst-templates&quot;&gt;typst-templates&lt;/a&gt; - A templates collection for major venues in machine learning and AI.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/eigenein/typst-templates&quot;&gt;typst-templates&lt;/a&gt; - Templates for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/haxibami/haxipst&quot;&gt;typst-templates&lt;/a&gt; - My typst templates&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/yangwenbo99/typst-uwthesis&quot;&gt;typst-uwthesis&lt;/a&gt; - A typst template for writing thesis, featuring a working abbreviation lists.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/qjcg/typstry&quot;&gt;typstry&lt;/a&gt; - A Tapestry of Typst Templates &amp;amp; Examples&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/LLBlumire/writable-gm-screen-inserts&quot;&gt;writable-gm-screen-inserts&lt;/a&gt; - Writable Game Master Screen Insertsces&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Assignments&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/diquah/OpenBoard&quot;&gt;OpenBoard&lt;/a&gt; - Easily build clean assessments in the style of the College Board.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/AntoniosBarotsis/typst-assignment-template&quot;&gt;assignment-template&lt;/a&gt; - A simple assignment template&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/rabuu/sheetstorm&quot;&gt;sheetstorm&lt;/a&gt; - A template for assignment sheets&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/astrale-sharp/typst-assignement-template&quot;&gt;typst-assignment-template&lt;/a&gt; - Yet another simple assignment template&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/gRox167/typst-assignment-template&quot;&gt;typst-assignment-template&lt;/a&gt; - Yet another simple assignment template with a cover and several useful math symbols.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/OriginCode/typst-homework-template&quot;&gt;typst-homework-template&lt;/a&gt; - A simple homework template inspired by the LaTeX homework template by Adam Blank&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/jomaway/typst-teacher-templates&quot;&gt;typst-teacher-template&lt;/a&gt; - A collection of typst templates. Mainly used to create worksheets and exams for my classes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/sylvanfranklin/tinyset&quot;&gt;tinyset&lt;/a&gt; - A lightweight and opinionated problem set package designed with pure math proofs in mind.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;CV&lt;/h3&gt; 
&lt;h4&gt;Examples&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/caffeinatedgaze/bare-bones-cv&quot;&gt;bare-bones-cv&lt;/a&gt; –&amp;nbsp;A single-page minimalistic CV comprising essentials only.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jskherman/imprecv&quot;&gt;cv.typ&lt;/a&gt; - A no-frills curriculum vitae (CV) template for Typst that uses a YAML file for data input in order to version control CV data easily.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/skyzh/chicv&quot;&gt;chicv&lt;/a&gt; - A minimal and fully-customizable CV template.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Templates&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/tzx/NNJR&quot;&gt;NNJR&lt;/a&gt; - A resume template inspired by &lt;code&gt;Jake&#39;s Resume&lt;/code&gt; LaTeX template. Uses Typst and YAML.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/GeorgeHoneywood/alta-typst&quot;&gt;alta-typst&lt;/a&gt; - A simple Typst CV template, inspired by AltaCV by LianTze Lim&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Harkunwar/attractive-typst-resume&quot;&gt;attractive-typst-resume&lt;/a&gt; - A modern looking, attractive CV/Resume template by Harkunwar Kochar&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/gvariable/billryan-typst&quot;&gt;billryan-typst&lt;/a&gt; - A simple and minimalist resume template, inspired by Resume by Billryan.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/yunanwg/brilliant-CV&quot;&gt;brilliant-CV&lt;/a&gt; - Another CV template for your job application, yet powered by Typst and more&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/cu1ch3n/caidan&quot;&gt;caidan&lt;/a&gt; - A clean and minimal food menu template.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jskherman/imprecv&quot;&gt;cv.typ&lt;/a&gt; - A no-frills curriculum vitae (CV) template using Typst and YAML to version control CV data.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/olligobber/friggeri-cv&quot;&gt;friggeri-cv&lt;/a&gt; - A slightly modified version of the Friggeri CV, originally created by Adrien Friggeri in LaTeX, ported to Typst.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/peterpf/modern-typst-resume&quot;&gt;modern-cv&lt;/a&gt; - A modern resume and coverletter template based on &lt;code&gt;Awesome CV&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/peterpf/modern-typst-resume&quot;&gt;modern-typst-template&lt;/a&gt; - A modern resume/CV template.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/giovanniberti/moderncv.typst&quot;&gt;moderncv.typst&lt;/a&gt; - A CV template inspired by LaTeX&#39;s &lt;code&gt;moderncv&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/wusyong/resume.typ&quot;&gt;resume.typ&lt;/a&gt; - Simple and ergonomic template to generate resume and CV&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/DawnEver/typst-academic-cv&quot;&gt;typst-academic-cv&lt;/a&gt; - Typst Template for Academic CV&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/cammellos/typst-blue-header-cv&quot;&gt;typst-blue-header-cv&lt;/a&gt; - Customizable Typst two-columns CV template with a top header.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ice-kylin/typst-cv-miku&quot;&gt;typst-cv-miku&lt;/a&gt; - A simple, elegant, academic style CV template for typst. Support for English and Chinese (and more)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jxpeng98/Typst-CV-Resume&quot;&gt;typst-cv-resume&lt;/a&gt; - A CV template with Sans font inspired by LaTeX &lt;code&gt;Deedy-Resume&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/vaibhavjhawar/typst-cv-template1&quot;&gt;typst-cv-template1&lt;/a&gt; - A CV template inspired by Alessandro Plasmati&#39;s Graduate CV LaTex template&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/JCGoran/typst-cv-template&quot;&gt;typst-cv-template&lt;/a&gt; - A CV template inspired by LaTeX&#39;s &lt;code&gt;Awesome CV&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/skyzh/chicv&quot;&gt;typst-cv-template&lt;/a&gt; - Chi CV Template (For Typst)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/titaneric/typst-mixed-resume&quot;&gt;typst-mixed-resume&lt;/a&gt; - A casual and elegant resume template inspired by multiple templates.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/UntimelyCreation/typst-neat-cv&quot;&gt;typst-neat-cv&lt;/a&gt; - A Typst template for modern, minimal and elegant CVs, inspired by mintyfrankie&#39;s &lt;code&gt;Brilliant CV&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/mizlan/typst-resume-sans&quot;&gt;typst-resume-sans&lt;/a&gt; - A sleek and unadorned sans-serif resume template.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/bamboovir/typst-resume-template&quot;&gt;typst-resume-template&lt;/a&gt; - Aesthetic style inspired by the Awesome-CV project&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/hexWars/resume&quot;&gt;typst-resume-template&lt;/a&gt; - A pretty resume template designed using typst.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/tomowang/typst-twentysecondcv&quot;&gt;typst-twentysecondcv&lt;/a&gt; - A CV template inspired by LaTeX&#39;s &lt;code&gt;Twenty Seconds Resume/CV&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/daxartio/cv&quot;&gt;typst-yaml-cv&lt;/a&gt; - A simple cv template designed using typst and yaml.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/elegaanz/vercanard&quot;&gt;vercanard&lt;/a&gt; - A colorful resume template for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/madhank93/typst-resume-template&quot;&gt;typst-resume-template&lt;/a&gt; - Modern, minimalist resume design with Typst&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Calendar / Timetable&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ludwig-austermann/typst-timetable&quot;&gt;typst-timetable&lt;/a&gt; - A template for timetables&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/extua/october&quot;&gt;october&lt;/a&gt; - A simple printable month calendar&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Footnotes &amp;amp; Endnotes&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/tudborg/notes.typ&quot;&gt;notes.typ&lt;/a&gt; - A library for notes with deduplication and customizability.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Formatting&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/fenjalien/metro&quot;&gt;metro&lt;/a&gt; - A typst package to add typsetting to units!&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/uwni/ruby-typ&quot;&gt;ruby-typ&lt;/a&gt; - A library to add ruby text&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Pablo-Gonzalez-Calderon/showybox-package&quot;&gt;showybox&lt;/a&gt; - A Typst package for creating colorful and customizable boxes.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/asibahi/simple-poem-typst&quot;&gt;simple-poem-typst&lt;/a&gt; - An application of the &lt;code&gt;measure&lt;/code&gt; function to set Arabic poetry.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/RubixDev/syntastica-typst/&quot;&gt;syntastica-typst&lt;/a&gt; - Tree-sitter syntax highlighting for code blocks.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/qo/term&quot;&gt;term&lt;/a&gt; - A Typst package for creating figures that emulate terminal screenshots.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/8LWXpg/typst-ansi-render&quot;&gt;typst-ansi_render&lt;/a&gt; - A library to render text with ANSI escape sequences&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/lkoehl/typst-boxes&quot;&gt;typst-boxes&lt;/a&gt; - A library to draw colorful boxes.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jneug/typst-codelst&quot;&gt;typst-codelst&lt;/a&gt; - A Typst package to render source code.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/PgBiel/typst-diagbox&quot;&gt;typst-diagbox&lt;/a&gt; - A library for diagonal line dividers in Typst tables&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jomaway/typst-gentle-clues&quot;&gt;typst-gentle-clues&lt;/a&gt; - A typst package to simply add admonitions.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/OrangeX4/typst-tablem&quot;&gt;typst-tablem&lt;/a&gt; - Write markdown-like tables easily.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/PgBiel/typst-tablex&quot;&gt;typst-tablex&lt;/a&gt; - More powerful and customizable tables in Typst!&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Graphics&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/cetz-package/cetz&quot;&gt;CeTZ&lt;/a&gt; - CeTZ (CeTZ, ein Typst Zeichenpacket) is a library for drawing with &lt;a href=&quot;https://typst.app&quot;&gt;Typst&lt;/a&gt; with an API inspired by TikZ and &lt;a href=&quot;https://processing.org/&quot;&gt;Processing&lt;/a&gt;. It comes with modules for drawing plots, graphs and charts.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/SeniorMars/typst-raytracer&quot;&gt;typst-raytracer&lt;/a&gt; - raytracer in typst&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Letters&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Sematre/typst-letter-pro&quot;&gt;typst-letter-pro&lt;/a&gt; - DIN 5008 letter template for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/dvdvgt/typst-letter&quot;&gt;typst-letter&lt;/a&gt; - A typst letter template inspired by the DIN 5008 norm&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/pascal-huber/typst-letter-template&quot;&gt;typst-letter-template&lt;/a&gt; - A customizable typst letter template with different presets (DIN 5008, Swiss C5)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Linguistics&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/retroflexivity/typst-eggs&quot;&gt;eggs&lt;/a&gt; - Linguistics examples and glosses with minimalist syntax&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gitea.everydayimshuflin.com/greg/typst-lepizig-glossing&quot;&gt;leipzig-gloss&lt;/a&gt; - A library that provides primitives for creating glossing rules according to Leipzig.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/imatpot/typst-ascii-ipa&quot;&gt;typst-ipa&lt;/a&gt; - 🔄 ASCII / IPA conversion for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/typst/packages/tree/main/packages/preview/tyipa/0.1.0&quot;&gt;tyipa&lt;/a&gt; - Write phonetic transcriptions using the IPA, in a &lt;em&gt;typsty&lt;/em&gt; style.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://kianting.info/wiki/w/Tan_Kian-ting%E7%9A%84%E7%B6%AD%E5%9F%BA:Typst-dictionary-template&quot;&gt;typst-dictionary-template&lt;/a&gt; - 📕 a template for lexical dictionary/glossary in Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/pearcebasmanm/arborly&quot;&gt;arborly&lt;/a&gt; - A library for producing beautiful syntax tree graphs&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/lynn/typst-syntree&quot;&gt;typst-syntree&lt;/a&gt; - Syntax trees for typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/thatfloflo/typst-linphon&quot;&gt;linphon&lt;/a&gt; - Set phonological feature matrices, linear rewrite rules, and more&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Music&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/sitandr/conchord&quot;&gt;conchord&lt;/a&gt; - Typst package to easily write lyrics with chords and generate colorful fretboard diagrams&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ljgago/typst-chords&quot;&gt;typst-chords&lt;/a&gt; - A library to write song lyrics with chord diagrams in Typst&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Plotting&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gitlab.com/giacomogallina/commute&quot;&gt;typst-cd&lt;/a&gt; - Proof of Concept for tikz-like commutative diagrams&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/johannes-wolf/typst-plot&quot;&gt;typst-plot&lt;/a&gt; - A library for plotting line charts (deprecated in favor of CeTZ)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Chayraaa/typst-plotting&quot;&gt;typst-plotting&lt;/a&gt; - A library for drawing a variety of charts and plots like line charts, histograms, and pie charts&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Posters&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/pncnmnp/typst-poster&quot;&gt;typst-poster&lt;/a&gt; - An academic poster template&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jonaspleyer/peace-of-posters&quot;&gt;peace-of-posters&lt;/a&gt; - A package for creating academic posters in block style&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Science, Technology, Engineering &amp;amp; Math (STEM)&lt;/h3&gt; 
&lt;h4&gt;Chemistry&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Typsium/alchemist&quot;&gt;alchemist&lt;/a&gt; - Render skeletal formulas in a human-readable format using cetz.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Typsium/typsium&quot;&gt;typsium&lt;/a&gt; - Typeset chemical formulas and reactions.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Engineering&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/fenjalien/cirCeTZ&quot;&gt;circuitypst&lt;/a&gt; - A library for drawing electronic circuit schematics&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jomaway/typst-bytefield&quot;&gt;typst-bytefield&lt;/a&gt; - A library for drawing (network) protocol headers&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oldrev/tids&quot;&gt;tids&lt;/a&gt; - A TI-style datasheet template for electronic component&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Mathematics&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gitlab.com/giacomogallina/commute&quot;&gt;commute&lt;/a&gt; - A library for creating commutative diagrams&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/platformer/typst-algorithms&quot;&gt;typst-algorithms&lt;/a&gt; - A library for writing algorithms&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/EvanLuo42/typst-himcm-template&quot;&gt;typst-himcm-template&lt;/a&gt; - An HiMCM template for Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/matthiasGmayer/typst-math-template&quot;&gt;typst-math-template&lt;/a&gt; - A simple math template that allows for numbered, referenceable theorems and compilation of subfiles that use references.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/maxwell-thum/typst-pf3&quot;&gt;typst-pf3&lt;/a&gt; - A small package for creating &quot;structured proofs.&quot; Essentially a port of Leslie Lamport&#39;s &lt;a href=&quot;https://web.archive.org/web/20240419130400/https://lamport.azurewebsites.net/latex/pf2.sty&quot;&gt;&lt;code&gt;pf2.sty&lt;/code&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/sahasatvik/typst-theorems&quot;&gt;typst-theorems&lt;/a&gt; - A library for creating numbered theorem environments&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/johanvx/typst-undergradmath&quot;&gt;typst-undergradmath&lt;/a&gt; - A Typst port of &lt;a href=&quot;https://gitlab.com/jim.hefferon/undergradmath&quot;&gt;undergradmath&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Physics&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Leedehai/typst-physics&quot;&gt;physica&lt;/a&gt; - A library for usual physics notations, e.g. vectors and vector fields, matrices, differentials, derivatives, Dirac brackets, tensors, isotopes, and digital signal sequences.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Conferences&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/isaacew/aiaa-typst&quot;&gt;aiaa-typst&lt;/a&gt; - A template for creating conference papers in the style of the American Institute of Aeronautics and Astronautics.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://typst.app/universe/package/cogsci-conference&quot;&gt;cogsci-conference&lt;/a&gt; - Official template for the Cognitive Science Society (CogSci) Conference Proceedings.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/DawnEver/ieee-conference-typst-template&quot;&gt;ieee-conference-typst-template&lt;/a&gt; A template to write IEEE Conference in Typst.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/bsp0109/ieee-typst-template&quot;&gt;ieee-typst-template&lt;/a&gt; - A template to write IEEE Papers in Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/avonmoll/ifacconf-typst&quot;&gt;ifacconf-typst&lt;/a&gt; - A template for creating conference papers in the style of the International Federation of Automatic Control&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Journals&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/p4perf4ce/typst-ieee-trans-template&quot;&gt;ieee-trans-typst&lt;/a&gt; - A template that mimic LaTeX IEEE Transaction template (&lt;code&gt;ieee-trans.cls&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Grants/Proposals&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ntjess/typst-nsf-templates&quot;&gt;typst-nsf-templates&lt;/a&gt; - National Science Foundation (NSF) general template and outlines for popular proposal types.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Scripting&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/PgBiel/typst-oxifmt&quot;&gt;typst-oxifmt&lt;/a&gt; - Convenient Rust-like string formatting in Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/jneug/typst-tools4typst&quot;&gt;typst-tools4typst&lt;/a&gt; - Tools for package and template authors.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Slides&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/lvignoli/diapo&quot;&gt;diapo&lt;/a&gt; - A minimal and simplistic presentation template.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/polylux-typ/polylux&quot;&gt;polylux&lt;/a&gt; - Create presentation slides in Typst&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/marcothms/clean-polylux-typst&quot;&gt;clean-polylux-typst&lt;/a&gt; - A clean and dynamic polylux presentation slide template&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/OrangeX4/typst-pinit&quot;&gt;pinit&lt;/a&gt; - Pin things as you like, especially useful for creating slides in typst.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/touying-typ/touying&quot;&gt;touying&lt;/a&gt; - A powerful package for creating presentation slides in Typst&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/f860140a2a4aa8722f58ebc976f07179a60f79cd27a00ce83252c57a386a13ee/qjcg/awesome-typst" medium="image" />
      
    </item>
    
    <item>
      <title>tumashu/posframe</title>
      <link>https://github.com/tumashu/posframe</link>
      <description>&lt;p&gt;Pop a posframe (just a child-frame) at point, posframe is a **GNU ELPA** package!&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Created 2021-06-01 Tue 10:41&lt;/h1&gt; 
&lt;p&gt;#+TITLE: Pop a posframe (just a frame) at point #+AUTHOR: Feng Shu&lt;/p&gt; 
&lt;p&gt;#+html: &lt;a href=&quot;http://elpa.gnu.org/packages/posframe.html&quot;&gt;&lt;img alt=&quot;GNU ELPA&quot; src=&quot;https://elpa.gnu.org/packages/posframe.svg?sanitize=true&quot; /&gt;&lt;/a&gt; #+html: &lt;a href=&quot;http://elpa.gnu.org/devel/posframe.html&quot;&gt;&lt;img alt=&quot;GNU-devel ELPA&quot; src=&quot;https://elpa.gnu.org/devel/posframe.svg?sanitize=true&quot; /&gt;&lt;/a&gt; #+html: &lt;a href=&quot;https://melpa.org/#/posframe&quot;&gt;&lt;img alt=&quot;MELPA&quot; src=&quot;https://melpa.org/packages/posframe-badge.svg?sanitize=true&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What is posframe? Posframe can pop up a frame at point, this &lt;em&gt;posframe&lt;/em&gt; is a child-frame connected to its root window&#39;s buffer.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The main advantages are:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;It is fast enough for daily usage 😃&lt;/li&gt; 
 &lt;li&gt;It works well with CJK languages.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;NOTE:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;For MacOS users, posframe needs Emacs version &amp;gt;= 26.0.91&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;GNOME users with GTK3 builds need Emacs 27 or later. See variable `posframe-gtk-resize-child-frames&#39; which auto-detects this configuration.&lt;/p&gt; &lt;p&gt;More details:&lt;/p&gt; 
  &lt;ol&gt; 
   &lt;li&gt;[[&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/?h=emacs-27&amp;amp;id=c49d379f17bcb0ce82604def2eaa04bda00bd5ec&quot;&gt;https://git.savannah.gnu.org/cgit/emacs.git/commit/?h=emacs-27&amp;amp;id=c49d379f17bcb0ce82604def2eaa04bda00bd5ec&lt;/a&gt;][Fix some problems with moving and resizing child frames]]&lt;/li&gt; 
   &lt;li&gt;[[&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2020-01/msg00343.html&quot;&gt;https://lists.gnu.org/archive/html/emacs-devel/2020-01/msg00343.html&lt;/a&gt;][Emacs&#39;s set-frame-size can not work well with gnome-shell?]]&lt;/li&gt; 
  &lt;/ol&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;[[file:./snapshots/posframe-1.png]]&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Installation&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;#+begin_example (require &#39;posframe) #+end_example&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Usage&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;** Create a posframe&lt;/p&gt; 
&lt;p&gt;*** Simple way #+begin_example (when (posframe-workable-p) (posframe-show &quot; &lt;em&gt;my-posframe-buffer&lt;/em&gt;&quot; :string &quot;This is a test&quot; :position (point))) #+end_example&lt;/p&gt; 
&lt;p&gt;*** Advanced way #+begin_example (defvar my-posframe-buffer &quot; &lt;em&gt;my-posframe-buffer&lt;/em&gt;&quot;)&lt;/p&gt; 
&lt;p&gt;(with-current-buffer (get-buffer-create my-posframe-buffer) (erase-buffer) (insert &quot;Hello world&quot;))&lt;/p&gt; 
&lt;p&gt;(when (posframe-workable-p) (posframe-show my-posframe-buffer :position (point))) #+end_example&lt;/p&gt; 
&lt;p&gt;*** Arguments&lt;/p&gt; 
&lt;p&gt;#+begin_example C-h f posframe-show #+end_example&lt;/p&gt; 
&lt;p&gt;** Hide a posframe #+begin_example (posframe-hide &quot; &lt;em&gt;my-posframe-buffer&lt;/em&gt;&quot;) #+end_example&lt;/p&gt; 
&lt;p&gt;** Hide all posframes #+begin_example M-x posframe-hide-all #+end_example&lt;/p&gt; 
&lt;p&gt;** Delete a posframe&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Delete posframe and its buffer #+begin_example (posframe-delete &quot; &lt;em&gt;my-posframe-buffer&lt;/em&gt;&quot;) #+end_example&lt;/li&gt; 
 &lt;li&gt;Only delete the frame #+begin_example (posframe-delete-frame &quot; &lt;em&gt;my-posframe-buffer&lt;/em&gt;&quot;) #+end_example ** Delete all posframes #+begin_example M-x posframe-delete-all #+end_example&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Note: this command will delete all posframe buffers. You probably shouldn&#39;t use it if you are sharing a buffer between posframe and other packages.&lt;/p&gt; 
&lt;p&gt;** posframe-arghandler&lt;/p&gt; 
&lt;p&gt;posframe-arghandler feature has been removed from posframe-1.1, user can use advice feature instead.&lt;/p&gt; 
&lt;p&gt;** Mouse banish Default setting will work well in most case, but for EXWM user, suggest use the below config.&lt;/p&gt; 
&lt;p&gt;#+begin_src emacs-lisp (setq posframe-mouse-banish-function #&#39;posframe-mouse-banish-simple) #+end_src&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/06a3a590dda0904ccf86c508f7b0021f383d7bca6f3feaf38758fa5af442c95d/tumashu/posframe" medium="image" />
      
    </item>
    
    <item>
      <title>dominikh/go-mode.el</title>
      <link>https://github.com/dominikh/go-mode.el</link>
      <description>&lt;p&gt;Emacs mode for the Go programming language&lt;/p&gt;&lt;hr&gt;&lt;p&gt;This is go-mode, the Emacs mode for editing Go code.&lt;/p&gt; 
&lt;p&gt;It is a complete rewrite of the go-mode that shipped with Go 1.0.3 and before, and was part of Go 1.1 until Go 1.3. Beginning with Go 1.4, editor integration will not be part of the Go distribution anymore, making this repository the canonical place for go-mode.&lt;/p&gt; 
&lt;h1&gt;Features&lt;/h1&gt; 
&lt;p&gt;In addition to normal features, such as fontification and indentation, and close integration with familiar Emacs functionality (for example syntax-based navigation like &lt;code&gt;beginning-of-defun&lt;/code&gt;), go-mode comes with the following extra features to provide an improved experience:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;Integration with &lt;code&gt;gofmt&lt;/code&gt; by providing a command of the same name, and &lt;code&gt;gofmt-before-save&lt;/code&gt;, which can be used in a hook to format Go buffers before saving them.&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Setting the &lt;code&gt;gofmt-command&lt;/code&gt; variable also allows using &lt;code&gt;goimports&lt;/code&gt;.&lt;/li&gt; 
   &lt;li&gt;Setting the &lt;code&gt;gofmt-args&lt;/code&gt; variable with a list of arguments allows using e.g. &lt;code&gt;gofmt -s&lt;/code&gt;.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Integration with &lt;code&gt;godoc&lt;/code&gt; via the functions &lt;code&gt;godoc&lt;/code&gt; and &lt;code&gt;godoc-at-point&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Integration with the Playground&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;go-play-buffer&lt;/code&gt; and &lt;code&gt;go-play-region&lt;/code&gt; to send code to the Playground&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;go-download-play&lt;/code&gt; to download a Playground entry into a new buffer&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Managing imports&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;A function for jumping to the file&#39;s imports (&lt;code&gt;go-goto-imports&lt;/code&gt; - &lt;code&gt;C-c C-f i&lt;/code&gt;)&lt;/li&gt; 
   &lt;li&gt;A function for adding imports, including tab completion (&lt;code&gt;go-import-add&lt;/code&gt;, bound to &lt;code&gt;C-c C-a&lt;/code&gt;)&lt;/li&gt; 
   &lt;li&gt;It is recommended that you use &lt;code&gt;goimports&lt;/code&gt; or the &lt;code&gt;organize-imports&lt;/code&gt; feature of &lt;code&gt;gopls&lt;/code&gt; to manage adding/removing/organizing imports automatically.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Integration with godef&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;godef-describe&lt;/code&gt; (&lt;code&gt;C-c C-d&lt;/code&gt;) to describe expressions&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;godef-jump&lt;/code&gt; (&lt;code&gt;C-c C-j&lt;/code&gt;) and &lt;code&gt;godef-jump-other-window&lt;/code&gt; (&lt;code&gt;C-x 4 C-c C-j&lt;/code&gt;) to jump to declarations&lt;/li&gt; 
   &lt;li&gt;This requires you to install godef via &lt;code&gt;go install github.com/rogpeppe/godef@latest&lt;/code&gt;.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Basic support for imenu (functions and variables)&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Built-in support for displaying code coverage as calculated by &lt;code&gt;go test&lt;/code&gt; (&lt;code&gt;go-coverage&lt;/code&gt;)&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Several functions for jumping to and manipulating the individual parts of function signatures. These functions support anonymous functions, but are smart enough to skip them when required (e.g. when jumping to a method receiver or docstring.)&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Jump to the argument list (&lt;code&gt;go-goto-arguments&lt;/code&gt; - &lt;code&gt;C-c C-f a&lt;/code&gt;)&lt;/li&gt; 
   &lt;li&gt;Jump to the docstring, create it if it does not exist yet (&lt;code&gt;go-goto-docstring&lt;/code&gt; - &lt;code&gt;C-c C-f d&lt;/code&gt;).&lt;/li&gt; 
   &lt;li&gt;Jump to the function keyword (&lt;code&gt;go-goto-function&lt;/code&gt; - &lt;code&gt;C-c C-f f&lt;/code&gt;)&lt;/li&gt; 
   &lt;li&gt;Jump to the function name (&lt;code&gt;go-goto-function-name&lt;/code&gt; - &lt;code&gt;C-c C-f n&lt;/code&gt;)&lt;/li&gt; 
   &lt;li&gt;Jump to the return values (&lt;code&gt;go-goto-return-values&lt;/code&gt; - &lt;code&gt;C-c C-f r&lt;/code&gt;)&lt;/li&gt; 
   &lt;li&gt;Jump to the method receiver, adding a pair of parentheses if no method receiver exists (&lt;code&gt;go-goto-method-receiver&lt;/code&gt; - &lt;code&gt;C-c C-f m&lt;/code&gt;).&lt;/li&gt; 
  &lt;/ul&gt; &lt;p&gt;All of these functions accept a prefix argument (&lt;code&gt;C-u&lt;/code&gt;), causing them to skip anonymous functions.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Installation&lt;/h1&gt; 
&lt;h2&gt;MELPA&lt;/h2&gt; 
&lt;p&gt;The recommended way of installing go-mode is via &lt;a href=&quot;http://www.emacswiki.org/emacs/ELPA&quot;&gt;ELPA&lt;/a&gt;, the Emacs package manager, and the &lt;a href=&quot;http://emacsredux.com/blog/2014/05/16/melpa-stable/&quot;&gt;MELPA Stable repository&lt;/a&gt;, which provides an up-to-date version of go-mode.&lt;/p&gt; 
&lt;p&gt;If you&#39;re not familiar with ELPA yet, consider reading &lt;a href=&quot;http://xahlee.info/emacs/emacs/emacs_package_system.html&quot;&gt;this guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Manual&lt;/h2&gt; 
&lt;p&gt;To install go-mode manually, check out the &lt;code&gt;go-mode.el&lt;/code&gt; repository in a directory of your choice, add it to your load path and configure Emacs to automatically load it when opening a &lt;code&gt;.go&lt;/code&gt; file:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(add-to-list &#39;load-path &quot;/place/where/you/put/it/&quot;)
(autoload &#39;go-mode &quot;go-mode&quot; nil t)
(add-to-list &#39;auto-mode-alist &#39;(&quot;\\.go\\&#39;&quot; . go-mode))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Either evaluate the statements with &lt;code&gt;C-x C-e&lt;/code&gt;, or restart Emacs.&lt;/p&gt; 
&lt;h1&gt;Other extensions&lt;/h1&gt; 
&lt;p&gt;There are several third party extensions that can enhance the Go experience in Emacs.&lt;/p&gt; 
&lt;h2&gt;Gopls integration&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/golang/tools/raw/master/gopls/README.md&quot;&gt;Gopls&lt;/a&gt; is the official language server protocol (lsp) implementation provided by the Go team. It is intended to replace the existing third party tools for code formatting (gofmt), automatic imports (goimports), code navigation (godef/guru), type and function descriptions (godoc/godef), error checking, auto completion (gocode), variable and type renaming (rename), and more. Once gopls is stable the older tools will no longer be supported.&lt;/p&gt; 
&lt;p&gt;Gopls is a supported backend for &lt;a href=&quot;https://github.com/emacs-lsp/lsp-mode&quot;&gt;lsp-mode&lt;/a&gt;. It will be used automatically by lsp-mode if &lt;code&gt;gopls&lt;/code&gt; is found in your PATH. You can install gopls via: &lt;code&gt;go install golang.org/x/tools/gopls@latest&lt;/code&gt;. To enable lsp-mode for go buffers:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(add-hook &#39;go-mode-hook &#39;lsp-deferred)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Syntax/error checking&lt;/h2&gt; 
&lt;p&gt;There are two ways of using flymake with Go:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/dougm/goflymake&quot;&gt;goflymake&lt;/a&gt;, which internally uses &lt;code&gt;go build&lt;/code&gt; to capture all errors that a regular compilation would also produce&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://marmalade-repo.org/packages/flymake-go&quot;&gt;flymake-go&lt;/a&gt; for a more lightweight solution that only uses &lt;code&gt;gofmt&lt;/code&gt; and as such is only able to catch syntax errors. Unlike goflymake, however, it does not require an additional executable.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Additionally, there is &lt;a href=&quot;https://github.com/flycheck/flycheck&quot;&gt;flycheck&lt;/a&gt;, a modern replacement for flymake, which comes with built-in support for Go. In addition to using &lt;code&gt;go build&lt;/code&gt; or &lt;code&gt;gofmt&lt;/code&gt;, it also has support for &lt;code&gt;go vet&lt;/code&gt;, &lt;code&gt;golint&lt;/code&gt; and &lt;code&gt;errcheck&lt;/code&gt;.&lt;/p&gt; 
&lt;h2&gt;Auto completion&lt;/h2&gt; 
&lt;p&gt;For auto completion, take a look at &lt;a href=&quot;https://github.com/nsf/gocode&quot;&gt;gocode&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;eldoc&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/syohex/emacs-go-eldoc&quot;&gt;https://github.com/syohex/emacs-go-eldoc&lt;/a&gt; provides eldoc functionality for go-mode.&lt;/p&gt; 
&lt;h2&gt;Snippets&lt;/h2&gt; 
&lt;p&gt;I maintain a set of YASnippet snippets for go-mode at &lt;a href=&quot;https://github.com/dominikh/yasnippet-go&quot;&gt;https://github.com/dominikh/yasnippet-go&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Integration with errcheck&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/dominikh/go-errcheck.el&quot;&gt;https://github.com/dominikh/go-errcheck.el&lt;/a&gt; provides integration with &lt;a href=&quot;https://github.com/kisielk/errcheck&quot;&gt;errcheck&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Stability&lt;/h1&gt; 
&lt;p&gt;go-mode.el has regular, tagged releases and is part of the MELPA Stable repository. These tagged releases are intended to provide a stable experience. APIs added in tagged releases will usually not be removed or changed in future releases.&lt;/p&gt; 
&lt;p&gt;Changes made on the master branch, which is tracked by the normal MELPA repository, however, are under active development. New APIs are experimental and may be changed or removed before the next release. Furthermore, there is a higher chance for bugs.&lt;/p&gt; 
&lt;p&gt;If you want a stable experience, use MELPA Stable. If you want cutting edge features, or &quot;beta-test&quot; future releases, use MELPA or the master branch.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/c7140c8d2bef620d830027bdcb29251a262706b999c78e32781674885ba5f508/dominikh/go-mode.el" medium="image" />
      
    </item>
    
  </channel>
</rss>
