我希望在任何时候只有一个 dired 缓冲区处于活动状态,并且我想能够使用特定的热键将其置于前台。但是,为了做到这一点,我需要 dired 缓冲区始终具有相同的名称。但是,每次加载新目录时缓冲区名称都会更改。有没有办法告诉 dired 不要更改名称?我尝试调整读取和加载钩子,但没有成功。
另外,是否有命令可以将现有的 dired 缓冲区提前?
谢谢!
另外,是否有命令可以将现有的 dired 缓冲区提前?
谢谢!
您可能不希望这样做。一些Dired功能取决于缓冲区名称与目录相关联。
更好的方法可能是拥有一个命令,该命令可以切换到唯一的Dired缓冲区,因为您一次只会拥有一个。
(defun switch-to-dired-buffer ()
"..."
(interactive)
(let ((dbufs (cl-remove-if-not
(lambda (bf)
(with-current-buffer bf
(derived-mode-p 'dired-mode)))
(buffer-list))))
(switch-to-buffer (car dbufs))))
如果有多个Dired缓冲区,您还可以更高级地提示选择哪个。
(setq dired-default-buffer-name "*Dired*")
(defun dired-set-default-buffer-name ()
"Set name of Dired buffer to `dired-default-buffer-name'.
If there already is a buffer with that name, kill it first."
(when (get-buffer dired-default-buffer-name)
(kill-buffer (get-buffer dired-default-buffer-name)))
(rename-buffer dired-default-buffer-name))
(defadvice dired (after dired-set-default-buffer-name activate compile)
"Set name of Dired buffer to default name when launching Dired."
(dired-set-default-buffer-name))
(defadvice dired-find-file (after dired-set-default-buffer-name activate compile)
"Set name of Dired buffer to default name when entering a subdirectory."
(when (eq major-mode 'dired-mode)
(dired-set-default-buffer-name)))
(defun dired-switch-to-default-buffer ()
"Bring up default Dired buffer."
(interactive)
(switch-to-buffer dired-default-buffer-name))
;; Set up global key binding for bringing up default Dired buffer:
(global-set-key (kbd "C-c C-d") 'dired-switch-to-default-buffer)
ido-mode
,则需要在第一个defadvice
中将dired
替换为ido-dired
。此外,dired-switch-to-default-buffer
不会检查您是否已经启动了Dired;如果您希望它也在这种情况下工作(例如通过在某个默认位置打开Dired),则需要稍微修改该函数。
编辑
如果你发现你实际上使用了依赖于Dired缓冲区名称与显示目录相关联的功能,你可以添加以下内容:
(setq dired-original-buffer-name nil)
(defun dired-restore-original-name ()
(rename-buffer dired-original-buffer-name))
(defun dired-toggle-name ()
(interactive)
(if (eq (buffer-name) dired-default-buffer-name)
(dired-restore-original-name)
(dired-set-default-buffer-name)))
(global-set-key (kbd "C-c C-t") 'dired-toggle-name)
...并将dired-set-default-buffer-name
修改为以下内容:
(defun dired-set-default-buffer-name ()
"Set name of Dired buffer to `dired-default-buffer-name'.
If there already is a buffer with that name, kill it first."
(when (get-buffer dired-default-buffer-name)
(kill-buffer (get-buffer dired-default-buffer-name)))
(setq dired-original-buffer-name (buffer-name)) ;; Keep track of original
;; buffer name so we can
;; restore it
(rename-buffer dired-default-buffer-name))
这将允许您通过按下相关的键绑定(当前为:C-c C-t,但您当然可以根据自己的需要进行修改)在Dired缓冲区的原始名称和默认名称之间切换。
(eq major-mode 'dired-mode)
而不是试图保持相同的名称?看一下这个链接中杀死所有dired模式缓冲区的代码 - 你可以修改它:http://www.emacswiki.org/emacs/KillingBuffers。也许在那里加入一个catch found throw found。 - lawlist