From 491e145f96aa0278d0a4cf0dc4c1e75550f67d25 Mon Sep 17 00:00:00 2001 From: Jimmy Aguilar Mena Date: Fri, 5 Apr 2019 12:37:59 +0200 Subject: [PATCH] display-fill-column-indicator interface corrections *lisp/display-fill-column-indicator.el: Fixed character selection for the indicator based in the current faces. Extended condition to set display-fill-column-indicator-character in graphical displays. *src/xdisp.c: Fixed some long lines. --- lisp/cus-start.el | 5 +++ lisp/display-fill-column-indicator.el | 18 ++++---- src/xdisp.c | 62 ++++++++++++++++----------- 3 files changed, 51 insertions(+), 34 deletions(-) diff --git a/lisp/cus-start.el b/lisp/cus-start.el index 3f58eac63bc..b935776a2df 100644 --- a/lisp/cus-start.el +++ b/lisp/cus-start.el @@ -649,6 +649,11 @@ since it could result in memory overflow and make Emacs crash." :value nil)) "26.1") + (display-fill-column-indicator display-fill-column-indicator + (choice + (const :tag "Off (nil)" :value nil) + (const :tag "On (t)" :value t)) + "27.1") (display-fill-column-indicator-column display-fill-column-indicator integer "27.1") (display-fill-column-indicator-character display-fill-column-indicator diff --git a/lisp/display-fill-column-indicator.el b/lisp/display-fill-column-indicator.el index 7c1df531df1..f6b7352c21b 100644 --- a/lisp/display-fill-column-indicator.el +++ b/lisp/display-fill-column-indicator.el @@ -24,10 +24,9 @@ ;; Provides a minor mode interface for `display-fill-column-indicator'. ;; -;; Toggle display of line numbers with M-x -;; display-fill-column-indicator-mode. To enable line numbering in -;; all buffers, use M-x global-display-fill-column-indicator-mode. To -;; change the default line column +;; Toggle display of the column indicator with M-x +;; display-fill-column-indicator-mode. To enable the indicator in +;; all buffers, use M-x global-display-fill-column-indicator-mode. ;; NOTE: Customization variables for @@ -38,7 +37,7 @@ ;;; Code: (defgroup display-fill-column-indicator nil - "Display line numbers in the buffer." + "Display a fill column indicator in th buffer." :group 'convenience :group 'display) @@ -48,15 +47,18 @@ "Toggle display fill column indicator. This uses `display-fill-column-indicator' internally. -To change the position of the line displayed by default, +To change the position of the column displayed by default, customize `display-fill-column-indicator-column' you can change the -character for the line setting `display-fill-column-indicator-character'." +character for the indicator setting `display-fill-column-indicator-character'." :lighter nil (if display-fill-column-indicator-mode (progn (setq display-fill-column-indicator t) (unless display-fill-column-indicator-character - (if (char-displayable-p ?\u2502) + (if (and (char-displayable-p ?\u2502) + (or (not (display-graphic-p)) + (eq (aref (query-font (car (internal-char-font nil ?\u2502))) 0) + (face-font 'default)))) (setq display-fill-column-indicator-character ?\u2502) (setq display-fill-column-indicator-character ?|)))) (setq display-fill-column-indicator nil))) diff --git a/src/xdisp.c b/src/xdisp.c index 25ef98b49cf..31bb83c4181 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -20183,19 +20183,23 @@ append_space_for_newline (struct it *it, bool default_face_p) XFIXNAT (Vdisplay_fill_column_indicator_column); struct font *font = - default_face->font ? default_face->font : FRAME_FONT (it->f); + default_face->font ? + default_face->font : FRAME_FONT (it->f); const int char_width = - font->average_width ? font->average_width : font->space_width; + font->average_width ? + font->average_width : font->space_width; const int column_x = - char_width * fill_column_indicator_column + it->lnum_pixel_width; + char_width * fill_column_indicator_column + + it->lnum_pixel_width; if (it->current_x == column_x) { it->c = it->char_to_display = XFIXNAT (Vdisplay_fill_column_indicator_character); it->face_id = - merge_faces (it->w, Qfill_column_face, 0, DEFAULT_FACE_ID); + merge_faces (it->w, Qfill_column_face, + 0, DEFAULT_FACE_ID); face = FACE_FROM_ID(it->f, it->face_id); goto produce_glyphs; } @@ -20444,10 +20448,12 @@ extend_face_to_end_of_line (struct it *it) struct font *font = default_face->font ? default_face->font : FRAME_FONT (f); const int char_width = - font->average_width ? font->average_width : font->space_width; + font->average_width ? + font->average_width : font->space_width; - const int column_x = char_width * fill_column_indicator_column + - it->lnum_pixel_width; + const int column_x = + char_width * fill_column_indicator_column + + it->lnum_pixel_width; if ((it->current_x <= column_x) && (column_x <= it->last_visible_x)) @@ -20459,39 +20465,43 @@ extend_face_to_end_of_line (struct it *it) const bool saved_box_start = it->start_of_box_run_p; Lisp_Object save_object = it->object; - /* The stretch width needs to considet the latter added glyph */ - const int stretch_width = column_x - it->current_x - char_width; + /* The stretch width needs to considet the latter + added glyph */ + const int stretch_width = + column_x - it->current_x - char_width; memset (&it->position, 0, sizeof it->position); it->avoid_cursor_p = true; it->object = Qnil; - /* Only generate a stretch glysph if there is distance between - current_x and and the indicator position */ + /* Only generate a stretch glysph if there is distance + between current_x and and the indicator position */ if (stretch_width > 0) - { - int stretch_ascent = (((it->ascent + it->descent) - * FONT_BASE (font)) / FONT_HEIGHT (font)); - append_stretch_glyph (it, Qnil, stretch_width, - it->ascent + it->descent, stretch_ascent); - } - - /* Generate the glysph indicator only if append_space_for_newline - didn't already. */ + { + int stretch_ascent = (((it->ascent + it->descent) + * FONT_BASE (font)) / FONT_HEIGHT (font)); + append_stretch_glyph (it, Qnil, stretch_width, + it->ascent + it->descent, + stretch_ascent); + } + + /* Generate the glysph indicator only if + append_space_for_newline didn't already. */ if (it->current_x < column_x) { - it->char_to_display = + it->char_to_display = XFIXNAT (Vdisplay_fill_column_indicator_character); it->face_id = - merge_faces (it->w, Qfill_column_face, 0, DEFAULT_FACE_ID); + merge_faces (it->w, Qfill_column_face, + 0, DEFAULT_FACE_ID); PRODUCE_GLYPHS (it); } /* Restore the face after the indicator was generated */ it->face_id = saved_face_id; - /* If there is space after the indicator generate an extra - empty glysph to restore the face. */ + /* If there is space after the indicator generate an + extra empty glysph to restore the face. */ it->char_to_display = ' '; PRODUCE_GLYPHS (it); @@ -20630,8 +20640,8 @@ extend_face_to_end_of_line (struct it *it) { int fill_column_indicator_column = -1; - /* Vdisplay_fill_column_indicator_column accepts the special value t - to use the default fill-column variable. */ + /* Vdisplay_fill_column_indicator_column accepts the special + value t to use the default fill-column variable. */ if (EQ (Vdisplay_fill_column_indicator_column, Qt) && FIXNATP (BVAR (current_buffer, fill_column))) fill_column_indicator_column = -- 2.39.2