Skip to content

Instantly share code, notes, and snippets.

@jstaursky
Created May 3, 2021 12:03
Show Gist options
  • Save jstaursky/375d5b158507c649121b7a1470066e13 to your computer and use it in GitHub Desktop.
Save jstaursky/375d5b158507c649121b7a1470066e13 to your computer and use it in GitHub Desktop.
emacs line centering
From 60532f6087d0f3cc20197da1790d2f5cec0ecbee Mon Sep 17 00:00:00 2001
From: Jesse Nazario <address@hidden>
Date: Sat, 31 Aug 2019 15:35:34 -0300
Subject: [PATCH] Center lines vertically with line-spacing-vertical-center
When using line-spacing, the new variable line-spacing-vertical-center
can be set to non-nil to center the line content vertically.
---
src/buffer.c | 13 +++++++++++++
src/buffer.h | 4 ++++
src/xdisp.c | 8 +++++++-
3 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/src/buffer.c b/src/buffer.c
index 62a3d66c8b..1b9f96d61b 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -219,6 +219,11 @@ bset_extra_line_spacing (struct buffer *b, Lisp_Object val)
b->extra_line_spacing_ = val;
}
static void
+bset_line_spacing_vertical_center (struct buffer *b, Lisp_Object val)
+{
+ b->line_spacing_vertical_center_ = val;
+}
+static void
bset_file_format (struct buffer *b, Lisp_Object val)
{
b->file_format_ = val;
@@ -956,6 +961,7 @@ reset_buffer (register struct buffer *b)
(b, BVAR (&buffer_defaults, enable_multibyte_characters));
bset_cursor_type (b, BVAR (&buffer_defaults, cursor_type));
bset_extra_line_spacing (b, BVAR (&buffer_defaults, extra_line_spacing));
+ bset_line_spacing_vertical_center (b, BVAR (&buffer_defaults, line_spacing_vertical_center));
b->display_error_modiff = 0;
}
@@ -5190,6 +5196,7 @@ init_buffer_once (void)
XSETFASTINT (BVAR (&buffer_local_flags, header_line_format), idx); ++idx;
XSETFASTINT (BVAR (&buffer_local_flags, cursor_type), idx); ++idx;
XSETFASTINT (BVAR (&buffer_local_flags, extra_line_spacing), idx); ++idx;
+ XSETFASTINT (BVAR (&buffer_local_flags, line_spacing_vertical_center), idx); ++idx;
XSETFASTINT (BVAR (&buffer_local_flags, cursor_in_non_selected_windows), idx); ++idx;
/* buffer_local_flags contains no pointers, so it's safe to treat it
@@ -5259,6 +5266,7 @@ init_buffer_once (void)
bset_bidi_paragraph_separate_re (&buffer_defaults, Qnil);
bset_cursor_type (&buffer_defaults, Qt);
bset_extra_line_spacing (&buffer_defaults, Qnil);
+ bset_line_spacing_vertical_center (&buffer_defaults, Qnil);
bset_cursor_in_non_selected_windows (&buffer_defaults, Qt);
bset_enable_multibyte_characters (&buffer_defaults, Qt);
@@ -6248,6 +6256,11 @@ from (abs POSITION). If POSITION is positive, point was at the front
If value is a floating point number, it specifies the spacing relative
to the default frame line height. A value of nil means add no extra space. */);
+ DEFVAR_PER_BUFFER ("line-spacing-vertical-center",
+ &BVAR (current_buffer, line_spacing_vertical_center), Qnil,
+ doc: /* Non-nil will center the line content vertically
+when using `line-spacing' variable. */);
+
DEFVAR_PER_BUFFER ("cursor-in-non-selected-windows",
&BVAR (current_buffer, cursor_in_non_selected_windows), Qnil,
doc: /* Non-nil means show a cursor in non-selected windows.
diff --git a/src/buffer.h b/src/buffer.h
index 2080a6f40b..48cf06d06f 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -740,6 +740,10 @@ #define BVAR(buf, field) ((buf)->field ## _)
in the display of this buffer. */
Lisp_Object extra_line_spacing_;
+ /* When non-nil will center the line content vertically. To be used
+ along with `line-spacing'. */
+ Lisp_Object line_spacing_vertical_center_;
+
/* Cursor type to display in non-selected windows.
t means to use hollow box cursor.
See `cursor-type' for other values. */
diff --git a/src/xdisp.c b/src/xdisp.c
index 75bc536cb9..0ddabe6e09 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -29294,7 +29294,13 @@ gui_produce_glyphs (struct it *it)
if (extra_line_spacing > 0)
{
- it->descent += extra_line_spacing;
+ if (! BVAR (XBUFFER (it->w->contents), line_spacing_vertical_center)) {
+ it->descent += extra_line_spacing;
+ } else {
+ int spacing = extra_line_spacing / 2;
+ it->ascent += spacing;
+ it->descent += spacing;
+ }
if (extra_line_spacing > it->max_extra_line_spacing)
it->max_extra_line_spacing = extra_line_spacing;
}
--
2.23.0
@jstaursky
Copy link
Author

jstaursky commented May 3, 2021

putting here for future reference since gnu seems in no rush to add this (for w/e reason).

To use:

  1. curl -L https://gist.githubusercontent.com/jstaursky/375d5b158507c649121b7a1470066e13/raw/0b7624781aa005d2f58c1930cb5ec339efd71f9a/line-centering.patch > <emacs src directory>
  2. patch -ruN -d `pwd` < line-centering.patch

@jstaursky
Copy link
Author

jstaursky commented May 3, 2021

BTW credit to https://lists.gnu.org/archive/html/emacs-devel/2019-08/msg00659.html

adds the variable line-spacing-vertical-center

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment