自定义dired缓冲区的缓冲区名称

3
我希望在任何时候只有一个 dired 缓冲区处于活动状态,并且我想能够使用特定的热键将其置于前台。但是,为了做到这一点,我需要 dired 缓冲区始终具有相同的名称。但是,每次加载新目录时缓冲区名称都会更改。有没有办法告诉 dired 不要更改名称?我尝试调整读取和加载钩子,但没有成功。
另外,是否有命令可以将现有的 dired 缓冲区提前?
谢谢!

为什么不找到一个缓冲区,它的(eq major-mode 'dired-mode)而不是试图保持相同的名称?看一下这个链接中杀死所有dired模式缓冲区的代码 - 你可以修改它:http://www.emacswiki.org/emacs/KillingBuffers。也许在那里加入一个catch found throw found。 - lawlist
在正常的缓冲区名称前添加“dired:”可以使用正则表达式来识别任何dired缓冲区,同时仍然保持与目录的关联。我对这个选项非常感兴趣... - prosoitos
2个回答

4

您可能不希望这样做。一些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缓冲区,您还可以更高级地提示选择哪个。


0
尽管可能存在一些缺点,但以下代码可以实现您想要的功能:
(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缓冲区的原始名称和默认名称之间切换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接