Emacs shell mode 下自动更改buffer name 用于显示当前路径名称

原来的 M-x shell 只能启动一个shell 因为在启动 shell 的时候,如果发现已经有一个 叫做 shell 的 buffer ,就不再启动新的 shell, 而是直接跳转到 这个 buffer ,

我想启动很多shell 的话就 必须 M-x rename-buffer ,更改原来的 shell 的名字。 或者 C-u - M-x shell

shell 这样的 buffer 名字也没有提供任何信息。 也会被一些 switch buffer 的扩展,例如 sw-buff.el 给过滤掉,

于是我增加了如下的改动。

(make-variable-buffer-local 'wcy-shell-mode-directory-changed)
(setq wcy-shell-mode-directory-changed t)

(defun wcy-shell-mode-auto-rename-buffer-output-filter (text)
  (if (and (eq major-mode 'shell-mode)
           wcy-shell-mode-directory-changed)
      (progn
        (let ((bn  (concat "sh:" default-directory)))
          (if (not (string= (buffer-name) bn))
              (rename-buffer bn t)))
        (setq wcy-shell-mode-directory-changed nil))))


(defun wcy-shell-mode-auto-rename-buffer-input-filter (text)
  (if (eq major-mode 'shell-mode)
      (if ( string-match "^[ \t]*cd *" text)
          (setq wcy-shell-mode-directory-changed t))))
(add-hook 'comint-output-filter-functions 'wcy-shell-mode-auto-rename-buffer-output-filter)
(add-hook 'comint-input-filter-functions 'wcy-shell-mode-auto-rename-buffer-input-filter )

每一次输入在 shell 中执行完命令,就会自动更改 buffer 的名字,为当前目录, 如果 frame-title-format 是 "%n%F/%b" , %b 就可以在 frame title 上 打印当前目录的名字。