perspective 20160609.1444(in MELPA)
switch between named "perspectives" of the editor

概要

<2015-02-22 Sun> elscreen-separate-buffer-list.el(レビュー)
elscreenで同等のことを実現します。

<2015-02-13 Fri>更新
persp-mode.elは永続化されるなどより進化しています。
そちらを使うことをおすすめします。

perspective.el は、Emacsでワークスペースを実現します。

ワークスペースというと、ウィンドウマネージャーやデスクトップ環境で
用途別にウィンドウのレイアウトを切り替える機能です。

Emacsでワークスペースといえば、
ウィンドウ構成を切り替えるだけだと思いがちですが、
perspective.elはそれだけでなく、バッファリストも管理します。

つまり、現状のウィンドウ構成切り替えである

などよりも進化しています。

windows.elも一応バッファリストを管理していますが、
単に順番を管理しているだけです。

perspectiveとは「視点・見通し」という意味があり、
現在のワークスペースにおいて選択できるバッファを限定することで
現在のタスクに視点を集中し、見通しを良くします。

こうすることで、Emacs内で複数のプロジェクトを動かしているときに、
そのプロジェクトに集中できるようになります。

バッファリストの管理について気になったのでコードを読んだところ、
idoのバッファ選択の制御と read-buffer-function の設定を
行っていることがわかりました。

helmでのバッファ選択(M-x helm-buffers-listhelm-source-buffers-list) は、
idoのバッファリストを呼び出しているので、perspective.elはhelmにも対応しています。

anythingでのバッファ選択や標準のC-x C-bは、
idoではなくて直接 (buffer-list) を呼んでいるので
すべてのバッファが見えます。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてperspectiveを使う方は
以下のコマンドを実行します。

M-x package-install perspective

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name perspective

設定 150128071612.perspective.1.el(以下のコードと同一)

(require 'perspective)
(persp-mode 1)
;;; モードラインに現在のみのperspective名を表示させるように再定義
(defun persp-update-modestring ()
  (when persp-show-modestring
    (setq persp-modestring
          (list (nth 0 persp-modestring-dividers)
                (persp-name persp-curr)
                (nth 1 persp-modestring-dividers)))))

(defun persp-register-buffers-on-create ()
  (interactive)
  (dolist (bufname (condition-case _
                       (helm-comp-read
                        "Buffers: "
                        (mapcar 'buffer-name (buffer-list))
                        :must-match t
                        :marked-candidates t)
                     (quit nil)))
    (persp-add-buffer (get-buffer bufname))))
(add-hook 'persp-created-hook 'persp-register-buffers-on-create)

実行方法

$ wget http://rubikitch.com/f/150128071612.perspective.1.el
$ emacs -Q -f package-initialize -l 150128071612.perspective.1.el

persp-modeを有効にした時点で、mainというワークスペースが作成されます。

新しいワークスペースを作ったり切り替えるには
C-x x s (persp-switch) を使います。

現在のワークスペースを削除するには C-x x c (persp-kill) を使います。

この2つさえ知っていればとりあえず使えます。

タスクを始めるために新しいワークスペースを作ると、
そのワークスペース専用の*scratch*バッファが作成され、
他のバッファがすべてリストから見えなくなります。

そこで、新しいワークスペースを作成するときに、
ワークスペースに取り込みたいバッファをhelm選択できるようにしました。

C-SPCで複数個選択できます。

もし、ワークスペース作成時にバッファを取り込んでいない場合は、
C-x C-fや recentf (M-x helm-miniM-x helm-for-files 等)から
選択します。

20150128083721.png
Fig1: data.c/window.c/files.el/window.elを開いている状態

20150128083736.png
Fig2: C-x x sでcというperspectiveを作成し、C-SPCで2つのcバッファを選択

20150128083750.png
Fig3: 最初は *scratch*(c) バッファが作成される

20150128083814.png
Fig4: helmのバッファリストからは2つのcバッファと*scratch*(c)しか見えない

その後、C-x x s mainを実行すると、
mainのウィンドウ構成が復元され、Fig1に戻ります。

同様にC-x x s elでelバッファのみのワークスペースも作成できます。

20150128084217.png
Fig5: idoにも対応!

本サイト内の関連パッケージ


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。