* jit-lock-antiblink-grace @ 2019-10-10 22:34 João Távora 2019-10-11 14:26 ` jit-lock-antiblink-grace Stefan Monnier ` (2 more replies) 0 siblings, 3 replies; 58+ messages in thread From: João Távora @ 2019-10-10 22:34 UTC (permalink / raw) To: emacs-devel, Lars Ingebrigtsen, Clément Pit-Claudel, Stefan Monnier [-- Attachment #1: Type: text/plain, Size: 1121 bytes --] Hello all, A while back I coded up a feature in a scratch branch that I dubbed the "antiblink". It helps avoid the fontification "blinking" behaviour observed when creating temporarily unterminated strings to source code. I recall that Lars and Clément tested it with generally positive results. At Stefan's request, I have reworked the implementation and cleaned up the feature, which is embodied in the jit-lock-antiblink-grace variable and want to land it on master if no-one objects. If you want to try it before that happens see the scratch/jit-lock-antiblink-cleaned-up branch. jit-lock-antiblink-grace is set to 2 seconds by default, which works nicely in my testing. Just launch your emacs, ensure you don't have a quote-matching facility such as electric-pair-mode setup (in which case the feature is mostly useless to you), and add/or remove strings to some source code. Thanks, João Távora BTW: I tried to force-push the cleaned-up version to the scratch/jit-lock-antiblink branch. It didn't work. Is force-pushing disabled in those branches? It didn't use to be, IIRC. [-- Attachment #2: Type: text/html, Size: 1835 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-10 22:34 jit-lock-antiblink-grace João Távora @ 2019-10-11 14:26 ` Stefan Monnier 2019-10-12 9:34 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-13 12:02 ` jit-lock-antiblink-grace Alan Mackenzie 2 siblings, 0 replies; 58+ messages in thread From: Stefan Monnier @ 2019-10-11 14:26 UTC (permalink / raw) To: João Távora Cc: Lars Ingebrigtsen, Clément Pit-Claudel, emacs-devel > At Stefan's request, I have reworked the implementation and > cleaned up the feature, which is embodied in the jit-lock-antiblink-grace > variable and want to land it on master if no-one objects. No objection from me. > BTW: I tried to force-push the cleaned-up version to the > scratch/jit-lock-antiblink branch. It didn't work. Is force-pushing > disabled in those branches? It didn't use to be, IIRC. Force-pushing is disabled repository-wide. You can workaround it by removing+pushing the branch, instead (this workaround can technically be used on any branch, but of course we don't want it used elsewhere than in scratch/* branches). Stefan ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-10 22:34 jit-lock-antiblink-grace João Távora 2019-10-11 14:26 ` jit-lock-antiblink-grace Stefan Monnier @ 2019-10-12 9:34 ` Eli Zaretskii 2019-10-12 10:57 ` jit-lock-antiblink-grace João Távora 2019-10-13 12:02 ` jit-lock-antiblink-grace Alan Mackenzie 2 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-10-12 9:34 UTC (permalink / raw) To: João Távora; +Cc: larsi, cpitclaudel, monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Thu, 10 Oct 2019 23:34:25 +0100 > > A while back I coded up a feature in a scratch branch that > I dubbed the "antiblink". It helps avoid the fontification "blinking" > behaviour observed when creating temporarily unterminated > strings to source code. > > I recall that Lars and Clément tested it with generally positive results. > > At Stefan's request, I have reworked the implementation and > cleaned up the feature, which is embodied in the jit-lock-antiblink-grace > variable and want to land it on master if no-one objects. > > If you want to try it before that happens see the > scratch/jit-lock-antiblink-cleaned-up branch. Bother: this unconditionally adds a post-command-hook, which will necessarily slow down paging through a file. If there's no better solution than using that over-used hook, then at the very least we should give users a way of NOT adding a post-command-hook when this feature is disabled. Some more comments about the code: > +** New customizable variable 'jit-lock-antiblink-grace' This line should end in a period > +Setting this to a positive number of seconds helps avoid the > +fontification "blinking" behaviour observed when adding temporarily > +unterminated strings to source code. If the user has recently created > +an unterminated string at EOL, jit fontification allows this idle > +"grace" period to elapse before deciding it is a multi-line string and > +fontifying the remainder of the buffer accordingly. This should be simplified and shortened. (In general, copy/paste of doc strings into NEWS is not a good idea.) In particular, if the default is to have this behavior (see below), the NEWS entry should tell how to disable that. > +(defcustom jit-lock-antiblink-grace 2 > + "Like `jit-lock-context-time' but for unterminated multiline strings. > +Setting this to a positive number of seconds helps avoid the > +fontification \"blinking\" behaviour observed when adding > +temporarily unterminated strings to source code. If the user has > +recently created an unterminated string at EOL, allow for an idle > +\"grace\" period to elapse before deciding it is a multi-line > +string and fontifying the remainder of the buffer accordingly." > + :type '(number :tag "seconds") > + :group 'jit-lock) This new defcustom should have a :version tag. The doc string should say how to disable the feature. Also, the doc string makes it sound like the default is not a positive number of seconds by default, but it is. (I question the wisdom of making this the default behavior, btw.) I don't understand the "at EOL" part: isn't any unterminated string appear as if it is "at EOL"? > +(defvar jit-lock--antiblink-l-b-p (make-marker) > + "Last line beginning position (l-b-p) after last command (a marker).") > +(defvar jit-lock--antiblink-i-s-o-c nil > + "In string or comment (i-s-o-c) after last command (a boolean).") Please don't use such cryptic variable names, at least not on the file level (preferably also not locally inside functions). > + (add-hook 'post-command-hook 'jit-lock--antiblink-post-command nil t) As mentioned above, this hook should not be added if the feature is disabled. > + (when jit-lock--antiblink-grace-timer > + (message "internal warning: `jit-lock--antiblink-grace-timer' not null")) We should in general avoid calling 'message' here, because such a message will appear after every command, which is a nuisance. Is this really needed? Thanks. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 9:34 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-12 10:57 ` João Távora 2019-10-12 13:02 ` jit-lock-antiblink-grace Juanma Barranquero 2019-10-12 13:32 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 2 replies; 58+ messages in thread From: João Távora @ 2019-10-12 10:57 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 5362 bytes --] On Sat, Oct 12, 2019 at 10:34 AM Eli Zaretskii <eliz@gnu.org> wrote: > > If you want to try it before that happens see the > > scratch/jit-lock-antiblink-cleaned-up branch. > > Bother: this unconditionally adds a post-command-hook, which will > necessarily slow down paging through a file. Everything slows down everything, the question is where and by how much. A noop will probably not slow paging very much. Can you tell me more about the kinds of files you're anxious about and exact meaning of "paging"? Is it C-n'ing from the first line to the last? I could benchmark. > If there's no better solution than using that over-used hook, My very first version relied on an extension of the existing jit-lock-context-time, but I seem to remember it broke down here and there sometimes. I agreed with Stefan (possibly off-list) to use a post-command-hook, which is safer. But I can have a look at the original version and re-study those problems more closely. > then at the very least we should give users a way of NOT adding a > post-command-hook when this feature is disabled. Given that I intend for this to be controlled via a customization variable, I only see it done via a `:set` hook or something like that. Or use some hack where the current timers detect the variable has been enabled/disabled. > Some more comments about the code: > > > +** New customizable variable 'jit-lock-antiblink-grace' > > This line should end in a period OK. > > +Setting this to a positive number of seconds helps avoid the > > +fontification "blinking" behaviour observed when adding temporarily > > +unterminated strings to source code. If the user has recently created > > +an unterminated string at EOL, jit fontification allows this idle > > +"grace" period to elapse before deciding it is a multi-line string and > > +fontifying the remainder of the buffer accordingly. > > This should be simplified and shortened. (In general, copy/paste of > doc strings into NEWS is not a good idea.) In particular, if the > default is to have this behavior (see below), the NEWS entry should > tell how to disable that. OK. Supposing you've already already gotten the idea, I invite you to submit a suggestion. > > +(defcustom jit-lock-antiblink-grace 2 > > + "Like `jit-lock-context-time' but for unterminated multiline strings. > > +Setting this to a positive number of seconds helps avoid the > > +fontification \"blinking\" behaviour observed when adding > > +temporarily unterminated strings to source code. If the user has > > +recently created an unterminated string at EOL, allow for an idle > > +\"grace\" period to elapse before deciding it is a multi-line > > +string and fontifying the remainder of the buffer accordingly." > > + :type '(number :tag "seconds") > > + :group 'jit-lock) > > This new defcustom should have a :version tag. OK. > The doc string should say how to disable the feature. Also, the doc > string makes it sound like the default is not a positive number of > seconds by default, but it is. > (I question the wisdom of making this the default behavior, btw.) What's bothering you? (assuming all other objections you stated already are somehow dealt with satisfactorily.) > I don't understand the "at EOL" part: isn't any unterminated string > appear as if it is "at EOL"? An unterminated string at EOL might be terminated somewhere _after_ EOL, i.e. a perfectly legitimate (as "in your intentions") multiline string. Moreover this is a hint as to how the system is implemented, which some users may appreciate. > > +(defvar jit-lock--antiblink-l-b-p (make-marker) > > + "Last line beginning position (l-b-p) after last command (a marker).") > > +(defvar jit-lock--antiblink-i-s-o-c nil > > + "In string or comment (i-s-o-c) after last command (a boolean).") > > Please don't use such cryptic variable names, at least not on the file > level (preferably also not locally inside functions). The docstring explains the abbreviation. I'm afraid that given current naming practice (prefix, double dash, sub-feature) I couldn't do much better. I think jit-lock--antiblink-l-b-p is a better name than jit-lock--antiblink-pos, or jit-lock--pos, because it makes the reader "chase" the doc and learn of the exact meaning of the abbreviation. Do you really prever jit-lock--antiblink-in-string-or-comment and jit-lock--antiblink-line-beginning-position? I think it's much harder to follow. But I will abide, especially if you suggest alternatives. > > + (add-hook 'post-command-hook 'jit-lock--antiblink-post-command nil t) > > As mentioned above, this hook should not be added if the feature is > disabled. See above. > > + (when jit-lock--antiblink-grace-timer > > + (message "internal warning: `jit-lock--antiblink-grace-timer' not null")) > > We should in general avoid calling 'message' here, because such a > message will appear after every command, which is a nuisance. Is this > really needed? This is an internal consistency check, i.e. a run-time assertion. It should never happen, except when the program is buggy. I had this set to 'warn', but Stefan suggested I change it. What do you suggest? Perhaps I could warn and turn off the feature. João [-- Attachment #2: Type: text/html, Size: 6209 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 10:57 ` jit-lock-antiblink-grace João Távora @ 2019-10-12 13:02 ` Juanma Barranquero 2019-10-12 13:14 ` jit-lock-antiblink-grace João Távora 2019-10-12 13:32 ` jit-lock-antiblink-grace Eli Zaretskii 1 sibling, 1 reply; 58+ messages in thread From: Juanma Barranquero @ 2019-10-12 13:02 UTC (permalink / raw) To: João Távora; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 942 bytes --] On Sat, Oct 12, 2019 at 12:59 PM João Távora <joaotavora@gmail.com> wrote: > Do you really prever jit-lock--antiblink-in-string-or-comment and > jit-lock--antiblink-line-beginning-position? > In a clean emacs -Q we already have things like minibuffer-history-case-insensitive-variables jit-lock-after-change-extend-region-functions lisp-el-font-lock-keywords-for-backtraces-1 lisp-el-font-lock-keywords-for-backtraces-2 display-buffer--action-function-custom-type jka-compr-added-to-file-coding-system-alist revert-buffer-insert-file-contents-function w32-direct-print-region-use-command-dot-com backup-by-copying-when-privileged-mismatch window-adjust-process-window-size-function electric-indent-functions-without-reindent list-matching-lines-default-context-lines lisp-el-font-lock-keywords-for-backtraces syntax-propertize-extend-region-functions jka-compr-compression-info-list--internal which are longer. [-- Attachment #2: Type: text/html, Size: 1295 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 13:02 ` jit-lock-antiblink-grace Juanma Barranquero @ 2019-10-12 13:14 ` João Távora 2019-10-12 14:50 ` jit-lock-antiblink-grace Juanma Barranquero 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-10-12 13:14 UTC (permalink / raw) To: Juanma Barranquero; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1489 bytes --] On Sat, Oct 12, 2019 at 2:02 PM Juanma Barranquero <lekktu@gmail.com> wrote: > On Sat, Oct 12, 2019 at 12:59 PM João Távora <joaotavora@gmail.com> wrote: > > > Do you really prever jit-lock--antiblink-in-string-or-comment and > > jit-lock--antiblink-line-beginning-position? > >> > In a clean emacs -Q we already have things like > > minibuffer-history-case-insensitive-variables > jit-lock-after-change-extend-region-functions > lisp-el-font-lock-keywords-for-backtraces-1 > lisp-el-font-lock-keywords-for-backtraces-2 > display-buffer--action-function-custom-type > jka-compr-added-to-file-coding-system-alist > revert-buffer-insert-file-contents-function > w32-direct-print-region-use-command-dot-com > backup-by-copying-when-privileged-mismatch > window-adjust-process-window-size-function > electric-indent-functions-without-reindent > list-matching-lines-default-context-lines > lisp-el-font-lock-keywords-for-backtraces > syntax-propertize-extend-region-functions > jka-compr-compression-info-list--internal > > which are longer. > I don't understand how this can be an argument. Is not exceeding the length of the longest symbol ever, i.e. playing to the 99% percentile, acceptable criteria for readability? I don't think so, personally. That said, I'm neither in love with the solution I came up with nor will I kill myself over long symbol names :-) Perhaps a plist `jit-lock--antiblink-info` can be a compromise. -- João Távora [-- Attachment #2: Type: text/html, Size: 2215 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 13:14 ` jit-lock-antiblink-grace João Távora @ 2019-10-12 14:50 ` Juanma Barranquero 2019-10-12 15:11 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Juanma Barranquero @ 2019-10-12 14:50 UTC (permalink / raw) To: João Távora; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 410 bytes --] On Sat, Oct 12, 2019 at 3:14 PM João Távora <joaotavora@gmail.com> wrote: > I don't understand how this can be an argument. It wasn't an argument, it was a light-hearted comment. > Is not exceeding the length of the longest symbol > ever, i.e. playing to the 99% percentile, acceptable > criteria for readability? I don't think so, personally. Well, me, I prefer longer names to cryptic ones. [-- Attachment #2: Type: text/html, Size: 614 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 14:50 ` jit-lock-antiblink-grace Juanma Barranquero @ 2019-10-12 15:11 ` João Távora 2019-10-12 15:30 ` jit-lock-antiblink-grace Juanma Barranquero 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-10-12 15:11 UTC (permalink / raw) To: Juanma Barranquero; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 810 bytes --] On Sat, Oct 12, 2019, 15:50 Juanma Barranquero <lekktu@gmail.com> wrote: > > > On Sat, Oct 12, 2019 at 3:14 PM João Távora <joaotavora@gmail.com> wrote: > > > I don't understand how this can be an argument. > > It wasn't an argument, it was a light-hearted comment. > Sorry for the knee-jerk, then. > > Well, me, I prefer longer names to cryptic ones > Then it _was_ an argument :-) "cryptic" is a value judgement. I personally decide on form on a case by case basis, but I can't really write the cost function I use. Unfortunately, after a while, you become biased. It's often when you actually witness others try to understand what you wrote that you realize the consequences of one decision over the other. That's hard to do in this ML... But did you try to read it? João [-- Attachment #2: Type: text/html, Size: 1833 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 15:11 ` jit-lock-antiblink-grace João Távora @ 2019-10-12 15:30 ` Juanma Barranquero 0 siblings, 0 replies; 58+ messages in thread From: Juanma Barranquero @ 2019-10-12 15:30 UTC (permalink / raw) To: João Távora; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 423 bytes --] On Sat, Oct 12, 2019 at 5:11 PM João Távora <joaotavora@gmail.com> wrote: > Then it _was_ an argument :-) Nope. I can easily decouple what I prefer, and what could be best, or what most prefer ;-) I dislike customize, but I would never argue against it, for example. > But did you try to read it? Yes. But I have nothing of value to add, other than misplaced light-hearted comments ;-) I'l shut up now. [-- Attachment #2: Type: text/html, Size: 772 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 10:57 ` jit-lock-antiblink-grace João Távora 2019-10-12 13:02 ` jit-lock-antiblink-grace Juanma Barranquero @ 2019-10-12 13:32 ` Eli Zaretskii 2019-10-12 14:13 ` jit-lock-antiblink-grace Stefan Monnier 2019-10-12 14:23 ` jit-lock-antiblink-grace João Távora 1 sibling, 2 replies; 58+ messages in thread From: Eli Zaretskii @ 2019-10-12 13:32 UTC (permalink / raw) To: João Távora; +Cc: monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Sat, 12 Oct 2019 11:57:39 +0100 > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca> > > > Bother: this unconditionally adds a post-command-hook, which will > > necessarily slow down paging through a file. > > Everything slows down everything, the question is where and by how much. The post-command-hook is notorious for slowing down cursor motion. Many complaints I hear about Emacs being sluggish eventually boil down to some minor mode inserting itself into that hook and doing non-trivial stuff there. We should therefore do so very cautiously. This case is more important than others because JIT font-lock is enabled by default, so this change will affect every user out there, in any possible major mode. > Can you tell me more about the kinds of files you're anxious about > and exact meaning of "paging"? Is it C-n'ing from the first line to > the last? I could benchmark. C-n and C-v. Try C mode for starters, and then Emacs Lisp. > > If there's no better solution than using that over-used hook, > > My very first version relied on an extension of the existing > jit-lock-context-time, but I seem to remember it broke down here and > there sometimes. I agreed with Stefan (possibly off-list) to use a > post-command-hook, which is safer. But I can have a look at the > original version and re-study those problems more closely. We also have display-related hooks. If you could use one of them, that might be better, because one could generally type quite a few commands before redisplay kicks in, and post-command-hook runs once for every command. > > then at the very least we should give users a way of NOT adding a > > post-command-hook when this feature is disabled. > > Given that I intend for this to be controlled via a customization > variable, I only see it done via a `:set` hook or something like that. I'm not sure I understand. What I wanted to suggest is that when the new defcustom is nil (which seems to be the way to disable this feature), the post-command-hook should not be added. In addition, I think major modes which present read-only buffers should also disable this feature, and not add to post-command-hook. > > > +Setting this to a positive number of seconds helps avoid the > > > +fontification "blinking" behaviour observed when adding temporarily > > > +unterminated strings to source code. If the user has recently created > > > +an unterminated string at EOL, jit fontification allows this idle > > > +"grace" period to elapse before deciding it is a multi-line string and > > > +fontifying the remainder of the buffer accordingly. > > > > This should be simplified and shortened. (In general, copy/paste of > > doc strings into NEWS is not a good idea.) In particular, if the > > default is to have this behavior (see below), the NEWS entry should > > tell how to disable that. > > OK. Supposing you've already already gotten the idea, I invite you to > submit a suggestion. I'd rather had you try. I think it's important that more people can write good documentation, and I think in this case it isn't hard. You can use other entries as examples. > > (I question the wisdom of making this the default behavior, btw.) > > What's bothering you? It's a backward-incompatible behavior, and is not being developed due to bug reports, so why make it the default right from the start? It also slows down cursor motion (which should probably be in the doc string as well). > > I don't understand the "at EOL" part: isn't any unterminated string > > appear as if it is "at EOL"? > > An unterminated string at EOL might be terminated somewhere _after_ EOL, > i.e. a perfectly legitimate (as "in your intentions") multiline string. I still don't think I understand what would constitute an "unterminated string at EOL", then. Could you show two examples, one where there is such a string, the other where there isn't? > Moreover this is a hint as to how the system is implemented, which some > users may appreciate. This kind of stuff should be in comments, not ion doc strings, IMO. > > Please don't use such cryptic variable names, at least not on the file > > level (preferably also not locally inside functions). > > The docstring explains the abbreviation. I'm afraid that given current > naming practice (prefix, double dash, sub-feature) I couldn't do much > better. I think jit-lock--antiblink-l-b-p is a better name than > jit-lock--antiblink-pos, or jit-lock--pos, because it makes the reader > "chase" the doc and learn of the exact meaning of the abbreviation. The variables don't need to use jit-lock--antiblink- prefix, they could use jit-lock-- prefix instead. jit-lock--last-line-begpos doesn't sound too long to me, for example. > > > + (when jit-lock--antiblink-grace-timer > > > + (message "internal warning: `jit-lock--antiblink-grace-timer' not null")) > > > > We should in general avoid calling 'message' here, because such a > > message will appear after every command, which is a nuisance. Is this > > really needed? > > This is an internal consistency check, i.e. a run-time assertion. It > should never happen, except when the program is buggy. I had this set > to 'warn', but Stefan suggested I change it. What do you suggest? > Perhaps I could warn and turn off the feature. Why not just lose the message? Why is it important to display it? ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 13:32 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-12 14:13 ` Stefan Monnier 2019-10-12 14:23 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 15:47 ` jit-lock-antiblink-grace Alan Mackenzie 2019-10-12 14:23 ` jit-lock-antiblink-grace João Távora 1 sibling, 2 replies; 58+ messages in thread From: Stefan Monnier @ 2019-10-12 14:13 UTC (permalink / raw) To: Eli Zaretskii; +Cc: João Távora, emacs-devel >> My very first version relied on an extension of the existing >> jit-lock-context-time, but I seem to remember it broke down here and >> there sometimes. I agreed with Stefan (possibly off-list) to use a >> post-command-hook, which is safer. But I can have a look at the [ FWIW: I can't remember why I recommended/suggested post-command-hook, sorry. ] >> original version and re-study those problems more closely. > We also have display-related hooks. If you could use one of them, > that might be better, because one could generally type quite a few > commands before redisplay kicks in, and post-command-hook runs once > for every command. Really? AFAIK we redisplay at the end of every command executed. We additionally redisplay after processing filters and after receiving an event that turned out to be a prefix key, etc... So, AFAICT we generally redisplay at least as often as we run post-command-hook. The only case where we don't is when we can't keep up with the input events in which case we skip redisplay, but that's the case where we're *already* too slow. > It's a backward-incompatible behavior, and is not being developed due > to bug reports, It was developed because people like Alan are so bothered by the flashing that they're going through lengths to find other ways to avoid it. > so why make it the default right from the start? It also slows down > cursor motion (which should probably be in the doc string as well). It shouldn't slow down cursor motion, normally (at least not in any measurable way). Also I expect the implementation will change over time, as experience is gained with it. > I still don't think I understand what would constitute an > "unterminated string at EOL", then. Could you show two examples, one > where there is such a string, the other where there isn't? Code like: var x = "foo y = "bar"; where the user is in the middle of writing `x = "foobar";` but hasn't yet closed the string. Stefan ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 14:13 ` jit-lock-antiblink-grace Stefan Monnier @ 2019-10-12 14:23 ` Eli Zaretskii 2019-10-12 14:34 ` jit-lock-antiblink-grace Stefan Monnier 2019-10-12 15:47 ` jit-lock-antiblink-grace Alan Mackenzie 1 sibling, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-10-12 14:23 UTC (permalink / raw) To: Stefan Monnier; +Cc: joaotavora, emacs-devel > From: Stefan Monnier <monnier@iro.umontreal.ca> > Cc: João Távora <joaotavora@gmail.com>, > emacs-devel@gnu.org > Date: Sat, 12 Oct 2019 10:13:42 -0400 > > > We also have display-related hooks. If you could use one of them, > > that might be better, because one could generally type quite a few > > commands before redisplay kicks in, and post-command-hook runs once > > for every command. > > Really? AFAIK we redisplay at the end of every command executed. No, we do that only if there's no other event in the event queue. > We additionally redisplay after processing filters and after receiving > an event that turned out to be a prefix key, etc... Filters run only when Emacs is idle, so they don't run when there are keyboard events in the queue. > So, AFAICT we generally redisplay at least as often as we run > post-command-hook. I don't think this is correct, not AFAIR. > The only case where we don't is when we can't keep up with the input > events in which case we skip redisplay, but that's the case where > we're *already* too slow. My point is that post-command-hook might be called more often than once per redisplay cycle, and I think we agree on that, right? > > It's a backward-incompatible behavior, and is not being developed due > > to bug reports, > > It was developed because people like Alan are so bothered by the > flashing that they're going through lengths to find other ways to > avoid it. I'm not saying this is not a useful feature, and I'm not objecting to its inclusion. I'm asking why do we need to turn it on by default right when we introduce it. > > so why make it the default right from the start? It also slows down > > cursor motion (which should probably be in the doc string as well). > > It shouldn't slow down cursor motion, normally (at least not in any > measurable way). Font lock does slow down Emacs, so calling it in more cases/places will do so as well. > > I still don't think I understand what would constitute an > > "unterminated string at EOL", then. Could you show two examples, one > > where there is such a string, the other where there isn't? > > Code like: > > var x = "foo y = "bar"; > > where the user is in the middle of writing `x = "foobar";` but hasn't yet > closed the string. Yes, and what is the other example I asked for, where we don't have an unterminated string at EOL due to such editing? ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 14:23 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-12 14:34 ` Stefan Monnier 2019-10-12 15:57 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: Stefan Monnier @ 2019-10-12 14:34 UTC (permalink / raw) To: Eli Zaretskii; +Cc: joaotavora, emacs-devel >> The only case where we don't is when we can't keep up with the input >> events in which case we skip redisplay, but that's the case where >> we're *already* too slow. > > My point is that post-command-hook might be called more often than > once per redisplay cycle, and I think we agree on that, right? Yes, but only if we can't keep up (i.e. if the event queue is already non-empty when we're done processing an event). So whether something is done in redisplay or in post-command-hook doesn't affect the repeat-rate threshold where we start skipping redisplay: it only affect how much speed we gain by skipping redisplay (i.e. how quickly we can recover). >> > It's a backward-incompatible behavior, and is not being developed due >> > to bug reports, >> It was developed because people like Alan are so bothered by the >> flashing that they're going through lengths to find other ways to >> avoid it. > I'm not saying this is not a useful feature, and I'm not objecting to > its inclusion. I'm asking why do we need to turn it on by default > right when we introduce it. Because I think it offers the behavior 99% of the users will want (modulo bugs). Everyone I ever talked to about this agreed that the current behavior is somewhat annoying and several of them mentioned using "strategies" to avoid it (e.g. use electric-pair-mode, or be sure to keep typing quickly so the string/comment gets closed before the jit-lock-context-timer fires, ...). >> > so why make it the default right from the start? It also slows down >> > cursor motion (which should probably be in the doc string as well). >> It shouldn't slow down cursor motion, normally (at least not in any >> measurable way). > Font lock does slow down Emacs, so calling it in more cases/places > will do so as well. AFAICT the code doesn't call font-lock. >> > I still don't think I understand what would constitute an >> > "unterminated string at EOL", then. Could you show two examples, one >> > where there is such a string, the other where there isn't? >> >> Code like: >> >> var x = "foo y = "bar"; >> >> where the user is in the middle of writing `x = "foobar";` but hasn't yet >> closed the string. > > Yes, and what is the other example I asked for, where we don't have an > unterminated string at EOL due to such editing? That would be "any normal line", as in: var x = "foobar"; y = "bar"; "unterminated string at EOL" means (nth 3 (syntax-ppss (line-end-position))) is non-nil. Stefan ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 14:34 ` jit-lock-antiblink-grace Stefan Monnier @ 2019-10-12 15:57 ` Eli Zaretskii 2019-10-12 17:16 ` jit-lock-antiblink-grace Stefan Monnier 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-10-12 15:57 UTC (permalink / raw) To: Stefan Monnier; +Cc: joaotavora, emacs-devel > From: Stefan Monnier <monnier@iro.umontreal.ca> > Cc: joaotavora@gmail.com, emacs-devel@gnu.org > Date: Sat, 12 Oct 2019 10:34:44 -0400 > > >> The only case where we don't is when we can't keep up with the input > >> events in which case we skip redisplay, but that's the case where > >> we're *already* too slow. > > > > My point is that post-command-hook might be called more often than > > once per redisplay cycle, and I think we agree on that, right? > > Yes, but only if we can't keep up (i.e. if the event queue is already > non-empty when we're done processing an event). So whether something is > done in redisplay or in post-command-hook doesn't affect the repeat-rate > threshold where we start skipping redisplay: it only affect how much > speed we gain by skipping redisplay (i.e. how quickly we can recover). What is the purpose of this argument? Do you agree that adding too much to post-command-hook should be avoided? If you do, then let's not split hair about the rest, okay? > > I'm not saying this is not a useful feature, and I'm not objecting to > > its inclusion. I'm asking why do we need to turn it on by default > > right when we introduce it. > > Because I think it offers the behavior 99% of the users will want > (modulo bugs). You are entitled to your opinion, and I'm entitled to mine. > Everyone I ever talked to about this agreed that the current > behavior is somewhat annoying Here, you are talking to someone who is much more annoyed by the sluggishness of our movement commands than by an occasional "flashes" of incorrect fontification when I'm in the process of modifying code. So I guess not "everyone" finds this annoying enough. > > Font lock does slow down Emacs, so calling it in more cases/places > > will do so as well. > > AFAICT the code doesn't call font-lock. It adds a timer that does. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 15:57 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-12 17:16 ` Stefan Monnier 2019-10-12 17:50 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: Stefan Monnier @ 2019-10-12 17:16 UTC (permalink / raw) To: Eli Zaretskii; +Cc: joaotavora, emacs-devel > What is the purpose of this argument? Do you agree that adding too > much to post-command-hook should be avoided? I agree that post-command-hook is never the "right" place. But I don't think moving to a place that runs at every redisplay will help very much in terms of the risk of impacting responsiveness. Also often there's no "right" place, so we end up choosing post-command-hook because it's the least bad choice. I'd like the patch to be installed, because I think it'll need tweaking but that we need more experience with it in order to figure out what to do. >> > Font lock does slow down Emacs, so calling it in more cases/places >> > will do so as well. >> AFAICT the code doesn't call font-lock. > It adds a timer that does. AFAICT this only runs code which has been delayed (i.e. it would have been run earlier if it weren't for this feature), so it's "no worse". And it's an idle-timer run after 2s of idle time, so impact on responsiveness should be minimal even in the worst case. Stefan ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 17:16 ` jit-lock-antiblink-grace Stefan Monnier @ 2019-10-12 17:50 ` Eli Zaretskii 0 siblings, 0 replies; 58+ messages in thread From: Eli Zaretskii @ 2019-10-12 17:50 UTC (permalink / raw) To: Stefan Monnier; +Cc: joaotavora, emacs-devel > From: Stefan Monnier <monnier@iro.umontreal.ca> > Cc: joaotavora@gmail.com, emacs-devel@gnu.org > Date: Sat, 12 Oct 2019 13:16:45 -0400 > > >> AFAICT the code doesn't call font-lock. > > It adds a timer that does. > > AFAICT this only runs code which has been delayed (i.e. it would have > been run earlier if it weren't for this feature), so it's "no worse". > > And it's an idle-timer run after 2s of idle time, so impact on > responsiveness should be minimal even in the worst case. Idle timers that run expensive code make Emacs feel very unresponsive. That's one reason why we introduced JIT lock, many years ago. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 14:13 ` jit-lock-antiblink-grace Stefan Monnier 2019-10-12 14:23 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-12 15:47 ` Alan Mackenzie 1 sibling, 0 replies; 58+ messages in thread From: Alan Mackenzie @ 2019-10-12 15:47 UTC (permalink / raw) To: Stefan Monnier; +Cc: Eli Zaretskii, João Távora, emacs-devel Hello, Stefan. On Sat, Oct 12, 2019 at 10:13:42 -0400, Stefan Monnier wrote: [ .... ] > > It's a backward-incompatible behavior, and is not being developed due > > to bug reports, > It was developed because people like Alan are so bothered by the > flashing that they're going through lengths to find other ways to > avoid it. Who, me? The flashing bothers me not at all, though there will surely be people it does bother. I think you're referring to the feature in CC Mode where unterminated strings are font-locked to match their error syntax, i.e. the string face ends at the next unescaped EOL. This is a static feature, not a dynamic one like João has just developed. The two features are not closely related. [ .... ] > Stefan -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 13:32 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 14:13 ` jit-lock-antiblink-grace Stefan Monnier @ 2019-10-12 14:23 ` João Távora 2019-10-12 16:04 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 16:14 ` jit-lock-antiblink-grace Alan Mackenzie 1 sibling, 2 replies; 58+ messages in thread From: João Távora @ 2019-10-12 14:23 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 8146 bytes --] On Sat, Oct 12, 2019 at 2:33 PM Eli Zaretskii <eliz@gnu.org> wrote: > The post-command-hook is notorious for slowing down cursor motion. Probably a fame unjustly inherited from functions that people put there. > > Can you tell me more about the kinds of files you're anxious about > > and exact meaning of "paging"? Is it C-n'ing from the first line to > > the last? I could benchmark. > > C-n and C-v. Try C mode for starters, and then Emacs Lisp. OK, will do. > > > If there's no better solution than using that over-used hook, > > > > My very first version relied on an extension of the existing > > jit-lock-context-time, but I seem to remember it broke down here and > > there sometimes. I agreed with Stefan (possibly off-list) to use a > > post-command-hook, which is safer. But I can have a look at the > > original version and re-study those problems more closely. > > We also have display-related hooks. If you could use one of them, > that might be better, because one could generally type quite a few > commands before redisplay kicks in, and post-command-hook runs once > for every command. OK, will try that. > > > then at the very least we should give users a way of NOT adding a > > > post-command-hook when this feature is disabled. > > > > Given that I intend for this to be controlled via a customization > > variable, I only see it done via a `:set` hook or something like that. > > I'm not sure I understand. What I wanted to suggest is that when the > new defcustom is nil (which seems to be the way to disable this > feature), the post-command-hook should not be added. If we do it like that, it will take effect only when jit-lock-mode is toggled. Therefore, if you set the variable to nil in a buffer you will only see the desired effects in post-command-hook after additionally toggling jit-lock-mode on and off again. > In addition, I think major modes which present read-only buffers > should also disable this feature, and not add to post-command-hook. OK. > > > > +Setting this to a positive number of seconds helps avoid the > > > > +fontification "blinking" behaviour observed when adding temporarily > > > > +unterminated strings to source code. If the user has recently created > > > > +an unterminated string at EOL, jit fontification allows this idle > > > > +"grace" period to elapse before deciding it is a multi-line string and > > > > +fontifying the remainder of the buffer accordingly. > > > > > > This should be simplified and shortened. (In general, copy/paste of > > > doc strings into NEWS is not a good idea.) In particular, if the > > > default is to have this behavior (see below), the NEWS entry should > > > tell how to disable that. > > > > OK. Supposing you've already already gotten the idea, I invite you to > > submit a suggestion. > > I'd rather had you try. I think it's important that more people can > write good documentation, and I think in this case it isn't hard. You > can use other entries as examples. Naturally Eli, I hope you believe me that I try hard, indeed very hard, to write good documentation. I spend I good deal of time in it, sometimes much more than writing the code itself. If I sometimes fail to meet your standards, it's to be expected, (1) because they are high (which is very good) and (2) because we all have unwritten guidelines of what we believe is good style. I tried many versions (many more than you can probably get evidence of in the emacs-diffs ML) and settled on the one I presented. With requesting a suggestion from you, I am not taking an adversarial position, simply a way forward on what I (and many) consider to be a difficult and underestimated problem in programming. Also, English is not my first language, and Emacs-english has certain rules that you will much more familiar with. > > > (I question the wisdom of making this the default behavior, btw.) > > > > What's bothering you? > > It's a backward-incompatible behavior, and is not being developed due > to bug reports, so why make it the default right from the start? It > also slows down cursor motion (which should probably be in the doc > string as well). Regarding slowdown, we have to check by how much. Regarding the pertinence of the modificaiton, there are mode-specific modifications with (IMO much worse) backward-incompatible behaviour being made to modes like to c-mode to circumvent precisely this problem. Perhaps you could weigh in on the pertinence of those on-by-default (and moreover impossible-to-turn-off) alternatives, too. Although those other modifications target a reduced subset of modes, indeed precisely because of that fact, I think it's better that Emacs provides an effective and more generic solution to this problem. > > > I don't understand the "at EOL" part: isn't any unterminated string > > > appear as if it is "at EOL"? > > > > An unterminated string at EOL might be terminated somewhere _after_ EOL, > > i.e. a perfectly legitimate (as "in your intentions") multiline string. > > I still don't think I understand what would constitute an > "unterminated string at EOL", then. Could you show two examples, one > where there is such a string, the other where there isn't? Buffer 1: l1: foofoo "bar < unterminated string at EOL, terminated multiline string l2: barbar" foofoo Buffer 2: l1: foofoo "bar < unterminated string at EOL, unterminated string l2: barbar It's an informal way of referring to both situations at line 1. If I said "unterminated string" the user might be led to believe it doesn't apply to the situation of buffer 1. But the fact that it confused you so much is probably a hint it's not a great idea. Again, let me humbly request a suggestion for rephrasing :-) > > Moreover this is a hint as to how the system is implemented, which some > > users may appreciate. > This kind of stuff should be in comments, not ion doc strings, IMO. Maybe. Sometimes such hints are good because they help consolidate the user's prediction of timer-based behaviour. > > > Please don't use such cryptic variable names, at least not on the file > > > level (preferably also not locally inside functions). > > > > The docstring explains the abbreviation. I'm afraid that given current > > naming practice (prefix, double dash, sub-feature) I couldn't do much > > better. I think jit-lock--antiblink-l-b-p is a better name than > > jit-lock--antiblink-pos, or jit-lock--pos, because it makes the reader > > "chase" the doc and learn of the exact meaning of the abbreviation. > > The variables don't need to use jit-lock--antiblink- prefix, they > could use jit-lock-- prefix instead. jit-lock--last-line-begpos > doesn't sound too long to me, for example. It doesn't, but then I lose the ability to i-search for jit-lock--antiblink and see its related variables. It's all trade-offs. But I'll put in the longer names or use a plist, don't worry. > > > > + (when jit-lock--antiblink-grace-timer > > > > + (message "internal warning: `jit-lock--antiblink-grace-timer' not null")) > > > > > > We should in general avoid calling 'message' here, because such a > > > message will appear after every command, which is a nuisance. Is this > > > really needed? > > > > This is an internal consistency check, i.e. a run-time assertion. It > > should never happen, except when the program is buggy. I had this set > > to 'warn', but Stefan suggested I change it. What do you suggest? > > Perhaps I could warn and turn off the feature. > > Why not just lose the message? Huh? If I lose the message the form becomes a noop. > Why is it important to display it? Run-time consistency assertions are useful, right? I can change 'message' to whatever you think has the optimimum noise-level for such an assertion ('warn' with a :debug level, maybe?) I can also remove the form completely and we just pray that noone every breaks the mechanism in subtle ways :-) João [-- Attachment #2: Type: text/html, Size: 9445 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 14:23 ` jit-lock-antiblink-grace João Távora @ 2019-10-12 16:04 ` Eli Zaretskii 2019-10-12 21:55 ` jit-lock-antiblink-grace João Távora 2019-10-12 16:14 ` jit-lock-antiblink-grace Alan Mackenzie 1 sibling, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-10-12 16:04 UTC (permalink / raw) To: João Távora; +Cc: monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Sat, 12 Oct 2019 15:23:08 +0100 > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca> > > > The post-command-hook is notorious for slowing down cursor motion. > > Probably a fame unjustly inherited from functions that people put there. Not people: our own minor modes. > > I'm not sure I understand. What I wanted to suggest is that when the > > new defcustom is nil (which seems to be the way to disable this > > feature), the post-command-hook should not be added. > > If we do it like that, it will take effect only when jit-lock-mode is > toggled. Therefore, if you set the variable to nil in a buffer you will > only see the desired effects in post-command-hook after additionally > toggling jit-lock-mode on and off again. It doesn't have to be like that. It depends on how you arrange for the hook not to be added. > > I'd rather had you try. I think it's important that more people can > > write good documentation, and I think in this case it isn't hard. You > > can use other entries as examples. > > Naturally Eli, I hope you believe me that I try hard, indeed very hard, > to write good documentation. I spend I good deal of time in it, > sometimes much more than writing the code itself. If I sometimes fail > to meet your standards, it's to be expected, (1) because they are high > (which is very good) and (2) because we all have unwritten guidelines of > what we believe is good style. I tried many versions (many more than > you can probably get evidence of in the emacs-diffs ML) and settled on > the one I presented. > > With requesting a suggestion from you, I am not taking an adversarial > position, simply a way forward on what I (and many) consider to be a > difficult and underestimated problem in programming. Also, English is > not my first language, and Emacs-english has certain rules that you will > much more familiar with. All I wanted to say was that the goal is almost in reach, and that you don't need to give up in this case. But if you think it's too hard, then okay, I will write the text when the time comes. > > It's a backward-incompatible behavior, and is not being developed due > > to bug reports, so why make it the default right from the start? It > > also slows down cursor motion (which should probably be in the doc > > string as well). > > Regarding slowdown, we have to check by how much. Regarding the > pertinence of the modificaiton, there are mode-specific modifications > with (IMO much worse) backward-incompatible behaviour being made to > modes like to c-mode to circumvent precisely this problem. Perhaps you > could weigh in on the pertinence of those on-by-default (and moreover > impossible-to-turn-off) alternatives, too. Although those other > modifications target a reduced subset of modes, indeed precisely because > of that fact, I think it's better that Emacs provides an effective and > more generic solution to this problem. When I find a backward-incompatible change, I usually do try to see if it's justified. So I think I already do what you ask me to do in those other cases. > > I still don't think I understand what would constitute an > > "unterminated string at EOL", then. Could you show two examples, one > > where there is such a string, the other where there isn't? > > Buffer 1: > > l1: foofoo "bar < unterminated string at EOL, terminated multiline string > l2: barbar" foofoo > > Buffer 2: > > l1: foofoo "bar < unterminated string at EOL, unterminated string > l2: barbar > > It's an informal way of referring to both situations at line 1. That's what I thought, but then I think we should rather talk about "unbalanced quotes", which should catch both cases without involving EOL. > > Why not just lose the message? > > Huh? If I lose the message the form becomes a noop. I meant lose the entire form. Why should a user care that there was already a timer? Will that adversely affect the code in some way? > Run-time consistency assertions are useful, right? Only as a debug option, or if the code absolutely cannot continue under that condition. Which I think is not the case here. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 16:04 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-12 21:55 ` João Távora 2019-10-13 6:39 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-10-12 21:55 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 4718 bytes --] On Sat, Oct 12, 2019 at 5:05 PM Eli Zaretskii <eliz@gnu.org> wrote: > > > From: João Távora <joaotavora@gmail.com> > > Date: Sat, 12 Oct 2019 15:23:08 +0100 > > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier < monnier@iro.umontreal.ca> > > > > > The post-command-hook is notorious for slowing down cursor motion. > > Probably a fame unjustly inherited from functions that people put there. > Not people: our own minor modes. Last I checked you and I were people too (else you give a damn good impression... :-) > > > I'm not sure I understand. What I wanted to suggest is that when the > > > new defcustom is nil (which seems to be the way to disable this > > > feature), the post-command-hook should not be added. > > > > If we do it like that, it will take effect only when jit-lock-mode is > > toggled. Therefore, if you set the variable to nil in a buffer you will > > only see the desired effects in post-command-hook after additionally > > toggling jit-lock-mode on and off again. > > It doesn't have to be like that. It depends on how you arrange for > the hook not to be added. I can only see one reasonably hacky way to arrange for: * the feature to be controlled via this variable * the hook to disappear from p-c-h when the variable is nil and that's to use an "ensure hook present/gone" technique somewhere in the places of the jit mode that the code is guaranteed to pass before the feature would kick in. It would feel hacky and so unjustified before any kind of performance measurements. Did you mean something like that or something completely different that I'm not following? > All I wanted to say was that the goal is almost in reach, and that you > don't need to give up in this case. > But if you think it's too hard, then okay, I will write the text when > the time comes. And all I wanted to say is that something a little more constructive, like a concrete suggestion, is whitin reach. I will try again in the next iteration. Shorter, more to the point in NEWS and idiot-proof spec in the docstring. > > > It's a backward-incompatible behavior, and is not being developed due > > > to bug reports, so why make it the default right from the start? It > > > also slows down cursor motion (which should probably be in the doc > > > string as well). > > > > Regarding slowdown, we have to check by how much. Regarding the > > pertinence of the modificaiton, there are mode-specific modifications > > with (IMO much worse) backward-incompatible behaviour being made to > > modes like to c-mode to circumvent precisely this problem. Perhaps you > > could weigh in on the pertinence of those on-by-default (and moreover > > impossible-to-turn-off) alternatives, too. Although those other > > modifications target a reduced subset of modes, indeed precisely because > > of that fact, I think it's better that Emacs provides an effective and > > more generic solution to this problem. > > When I find a backward-incompatible change, I usually do try to see if > it's justified. So I think I already do what you ask me to do in > those other cases. From what I can remember, you didn't weigh in on the specific case I was referring to (the one being brought up again in the side thread), where c-mode was modified in a truly backward-incompatible, uncustomizable way to address a related problem. Furthermore, calling my proposed change "backward-incompatible" is something I don't fully understand. Perhaps you can clarify: what behaviours, actions, etc. were observed before that aren't observed now? I only count the the hypothetical slowdown and the presumably benefic effects of the feature itself. > That's what I thought, but then I think we should rather talk about > "unbalanced quotes", which should catch both cases without involving > EOL. OK. > > > Why not just lose the message? > > > > Huh? If I lose the message the form becomes a noop. > > I meant lose the entire form. Why should a user care that there was > already a timer? Will that adversely affect the code in some way? > > Run-time consistency assertions are useful, right? > > Only as a debug option, Yes, I agree. But there is really no "debug" in Emacs, only debug-on-error. I also suggested 'warn' with a debug level. So that whoever refactors the code can be alerted to an inconsistency. Grepping for "internal error" in the Emacs source brings up many cases that I judge to have more or less the same causes. Anyway, if I'm going to try and rewrite the code again to get rid of post-command-hook perhaps the form goes away naturally and we can focus on something else. João [-- Attachment #2: Type: text/html, Size: 5544 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 21:55 ` jit-lock-antiblink-grace João Távora @ 2019-10-13 6:39 ` Eli Zaretskii 2019-10-13 8:47 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-10-13 6:39 UTC (permalink / raw) To: João Távora; +Cc: monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Sat, 12 Oct 2019 22:55:29 +0100 > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca> > > > It doesn't have to be like that. It depends on how you arrange for > > the hook not to be added. > > I can only see one reasonably hacky way to arrange for: > > * the feature to be controlled via this variable > * the hook to disappear from p-c-h when the variable is nil > > and that's to use an "ensure hook present/gone" technique somewhere in > the places of the jit mode that the code is guaranteed to pass before > the feature would kick in. It would feel hacky and so unjustified > before any kind of performance measurements. Did you mean something > like that or something completely different that I'm not following? I didn't figure out the details, I thought it should be easy to do. Don't we already do something like that in all kinds of places? The :set attribute of a defcustom comes to mind, for example. Alternatively, the timer you add could notice the change and take that action. And I'm sure there are more ways of doing that. Or maybe I'm missing something. > > All I wanted to say was that the goal is almost in reach, and that you > > don't need to give up in this case. > > But if you think it's too hard, then okay, I will write the text when > > the time comes. > > And all I wanted to say is that something a little more constructive, > like a concrete suggestion, is whitin reach. I will try again in the > next iteration. Shorter, more to the point in NEWS and idiot-proof spec > in the docstring. Thank you. > > When I find a backward-incompatible change, I usually do try to see if > > it's justified. So I think I already do what you ask me to do in > > those other cases. > > From what I can remember, you didn't weigh in on the specific case I was > referring to (the one being brought up again in the side thread), where > c-mode was modified in a truly backward-incompatible, uncustomizable way > to address a related problem. I don't remember the particular case, but I can make mistakes, can I? Anyway, I'm not sure I understand what you are trying to say here. Are you saying that I treat you differently from others? If so, that's not the case, and if I said something that could be interpreted otherwise, I apologize. > Furthermore, calling my proposed change > "backward-incompatible" is something I don't fully understand. Perhaps > you can clarify: what behaviours, actions, etc. were observed before > that aren't observed now? Very simply: the behavior is different from what we had previously. Previously, starting a new comment would give me an almost immediate visual feedback; now that feedback is delayed by 2 sec (more, or even not at all, if I continue typing). How can we know that everybody will instantly like this new behavior? > > > Run-time consistency assertions are useful, right? > > > > Only as a debug option, > > Yes, I agree. But there is really no "debug" in Emacs, only > debug-on-error. That's not so: various packages define their own debug facilities. Examples include Tramp and smtpmail.el. We could add a debug facility to jit-lock.el as well, if you think it's important for this feature. Thanks. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-13 6:39 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-13 8:47 ` João Távora 2019-10-13 9:22 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-10-13 8:47 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 4749 bytes --] On Sun, Oct 13, 2019 at 7:39 AM Eli Zaretskii <eliz@gnu.org> wrote: > > > From: João Távora <joaotavora@gmail.com> > > Date: Sat, 12 Oct 2019 22:55:29 +0100 > > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier < monnier@iro.umontreal.ca> > I didn't figure out the details, I thought it should be easy to do. > Don't we already do something like that in all kinds of places? The > :set attribute of a defcustom comes to mind, for example. > Alternatively, the timer you add could notice the change and take that > action. And I'm sure there are more ways of doing that. Or maybe I'm > missing something. I had already mentioned :set, but iiuc it only works via customize. The other techniques you mention are the (relatively) hacky ones I had in mind, too. > > > When I find a backward-incompatible change, I usually do try to see if > > > it's justified. So I think I already do what you ask me to do in > > > those other cases. > > > > From what I can remember, you didn't weigh in on the specific case I was > > referring to (the one being brought up again in the side thread), where > > c-mode was modified in a truly backward-incompatible, uncustomizable way > > to address a related problem. > > I don't remember the particular case, but I can make mistakes, can I? > Anyway, I'm not sure I understand what you are trying to say here. > Are you saying that I treat you differently from others? If so, > that's not the case, and if I said something that could be interpreted > otherwise, I apologize. All I'm trying to say is one of the motivations for my proposed feature A is to be an alternative to another feature B in Emacs (which I consider harmful) and you are holding my feature to a higher standard (regarding backward compatibility, performance, doc, etc) than you did the other one. In absolute terms, that's just fine, but in relative terms there is a discrepancy that was trying to understand. If it was simply an oversight, it's perfectly OK. > > Furthermore, calling my proposed change > > "backward-incompatible" is something I don't fully understand. Perhaps > > you can clarify: what behaviours, actions, etc. were observed before > > that aren't observed now? > Very simply: the behavior is different from what we had previously. Of course, there is different behaviour in every feature except a refactorization. > Previously, starting a new comment would give me an almost immediate > visual feedback; now that feedback is delayed by 2 sec (more, or even > not at all, if I continue typing). How can we know that everybody > will instantly like this new behavior? Hmmm. We might be miscommunicating (or you might be seeing a bug). When you start to type a comment or a string, you still get "almost immediate visual feedback" just you did before. This has not changed at all. If the command you just performed, say, insert or delete a quote: 1. _created_ a situation if unbalanced quotes at EOL, then the typical "flipping" of the fontification of many lines _after_ the current is delayed, because the system believes you will probably solve the situation within jit-lock-antiblink-grace seconds; 2. _restored_ a situation of balanced quotes, then everything should be as before. A core assumption here is that the user very rarely wants to create deliberate unbalance of strings. Those users, were they to exist in great numbers, would probably be bothered by the grace delay. Anyway, it is only in situation 1 that the amplitude of "visual feedback" is reduced, because the system considers the extra visual feedback related to the real possibility of inserting a multi-line string, is alarmist/premature/unjustified. Do I explain myself? > > > > Run-time consistency assertions are useful, right? > > > Only as a debug option, > > Yes, I agree. But there is really no "debug" in Emacs, only > > debug-on-error. > That's not so: various packages define their own debug facilities. I meant Emacs-wide, of course. There is display-warning-minimum-level and warning-minimum-log-level tho, which I wish were easier to control. > Examples include Tramp and smtpmail.el. We could add a debug facility > to jit-lock.el as well, if you think it's important for this feature. I don't (and I don't like these package-specific solutions). And that's precisely why I settled on a 'message' as a middle-of-the-road solution. Anyway, your point seems to be to minimize the probability of incessant debug chatter in *Messages* which would supposedly render an Emacs with a buggy jit-lock.el unusable. I can use a suitably parameterized 'warn', a cl-assertion, an error, or just get rid of it. João [-- Attachment #2: Type: text/html, Size: 5499 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-13 8:47 ` jit-lock-antiblink-grace João Távora @ 2019-10-13 9:22 ` Eli Zaretskii 2019-10-13 10:28 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-10-13 9:22 UTC (permalink / raw) To: João Távora; +Cc: monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Sun, 13 Oct 2019 09:47:24 +0100 > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca> > > > > From what I can remember, you didn't weigh in on the specific case I was > > > referring to (the one being brought up again in the side thread), where > > > c-mode was modified in a truly backward-incompatible, uncustomizable way > > > to address a related problem. > > > > I don't remember the particular case, but I can make mistakes, can I? > > Anyway, I'm not sure I understand what you are trying to say here. > > Are you saying that I treat you differently from others? If so, > > that's not the case, and if I said something that could be interpreted > > otherwise, I apologize. > > All I'm trying to say is one of the motivations for my proposed feature > A is to be an alternative to another feature B in Emacs (which I > consider harmful) and you are holding my feature to a higher standard > (regarding backward compatibility, performance, doc, etc) than you did > the other one. In absolute terms, that's just fine, but in relative > terms there is a discrepancy that was trying to understand. If it was > simply an oversight, it's perfectly OK. All I can say is that I consider each proposal on its own terms, and try to apply the same considerations in all cases. There's no higher standard for you or anyone else, and lower standards for others, at least not intentionally. > > Very simply: the behavior is different from what we had previously. > > Of course, there is different behaviour in every feature except a > refactorization. No, bug fixes make changes that don't change behavior, not in general. New features do change behavior, and we normally don't turn them all on by default, not unless we have a very good reason. > Do I explain myself? Yes, but I already knew all that, so there's no misunderstanding on my part. > Anyway, your point seems to be to minimize the probability of incessant > debug chatter in *Messages* which would supposedly render an Emacs with > a buggy jit-lock.el unusable. It's not just the *Messages* buffer: each call to 'message' causes redisplay, so we will have a flood of redisplays, which is not nice. > I can use a suitably parameterized > 'warn', a cl-assertion, an error, or just get rid of it. Thanks. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-13 9:22 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-13 10:28 ` João Távora 2019-10-13 10:45 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-10-13 10:28 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 2051 bytes --] On Sun, Oct 13, 2019 at 10:22 AM Eli Zaretskii <eliz@gnu.org> wrote: > > > Very simply: the behavior is different from what we had previously. > > Of course, there is different behaviour in every feature except a > > refactorization. > No, bug fixes make changes that don't change behavior, not in general. We're well into hair-splitting territory here but I would argue that a bug fix, by definition, changes incorrect behaviour into correct behaviour. > New features do change behavior, and we normally don't turn them all > on by default, not unless we have a very good reason. I understand that, and I agree with this policy. My very good reason for enabling by default is that this change is cheap, i.e. there are very few adverse effects (be it in performance or behaviour change), and considerable benefit. Of course, I've yet to prove the performance hit is neglibile and I also separately trying to convince that the lost behaviour is almost never desirable. Speaking of benchmarks, what is the correct way to benchmark this, i.e. to simulate "paging down a file". Is it just sth like (while t (call-interactively 'next-line)) ? Or should I add a `redisplay` or something else there? > > Do I explain myself? > Yes, but I already knew all that, so there's no misunderstanding on my > part. Well, you did write two mails ago that the current "almost immediate" visual feedback would be delayed for 2 seconds or more. Since that is patently not true it led me to believe there was a misunderstanding (or a bug). > > Anyway, your point seems to be to minimize the probability of incessant > > debug chatter in *Messages* which would supposedly render an Emacs with > > a buggy jit-lock.el unusable. > It's not just the *Messages* buffer: each call to 'message' causes > redisplay, so we will have a flood of redisplays, which is not nice. Yes, but my point was that in a buggy jit-lock.el such things are relatively unimportant in comparison, hence the case for early warning. João [-- Attachment #2: Type: text/html, Size: 2328 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-13 10:28 ` jit-lock-antiblink-grace João Távora @ 2019-10-13 10:45 ` Eli Zaretskii 2019-10-14 23:29 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-10-13 10:45 UTC (permalink / raw) To: João Távora; +Cc: monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Sun, 13 Oct 2019 11:28:39 +0100 > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca> > > Speaking of benchmarks, what is the correct way to benchmark this, > i.e. to simulate "paging down a file". Is it just sth like > > (while t (call-interactively 'next-line)) > > ? Or should I add a `redisplay` or something else there? For timing the effect of post-command-hook, you need to actually invoke many commands. I suggest to lean on the DOWN arrow for a fixed amount of time, say, 30 sec, and see how far into the file did you go, and what was the average CPU load (e.g, as shown by display-time-mode or by 'top'). ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-13 10:45 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-14 23:29 ` João Távora 2019-10-15 6:48 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-10-14 23:29 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 2158 bytes --] On Sun, Oct 13, 2019 at 11:45 AM Eli Zaretskii <eliz@gnu.org> wrote: > > ? Or should I add a `redisplay` or something else there? > For timing the effect of post-command-hook, you need to actually > invoke many commands. I suggest to lean on the DOWN arrow for a fixed > amount of time, say, 30 sec, and see how far into the file did you go, > and what was the average CPU load (e.g, as shown by display-time-mode > or by 'top'). OK, I found some time to run these "manual" tests: So I tried this with and without the hook. I removed it (forcibly) with (remove-hook 'post-command-hook 'jit-lock--antiblink-post-command t) and re-added it with (add-hook 'post-command-hook 'jit-lock--antiblink-post-command nil t) before beginning the test. I confirmed that without the hook the feature is crippled and fails, and with the hook it works fine. This was easier then launching separate emacsen with jit-lock-antiblink-grace customized differently. 60 second-long C-n in src/xdisp.c, without antiblink: line 706, avg load 4% with antiblink: line 717, avg load 4% 30 second-long C-n in lisp/minibuffer.el, with antiblink: line 366, avg load 4% without antiblink: line 361, avg load 4% Time to end of buffer with C-v in lisp/minibuffer.el: with antiblink: 10 seconds, avg load 6% without antiblink: 10 seconds, avg load 6% Time to end of buffer with C-v in src/xdisp.c: without antiblink: 90 seconds, avg load 8% with antiblink: 91 seconds, avg load 8% I ran this with Emacs -Q with git commit 079461b360a2467ff4ab2ec57516c6f9e45f50fe on a 2013 Macbook Air running Mojave. The CPU load averages are computed "in my mind" from looking at top(1) output. Times are taken from a wristwatch. Thus, not really precise measurements at all. So, because these tests are kind of boring to conduct, I'd like you or someone else to reproduce (or fail to reproduce) one or two results before going any further. Nevertheless, I'd risk saying that your worries about the performance impact on these particular "paging" operations may not materialize at all. João [-- Attachment #2: Type: text/html, Size: 2471 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-14 23:29 ` jit-lock-antiblink-grace João Távora @ 2019-10-15 6:48 ` Eli Zaretskii 2019-10-15 18:28 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-10-15 6:48 UTC (permalink / raw) To: João Távora; +Cc: monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Tue, 15 Oct 2019 00:29:51 +0100 > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca> > > So I tried this with and without the hook. I removed it (forcibly) with > > (remove-hook 'post-command-hook > 'jit-lock--antiblink-post-command t) > and re-added it with > > (add-hook 'post-command-hook > 'jit-lock--antiblink-post-command nil t) > > before beginning the test. > > I confirmed that without the hook the feature is crippled and fails, and > with the hook it works fine. This was easier then launching separate > emacsen with jit-lock-antiblink-grace customized differently. > > 60 second-long C-n in src/xdisp.c, > without antiblink: line 706, avg load 4% > with antiblink: line 717, avg load 4% > 30 second-long C-n in lisp/minibuffer.el, > with antiblink: line 366, avg load 4% > without antiblink: line 361, avg load 4% > > Time to end of buffer with C-v in lisp/minibuffer.el: > with antiblink: 10 seconds, avg load 6% > without antiblink: 10 seconds, avg load 6% > > Time to end of buffer with C-v in src/xdisp.c: > without antiblink: 90 seconds, avg load 8% > with antiblink: 91 seconds, avg load 8% This is encouraging, but please try C-n near the end of xdisp.c, so that it includes syms_of_xdisp. The first 350 lines of xdisp.c is one large comment, and there's a very small number of strings after that. Thanks. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-15 6:48 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-15 18:28 ` João Távora 2019-11-24 1:04 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-10-15 18:28 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1555 bytes --] On Tue, Oct 15, 2019 at 7:48 AM Eli Zaretskii <eliz@gnu.org> wrote: > > This is encouraging, but please try C-n near the end of xdisp.c, so > that it includes syms_of_xdisp. The first 350 lines of xdisp.c is one > large comment, and there's a very small number of strings after that. OK. So same setup as before but running on Windows 10 on a i7 processor: 30 seconds from syms_of_xdisp (void) in src/xdisp.c: with antiblink: 34969, around 7% load measured by Process Explorer without: 34977, also around 7% load So I'd venture to say this didn't change much. I think the reason the C-n and C-v tests escape a big performance hit is that the potentially expensive operation, 'syntax-ppss', doesn't get called when you you have switched lines. So the presence or absence of strings is irrelevant. The most expensive operation will probably be `line-beginning-position` which is in C and apparently fast enough to not have any kind of relative impact. But now that I notice, the beginning of jit-lock--antiblink-post-command could be improved slightly to shortcut earlier and avoid one extra `line-beginning-position' call in these cases (though probably these rough benchmarks wouldn't show it.) So to summarize, for the "paging" scenario, the overhead of the post-command-based antiblink can be as low a 'copy-marker', an argless 'line-beginning-position' and few tests. Assuming you're OK with the performace aspects of the thing, I'll do the fixes you suggested earlier and re-submit (or push?) João [-- Attachment #2: Type: text/html, Size: 1805 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-15 18:28 ` jit-lock-antiblink-grace João Távora @ 2019-11-24 1:04 ` João Távora 2019-11-24 16:16 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-24 1:04 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel João Távora <joaotavora@gmail.com> writes: > On Tue, Oct 15, 2019 at 7:48 AM Eli Zaretskii <eliz@gnu.org> wrote: > >> This is encouraging, but please try C-n near the end of xdisp.c, so >> that it includes syms_of_xdisp. The first 350 lines of xdisp.c is one >> large comment, and there's a very small number of strings after that. > 30 seconds from syms_of_xdisp (void) in src/xdisp.c: > with antiblink: 34969, around 7% load measured by Process Explorer > without: 34977, also around 7% load > Hi Eli, We seem to have lost track of this, and it's waiting for your input. I'd like this change to make it 27.1. To summarize, the benchmarks you suggested (paging down the file with C-v and C-n) all confirmed "no performance hit". I also tried a couple of C-f/C-b benchmarks to the same results. If you need to gain more confidence from more benchmarks or a refresher on exactly what this change is about, I'm at your disposal. If you think you're OK with the performance aspect, I'll perform the changes to the docstrings and NEWS that we had agreed to previously. João ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-24 1:04 ` jit-lock-antiblink-grace João Távora @ 2019-11-24 16:16 ` Eli Zaretskii 2019-11-25 18:46 ` jit-lock-antiblink-grace Alan Mackenzie 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-11-24 16:16 UTC (permalink / raw) To: João Távora; +Cc: monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier > <monnier@iro.umontreal.ca> > Date: Sun, 24 Nov 2019 01:04:53 +0000 > > João Távora <joaotavora@gmail.com> writes: > > > On Tue, Oct 15, 2019 at 7:48 AM Eli Zaretskii <eliz@gnu.org> wrote: > > > >> This is encouraging, but please try C-n near the end of xdisp.c, so > >> that it includes syms_of_xdisp. The first 350 lines of xdisp.c is one > >> large comment, and there's a very small number of strings after that. > > > 30 seconds from syms_of_xdisp (void) in src/xdisp.c: > > with antiblink: 34969, around 7% load measured by Process Explorer > > without: 34977, also around 7% load > > > Hi Eli, > > We seem to have lost track of this, and it's waiting for your input. I'd > like this change to make it 27.1. I was under the impression that you had some issues with Alan, and didn't realize you were waiting for me. Sorry. > If you need to gain more confidence from more benchmarks or a refresher > on exactly what this change is about, I'm at your disposal. If you > think you're OK with the performance aspect, I'll perform the changes to > the docstrings and NEWS that we had agreed to previously. Please add/finalize the docs, and let's take it from there. One thing I see already is that you turned on this feature by default, but NEWS is worded as if it is off. Not sure if we had a consensus regarding the default back then. Thanks. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-24 16:16 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-11-25 18:46 ` Alan Mackenzie 2019-11-25 19:02 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Alan Mackenzie @ 2019-11-25 18:46 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel, João Távora, monnier Hello, Eli. On Sun, Nov 24, 2019 at 18:16:49 +0200, Eli Zaretskii wrote: > > From: João Távora <joaotavora@gmail.com> > > Cc: emacs-devel <emacs-devel@gnu.org>, Stefan Monnier > > <monnier@iro.umontreal.ca> > > Date: Sun, 24 Nov 2019 01:04:53 +0000 > > João Távora <joaotavora@gmail.com> writes: > > > On Tue, Oct 15, 2019 at 7:48 AM Eli Zaretskii <eliz@gnu.org> wrote: > > >> This is encouraging, but please try C-n near the end of xdisp.c, so > > >> that it includes syms_of_xdisp. The first 350 lines of xdisp.c is one > > >> large comment, and there's a very small number of strings after that. > > > 30 seconds from syms_of_xdisp (void) in src/xdisp.c: > > > with antiblink: 34969, around 7% load measured by Process Explorer > > > without: 34977, also around 7% load > > Hi Eli, > > We seem to have lost track of this, and it's waiting for your input. I'd > > like this change to make it 27.1. > I was under the impression that you had some issues with Alan, and > didn't realize you were waiting for me. Sorry. Just for the record, I have no objection to this new mode, provided it is disabled by default. > > If you need to gain more confidence from more benchmarks or a refresher > > on exactly what this change is about, I'm at your disposal. If you > > think you're OK with the performance aspect, I'll perform the changes to > > the docstrings and NEWS that we had agreed to previously. > Please add/finalize the docs, and let's take it from there. > One thing I see already is that you turned on this feature by default, > but NEWS is worded as if it is off. Not sure if we had a consensus > regarding the default back then. > Thanks. -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 18:46 ` jit-lock-antiblink-grace Alan Mackenzie @ 2019-11-25 19:02 ` João Távora 2019-11-25 19:26 ` jit-lock-antiblink-grace Alan Mackenzie 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-25 19:02 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel On Mon, Nov 25, 2019 at 6:46 PM Alan Mackenzie <acm@muc.de> wrote: > provided it is disabled by default. It's not. The goal is to enable it by default. Last I hear from you on the matter was in: https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00540.html https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00563.html You didn't bring up this point (you suggested an improvement I can agree to to and another one that doesn't apply). Eli was concerned about performance, but the suggested benchmarks so far all point to "little to no impact". So can you explain your new objection? Thanks in advance, João ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 19:02 ` jit-lock-antiblink-grace João Távora @ 2019-11-25 19:26 ` Alan Mackenzie 2019-11-25 19:45 ` jit-lock-antiblink-grace João Távora 2019-11-25 19:47 ` jit-lock-antiblink-grace Dmitry Gutov 0 siblings, 2 replies; 58+ messages in thread From: Alan Mackenzie @ 2019-11-25 19:26 UTC (permalink / raw) To: João Távora; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel Hello, Joåo. On Mon, Nov 25, 2019 at 19:02:16 +0000, João Távora wrote: > On Mon, Nov 25, 2019 at 6:46 PM Alan Mackenzie <acm@muc.de> wrote: > > provided it is disabled by default. > It's not. The goal is to enable it by default. [ .... ] > So can you explain your new objection? Consistency. All little tweaks to Emacs functionality which "everybody is bound to want" end up irritating people immensely, so they are all disabled by default - at least when new, including several I have written myself. Even Font Lock was disabled by default up until (I believe) Emacs 22. People who want this new mode will find it and enable it. I can't remember any arguments you may have made as to why this mode should be singled out for special treatment, but I can't see any compelling reason for its default enablement. Anyway, it's for Eli to decide, not me. > Thanks in advance, > João -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 19:26 ` jit-lock-antiblink-grace Alan Mackenzie @ 2019-11-25 19:45 ` João Távora 2019-11-25 20:11 ` jit-lock-antiblink-grace Alan Mackenzie 2019-11-25 19:47 ` jit-lock-antiblink-grace Dmitry Gutov 1 sibling, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-25 19:45 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel On Mon, Nov 25, 2019 at 7:26 PM Alan Mackenzie <acm@muc.de> wrote: > > So can you explain your new objection? > > Consistency. Best consistency tends do arise when taking a good hard look of the pros and cons of each change, instead of citing blanket policy. > All little tweaks to Emacs functionality which "everybody is bound to want" end up irritating people immensely, [ I could remember some introduced by you, but this is besides the discussion. ] > I can't remember any arguments you may have made Here they are: see the second paragraph and the ensuing discussion, where Eli suggests benchmarks: https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00537.html I can summarize: 1. There are no adverse or surprising behaviors; 2. There is negligible performance impact; 3. There is a demonstrated benefit; I've only done so much work testing each of these assertions, and I'd of course be interested in hearing (concrete) objections. João ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 19:45 ` jit-lock-antiblink-grace João Távora @ 2019-11-25 20:11 ` Alan Mackenzie 2019-11-25 20:23 ` jit-lock-antiblink-grace João Távora 2019-11-26 13:43 ` jit-lock-antiblink-grace Stefan Monnier 0 siblings, 2 replies; 58+ messages in thread From: Alan Mackenzie @ 2019-11-25 20:11 UTC (permalink / raw) To: João Távora; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel Hello, Joåo. On Mon, Nov 25, 2019 at 19:45:40 +0000, João Távora wrote: > On Mon, Nov 25, 2019 at 7:26 PM Alan Mackenzie <acm@muc.de> wrote: > > > So can you explain your new objection? > > Consistency. > Best consistency tends do arise when taking a good > hard look of the pros and cons of each change, instead > of citing blanket policy. > > All little tweaks to Emacs functionality which "everybody > is bound to want" end up irritating people immensely, > [ I could remember some introduced by you, but this > is besides the discussion. ] > > I can't remember any arguments you may have made > Here they are: see the second paragraph and the ensuing > discussion, where Eli suggests benchmarks: > https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00537.html > I can summarize: > 1. There are no adverse or surprising behaviors; > 2. There is negligible performance impact; > 3. There is a demonstrated benefit; I could have made exactly these arguments for enabling "my" new features by default. In fact, I might well have done so. ;-) But wiser heads prevailed. For one of these features, fast-but-imprecise-scrolling, there was even a massive performance advantage. It remains disabled by default. Point 2 may hold. Points 1 and 3 are pure speculation by you, you not being the most impartial judge. For me, at least, point 1 doesn't hold. Having the fontification delayed until 2 seconds of inactivity would for me be intensely irritating. Context fontification is bad enough, but that at least is justified by performance reasons. As for point 3, there would be no benefit for me, at least. I want to see correct fontification when I type a quote mark, not 2 seconds of inactivity later. > I've only done so much work testing each of these > assertions, and I'd of course be interested in hearing > (concrete) objections. There will be users who will not like this new minor mode. It should not be imposed upon them. Anyhow, as I said, I will accept Eli's judgment on this point. > João -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 20:11 ` jit-lock-antiblink-grace Alan Mackenzie @ 2019-11-25 20:23 ` João Távora 2019-11-25 21:07 ` jit-lock-antiblink-grace João Távora 2019-11-26 13:43 ` jit-lock-antiblink-grace Stefan Monnier 1 sibling, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-25 20:23 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel On Mon, Nov 25, 2019 at 8:11 PM Alan Mackenzie <acm@muc.de> wrote: > For me, at least, point 1 doesn't hold. Having the fontification > delayed until 2 seconds of inactivity would for me be intensely > irritating. This is not how it works. The only thing that is delayed is guaranteed to be unwanted, namely, fontifying as string a big chunk of the buffer that we know wasn't a string before the user opened a string. So what my change does is that this unwanted thing now comes later, if at all. > As for point 3, there would be no benefit for me, at least. I want to > see correct fontification when I type a quote mark, not 2 seconds of > inactivity later. Again: this is not how it works. I encourage you to try it out (and/or read the discussion from the beginning). And you are confusing two things: One is immediate and correct fontification, which I agree is desirable, but comes at a large performance cost for languages that permit multi-line strings. The other is an improvement on the current situation. Thanks, João ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 20:23 ` jit-lock-antiblink-grace João Távora @ 2019-11-25 21:07 ` João Távora 2019-11-26 2:30 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-25 21:07 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel On Mon, Nov 25, 2019 at 8:23 PM João Távora <joaotavora@gmail.com> wrote: > > On Mon, Nov 25, 2019 at 8:11 PM Alan Mackenzie <acm@muc.de> wrote: > > > For me, at least, point 1 doesn't hold. Having the fontification > > delayed until 2 seconds of inactivity would for me be intensely > > irritating. > > This is not how it works. The only thing that is delayed is > guaranteed to be unwanted, namely, fontifying as string > a big chunk of the buffer that we know wasn't a string > before the user opened a string. Actually, let me clarify this "guaranteed to be unwanted". The "unwanted" fontification of the large part of the buffer is guaranteed never to be fully correct, I think. But some of it _might_ be correct, and, as such, helpful, namely when you really want to define a multi-line string by first entering the quote, thus unbalancing the whole buffer (and incorrectly fontifying a part of it), paging down some lines, and then rebalancing it by entering another quote. (If it weren't so, we could downright abolish the behaviour, equivalent to setting jit-lock-antiblink-grace to infinity.) But even in that particular case, whose frequency I presume to be minute in proportion to the number of opened-and-closed strings, it can be argued that the patch has a benefit, since it's normally easier to spot where you want to end the new string made of existing non-string text when it's fontified as non-string text. The amount of CPU spent is also lower. João Távora ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 21:07 ` jit-lock-antiblink-grace João Távora @ 2019-11-26 2:30 ` João Távora 2019-11-26 17:58 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-26 2:30 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Alan Mackenzie, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 6743 bytes --] On Mon, Nov 25, 2019 at 9:07 PM João Távora <joaotavora@gmail.com> wrote: > But even in that particular case, whose frequency I presume to > be minute in proportion to the number of opened-and-closed > strings, it can be argued that the patch has a benefit, > since it's normally easier to spot where you want to end the > new string made of existing non-string text when it's fontified > as non-string text. The amount of CPU spent is also lower. A correction, again. This paragraph is an inaccurate description of how jit-lock-antiblink-grace works when the user wants to insert multi-line strings. In fact, I believe that scenario produce mostly the same behaviour in both antiblink-on/antiblink-off cases. The best way to explain it to show it in action, so I hope the animated gifs illustrate (from Emacs -Q). Eli, I also attach an updated patch (which I hope Gmail doesn't mangle) with the fixes you requested earlier. Thanks, João diff --git a/etc/NEWS b/etc/NEWS index 7e86ccc71e..e66dd4a21c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -604,6 +604,13 @@ If the region is active, the command joins all the lines in the region. When there's no active region, the command works on the current and the previous or the next line, as before. +--- +** New customizable variable 'jit-lock-antiblink-grace'. +When adding strings to source code, this helps avoid +\"blinking\", an unwanted oscillation of certain regions between +string and non-string fontification. + + * Changes in Specialized Modes and Packages in Emacs 27.1 diff --git a/lisp/jit-lock.el b/lisp/jit-lock.el index 48998a81fe..23afb53bf8 100644 --- a/lisp/jit-lock.el +++ b/lisp/jit-lock.el @@ -123,6 +123,20 @@ jit-lock-context-time :type '(number :tag "seconds") :group 'jit-lock) +(defcustom jit-lock-antiblink-grace 2 + "Idle time after which to refontify due to unterminated strings. +If the user creates a temporarily unterminated string up to the +end of the current line, that part of the line is fontified after +`jit-lock-context-time', but an extended idle \"grace\" period of +this many seconds is granted before deciding it is a multi-line +string and fontifying the remainder of the buffer accordingly. +When adding strings to source code, this helps avoid +\"blinking\", an unwanted oscillation of certain regions between +string and non-string fontification. If nil, there is no grace +period." + :type '(number :tag "seconds") + :group 'jit-lock) + (defcustom jit-lock-defer-time nil ;; 0.25 "Idle time after which deferred fontification should take place. If nil, fontification is not deferred. @@ -157,6 +171,15 @@ jit-lock-defer-buffers "List of buffers with pending deferred fontification.") (defvar jit-lock-stealth-buffers nil "List of buffers that are being fontified stealthily.") + +(defvar jit-lock--antiblink-grace-timer nil + "Idle timer for fontifying unterminated string or comment, or nil.") +(defvar jit-lock--antiblink-line-beginning-position (make-marker) + "Last line beginning position after last command (a marker).") +(defvar jit-lock--antiblink-string-or-comment nil + "Non-nil if in string or comment after last command (a boolean).") + + ;;; JIT lock mode @@ -232,7 +255,10 @@ jit-lock-mode (unless jit-lock-context-timer (setq jit-lock-context-timer (run-with-idle-timer jit-lock-context-time t - 'jit-lock-context-fontify))) + (lambda () + (unless jit-lock--antiblink-grace-timer + (jit-lock-context-fontify)))))) + (add-hook 'post-command-hook 'jit-lock--antiblink-post-command nil t) (setq jit-lock-context-unfontify-pos (or jit-lock-context-unfontify-pos (point-max)))) @@ -669,6 +695,55 @@ jit-lock-after-change ;; buffer, only jit-lock-context-* will re-fontify it. (min jit-lock-context-unfontify-pos jit-lock-start)))))) +(defun jit-lock--antiblink-post-command () + (let* ((new-l-b-p (copy-marker (line-beginning-position))) + (l-b-p-2 (line-beginning-position 2)) + (same-line + (and jit-lock-antiblink-grace + (not (= new-l-b-p l-b-p-2)) + (eq (marker-buffer jit-lock--antiblink-line-beginning-position) + (current-buffer)) + (= new-l-b-p jit-lock--antiblink-line-beginning-position))) + (new-s-o-c + (and same-line + (nth 8 (save-excursion (syntax-ppss l-b-p-2)))))) + (cond (;; opened a new multiline string... + (and same-line + (null jit-lock--antiblink-string-or-comment) new-s-o-c) + (setq jit-lock--antiblink-grace-timer + (run-with-idle-timer jit-lock-antiblink-grace nil + (lambda () + (jit-lock-context-fontify) + (setq jit-lock--antiblink-grace-timer + nil))))) + (;; closed an unterminated multiline string. + (and same-line + (null new-s-o-c) jit-lock--antiblink-string-or-comment) + ;; Kill the grace timer, might already have run and died. + ;; Don't refontify immediately: it adds an unreasonable + ;; delay to a well-behaved operation. Leave it for the + ;; `jit-lock-context-timer' as usual. + (when jit-lock--antiblink-grace-timer + (cancel-timer jit-lock--antiblink-grace-timer) + (setq jit-lock--antiblink-grace-timer nil))) + (same-line + ;; in same line, but no state change, leave everything as it was + ) + (t + ;; left the line somehow or customized feature away, etc + ;; kill timer if running, resume normal operation. + (when jit-lock--antiblink-grace-timer + ;; Do refontify immediately, adding a small delay. This + ;; is per Lars' request, and it makes sense because we + ;; should remark somehow that we are leaving the unstable + ;; state. + (jit-lock-context-fontify) + (cancel-timer jit-lock--antiblink-grace-timer) + (setq jit-lock--antiblink-grace-timer nil)))) + ;; update variables + (setq jit-lock--antiblink-line-beginning-position new-l-b-p + jit-lock--antiblink-string-or-comment new-s-o-c))) + (provide 'jit-lock) ;;; jit-lock.el ends here [-- Attachment #2: antiblink-on.gif --] [-- Type: image/gif, Size: 183742 bytes --] [-- Attachment #3: multi-line-strings-antiblink-on-and-off.gif --] [-- Type: image/gif, Size: 450963 bytes --] [-- Attachment #4: antiblink-off.gif --] [-- Type: image/gif, Size: 499091 bytes --] ^ permalink raw reply related [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-26 2:30 ` jit-lock-antiblink-grace João Távora @ 2019-11-26 17:58 ` Eli Zaretskii 2019-11-30 19:11 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-11-26 17:58 UTC (permalink / raw) To: João Távora; +Cc: acm, monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Tue, 26 Nov 2019 02:30:12 +0000 > Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel <emacs-devel@gnu.org>, > Alan Mackenzie <acm@muc.de> > > +--- > +** New customizable variable 'jit-lock-antiblink-grace'. > +When adding strings to source code, this helps avoid > +\"blinking\", an unwanted oscillation of certain regions between > +string and non-string fontification. Escaping quotes in NEWS is not needed/expected. And this entry doesn't say what is the default value, and doesn't tell how to get back old behavior. > +(defcustom jit-lock-antiblink-grace 2 > + "Idle time after which to refontify due to unterminated strings. > +If the user creates a temporarily unterminated string up to the > +end of the current line, that part of the line is fontified after > +`jit-lock-context-time', but an extended idle \"grace\" period of > +this many seconds is granted before deciding it is a multi-line > +string and fontifying the remainder of the buffer accordingly. > +When adding strings to source code, this helps avoid > +\"blinking\", an unwanted oscillation of certain regions between > +string and non-string fontification. If nil, there is no grace > +period." This is too wordy. If you think this description is necessary, we probably need to move most of it into the user manual. > + :type '(number :tag "seconds") > + :group 'jit-lock) Missing :version. > + (when jit-lock--antiblink-grace-timer > + ;; Do refontify immediately, adding a small delay. This > + ;; is per Lars' request, and it makes sense because we ^^^^^^^^^^^^^^^^^ Let's leave personae out of the code, okay? Thanks. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-26 17:58 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-11-30 19:11 ` João Távora 2019-11-30 19:22 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-30 19:11 UTC (permalink / raw) To: Eli Zaretskii; +Cc: acm, monnier, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> +--- >> +** New customizable variable 'jit-lock-antiblink-grace'. >> +When adding strings to source code, this helps avoid >> +\"blinking\", an unwanted oscillation of certain regions between >> +string and non-string fontification. > > Escaping quotes in NEWS is not needed/expected. Fixed. > And this entry doesn't say what is the default value, and doesn't tell > how to get back old behavior. Fixed. I didn't mention because I found examples in NEWS that don't. But mostly because we haven't come to a decision yet. I generally agree with Stefan and I propose the latest patch with the default value of 2 seconds for jit-lock-antiblink-grace. However, I have detected a case where jit-lock-antiblink-grace kicks in and, while not exactly causing a regression in useful behaviour, also doesn't add any useful behaviour. Here is the case: a. You want to make a string region in a non-string buffer of 10 lines between line 3 and 7. b. You go to line 7 and type a quote c. You go to line 3 and type a quote Previously, after step b) you would get lines 8, 9, and 10 (and 7 partially) string-fontified "immediately". Now, after step b), and _if stay on the same line_, it takes 2 seconds for lines 7-10 to be string-fontified. If you leave line 7 in your journey to line 3 before those 2 seconds are up, 7-10 are immediately string-fontified (and the old and new version become identical in behaviour). It may be argued by users that create strings like this that the antiblink grace timer wasn't useful at all, or that it mis-fired: these users were already counting on (temporarily) invalidly fontified lines 7-10, so they were suprised that it didn't happen immediately (or rather that it didn't happen after a short jit-lock-context-time delay). I think most users will do step c) before step b), and this doesn't present any problem. >> +(defcustom jit-lock-antiblink-grace 2 >> + "Idle time after which to refontify due to unterminated strings. >> +If the user creates a temporarily unterminated string up to the >> +end of the current line, that part of the line is fontified after >> +`jit-lock-context-time', but an extended idle \"grace\" period of >> +this many seconds is granted before deciding it is a multi-line >> +string and fontifying the remainder of the buffer accordingly. >> +When adding strings to source code, this helps avoid >> +\"blinking\", an unwanted oscillation of certain regions between >> +string and non-string fontification. If nil, there is no grace >> +period." > > This is too wordy. If you think this description is necessary, we > probably need to move most of it into the user manual. Fixed. Tho you'll see it was about as wordy as the other jit-lock defcustoms preceding it. Hope it's better now. >> + :type '(number :tag "seconds") >> + :group 'jit-lock) > > Missing :version. Fixed. >> + (when jit-lock--antiblink-grace-timer >> + ;; Do refontify immediately, adding a small delay. This >> + ;; is per Lars' request, and it makes sense because we > ^^^^^^^^^^^^^^^^^ > Let's leave personae out of the code, okay? I really meant the person. But okay. João diff --git a/etc/NEWS b/etc/NEWS index 7e86ccc71e..2f2acd52ac 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -604,6 +604,13 @@ If the region is active, the command joins all the lines in the region. When there's no active region, the command works on the current and the previous or the next line, as before. +--- +** New customizable variable 'jit-lock-antiblink-grace'. +When typing strings, this helps avoid "blinking", an oscillation +between string and non-string fontification. The variable holds a +number of seconds (default is 2) before a potentially unwanted +fontification starts. Set to nil to deactivate. + \f * Changes in Specialized Modes and Packages in Emacs 27.1 diff --git a/lisp/jit-lock.el b/lisp/jit-lock.el index 48998a81fe..c896c9d5ea 100644 --- a/lisp/jit-lock.el +++ b/lisp/jit-lock.el @@ -123,6 +123,20 @@ jit-lock-context-time :type '(number :tag "seconds") :group 'jit-lock) +(defcustom jit-lock-antiblink-grace 2 + "Grace period after which to refontify due to unterminated strings. +If nil, no grace period is given. Otherwise, a newly created +unterminated string is fontified only to the end of the current +line, after which the system waits this many seconds of idle time +before deciding the string is multi-line and fontifying the +remaining lines. When typing strings, this helps avoid +\"blinking\", an unwanted oscillation between string and +non-string fontification." + :type '(choice (const :tag "never" nil) + (number :tag "seconds")) + :group 'jit-lock + :version "27.1") + (defcustom jit-lock-defer-time nil ;; 0.25 "Idle time after which deferred fontification should take place. If nil, fontification is not deferred. @@ -157,6 +171,13 @@ jit-lock-defer-buffers "List of buffers with pending deferred fontification.") (defvar jit-lock-stealth-buffers nil "List of buffers that are being fontified stealthily.") + +(defvar jit-lock--antiblink-grace-timer nil + "Idle timer for fontifying unterminated string or comment, or nil.") +(defvar jit-lock--antiblink-line-beginning-position (make-marker) + "Last line beginning position after last command (a marker).") +(defvar jit-lock--antiblink-string-or-comment nil + "Non-nil if in string or comment after last command (a boolean).") \f ;;; JIT lock mode @@ -232,7 +253,10 @@ jit-lock-mode (unless jit-lock-context-timer (setq jit-lock-context-timer (run-with-idle-timer jit-lock-context-time t - 'jit-lock-context-fontify))) + (lambda () + (unless jit-lock--antiblink-grace-timer + (jit-lock-context-fontify)))))) + (add-hook 'post-command-hook 'jit-lock--antiblink-post-command nil t) (setq jit-lock-context-unfontify-pos (or jit-lock-context-unfontify-pos (point-max)))) @@ -669,6 +693,54 @@ jit-lock-after-change ;; buffer, only jit-lock-context-* will re-fontify it. (min jit-lock-context-unfontify-pos jit-lock-start)))))) +(defun jit-lock--antiblink-post-command () + (let* ((new-l-b-p (copy-marker (line-beginning-position))) + (l-b-p-2 (line-beginning-position 2)) + (same-line + (and jit-lock-antiblink-grace + (not (= new-l-b-p l-b-p-2)) + (eq (marker-buffer jit-lock--antiblink-line-beginning-position) + (current-buffer)) + (= new-l-b-p jit-lock--antiblink-line-beginning-position))) + (new-s-o-c + (and same-line + (nth 8 (save-excursion (syntax-ppss l-b-p-2)))))) + (cond (;; opened a new multiline string... + (and same-line + (null jit-lock--antiblink-string-or-comment) new-s-o-c) + (setq jit-lock--antiblink-grace-timer + (run-with-idle-timer jit-lock-antiblink-grace nil + (lambda () + (jit-lock-context-fontify) + (setq jit-lock--antiblink-grace-timer + nil))))) + (;; closed an unterminated multiline string. + (and same-line + (null new-s-o-c) jit-lock--antiblink-string-or-comment) + ;; Kill the grace timer, might already have run and died. + ;; Don't refontify immediately: it adds an unreasonable + ;; delay to a well-behaved operation. Leave it for the + ;; `jit-lock-context-timer' as usual. + (when jit-lock--antiblink-grace-timer + (cancel-timer jit-lock--antiblink-grace-timer) + (setq jit-lock--antiblink-grace-timer nil))) + (same-line + ;; in same line, but no state change, leave everything as it was + ) + (t + ;; left the line somehow or customized feature away, etc + ;; kill timer if running, resume normal operation. + (when jit-lock--antiblink-grace-timer + ;; Do refontify immediately, adding a small delay. This + ;; makes sense because it remarks somehow that we are + ;; leaving the unstable state. + (jit-lock-context-fontify) + (cancel-timer jit-lock--antiblink-grace-timer) + (setq jit-lock--antiblink-grace-timer nil)))) + ;; update variables + (setq jit-lock--antiblink-line-beginning-position new-l-b-p + jit-lock--antiblink-string-or-comment new-s-o-c))) + (provide 'jit-lock) ;;; jit-lock.el ends here ^ permalink raw reply related [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-30 19:11 ` jit-lock-antiblink-grace João Távora @ 2019-11-30 19:22 ` Eli Zaretskii 2019-11-30 20:12 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-11-30 19:22 UTC (permalink / raw) To: João Távora; +Cc: acm, monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org, acm@muc.de > Date: Sat, 30 Nov 2019 19:11:57 +0000 > > a. You want to make a string region in a non-string buffer of 10 lines > between line 3 and 7. > b. You go to line 7 and type a quote > c. You go to line 3 and type a quote > > Previously, after step b) you would get lines 8, 9, and 10 (and 7 > partially) string-fontified "immediately". > > Now, after step b), and _if stay on the same line_, it takes 2 seconds > for lines 7-10 to be string-fontified. If you leave line 7 in your > journey to line 3 before those 2 seconds are up, 7-10 are immediately > string-fontified (and the old and new version become identical in > behaviour). So how is this a problem, if at worst we get the old behavior? > +** New customizable variable 'jit-lock-antiblink-grace'. > +When typing strings, this helps avoid "blinking", an oscillation > +between string and non-string fontification. The variable holds a > +number of seconds (default is 2) before a potentially unwanted > +fontification starts. Set to nil to deactivate. ^^^^^^^^^^^^^^^^^^^^^^^^ "Deactivate" is not self-explanatory here, because the text didn't mention any "activation". I suggest this instead: Set to nil to get back the old behavior. Thanks. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-30 19:22 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-11-30 20:12 ` João Távora 2019-11-30 20:16 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-30 20:12 UTC (permalink / raw) To: Eli Zaretskii; +Cc: acm, monnier, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> between line 3 and 7. >> b. You go to line 7 and type a quote >> c. You go to line 3 and type a quote >> >> Previously, after step b) you would get lines 8, 9, and 10 (and 7 >> partially) string-fontified "immediately". >> >> Now, after step b), and _if stay on the same line_, it takes 2 seconds >> for lines 7-10 to be string-fontified. If you leave line 7 in your >> journey to line 3 before those 2 seconds are up, 7-10 are immediately >> string-fontified (and the old and new version become identical in >> behaviour). > > So how is this a problem, if at worst we get the old behavior? After b), you now have to wait 2 seconds (jit-lock-antiblink-grace) before you get the old behaviour (string-fontifying 7-10). Previously, you would get it after 0.5 seconds (jit-lock-context-time). It's arguable that the new behaviour is worse than the old one, for the specific case where you already expected lines 7-10 to be temporarily invalidly fontified anyway. (I say "invalid" because the user's intention is to move up to line 3) Anyway, I think it's a pretty minor thing, but I wanted to record it for completeness. >> +** New customizable variable 'jit-lock-antiblink-grace'. >> +When typing strings, this helps avoid "blinking", an oscillation >> +between string and non-string fontification. The variable holds a >> +number of seconds (default is 2) before a potentially unwanted >> +fontification starts. Set to nil to deactivate. > ^^^^^^^^^^^^^^^^^^^^^^^^ > "Deactivate" is not self-explanatory here, because the text didn't > mention any "activation". I suggest this instead: > > Set to nil to get back the old behavior. OK. I will also add the "set marker buffer to nil" optimization that Alan suggested. If there's no further comments, I will push this to master in a day or so. João ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-30 20:12 ` jit-lock-antiblink-grace João Távora @ 2019-11-30 20:16 ` Eli Zaretskii 2019-11-30 20:19 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-11-30 20:16 UTC (permalink / raw) To: João Távora; +Cc: acm, monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org, acm@muc.de > Date: Sat, 30 Nov 2019 20:12:51 +0000 > > >> b. You go to line 7 and type a quote > >> c. You go to line 3 and type a quote > >> > >> Previously, after step b) you would get lines 8, 9, and 10 (and 7 > >> partially) string-fontified "immediately". > >> > >> Now, after step b), and _if stay on the same line_, it takes 2 seconds > >> for lines 7-10 to be string-fontified. If you leave line 7 in your > >> journey to line 3 before those 2 seconds are up, 7-10 are immediately > >> string-fontified (and the old and new version become identical in > >> behaviour). > > > > So how is this a problem, if at worst we get the old behavior? > > After b), you now have to wait 2 seconds (jit-lock-antiblink-grace) > before you get the old behaviour (string-fontifying 7-10). Isn't this the new behavior? ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-30 20:16 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-11-30 20:19 ` João Távora 2019-11-30 20:41 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-30 20:19 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Alan Mackenzie, Stefan Monnier, emacs-devel On Sat, Nov 30, 2019 at 8:17 PM Eli Zaretskii <eliz@gnu.org> wrote: > > > From: João Távora <joaotavora@gmail.com> > > Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org, acm@muc.de > > Date: Sat, 30 Nov 2019 20:12:51 +0000 > > > > >> b. You go to line 7 and type a quote > > >> c. You go to line 3 and type a quote > > >> > > >> Previously, after step b) you would get lines 8, 9, and 10 (and 7 > > >> partially) string-fontified "immediately". > > >> > > >> Now, after step b), and _if stay on the same line_, it takes 2 seconds > > >> for lines 7-10 to be string-fontified. If you leave line 7 in your > > >> journey to line 3 before those 2 seconds are up, 7-10 are immediately > > >> string-fontified (and the old and new version become identical in > > >> behaviour). > > > > > > So how is this a problem, if at worst we get the old behavior? > > > > After b), you now have to wait 2 seconds (jit-lock-antiblink-grace) > > before you get the old behaviour (string-fontifying 7-10). > > Isn't this the new behavior? Yes, but in this very particular case, it doesn't gain you anything, IMO. João Távora ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-30 20:19 ` jit-lock-antiblink-grace João Távora @ 2019-11-30 20:41 ` Eli Zaretskii 2019-11-30 22:00 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-11-30 20:41 UTC (permalink / raw) To: João Távora; +Cc: acm, monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Sat, 30 Nov 2019 20:19:35 +0000 > Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel <emacs-devel@gnu.org>, > Alan Mackenzie <acm@muc.de> > > > > > So how is this a problem, if at worst we get the old behavior? > > > > > > After b), you now have to wait 2 seconds (jit-lock-antiblink-grace) > > > before you get the old behaviour (string-fontifying 7-10). > > > > Isn't this the new behavior? > > Yes, but in this very particular case, it doesn't gain you anything, > IMO. But you don't lose anything, either, right? ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-30 20:41 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-11-30 22:00 ` João Távora 2019-12-01 18:13 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-11-30 22:00 UTC (permalink / raw) To: Eli Zaretskii; +Cc: acm, monnier, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: João Távora <joaotavora@gmail.com> >> Date: Sat, 30 Nov 2019 20:19:35 +0000 >> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel <emacs-devel@gnu.org>, >> Alan Mackenzie <acm@muc.de> >> >> > > > So how is this a problem, if at worst we get the old behavior? >> > > >> > > After b), you now have to wait 2 seconds (jit-lock-antiblink-grace) >> > > before you get the old behaviour (string-fontifying 7-10). >> > >> > Isn't this the new behavior? >> >> Yes, but in this very particular case, it doesn't gain you anything, >> IMO. > > But you don't lose anything, either, right? Depends on how you look at it. Let me try to explain. jit-lock-antiblink-grace is based on presumptions, the main one being that when you open a string, no two seconds of idle time will elapse before you close it. The presumption is also that you will close it in a further position of the buffer. In the edge case I described, that doesn't hold: the user wants to close the string in a previous position. So I speculate that that user is accustomed to the old behaviour and will find it odd that the invalid fontification -- which he/she expects and potentially even likes and which used to come almost immediately -- now only comes after two seconds, or when moving up the line. This is fundamentally different from the main use case of jit-lock-antiblink, where we are certain that near-immediate invalid fontification will annoy the user, who we presume will "soon" close the string. So delaying that annoying thing is a good decision. I only mentioned this edge case (which doesn't affect me, personally) because previously I had written I could not find any useful behaviour lost by jit-lock-antiblink. I am doing this for completeness because we know changing any default is potentially controversial (cue https://xkcd.com/1172/). João ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-30 22:00 ` jit-lock-antiblink-grace João Távora @ 2019-12-01 18:13 ` Eli Zaretskii 2019-12-04 22:45 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Eli Zaretskii @ 2019-12-01 18:13 UTC (permalink / raw) To: João Távora; +Cc: acm, monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Sat, 30 Nov 2019 22:00:24 +0000 > Cc: acm@muc.de, monnier@iro.umontreal.ca, emacs-devel@gnu.org > > >> > Isn't this the new behavior? > >> > >> Yes, but in this very particular case, it doesn't gain you anything, > >> IMO. > > > > But you don't lose anything, either, right? > > Depends on how you look at it. Let me try to explain. Thanks. I still think this is very much like the old behavior, so I wouldn't be bothered by it. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-12-01 18:13 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-12-04 22:45 ` João Távora 2019-12-05 15:40 ` jit-lock-antiblink-grace Eli Zaretskii 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-12-04 22:45 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Alan Mackenzie, Stefan Monnier, emacs-devel On Sun, Dec 1, 2019 at 7:13 PM Eli Zaretskii <eliz@gnu.org> wrote: > Thanks. I still think this is very much like the old behavior, so I > wouldn't be bothered by it. In the absence of more comments, I pushed the antiblink to master. It's commit 5b45c26. For those of you that don't use a quote-matching solution like electric-pair-mode, paredit, or something else, let me know if you like the new behaviour, if you're bothered by it, or just indifferent. Thanks, João ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-12-04 22:45 ` jit-lock-antiblink-grace João Távora @ 2019-12-05 15:40 ` Eli Zaretskii 0 siblings, 0 replies; 58+ messages in thread From: Eli Zaretskii @ 2019-12-05 15:40 UTC (permalink / raw) To: João Távora; +Cc: acm, monnier, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Wed, 4 Dec 2019 23:45:51 +0100 > Cc: Alan Mackenzie <acm@muc.de>, Stefan Monnier <monnier@iro.umontreal.ca>, > emacs-devel <emacs-devel@gnu.org> > > In the absence of more comments, I pushed the antiblink to master. > It's commit 5b45c26. For those of you that don't use a quote-matching > solution like electric-pair-mode, paredit, or something else, let me > know if you like the new behaviour, if you're bothered by it, or just > indifferent. Thanks. I tweaked the documentation a bit. ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 20:11 ` jit-lock-antiblink-grace Alan Mackenzie 2019-11-25 20:23 ` jit-lock-antiblink-grace João Távora @ 2019-11-26 13:43 ` Stefan Monnier 1 sibling, 0 replies; 58+ messages in thread From: Stefan Monnier @ 2019-11-26 13:43 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Eli Zaretskii, João Távora, emacs-devel > I could have made exactly these arguments for enabling "my" new > features by default. FWIW, this antiblink thingy eliminates (or at least reduces) an annoyance rather than provides a feature. I wouldn't go as far as to claim it's a bug fix, but it's closer to it than to a feature, IMO. Stefan ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 19:26 ` jit-lock-antiblink-grace Alan Mackenzie 2019-11-25 19:45 ` jit-lock-antiblink-grace João Távora @ 2019-11-25 19:47 ` Dmitry Gutov 2019-11-25 20:03 ` jit-lock-antiblink-grace João Távora 1 sibling, 1 reply; 58+ messages in thread From: Dmitry Gutov @ 2019-11-25 19:47 UTC (permalink / raw) To: Alan Mackenzie, João Távora Cc: Eli Zaretskii, Stefan Monnier, emacs-devel On 25.11.2019 21:26, Alan Mackenzie wrote: > People who want this new mode will find it and enable it. I can't > remember any arguments you may have made as to why this mode should be > singled out for special treatment, but I can't see any compelling reason > for its default enablement. Considering this mode was born out of a discussion on how to simplify one of CC Mode's latest features, this exchange reads like a political failure. :-( ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-11-25 19:47 ` jit-lock-antiblink-grace Dmitry Gutov @ 2019-11-25 20:03 ` João Távora 0 siblings, 0 replies; 58+ messages in thread From: João Távora @ 2019-11-25 20:03 UTC (permalink / raw) To: Dmitry Gutov; +Cc: Alan Mackenzie, Eli Zaretskii, Stefan Monnier, emacs-devel On Mon, Nov 25, 2019 at 7:47 PM Dmitry Gutov <dgutov@yandex.ru> wrote: > Considering this mode was born out of a discussion on how to simplify > one of CC Mode's latest features, this exchange reads like a political > failure. :-( Don't understand your comment 100%, but, in a way, I think it's a success. This work was envisioned by Stefan and implemented by me. It helps other parts of Emacs, not just CC-Mode. It's indebted to that discussion, to all its participants, including Alan, of course. João ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 14:23 ` jit-lock-antiblink-grace João Távora 2019-10-12 16:04 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-12 16:14 ` Alan Mackenzie 2019-10-12 22:26 ` jit-lock-antiblink-grace João Távora 1 sibling, 1 reply; 58+ messages in thread From: Alan Mackenzie @ 2019-10-12 16:14 UTC (permalink / raw) To: João Távora; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel Hello, João. On Sat, Oct 12, 2019 at 15:23:08 +0100, João Távora wrote: > On Sat, Oct 12, 2019 at 2:33 PM Eli Zaretskii <eliz@gnu.org> wrote: [ .... ] > > It's a backward-incompatible behavior, and is not being developed due > > to bug reports, so why make it the default right from the start? It > > also slows down cursor motion (which should probably be in the doc > > string as well). > Regarding slowdown, we have to check by how much. Regarding the > pertinence of the modificaiton, there are mode-specific modifications > with (IMO much worse) backward-incompatible behaviour being made to > modes like to c-mode to circumvent precisely this problem. No. The feature in CC Mode I think you're referring to, namely the correct fontification of unterminated strings is a static feature, clearly indicating that the string hasn't (yet) been terminated, and where its current end (as would be interpreted by a compiler) is. The feature you've implemented is, if I understand correctly (I haven't tried it, yet) a dynamic one, where fontification gets delayed a bit to give the user a certain chance to terminate an unterminated string before fontification kicks in. I would guess that your new feature is less needed in a CC Mode mode than in modes where the fontification of a string extends to the next string quote, no matter how far away. > Perhaps you could weigh in on the pertinence of those on-by-default > (and moreover impossible-to-turn-off) alternatives, too. Although > those other modifications target a reduced subset of modes, indeed > precisely because of that fact, I think it's better that Emacs provides > an effective and more generic solution to this problem. I agree with that. My view is that such a feature should be provided in syntax.c and the font locking system, such that a major mode can specify that unterminated strings are to be regarded as terminated by an unescaped new line. I think I said this before, off hand, but it didn't go anywhere. [ .... ] > João -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 16:14 ` jit-lock-antiblink-grace Alan Mackenzie @ 2019-10-12 22:26 ` João Távora 2019-10-13 10:18 ` jit-lock-antiblink-grace Alan Mackenzie 0 siblings, 1 reply; 58+ messages in thread From: João Távora @ 2019-10-12 22:26 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1545 bytes --] On Sat, Oct 12, 2019 at 5:14 PM Alan Mackenzie <acm@muc.de> wrote: > > Hello, João. > > Regarding slowdown, we have to check by how much. Regarding the > > pertinence of the modificaiton, there are mode-specific modifications > > with (IMO much worse) backward-incompatible behaviour being made to > > modes like to c-mode to circumvent precisely this problem. > No. You're right. I never really understood _your_ motivation for it. Of all its serious drawbacks, the only positive effect that others -- indeed not you -- effectively pointed out is that it partially solves the "flashing" or "blinking" problem for users who don't use electric-pair-mode, smartparens, or similar solutions. In contrast, your explanations for that particular feature, which conflated syntax and font-lock considerations, were always nonsensical to me. With all sincerity, whenever I tried to follow your logic I came to a insoluble contradiction. Alas, I'm afraid my ability to follow the same arguments hasn't evolved much in the meantime, and so I very much wish not to rehash that discussion. Anyway, after recognizing the legitimacy of the aforementioned "flashing" problem (which, again, I avoid with electric-pair-mode), I took up a stuggestion by Stefan for an alternative way to solve that problem. So that there would be less justification to the behaviour-breaking changes to CC Mode, or at least so that other mode authors aren't encouraged to replicate your approach, that I personally consider harmful. João [-- Attachment #2: Type: text/html, Size: 1753 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-12 22:26 ` jit-lock-antiblink-grace João Távora @ 2019-10-13 10:18 ` Alan Mackenzie 2019-10-13 10:48 ` jit-lock-antiblink-grace João Távora 0 siblings, 1 reply; 58+ messages in thread From: Alan Mackenzie @ 2019-10-13 10:18 UTC (permalink / raw) To: João Távora; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel Hello, Jaão. On Sat, Oct 12, 2019 at 23:26:00 +0100, João Távora wrote: > On Sat, Oct 12, 2019 at 5:14 PM Alan Mackenzie <acm@muc.de> wrote: > > > Regarding slowdown, we have to check by how much. Regarding the > > > pertinence of the modificaiton, there are mode-specific modifications > > > with (IMO much worse) backward-incompatible behaviour being made to > > > modes like to c-mode to circumvent precisely this problem. > > No. > You're right. I never really understood _your_ motivation for it. Of > all its serious drawbacks, the only positive effect that others -- > indeed not you -- effectively pointed out is that it partially solves > the "flashing" or "blinking" problem for users who don't use > electric-pair-mode, smartparens, or similar solutions. In contrast, > your explanations for that particular feature, which conflated syntax > and font-lock considerations, were always nonsensical to me. With all > sincerity, whenever I tried to follow your logic I came to a insoluble > contradiction. Alas, I'm afraid my ability to follow the same arguments > hasn't evolved much in the meantime, and so I very much wish not to > rehash that discussion. > Anyway, after recognizing the legitimacy of the aforementioned > "flashing" problem (which, again, I avoid with electric-pair-mode), I > took up a stuggestion by Stefan for an alternative way to solve that > problem. So that there would be less justification to the > behaviour-breaking changes to CC Mode, or at least so that other mode > authors aren't encouraged to replicate your approach, that I personally > consider harmful. Why do you have to be so hostile? You start by snipping my entire post, bar one word, so that people can't see my point of view that you're supposedly replying to. Then you generally disparage my work, vaguely and unspecifically. If there's something about CC Mode workings you don't like, say what it is. Then I can see if the mode can be further improved. The one specific feature you referred to in the past, namely syntactic matching of disjoint string quotes (i.e. on different lines), I implemented back in July. Please don't post more posts like the one I'm replying to. They're not helpful, and spoil the generally positive and cooperative tone on this list. > João -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-13 10:18 ` jit-lock-antiblink-grace Alan Mackenzie @ 2019-10-13 10:48 ` João Távora 0 siblings, 0 replies; 58+ messages in thread From: João Távora @ 2019-10-13 10:48 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1757 bytes --] On Sun, Oct 13, 2019 at 11:18 AM Alan Mackenzie <acm@muc.de> wrote: > Why do you have to be so hostile? > You start by snipping my entire post, bar one word, so that people can't > see my point of view that you're supposedly replying to. The word I left was the only thing that interested me in your whole post. It was a simple "No." reply to one of my earlier statements, and I replied by correcting myself and admitting I misattributed an intention to you. How can that be hostile? Also, people will presumably have access to the conversion, it's not secret. > Then you generally disparage my work, vaguely and unspecifically. If > there's something about CC Mode workings you don't like, say what it is. > Then I can see if the mode can be further improved. Stating disagreement is not the same as disparaging. Also, as I wrote, I have no intention of convincing you to change CC Mode. I already spent a good deal of effort trying to do so in the past, I gave up, and I have no plans or energy topersist.. I'd much rather invest in alternatives, sorry :-), but that's being honest, not hostile. > Please don't post more posts like the one I'm replying to. They're not > helpful, and spoil the generally positive and cooperative tone on this > list. I'm not spoiling anything Alan, don't overreact. The feature I'm proposing is for all Emacs modes, and is related to the past discussion (was it really July? perhaps) in the sense that some people brought up the "flashing/blinking" behaviour in connection to it. You're of course well welcome to discuss the merits/flaws of my proposal, but outside the scope of CC Mode (unless of course you show it has some adverse effect _specific_ to CC Mode). João [-- Attachment #2: Type: text/html, Size: 1999 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-10 22:34 jit-lock-antiblink-grace João Távora 2019-10-11 14:26 ` jit-lock-antiblink-grace Stefan Monnier 2019-10-12 9:34 ` jit-lock-antiblink-grace Eli Zaretskii @ 2019-10-13 12:02 ` Alan Mackenzie 2019-10-13 19:57 ` jit-lock-antiblink-grace João Távora 2 siblings, 1 reply; 58+ messages in thread From: Alan Mackenzie @ 2019-10-13 12:02 UTC (permalink / raw) To: João Távora Cc: Lars Ingebrigtsen, Clément Pit-Claudel, Stefan Monnier, emacs-devel Hello, João. On Thu, Oct 10, 2019 at 23:34:25 +0100, João Távora wrote: > Hello all, > A while back I coded up a feature in a scratch branch that > I dubbed the "antiblink". It helps avoid the fontification "blinking" > behaviour observed when creating temporarily unterminated > strings to source code. > I recall that Lars and Clément tested it with generally positive results. > At Stefan's request, I have reworked the implementation and > cleaned up the feature, which is embodied in the jit-lock-antiblink-grace > variable and want to land it on master if no-one objects. Before that, I would suggest you turn it into two minor modes, one working on the current buffer, the other global, just like font-lock-mode and global-font-lock-mode. > If you want to try it before that happens see the > scratch/jit-lock-antiblink-cleaned-up branch. I think the mode should be easier to turn on and off, and should not need font-lock-mode to be reinitialised. > jit-lock-antiblink-grace is set to 2 seconds by default, which works > nicely in my testing. Just launch your emacs, ensure you don't have > a quote-matching facility such as electric-pair-mode setup (in which > case the feature is mostly useless to you), and add/or remove > strings to some source code. > Thanks, > João Távora [ .... ] -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 58+ messages in thread
* Re: jit-lock-antiblink-grace 2019-10-13 12:02 ` jit-lock-antiblink-grace Alan Mackenzie @ 2019-10-13 19:57 ` João Távora 0 siblings, 0 replies; 58+ messages in thread From: João Távora @ 2019-10-13 19:57 UTC (permalink / raw) To: Alan Mackenzie Cc: Lars Ingebrigtsen, Clément Pit-Claudel, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 999 bytes --] On Sun, Oct 13, 2019 at 1:02 PM Alan Mackenzie <acm@muc.de> wrote: > Before that, I would suggest you turn it into two minor modes, one > working on the current buffer, the other global, just like > font-lock-mode and global-font-lock-mode. Thanks for the suggestion. Currently, my intention is that a variable, a generalized boolean controls this feature. This shouldn't conflict a lot with your proposal of proper global and minor modes for separate (de)activation, but those would come later. > > If you want to try it before that happens see the > > scratch/jit-lock-antiblink-cleaned-up branch. > > I think the mode should be easier to turn on and off, and should not > need font-lock-mode to be reinitialised. Don't worry, that's the way it works right now (no jit-lock-mode reinitialisation needed): just set (or customize) jit-lock-antiblink-grace to a positive number to activate, and to nil to deactivate. It should take effect immediately. -- João Távora [-- Attachment #2: Type: text/html, Size: 1284 bytes --] ^ permalink raw reply [flat|nested] 58+ messages in thread
end of thread, other threads:[~2019-12-05 15:40 UTC | newest] Thread overview: 58+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-10-10 22:34 jit-lock-antiblink-grace João Távora 2019-10-11 14:26 ` jit-lock-antiblink-grace Stefan Monnier 2019-10-12 9:34 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 10:57 ` jit-lock-antiblink-grace João Távora 2019-10-12 13:02 ` jit-lock-antiblink-grace Juanma Barranquero 2019-10-12 13:14 ` jit-lock-antiblink-grace João Távora 2019-10-12 14:50 ` jit-lock-antiblink-grace Juanma Barranquero 2019-10-12 15:11 ` jit-lock-antiblink-grace João Távora 2019-10-12 15:30 ` jit-lock-antiblink-grace Juanma Barranquero 2019-10-12 13:32 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 14:13 ` jit-lock-antiblink-grace Stefan Monnier 2019-10-12 14:23 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 14:34 ` jit-lock-antiblink-grace Stefan Monnier 2019-10-12 15:57 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 17:16 ` jit-lock-antiblink-grace Stefan Monnier 2019-10-12 17:50 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 15:47 ` jit-lock-antiblink-grace Alan Mackenzie 2019-10-12 14:23 ` jit-lock-antiblink-grace João Távora 2019-10-12 16:04 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-12 21:55 ` jit-lock-antiblink-grace João Távora 2019-10-13 6:39 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-13 8:47 ` jit-lock-antiblink-grace João Távora 2019-10-13 9:22 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-13 10:28 ` jit-lock-antiblink-grace João Távora 2019-10-13 10:45 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-14 23:29 ` jit-lock-antiblink-grace João Távora 2019-10-15 6:48 ` jit-lock-antiblink-grace Eli Zaretskii 2019-10-15 18:28 ` jit-lock-antiblink-grace João Távora 2019-11-24 1:04 ` jit-lock-antiblink-grace João Távora 2019-11-24 16:16 ` jit-lock-antiblink-grace Eli Zaretskii 2019-11-25 18:46 ` jit-lock-antiblink-grace Alan Mackenzie 2019-11-25 19:02 ` jit-lock-antiblink-grace João Távora 2019-11-25 19:26 ` jit-lock-antiblink-grace Alan Mackenzie 2019-11-25 19:45 ` jit-lock-antiblink-grace João Távora 2019-11-25 20:11 ` jit-lock-antiblink-grace Alan Mackenzie 2019-11-25 20:23 ` jit-lock-antiblink-grace João Távora 2019-11-25 21:07 ` jit-lock-antiblink-grace João Távora 2019-11-26 2:30 ` jit-lock-antiblink-grace João Távora 2019-11-26 17:58 ` jit-lock-antiblink-grace Eli Zaretskii 2019-11-30 19:11 ` jit-lock-antiblink-grace João Távora 2019-11-30 19:22 ` jit-lock-antiblink-grace Eli Zaretskii 2019-11-30 20:12 ` jit-lock-antiblink-grace João Távora 2019-11-30 20:16 ` jit-lock-antiblink-grace Eli Zaretskii 2019-11-30 20:19 ` jit-lock-antiblink-grace João Távora 2019-11-30 20:41 ` jit-lock-antiblink-grace Eli Zaretskii 2019-11-30 22:00 ` jit-lock-antiblink-grace João Távora 2019-12-01 18:13 ` jit-lock-antiblink-grace Eli Zaretskii 2019-12-04 22:45 ` jit-lock-antiblink-grace João Távora 2019-12-05 15:40 ` jit-lock-antiblink-grace Eli Zaretskii 2019-11-26 13:43 ` jit-lock-antiblink-grace Stefan Monnier 2019-11-25 19:47 ` jit-lock-antiblink-grace Dmitry Gutov 2019-11-25 20:03 ` jit-lock-antiblink-grace João Távora 2019-10-12 16:14 ` jit-lock-antiblink-grace Alan Mackenzie 2019-10-12 22:26 ` jit-lock-antiblink-grace João Távora 2019-10-13 10:18 ` jit-lock-antiblink-grace Alan Mackenzie 2019-10-13 10:48 ` jit-lock-antiblink-grace João Távora 2019-10-13 12:02 ` jit-lock-antiblink-grace Alan Mackenzie 2019-10-13 19:57 ` jit-lock-antiblink-grace João Távora
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).