persp-mode 20170509.829(in MELPA)
windows/buffers sets shared among frames + save/load.

概要

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

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

perspective.el(レビュー) との違いは、
それぞれのperspectiveが永続化できることです。

Emacs再起動時には開かれているファイルバッファが復元されます。

つまり、save-visited-files.el(レビュー) の機能も含んでいます。

また、perspective.elでのバグが取り除かれているようです。

perspective.elもpersp-mode.elも M-x persp-mode と同じ名前なので、
使う際にはperspective.elは削除してください。

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

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

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

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

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

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

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

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

helmでのバッファ選択(M-x helm-buffers-listhelm-source-buffers-list) は、
idoのバッファリストを呼び出しているので、persp-mode.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/")))

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

M-x package-install persp-mode

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

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

設定 150213062623.persp-mode.el(以下のコードと同一)

(setq persp-keymap-prefix (kbd "C-c p")) ;prefix
(setq persp-add-on-switch-or-display t) ;バッファを切り替えたら見えるようにする
(persp-mode 1)
(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-activated-hook 'persp-register-buffers-on-create)

実行方法

$ wget http://rubikitch.com/f/150213062623.persp-mode.el
$ emacs -Q -f package-initialize -l 150213062623.persp-mode.el

persp-modeを有効にした時点で、noneというワークスペースが作成されます。
(perspective.elではmainという名前)

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

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

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

タスクを始めるために新しいワークスペースを作ると、
*scratch*バッファに切り替わり、
(perspective.elではperspective専用のscratchバッファになる)
他のバッファがすべてリストから見えなくなります。

そこで、新しいワークスペースを作成するときに、
ワークスペースに取り込みたいバッファをhelm選択できるようにしました。
(フックの名前が変更されただけでperspectiveでの設定が使える)

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-c p sでcというperspectiveを作成し、C-SPCで2つのcバッファを選択

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

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

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

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

20150128084217.png
Fig5: idoにも対応!

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


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