]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new minor mode word-wrap-whitespace-mode
authorLars Ingebrigtsen <larsi@gnus.org>
Sat, 23 Apr 2022 12:12:18 +0000 (14:12 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 23 Apr 2022 12:13:10 +0000 (14:13 +0200)
* doc/emacs/display.texi (Visual Line Mode): Document it.
* lisp/textmodes/word-wrap-mode.el: New minor mode.

doc/emacs/display.texi
etc/NEWS
lisp/textmodes/word-wrap-mode.el [new file with mode: 0644]

index 534bf5881e7dc3dc9eeb90e3391d01c8d0416148..2ac0dca6223378256ec8b0a9e46d970dade84cba 100644 (file)
@@ -1899,12 +1899,22 @@ logical lines, so having a fringe indicator for each wrapped line
 would be visually distracting.  You can change this by customizing the
 variable @code{visual-line-fringe-indicators}.
 
+@vindex word-wrap-whitespace-mode
+  By default, Emacs only breaks lines after whitespace characters like
+@key{SPC} and @key{TAB}, but does not break after whitespace
+characters like @key{EN QUAD}.  Emacs provides a minor mode called
+@code{word-wrap-whitespace-mode} that switches on word wrapping in the
+current mode, and sets up which characters to wrap lines on based on
+the @code{word-wrap-whitespace-characters} user option.  There's also
+a globalized version of that mode called
+@code{global-word-wrap-whitespace-mode}.
+
 @vindex word-wrap-by-category
 @findex modify-category-entry
 @findex char-category-set
 @findex category-set-mnemonics
-  By default, Emacs only breaks lines after whitespace characters.
-That produces incorrect results when CJK and Latin text are mixed
+  Only breaking after whitespace character produces incorrect
+results when CJK and Latin text are mixed
 together (because CJK characters don't use whitespace to separate
 words).  You can customize the option @code{word-wrap-by-category} to
 allow Emacs to break lines after any character with @samp{|} category
index c0b9ce654e1ad18f5b1ad8b9e6de13d13ba37e0c..57bcef36f135127f16edd47d7c6c5a790640efbc 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -642,6 +642,11 @@ script that was used in ancient South Asia.  A new input method,
 \f
 * Changes in Specialized Modes and Packages in Emacs 29.1
 
++++
+** New minor mode 'word-wrap-whitespace-mode' for extending 'word-wrap'.
+This mode switches 'word-wrap' on, and breaks on all the whitespace
+characters instead of just SPC and TAB.
+
 ---
 ** New mode, 'emacs-news-mode', for editing the NEWS file.
 This mode adds some highlighting, fixes the 'M-q' command, and has
diff --git a/lisp/textmodes/word-wrap-mode.el b/lisp/textmodes/word-wrap-mode.el
new file mode 100644 (file)
index 0000000..78823c4
--- /dev/null
@@ -0,0 +1,91 @@
+;;; word-wrap-mode.el --- minor mode for `word-wrap' tweaks  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Maintainer: emacs-devel@gnu.org
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+;; The list below lists all characters that have a general-category of
+;; Zs, but with the ones we don't want to add here commented out.
+(defcustom word-wrap-whitespace-characters
+  '(;;?\N{SPACE}
+    ;;?\N{NO-BREAK SPACE}
+    ?\N{OGHAM SPACE MARK}
+    ?\N{EN QUAD}
+    ?\N{EM QUAD}
+    ?\N{EN SPACE}
+    ?\N{EM SPACE}
+    ?\N{THREE-PER-EM SPACE}
+    ?\N{FOUR-PER-EM SPACE}
+    ?\N{SIX-PER-EM SPACE}
+    ?\N{FIGURE SPACE}
+    ?\N{PUNCTUATION SPACE}
+    ?\N{THIN SPACE}
+    ?\N{HAIR SPACE}
+    ;;?\N{NARROW NO-BREAK SPACE}
+    ?\N{MEDIUM MATHEMATICAL SPACE}
+    ?\N{IDEOGRAPHIC SPACE}
+    ;; Not in the Zs category:
+    ?\N{ZERO WIDTH SPACE})
+  "Characters that `word-wrap-whitespace-mode' should add to `word-wrap'."
+  :version "29.1"
+  :type '(repeat char)
+  :group 'display)
+
+(defvar word-wrap-mode--previous-state)
+
+;;;###autoload
+(define-minor-mode word-wrap-whitespace-mode
+  "Allow `word-wrap' to fold on all breaking whitespace characters.
+The characters to break on are defined by `word-wrap-whitespace-characters'."
+  :group 'display
+  (if word-wrap-whitespace-mode
+      (progn
+        (setq-local word-wrap-mode--previous-state
+                    (list (category-table)
+                          (local-variable-p 'word-wrap-by-category)
+                          word-wrap-by-category
+                          (local-variable-p 'word-wrap)
+                          word-wrap))
+        (set-category-table (copy-category-table))
+        (dolist (char word-wrap-whitespace-characters)
+          (modify-category-entry char ?|))
+        (setq-local word-wrap-by-category t
+                    word-wrap t))
+    (pcase-let ((`(,table ,lby-cat ,by-cat
+                          ,lwrap ,wrap)
+                 word-wrap-mode--previous-state))
+      (if lby-cat
+          (setq-local word-wrap-by-category by-cat)
+        (kill-local-variable 'word-wrap-by-category))
+      (if lwrap
+          (setq-local word-wrap wrap)
+        (kill-local-variable 'word-wrap))
+      (set-category-table table))))
+
+;;;###autoload
+(define-globalized-minor-mode global-word-wrap-whitespace-mode
+  word-wrap-whitespace-mode word-wrap-whitespace-mode
+  :group 'display)
+
+(provide 'word-wrap-mode)
+
+;;; word-wrap-mode.el ends here