(require 'cl-lib)
(require 'edit-indirect)
(defvar edit-indirect-guess-mode-alist
'(("" "" js2-mode)
("" "" 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")))))