unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Keith David Bershatsky <esq@lawlist.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: "Michael Heerdegen" <eliz@gnu.org>,
	"Clément Pit--Claudel" <clement.pit@gmail.com>,
	emacs-devel@gnu.org
Subject: Re: Use cases for post-redisplay hooks
Date: Mon, 04 Jul 2016 15:50:42 -0700	[thread overview]
Message-ID: <m2inwldnlp.wl%esq@lawlist.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 3633 bytes --]

The implementation of the `window-start-end-hook` is probably easier to explain with a diff, which is attached.  I haven't worked much on the hook since March 11, 2016, so it applies to the master branch on or about that date.  [I think I made a few very minor changes after that, but don't have a diff ready at this time.]

Each command loop, I place the following overlays on just the visible window:

* [Maybe] draw a vertical line that tracks the cursor position, which is compatible with `word-wrap` enabled.  Sometimes I force it to draw immediately, but most of the time it is on an idle timer.  The line stretches from the top of the window to the bottom of the window.

* Place line numbers to the left of the left-fringe.

* Place pilcrows at the end of each line.  [The `buffer-display-table` can't be used for this because those pilcrows are not compatible with the vertical line, which also adds pilcrows.]

* Draw a horizontal line underneath where the cursor is located.  The line stretches from the left-fringe to the right-fringe, and sometimes some I add bitmaps in the fringe.

* If there is a region active, then the region is colored appropriately to work with the cross-hairs (describe-above).

* I also run some other stuff at the tail end, which is not really that important to the use case -- e.g., parentheses highlighting, and flyspell.

The reason I mentioned the `window-scroll-functions` hook was an assumption (on my part) that Clément had initially categorized my potential usage of the proposed `post-redisplay-hook` as only relating to scrolling.  I just wanted to clarify / differentiate my proposed use case as needing `window-start` and `window-end` each command loop.

With respect to the hook running more than once each command loop, it is only a problem for me because my calculations are costly time-wise (e.g., `vertical-motion').  So, I only want to do it one time each command loop.  The `window-start-end-hook` only fires completely when point is fully visible and when the values for `window-start` and `window-end` are correct (at least in so far as my testing has shown).  Someone who uses a simple function attached to a hook that runs multiple times each command loop would not likely be bothered if there is a little waste.  I suffer from a little O.C.D., so just the thought of a function running for no reason at all bothers me.  :)

Keith

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

At Mon, 04 Jul 2016 18:06:33 -0400,
Stefan Monnier wrote:
> 
> > I am using a slightly modified version of Emacs that has what
> > I call a `window-start-end-hook`, which lets me draw overlays on just the
> > visible window every command loop.  I needs more work, but that is the
> > general idea of the modification.
> 
> Could you clarify what you use it for?
> 
> Also is it run after redisplay?  If so, how does it work?  I mean how do
> you add overlays *after* redisplay?  Do you trigger a second redisplay
> right after the first, or is it simply that your overlays don't affect
> the display?
> 
> > There are certain movements of point that are not covered by the
> > `window-scroll-functions` hook, so that hook cannot be used reliably for the
> > above-mentioned purpose.
> 
> Not sure what point has to do with window-start-end-hook.
> 
> > And, the hook *may* run more than once each command loop, leading to
> > potentially wasted time spent running an overlay function that will
> > need to run again anyway before the display cycle finishes.
> 
> Is that a problem in practice?
> 
> 
>         Stefan


[-- Attachment #2: window_start_end_hook.diff --]
[-- Type: application/diff, Size: 15202 bytes --]

             reply	other threads:[~2016-07-04 22:50 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-04 22:50 Keith David Bershatsky [this message]
2016-07-05  8:12 ` Use cases for post-redisplay hooks Stefan Monnier
2016-07-07 16:08 ` Clément Pit--Claudel
  -- strict thread matches above, loose matches on Subject: below --
2016-07-07 20:19 Keith David Bershatsky
2016-07-07 17:53 Keith David Bershatsky
2016-07-07 19:44 ` Clément Pit--Claudel
2016-07-05 17:45 Keith David Bershatsky
2016-07-04 21:42 Keith David Bershatsky
2016-07-04 22:06 ` Stefan Monnier
2016-07-05  2:35 ` Eli Zaretskii
2016-07-04 16:39 Clément Pit--Claudel
2016-07-04 17:02 ` Eli Zaretskii
2016-07-04 17:15   ` Clément Pit--Claudel
2016-07-04 21:45 ` Stefan Monnier
2016-07-10 22:17 ` Clément Pit--Claudel
2016-07-11  3:34   ` Stefan Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2inwldnlp.wl%esq@lawlist.com \
    --to=esq@lawlist.com \
    --cc=clement.pit@gmail.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this 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).