summaryrefslogtreecommitdiffstats
path: root/site-lisp/indirect.el
blob: f49bdb565dc8cd7796544d1c3add9060445c9599 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
;; From http://www.emacswiki.org/cgi-bin/wiki.pl?IndirectBuffers

(defun indirect-buffer ()
  "Edit stuff in this buffer in an indirect buffer.
 The indirect buffer can have another major mode."
  (interactive)
  (let ((buffer-name (generate-new-buffer-name "*indirect*")))
    (pop-to-buffer (make-indirect-buffer (current-buffer) buffer-name))))

(defvar indirect-mode-name nil
  "Mode to set for indirect buffers.")
(make-variable-buffer-local 'indirect-mode-name)

(defun indirect-region (start end)
  "Edit the current region in another buffer.
 If the buffer-local variable `indirect-mode-name' is not set, prompt
 for mode name to choose for the indirect buffer interactively.
 Otherwise, use the value of said variable as argument to a funcall."
  (interactive "r")
  (let ((buffer-name (generate-new-buffer-name "*indirect*"))
        (mode
         (if (not indirect-mode-name)
             (setq indirect-mode-name
                   (intern
                    (completing-read
                     "Mode (default `org-mode'): "
                     (mapcar (lambda (e)
                               (list (symbol-name e)))
                             (apropos-internal "-mode$" 'commandp))
                     nil t nil nil "org-mode")))
           indirect-mode-name)))
    (pop-to-buffer (make-indirect-buffer (current-buffer) buffer-name))
    (funcall mode)
    (narrow-to-region start end)
    (goto-char (point-min))
    (shrink-window-if-larger-than-buffer)))

(provide 'indirect)