我想使一个简单的改变的Emacs使得next-buffer
和previous-buffer
命令(我已经绑定到Cx <RIGHT>
和Cx <LEFT>
将跳过*Messages*
缓冲液中。
我使用Emacs的24和Emacs的入门套件 。
我读过以下相关的问题和答案,但他们不是我想要的东西:
- 循环缓冲区在Emacs:避免划伤和消息缓冲
- Emacs的禁用*消息*缓冲区
- 的Emacs Lisp缓冲区聚焦功能的?
下面是一些原因,为什么他们不工作:
- 我想保持尽可能简单。 更少的配置变化是更好的。
- 我不想杀死或防止
*Messages*
干脆。 -
(add-to-list 'ido-ignore-buffers "^\*Messages\*"
用我的帮助Cx b
( ido-switch-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)
也许你可以在一些其他的方式,而不是它的字符串名称比较缓冲区,但将正常工作。 对于前一个缓冲区的代码几乎是相同的。 我也不知道是否有调用原有的功能,而不一旦触发建议本身内部意见的一种方式,但同样,代码将工作,即使缓冲区的名字后进行测试,如果你只是(将失败一个缓冲区,它是消息缓冲区;一些代码,可以检查是否只有一个缓冲区,不叫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)
这样就可避免无限循环:
(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)
这段代码循环对非星级缓冲区( "^\*"
)。 对于你的情况(既避免*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)
你可以写previous-code-buffer
刚刚替换每个next-buffer
与previous-buffer
。
这是我使用的是什么样的基础上,迭戈的回答:
(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)
这是不是很大呢,因为如果没有比其他缓冲区它将挂断skippable-buffers
我列出。 我用Cg
打出来的循环,当它发生的hackaround。
作为RubenCaro的回答指出,其他的答案可以进入无限循环。 我想到了一个可跳过的缓冲区列表的大卫·詹姆斯的做法是更好一点,虽然,所以这里的一个变种。
(setq my-skippable-buffers '("*Messages*" "*scratch*" "*Help*"))
(defun my-change-buffer (change-buffer)
"Call CHANGE-BUFFER until current buffer is not in `my-skippable-buffers'."
(let ((initial (current-buffer)))
(funcall change-buffer)
(let ((first-change (current-buffer)))
(catch 'loop
(while (member (buffer-name) my-skippable-buffers)
(funcall change-buffer)
(when (eq (current-buffer) first-change)
(switch-to-buffer initial)
(throw 'loop t)))))))
(defun my-next-buffer ()
"`next-buffer' that skips `my-skippable-buffers'."
(interactive)
(my-change-buffer 'next-buffer))
(defun my-previous-buffer ()
"`previous-buffer' that skips `my-skippable-buffers'."
(interactive)
(my-change-buffer 'previous-buffer))
(global-set-key [remap next-buffer] 'my-next-buffer)
(global-set-key [remap previous-buffer] 'my-previous-buffer)