emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 5b449c4: * visual-fill.el: New packagepackages/visual-fill


From: Stefan Monnier
Subject: [elpa] master 5b449c4: * visual-fill.el: New packagepackages/visual-fill/visual-fill.el
Date: Mon, 15 Oct 2018 22:35:21 -0400 (EDT)

branch: master
commit 5b449c4803b17efdc618b141cbeb6123cf11db5e
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>

    * visual-fill.el: New packagepackages/visual-fill/visual-fill.el
---
 packages/visual-fill/visual-fill.el | 75 +++++++++++++++++++++++++++++++++++++
 1 file changed, 75 insertions(+)

diff --git a/packages/visual-fill/visual-fill.el 
b/packages/visual-fill/visual-fill.el
new file mode 100644
index 0000000..c8fae2f
--- /dev/null
+++ b/packages/visual-fill/visual-fill.el
@@ -0,0 +1,75 @@
+;;; visual-fill.el --- Auto-refill paragraphs without modifying the buffer  
-*- lexical-binding: t; -*-
+
+;; Copyright (C) 2018  Stefan Monnier
+
+;; Author: Stefan Monnier <address@hidden>
+;; Keywords: 
+
+;; This program 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.
+
+;; This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This `visual-fill-mode' minor mode basically "unfills" paragraphs within
+;; jit-lock, hence without modifying the buffer.  Combined with the normal
+;; line-wrapping this performs a kind of "auto refill" which can be more or
+;; less sophisticated depending on the line-wrapping used.
+;;
+;; For best effect, combine it with `visual-line-mode' and
+;; `adaptive-wrap-prefix-mode'.
+
+;;; Code:
+
+(defconst visual-fill--space " ")
+
+(defun visual-fill--cleanup (start end)
+  (while (and (< start end)
+              (setq start (text-property-any start end 'display 
visual-fill--space)))
+    (remove-text-properties
+     start
+     (setq start (or (text-property-not-all start end
+                                            'display visual-fill--space)
+                     end))
+     '(display nil))))
+
+(defun visual-fill--jit (start end)
+  (visual-fill--cleanup start end)
+  (goto-char start)
+  (forward-line 0)
+  (let ((after-sep (looking-at paragraph-separate)))
+    (while (< (point) end)
+      (forward-line 1)
+      (if after-sep
+          (setq after-sep (looking-at paragraph-separate))
+        (unless (or (setq after-sep (looking-at paragraph-separate))
+                    (looking-at paragraph-start))
+          (put-text-property (1- (point))
+                             (if (looking-at (if adaptive-fill-mode
+                                                 adaptive-fill-regexp "[ 
\t]+"))
+                                 (match-end 0)
+                               (point))
+                             'display visual-fill--space))))))
+
+;;;###autoload
+(define-minor-mode visual-fill-mode
+  "Auto-refill paragraphs without modifying the buffer."
+  :lighter " VFill"
+  :global nil
+  (jit-lock-unregister #'visual-fill--jit)
+  (with-silent-modifications
+    (visual-fill--cleanup (point-min) (point-max)))
+  (when visual-fill-mode
+    (jit-lock-register #'visual-fill--jit)))
+
+(provide 'visual-fill)
+;;; visual-fill.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]