diff --git a/lisp/textmodes/emacs-news-mode.el b/lisp/textmodes/emacs-news-mode.el index be4bba06d29..af0aa2ddeab 100644 --- a/lisp/textmodes/emacs-news-mode.el +++ b/lisp/textmodes/emacs-news-mode.el @@ -52,6 +52,7 @@ :parent emacs-news-common-map "C-c C-s" #'emacs-news-next-untagged-entry "C-c C-r" #'emacs-news-previous-untagged-entry + "C-c C-t" #'emacs-news-toggle-tag "C-c C-g" #'emacs-news-goto-section "C-c C-j" #'emacs-news-find-heading "C-c C-e" #'emacs-news-count-untagged-entries @@ -162,6 +163,26 @@ untagged NEWS entry." (interactive nil emacs-news-mode) (emacs-news-next-untagged-entry t)) +(defun emacs-news-toggle-tag () + "Toggle documentation tag of current headline in the Emacs NEWS file." + (interactive nil emacs-news-mode) + (save-excursion + (goto-char (line-beginning-position)) + (cond ((or (looking-at (rx bol (or "---" "+++") eol))) + (forward-line 2)) + ((or (looking-at (rx bol "*** "))) + (forward-line 1))) + (outline-previous-visible-heading 1) + (forward-line -1) + (cond ((not (looking-at (rx bol (or "---" "+++") eol))) + (insert "\n---")) + ((looking-at (rx bol "---" eol)) + (delete-char 3) + (insert "+++")) + ((looking-at (rx bol "+++" eol)) + (delete-char 4)) + (t (user-error "Invalid headline tag; can't toggle"))))) + (defun emacs-news-count-untagged-entries () "Say how many untagged entries there are in the current NEWS buffer." (interactive nil emacs-news-mode) diff --git a/test/lisp/textmodes/emacs-news-mode-resources/toggle-tag.erts b/test/lisp/textmodes/emacs-news-mode-resources/toggle-tag.erts new file mode 100644 index 00000000000..63c3b1b7d8a --- /dev/null +++ b/test/lisp/textmodes/emacs-news-mode-resources/toggle-tag.erts @@ -0,0 +1,131 @@ +Name: tag1 +Point-Char: | + +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +*** 'M-G' is now bound to 'dired-goto-subdir'. +|Before, that binding was only available with 'dired-x'. +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +--- +*** 'M-G' is now bound to 'dired-goto-subdir'. +|Before, that binding was only available with 'dired-x'. +=-=-= + +Name: tag2 +Point-Char: | + +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +--- +*** 'M-G' is now bound to 'dired-goto-subdir'. +|Before, that binding was only available if the 'dired-x' package was +loaded. +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + ++++ +*** 'M-G' is now bound to 'dired-goto-subdir'. +|Before, that binding was only available if the 'dired-x' package was +loaded. +=-=-= + +Name: tag3 +Point-Char: | + +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + ++++ +*** 'M-G' is now bound to 'dired-goto-subdir'. +|Before, that binding was only available if the 'dired-x' package was +loaded. +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +*** 'M-G' is now bound to 'dired-goto-subdir'. +|Before, that binding was only available if the 'dired-x' package was +loaded. +=-=-= + +Name: tag4-point-at-headline +Point-Char: | + +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +|*** 'M-G' is now bound to 'dired-goto-subdir'. +Before, that binding was only available if the 'dired-x' package was +loaded. +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +--- +|*** 'M-G' is now bound to 'dired-goto-subdir'. +Before, that binding was only available if the 'dired-x' package was +loaded. +=-=-= + +Name: tag5-point-at-tag +Point-Char: | + +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +|--- +*** 'M-G' is now bound to 'dired-goto-subdir'. +Before, that binding was only available if the 'dired-x' package was +loaded. +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +|+++ +*** 'M-G' is now bound to 'dired-goto-subdir'. +Before, that binding was only available if the 'dired-x' package was +loaded. +=-=-= + +Name: tag6-point-at-tag +Point-Char: | + +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +|+++ +*** 'M-G' is now bound to 'dired-goto-subdir'. +Before, that binding was only available if the 'dired-x' package was +loaded. +=-= ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key "% Y" is now bound by default in Dired. + +|*** 'M-G' is now bound to 'dired-goto-subdir'. +Before, that binding was only available if the 'dired-x' package was +loaded. +=-=-= diff --git a/test/lisp/textmodes/emacs-news-mode-tests.el b/test/lisp/textmodes/emacs-news-mode-tests.el new file mode 100644 index 00000000000..d2da5eda906 --- /dev/null +++ b/test/lisp/textmodes/emacs-news-mode-tests.el @@ -0,0 +1,32 @@ +;;; emacs-news-mode-tests.el --- Tests for emacs-news-mode.el -*- lexical-binding: t -*- + +;; Copyright (C) 2022 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Code: + +(require 'ert) +(require 'ert-x) +(require 'emacs-news-mode) + +(ert-deftest emacs-news-toggle-tag () + (ert-test-erts-file (ert-resource-file "toggle-tag.erts") + (lambda () + (emacs-news-mode) + (emacs-news-toggle-tag)))) + +;;; emacs-news-mode-tests.el ends here