2014/09/15

Emacsのnext-buffer/previous-bufferで*(アスタリスク)を含むbufferを飛ばす

 Emacsでbufferを移動する際にnext-bufferとprevious-bufferを使っているのですが, アスタリスクの入ったbuffer(*scratch*や*Completions*, *Message* ,*auto-install ...etc)が頻繁に表示されます. 鬱陶しいなと思っていたのですが, そのまま放置していました.
 アスタリスクを飛ばすnext/previous-bufferは書いてみると結構そのまんまでした.

(defun asterisked? (buf-name)
  (= 42 (car (string-to-list buf-name))))

(defun move-to-scratch ()
  (interactive)
  (let ((current-buffer-name (buffer-name)))
    (next-buffer)
    (while (and (not (string= "*scratch*" (buffer-name)))
                (not (string= current-buffer-name (buffer-name))))
      (next-buffer))))

(defun next-buffer-with-skip* ()
  (interactive)
  (let ((current-buffer-name (buffer-name)))
    (next-buffer)
    (while (and (asterisked? (buffer-name))
                (not (string= current-buffer-name (buffer-name))))
      (next-buffer))))

(defun previous-buffer-with-skip* ()
  (interactive)
  (let ((current-buffer-name (buffer-name)))
    (previous-buffer)
    (while (and (asterisked? (buffer-name))
                (not (string= current-buffer-name (buffer-name))))
      (previous-buffer))))
 こんな感じ.
 これに, 以下のように適当なキーバインドを割り当てればOKです.
(global-set-key "\C-z\C-e" 'previous-buffer-with-skip*)
(global-set-key "\C-z\C-a" 'next-buffer-with-skip*)
 私の環境では, C-zはunsetしているので\C-z\C-eと\C-z\C-aに割り当てていますが, "\C-z\C-e"と"\C-z\C-a"の部分には, 任意の適当なキーを割り当てられます.
 また, このままだと, *scratch*へ移動できないことがあるので, scratchへ移動するため, move-to-scratchを書いています. M-x move-to-scratchで, *scratch*バッファへ移動できます. shell/eshellへは, それぞれ, M-x shellや, M-x eshellで移動できます. これらは, global-set-keyなどでキーバインドしても移動できます.

 使ってみると, 結構快適です.

0 件のコメント :