From 49b64da74d4509c06a943538ac741bf3302b5a28 Mon Sep 17 00:00:00 2001 From: Wong Ding Feng Date: Sat, 21 Mar 2026 12:27:00 +0800 Subject: [PATCH] feat(ai): add gemini-cli integration with doom leader bindings --- ai.el | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ packages.el | 6 +++++ 2 files changed, 71 insertions(+) diff --git a/ai.el b/ai.el index 813177b..d3a4678 100644 --- a/ai.el +++ b/ai.el @@ -244,6 +244,71 @@ (when (eq claude-code-terminal-backend 'vterm) (setq-local vterm-max-scrollback 100000))))) +;;; Gemini CLI Configuration + +(use-package! gemini-cli + :defer t + :config + ;; Set the Gemini executable + (setq gemini-cli-program "gemini" + gemini-cli-program-switches nil) + + ;; Use Eat backend + (setq gemini-cli-terminal-backend 'eat + ;; Emacs-style editing in Gemini buffer: RET inserts newline, S-RET sends + gemini-cli-newline-keybinding-style 'shift-return-to-send) + + ;; Enable global mode + (gemini-cli-mode 1) + + ;; Emacs-style prefix key + (global-set-key (kbd "C-c g") gemini-cli-command-map) + + ;; Set Doom leader keybindings under SPC G + (map! :leader + (:prefix ("G" . "gemini-cli") + :desc "Start Gemini" "c" #'gemini-cli + :desc "Start in directory" "d" #'gemini-cli-start-in-directory + :desc "Continue conversation" "C" #'gemini-cli-continue + :desc "Resume session" "R" #'gemini-cli-resume + :desc "New instance" "i" #'gemini-cli-new-instance + :desc "Kill Gemini" "k" #'gemini-cli-kill + :desc "Kill all instances" "K" #'gemini-cli-kill-all + :desc "Send command" "s" #'gemini-cli-send-command + :desc "Send command with context" "x" #'gemini-cli-send-command-with-context + :desc "Send region/buffer" "r" #'gemini-cli-send-region + :desc "Send buffer file" "o" #'gemini-cli-send-buffer-file + :desc "Fix error at point" "e" #'gemini-cli-fix-error-at-point + :desc "Toggle window" "t" #'gemini-cli-toggle + :desc "Switch to buffer" "b" #'gemini-cli-switch-to-buffer + :desc "Select buffer" "B" #'gemini-cli-select-buffer + :desc "Toggle read-only" "z" #'gemini-cli-toggle-read-only-mode + :desc "Cycle mode" "M" #'gemini-cli-cycle-mode + :desc "Transient menu" "m" #'gemini-cli-transient + :desc "Slash commands" "/" #'gemini-cli-slash-commands + :desc "Fork conversation" "f" #'gemini-cli-fork + :desc "Send return" "y" #'gemini-cli-send-return + :desc "Send escape" "n" #'gemini-cli-send-escape + :desc "Send 1" "1" #'gemini-cli-send-1 + :desc "Send 2" "2" #'gemini-cli-send-2 + :desc "Send 3" "3" #'gemini-cli-send-3)) + + ;; Optional: Configure window display (side window on right) + (add-to-list 'display-buffer-alist + '("^\\*gemini" + (display-buffer-in-side-window) + (side . right) + (window-width . 90))) + + ;; Optional: Enable auto-revert for files modified by Gemini + ;; (global-auto-revert-mode 1) + + ;; Optional: Increase vterm scrollback for long conversations + (add-hook 'gemini-cli-start-hook + (lambda () + (when (eq gemini-cli-terminal-backend 'vterm) + (setq-local vterm-max-scrollback 100000))))) + ;; (use-package! claudemacs ;; :defer t ;; :commands (claudemacs claudemacs-transient-menu) diff --git a/packages.el b/packages.el index 02dd5a3..3ca844f 100644 --- a/packages.el +++ b/packages.el @@ -47,10 +47,16 @@ (package! consult) +(package! popup) + (package! claude-code :recipe (:host github :repo "stevemolitor/claude-code.el" :branch "main" :depth 1 :files ("*.el" (:exclude "images/*")))) +(package! gemini-cli + :recipe (:host github :repo "linchen2chris/gemini-cli.el" :branch "main" + :files ("*.el" (:exclude "demo.gif")))) + (package! claudemacs :recipe (:host github :repo "cpoile/claudemacs"))