11

next-bufferEmacsに簡単な変更を加えて、 andprevious-bufferコマンド(バインドしC-x <RIGHT>てバッファC-x <LEFT>をスキップする)を作成したいと思います。*Messages*

私はEmacs24とEmacsスターターキットを使用しています。

次の関連する質問と回答を読みましたが、それらは私が望むものではありません。

それらが機能しない理由のいくつかを次に示します。

  • できるだけシンプルにしたいと思います。構成の変更は少ないほど良いです。
  • 私は完全に殺したり防いだりしたくありません*Messages*
  • (add-to-list 'ido-ignore-buffers "^\*Messages\*"C-x b私の( )に役立ちますが、方法や動作ido-switch-bufferは変わりません。next-bufferprevious-buffer
4

4 に答える 4

16

このようにして、無限ループを回避できます。

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

everyをprevious-code-bufferに置き換えるだけで書けます。next-bufferprevious-buffer

于 2014-07-19T08:34:50.977 に答える
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)

文字列名の代わりに他の方法でバッファを比較できるかもしれませんが、それはうまくいきます。前のバッファのコードはほぼ同じです。アドバイス自体の内部で一度アドバイスをトリガーせずに元の関数を呼び出す方法があるかどうかもわかりませんが、後でバッファーの名前がテストされてもコードは機能します(単に1 つのバッファーであり、それがメッセージ バッファーです (一部のコードでは、バッファーが 1 つだけであるかどうかを確認して、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)
于 2013-01-14T17:53:49.643 に答える
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)

skippable-buffersI リスト以外のバッファーがない場合はハングするため、まだ素晴らしいとは言えません。C-gハックアラウンドとして発生した場合、私はループから抜け出すために使用します。

于 2013-01-24T21:51:25.227 に答える