我想在Emacs中分割窗口时自定义行为:
我总是分手,因为我想与我目前正在编辑的那个人并排查看一个单独的缓冲区。
我使用electric-buffer-list
(绑定到 C-x C-b )导航缓冲区。
我最终分别完成以下所有操作:
C-x 3 水平分割。
C-x o 切换到另一个窗口。
C-x C-b 调用electric-buffer-list
所以我可以选择我想要查看的缓冲区。
当我按 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
时获得的所有缓冲区的正常列表。
答案 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
而非0
作为参数传递给other-window
会导致Emacs选择因调用split-window-horizontally
而创建的新窗口。
将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))
将它们绑定到你喜欢的键上。我更喜欢重新定义/建议我没有写过的函数。