本日の小技

バッファ操作のあれこれ。
定番のiswitchb-modeと自作のバッファ切り替えやら作成やらの関数の定義。
自作関数はいろいろ定義しているけど主にcopy-buffer-other-frameしか使ってないな。カレントバッファのコピーバッファをもう一個つくって別のウィンドウに表示するだけの関数なんだけど、ファイルの別々の所を見ながら編集するのに便利でよく使ってる。

; Buffer switching
(iswitchb-mode t)
(global-set-key "\C-x\C-b" 'ibuffer)
(defadvice switch-to-buffer (before strict-buffer-name activate)
  (interactive (list (read-buffer "Switch to buffer: " (other-buffer) t))))
(defadvice switch-to-buffer-other-window (before strict-buffer-name activate)
  (interactive (list (read-buffer "Switch to buffer in other window: " (other-buffer) t))))
(defadvice switch-to-buffer-other-frame (before strict-buffer-name activate)
  (interactive (list (read-buffer "Switch to buffer in other frame: " (other-buffer) t))))
(defun make-buffer (buffer-name)
  (interactive (list (read-buffer "New buffer: " nil nil)))
  (switch-to-buffer (get-buffer-create buffer-name)))
(defun make-buffer-other-window (buffer-name)
  (interactive (list (read-buffer "New buffer: " nil nil)))
  (switch-to-buffer-other-window (get-buffer-create buffer-name)))
(defun make-buffer-other-frame (buffer-name)
  (interactive (list (read-buffer "New buffer: " nil nil)))
  (switch-to-buffer-other-frame (get-buffer-create buffer-name)))
(defun duplicate-buffer (base-buffer-name)
  (let ((base-buffer (get-buffer base-buffer-name)))
    (let ((default-major-mode (cdr (assq 'major-mode
					 (buffer-local-variables base-buffer))))
	  (copy-buffer (make-indirect-buffer base-buffer
					     (generate-new-buffer-name
					      (concat "*" base-buffer-name " (copy)*")))))
      (set-buffer-major-mode copy-buffer)
      copy-buffer)))
(defun copy-buffer (base-buffer-name)
  (interactive (list (buffer-name)))
  (switch-to-buffer (duplicate-buffer base-buffer-name)))
(defun copy-buffer-other-window (base-buffer-name)
  (interactive (list (buffer-name)))
  (switch-to-buffer-other-window (duplicate-buffer base-buffer-name)))
(defun copy-buffer-other-frame (base-buffer-name)
  (interactive (list (buffer-name)))
  (switch-to-buffer-other-frame (duplicate-buffer base-buffer-name)))