From 0a16a1136dbda9deec40b9a72e7dd0a5d648db71 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Mon, 24 Mar 2014 21:46:00 +0100 Subject: [PATCH] Fix COMMENT keyword when stacked with a regular keyword * lisp/org.el (org-set-font-lock-defaults): Fix headline fontification when keywords are stacked. (org-toggle-comment): Properly toggle COMMENT keyword when a regular keyword is already present. (org-todo, org-agenda-prepare-buffers): Correctly match a commented heading. * lisp/org-colview.el (org-columns-capture-view): Correctly match a commented heading. * testing/lisp/test-org.el (test-org/toggle-comment): New test. --- lisp/org-colview.el | 8 +++---- lisp/org.el | 40 +++++++++++++++++---------------- testing/lisp/test-org.el | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 24 deletions(-) diff --git a/lisp/org-colview.el b/lisp/org-colview.el index 07d140f..9ebea98 100644 --- a/lisp/org-colview.el +++ b/lisp/org-colview.el @@ -1201,8 +1201,6 @@ containing the title row and all other rows. Each row is a list of fields." (save-excursion (let* ((title (mapcar 'cadr org-columns-current-fmt-compiled)) - (re-comment (format org-heading-keyword-regexp-format - org-comment-string)) (re-archive (concat ".*:" org-archive-tag ":")) (n (length title)) row tbl) (goto-char (point-min)) @@ -1214,9 +1212,9 @@ of fields." (/ (1+ (length (match-string 1))) 2) (length (match-string 1))))) (get-char-property (match-beginning 0) 'org-columns-key)) - (when (save-excursion - (goto-char (point-at-bol)) - (or (looking-at re-comment) + (when (or (org-in-commented-heading-p t) + (save-excursion + (goto-char (point-at-bol)) (looking-at re-archive))) (org-end-of-subtree t) (throw 'next t)) diff --git a/lisp/org.el b/lisp/org.el index ef0bc3f..94bda2a 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -6343,9 +6343,11 @@ needs to be inserted at a specific position in the font-lock sequence.") ;; Code '(org-activate-code (1 'org-code t)) ;; COMMENT - (list (format org-heading-keyword-regexp-format - (concat "\\(" org-comment-string "\\)")) - '(2 'org-special-keyword t)) + (list (format + "^\\*\\(?: +%s\\)?\\(?: +\\[#[A-Z0-9]\\]\\)? +\\(?9:%s\\)\\(?: \\|$\\)" + org-todo-regexp + org-comment-string) + '(9 'org-special-keyword t)) ;; Blocks and meta lines '(org-fontify-meta-lines-and-blocks)))) (setq org-font-lock-extra-keywords (delq nil org-font-lock-extra-keywords)) @@ -12176,17 +12178,17 @@ expands them." (interactive) (save-excursion (org-back-to-heading) - (let (case-fold-search) - (cond - ((looking-at (format org-heading-keyword-regexp-format - org-comment-string)) - (goto-char (match-end 1)) - (looking-at (concat " +" org-comment-string)) - (replace-match "" t t) - (when (eolp) (insert " "))) - ((looking-at org-outline-regexp) - (goto-char (match-end 0)) - (insert org-comment-string " ")))))) + (looking-at org-complex-heading-regexp) + (goto-char (or (match-end 3) (match-end 2) (match-end 1))) + (skip-chars-forward " \t") + (unless (memq (char-before) '(?\s ?\t)) (insert " ")) + (if (org-in-commented-heading-p t) + (delete-region (point) + (progn (search-forward " " (line-end-position) 'move) + (skip-chars-forward " \t") + (point))) + (insert org-comment-string) + (unless (eolp) (insert " "))))) (defvar org-last-todo-state-is-todo nil "This is non-nil when the last TODO state change led to a TODO state. @@ -12301,7 +12303,7 @@ When called through ELisp, arg is also interpreted in the following way: (save-excursion (catch 'exit (org-back-to-heading t) - (when (looking-at (concat "^\\*+ " org-comment-string)) + (when (org-in-commented-heading-p t) (org-toggle-comment) (setq commentp t)) (if (looking-at org-outline-regexp) (goto-char (1- (match-end 0)))) @@ -18229,11 +18231,11 @@ When a buffer is unmodified, it is just killed. When modified, it is saved (if (org-at-heading-p t) (add-text-properties (point-at-bol) (org-end-of-subtree t) pa)))) (goto-char (point-min)) - (setq re (format org-heading-keyword-regexp-format - org-comment-string)) + (setq re (format "^\\* .*\\<%s\\>" org-comment-string)) (while (re-search-forward re nil t) - (add-text-properties - (match-beginning 0) (org-end-of-subtree t) pc)))) + (when (save-match-data (org-in-commented-heading-p t)) + (add-text-properties + (match-beginning 0) (org-end-of-subtree t) pc))))) (goto-char pos))))) (setq org-todo-keywords-for-agenda (org-uniquify org-todo-keywords-for-agenda)) diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 0144841..9350f93 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -27,6 +27,64 @@ ;;; Comments +(ert-deftest test-org/toggle-comment () + "Test `org-toggle-comment' specifications." + ;; Simple headline. + (should + (equal "* Test" + (org-test-with-temp-text "* COMMENT Test" + (org-toggle-comment) + (buffer-string)))) + (should + (equal "* COMMENT Test" + (org-test-with-temp-text "* Test" + (org-toggle-comment) + (buffer-string)))) + ;; Headline with a regular keyword. + (should + (equal "* TODO Test" + (org-test-with-temp-text "* TODO COMMENT Test" + (org-toggle-comment) + (buffer-string)))) + (should + (equal "* TODO COMMENT Test" + (org-test-with-temp-text "* TODO Test" + (org-toggle-comment) + (buffer-string)))) + ;; Empty headline. + (should + (equal "* " + (org-test-with-temp-text "* COMMENT" + (org-toggle-comment) + (buffer-string)))) + (should + (equal "* COMMENT" + (org-test-with-temp-text "* " + (org-toggle-comment) + (buffer-string)))) + ;; Headline with a single keyword. + (should + (equal "* TODO " + (org-test-with-temp-text "* TODO COMMENT" + (org-toggle-comment) + (buffer-string)))) + (should + (equal "* TODO COMMENT" + (org-test-with-temp-text "* TODO" + (org-toggle-comment) + (buffer-string)))) + ;; Headline with a keyword, a priority cookie and contents. + (should + (equal "* TODO [#A] Headline" + (org-test-with-temp-text "* TODO [#A] COMMENT Headline" + (org-toggle-comment) + (buffer-string)))) + (should + (equal "* TODO [#A] COMMENT Headline" + (org-test-with-temp-text "* TODO [#A] Headline" + (org-toggle-comment) + (buffer-string))))) + (ert-deftest test-org/comment-dwim () "Test `comment-dwim' behaviour in an Org buffer." ;; No region selected, no comment on current line and line not -- 1.9.1