org-capture: Better indentation when creating a new list

lisp/org-capture.el (org-capture-place-item): When starting a new list
use org-indent-line to establish the correct indentation rather than
just using 0.

Creating an entry in org-capture-templates of type item adds entries
into a list, however, currently, if the list is empty then the first
list item will always be indented to depth 0 (so hard on the left),
which looks like this:

  * Top Level
  ** Second Level
  - item #1
  - item #2
  - item #3

This is fine if org-adapt-indentation is nil, however, with the
default value of t lists should be indented more like this:

  * Top Level
  ** Second Level
     - item #1
     - item #2
     - item #3

The patch below changes org-capture-place-item so that, when starting
a new list, the items are indented as above.

Care is taken to preserve two features of the existing behaviour,
first, when adding to an existing list, new items are indented to
match the items already in the list.  And secondly, when there is some
introductory text before the list new items are inserted after the
text, like this:

  * Top Level
  ** Second Level
     This is some introductory text:
     - item #1
     - item #2
     - item #3

TINYCHANGE
This commit is contained in:
Andrew Burgess 2014-10-07 16:59:23 +01:00 committed by Nicolas Goaziou
parent bc342011e9
commit 587280ea68

View file

@ -1075,21 +1075,18 @@ may have been stored before."
(t
(setq beg (1+ (point-at-eol))
end (save-excursion (outline-next-heading) (point)))))
(setq ind nil)
(if (org-capture-get :prepend)
(progn
(goto-char beg)
(if (org-list-search-forward (org-item-beginning-re) end t)
(progn
(goto-char (match-beginning 0))
(setq ind (org-get-indentation)))
(goto-char end)
(setq ind 0)))
(when (org-list-search-forward (org-item-beginning-re) end t)
(goto-char (match-beginning 0))
(setq ind (org-get-indentation))))
(goto-char end)
(if (org-list-search-backward (org-item-beginning-re) beg t)
(progn
(setq ind (org-get-indentation))
(org-end-of-item))
(setq ind 0))))
(when (org-list-search-backward (org-item-beginning-re) beg t)
(setq ind (org-get-indentation))
(org-end-of-item)))
(unless ind (goto-char end)))
;; Remove common indentation
(setq txt (org-remove-indentation txt))
;; Make sure this is indeed an item
@ -1097,17 +1094,22 @@ may have been stored before."
(setq txt (concat "- "
(mapconcat 'identity (split-string txt "\n")
"\n "))))
;; Prepare surrounding empty lines.
(org-capture-empty-lines-before)
(setq beg (point))
(unless (eolp) (save-excursion (insert "\n")))
(unless ind
(org-indent-line)
(setq ind (org-get-indentation))
(delete-region beg (point)))
;; Set the correct indentation, depending on context
(setq ind (make-string ind ?\ ))
(setq txt (concat ind
(mapconcat 'identity (split-string txt "\n")
(concat "\n" ind))
"\n"))
;; Insert, with surrounding empty lines
(org-capture-empty-lines-before)
(setq beg (point))
;; Insert item.
(insert txt)
(or (bolp) (insert "\n"))
(org-capture-empty-lines-after 1)
(org-capture-position-for-last-stored beg)
(forward-char 1)