From: Dima Kogan <dima@secretsauce.net>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: Can we expand the valid location of "Local Variables" ?
Date: Sun, 22 Mar 2020 16:08:56 -0700 [thread overview]
Message-ID: <87h7ygoulz.fsf@dima.secretsauce.net> (raw)
In-Reply-To: <jwvo8t3x59v.fsf-monnier+emacs@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 1916 bytes --]
I sent this out a week ago, but I guess the email didn't make it for
some reason (I don't see it in the list archives, and nobody replied).
Apologies if you get this twice.
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> Probably we'd want to make this into a variable? And the default maybe
>> should be higher than 3000?
>
> I don't like having this 3000 hard-coded everywhere, so making
> a variable makes sense.
>
> But encouraging large "Local Variables" blocks is a bad idea, IMO, so
> I'd keep it at 3000 and I wouldn't care to document the var either.
> I'd even be happy with a "--" in its name.
>
>> The use case where I hit this was in an .org file that was defining a
>> presentation where I needed to control the export with an eval: (progn
>> ...) block. Org wasn't doing quite what I needed it to, so the block had
>> some advice definitions in it, and that pushed the thing over the 3000
>> byte limit.
>
> Of course, you can use a short
>
> eval: (progn (re-search-backward "^(progn ;;local-config") (eval (read (current-buffer))))
>
> and then put an arbitrarily long Elisp chunk anywhere else in the buffer
> with a leading `(progn ;;local-config`.
Thanks for the suggestions, everyone. For my personal usage I think both
including files to eval and specifying custom look-back-distance
variables is a bit overkill. I think that
1. We should put the 3000 into a variable so that this isn't hard-coded.
I'm attaching a patch. The name of the variable could probably be
better, and it's not in the right file. I don't know where else to
put it. Suggestions? And we need a NEWS entry, but I didn't want to
write one before we talked about it.
2. As workarounds go, I think Stefan's suggestion above is the nicest.
No custom variables or included files; just a directive to search
backwards, and execute what it finds. I'll use that. Thanks for the
pointer
dima
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: files--local-variables-search-distance.patch --]
[-- Type: text/x-diff, Size: 9280 bytes --]
commit 65b63cab97d968dade6ec73c8696f3ee1cce5473
Author: Dima Kogan <dima@secretsauce.net>
Date: Sun Mar 15 21:46:35 2020 -0700
added files--local-variables-search-distance
diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index e7e879065ed..d3b5e14cfe0 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -1126,9 +1126,10 @@ Specifying File Variables
Apart from using a @samp{-*-} line, you can define file local
variables using a @dfn{local variables list} near the end of the file.
-The start of the local variables list should be no more than 3000
-characters from the end of the file, and must be on the last page if
-the file is divided into pages.
+The start of the local variables list should be no more than
+@code{files--local-variables-search-distance} characters from the end
+of the file (3000 by default), and must be on the last page if the
+file is divided into pages.
If a file has both a local variables list and a @samp{-*-} line,
Emacs processes @emph{everything} in the @samp{-*-} line first, and
diff --git a/doc/misc/calc.texi b/doc/misc/calc.texi
index 1dab29b8a5a..b707cfec2fa 100644
--- a/doc/misc/calc.texi
+++ b/doc/misc/calc.texi
@@ -31060,13 +31060,13 @@ Assignments in Embedded Mode
When Emacs loads a file into memory, it checks for a Local Variables
section like this one at the end of the file. If it finds this
-section, it does the specified things (in this case, running
-@kbd{C-x * a} automatically) before editing of the file begins.
-The Local Variables section must be within 3000 characters of the
-end of the file for Emacs to find it, and it must be in the last
-page of the file if the file has any page separators.
-@xref{File Variables, , Local Variables in Files, emacs, the
-Emacs manual}.
+section, it does the specified things (in this case, running @kbd{C-x
+* a} automatically) before editing of the file begins. The Local
+Variables section must be within
+@code{files--local-variables-search-distance} characters of the end of
+the file (3000 by default) for Emacs to find it, and it must be in the
+last page of the file if the file has any page separators. @xref{File
+Variables, , Local Variables in Files, emacs, the Emacs manual}.
Note that @kbd{C-x * a} does not update the formulas it finds.
To do this, type, say, @kbd{M-1 C-x * u} after @w{@kbd{C-x * a}}.
diff --git a/lisp/allout.el b/lisp/allout.el
index dedad45f827..f52e27784bb 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -6326,7 +6326,10 @@ allout-file-vars-section-data
(let (beg prefix suffix)
(save-excursion
(goto-char (point-max))
- (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
+ (search-backward "\n\^L" (max (- (point-max)
+ files--local-variables-search-distance)
+ (point-min))
+ 'move)
(if (let ((case-fold-search t))
(not (search-forward "Local Variables:" nil t)))
nil
diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index da98e44926e..d5b0db1dfbb 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -2084,7 +2084,9 @@ diary-make-entry
(goto-char (point-max))
(when (let ((case-fold-search t))
(search-backward "Local Variables:"
- (max (- (point-max) 3000) (point-min))
+ (max (- (point-max)
+ files--local-variables-search-distance)
+ (point-min))
t))
(beginning-of-line)
(insert "\n")
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index d3d17fda7ad..e1b3cf319a9 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -4571,7 +4571,9 @@ custom-save-delete
(case-fold-search t))
(save-excursion
(goto-char (point-max))
- (search-backward "\n\^L" (max (- (point-max) 3000) (point-min))
+ (search-backward "\n\^L" (max (- (point-max)
+ files--local-variables-search-distance)
+ (point-min))
'move)
(when (search-forward "Local Variables:" nil t)
(setq pos (line-beginning-position))))
diff --git a/lisp/files-x.el b/lisp/files-x.el
index 5d863626fa5..9aa64fd00be 100644
--- a/lisp/files-x.el
+++ b/lisp/files-x.el
@@ -169,7 +169,10 @@ modify-file-local-variable
;; Look for "Local variables:" line in last page.
(widen)
(goto-char (point-max))
- (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
+ (search-backward "\n\^L" (max (- (point-max)
+ files--local-variables-search-distance)
+ (point-min))
+ 'move)
;; Add "Local variables:" list if not found.
(unless (let ((case-fold-search t))
diff --git a/lisp/files.el b/lisp/files.el
index 8ce0187f5b7..4e173a2a674 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -3720,7 +3720,9 @@ hack-local-variables
;; Look for "Local variables:" line in last page.
(save-excursion
(goto-char (point-max))
- (search-backward "\n\^L" (max (- (point-max) 3000) (point-min))
+ (search-backward "\n\^L" (max (- (point-max)
+ files--local-variables-search-distance)
+ (point-min))
'move)
(when (let ((case-fold-search t))
(search-forward "Local Variables:" nil t))
diff --git a/lisp/international/latexenc.el b/lisp/international/latexenc.el
index cce5e06002a..5e3134feb9a 100644
--- a/lisp/international/latexenc.el
+++ b/lisp/international/latexenc.el
@@ -147,7 +147,9 @@ latexenc-find-file-coding-system
;; section?
(unless latexenc-dont-use-TeX-master-flag
(goto-char (point-max))
- (search-backward "\n\^L" (max (- (point-max) 3000) (point-min))
+ (search-backward "\n\^L" (max (- (point-max)
+ files--local-variables-search-distance)
+ (point-min))
'move)
(search-forward "Local Variables:" nil t)
(when (re-search-forward
diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el
index 2a7ab66a339..dbebf1d5f66 100644
--- a/lisp/org/org-macs.el
+++ b/lisp/org/org-macs.el
@@ -186,7 +186,9 @@ org-preserve-local-variables
(goto-char (point-max))
(let ((case-fold-search t))
(and (re-search-backward "^[ \t]*# +Local Variables:"
- (max (- (point) 3000) 1)
+ (max (- (point-max)
+ files--local-variables-search-distance)
+ 1)
t)
(delete-and-extract-region (point) (point-max)))))))
(unwind-protect (progn ,@body)
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index f92d3efdeb7..c28a2fd7e07 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -859,7 +859,10 @@ c-remove-any-local-eval-or-mode-variables
;; Most of the code here is derived from Emacs 21.3's `hack-local-variables'
;; in files.el.
(goto-char (point-max))
- (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
+ (search-backward "\n\^L" (max (- (point-max)
+ files--local-variables-search-distance)
+ (point-min))
+ 'move)
(let (lv-point (prefix "") (suffix ""))
(when (let ((case-fold-search t))
(search-forward "Local Variables:" nil t))
diff --git a/lisp/progmodes/dcl-mode.el b/lisp/progmodes/dcl-mode.el
index ab3321f6868..3d82d878bf3 100644
--- a/lisp/progmodes/dcl-mode.el
+++ b/lisp/progmodes/dcl-mode.el
@@ -1749,7 +1749,9 @@ dcl-save-local-variable
;; Look for "Local variables:" line in last page.
(save-excursion
(goto-char (point-max))
- (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
+ (search-backward "\n\^L" (max (- (point-max)
+ files--local-variables-search-distance)
+ (point-min)) 'move)
(if (let ((case-fold-search t))
(search-forward "Local Variables:" nil t))
(let ((continue t)
diff --git a/src/eval.c b/src/eval.c
index 4559a0e1f66..687576fb681 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -4026,6 +4026,14 @@ get_backtrace (Lisp_Object array)
void
syms_of_eval (void)
{
+ DEFVAR_INT ("files--local-variables-search-distance", files__local_variables_search_distance,
+ doc: /* How far to search for "Local Variables:" string at the end of a file
+
+When loading a file, emacs searches for a string "Local Variables:" at
+the end of the buffer. This variable controls how far from the end of
+the buffer we search. The default is 3000 characters. */);
+ files__local_variables_search_distance = 3000;
+
DEFVAR_INT ("max-specpdl-size", max_specpdl_size,
doc: /* Limit on number of Lisp variable bindings and `unwind-protect's.
If Lisp code tries to increase the total number past this amount,
next prev parent reply other threads:[~2020-03-22 23:08 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-10 20:56 Can we expand the valid location of "Local Variables" ? Dima Kogan
2020-03-10 21:39 ` Stefan Monnier
2020-03-10 23:44 ` Dima Kogan
2020-03-11 2:01 ` Stefan Monnier
2020-03-22 23:08 ` Dima Kogan [this message]
2020-03-23 8:25 ` Robert Pluim
2020-03-23 14:17 ` Eli Zaretskii
2020-03-23 15:28 ` Robert Pluim
2020-03-23 15:54 ` Eli Zaretskii
2020-03-23 17:03 ` Dima Kogan
2020-03-23 17:24 ` Stefan Monnier
2020-03-24 2:20 ` Richard Stallman
2020-03-12 2:26 ` Richard Stallman
2020-03-14 5:54 ` Steve Youngs
2020-03-14 7:07 ` Stefan Monnier
2020-03-15 3:08 ` Richard Stallman
2020-03-15 6:41 ` Steve Youngs
2020-03-16 3:36 ` Richard Stallman
2020-03-23 15:56 ` Yuri Khan
2020-03-23 16:55 ` Dima Kogan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h7ygoulz.fsf@dima.secretsauce.net \
--to=dima@secretsauce.net \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.