From c2af33247a4c2e8c5bebd5b58b6e20e5238002be Mon Sep 17 00:00:00 2001 From: User Date: Sat, 11 Jul 2026 19:01:59 +0800 Subject: [PATCH] feat(ai): Add opencode integration and reorganize AI tools --- lisp/init-base.el | 24 +++++++++++++++++------- lisp/init-gptel.el | 35 +++++++++++++++++++++++++++++++++++ lisp/init-kbd-func.el | 6 ++++++ lisp/init-kbd.el | 25 ++++++++++++++++++++++--- lisp/init-package.el | 3 ++- lisp/init-window.el | 3 ++- 6 files changed, 84 insertions(+), 12 deletions(-) diff --git a/lisp/init-base.el b/lisp/init-base.el index 085bee2..901e61a 100644 --- a/lisp/init-base.el +++ b/lisp/init-base.el @@ -116,9 +116,17 @@ (mode . eww-bookmark-mode) (mode . eww-buffers-mode) (mode . eww-history-mode))) + ("AI" (or + (name . "^\\*OpenCode") + (name . "\\*opencode-serve\\*") + (name . "^\\*gptel"))) ("Calc" (or (mode . calc-mode) (mode . calc-trail-mode))) + ("Text" (or + (mode . org-mode) + (mode . markdown-mode) + (name . "^\\*\\[D\\] FILE backlinks for"))) ("Shell" (or (mode . eshell-mode) (mode . eat-mode) @@ -145,8 +153,6 @@ (mode . geiser-debug-mode) (mode . geiser-doc-mode) (mode . geiser-autodoc-mode))) - ("gptel" (or - (name . "^\\*gptel"))) ("Common-lisp" (or (mode . common-lisp-mode) (mode . lisp-mode))) @@ -156,10 +162,11 @@ (mode . sly-mrepl-mode) (name . "\\*sly-compilation\\*") (name . "^\\*img-cache\\*"))) - ("Text" (or - (mode . org-mode) - (mode . markdown-mode) - (name . "^\\*\\[D\\] FILE backlinks for"))) + ("Config" (or + (mode . conf-mode) + (mode . conf-toml-mode) + (mode . conf-unix-mode) + (mode . yaml-ts-mode))) ("Help" (or (mode . help-mode) (mode . helpful-mode))) @@ -184,7 +191,10 @@ (mode . xref-edit-mode) (mode . occur-mode) (mode . occur-edit-mode))) - ("Diff" (name . "^*Diff")) + ("Diff" (or + (name . "^*Diff") + (mode . ediff-mode) + (mode . vundo-diff-mode))) ("Emacs" (or (name . "^\\*Help\\*$") (name . "^\\*Custom.*") diff --git a/lisp/init-gptel.el b/lisp/init-gptel.el index f2cbeef..b4311f1 100644 --- a/lisp/init-gptel.el +++ b/lisp/init-gptel.el @@ -146,6 +146,41 @@ explanations, no quotes, no punctuation, no file extension." (setq gptel-magit-model 'kimi-for-coding gptel-magit-backend (gptel-get-backend "gptel-Kimi-Code-magit")))) +(use-package plz + :straight + (plz :type git + :host github + :repo "alphapapa/plz.el" + :ref "v0.9.1")) + +(use-package plz-media-type + :straight + (plz-media-type :type git + :host github + :repo "r0man/plz-media-type" + :ref "v0.2.4")) + +(use-package plz-event-source + :straight + (plz-event-source :type git + :host github + :repo "r0man/plz-event-source" + :ref "v0.1.3")) + +(use-package opencode + :straight + (opencode :type git + :host codeberg + :repo "sczi/opencode.el") + :hook + (opencode-session-control-mode . disable-truncate-lines)) + +(use-package eval-elisp-mcp + :straight + (eval-elisp-mcp :type git + :host codeberg + :repo "sczi/eval-elisp-mcp")) + (provide 'init-gptel) ;;; init-gptel.el ends here diff --git a/lisp/init-kbd-func.el b/lisp/init-kbd-func.el index 8f62754..26e565c 100644 --- a/lisp/init-kbd-func.el +++ b/lisp/init-kbd-func.el @@ -272,6 +272,12 @@ argument)." (let ((current-prefix-arg '-)) (call-interactively 'gptel-agent))) +(defun my-opencode () + "Run `opencode' in project root." + (interactive) + (let ((default-directory (project-root (project-current t)))) + (opencode))) + (defun my-consult-ripgrep-project () "Run `consult-ripgrep' in current project's root." (interactive) diff --git a/lisp/init-kbd.el b/lisp/init-kbd.el index 84fdade..475d72e 100644 --- a/lisp/init-kbd.el +++ b/lisp/init-kbd.el @@ -19,16 +19,35 @@ ;; g for gptel (general-def :prefix "C-c g" - "o" 'gptel + "g" 'gptel "m" 'gptel-menu "s" 'gptel-send "a" 'gptel-agent - "t" 'gptel-tools) + "t" 'gptel-tools + "o" 'opencode + "p" 'opencode-select-project + "l" 'opencode-select-session + "n" 'opencode-new-session) (general-def gptel-mode-map "C-c C-s" 'my-gptel-save-session "C-c C-k" 'gptel-abort) +;; opencode +(general-def opencode-session-mode-map + "C-c C-p" 'comint-previous-prompt + "C-c M-p" 'opencode-respond-permission + "C-c x" nil + "C-c C-k" 'opencode-abort-session + "C-c C-c" 'nil + "C-c n" 'nil + "C-c N" 'opencode-new-session) + +(general-def opencode-session-control-mode-map + "n" 'next-line + "p" 'previous-line + "N" 'opencode-new-session) + ;; u for ui (general-def :prefix "C-c u" @@ -68,7 +87,7 @@ "R" 'project-query-replace-regexp "v" 'magit-project-status "V" 'project-vc-dir - "a" 'my-gptel-agent-project + "a" 'my-opencode "i" 'project-ibuffer) ;; v for version control diff --git a/lisp/init-package.el b/lisp/init-package.el index de25dd6..f8f060c 100644 --- a/lisp/init-package.el +++ b/lisp/init-package.el @@ -157,7 +157,8 @@ _a_ : all dwim (project-query-replace-regexp "Query Replace" ?R) (consult-ripgrep "Ripgrep" ?r) (consult-project-buffer "Buffers" ?b) - (project-ibuffer "Ibuffer" ?i)))))) + (project-ibuffer "Ibuffer" ?i) + (opencode "OpenCode" ?a)))))) (use-package project-ibuffer :straight diff --git a/lisp/init-window.el b/lisp/init-window.el index df3383b..8bc7aaa 100644 --- a/lisp/init-window.el +++ b/lisp/init-window.el @@ -42,8 +42,9 @@ "Buffers\\*$" "^\\*Geiser" "\\*gptel-Kimi-Code\\*" - "^\\*sly" "\\*gptel-agent:.*\\*" + "^\\*OpenCode Sessions" + "^\\*sly" "^magit" "\\*discomfort\\*" "\\*eww bookmarks\\*"