ansi-termを使ってターミナルエミュレータを起動していたが、引数を直接渡せないなどの細かい挙動が気になりだした。 考えつく限り自分の要求に合うように関数の挙動を変更した。

  • 起動ごとに新たなプロセスとバッファを作成する。

  • ただしすでに同じものがある場合、何もしない。

  • バッファ名は実行しているコマンドとワーキングディレクトリで特定できるようにする。

  • 同一コマンド同一ディレクトリの場合、同じような作業をやっているとみなして同一視する。

(require 'term)

(defun symdon-shell-command (line &optional cwd)
  (interactive (list
		(read-string "Command: " "" 'our-async-exec-cmd-history "")
		(read-directory-name "Directory: " default-directory 'our-async-exec-cwd-history default-directory)))
  (let ((default-directory cwd))
    (switch-to-buffer
     (funcall #'term-ansi-make-term
	      (format "%s: In %s" cmd (expand-file-name cwd))
	      "bash" nil "-c" line))))

C-t C-c にバインドして使っている。