diff options
author | Nicolas Goaziou <[email protected]> | 2010-08-22 01:10:58 +0200 |
---|---|---|
committer | Nicolas Goaziou <[email protected]> | 2010-09-01 19:05:55 +0200 |
commit | 7b8352f94b77e10a82c4be57bb02005e9921ebab (patch) | |
tree | d300d18f80d927b87d516a4c65bfd802dedd25c5 | |
parent | bac9497d7aa14dc486638ad027804774c14f06a3 (diff) | |
download | org-mode-7b8352f94b77e10a82c4be57bb02005e9921ebab.tar.gz |
Renamed `org-indent-item-tree' to `org-list-indent-item-generic'.
-rw-r--r-- | lisp/org-list.el | 193 |
1 files changed, 100 insertions, 93 deletions
diff --git a/lisp/org-list.el b/lisp/org-list.el index bf43b4a..b3fe885 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -673,6 +673,88 @@ function ends." (beginning-of-line 0)))))) (funcall insert-fun after-text) t))))) +(defvar org-last-indent-begin-marker (make-marker)) +(defvar org-last-indent-end-marker (make-marker)) + +(defun org-list-indent-item-generic (arg no-subtree) + "Indent a local list item including its children. + +When number ARG is a negative, item will be outdented, otherwise +it will be indented. + +If a region is active, all items in it will be moved. If +NO-SUBTREE is non-nil, only indent the item itself, not its +children. + +Return t if successful." + (interactive) + (unless (org-at-item-p) + (error "Not on an item")) + ;; Determine begin and end points of zone to indent. If moving by + ;; subtrees, ensure we don't drag additional items on subsequent + ;; moves. + (unless (and (memq last-command '(org-shiftmetaright org-shiftmetaleft)) + (memq this-command '(org-shiftmetaright org-shiftmetaleft))) + (if (org-region-active-p) + (progn + (set-marker org-last-indent-begin-marker (region-beginning)) + (set-marker org-last-indent-end-marker (region-end))) + (set-marker org-last-indent-begin-marker + (save-excursion (org-beginning-of-item))) + (set-marker org-last-indent-end-marker + (save-excursion + (if no-subtree + (org-end-of-item-or-at-child) + (org-end-of-item)))))) + ;; Get everything ready + (let* ((beg (marker-position org-last-indent-begin-marker)) + (end (marker-position org-last-indent-end-marker)) + (struct (org-list-struct beg end (< arg 0))) + (origins (org-list-struct-origins struct)) + (beg-item (assq beg struct)) + (end-item (save-excursion + (goto-char end) + (skip-chars-backward " \r\t\n") + (org-beginning-of-item) + (org-list-struct-assoc-at-point))) + (top (org-list-top-point))) + (cond + ;; Special case: moving top-item with indent rule + ((and (= top beg) + (cdr (assq 'indent org-list-automatic-rules)) + (not no-subtree)) + (let* ((level-skip (org-level-increment)) + (offset (if (< arg 0) (- level-skip) level-skip)) + (top-ind (nth 1 beg-item))) + (if (< (+ top-ind offset) 0) + (error "Cannot outdent beyond margin") + ;; Change bullet if necessary + (when (and (= (+ top-ind offset) 0) + (string-match "*" (nth 2 beg-item))) + (setcdr beg-item (list (nth 1 beg-item) + (org-list-bullet-string "-")))) + ;; Shift ancestor + (let ((anc (car struct))) + (setcdr anc (list (+ (nth 1 anc) offset) "" nil))) + (org-list-struct-fix-struct struct origins) + (org-list-struct-apply-struct struct)))) + ;; Forbidden move + ((and (< arg 0) + (or (and no-subtree + (not (org-region-active-p)) + (org-list-struct-get-child beg-item struct)) + (org-list-struct-get-child end-item struct))) + (error "Cannot outdent an item without its children")) + ;; Normal shifting + (t + (let* ((shifted-ori (if (< arg 0) + (org-list-struct-outdent beg end origins) + (org-list-struct-indent beg end origins struct)))) + (org-list-struct-fix-struct struct shifted-ori) + (org-list-struct-apply-struct struct))))) + ;; Return value + t) + ;;; Predicates (defun org-in-item-p () @@ -1346,100 +1428,25 @@ Sub-items are not moved." (indent-line-to (+ i delta))))) (beginning-of-line 0))))) -(defun org-outdent-item (arg) +(defun org-outdent-item () "Outdent a local list item, but not its children." - (interactive "p") - (org-indent-item-tree (- arg) t)) + (interactive) + (org-list-indent-item-generic -1 t)) -(defun org-indent-item (arg) +(defun org-indent-item () "Indent a local list item, but not its children." - (interactive "p") - (org-indent-item-tree arg t)) - -(defun org-outdent-item-tree (arg &optional no-subtree) - "Outdent a local list item including its children. -If NO-SUBTREE is set, only outdent the item itself, not its children." - (interactive "p") - (org-indent-item-tree (- arg) no-subtree)) - -(defvar org-last-indent-begin-marker (make-marker)) -(defvar org-last-indent-end-marker (make-marker)) - -(defun org-indent-item-tree (arg &optional no-subtree) - "Indent a local list item including its children. + (interactive) + (org-list-indent-item-generic 1 t)) -When number ARG is a negative, item will be outdented, otherwise -it will be indented. +(defun org-outdent-item-tree () + "Outdent a local list item including its children." + (interactive) + (org-list-indent-item-generic -1 nil)) -If NO-SUBTREE is non-nil, only indent the item itself, not its -children. Return t if successful." - (interactive "p") - (unless (org-at-item-p) - (error "Not on an item")) - ;; Determine begin and end points of zone to indent. If moving by - ;; subtrees, ensure we don't drag additional items on subsequent - ;; moves. - (unless (and (memq last-command '(org-shiftmetaright org-shiftmetaleft)) - (memq this-command '(org-shiftmetaright org-shiftmetaleft))) - (if (org-region-active-p) - (progn - (set-marker org-last-indent-begin-marker (region-beginning)) - (set-marker org-last-indent-end-marker (region-end))) - (set-marker org-last-indent-begin-marker - (save-excursion (org-beginning-of-item))) - (set-marker org-last-indent-end-marker - (save-excursion - (if no-subtree - (org-end-of-item-or-at-child) - (org-end-of-item)))))) - ;; Get everything ready - (let* ((beg (marker-position org-last-indent-begin-marker)) - (end (marker-position org-last-indent-end-marker)) - (struct (org-list-struct beg end (< arg 0))) - (origins (org-list-struct-origins struct)) - (beg-item (assq beg struct)) - (end-item (save-excursion - (goto-char end) - (skip-chars-backward " \r\t\n") - (org-beginning-of-item) - (org-list-struct-assoc-at-point))) - (top (org-list-top-point))) - (cond - ;; Special case: moving top-item with indent rule - ((and (= top beg) - (cdr (assq 'indent org-list-automatic-rules)) - (not no-subtree)) - (let* ((level-skip (org-level-increment)) - (offset (if (< arg 0) (- level-skip) level-skip)) - (top-ind (nth 1 beg-item))) - (if (< (+ top-ind offset) 0) - (error "Cannot outdent beyond margin") - ;; Change bullet if necessary - (when (and (= (+ top-ind offset) 0) - (string-match "*" (nth 2 beg-item))) - (setcdr beg-item (list (nth 1 beg-item) - (org-list-bullet-string "-")))) - ;; Shift ancestor - (let ((anc (car struct))) - (setcdr anc (list (+ (nth 1 anc) offset) "" nil))) - (org-list-struct-fix-struct struct origins) - (org-list-struct-apply-struct struct)))) - ;; Forbidden move - ((and (< arg 0) - (or (and no-subtree - (not (org-region-active-p)) - (org-list-struct-get-child beg-item struct)) - (org-list-struct-get-child end-item struct))) - (error "Cannot outdent an item without its children")) - ;; Normal shifting - (t - (let* ((shifted-ori (if (< arg 0) - (org-list-struct-outdent beg end origins) - (org-list-struct-indent beg end origins struct)))) - (org-list-struct-fix-struct struct shifted-ori) - (org-list-struct-apply-struct struct))))) - ;; Return value - t) +(defun org-indent-item-tree () + "Indent a local list item including its children." + (interactive) + (org-list-indent-item-generic 1 nil)) (defvar org-tab-ind-state) (defun org-cycle-item-indentation () @@ -1466,9 +1473,9 @@ The item must be empty." ;; go back to original position. (if (eq last-command 'org-cycle-item-indentation) (cond - ((ignore-errors (org-indent-item -1))) + ((ignore-errors (org-outdent-item))) ((and (= (org-get-indentation) (car org-tab-ind-state)) - (ignore-errors (org-indent-item 1)))) + (ignore-errors (org-indent-item)))) (t (back-to-indentation) (indent-to-column (car org-tab-ind-state)) (end-of-line) @@ -1480,8 +1487,8 @@ The item must be empty." (setq org-tab-ind-state (cons (org-get-indentation) (org-get-bullet))) (cond - ((ignore-errors (org-indent-item 1))) - ((ignore-errors (org-indent-item -1))) + ((ignore-errors (org-indent-item))) + ((ignore-errors (org-outdent-item))) (t (error "Cannot move item")))) t))) |