🧱

Windows版Emacsからコマンドラインツールを連携する方法

に公開

Windows版Emacsでコマンドラインツールの標準出力が連携できない問題

WindowsにWindows版Emacsをインストールした環境で、Windowsネイティブのコマンドラインツールと連携ができませんでした。
この記事では、問題の解決方法を解説します。
結論から言うと、Emacsが利用するデフォルトのshellプログラムをGit for Windowsが提供するシェルに切り替えると解決しました。

環境

  • Windows 11 Pro
  • emacs-29.1 (emacs-29.1-installer.exe)
  • Git for Windows (Git-2.42.0.2-64-bit.exe)

発生した現象

Windows版Emacsをインストールします。
(askai)[https://github.com/koki-develop/askai] というコマンドラインツールをインストールします。
(askai)[https://github.com/koki-develop/askai] は標準入力の文章をChatGPTに頼み事をするものです。

echo 'Please write hello world code in python' | askai -i

shell-command-on-region 関数でリージョンの範囲を外部プログラムに表準出力として渡す処理も正しく動きません。

修正方法

init.elへの設定

~/.emacs.d/init.el 以下の設定を追加してください。
内容は『Git for Windowsに付属しているbash.exeをEmacsのシェルプログラムとして指定する』という意味です。
Git for Windowsがインストールされていることが前提となります。

(defvar explicit-shell-file-name "C:/Program Files/Git/usr/bin/bash.exe")

効果

  1. magitからコミットログを編集することができます。

  2. 標準入力を受け取る外部プログラムを利用することができます。

以下のEmacs関数は、選択中のリージョンを (askai)[https://github.com/koki-develop/askai] というコマンドラインツールを使ってChatGPTに頼み事をするものです。
依頼するプロンプトをリージョン選択して、ESC-c キーを押すとChatGPTから回答をもらえます。
~/.emacs.d/init.el にでも追加してください。

;; askai
(defun askai-on-region (start end)
  (interactive "r")
  (let* ((output-buf (get-buffer-create "*Askai Output*"))
         (err-buf "*Askai Error*")
         (cmd "askai")
	 (cur-buf (current-buffer)))
    (shell-command-on-region start end cmd output-buf nil err-buf)
    (with-current-buffer output-buf
      (let ((str (buffer-substring-no-properties (point-min) (point-max))))
	(with-current-buffer cur-buf
	  (insert "\n\n")
	  (insert str))))))
(global-set-key (kbd "M-c") 'askai-on-region)

最後に

Windows版Emacsではmagitなどを動かすのは不可能かと思っていましたが、ついに解決しました。
この記事は私にとっては非常に大事なメモです。
同じ問題で困っている人のお役に立てれば幸いです。

Discussion