diff options
author | Gregory Heytings <gregory@heytings.org> | 2022-11-26 14:09:41 +0000 |
---|---|---|
committer | Gregory Heytings <gregory@heytings.org> | 2022-11-26 15:10:17 +0100 |
commit | 558084c7f736bebcb3cffc2bf4f617158d92357f (patch) | |
tree | 5e05c5a457fe09073321b6b6543f1bbc00e766ed /src/xdisp.c | |
parent | 16b8b0d1e07d394e01f76d9eed6006219b4d745b (diff) | |
download | emacs-558084c7f736bebcb3cffc2bf4f617158d92357f.tar.gz |
Improve locked narrowing around low-level hooks.
* src/buffer.c (syms_of_buffer): Two new variables,
'long-line-locked-narrowing-region-size' and
'long-line-locked-narrowing-bol-search-limit', to make the locked
narrowing around low-level hooks configurable.
Increase the default value of 'long-line-threshold'. After
carefully considering the (few) bug reports about long line
optimizations, I concluded that the previous default value was too
low.
* src/xdisp.c (get_locked_narrowing_begv)
(get_locked_narrowing_zv): Two new functions.
(handle_fontified_prop, reseat): Use them.
* src/keyboard.c (safe_run_hooks_maybe_narrowed): Use them.
* src/dispextern.h (struct it): Add two new fields to store the
values returned by these functions.
Make them externally visible.
* src/editfns.c: (Fsave_restriction): Update docstring.
Diffstat (limited to 'src/xdisp.c')
-rw-r--r-- | src/xdisp.c | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index 658ce57b7ea..430201874c3 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -3533,6 +3533,34 @@ get_closer_narrowed_begv (struct window *w, ptrdiff_t pos) return max ((pos / len - 1) * len, BEGV); } +ptrdiff_t +get_locked_narrowing_begv (ptrdiff_t pos) +{ + if (long_line_locked_narrowing_region_size == 0) + return BEGV; + int begv; + int len = long_line_locked_narrowing_region_size / 2; + begv = max (pos - len, BEGV); + int limit = long_line_locked_narrowing_bol_search_limit; + while (limit) + { + if (begv == BEGV || FETCH_BYTE (CHAR_TO_BYTE (begv) - 1) == '\n') + return begv; + begv--; + limit--; + } + return begv; +} + +ptrdiff_t +get_locked_narrowing_zv (ptrdiff_t pos) +{ + if (long_line_locked_narrowing_region_size == 0) + return ZV; + int len = long_line_locked_narrowing_region_size / 2; + return min (pos + len, ZV); +} + static void unwind_narrowed_begv (Lisp_Object point_min) { @@ -4368,13 +4396,13 @@ handle_fontified_prop (struct it *it) if (current_buffer->long_line_optimizations_p) { - ptrdiff_t begv = it->narrowed_begv; - ptrdiff_t zv = it->narrowed_zv; + ptrdiff_t begv = it->locked_narrowing_begv; + ptrdiff_t zv = it->locked_narrowing_zv; ptrdiff_t charpos = IT_CHARPOS (*it); if (charpos < begv || charpos > zv) { - begv = get_narrowed_begv (it->w, charpos); - zv = get_narrowed_zv (it->w, charpos); + begv = get_locked_narrowing_begv (charpos); + zv = get_locked_narrowing_zv (charpos); } narrow_to_region_locked (make_fixnum (begv), make_fixnum (zv), Qfontification_functions); @@ -7435,12 +7463,20 @@ reseat (struct it *it, struct text_pos pos, bool force_p) { it->narrowed_begv = get_narrowed_begv (it->w, window_point (it->w)); it->narrowed_zv = get_narrowed_zv (it->w, window_point (it->w)); + it->locked_narrowing_begv + = get_locked_narrowing_begv (window_point (it->w)); + it->locked_narrowing_zv + = get_locked_narrowing_zv (window_point (it->w)); } else if ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv) && (!redisplaying_p || it->line_wrap == TRUNCATE)) { it->narrowed_begv = get_narrowed_begv (it->w, pos.charpos); it->narrowed_zv = get_narrowed_zv (it->w, pos.charpos); + it->locked_narrowing_begv + = get_locked_narrowing_begv (window_point (it->w)); + it->locked_narrowing_zv + = get_locked_narrowing_zv (window_point (it->w)); } } |