emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master c7a5074: * lisp/mail/footnote.el (footnote-align-to


From: Stefan Monnier
Subject: [Emacs-diffs] master c7a5074: * lisp/mail/footnote.el (footnote-align-to-fn-text): New config var
Date: Fri, 22 Dec 2017 23:06:29 -0500 (EST)

branch: master
commit c7a50740273a338285abe7c9bb24a1f45928e02a
Author: Boruch Baum <address@hidden>
Commit: Stefan Monnier <address@hidden>

    * lisp/mail/footnote.el (footnote-align-to-fn-text): New config var
    
    (footnote-mode): Declare.
    (Footnote--get-area-point-min): Fix last change to use 'car` instead of
    the undefined 'first'.
    (Footnote--calc-fn-alignment-column, Footnote--fill-prefix-string)
    (Footnote--adaptive-fill-function): New functions.
    (footnote-mode): Use them.
---
 etc/NEWS              |  5 +++++
 lisp/mail/footnote.el | 61 +++++++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 59 insertions(+), 7 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 714e964..1f8fe67 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -87,6 +87,11 @@ strings in non-text modes.
 
 * Changes in Specialized Modes and Packages in Emacs 27.1
 
+** Footnote-mode
+*** Support Hebrew-style footnotes
+*** Footnote text lines are now aligned.
+Can be controlled via the new variable 'footnote-align-to-fn-text'.
+
 ** CSS mode
 
 ---
diff --git a/lisp/mail/footnote.el b/lisp/mail/footnote.el
index 2726729..adfe03d 100644
--- a/lisp/mail/footnote.el
+++ b/lisp/mail/footnote.el
@@ -156,13 +156,21 @@ has no effect on buffers already displaying footnotes."
   :type 'string
   :group 'footnote)
 
-(defcustom footnote-signature-separator (if (boundp 
'message-signature-separator)
-                                           message-signature-separator
-                                         "^-- $")
+(defcustom footnote-signature-separator
+  (if (boundp 'message-signature-separator)
+      message-signature-separator
+    "^-- $")
   "Regexp used by Footnote mode to recognize signatures."
   :type 'regexp
   :group 'footnote)
 
+(defcustom footnote-align-to-fn-text t
+  "If non-nil, align footnote text lines.
+If nil, footnote text lines are to be aligned flush left with left side
+of the footnote number.  If non-nil footnote text lines are to be aligned
+with the first character of footnote text."
+  :type  'boolean)
+
 ;;; Private variables
 
 (defvar footnote-style-number nil
@@ -180,6 +188,8 @@ has no effect on buffers already displaying footnotes."
 (defvar footnote-mouse-highlight 'highlight
   "Text property name to enable mouse over highlight.")
 
+(defvar footnote-mode)
+
 ;;; Default styles
 ;;; NUMERIC
 (defconst footnote-numeric-regexp "[0-9]+"
@@ -675,6 +685,22 @@ Return nil if the cursor is not over a footnote."
   (or (get-text-property (point) 'footnote-number)
       (Footnote-text-under-cursor)))
 
+(defun Footnote--calc-fn-alignment-column ()
+  "Calculate the left alignment for footnote text."
+  ;; FIXME: Maybe it would be better to go to the footnote's beginning and
+  ;; see at which column it starts.
+  (+ footnote-body-tag-spacing
+     (string-width
+      (concat footnote-start-tag  footnote-end-tag
+              (Footnote-index-to-string
+               (caar (last footnote-text-marker-alist)))))))
+
+(defun Footnote--fill-prefix-string ()
+  "Return the fill prefix to be used by footnote mode."
+  ;; TODO: Prefix to this value other prefix strings, such as those
+  ;; designating a comment line, a message response, or a boxquote.
+  (make-string (Footnote--calc-fn-alignment-column) ?\s))
+
 (defun Footnote--point-in-body-p ()
   "Return non-nil if point is in the buffer text area,
 i.e. before the beginning of the footnote area."
@@ -688,12 +714,12 @@ instead, if applicable."
   (cond
    ;; FIXME: Shouldn't we use `Footnote--get-area-point-max' instead?
    ((not footnote-text-marker-alist) (point-max))
-   ((not before-tag) (cdr (first footnote-text-marker-alist)))
+   ((not before-tag) (cdr (car footnote-text-marker-alist)))
    ((string-equal footnote-section-tag "")
-    (cdr (first footnote-text-marker-alist)))
+    (cdr (car footnote-text-marker-alist)))
    (t
     (save-excursion
-      (goto-char (cdr (first footnote-text-marker-alist)))
+      (goto-char (cdr (car footnote-text-marker-alist)))
       (if (re-search-backward (concat "^" footnote-section-tag-regexp) nil t)
           (match-beginning 0)
         (message "Footnote section tag not found!")
@@ -713,7 +739,7 @@ instead, if applicable."
         ;; function, and repeat.
         ;;
         ;; TODO: integrate sanity checks at reasonable operational points.
-        (cdr (first footnote-text-marker-alist)))))))
+        (cdr (car footnote-text-marker-alist)))))))
 
 (defun Footnote--get-area-point-max ()
   "Return the end of footnote area.
@@ -722,6 +748,18 @@ defined by variable `footnote-signature-separator'. If 
there is no
 footnote area, returns `point-max'."
   (save-excursion (Footnote-goto-char-point-max)))
 
+(defun Footnote--adaptive-fill-function (orig-fun)
+  (or
+   (and
+    footnote-mode
+    footnote-align-to-fn-text
+    (Footnote-text-under-cursor)
+    ;; (not (Footnote--point-in-body-p))
+    ;; (< (point) (Footnote--signature-area-start-point))
+    (Footnote--fill-prefix-string))
+   ;; If not within a footnote's text, fallback to the default.
+   (funcall orig-fun)))
+
 ;;; User functions
 
 (defun Footnote-make-hole ()
@@ -913,6 +951,12 @@ play around with the following keys:
   :lighter    footnote-mode-line-string
   :keymap     footnote-minor-mode-map
   ;; (filladapt-mode t)
+  (unless adaptive-fill-function
+    ;; nil and `ignore' have the same semantics for adaptive-fill-function,
+    ;; but only `ignore' behaves correctly with add/remove-function.
+    (setq adaptive-fill-function #'ignore))
+  (remove-function (local 'adaptive-fill-function)
+                   #'Footnote--adaptive-fill-function)
   (when footnote-mode
     ;; (Footnote-setup-keybindings)
     (make-local-variable 'footnote-style)
@@ -922,6 +966,9 @@ play around with the following keys:
     (make-local-variable 'footnote-section-tag-regexp)
     (make-local-variable 'footnote-start-tag)
     (make-local-variable 'footnote-end-tag)
+    (make-local-variable 'adaptive-fill-function)
+    (add-function :around (local 'adaptive-fill-function)
+                  #'Footnote--adaptive-fill-function)
 
     ;; filladapt is an XEmacs package which AFAIK has never been ported
     ;; to Emacs.



reply via email to

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