all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* auto-composition-mode and display properties
@ 2008-02-21 16:12 Stephen Berman
  2008-02-21 16:23 ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Stephen Berman @ 2008-02-21 16:12 UTC (permalink / raw)
  To: emacs-devel

Since the unicode merge, composite.el contains auto-composition-mode,
which is enabled globally by default.  This adds the auto-composed
property to every character.  The auto-composed property also gets added
to display properties.  For example:

1. emacs -Q
2. Type the string "ab".
3. Put the cursor after "b" and type 
   `M-: (put-text-property (1- (point)) (point) 'display "test")'.
Now the buffer display "atest".
4. Put the cursor after "a", i.e. on the first "t" and type `C-u C-x
='.  The *Help* buffer says:
     There are text properties here:
       auto-composed        t
       display              [Show]
By clicking on `[Show]' we get the value of the display property:
   #("test" 0 4
     (auto-composed t))

I assume the display property is supposed to be like this, i.e. this is
not a bug?  I ask because it is wreaking havoc with isearch in a mode I
have that uses display properties (e.g., isearch stops when it gets to
the bottom of the window, even though there are further occurrences out
of view, and the cursor cycles over lines above the last visible
occurrence).  There may be a bug in the mode that is triggered by
isearch with auto-composition-mode enabled, but I don't know how to
debug it: when I instrument isearch-mode for edebug and step through it,
after isearch-update is called the focus for entering isearch strings
becomes the buffer of isearch.el and switching back to the buffer with
my mode interrupts isearch.  So I cannot trigger the bug under edebug.
All I know is that when I disable auto-composition-mode, isearch works
fine in my mode (and it works fine in CVS Emacs prior to the unicode
merge).  So I would like to know, again, if auto-composition-mode is
really supposed to add the auto-composed property to the display string.
And does anyone have any suggestions for how I can debug isearch?

Steve Berman





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: auto-composition-mode and display properties
  2008-02-21 16:12 auto-composition-mode and display properties Stephen Berman
@ 2008-02-21 16:23 ` Stefan Monnier
  2008-02-23 22:24   ` isearch, " Stephen Berman
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2008-02-21 16:23 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel

> merge).  So I would like to know, again, if auto-composition-mode is
> really supposed to add the auto-composed property to the display string.

Yes.  As a matter of fact, it goes through a fair bit of extra trouble
to be able to do that.

> And does anyone have any suggestions for how I can debug isearch?

When Edebug is uncooperative, `message' is your friend,


        Stefan






^ permalink raw reply	[flat|nested] 6+ messages in thread

* isearch, auto-composition-mode and display properties
  2008-02-21 16:23 ` Stefan Monnier
@ 2008-02-23 22:24   ` Stephen Berman
  2008-02-24 19:09     ` Juri Linkov
  0 siblings, 1 reply; 6+ messages in thread
From: Stephen Berman @ 2008-02-23 22:24 UTC (permalink / raw)
  To: emacs-devel

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

On Thu, 21 Feb 2008 11:23:45 -0500 Stefan Monnier <monnier@IRO.UMontreal.CA> wrote:

>> merge).  So I would like to know, again, if auto-composition-mode is
>> really supposed to add the auto-composed property to the display string.
>
> Yes.  As a matter of fact, it goes through a fair bit of extra trouble
> to be able to do that.

Ok.  Too bad it's also causing me trouble, but maybe there's hope ...

>> And does anyone have any suggestions for how I can debug isearch?
>
> When Edebug is uncooperative, `message' is your friend,

I don't see where in the isearch code it would be helpful to invoke
`message' for the problem at hand.  But maybe someone else will: I have
in the mean time come up with a fairly minimal recipe for reproducing
the isearch problem that does not depend on my mode.  Here it is:

1. emacs -Q --eval "(add-hook 'post-command-hook 'ignore)" isearch-test[1]

2. M-: (setq header-line-format "test")

3. Evaluate the following sexp (this assumes frame-height is 40 and
frame-width is 80):

	(progn
	  (put-text-property 70 71 'display " \n")
	  (put-text-property 137 138 'display " \n")
	  (copy-region-as-kill 1 188)
	  (goto-char 188)
	  (dotimes (_ 20) (yank))
	  (goto-char (point-min))
	  (scroll-up 1))

Now point should be at window-start, point-min should be above
window-start, and the last visible line in the window should contain an
occurrence of the string "search".

4. Type `C-s s e C-w' to make "search" the isearch target.

5. Keeping type `C-s' until it reaches the "search" in the last visible
line (line 13).

6. Typing `C-s' again makes the cursor jump to the beginning of line 7.
Continuing to type `C-s' cycles over lines 7 to 13 ad infinitum.

7. Type `M-x auto-composition-mode' to disable auto-composition-mode.
Now typing `C-s' makes isearch find all "search" strings to the end of
the buffer, i.e., now isearch functions as it should.

I note that the problematic effect in step 6 only happens if
post-command-hook is non-nil (but AFAICT the value is otherwise
irrelevant), header-line-format is non-nil and the text is situated as
described at the end of step 3.  (With the mode where I first observed
this problem, I saw somewhat different effects, possibly depending on
frame-height: in one test isearch simply stopped at the bottom of the
window, i.e. continuing to type `C-s' had no effect; in another test the
cursor jumped only a couple of lines higher, not to the middle of the
window; in yet another test the cursor jumped to the beginning of the
line.  Also there were configurations where the last occurrence of the
isearch target string was not on the last visible line but several
above.)

I hope others can reproduce this problem and someone can figure out
what's going on.

Steve Berman

Footnotes: 
[1]  Here is the file isearch-test:

[-- Attachment #2: isearch-test --]
[-- Type: application/octet-stream, Size: 187 bytes --]

Test test test test test test test test test test test test test test test test test test test test test search test test test test test test test test test test test test test test test

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: isearch, auto-composition-mode and display properties
  2008-02-23 22:24   ` isearch, " Stephen Berman
@ 2008-02-24 19:09     ` Juri Linkov
  2008-05-30  8:49       ` Stephen Berman
  0 siblings, 1 reply; 6+ messages in thread
From: Juri Linkov @ 2008-02-24 19:09 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel

> I hope others can reproduce this problem and someone can figure out
> what's going on.

Thank you for the detailed test case.  I was able to reproduce it.

To debug isearch, you can instrument one of the top isearch functions
(e.g. `isearch-repeat-forward'), open the isearch.el file in another
frame/buffer (another frame is more preferable when debugging display
problems like in your case), and start typing C-s in the original
buffer.  When it stops on an uninteresting place, just type `g' to
continue execution.  Use `i' to go to a deeper function.

The hardest part in debugging isearch is not forget not to use isearch
to navigate in the source buffer while edebug is active (e.g. to find
the next function to instrument, etc :)

Using this technique, it is possible to find that your trouble is cased
by the following part of `isearch-update':

	  ;; Keep same hscrolling as at the start of the search when possible
	  (let ((current-scroll (window-hscroll)))
	    (set-window-hscroll (selected-window) isearch-start-hscroll)
	    (unless (pos-visible-in-window-p)
	      (set-window-hscroll (selected-window) current-scroll)))

Removing this part eliminates the bug you reported.  Unfortunately,
I have no idea how to fix this since this depends on the details
how the display engine works.

-- 
Juri Linkov
http://www.jurta.org/emacs/




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: isearch, auto-composition-mode and display properties
  2008-02-24 19:09     ` Juri Linkov
@ 2008-05-30  8:49       ` Stephen Berman
  2008-05-30 14:17         ` Stephen Berman
  0 siblings, 1 reply; 6+ messages in thread
From: Stephen Berman @ 2008-05-30  8:49 UTC (permalink / raw)
  To: emacs-devel

On Sun, 24 Feb 2008 21:09:07 +0200 Juri Linkov <juri@jurta.org> wrote:

>> I hope others can reproduce this problem and someone can figure out
>> what's going on.
>
> Thank you for the detailed test case.  I was able to reproduce it.
>
> To debug isearch, you can instrument one of the top isearch functions
> (e.g. `isearch-repeat-forward'), open the isearch.el file in another
> frame/buffer (another frame is more preferable when debugging display
> problems like in your case), and start typing C-s in the original
> buffer.  When it stops on an uninteresting place, just type `g' to
> continue execution.  Use `i' to go to a deeper function.
>
> The hardest part in debugging isearch is not forget not to use isearch
> to navigate in the source buffer while edebug is active (e.g. to find
> the next function to instrument, etc :)
>
> Using this technique, it is possible to find that your trouble is cased
> by the following part of `isearch-update':
>
> 	  ;; Keep same hscrolling as at the start of the search when possible
> 	  (let ((current-scroll (window-hscroll)))
> 	    (set-window-hscroll (selected-window) isearch-start-hscroll)
> 	    (unless (pos-visible-in-window-p)
> 	      (set-window-hscroll (selected-window) current-scroll)))
>
> Removing this part eliminates the bug you reported.  Unfortunately,
> I have no idea how to fix this since this depends on the details
> how the display engine works.

I'd like to return to this.  Assuming a fix at the display level is too
difficult or laborious, I wonder whether the above code really does what
the comment says.  In fact, I'm not sure what the comment is intending
to achieve.  I tested the code by starting isearch with different
horizontal scrolling positions set, both with and without the above
code, and saw no difference in behavior or resulting hscroll position.
What difference is expected and what do you have to do to see it?
Moreover, unless I misunderstand the manual, it looks like the above
will always leave the hscroll position at (window-hscroll) (which is
what my tests resulted in):

(elisp) Window Start:

     The `pos-visible-in-window-p' function considers only vertical
     scrolling.  If POSITION is out of view only because WINDOW has
     been scrolled horizontally, `pos-visible-in-window-p' returns
     non-`nil' anyway.

Is it possible for (pos-visible-in-window-p) to return nil after an
isearch?

The above code was added by this change:

2001-12-15  Richard M. Stallman  <rms@gnu.org>

	* isearch.el (isearch-start-hscroll): New variable.
	(isearch-mode): Set isearch-start-hscroll.
	(isearch-update): Restore original hscrolling if possible.

I searched the emacs-devel, bug, and help archives prior to this change
but found no relevant posts.  If the above code either doesn't do what
it was intended for, or if it doesn't make a difference in current
Emacs, could it be eliminated?  That would at least work around the
still existing problem raised by my OP.  Or if the code is still needed,
can someone explain it to me and provide a concrete example where it
DTRT?

Steve Berman





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: isearch, auto-composition-mode and display properties
  2008-05-30  8:49       ` Stephen Berman
@ 2008-05-30 14:17         ` Stephen Berman
  0 siblings, 0 replies; 6+ messages in thread
From: Stephen Berman @ 2008-05-30 14:17 UTC (permalink / raw)
  To: emacs-devel

On Fri, 30 May 2008 10:49:10 +0200 Stephen Berman <Stephen.Berman@gmx.net> wrote:

> On Sun, 24 Feb 2008 21:09:07 +0200 Juri Linkov <juri@jurta.org> wrote:
>
>>> I hope others can reproduce this problem and someone can figure out
>>> what's going on.
>>
>> Thank you for the detailed test case.  I was able to reproduce it.
>>
>> To debug isearch, you can instrument one of the top isearch functions
>> (e.g. `isearch-repeat-forward'), open the isearch.el file in another
>> frame/buffer (another frame is more preferable when debugging display
>> problems like in your case), and start typing C-s in the original
>> buffer.  When it stops on an uninteresting place, just type `g' to
>> continue execution.  Use `i' to go to a deeper function.
>>
>> The hardest part in debugging isearch is not forget not to use isearch
>> to navigate in the source buffer while edebug is active (e.g. to find
>> the next function to instrument, etc :)
>>
>> Using this technique, it is possible to find that your trouble is cased
>> by the following part of `isearch-update':
>>
>> 	  ;; Keep same hscrolling as at the start of the search when possible
>> 	  (let ((current-scroll (window-hscroll)))
>> 	    (set-window-hscroll (selected-window) isearch-start-hscroll)
>> 	    (unless (pos-visible-in-window-p)
>> 	      (set-window-hscroll (selected-window) current-scroll)))
>>
>> Removing this part eliminates the bug you reported.  Unfortunately,
>> I have no idea how to fix this since this depends on the details
>> how the display engine works.
>
> I'd like to return to this.  Assuming a fix at the display level is too
> difficult or laborious, I wonder whether the above code really does what
> the comment says.  In fact, I'm not sure what the comment is intending
> to achieve.  I tested the code by starting isearch with different
> horizontal scrolling positions set, both with and without the above
> code, and saw no difference in behavior or resulting hscroll position.
> What difference is expected and what do you have to do to see it?
> Moreover, unless I misunderstand the manual, it looks like the above
> will always leave the hscroll position at (window-hscroll) (which is
> what my tests resulted in):
>
> (elisp) Window Start:
>
>      The `pos-visible-in-window-p' function considers only vertical
>      scrolling.  If POSITION is out of view only because WINDOW has
>      been scrolled horizontally, `pos-visible-in-window-p' returns
>      non-`nil' anyway.
>
> Is it possible for (pos-visible-in-window-p) to return nil after an
> isearch?

Sorry, much of what I wrote above is gibberish, due to insufficient
testing and not paying enough attention.  As should have been clear to
me, (pos-visible-in-window-p) returns nil during isearch precisely when
the next occurrence of the search term is below (window-end) (d'oh!).
And it is exactly at this point in the code that the problem I reported
arises (but it doesn't happen every time p-v-i-w-p returns nil; I'll try
to use gdb to find out more).  If the unless-sexp is eliminated, isearch
works as expected in the configuration given in my OP.

What still confuses me, however, is whether the unless-clause has a
noticeable effect.  When isearch-mode is invoked, isearch-start-hscroll
gets the current hscroll position, as returned by (window-hscroll).
IIUC, if, in the course of the isearch, the hscroll position changes,
the above code resets it to the initial value isearch-start-hscroll,
unless the next search term occurrence is beyond the visible window, in
which case the hscroll position becomes the new return value of
(window-hscroll).  I tried to test for this, but I could see no
difference: whether or not the next occurrence is in the visible window,
and whether or not the unless-sexp (or indeed the entire let-sexp) is
present, the window scrolls as required by isearch, and stays in the
current hscroll position upon exiting isearch, or returns to the initial
hscroll position upon cancelling isearch.  Can anyone else confirm this,
or have I again made a mistake in my tests or misunderstood the code?
And again, if I haven't made a mistake and the unless-sexp (or the
entire let-sexp) has no effect, can it be removed?

Steve Berman





^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-05-30 14:17 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-02-21 16:12 auto-composition-mode and display properties Stephen Berman
2008-02-21 16:23 ` Stefan Monnier
2008-02-23 22:24   ` isearch, " Stephen Berman
2008-02-24 19:09     ` Juri Linkov
2008-05-30  8:49       ` Stephen Berman
2008-05-30 14:17         ` Stephen Berman

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.