make emacs next-buffer skip*Messages*buffer

Dav*_* J. 9 emacs elisp

我想提出一个简单的改变Emacs的,以便next-bufferprevious-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-bufferprevious-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-bufferprevious-buffer.

  • 谢谢你,\ Helm ......\*缓冲真的让我很生气. (2认同)

Die*_*lla 7

我能想到的最简单的方法是为这两个函数定义一个建议.这是为了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)

  • 我会避免使用`defadvice`来执行你无法控制谁会调用它们的函数.在这种情况下,我会定义新的函数并将它们绑定到有问题的键,这样你就可以确定不会产生不必要的副作用. (5认同)

Dav*_* J. 5

根据迭戈的回答,这就是我正在使用的内容:

(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。