[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.
- Re: Problems with move_it_in_display_line_to X when tabs exist., Keith David Bershatsky, 2017/12/02
- Re: Problems with move_it_in_display_line_to X when tabs exist., Keith David Bershatsky, 2017/12/02
- Re: Problems with move_it_in_display_line_to X when tabs exist., Keith David Bershatsky, 2017/12/02
- Re: Problems with move_it_in_display_line_to X when tabs exist.,
Eli Zaretskii <=
- Re: Problems with move_it_in_display_line_to X when tabs exist., Keith David Bershatsky, 2017/12/03
- Re: Problems with move_it_in_display_line_to X when tabs exist., Keith David Bershatsky, 2017/12/03
- Re: Problems with move_it_in_display_line_to X when tabs exist., Keith David Bershatsky, 2017/12/04
- Re: Problems with move_it_in_display_line_to X when tabs exist., Keith David Bershatsky, 2017/12/06