LLM integrations for emacs

This commit is contained in:
Ian Keane 2026-09-05 21:49:50 -04:00
parent 415f33880c
commit 0f471e2c6e

View file

@ -935,10 +935,72 @@ I know these could be bound on a per-package basis, but since this is my primary
deft-extensions '("org" "txt")) deft-extensions '("org" "txt"))
#+end_src #+end_src
* AI * AI
Multiple AI coding-agent integrations are configured here, all under the
=SPC c a= (mnemonic: "code agent") prefix. None of these packages are
loaded, started, or connected to anything at Emacs startup — they are
purely autoloaded via =:commands= and only spring into life when you
explicitly invoke one of the bindings below. This is deliberate: several
of these (claude-code family in particular) are tied to a specific
subscription/account, and accidentally having one auto-activate in the
wrong project (personal vs. work) would be a contract violation. So:
- No =:hook=, no =:init= that touches global state, no autostart.
- Each package is truly inert until you press its specific keybinding.
- You are always choosing, explicitly, which agent/account to invoke for
the current project.
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package gptel) (use-package gptel
(setq gptl-default-mode 'org-mode) :commands (gptel gptel-send gptel-menu)
:config
(setq gptel-default-mode 'org-mode))
;; gptel-agent adds agentic/tool-use capabilities on top of gptel.
;; Deferred the same way — it does nothing until invoked.
(use-package gptel-agent
:straight (gptel-agent :host github :repo "skissue/gptel-agent")
:after gptel
:commands (gptel-agent))
;; claude-code.el: terminal/vterm-backed Claude Code session manager.
;; :commands ensures the package (and any of its process-launching code)
;; is not loaded until you explicitly call one of these.
(use-package claude-code
:straight (claude-code :host github :repo "stevemolitor/claude-code.el")
:commands (claude-code claude-code-toggle claude-code-send-region
claude-code-switch-to-buffer))
;; claude-code-ide.el: a separate, IDE-style (not terminal-based)
;; Claude Code integration. Kept fully independent from claude-code.el
;; above so you can compare the two without either auto-loading the
;; other.
(use-package claude-code-ide
:straight (claude-code-ide :host github :repo "manzaltu/claude-code-ide.el")
:commands (claude-code-ide claude-code-ide-menu))
;; agent-shell: general-purpose agent shell (not Claude-specific).
(use-package agent-shell
:straight (agent-shell :host github :repo "xenodium/agent-shell")
:commands (agent-shell))
#+end_src #+end_src
** Keybindings
All bindings live under =SPC c a=, alongside the rest of the =Code= prefix.
Nothing here is bound globally outside of =general-definition= below, and
none of it runs at startup — pressing one of these keys is the only thing
that ever loads/starts the corresponding package.
#+begin_src emacs-lisp
(with-eval-after-load 'general
(general-definition
"ca" '(:ignore t :which-key "Code agent")
"caa" '(gptel :which-key "gptel (chat)")
"cag" '(gptel-agent :which-key "gptel-agent")
"cac" '(claude-code :which-key "claude-code.el")
"caC" '(claude-code-ide :which-key "claude-code-ide.el")
"cas" '(agent-shell :which-key "agent-shell")))
#+end_src
* Org Mode * Org Mode
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package org) (use-package org)