Fix indentation when wrapping a block around a region
* lisp/org.el (org-insert-structure-template): Indent like the first line, not the line the point happens to be on. Reported-by: stardiviner <numbchild@gmail.com> <http://lists.gnu.org/r/emacs-orgmode/2018-06/msg00107.html>
This commit is contained in:
parent
a0dacdc495
commit
3745c0af9f
52
lisp/org.el
52
lisp/org.el
|
@ -11849,36 +11849,36 @@ block."
|
||||||
(list (pcase (org--insert-structure-template-mks)
|
(list (pcase (org--insert-structure-template-mks)
|
||||||
(`("\t" . ,_) (read-string "Structure type: "))
|
(`("\t" . ,_) (read-string "Structure type: "))
|
||||||
(`(,_ ,choice . ,_) choice))))
|
(`(,_ ,choice . ,_) choice))))
|
||||||
(let* ((column (current-indentation))
|
(let* ((region? (use-region-p))
|
||||||
(region? (use-region-p))
|
|
||||||
(region-start (and region? (region-beginning)))
|
(region-start (and region? (region-beginning)))
|
||||||
(region-end (and region? (copy-marker (region-end))))
|
(region-end (and region? (copy-marker (region-end))))
|
||||||
(special? (string-match-p "\\`\\(src\\|export\\)\\'" type)))
|
(extended? (string-match-p "\\`\\(src\\|export\\)\\'" type))
|
||||||
|
(verbatim? (string-match-p
|
||||||
|
(concat "\\`" (regexp-opt '("example" "export" "src")))
|
||||||
|
type)))
|
||||||
(when region? (goto-char region-start))
|
(when region? (goto-char region-start))
|
||||||
(if (save-excursion (skip-chars-backward " \t") (bolp))
|
(let ((column (current-indentation)))
|
||||||
(beginning-of-line)
|
(if (save-excursion (skip-chars-backward " \t") (bolp))
|
||||||
(insert "\n"))
|
(beginning-of-line)
|
||||||
(save-excursion
|
|
||||||
(indent-to column)
|
|
||||||
(insert (format "#+begin_%s%s\n" type (if special? " " "")))
|
|
||||||
(when region?
|
|
||||||
(when (string-match-p (concat "\\`"
|
|
||||||
(regexp-opt '("example" "export" "src")))
|
|
||||||
type)
|
|
||||||
(org-escape-code-in-region (point) region-end))
|
|
||||||
(goto-char region-end)
|
|
||||||
;; Ignore empty lines at the end of the region.
|
|
||||||
(skip-chars-backward " \r\t\n")
|
|
||||||
(end-of-line))
|
|
||||||
(unless (bolp) (insert "\n"))
|
|
||||||
(indent-to column)
|
|
||||||
(insert (format "#+end_%s" (car (split-string type))))
|
|
||||||
(if (looking-at "[ \t]*$") (replace-match "")
|
|
||||||
(insert "\n"))
|
(insert "\n"))
|
||||||
(when (and (eobp) (not (bolp))) (insert "\n")))
|
(save-excursion
|
||||||
(if special? (end-of-line)
|
(indent-to column)
|
||||||
(forward-line)
|
(insert (format "#+begin_%s%s\n" type (if extended? " " "")))
|
||||||
(skip-chars-forward " \t"))))
|
(when region?
|
||||||
|
(when verbatim? (org-escape-code-in-region (point) region-end))
|
||||||
|
(goto-char region-end)
|
||||||
|
;; Ignore empty lines at the end of the region.
|
||||||
|
(skip-chars-backward " \r\t\n")
|
||||||
|
(end-of-line))
|
||||||
|
(unless (bolp) (insert "\n"))
|
||||||
|
(indent-to column)
|
||||||
|
(insert (format "#+end_%s" (car (split-string type))))
|
||||||
|
(if (looking-at "[ \t]*$") (replace-match "")
|
||||||
|
(insert "\n"))
|
||||||
|
(when (and (eobp) (not (bolp))) (insert "\n")))
|
||||||
|
(if extended? (end-of-line)
|
||||||
|
(forward-line)
|
||||||
|
(skip-chars-forward " \t")))))
|
||||||
|
|
||||||
|
|
||||||
;;;; TODO, DEADLINE, Comments
|
;;;; TODO, DEADLINE, Comments
|
||||||
|
|
|
@ -4123,6 +4123,12 @@ Text.
|
||||||
(org-mark-element)
|
(org-mark-element)
|
||||||
(org-insert-structure-template "foo")
|
(org-insert-structure-template "foo")
|
||||||
(buffer-string))))
|
(buffer-string))))
|
||||||
|
(should
|
||||||
|
(string= " #+begin_foo\n Line 1\n Line2\n #+end_foo\n"
|
||||||
|
(org-test-with-temp-text " Line 1\n Line2"
|
||||||
|
(org-mark-element)
|
||||||
|
(org-insert-structure-template "foo")
|
||||||
|
(buffer-string))))
|
||||||
;; Test point location.
|
;; Test point location.
|
||||||
(should
|
(should
|
||||||
(string= "#+begin_foo\n"
|
(string= "#+begin_foo\n"
|
||||||
|
|
Loading…
Reference in New Issue