From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Goaziou Subject: [RFC] Properly handle keyword + COMMENT keyword Date: Mon, 24 Mar 2014 22:38:05 +0100 Message-ID: <87txanjn0i.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:52706) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WSCZ7-0002Ce-Ol for emacs-orgmode@gnu.org; Mon, 24 Mar 2014 17:37:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WSCZ2-0006Co-0M for emacs-orgmode@gnu.org; Mon, 24 Mar 2014 17:37:53 -0400 Received: from mail-we0-x234.google.com ([2a00:1450:400c:c03::234]:34997) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WSCZ1-0006Ap-LP for emacs-orgmode@gnu.org; Mon, 24 Mar 2014 17:37:47 -0400 Received: by mail-we0-f180.google.com with SMTP id p61so3844220wes.11 for ; Mon, 24 Mar 2014 14:37:46 -0700 (PDT) Received: from selenimh ([91.224.148.150]) by mx.google.com with ESMTPSA id fs8sm43092583wib.8.2014.03.24.14.37.35 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Mar 2014 14:37:38 -0700 (PDT) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Org Mode List --=-=-= Content-Type: text/plain Hello, COMMENT keyword is not always clearly defined in Org. Some parts consider it is a regular keyword as treat it as such (e.g. `org-todo') whereas some others see it as an additional keyword (e.g., `org-priority'). I think the latter makes more sense, and, as a consequence, Org Syntax (http://orgmode.org/worg/dev/org-syntax.html) defines it that way. Much like :ARCHIVE:, COMMENT provides an additional property to the headline, without limiting it whatsoever. In other words, the following should be valid: * TODO COMMENT Headline and, according to Org Syntax, so should this: * TODO [#A] COMMENT Headline Though, COMMENT keyword must come after any other keyword and priority, if any. So the following is /not/ valid: * COMMENT TODO Headline Thus, this patch - properly fontifies headlines with both a regular keyword and a COMMENT keyword, - fixes `org-toggle-comment' and `org-todo' to handle both COMMENT keyword and another one - adds some consistency to functions implementing their own COMMENT matching (e.g., with or without case-sensitivity). WDYT? -- Nicolas Goaziou --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Fix-COMMENT-keyword-when-stacked-with-a-regular-keyw.patch >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 --=-=-=--