让旁边的缓冲区的emacs跳过*消息*缓冲区(Make emacs next-buffer skip

2019-07-18 05:06发布

我想使一个简单的改变的Emacs使得next-bufferprevious-buffer命令(我已经绑定到Cx <RIGHT>Cx <LEFT>将跳过*Messages*缓冲液中。

我使用Emacs的24和Emacs的入门套件 。

我读过以下相关的问题和答案,但他们不是我想要的东西:

  • 循环缓冲区在Emacs:避免划伤和消息缓冲
  • Emacs的禁用*消息*缓冲区
  • 的Emacs Lisp缓冲区聚焦功能的?

下面是一些原因,为什么他们不工作:

  • 我想保持尽可能简单。 更少的配置变化是更好的。
  • 我不想杀死或防止*Messages*干脆。
  • (add-to-list 'ido-ignore-buffers "^\*Messages\*"用我的帮助Cx bido-switch-buffer ),但并不会改变next-bufferprevious-buffer的行为。

Answer 1:

我能想到的最简单的就是定义这两种功能的建议。 这是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)


Answer 2:

这样就可避免无限循环:

(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-bufferprevious-buffer



Answer 3:

这是我使用的是什么样的基础上,迭戈的回答:

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



Answer 4:

作为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)


文章来源: Make emacs next-buffer skip *Messages* buffer
标签: emacs elisp