バッファ間を手軽に行き来する

ここからhttp://q.hatena.ne.jp/1137478760
このサイトを発見!。便利そうなので少しいじって導入。
http://www-tsujii.is.s.u-tokyo.ac.jp/~yoshinag/tips/elisp_tips.html#buffer

変えたところ。

  • バッファ間の移動する処理に名前をつけた
    • goto-prev-buffer
    • goto-next-buffer
  • easy-buffer-move.elという名前で別のファイルに分けた(.emacsが長くなるのが嫌なので…)

作ったファイルはこんな感じ。(easy-buffer-move)

(defvar my-ignore-blst             ; 移動の際に無視するバッファのリスト
  '("*Help*" "*Compile-Log*" "*Mew completions*" "*Completions*"
     "*Apropos*" "*Buffer List*"));; "*Shell Command Output*"))
(defvar my-visible-blst nil)       ; 移動開始時の buffer list を保存
(defvar my-bslen 15)               ; buffer list 中の buffer name の最大長
(defvar my-blist-display-time 2)   ; buffer list の表示時間
(defface my-cbface                 ; buffer list 中で current buffer を示す face
  '((t (:foreground "wheat" :underline t))) nil)

(defun my-visible-buffers (blst)
  (if (eq blst nil) '()
    (let ((bufn (buffer-name (car blst))))
      (if (or (= (aref bufn 0) ? ) (member bufn my-ignore-blst))
          ;; ミニバッファと無視するバッファには移動しない
          (my-visible-buffers (cdr blst))
        (cons (car blst) (my-visible-buffers (cdr blst)))))))

(defun my-show-buffer-list (prompt spliter)
  (let* ((len (string-width prompt))
         (str (mapconcat
               (lambda (buf)
                 (let ((bs (copy-sequence (buffer-name buf))))
                   (when (> (string-width bs) my-bslen) ;; 切り詰め 
                     (setq bs (concat (substring bs 0 (- my-bslen 2)) "..")))
                   (setq len (+ len (string-width (concat bs spliter))))
                   (when (eq buf (current-buffer)) ;; 現在のバッファは強調表示
                     (put-text-property 0 (length bs) 'face 'my-cbface bs))
                   (cond ((>= len (frame-width)) ;; frame 幅で適宜改行
                          (setq len (+ (string-width (concat prompt bs spliter))))
                          (concat "\n" (make-string (string-width prompt) ? ) bs))
                         (t bs))))
               my-visible-blst spliter)))
    (let (message-log-max)
      (message "%s" (concat prompt str))
      (when (sit-for my-blist-display-time) (message nil)))))

(defun my-operate-buffer (pos)
  (unless (window-minibuffer-p (selected-window));; ミニバッファ以外で
    (unless (eq last-command 'my-operate-buffer)
      ;; 直前にバッファを切り替えてなければバッファリストを更新
      (setq my-visible-blst (my-visible-buffers (buffer-list))))
    (let* ((blst (if pos my-visible-blst (reverse my-visible-blst))))
      (switch-to-buffer (or (cadr (memq (current-buffer) blst)) (car blst))))
    (my-show-buffer-list (if pos "[-->] " "[<--] ") (if pos " > "  " < " )))
  (setq this-command 'my-operate-buffer))

;;元の設定
;;(global-set-key [?\C-,] (lambda () (interactive) (my-operate-buffer nil)))
;;(global-set-key [?\C-.] (lambda () (interactive) (my-operate-buffer t)))

(defun goto-prev-buffer () (interactive)
  (my-operate-buffer nil))

(defun goto-next-buffer () (interactive)
  (my-operate-buffer t))

(global-set-key [?\C-\;] 'goto-prev-buffer) 
(global-set-key [?\C-:] 'goto-next-buffer) 
;;"C-\;"と"C-:"で移動。
(provide 'easy-buffer-move)

.emacs

;;add-load-path
(add-to-list 'load-path "~/box/fuga/hoge)) ;;.elが格納されているディレクトリのパス

;;easy-buffle-move
(require 'easy-buffer-move)
(global-set-key [?\C-\;] 'goto-prev-buffer)
(global-set-key [?\C-:] 'goto-next-buffer)

すごく便利!!