edit-indirect 20170310.1002(in MELPA)
Edit regions in separate buffers

概要

edit-indirect.el は、regionを別バッファで編集する機能を提供します。

<2015-01-07 Wed> 同じメジャーモードなら narrow-indirect(レビュー) を。

使い方は、regionを指定し、 M-x edit-indirect-region を実行します。

すると、別ウィンドウにそのregionと同じ内容のバッファが出てくるので、
編集してC-c C-cを押して元のバッファに反映します。

編集を破棄するにはC-c C-kです。

似たような既存の機能は、 org-modeSRCブロック
編集する機能(org-babel)です。

org-modeでC-c 'を押すとそのsrcブロックを適切な
メジャーモードの別バッファで編集できますが、
edit-indirect.elはそれを任意のバッファで
行えるようにするものです。

名前はindirectと名乗っていますが、 M-x make-indirect-buffer
M-x clone-indirect-buffer とは何の関係もありません。

それら 間接バッファ は編集したと同時に元のバッファに編集が反映されますが、
M-x edit-indirect-regionはC-c C-cを押したときに初めて反映されます。

デフォルトの状態ではfundamental-modeになっているので、
M-x edit-indirect-region実行後は何かのメジャーモードを
設定するでしょう。

ここだけ見ればあまり役に立たなさそうですが、
複数の言語が混在したファイルを編集するときに役立ちます。

例として、インラインCSSやJavaScriptを編集するコマンド
M-x edit-indirect-dwim を用意しました。

edit-indirect-guess-mode-alist を設定すれば、
他の言語にも対応できます。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.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/")))

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

M-x package-install edit-indirect

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

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

設定 141203051005.edit-indirect-css-js.el(以下のコードと同一)

(require 'cl-lib)
(require 'edit-indirect)
(defvar edit-indirect-guess-mode-alist
  '(("<script.*>"  "</script.*>" js2-mode)
    ("<style.*>"  "</style.*>" css-mode))
  "(開始正規表現 終了正規表現 メジャーモード) のリスト。
開始正規表現の後から終了正規表現の前までが
edit-indirect-regionが適用されます。")
(defun edit-indirect-guess-mode-at-point ()
  (cl-loop with s
           with e
           with region-start
           with region-end
           with pt = (point)
           for (start end mode) in
           edit-indirect-guess-mode-alist
           when
           (save-excursion
             (setq s (re-search-backward start nil t)
                   region-start (match-end 0))
             (setq e (re-search-forward end nil t)
                   region-end (match-beginning 0))
             (and s e (< s pt e)))
           return (list mode region-start region-end)))
(defun edit-indirect-dwim (s e)
  (interactive "r")
  (let (it)
    (cond ((region-active-p)
           (edit-indirect-region s e t))
          ((setq it (edit-indirect-guess-mode-at-point))
           (edit-indirect-region (nth 1 it) (nth 2 it) t)
           (funcall (car it)))
          (t
           (user-error "No region")))))

実行方法

$ wget http://rubikitch.com/f/141203051005.edit-indirect-css-js.el
$ emacs -Q -f package-initialize -l 141203051005.edit-indirect-css-js.el

20141203054152.png
Fig1: インラインCSSをcss-modeで編集

20141203054217.png
Fig2: インラインJavaScriptをjs2-modeで編集

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


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