原来的 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 上 打印当前目录的名字。