diff options
author | Nicolas Goaziou <n.goaziou@gmail.com> | 2011-05-28 19:42:53 +0200 |
---|---|---|
committer | Nicolas Goaziou <n.goaziou@gmail.com> | 2011-05-28 19:42:53 +0200 |
commit | 363a4554e28ddcde10e0979c5b1f020e71926bb0 (patch) | |
tree | 2ce85519d65bf72ecd36f0a0fa8fbe7cd15763d4 | |
parent | 5a57bfffaee3484c152a1cb7e1964c70207cfa0e (diff) | |
download | org-mode-363a4554e28ddcde10e0979c5b1f020e71926bb0.tar.gz |
Do not split a partially selected line when calling org-toggle-heading
* lisp/org.el (org-toggle-heading): region should be considered as
made of full lines, without the last one if region-end is at bol.
Removed unused variables. Refactored and commented code.
-rw-r--r-- | lisp/org.el | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/lisp/org.el b/lisp/org.el index 9232700..498c606 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -17907,29 +17907,36 @@ such that the lines become children of the current entry. However, when a prefix argument is given, its value determines the number of stars to add." (interactive "P") - (let (l2 l itemp beg end) + (let ((skip-blanks + (function + ;; Return beginning of first non-blank line, starting from + ;; line at POS. + (lambda (pos) + (save-excursion + (goto-char pos) + (skip-chars-forward " \r\t\n") + (point-at-bol))))) + beg end) + ;; Determine boundaries of changes. If region ends at a bol, do + ;; not consider the last line to be in the region. (if (org-region-active-p) - (setq beg (region-beginning) end (copy-marker (region-end))) - (setq beg (point-at-bol) - end (min (1+ (point-at-eol)) (point-max)))) + (setq beg (funcall skip-blanks (region-beginning)) + end (copy-marker (save-excursion + (goto-char (region-end)) + (if (bolp) (point) (point-at-eol))))) + (setq beg (funcall skip-blanks (point-at-bol)) + end (copy-marker (point-at-eol)))) ;; Ensure inline tasks don't count as headings. (org-with-limited-levels (save-excursion - (goto-char end) - (setq l2 (org-current-line)) (goto-char beg) - (beginning-of-line 1) - ;; Ignore blank lines at beginning of region - (skip-chars-forward " \t\r\n") - (beginning-of-line 1) - (setq l (1- (org-current-line))) (cond ;; Case 1. Started at an heading: de-star headings. ((org-on-heading-p) - (while (< (setq l (1+ l)) l2) + (while (< (point) end) (when (org-on-heading-p t) (looking-at outline-regexp) (replace-match "")) - (beginning-of-line 2))) + (forward-line))) ;; Case 2. Started at an item: change items into headlines. ((org-at-item-p) (let ((stars (make-string @@ -17941,7 +17948,7 @@ stars to add." (when (org-at-item-p) ;; Pay attention to cases when region ends before list. (let* ((struct (org-list-struct)) - (list-end (min (org-list-get-bottom-point struct) end))) + (list-end (min (org-list-get-bottom-point struct) (1+ end)))) (save-restriction (narrow-to-region (point) list-end) (insert @@ -17950,7 +17957,7 @@ stars to add." '(:istart (concat stars (funcall get-stars depth)) :icount (concat stars (funcall get-stars depth)))))))) - (beginning-of-line 2)))) + (forward-line)))) ;; Case 3. Started at normal text: make every line an heading, ;; skipping headlines and items. (t (let* ((stars (make-string @@ -17963,11 +17970,11 @@ stars to add." (org-odd-levels-only "**") (t "*"))) (rpl (concat stars add-stars " "))) - (while (< (setq l (1+ l)) l2) - (unless (or (org-on-heading-p) (org-at-item-p)) - (when (looking-at "\\([ \t]*\\)\\(\\S-\\)") - (replace-match (concat rpl (match-string 2))))) - (beginning-of-line 2))))))))) + (while (< (point) end) + (when (and (not (org-on-heading-p)) (not (org-at-item-p)) + (looking-at "\\([ \t]*\\)\\(\\S-\\)")) + (replace-match (concat rpl (match-string 2)))) + (forward-line))))))))) (defun org-meta-return (&optional arg) "Insert a new heading or wrap a region in a table. |