diff --git a/GPTEL_SETUP.md b/GPTEL_SETUP.md index 8adc7a4..aef3bd4 100644 --- a/GPTEL_SETUP.md +++ b/GPTEL_SETUP.md @@ -59,22 +59,24 @@ Your Doom Emacs now has a comprehensive gptel setup with: ## ⌨️ Keybindings Reference -All gptel commands are under `SPC a` (AI prefix): +All gptel commands are under `SPC A` (uppercase A - AI prefix): | Keybinding | Command | Description | |------------|---------|-------------| -| `SPC a g` | `gptel` | Open gptel chat buffer | -| `SPC a s` | `gptel-send` | Send prompt to LLM | -| `SPC a m` | `gptel-menu` | Open transient menu (change model, backend, etc) | -| `SPC a r` | `gptel-rewrite` | Rewrite selected region with AI | -| `SPC a c` | `gptel-add` | Add region/buffer to context | -| `SPC a f` | `gptel-add-file` | Add file to context | -| `SPC a q` | `gptel-quick` | Quick lookup in popup (word/region) | -| `SPC a l` | Load buffer into session | Send whole buffer as context | -| `SPC a b` | Send whole buffer | Send entire buffer to AI | -| `SPC a R` | Refactor region | Refactor selected code | -| `SPC a e` | Quick explain | Explain selected code quickly | -| `SPC a p` | Proofread text | Fix grammar/spelling in selection | +| `SPC A g` | `gptel` | Open gptel chat buffer | +| `SPC A s` | `gptel-send` | Send prompt to LLM | +| `SPC A m` | `gptel-menu` | Open transient menu (change model, backend, etc) | +| `SPC A r` | `gptel-rewrite` | Rewrite selected region with AI | +| `SPC A c` | `gptel-add` | Add region/buffer to context | +| `SPC A f` | `gptel-add-file` | Add file to context | +| `SPC A q` | `gptel-quick` | Quick lookup in popup (word/region) | +| `SPC A l` | Load buffer into session | Send whole buffer as context | +| `SPC A b` | Send whole buffer | Send entire buffer to AI | +| `SPC A R` | Refactor region | Refactor selected code | +| `SPC A e` | Quick explain | Explain selected code quickly | +| `SPC A p` | Proofread text | Fix grammar/spelling in selection | +| `SPC A C` | Complete at point | Trigger AI code completion | +| `SPC A a` | Accept completion | Accept displayed ghost text completion | ### In gptel buffer: - `C-c RET` - Send message @@ -82,7 +84,8 @@ All gptel commands are under `SPC a` (AI prefix): - `C-c C-k` - Abort request ### Auto-completion (in programming modes): -- `M-TAB` or `C-c TAB` - Trigger completion +- `M-TAB` or `C-c TAB` - Trigger completion (`gptel-complete`) +- `C-c C-a` - Accept completion (`gptel-accept-completion`) --- @@ -90,7 +93,7 @@ All gptel commands are under `SPC a` (AI prefix): Presets let you switch AI behavior for specific tasks: -1. Open gptel menu: `SPC a m` or `C-c C-c` +1. Open gptel menu: `SPC A m` or `C-c C-c` 2. Select "Preset" option 3. Choose from: - **coder** - Expert coding assistant (uses Claude Sonnet 4.5) @@ -99,7 +102,7 @@ Presets let you switch AI behavior for specific tasks: - **quick** - Quick, concise answers (uses fast Gemini Flash) - **docs** - Documentation writer -Or use `C-u SPC a s` to adjust settings on-the-fly! +Or use `C-u SPC A s` to adjust settings on-the-fly! --- @@ -107,15 +110,15 @@ Or use `C-u SPC a s` to adjust settings on-the-fly! ### 1. Chat with AI ``` -SPC a g → Opens gptel buffer +SPC A g → Opens gptel buffer Type question → Write your prompt -C-c RET → Send (or SPC a s) +C-c RET → Send (or SPC A s) ``` ### 2. Rewrite Code ``` 1. Select code region (visual mode) -2. SPC a r +2. SPC A r 3. Type instruction: "Add error handling" 4. Review changes and accept ``` @@ -123,23 +126,23 @@ C-c RET → Send (or SPC a s) ### 3. Add Context (Multi-file awareness) ``` 1. Open reference file -2. SPC a c (adds buffer to context) -3. Open gptel: SPC a g +2. SPC A c (adds buffer to context) +3. Open gptel: SPC A g 4. Now AI knows about the reference file! ``` ### 4. Quick Explanations ``` 1. Hover over word or select code -2. SPC a q +2. SPC A q 3. See explanation in popup! ``` ### 5. Code Completion ``` Start typing code... -M-TAB → Shows AI completion as ghost text -TAB → Accept completion +M-TAB or SPC A C → Request AI completion (shows as ghost text) +C-c C-a or SPC A a → Accept the completion ``` --- @@ -188,18 +191,18 @@ Want to run AI locally for privacy? 1. **Save conversations**: gptel uses org-mode by default, so just save the buffer! -2. **Switch models on-the-fly**: `C-u SPC a s` before sending +2. **Switch models on-the-fly**: `C-u SPC A s` before sending 3. **Context management**: - - Add files in Dired: Mark files → `SPC a c` - - Remove context: `SPC a m` → Manage context + - Add files in Dired: Mark files → `SPC A c` + - Remove context: `SPC A m` → Manage context 4. **Org-mode features**: - Each heading can be a separate conversation branch - Set properties: `M-x gptel-org-set-properties` - Set topic: `M-x gptel-org-set-topic` -5. **Custom instructions**: Use `SPC a r` on selected code and give specific instructions +5. **Custom instructions**: Use `SPC A r` on selected code and give specific instructions 6. **Programmatic use**: See helper functions at bottom of `ai.el` for examples @@ -210,7 +213,7 @@ Want to run AI locally for privacy? 1. **Secure your API key** (see section above) 2. **Run:** `doom sync` to install packages 3. **Restart Emacs** -4. **Try:** `SPC a g` to start chatting! +4. **Try:** `SPC A g` to start chatting! 5. **Watch:** "Every LLM in Emacs, with gptel" video (17 min) --- @@ -235,10 +238,12 @@ Then: `M-x package-install RET transient RET` - Ensure proper encryption password - Test: `(auth-source-pick-first-password :host "openrouter.ai")` -### Autocomplete not showing? -- Enable manually: `M-x gptel-autocomplete-mode` -- Check if in prog-mode buffer -- May need specific model configuration +### Autocomplete not working? +- Trigger manually: `M-x gptel-complete` or `M-TAB` +- Accept completion: `M-x gptel-accept-completion` or `C-c C-a` +- Note: There's no auto-mode - you trigger completions on-demand +- Check gptel is configured and working first (`SPC A g`) +- Adjust context size if needed (see `gptel-autocomplete-*-context-lines` variables) --- diff --git a/ai.el b/ai.el index f23104b..078624a 100644 --- a/ai.el +++ b/ai.el @@ -26,9 +26,9 @@ ;; Move cursor to end of response automatically (add-hook 'gptel-post-response-functions 'gptel-end-of-response) - ;; Keybindings + ;; Keybindings - using SPC A for AI (uppercase to avoid conflicts) (map! :leader - (:prefix ("a" . "AI") + (:prefix ("A" . "AI/gptel") :desc "gptel chat" "g" #'gptel :desc "gptel send" "s" #'gptel-send :desc "gptel menu" "m" #'gptel-menu @@ -84,7 +84,7 @@ (setq gptel-quick-use-context t) (map! :leader - (:prefix "a" + (:prefix "A" :desc "Quick lookup" "q" #'gptel-quick))) ;;; ============================================================================ @@ -95,7 +95,7 @@ :after gptel :config (map! :leader - (:prefix "a" + (:prefix "A" :desc "Load buffer into session" "l" #'gptel-extensions-load-buffer :desc "Send whole buffer" "b" #'gptel-extensions-send-whole-buffer :desc "Refactor region" "R" #'gptel-extensions-refactor))) @@ -106,18 +106,24 @@ (use-package! gptel-autocomplete :after gptel + :commands (gptel-complete gptel-accept-completion) :config - ;; Enable in programming modes - (add-hook 'prog-mode-hook #'gptel-autocomplete-mode) + ;; Configure context size + (setq gptel-autocomplete-before-context-lines 100 + gptel-autocomplete-after-context-lines 20 + gptel-autocomplete-temperature 0.1) - ;; Configure keybindings for autocomplete - (map! :map gptel-autocomplete-mode-map - "M-TAB" #'gptel-autocomplete-complete - "C-c TAB" #'gptel-autocomplete-complete) + ;; Keybindings for autocomplete + (map! :leader + (:prefix "A" + :desc "Complete at point" "C" #'gptel-complete + :desc "Accept completion" "a" #'gptel-accept-completion)) - ;; Optional: Configure which model to use for completion - ;; (setq gptel-autocomplete-model 'google/gemini-2.5-flash) - ) + ;; Also add convenient keybindings in prog-mode + (map! :map prog-mode-map + "M-TAB" #'gptel-complete + "C-c TAB" #'gptel-complete + "C-c C-a" #'gptel-accept-completion)) ;;; ============================================================================ ;;; Optional: Add Ollama for local models (commented out by default) @@ -163,7 +169,7 @@ ;; Add keybindings for helper functions (map! :leader - (:prefix "a" + (:prefix "A" :desc "Quick explain" "e" #'my/gptel-quick-explain-region :desc "Proofread text" "p" #'my/gptel-proofread-region)) diff --git a/development.el b/development.el index 622f2f4..2a4bdba 100644 --- a/development.el +++ b/development.el @@ -70,7 +70,17 @@ (use-package! nix-mode :mode "\\.nix\\'" + :hook (nix-mode . lsp-deferred) :config + ;; Configure nil LSP server + (after! lsp-mode + (add-to-list 'lsp-language-id-configuration '(nix-mode . "nix")) + (lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection "nil") + :major-modes '(nix-mode) + :server-id 'nil-ls + :priority 0))) + ;; Function to check if we're in a nixpkgs repository (defun in-nixpkgs-repo-p () (when-let ((root (or (locate-dominating-file default-directory ".git") diff --git a/init.el b/init.el index 38edaba..9ba6faa 100644 --- a/init.el +++ b/init.el @@ -150,7 +150,7 @@ ;;lua ; one-based indices? one-based indices markdown ; writing docs for people to ignore ;;nim ; python + lisp at the speed of c - nix ; I hereby declare "nix geht mehr!" + (nix +lsp) ; I hereby declare "nix geht mehr!" ;;ocaml ; an objective camel (org +brain +contacts