(get_next_display_element): Use `escape-glyph' for
control chars and escaped octal codes. (Qescape_glyph): New variable. (syms_of_xdisp): Initialize it. (escape_glyph_face): New variable. (redisplay_window): Initialize it.
This commit is contained in:
parent
c14a736ec0
commit
303747453b
1 changed files with 34 additions and 6 deletions
40
src/xdisp.c
40
src/xdisp.c
|
@ -342,6 +342,11 @@ Lisp_Object Vvoid_text_area_pointer;
|
|||
|
||||
Lisp_Object Qtrailing_whitespace;
|
||||
|
||||
/* Name and number of the face used to highlight escape glyphs. */
|
||||
|
||||
Lisp_Object Qescape_glyph;
|
||||
int escape_glyph_face;
|
||||
|
||||
/* The symbol `image' which is the car of the lists used to represent
|
||||
images in Lisp. */
|
||||
|
||||
|
@ -4922,6 +4927,21 @@ get_next_display_element (it)
|
|||
display. Then, set IT->dpvec to these glyphs. */
|
||||
GLYPH g;
|
||||
int ctl_len;
|
||||
int face_id = escape_glyph_face;
|
||||
|
||||
/* Find the face id if `escape-glyph' unless we recently did. */
|
||||
if (face_id < 0)
|
||||
{
|
||||
Lisp_Object tem = Fget (Qescape_glyph, Qface);
|
||||
if (INTEGERP (tem))
|
||||
face_id = XINT (tem);
|
||||
else
|
||||
face_id = 0;
|
||||
/* If there's overflow, use 0 instead. */
|
||||
if (FAST_GLYPH_FACE (FAST_MAKE_GLYPH (0, face_id)) != face_id)
|
||||
face_id = 0;
|
||||
escape_glyph_face = face_id;
|
||||
}
|
||||
|
||||
if (it->c < 128 && it->ctl_arrow_p)
|
||||
{
|
||||
|
@ -4931,10 +4951,10 @@ get_next_display_element (it)
|
|||
&& GLYPH_CHAR_VALID_P (XINT (DISP_CTRL_GLYPH (it->dp))))
|
||||
g = XINT (DISP_CTRL_GLYPH (it->dp));
|
||||
else
|
||||
g = FAST_MAKE_GLYPH ('^', 0);
|
||||
g = FAST_MAKE_GLYPH ('^', face_id);
|
||||
XSETINT (it->ctl_chars[0], g);
|
||||
|
||||
g = FAST_MAKE_GLYPH (it->c ^ 0100, 0);
|
||||
g = FAST_MAKE_GLYPH (it->c ^ 0100, face_id);
|
||||
XSETINT (it->ctl_chars[1], g);
|
||||
ctl_len = 2;
|
||||
}
|
||||
|
@ -4951,7 +4971,7 @@ get_next_display_element (it)
|
|||
&& GLYPH_CHAR_VALID_P (XFASTINT (DISP_ESCAPE_GLYPH (it->dp))))
|
||||
escape_glyph = XFASTINT (DISP_ESCAPE_GLYPH (it->dp));
|
||||
else
|
||||
escape_glyph = FAST_MAKE_GLYPH ('\\', 0);
|
||||
escape_glyph = FAST_MAKE_GLYPH ('\\', face_id);
|
||||
|
||||
if (SINGLE_BYTE_CHAR_P (it->c))
|
||||
str[0] = it->c, len = 1;
|
||||
|
@ -4978,11 +4998,14 @@ get_next_display_element (it)
|
|||
XSETINT (it->ctl_chars[i * 4], escape_glyph);
|
||||
/* Insert three more glyphs into IT->ctl_chars for
|
||||
the octal display of the character. */
|
||||
g = FAST_MAKE_GLYPH (((str[i] >> 6) & 7) + '0', 0);
|
||||
g = FAST_MAKE_GLYPH (((str[i] >> 6) & 7) + '0',
|
||||
face_id);
|
||||
XSETINT (it->ctl_chars[i * 4 + 1], g);
|
||||
g = FAST_MAKE_GLYPH (((str[i] >> 3) & 7) + '0', 0);
|
||||
g = FAST_MAKE_GLYPH (((str[i] >> 3) & 7) + '0',
|
||||
face_id);
|
||||
XSETINT (it->ctl_chars[i * 4 + 2], g);
|
||||
g = FAST_MAKE_GLYPH ((str[i] & 7) + '0', 0);
|
||||
g = FAST_MAKE_GLYPH ((str[i] & 7) + '0',
|
||||
face_id);
|
||||
XSETINT (it->ctl_chars[i * 4 + 3], g);
|
||||
}
|
||||
ctl_len = len * 4;
|
||||
|
@ -11578,6 +11601,9 @@ redisplay_window (window, just_this_one_p)
|
|||
*w->desired_matrix->method = 0;
|
||||
#endif
|
||||
|
||||
/* Force this to be looked up again for each redisp of each window. */
|
||||
escape_glyph_face = -1;
|
||||
|
||||
specbind (Qinhibit_point_motion_hooks, Qt);
|
||||
|
||||
reconsider_clip_changes (w, buffer);
|
||||
|
@ -22145,6 +22171,8 @@ syms_of_xdisp ()
|
|||
staticpro (&Qfontification_functions);
|
||||
Qtrailing_whitespace = intern ("trailing-whitespace");
|
||||
staticpro (&Qtrailing_whitespace);
|
||||
Qescape_glyph = intern ("escape-glyph");
|
||||
staticpro (&Qescape_glyph);
|
||||
Qimage = intern ("image");
|
||||
staticpro (&Qimage);
|
||||
QCmap = intern (":map");
|
||||
|
|
Loading…
Add table
Reference in a new issue