emacs-diffs
[Top][All Lists]
Advanced

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

emacs-28 9307889: Simplify shorthand injection (bug#50946)


From: João Távora
Subject: emacs-28 9307889: Simplify shorthand injection (bug#50946)
Date: Fri, 1 Oct 2021 20:43:40 -0400 (EDT)

branch: emacs-28
commit 9307889d68222bad1a7e449d3adddac40da788cc
Author: João Távora <joaotavora@gmail.com>
Commit: João Távora <joaotavora@gmail.com>

    Simplify shorthand injection (bug#50946)
    
    * lisp/loadup.el: Load "shorthands" relatively late. Set
    load-source-file-function to load-with-shorthands-and-code-conversion
    
    * lisp/international/mule.el (hack-elisp-shorthands)
    (load-with-shorthands-and-code-conversion): Move to
    lisp/shorthands.el
    
    * lisp/shorthands.el: New file.
---
 lisp/international/mule.el | 32 ---------------------------
 lisp/loadup.el             |  6 ++++-
 lisp/shorthands.el         | 55 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+), 33 deletions(-)

diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 2298af4..2a855b5 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -294,31 +294,6 @@ attribute."
 
     (apply 'define-charset-internal name (mapcar 'cdr attrs))))
 
-(defun hack-elisp-shorthands (fullname)
-  "Return value of the `elisp-shorthands' file-local variable in FULLNAME.
-FULLNAME is the absolute file name of an Elisp .el file which
-potentially specifies a file-local value for `elisp-shorthands'.
-The Elisp code in FULLNAME isn't read or evaluated in any way, except
-for extraction of the buffer-local value of `elisp-shorthands'."
-  (let ((size (nth 7 (file-attributes fullname))))
-    (with-temp-buffer
-      (insert-file-contents fullname nil (max 0 (- size 3000)) size)
-      (goto-char (point-max))
-      (let* ((found (search-backward-regexp "elisp-shorthands:[ \t]*" 0 t))
-             (val (and found
-                       (goto-char (match-end 0))
-                       (ignore-errors (read (current-buffer)))))
-             (probe val)
-             aux)
-        (catch 'done
-          (when (consp probe)
-            (while (setq aux (pop probe))
-              (unless (and (consp aux)
-                           (stringp (car aux))
-                           (stringp (cdr aux)))
-                (throw 'done nil)))
-            val))))))
-
 (defun load-with-code-conversion (fullname file &optional noerror nomessage)
   "Execute a file of Lisp code named FILE whose absolute name is FULLNAME.
 The file contents are decoded before evaluation if necessary.
@@ -378,13 +353,6 @@ Return t if file exists."
          (message "Loading %s...done" file)))
       t)))
 
-(defun load-with-shorthands-and-code-conversion (fullname file noerror 
nomessage)
-  "Like `load-with-code-conversion', but also consider Elisp shorthands.
-This function uses shorthands defined in the file FULLNAME's local
-value of `elisp-shorthands', when it processes that file's Elisp code."
-  (let ((elisp-shorthands (hack-elisp-shorthands fullname)))
-    (load-with-code-conversion fullname file noerror nomessage)))
-
 (defun charset-info (charset)
   "Return a vector of information of CHARSET.
 This function is provided for backward compatibility.
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 942057c..af99744 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -151,7 +151,7 @@
 ;; variable its advertised default value (it starts as nil, see
 ;; xdisp.c).
 (setq resize-mini-windows 'grow-only)
-(setq load-source-file-function #'load-with-shorthands-and-code-conversion)
+(setq load-source-file-function #'load-with-code-conversion)
 (load "files")
 
 ;; Load-time macro-expansion can only take effect after setting
@@ -352,6 +352,10 @@
 (load "vc/ediff-hook")
 (load "uniquify")
 (load "electric")
+
+(load "shorthands")
+(setq load-source-file-function #'load-with-shorthands-and-code-conversion)
+
 (load "emacs-lisp/eldoc")
 (load "cus-start") ;Late to reduce customize-rogue (needs loaddefs.el anyway)
 (if (not (eq system-type 'ms-dos))
diff --git a/lisp/shorthands.el b/lisp/shorthands.el
new file mode 100644
index 0000000..c72c04a
--- /dev/null
+++ b/lisp/shorthands.el
@@ -0,0 +1,55 @@
+;;; shorthands.el --- Read code considering Elisp shorthands  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; Author: João Távora <joaotavora@gmail.com>
+;; Keywords: lisp
+
+;; 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:
+
+;; Basic helpers for loading files with Shorthands.
+
+;;; Code:
+(require 'files)
+
+(defun hack-elisp-shorthands (fullname)
+  "Return value of `elisp-shorthands' file-local variable in FULLNAME.
+FULLNAME is the absolute file name of an Elisp .el file which
+potentially specifies a file-local value for `elisp-shorthands'.
+The Elisp code in FULLNAME isn't read or evaluated in any way,
+except for extraction of the buffer-local value of
+`elisp-shorthands'."
+  (let* ((size (nth 7 (file-attributes fullname)))
+         (from (max 0 (- size 3000)))
+         (to size))
+    (with-temp-buffer
+      (while (and (< (buffer-size) 3000) (>= from 0))
+        (insert-file-contents fullname nil from to)
+        (setq to from from (- from 100)))
+      ;; FIXME: relies on the `hack-local-variables--find-variables'
+      ;; detail of files.el.  That function should be exported,
+      ;; possibly be refactored into two parts, since we're only
+      ;; interested in basic "Local Variables" parsing.
+      (alist-get 'elisp-shorthands (hack-local-variables--find-variables)))))
+
+(defun load-with-shorthands-and-code-conversion (fullname file noerror 
nomessage)
+  "Like `load-with-code-conversion', but also consider Elisp shorthands.
+This function uses shorthands defined in the file FULLNAME's local
+value of `elisp-shorthands', when it processes that file's Elisp code."
+  (let ((elisp-shorthands (hack-elisp-shorthands fullname)))
+    (load-with-code-conversion fullname file noerror nomessage)))
+
+;;; shorthands.el ends here



reply via email to

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