我想提出一个简单的改变Emacs的,以便next-buffer和previous-buffer我所绑定于命令(C-x <RIGHT>和C-x <LEFT>将跳过*Messages*缓冲区.
我正在使用Emacs 24和Emacs入门套件.
我已经阅读了以下相关问题和答案,但它们不是我想要的:
以下是它们不起作用的一些原因:
*Messages*完全杀死或阻止.(add-to-list 'ido-ignore-buffers "^\*Messages\*"帮助我C-x b(ido-switch-buffer)但不改变方式next-buffer和previous-buffer行为.小智 14
这样你就可以避免无限循环:
(defun next-code-buffer ()
(interactive)
(let (( bread-crumb (buffer-name) ))
(next-buffer)
(while
(and
(string-match-p "^\*" (buffer-name))
(not ( equal bread-crumb (buffer-name) )) )
(next-buffer))))
(global-set-key [remap next-buffer] 'next-code-buffer)
Run Code Online (Sandbox Code Playgroud)
此代码循环遍历非星号缓冲区("^\*").对于你的情况(只有避免*Messages*)它将是:
(defun next-code-buffer ()
(interactive)
(let (( bread-crumb (buffer-name) ))
(next-buffer)
(while
(and
(equal "*Messages*" (buffer-name))
(not ( equal bread-crumb (buffer-name) )) )
(next-buffer))))
(global-set-key [remap next-buffer] 'next-code-buffer)
Run Code Online (Sandbox Code Playgroud)
你可以写previous-code-buffer只是更换所有的next-buffer用previous-buffer.
我能想到的最简单的方法是为这两个函数定义一个建议.这是为了next-buffer.同样也适用于previous-buffer.您还可以定义配置变量以启用/禁用行为(或激活/取消激活建议):
(defadvice next-buffer (after avoid-messages-buffer-in-next-buffer)
"Advice around `next-buffer' to avoid going into the *Messages* buffer."
(when (string= "*Messages*" (buffer-name))
(next-buffer)))
;; activate the advice
(ad-activate 'next-buffer)
Run Code Online (Sandbox Code Playgroud)
也许您可以用其他方式比较缓冲区而不是字符串名称,但这样可行.先前缓冲区的代码几乎相同.我不知道是否有一种方法可以调用原始函数而不会在通知本身内部触发建议,但同样,即使缓冲区的名称在之后进行测试,代码也会起作用(如果你只是一个缓冲区,它是消息缓冲区;一些代码可以检查是否只有一个缓冲区而不再调用next-buffer).
如果您想使用执行相同操作的独立函数:
(defun my-next-buffer ()
"next-buffer, only skip *Messages*"
(interactive)
(next-buffer)
(when (string= "*Messages*" (buffer-name))
(next-buffer)))
(global-set-key [remap next-buffer] 'my-next-buffer)
(global-set-key [remap previous-buffer] 'my-next-buffer)
Run Code Online (Sandbox Code Playgroud)
根据迭戈的回答,这就是我正在使用的内容:
(setq skippable-buffers '("*Messages*" "*scratch*" "*Help*"))
(defun my-next-buffer ()
"next-buffer that skips certain buffers"
(interactive)
(next-buffer)
(while (member (buffer-name) skippable-buffers)
(next-buffer)))
(defun my-previous-buffer ()
"previous-buffer that skips certain buffers"
(interactive)
(previous-buffer)
(while (member (buffer-name) skippable-buffers)
(previous-buffer)))
(global-set-key [remap next-buffer] 'my-next-buffer)
(global-set-key [remap previous-buffer] 'my-previous-buffer)
Run Code Online (Sandbox Code Playgroud)
它还不是很好,因为如果skippable-buffersI列表之外没有其他缓冲区,它将挂起。我用C-g破环了,当它发生的hackaround。
| 归档时间: |
|
| 查看次数: |
1542 次 |
| 最近记录: |