分割窗口时控制Emacs行为

时间:2014-03-02 20:19:22

标签: emacs elisp

我想在Emacs中分割窗口时自定义行为:

我总是分手,因为我想与我目前正在编辑的那个人并排查看一个单独的缓冲区。

我使用electric-buffer-list(绑定到 C-x C-b )导航缓冲区。

我最终分别完成以下所有操作:

  1. C-x 3 水平分割。

  2. C-x o 切换到另一个窗口。

  3. C-x C-b 调用electric-buffer-list所以我可以选择我想要查看的缓冲区。

  4. 当我按 C-x 3 时,似乎我应该能够编写一个Elisp函数来执行所有这些操作。

    我发现this post描述了我想要的行为的焦点转换部分,但我不明白如何扩展答案以实现我想要做的所有事情。


    修改:在审核@ lawlist的帖子并调试我的语法之后,我想我想做这样的事情:

    (defun split-right-and-buffer-list ()
      (interactive)
      (split-window-horizontally)
      (other-window 0)
      (electric-buffer-list 0))
    
    (global-set-key (kbd "C-x 3") 'split-right-and-buffer-list)
    

    这会做我想要的一切,除了出现的缓冲区列表只列出当前缓冲区,而不是我从其键绑定调用electric-buffer-list时获得的所有缓冲区的正常列表。

2 个答案:

答案 0 :(得分:2)

通过一些非常小的修改,您提出的功能将满足您的需求:

(defun split-right-and-buffer-list ()
  (interactive)
  (split-window-horizontally)
  (other-window 1)
  (electric-buffer-list nil))

(global-set-key (kbd "C-x 3") 'split-right-and-buffer-list)
  1. 1而非0作为参数传递给other-window会导致Emacs选择因调用split-window-horizontally而创建的新窗口。

  2. nil而不是0作为参数传递给electric-buffer-list会导致Emacs显示所有缓冲区,而不仅仅是文件访问那些。

    可以在这里绊倒的事情是electric-buffer-list的文档中没有提到这一点(它没有包含有关ARG所需的任何信息)。但是当你查看这个命令的source code时,你会注意到它只是将参数的值传递给一个名为list-buffers-noselect的函数(并且不会将它用于还要别的吗)。该函数的文档包含上述缺失的信息。

答案 1 :(得分:1)

如果您不介意使用自定义命令来执行您想要的操作,请尝试以下功能

(require 'ido)

(defun my-split-window-open-buffer-right (buffer)
  (interactive (list (ido-read-buffer "Please select a buffer: ")))
  (select-window (split-window-right))
  (switch-to-buffer buffer))

(defun my-split-window-open-buffer-below (buffer)
  (interactive (list (ido-read-buffer "Please select a buffer: ")))
  (select-window (split-window-below))
  (switch-to-buffer buffer))

将它们绑定到你喜欢的键上。我更喜欢重新定义/建议我没有写过的函数。