diff options
author | Nicolas Goaziou <n.goaziou@gmail.com> | 2010-07-29 13:13:00 +0200 |
---|---|---|
committer | Nicolas Goaziou <n.goaziou@gmail.com> | 2010-09-01 19:05:52 +0200 |
commit | ee568516e89c6ac0fe1592abc04194970bdb8439 (patch) | |
tree | d18c812cff76229618378f5d71c268bf3f0889ab | |
parent | d9c4c52533eb11615f10b8d0301b391825eeb859 (diff) | |
download | org-mode-ee568516e89c6ac0fe1592abc04194970bdb8439.tar.gz |
Bug fix when indenting items.
* org-list.el (org-indent-item-tree): Removed region code. It was prone
to errors and undocumented.
* org-list.el (org-item-indent-positions): Better heuristics to
determine what bullet the item will have when demoted.
-rw-r--r-- | lisp/org-list.el | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/lisp/org-list.el b/lisp/org-list.el index d7c311e..8f06723 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -800,7 +800,6 @@ If NO-SUBTREE is set, only outdent the item itself, not its children." If NO-SUBTREE is set, only indent the item itself, not its children. Return t if sucessful." (interactive "p") - (and (org-region-active-p) (org-cursor-to-region-beginning)) (unless (org-at-item-p) (error "Not on an item")) (let ((line (org-current-line)) @@ -810,7 +809,6 @@ children. Return t if sucessful." (goto-char (org-list-top-point)) (org-get-indentation))) beg end ind ind1 ind-pos bullet delta ind-down ind-up) - (setq end (and (org-region-active-p) (region-end))) ;; If moving a subtree, don't drag additional items on subsequent ;; moves. (if (and (memq last-command '(org-shiftmetaright org-shiftmetaleft)) @@ -834,7 +832,9 @@ children. Return t if sucessful." delta (if (> arg 0) (if ind-down (- ind-down ind) 2) (if ind-up (- ind-up ind) -2))) - ;; Make some checks before indenting. + + + ;; Check for error cases. (cond ((< (+ delta ind) 0) (goto-char pos) @@ -863,6 +863,8 @@ children. Return t if sucessful." (save-excursion (goto-char (1- end)) (org-item-has-child-p))) (goto-char pos) (error "Cannot outdent an item having children"))))) + + ;; Replace bullet of current item with the bullet it is going to ;; have if we're outdenting. This is needed to prevent indentation ;; problems of subtrees when outdenting changes bullet size. @@ -876,6 +878,8 @@ children. Return t if sucessful." (delete-region (point-at-bol) (point)) (or (eolp) (org-indent-to-column (+ ind1 delta))) (beginning-of-line 2)) + + ;; Get back to original position, shifted by delta (goto-line line) (move-to-column (max (+ delta col) 0)) @@ -918,7 +922,8 @@ children. Return t if sucessful." This returns a list with three cons-cells containing indentation and bullet of: the item, the item after a promotion, and the item after being demoted. Assume cursor in item line." - (let* ((init-bul (lambda (bullet) + (let* ((pos (point)) + (init-bul (lambda (bullet) (if (string-match "\\`[0-9]+\\(\\.\\|)\\)\\'" bullet) (concat "1" (match-string 1 bullet)) bullet))) @@ -936,15 +941,20 @@ after being demoted. Assume cursor in item line." ;; Child of previous item, if any. (item-down (save-excursion (let ((prev-p (org-get-previous-item (point) (save-excursion (org-beginning-of-item-list))))) - (if (and prev-p (goto-char prev-p) (org-item-has-child-p)) - (progn - (org-end-of-item-or-at-child) - (cons (org-get-indentation) - (funcall init-bul (org-get-bullet)))) - (goto-char pos) - (org-at-item-p) - (goto-char (match-end 0)) - (cons (current-column) (cdr item-cur))))))) + (cond + ((and prev-p (goto-char prev-p) (org-item-has-child-p)) + (progn + (org-end-of-item-or-at-child) + (cons (org-get-indentation) + (funcall init-bul (org-get-bullet))))) + ((and (goto-char pos) (org-item-has-child-p)) + (progn + (org-end-of-item-or-at-child) + (cons (org-get-indentation) + (funcall init-bul (org-get-bullet))))) + (t (org-at-item-p) + (goto-char (match-end 0)) + (cons (current-column) (cdr item-cur)))))))) (list item-cur item-up item-down))) (defvar org-tab-ind-state) |