diff options
author | Nicolas Goaziou <n.goaziou@gmail.com> | 2011-12-31 15:36:53 +0100 |
---|---|---|
committer | Bastien Guerry <bzg@altern.org> | 2012-01-03 09:19:19 +0100 |
commit | 40976a748037adf5a05e8b8e4fcee138213f1521 (patch) | |
tree | ab72aa5479d95f2b070cc212d239ed2bd746e9f3 | |
parent | b7095d65d85c752ce2f4feca12746809bea3da63 (diff) | |
download | org-mode-40976a748037adf5a05e8b8e4fcee138213f1521.tar.gz |
org-list: Change behaviour of C-c C-c at a list item with an argument
* lisp/org-list.el (org-list-write-struct): Add an optional argument
for structure changes happening outside the function.
* lisp/org.el (org-ctrl-c-ctrl-c): Now, C-u C-c C-c on the first item
of a sub-list should toggle check-box presence of every item in the
same sub-list. Also fix check-box insertion on a single item.
-rw-r--r-- | lisp/org-list.el | 11 | ||||
-rw-r--r-- | lisp/org.el | 34 |
2 files changed, 34 insertions, 11 deletions
diff --git a/lisp/org-list.el b/lisp/org-list.el index 6d25037..415986e 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -1914,16 +1914,21 @@ Initial position of cursor is restored after the changes." (goto-char origin) (move-marker origin nil))) -(defun org-list-write-struct (struct parents) +(defun org-list-write-struct (struct parents &optional old-struct) "Correct bullets, checkboxes and indentation in list at point. + STRUCT is the list structure. PARENTS is the alist of parents, -as returned by `org-list-parents-alist'." +as returned by `org-list-parents-alist'. + +When non-nil, optional argument OLD-STRUCT is the reference +structure of the list. It should be provided whenever STRUCT +doesn't correspond anymore to the real list in buffer." ;; Order of functions matters here: checkboxes and endings need ;; correct indentation to be set, and indentation needs correct ;; bullets. ;; ;; 0. Save a copy of structure before modifications - (let ((old-struct (copy-tree struct))) + (let ((old-struct (or old-struct (copy-tree struct)))) ;; 1. Set a temporary, but coherent with PARENTS, indentation in ;; order to get items endings and bullets properly (org-list-struct-fix-ind struct parents 2) diff --git a/lisp/org.el b/lisp/org.el index 1003164..924d5fc 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -18325,12 +18325,19 @@ This command does many different things, depending on context: block-item) ;; Use a light version of `org-toggle-checkbox' to avoid ;; computing list structure twice. - (org-list-set-checkbox (point-at-bol) struct - (cond - ((equal arg '(16)) "[-]") - ((equal arg '(4)) nil) - ((equal "[X]" cbox) "[ ]") - (t "[X]"))) + (let ((new-box (cond + ((equal arg '(16)) "[-]") + ((equal arg '(4)) nil) + ((equal "[X]" cbox) "[ ]") + (t "[X]")))) + (if firstp + ;; If at first item of sub-list, remove check-box from + ;; every item at the same level. + (mapc + (lambda (pos) (org-list-set-checkbox pos struct new-box)) + (org-list-get-all-items + (point-at-bol) struct (org-list-prevs-alist struct))) + (org-list-set-checkbox (point-at-bol) struct new-box))) ;; Replicate `org-list-write-struct', while grabbing a return ;; value from `org-list-struct-fix-box'. (org-list-struct-fix-ind struct parents 2) @@ -18352,9 +18359,20 @@ This command does many different things, depending on context: ;; only if function was called with an argument. Send list only ;; if at top item. (let* ((struct (org-list-struct)) + (new-struct struct) (firstp (= (org-list-get-top-point struct) (point-at-bol)))) - (when arg (org-list-set-checkbox (point-at-bol) struct "[ ]")) - (org-list-write-struct struct (org-list-parents-alist struct)) + (when arg + (setq new-struct (copy-tree struct)) + (if firstp + ;; If at first item of sub-list, add check-box to every + ;; item at the same level. + (mapc + (lambda (pos) (org-list-set-checkbox pos new-struct "[ ]")) + (org-list-get-all-items + (point-at-bol) new-struct (org-list-prevs-alist new-struct))) + (org-list-set-checkbox (point-at-bol) new-struct "[ ]"))) + (org-list-write-struct + new-struct (org-list-parents-alist new-struct) struct) (when arg (org-update-checkbox-count-maybe)) (when firstp (org-list-send-list 'maybe)))) ((save-excursion (beginning-of-line 1) (looking-at org-dblock-start-re)) |