From 4bc4e8ec1850c29a172f1f7dda4d553d826f0fdd Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Fri, 24 Aug 2012 12:15:53 +0200 Subject: [PATCH 1/3] org-element: Paragraphs don't end at incomplete latex environments * lisp/org-element.el (org-element-paragraph-separate): Since this variable is meant to be searched forward, \end{...} shouldn't trigger the end of a paragraph before checking if it is the end of a complete environment. (org-element-latex-environment-parser): Slight change to the regexp matching the beginning of a latex environment. (org-element-paragraph-parser): Paragraphs don't end at incomplete latex environments. (org-element-latex-or-entity-successor): Remove paragraph environments from latex fragment search. --- lisp/org-element.el | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 3bf217dd6..f0e1a0f41 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -140,7 +140,7 @@ ;; Horizontal rules. "-\\{5,\\}[ \t]*$" "\\|" ;; LaTeX environments. - "\\\\\\(begin\\|end\\)" "\\|" + "\\\\begin{\\([A-Za-z0-9]+\\*?\\)}" "\\|" ;; Planning and Clock lines. (regexp-opt (list org-scheduled-string org-deadline-string @@ -1700,7 +1700,7 @@ Assume point is at the beginning of the latex environment." (code-begin (point)) (keywords (org-element--collect-affiliated-keywords)) (begin (car keywords)) - (env (progn (looking-at "^[ \t]*\\\\begin{\\([A-Za-z0-9*]+\\)}") + (env (progn (looking-at "^[ \t]*\\\\begin{\\([A-Za-z0-9]+\\*?\\)}") (regexp-quote (match-string 1)))) (code-end (progn (re-search-forward (format "^[ \t]*\\\\end{%s}" env) limit t) @@ -1773,6 +1773,15 @@ Assume point is at the beginning of the paragraph." (concat "^[ \t]*#\\+END_" (match-string 1)) limit t)))) + ;; Skip incomplete latex environments. + ((save-excursion + (beginning-of-line) + (looking-at "^[ \t]*\\\\begin{\\([A-Za-z0-9]+\\*?\\)}")) + (not (save-excursion + (re-search-forward + (format "^[ \t]*\\\\end{%s}" + (match-string 1)) + limit t)))) ;; Skip ill-formed keywords. ((not (save-excursion (beginning-of-line) @@ -2346,7 +2355,8 @@ LIMIT bounds the search. Return value is a cons cell whose CAR is `entity' or `latex-fragment' and CDR is beginning position." (save-excursion - (let ((matchers (plist-get org-format-latex-options :matchers)) + (let ((matchers + (remove "begin" (plist-get org-format-latex-options :matchers))) ;; ENTITY-RE matches both LaTeX commands and Org entities. (entity-re "\\\\\\(there4\\|sup[123]\\|frac[13][24]\\|[a-zA-Z]+\\)\\($\\|{}\\|[^[:alpha:]]\\)")) From b1223be34d183229db3f5b0625b459a2783d9ef5 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Fri, 24 Aug 2012 12:17:22 +0200 Subject: [PATCH 2/3] Auto-filling must not break current paragraph * lisp/org.el (org-fill-paragraph-separate-nobreak-p): New function. (org-set-autofill-regexps): Introduce new predicate. (org-fill-item-nobreak-p): Remove function. --- lisp/org.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index b3ae268cf..d03e913dc 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -21000,16 +21000,17 @@ hierarchy of headlines by UP levels before marking the subtree." 'fill-nobreak-predicate (org-uniquify (append fill-nobreak-predicate - '(org-fill-item-nobreak-p org-fill-line-break-nobreak-p))))) + '(org-fill-paragraph-separate-nobreak-p + org-fill-line-break-nobreak-p))))) (org-set-local 'normal-auto-fill-function 'org-auto-fill-function) (org-set-local 'align-mode-rules-list '((org-in-buffer-settings (regexp . "^#\\+[A-Z_]+:\\(\\s-*\\)\\S-+") (modes . '(org-mode)))))) -(defun org-fill-item-nobreak-p () +(defun org-fill-paragraph-separate-nobreak-p () "Non-nil when a line break at point would insert a new item." - (and (looking-at (org-item-re)) (org-list-in-valid-context-p))) + (looking-at (substring org-element-paragraph-separate 1))) (defun org-fill-line-break-nobreak-p () "Non-nil when a line break at point would create an Org line break." From 8a97c601a14fd8358a5c1e90a1ffbeb9dc6a2e72 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Fri, 24 Aug 2012 12:55:25 +0200 Subject: [PATCH 3/3] Do not fill verse blocks contents * lisp/org.el (org-fill-context-prefix, org-fill-paragraph): Do not fill verse blocks contents. Verse blocks can be used to format free-form poetry, so filling has to be done manually. * testing/lisp/test-org.el: Remove unnecessary tests. --- lisp/org.el | 39 +++++++++++---------------------------- testing/lisp/test-org.el | 15 +++------------ 2 files changed, 14 insertions(+), 40 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index d03e913dc..a71b3e241 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -21055,7 +21055,7 @@ meant to be filled." ? )) ((looking-at "\\s-+") (match-string 0)) (t "")))) - ((comment-block verse-block) + (comment-block ;; Only fill contents if P is within block boundaries. (let* ((cbeg (save-excursion (goto-char post-affiliated) (forward-line) @@ -21074,8 +21074,8 @@ meant to be filled." "Fill element at point, when applicable. This function only applies to comment blocks, comments, example -blocks, paragraphs and verse blocks. Also, as a special case, -re-align table when point is at one. +blocks and paragraphs. Also, as a special case, re-align table +when point is at one. If JUSTIFY is non-nil (interactively, with prefix argument), justify as well. If `sentence-end-double-space' is non-nil, then @@ -21114,41 +21114,24 @@ a footnote definition, try to fill the first paragraph within." (org-table-align)) t) ;; Elements that may contain `line-break' type objects. - ((paragraph verse-block) + (paragraph (let ((beg (max (point-min) (org-element-property :contents-begin element))) (end (min (point-max) (org-element-property :contents-end element))) (type (org-element-type element))) - ;; Do nothing if point is at an affiliated keyword or at - ;; verse block markers. - (if (or (< (point) beg) - (and (eq type 'verse-block) (>= (point) end))) - t - ;; In verse blocks and `message-mode', boundaries of - ;; region to fill have to be tweaked. - (cond - ;; At a verse block, fill current "paragraph", that - ;; is part of text separated by blank lines. - ((eq type 'verse-block) - (save-excursion - (when (looking-at "[ \t]*$") - (skip-chars-backward " \r\t\n" beg)) - (when (re-search-backward "^[ \t]*$" beg t) - (forward-line) - (setq beg (point)))) - (when (save-excursion (re-search-forward "^[ \t]*$" end t)) - (setq end (match-beginning 0)))) - ;; In `message-mode', do not fill following citation - ;; in current paragraph nor text before message - ;; body. - ((derived-mode-p 'message-mode) + ;; Do nothing if point is at an affiliated keyword. + (if (< (point) beg) t + (when (derived-mode-p 'message-mode) + ;; In `message-mode', do not fill following + ;; citation in current paragraph nor text before + ;; message body. (let ((body-start (save-excursion (message-goto-body)))) (when body-start (setq beg (max body-start beg)))) (when (save-excursion (re-search-forward (concat "^" message-cite-prefix-regexp) end t)) - (setq end (match-beginning 0))))) + (setq end (match-beginning 0)))) ;; Fill paragraph, taking line breaks into consideration. ;; For that, slice the paragraph using line breaks as ;; separators, and fill the parts in reverse order to diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 09bf3283e..a289cbf9f 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -182,15 +182,6 @@ http://article.gmane.org/gmane.emacs.orgmode/21459/" (let ((fill-column 20)) (org-fill-paragraph) (buffer-string))))) - ;; At a verse block, fill paragraph at point, also preserving line - ;; breaks. Though, do nothing when point is at the block - ;; boundaries. - (org-test-with-temp-text "#+BEGIN_VERSE\nSome \\\\\nlong\ntext\n#+END_VERSE" - (forward-line) - (let ((fill-column 20)) - (org-fill-paragraph) - (should (equal (buffer-string) - "#+BEGIN_VERSE\nSome \\\\\nlong text\n#+END_VERSE")))) (org-test-with-temp-text "#+BEGIN_VERSE\nSome \\\\\nlong\ntext\n#+END_VERSE" (let ((fill-column 20)) (org-fill-paragraph) @@ -244,10 +235,10 @@ http://article.gmane.org/gmane.emacs.orgmode/21459/" (end-of-line) (org-auto-fill-function) (buffer-string))))) - ;; Verse and comment block: auto fill contents. + ;; Comment block: auto fill contents. (should - (equal "#+BEGIN_VERSE\n12345\n7890\n#+END_VERSE" - (org-test-with-temp-text "#+BEGIN_VERSE\n12345 7890\n#+END_VERSE" + (equal "#+BEGIN_COMMENT\n12345\n7890\n#+END_COMMENT" + (org-test-with-temp-text "#+BEGIN_COMMENT\n12345 7890\n#+END_COMMENT" (let ((fill-column 5)) (forward-line) (end-of-line)