Buffer

Scratch bufferを付箋として使う

Alt Text

Emacsのscratchバッファーを簡易メモとして使うために作られたパッケージはいくつかありますが、設定だけで実現できる簡単なものを紹介します。必要な手順は以下の通りです。

  1. Scratch buffer を kill させない。
  2. Scratch buffer の内容を記憶させる。
  3. ワンキーで Scratch bufferを表示させる。

Scratch buffer を kill させない

特にpackageを導入せずともemacsの標準機能で実現できます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Set buffer that can not be killed.

(with-current-buffer "*scratch*"
  (emacs-lock-mode 'kill))

設定反映後、scratch bufferを kill-buffer すると Buffer "*scratch*" is locked and cannot be killed とmessageがでます。

Scratch buffer の内容を記憶させる

persistent-scratch というpackageもありますが、大方のemacserは使っていると思う auto-save-buffers-enhanced の設定で実現できます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; auto-save-buffers-enhanced

(setq auto-save-buffers-enhanced-quiet-save-p t)
;; scratch bufferを `~/.emacs.d/scratch` に保存
(setq auto-save-buffers-enhanced-save-scratch-buffer-to-file-p t)
(setq auto-save-buffers-enhanced-file-related-with-scratch-buffer
      (locate-user-emacs-file "scratch"))
(auto-save-buffers-enhanced t)

ワンキーで Scratch bufferを表示させる

popwinの機能を使います。my:pop-scratch を起動するとscratch bufferがpopupします。メモしたあと C-g で隠せるので便利です。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Popup the scratch buffer

(bind-key
 "s-x"
 (defun my:pop-scratch ()
   "Popup the scratch buffer."
   (interactive)
   (setq popwin:special-display-config '("*scratch*"))
   (display-buffer "*scratch*")))

Emacsのウインドウ操作の履歴をUndo/Redoする:winner-mode

emacsでいろいろ作業していると意図しない形で勝手にウインドウズが分割されたりします。設定して “C-g” で隠せるものもありますが、それも出来ないときは、“C-x 0” や “C-x 1” のお世話になります。

(winner-mode)
(bind-key "C-<left>" 'winner-undo)
(bind-key "C-<right>" 'winner-redo)
(winner-mode)
(bind-key "C-c <left>" 'winner-undo)
(bind-key "C-c <right>" 'winner-redo)

Scratch bufferをKILLさせない:emacs-lock-mode

わざわざscratch bufferをkillする人はいないと思いますが、“kill-other-windows” などを定義していると、うっかりscratchも一緒に消えてしまって困ることがありますね。

あやまってscratch killしたら新しいscratchを自動再生してくれるとか、kill出来ないようにする…というTipsも多いのですが、そんな回りくどいことをしなくてEmacsの標準機能だけて簡単に対応できることがわかりました。

emacs-lock-mode を使う##

パッケージも何もいりません。下記を設定してみてください。私は *Messages* も一緒に設定しています。

;; Set buffer that can not be killed.
(with-current-buffer "*scratch*"
  (emacs-lock-mode 'kill))
(with-current-buffer "*Messages*"
  (emacs-lock-mode 'kill))

この選定を有効にしたあとscratchをkill bufferしようとすると、

Buffer "*scratch*" is locked and cannot be killed

と叱られます。つまりkillされないようにロックが掛けられるのです。 emacs-lock-mode というのはもともとemacsの内蔵コマンドにあるのです。

Scratchを自動保存する

私もそうなのですが、ちょこっとした付箋的なメモをするためにscratchを使うという人も多いと思います。そんな人には、Emacsを再起動させても終了前のscratchが復帰してほしい…というニーズがあります。こうした目的のためのパッケージも何種類かありますが、私は、auto-seve-buffers-enhanced.el の機能を流用しています。このパッケージを使っているEmacserは多いと思うので、わざわざ専用のパッケージを使わずともscratchの保存再生が可能になります。

(use-package auto-save-buffers-enhanced)
;; Suppress Wrote's message
(setq auto-save-buffers-enhanced-quiet-save-p t)
;; Scratch buffer is also saved automatically
(setq auto-save-buffers-enhanced-save-scratch-buffer-to-file-p t)
(setq auto-save-buffers-enhanced-file-related-with-scratch-buffer "~/Dropbox/etc/emacs/scratch")
(auto-save-buffers-enhanced t)

scratchを瞬時にpopup表示させる

scratch-pop という便利なパッケージもあるのですが、私にとって余り必要と思わない機能もついているのでシンプルに設定を書いてみました。

popwinを導入した上で下記をinitファイルに書き、適当なキーバインドを設定すると一発でscratch bufferがpopupし、“C-g” で隠れてくれます。

(defun my:pop-scratch ()
  "Popup the scratch buffer."
  (interactive)
  (setq popwin:special-display-config '(("*scratch*")))
  (display-buffer "*scratch*"))

どんな使い方をしているか

簡単なelispの評価にscratchを使うのは当然ですが、私の場合、なにか調べたいキーワードをscratchにちょこっと書いてsearch-webで即検索…というような使い方を良くします。参考に私のhydra-search-webの設定にリンクを張っておきます。

Scratchバッファの保存と復元

Scratchバッファはkillさせない。Scratchバッファーの内容を保存して再起動時に復元する。 これを実現させるための Emacs-lisp は沢山紹介されていますが、MELPAからpackage-installするだけで簡単に導入できるので紹介します。

タブを使わない究極のバッファー移動

Emacsのバッファー移動は、tabbar / ELscreen などのタブ系を使っていましたが、diredなどの隠れていてほしいバッファーまで開いてしまうのが嫌でした。 そんなときに、るびきちさんのこの記事を読んでiflipb.elを試してみましたのでレポートします。

Emacsの不要なバッファーを自動的にkillする

Emacsのbufferをtabで切り替えるのはあまり好きでないので switch-buffer の機能を使っているが、magitやdired関係の不要なバッファーが沢山増えていくと煩わしくなる。

手動で削除すれば済む話ではあるが、やっぱり自動化したい。MELPAでいろいろpackageを探したが適当なものがなく、ググっていたら下記の記事を見つけました。