emacs-devel
[Top][All Lists]
Advanced

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

Re: Problems with move_it_in_display_line_to X when tabs exist.


From: Eli Zaretskii
Subject: Re: Problems with move_it_in_display_line_to X when tabs exist.
Date: Sun, 03 Dec 2017 16:29:57 +0200

> Date:  Sat, 02 Dec 2017 19:38:51 -0800
> From:  Keith David Bershatsky <address@hidden>
> Cc:  address@hidden
> 
> The five faces were set up with the built-in defface macro.  I set the 
> buffer-display-table with setq and the following variable:
> 
> (defvar +-buffer-display-table
>   (let* (
>       (display-table (make-display-table))
>       (ff-char
>         (cond
>           ((eq system-type 'darwin)
>             ?\U0001D4D5)
>           ((eq system-type 'windows-nt)
>             ?\u0046)))
>       (glyph-form-feed (make-glyph-code ff-char '+-form-feed-face))
>       (glyph-pilcrow (make-glyph-code ?\u00B6 '+-newline-face))
>       (glyph-space (make-glyph-code ?\u00B7 '+-space-face))
>       (glyph-tab (make-glyph-code ?\u00BB '+-tab-face))
>       (glyph-tab-spacer (make-glyph-code ?\t '+-tab-spacer-face)))
>     (aset display-table ?\n `[,glyph-pilcrow ?\n])
>     (aset display-table ?\f `[,glyph-form-feed])
>     (aset display-table ?\t `[,glyph-tab ,glyph-tab-spacer])
>     (aset display-table ?\s `[,glyph-space])
>     display-table)
>   "The `buffer-display-table' that is used when `+-mode' is active.")

I cannot reproduce your problem with the latest emacs-26 branch.

The above snippet leaves a lot undefined, so I simulated that as
follows:

  (setq buffer-display-table (make-display-table))
  (aset buffer-display-table
        ?\t
        (vector (make-glyph-code ?\u00BB 'font-lock-warning-face)
                (make-glyph-code ?\t 'fringe)))
  (setq word-wrap t)
  (set tab-width 2)

Then I inserted a long line as you described, arranging for its second
screen line to start with "xxx" followed by a TAB.

Then I emulated your calls to move_it_in_display_line_to by setting
visual-order-cursor-movement to t, putting the cursor on the 0xBB
character which depicts the TAB, and typing "M-x right-char RET".
If I set a breakpoint in xdisp.c:22746, which is here:

      else if (it.current_x != target_x)
        move_it_in_display_line_to (&it, ZV, target_x, MOVE_TO_POS | MOVE_TO_X);

I see that this call returns with it.current on the stretch glyph
following the 0xBB character, and with it.pixel_width set correctly to
the width of the stretch glyph.

So I think either you call move_it_in_display_line_to in some way that
is different from the above, or there's something else you didn't tell
in your recipe.



reply via email to

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