- edit-indirect 20170310.1002(in MELPA)
- Edit regions in separate buffers
概要
edit-indirect.el は、regionを別バッファで編集する機能を提供します。
使い方は、regionを指定し、 M-x edit-indirect-region を実行します。
すると、別ウィンドウにそのregionと同じ内容のバッファが出てくるので、
編集してC-c C-cを押して元のバッファに反映します。
編集を破棄するにはC-c C-kです。
似たような既存の機能は、 org-mode の SRCブロック を
編集する機能(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
Fig1: インラインCSSをcss-modeで編集
Fig2: インラインJavaScriptをjs2-modeで編集
本サイト内の関連パッケージ
- org - Outline-based notes management and organizer
- narrow-indirect - Narrow using an indirect buffer that is a clone
- web-mode - major mode for editing web templates
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。