Awesome-omni-skill xenodium-elisp
Xenodium's Emacs packages: chatgpt-shell, agent-shell, dwim-shell-command, and ACP integration for modern Emacs development.
install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/ai-agents/xenodium-elisp" ~/.claude/skills/diegosouzapw-awesome-omni-skill-xenodium-elisp && rm -rf "$T"
manifest:
skills/ai-agents/xenodium-elisp/SKILL.mdsource content
Xenodium Elisp Skill
"The best UI is no UI. The second best UI is Emacs."
Package Overview
| Package | Stars | Description |
|---|---|---|
| chatgpt-shell | 1180⭐ | Multi-LLM Emacs shell (ChatGPT, Claude, DeepSeek, Gemini, Ollama) |
| agent-shell | 415⭐ | Native Emacs buffer for LLM agents via ACP |
| dwim-shell-command | 293⭐ | Save and apply shell commands with ease |
| acp.el | 109⭐ | Agent Client Protocol implementation |
| ob-swiftui | 87⭐ | SwiftUI in Org Babel blocks |
| sqlite-mode-extras | 58⭐ | Enhanced sqlite-mode |
chatgpt-shell: Multi-LLM Interface
(use-package chatgpt-shell :custom (chatgpt-shell-model-version "gpt-4o") (chatgpt-shell-anthropic-key (getenv "ANTHROPIC_API_KEY")) (chatgpt-shell-openai-key (getenv "OPENAI_API_KEY")) :config ;; Switch between models (setq chatgpt-shell-model-versions '("gpt-4o" "gpt-4-turbo" "claude-3-5-sonnet" "gemini-pro"))) ;; Key bindings (global-set-key (kbd "C-c g") 'chatgpt-shell) (global-set-key (kbd "C-c G") 'chatgpt-shell-send-region)
Shell Commands
| Command | Description |
|---|---|
| Open interactive shell |
| Send selected region |
| Explain code at point |
| Refactor with AI |
| Generate tests |
agent-shell: ACP-Powered Agents
Agent Client Protocol enables structured agent workflows:
(use-package agent-shell :after acp :config (setq agent-shell-default-agent "coding-assistant")) ;; Define custom agent (acp-define-agent "music-topos-agent" :system-prompt "You are a categorical music theory assistant..." :tools '((:name "generate-color" :description "Generate deterministic color from seed" :parameters ((:name "seed" :type "integer") (:name "index" :type "integer")))))
dwim-shell-command: Smart Shell Integration
(use-package dwim-shell-command :bind (("M-!" . dwim-shell-command) ("C-c !" . dwim-shell-command-on-marked-files))) ;; Define reusable commands (dwim-shell-command-define :name "Convert to WebP" :command "cwebp -q 80 '<<f>>' -o '<<fne>>.webp'" :utils "cwebp") (dwim-shell-command-define :name "FFmpeg to GIF" :command "ffmpeg -i '<<f>>' -vf 'fps=10,scale=320:-1' '<<fne>>.gif'" :utils "ffmpeg")
Template Variables
| Variable | Meaning |
|---|---|
| Full file path |
| File path without extension |
| File extension |
| All marked files |
acp.el: Agent Client Protocol
(use-package acp :config ;; Register MCP servers (acp-register-server :name "gay-mcp" :command '("julia" "--project=@gay" "-e" "using Gay; Gay.serve_mcp()") :env '(("GAY_SEED" . "1069"))) (acp-register-server :name "firecrawl" :command '("npx" "-y" "firecrawl-mcp")))
sqlite-mode-extras: Enhanced Database UI
(use-package sqlite-mode-extras :after sqlite-mode :hook (sqlite-mode . sqlite-mode-extras-minor-mode) :bind (:map sqlite-mode-map ("n" . sqlite-mode-extras-next-row) ("p" . sqlite-mode-extras-prev-row) ("e" . sqlite-mode-extras-edit-cell) ("x" . sqlite-mode-extras-execute)))
Integration with Music Topos
Gay.jl Colors in chatgpt-shell
(defun gay/chatgpt-shell-colorize-response () "Colorize chatgpt-shell responses with deterministic colors." (let* ((response-count (length chatgpt-shell--conversation)) (color (gay-color-at gay-seed-default response-count)) (hex (gay-color-to-hex color))) (put-text-property (point-min) (point-max) 'face `(:background ,hex)))) (add-hook 'chatgpt-shell-response-hook #'gay/chatgpt-shell-colorize-response)
GF(3) Conservation for Agent Responses
(defun gay/agent-response-trit (response) "Map agent response to trit based on sentiment/category." (let* ((hash (sxhash response)) (color (gay-color-at gay-seed-default (mod hash 1000))) (hue (plist-get color :H))) (gay-hue-to-trit hue))) (defun gay/verify-conversation-gf3 () "Verify GF(3) conservation across conversation." (let ((trits (mapcar #'gay/agent-response-trit chatgpt-shell--conversation))) (gay-gf3-conserved-p trits)))
Transient Integration
(require 'transient) (transient-define-prefix gay-transient () "Gay.el color generation commands." ["Colors" ("p" "Generate palette" gay-generate-palette) ("c" "Check GF(3)" gay-check-gf3) ("h" "Color at index" gay-color-at-interactive)] ["Agents" ("s" "Spawn hierarchy" narya/spawn-hierarchy) ("d" "Demo" narya/demo)] ["Shell" ("g" "ChatGPT Shell" chatgpt-shell) ("a" "Agent Shell" agent-shell)]) (global-set-key (kbd "C-c C-g") 'gay-transient)
Xenomodern Philosophy
Xenodium's approach embodies xenomodernity through:
- Embrace the old (Emacs) while pushing forward (LLM integration)
- Ironic distance from "modern" GUIs while building better UX
- DWIM philosophy: Do What I Mean, not what I said
- Composable primitives: Small packages that combine powerfully
xenodium │ ┌──────────────┼──────────────┐ │ │ │ Emacs Lisp Modern LLMs Unix Tools (1976) (2022+) (1970s) │ │ │ └──────────────┴──────────────┘ │ Ironic Synthesis (chatgpt-shell, acp.el)
Commands
just xenodium-setup # Install xenodium packages just chatgpt-shell-demo # Run chatgpt-shell demo just agent-shell-config # Configure agent-shell with MCP just dwim-define # Create custom dwim-shell-command
Resources
- xenodium.com - Blog with Emacs tips
- YouTube: Xenodium - Video tutorials
- ACP Specification - Agent Client Protocol