在新的临时窗口中打开缓冲区菜单

时间:2013-12-27 07:50:48

标签: emacs buffer elisp

有没有办法自定义buffer-menu的行为,使其模仿list-buffers命令?

我真正想要的是在新的Emacs窗口中打开buffer-menu,选择所需的缓冲区后,buffer-menu窗口关闭,前一个窗口切换到选定的缓冲区。 / p>

我已经查看了各种解决方案,例如ibuffer,我尝试编写Elisp来执行此操作,但是我无法从菜单缓冲区中选择用户。有没有办法获得这个价值?或者,有没有办法等到用户通过键盘或鼠标点击在menu-buffer中进行选择?

2 个答案:

答案 0 :(得分:1)

[此答案的文字最初由irrelephant编写]

我能够使用buffer-menu-other-window拆分框架并使用以下绑定获得所需的行为:

(define-key Buffer-menu-mode-map (kbd "RET") 'Buffer-menu-1-window)
(define-key Buffer-menu-mode-map [mouse-2] 'Buffer-menu-1-window)

虽然如果您只使用一个窗口,上面的工作正常,但是当您尝试它并且您已经在使用拆分窗口时,它会中断。在这种情况下,需要进一步调整:

(defun my-buffer-menu (arg)
  (interactive "P")
  (split-window-below)
  (other-window 1)
  (buffer-menu))

(defun my-buffer-menu-1-window ()
  (interactive)
  (let ((target-buffer (Buffer-menu-buffer t)))
    (delete-window)
    (switch-to-buffer target-buffer)))

(define-key Buffer-menu-mode-map (kbd "RET") 'my-buffer-menu-1-window)
(define-key Buffer-menu-mode-map [mouse-2] 'my-buffer-menu-1-window)

答案 1 :(得分:0)

  

有没有办法自定义'buffer-menu'

可以使用所有Emacs扩展和自定义机制。例如,您可以在buffer-menu-other-frame存在的基础上定义名为buffer-menu-other-window的函数:

(defun buffer-menu-other-frame (&optional arg)
  "Display the Buffer Menu in another frame.
See `buffer-menu' for a description of the Buffer Menu.

By default, all buffers are listed except those whose names start
with a space (which are for internal use).  With prefix argument
ARG, show only buffers that are visiting files."
  (interactive "P")
  (switch-to-buffer-other-frame (list-buffers-noselect arg))
  (message
   "Commands: d, s, x, u; f, o, 1, 2, m, v; ~, %%; q to quit; ? for help."))

然后,您可以在按 RET 时定义一个宏来执行您想要的操作。然后将此宏与buffer-menu-mode中的 RET 相关联。