From: Ergus <spacibba@aol.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: Fill column indicator functionality
Date: Wed, 13 Mar 2019 21:02:25 +0100 [thread overview]
Message-ID: <20190313200225.dpqrw7xthkj47fqw@Ergus> (raw)
In-Reply-To: <83imwm3fxf.fsf@gnu.org>
Hi Eli:
On Wed, Mar 13, 2019 at 06:19:40PM +0200, Eli Zaretskii wrote:
>> Date: Tue, 12 Mar 2019 20:20:17 +0100
>> From: Ergus <spacibba@aol.com>
>> Cc: emacs-devel@gnu.org
>>
>> Please tell me any problem you see related or not with my questions to
>> fix them too.
>
>Thanks, see below.
>
>> >> I tried:
>> >> if (!row->reversed_p)
>> >> {
>> >> while (glyph >= start
>> >> && (glyph->type == CHAR_GLYPH
>> >> || glyph->type == STRETCH_GLYPH)
>> >> && NILP (glyph->object))
>> >> --glyph;
>> >> }
>> >>
>> >> But it didn't work. The behavior is the same: the whitespace is
>> >> highlighted only when the line is crossed.
>> >
>> >I guess at this point I'd need to see the code to help you more.
>
>The problem here is that the above loop also looks at the object from
>which the glyph came, and will only skip glyphs whose object is nil.
>But in your code, you didn't set up the object of the '|' character,
>which comes from it->object, to be nil, you left it at its previous
>value, which usually will be either a buffer or a string, depending
>from where the last character of the text line came.
>
>To fix this, add this:
>
> Lisp_Object save_object = it->object;
> it->object = Qnil;
>
>before the call to PRODUCE_GLYPHS, and then restore it->object to its
>previous value after PRODUCE_GLYPHS.
>
I thought that append_stretch_glyph was putting the it->object to Now I
see it didn't.
>In the TTY case, this was already done for you by the code which
>extends the face, that's why it worked on TTY frames.
>
>> >> The other corner case I have is because in graphical mode the space for
>> >> the dot is always reserved, so when the last character in the line is
>> >> just before the line, the line is not drawn for that line.
>> >
>> >Sorry, I don't understand: what is "the dot" in this context, and what
>> >do you mean by "just before the line"? There are too many "lines" in
>> >this sentence, so I'm confused.
>
>I guess you mean that when the place for the cursor is at fill-column,
>the indicator is not visible? I think to fix this, you will need to
>modify the code in the function append_space_for_newline, which is
>responsible for adding the space glyph for displaying the cursor at
>the end of the line. That function currently adds a ' ' space
>character there; you want to replace that with the indicator character
>'|', when this mode is in effect.
>
Yes I was referring to cursor as point. My bad.
>A few more comments regarding the code:
>
>> + if (!NILP (Vdisplay_fill_column_indicator))
>> + {
>> + const int fill_column_indicator_column =
>> + XFIXNAT (Vdisplay_fill_column_indicator_column) - 1;
>
>Why "- 1"? It's confusing, and should at least be explained in a
>comment, if not changed to not subtract 1.
>
The -1 is related with the extra ' ' added by the extend_face function,
I will try to avoid it, in the final patch, but now this is just a prove
of concept.
>Also, it is unsafe to call XFIXNAT without verifying the value is a
>fixnum, because if it isn't, Emacs will crash.
>
>> + const int column_x = it->pixel_width * fill_column_indicator_column
>> + + it->lnum_pixel_width;
>
Ok, I'll prevent this.
>Using it->pixel_width here will not work in general, as this is just
>the pixel width of the last character or image of the screen line. I
>think you should use the font->average_width, and if that is zero,
>then font->space_width. Here 'font' is the default face's font. This
>is because I believe we want to display the indicator at the X
>coordinate that corresponds to fill-column in units of the default
>font width, right? I mean, did you try to see what happens when the
>text has faces which make some of the characters appear smaller or
>larger than the default face?
>
>> + struct font *font = face->font ? face->font : FRAME_FONT (f);
>
You just saved me a lot of time of reading the font and face structs
definitions (I will but not now).
>I think this uses the wrong face: you should be using default_face
>instead. The above is the face of the last character of the line.
>
>> + it->char_to_display = '|';
>
>This character should be customizable. Perhaps make
>display-fill-column-indicator serve double duty: if non-nil, it should
>be the character to use as the indicator.
>
It is customizable actually in my current version, I just sent you the
basic changes to make it work that exposed the issues with minimal code
changes. In fact the default value will be ?\u2402 (and not ?| as in the
example) if the font supports it because it will look like a contiguous
line.
>> + it->face_id = merge_faces (it->w, Qline_number, 0, DEFAULT_FACE_ID);
>
>You didn't really mean to use the line-number face here, did you?
>This should probably be a separate distinct face.
>
Yes, I did, this was a prove of concept. I created a fill_column face.
>> + DEFVAR_LISP ("display-fill-column-indicator", Vdisplay_fill_column_indicator,
>> + doc: /* Non-nil means display the fill column indicator line. */);
>
>The "line" part of the doc string doesn't belong there, I think. Just
>"indicator" is enough.
>
>> + DEFVAR_LISP ("display-fill-column-indicator-column", Vdisplay_fill_column_indicator_column,
>> + doc: /* Column where to draw the column indicator line when display-column-indicator
>> +is non-nil . */);
>
>The first line of a doc string should be a complete sentence, and it
>should fit the 80column display line. In this case, I'd shorten it
>like this:
>
> Column to draw the indicator when `display-fill-column-indicator' is non-nil.
>
>Please also say in the doc string what are the possible values and in
>what column units they are measured.
>
Ok, perfect
>Thanks for working on this.
1E6 Thanks.
Ergus
next prev parent reply other threads:[~2019-03-13 20:02 UTC|newest]
Thread overview: 196+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-05 10:53 Fill column indicator functionality Ergus
2019-02-05 16:41 ` Eli Zaretskii
2019-02-05 18:47 ` Ergus
2019-02-05 19:56 ` Drew Adams
2019-02-05 23:32 ` Ergus
2019-02-06 16:08 ` Eli Zaretskii
2019-02-06 20:48 ` John Yates
2019-02-06 22:25 ` Ergus
2019-02-07 1:41 ` Basil L. Contovounesios
2019-02-07 14:31 ` Eli Zaretskii
2019-02-10 22:04 ` Ergus
2019-02-11 15:55 ` Eli Zaretskii
2019-02-11 16:56 ` Jimmy Aguilar Mena
2019-02-11 17:13 ` Eli Zaretskii
2019-03-08 18:57 ` Ergus
2019-03-08 20:06 ` Eli Zaretskii
2019-03-09 13:22 ` Ergus
2019-03-09 14:10 ` Eli Zaretskii
2019-03-11 10:48 ` Ergus
2019-03-11 15:30 ` Eli Zaretskii
2019-03-11 19:58 ` Andy Moreton
2019-03-11 20:24 ` Eli Zaretskii
2019-03-12 15:29 ` Ergus
2019-03-12 16:19 ` Eli Zaretskii
2019-03-12 19:20 ` Ergus
2019-03-13 16:19 ` Eli Zaretskii
2019-03-13 20:02 ` Ergus [this message]
2019-03-13 20:09 ` Eli Zaretskii
2019-03-14 3:02 ` Ergus
2019-03-14 6:40 ` Eli Zaretskii
2019-03-14 16:51 ` Ergus
2019-03-14 17:59 ` Andreas Schwab
2019-03-14 18:22 ` Eli Zaretskii
[not found] ` <20190314211313.giyz7p6jtmquabea@Ergus>
[not found] ` <83bm2c1smi.fsf@gnu.org>
2019-03-15 20:56 ` Ergus
2019-03-15 22:52 ` Óscar Fuentes
2019-03-15 23:22 ` Ergus
2019-03-15 23:47 ` Óscar Fuentes
2019-03-16 6:50 ` Ergus
2019-03-16 7:48 ` Eli Zaretskii
2019-03-16 7:42 ` Eli Zaretskii
2019-03-16 12:26 ` Eli Zaretskii
2019-03-17 17:28 ` Alp Aker
2019-03-17 18:03 ` Ergus
2019-03-17 18:40 ` Eli Zaretskii
2019-03-16 9:36 ` Ergus
2019-03-16 10:18 ` Question about documented functions Ergus
2019-03-16 12:21 ` Eli Zaretskii
2019-03-16 13:53 ` Ergus
2019-03-16 14:05 ` Eli Zaretskii
2019-03-16 12:40 ` Fill column indicator functionality Eli Zaretskii
2019-03-14 21:28 ` Óscar Fuentes
2019-03-14 23:54 ` Ergus
2019-03-14 18:58 ` Clément Pit-Claudel
2019-03-15 7:30 ` Eli Zaretskii
2019-03-15 12:44 ` Clément Pit-Claudel
2019-03-15 14:07 ` Óscar Fuentes
2019-03-15 14:54 ` Clément Pit-Claudel
2019-03-15 15:15 ` Óscar Fuentes
2019-03-15 15:30 ` Clément Pit-Claudel
2019-03-15 14:12 ` Eli Zaretskii
2019-03-15 14:35 ` Clément Pit-Claudel
2019-03-15 16:13 ` Eli Zaretskii
2019-03-15 18:26 ` Clément Pit-Claudel
2019-03-15 19:14 ` Eli Zaretskii
2019-03-15 15:13 ` Stefan Monnier
2019-03-15 13:00 ` Alp Aker
2019-03-15 13:30 ` Mattias Engdegård
2019-03-15 14:24 ` Eli Zaretskii
2019-03-15 15:05 ` Mattias Engdegård
2019-03-15 15:54 ` Eli Zaretskii
2019-03-15 15:09 ` Stefan Monnier
2019-03-15 15:56 ` Eli Zaretskii
2019-03-15 13:54 ` Eli Zaretskii
2019-03-15 14:19 ` Alp Aker
2019-03-15 14:58 ` Clément Pit-Claudel
2019-03-16 15:07 ` Johan Bockgård
2019-03-16 15:22 ` Clément Pit-Claudel
2019-03-15 15:43 ` Eli Zaretskii
2019-03-15 17:24 ` Óscar Fuentes
2019-03-15 18:28 ` Clément Pit-Claudel
2019-03-15 14:35 ` Alp Aker
2019-03-09 18:02 ` John Yates
2019-03-09 18:23 ` Eli Zaretskii
-- strict thread matches above, loose matches on Subject: below --
2019-03-15 16:59 Drew Adams
2019-03-15 18:21 ` Eli Zaretskii
2019-03-15 19:18 ` Drew Adams
2019-03-15 19:30 ` Eli Zaretskii
2019-03-15 19:51 ` Ergus
2019-03-18 1:03 Ergus
2019-03-18 3:35 ` Eli Zaretskii
2019-03-18 11:42 ` Ergus
2019-03-18 17:10 ` Eli Zaretskii
2019-04-02 12:42 ` Ergus
2019-04-02 13:03 ` Óscar Fuentes
2019-04-02 13:25 ` Óscar Fuentes
2019-04-02 13:37 ` Ergus
2019-04-02 15:07 ` Eli Zaretskii
2019-04-02 15:35 ` Ergus
2019-04-02 15:44 ` Eli Zaretskii
2019-04-02 16:36 ` Ergus
2019-04-02 16:48 ` Eli Zaretskii
2019-04-02 17:00 ` Ergus
2019-04-02 17:26 ` Eli Zaretskii
2019-04-02 17:48 ` Ergus
2019-04-02 18:28 ` Eli Zaretskii
2019-04-02 21:22 ` Ergus
2019-04-03 5:20 ` Eli Zaretskii
2019-04-03 10:22 ` Ergus
2019-04-03 11:11 ` Eli Zaretskii
2019-04-05 9:10 ` Robert Pluim
2019-04-05 10:36 ` Ergus
2019-04-05 11:47 ` Eli Zaretskii
2019-04-05 12:13 ` Robert Pluim
2019-04-05 12:46 ` Eli Zaretskii
2019-04-05 14:09 ` Robert Pluim
2019-04-05 14:13 ` Eli Zaretskii
2019-04-05 14:38 ` Eli Zaretskii
2019-04-05 15:04 ` Ergus
2019-04-05 15:17 ` Eli Zaretskii
2019-04-05 17:30 ` Ergus
2019-04-05 19:05 ` Eli Zaretskii
2019-04-05 20:03 ` Ergus
2019-04-05 21:10 ` Óscar Fuentes
2019-04-05 22:01 ` Ergus
2019-04-05 22:20 ` Óscar Fuentes
2019-04-06 6:49 ` Eli Zaretskii
2019-04-06 11:06 ` Ergus
2019-04-06 12:53 ` Eli Zaretskii
2019-04-06 6:51 ` Eli Zaretskii
2019-04-06 13:21 ` Eli Zaretskii
2019-04-06 15:20 ` Ergus
2019-04-06 16:00 ` Eli Zaretskii
2019-04-06 18:59 ` Ergus
2019-04-06 19:07 ` Eli Zaretskii
2019-04-06 19:51 ` Ergus
2019-04-07 18:19 ` Ergus
2019-04-07 18:31 ` Eli Zaretskii
2019-04-07 18:35 ` Ergus
2019-04-07 18:38 ` Ergus
2019-04-07 19:02 ` Eli Zaretskii
2019-04-07 20:05 ` Ergus
2019-04-08 2:27 ` Eli Zaretskii
2019-04-08 8:51 ` Ergus
2019-04-08 14:57 ` Eli Zaretskii
2019-04-08 16:04 ` Ergus
2019-04-12 13:46 ` Ergus
2019-04-12 13:54 ` Eli Zaretskii
2019-05-01 11:08 ` Ergus
2019-05-03 13:19 ` Eli Zaretskii
2019-05-03 14:14 ` Basil L. Contovounesios
2019-05-03 15:10 ` Eli Zaretskii
2019-05-03 15:25 ` Basil L. Contovounesios
2019-05-03 16:21 ` Eli Zaretskii
2019-05-03 16:18 ` Ergus
2019-05-03 17:49 ` Ergus
2019-05-03 18:32 ` Eli Zaretskii
2019-05-03 18:39 ` Eli Zaretskii
2019-05-03 21:05 ` Ergus
2019-05-04 6:54 ` Eli Zaretskii
2019-05-04 9:37 ` Ergus
2019-05-04 11:04 ` Eli Zaretskii
2019-05-04 11:29 ` Óscar Fuentes
2019-05-04 15:44 ` Alp Aker
2019-05-04 15:59 ` Eli Zaretskii
2019-05-04 16:32 ` Eli Zaretskii
2019-05-04 16:32 ` Alp Aker
2019-05-04 16:36 ` Eli Zaretskii
2019-05-04 16:38 ` Alp Aker
2019-05-04 16:42 ` Eli Zaretskii
2019-05-05 14:40 ` Ergus
2019-05-04 16:42 ` Ergus
2019-05-03 14:34 ` Basil L. Contovounesios
2019-05-03 15:31 ` Alp Aker
2019-04-07 20:51 ` Ergus
2019-04-07 21:23 ` Stefan Monnier
2019-04-07 21:37 ` Ergus
2019-04-07 21:39 ` Stefan Monnier
2019-04-05 13:06 ` Eli Zaretskii
2019-04-05 15:28 ` Eli Zaretskii
2019-04-05 18:11 ` Ergus
2019-04-05 19:03 ` Eli Zaretskii
2019-04-05 21:15 ` Ergus
2019-04-06 10:13 ` Robert Pluim
2019-04-06 12:54 ` Eli Zaretskii
2019-04-05 11:44 ` Eli Zaretskii
2019-04-05 12:09 ` Robert Pluim
2019-04-05 12:44 ` Eli Zaretskii
2019-04-05 13:21 ` Eli Zaretskii
2019-04-05 13:47 ` Robert Pluim
2019-04-05 14:08 ` Robert Pluim
2019-04-03 12:13 ` Stefan Monnier
2019-04-02 23:11 ` Dmitry Gutov
2019-04-02 17:01 ` Robert Pluim
2019-04-02 17:26 ` Ergus
2019-04-02 17:50 ` Robert Pluim
2019-05-04 22:51 Keith David Bershatsky
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190313200225.dpqrw7xthkj47fqw@Ergus \
--to=spacibba@aol.com \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
/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 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.