.emacs.d/inits/20-ollama-buddy.el
2026-01-27 16:07:54 +09:00

89 lines
4.9 KiB
EmacsLisp

;; --- Ollama Buddy 設定開始 (2025-07-14) ---
;; ollama-buddy パッケージをロードします。
;; この行はollama-buddyをEmacsで利用可能にするために必須です。
(use-package ollama-buddy
:ensure t
:custom
(ollama-buddy-default-model "gemma3:latest"))
;; デフォルトのOllamaモデルを設定します。
;; あなたがインストール済みの "gemma3n:e2b" を指定します。
;; ここで指定したモデルが、チャット開始時のデフォルトになります。
;(setq ollama-buddy-default-model "gemma3n:e2b")
;; 必要であれば、Ollamaサーバーのエンドポイントを指定します。
;; 通常はOllamaがデフォルトのポートで起動していればこの行は不要です。
;; 例: (setq ollama-buddy-server-url "http://localhost:11434/api/generate")
;;(setq ollama-buddy-server-url "http://ollama.lxd:11434/api/generate")
;(setq ollama-buddy-server-url "http://10.10.100.242:11434/api/generate")
(setq ollama-buddy-server-url "http://127.0.0.1:11435/api/generate")
;; Ollama Buddy 関連コマンドのプレフィックスキーマップを定義します。
;; Emacsのバージョンが古い場合 (Emacs 29未満) でも動作するように `make-keymap` を使用します。
;; これにより、`C-c o` を押した後、次に続くキーで様々なollama-buddy機能にアクセスできます。
(setq ollama-buddy-map (make-keymap))
(global-set-key (kbd "C-c o") ollama-buddy-map)
;; --- 基本的な Ollama Buddy コマンドへのキーバインド ---
;; `C-c o` の後に続くキーを設定します
;; 新しいチャットセッションを開始します。
;; `M-x ollama-buddy--open-chat` と同じ動作です。
(define-key ollama-buddy-map (kbd "c") 'ollama-buddy--open-chat)
;; 現在の選択範囲(リージョン)をプロンプトとして Ollama に送信し、新しいチャットで応答を得ます。
(define-key ollama-buddy-map (kbd "r") 'ollama-buddy-chat-region)
;; 現在のバッファ全体の内容をプロンプトとして Ollama に送信し、新しいチャットで応答を得ます。
(define-key ollama-buddy-map (kbd "b") 'ollama-buddy-chat-buffer)
;; ミニバッファでプロンプトを入力し、その Ollama からの応答を現在のカーソル位置に挿入します。
;; コードスニペットの生成などに便利です。
(define-key ollama-buddy-map (kbd "i") 'ollama-buddy-insert-at-point)
;; --- カスタムアシストコマンドの定義とキーバインド ---
;; よく使う指示を関数化し、専用のキーバインドで簡単に呼び出せるようにします。
;; 選択範囲のコードをリファクタリングする関数
;; `C-c o R` で呼び出せます。
(defun my-ollama-refactor-region ()
"Selected region is sent to ollama for refactoring to be more efficient and readable."
(interactive) ; この関数を M-x で実行可能にする
(let ((prompt-prefix "Refactor this code to be more efficient and readable: "))
;; `nil` を渡すことで、結果は新しいチャットバッファで表示されます。
(ollama-buddy-chat-region nil prompt-prefix)))
(define-key ollama-buddy-map (kbd "R") 'my-ollama-refactor-region)
;; 選択範囲のコードを詳細に説明する関数
;; `C-c o E` で呼び出せます。
(defun my-ollama-explain-region ()
"Selected region is sent to ollama for detailed explanation."
(interactive)
(let ((prompt-prefix "Explain this code in detail: "))
(ollama-buddy-chat-region nil prompt-prefix)))
(define-key ollama-buddy-map (kbd "E") 'my-ollama-explain-region)
;; 選択範囲のコードと任意のエラーメッセージをデバッグのために送信する関数
;; `C-c o D` で呼び出せます。エラーメッセージはミニバッファで尋ねられます。
(defun my-ollama-debug-region ()
"Selected region and optional error message sent to ollama for debugging."
(interactive)
(let* ((error-message (read-string "Enter error message (optional): ")) ; エラーメッセージを入力プロンプト
(prompt-prefix (if (string-empty-p error-message) ; エラーメッセージが空でなければ、プロンプトに含める
"Debug this code: "
(format "Debug this code, given the error: \"%s\"\nCode: " error-message))))
(ollama-buddy-chat-region nil prompt-prefix)))
(define-key ollama-buddy-map (kbd "D") 'my-ollama-debug-region)
;; (string-empty-p ...) 関数は一部の古いEmacsバージョンでは定義されていない場合があります。
;; もし "void-function string-empty-p" エラーが出た場合、以下のコメントアウトを外してください。
;; (unless (fboundp 'string-empty-p)
;; (defun string-empty-p (str)
;; "Return t if STR is nil or an empty string."
;; (or (null str) (string= str ""))))
;; --- Ollama Buddy 設定終了 ---
(global-set-key (kbd "C-c r") 'my-ollama-refactor-region) ;; Ctrl-c r にバインド