[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes
From: |
Vitalie Spinu |
Subject: |
Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]] |
Date: |
Tue, 22 Mar 2016 04:17:59 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.0.92 (gnu/linux) |
>> On Mon, Mar 21 2016 20:18, Vitalie Spinu wrote:
>>> This is outside of use cases that I have in mind.
>> Indeed, it's a different case, but one where the narrowing should be
>> hard as well.
> Ok. This part is trickier but it might not be that hard. Will keep this in
> mind.
I have pushed the proposed change to `widen-limits` branch. The C level
consequences are fairly innocuous. There are only 3 instances of calls to Fwiden
in the whole emacs.
Given that there seem to be use cases of permanent limiting I kept it as buffer
local variable. I also switched to milder name buffer-widen-limits.
Vitalie
3 files changed, 48 insertions(+), 3 deletions(-)
src/buffer.c | 19 +++++++++++++++++--
src/buffer.h | 17 +++++++++++++++++
src/editfns.c | 15 ++++++++++++++-
modified src/buffer.c
@@ -329,6 +329,11 @@ bset_scroll_up_aggressively (struct buffer *b, Lisp_Object
val)
b->scroll_up_aggressively_ = val;
}
static void
+bset_widen_limits (struct buffer *b, Lisp_Object val)
+{
+ b->widen_limits_ = val;
+}
+static void
bset_selective_display (struct buffer *b, Lisp_Object val)
{
b->selective_display_ = val;
@@ -847,6 +852,7 @@ CLONE nil means the indirect buffer's state is reset to
default values. */)
bset_display_count (b, make_number (0));
bset_backed_up (b, Qnil);
bset_auto_save_file_name (b, Qnil);
+ bset_widen_limits (b, b->base_buffer->widen_limits_);
set_buffer_internal_1 (b);
Fset (intern ("buffer-save-without-query"), Qnil);
Fset (intern ("buffer-file-number"), Qnil);
@@ -961,6 +967,7 @@ reset_buffer_local_variables (struct buffer *b, bool
permanent_too)
things that depend on the major mode.
default-major-mode is handled at a higher level.
We ignore it here. */
+ bset_widen_limits(b, Qnil);
bset_major_mode (b, Qfundamental_mode);
bset_keymap (b, Qnil);
bset_mode_name (b, QSFundamental);
@@ -2167,7 +2174,7 @@ so the buffer is truly empty after this. */)
{
Fwiden ();
- del_range (BEG, Z);
+ del_range (BEGWL, ZWL);
current_buffer->last_window_start = 1;
/* Prevent warnings, or suspension of auto saving, that would happen
@@ -5037,6 +5044,7 @@ init_buffer_once (void)
bset_display_count (&buffer_local_flags, make_number (-1));
bset_display_time (&buffer_local_flags, make_number (-1));
bset_enable_multibyte_characters (&buffer_local_flags, make_number (-1));
+ bset_widen_limits (&buffer_local_flags, make_number (-1));
/* These used to be stuck at 0 by default, but now that the all-zero value
means Qnil, we have to initialize them explicitly. */
@@ -5160,6 +5168,7 @@ init_buffer_once (void)
bset_cursor_type (&buffer_defaults, Qt);
bset_extra_line_spacing (&buffer_defaults, Qnil);
bset_cursor_in_non_selected_windows (&buffer_defaults, Qt);
+ bset_widen_limits (&buffer_defaults, Qnil);
bset_enable_multibyte_characters (&buffer_defaults, Qt);
bset_buffer_file_coding_system (&buffer_defaults, Qnil);
@@ -5367,7 +5376,6 @@ defvar_per_buffer (struct Lisp_Buffer_Objfwd *bo_fwd,
const char *namestring,
emacs_abort ();
}
-
/* Initialize the buffer routines. */
void
syms_of_buffer (void)
@@ -5796,6 +5804,13 @@ If you set this to -2, that means don't turn off
auto-saving in this buffer
if its text size shrinks. If you use `buffer-swap-text' on a buffer,
you probably should set this to -2 in that buffer. */);
+ DEFVAR_PER_BUFFER ("buffer-widen-limits", &BVAR (current_buffer,
widen_limits),
+ Qnil,
+ doc: /* When non-nil `widen` will widen to these limits.
+Must be a cons of the form (MIN . MAX) where MIN and MAX are integers
+of hard widen limits in this buffer. This is an experimental variable
+intended primarily for multi-mode engines. */);
+
DEFVAR_PER_BUFFER ("selective-display", &BVAR (current_buffer,
selective_display),
Qnil,
doc: /* Non-nil enables selective display.
modified src/buffer.h
@@ -59,6 +59,10 @@ INLINE_HEADER_BEGIN
#define Z (current_buffer->text->z)
#define Z_BYTE (current_buffer->text->z_byte)
+/* Positions that take into account widen limits. */
+#define BEGWL (BUF_BEGWL (current_buffer))
+#define ZWL (BUF_ZWL(current_buffer))
+
/* Macros for the addresses of places in the buffer. */
/* Address of beginning of buffer. */
@@ -128,6 +132,15 @@ INLINE_HEADER_BEGIN
: NILP (BVAR (buf, begv_marker)) ? buf->begv_byte \
: marker_byte_position (BVAR (buf, begv_marker)))
+/* Hard positions in buffer. */
+#define BUF_BEGWL(buf) \
+ ((NILP (BVAR (buf, widen_limits))) ? BUF_BEG (buf) \
+ : XINT( XCAR (BVAR (buf, widen_limits))))
+
+#define BUF_ZWL(buf) \
+ ((NILP (BVAR (buf, widen_limits))) ? BUF_Z (buf) \
+ : XINT( XCDR (BVAR (buf, widen_limits))))
+
/* Position of point in buffer. */
#define BUF_PT(buf) \
(buf == current_buffer ? PT \
@@ -150,6 +163,7 @@ INLINE_HEADER_BEGIN
: NILP (BVAR (buf, zv_marker)) ? buf->zv_byte \
: marker_byte_position (BVAR (buf, zv_marker)))
+
/* Position of gap in buffer. */
#define BUF_GPT(buf) ((buf)->text->gpt)
#define BUF_GPT_BYTE(buf) ((buf)->text->gpt_byte)
@@ -748,6 +762,9 @@ struct buffer
See `cursor-type' for other values. */
Lisp_Object cursor_in_non_selected_windows_;
+ /* Cons of hard widen limits */
+ Lisp_Object widen_limits_;
+
/* No more Lisp_Object beyond this point. Except undo_list,
which is handled specially in Fgarbage_collect. */
modified src/editfns.c
@@ -3480,12 +3480,25 @@ DEFUN ("delete-and-extract-region",
Fdelete_and_extract_region,
return empty_unibyte_string;
return del_range_1 (XINT (start), XINT (end), 1, 1);
}
+
DEFUN ("widen", Fwiden, Swiden, 0, 0, "",
doc: /* Remove restrictions (narrowing) from current buffer.
-This allows the buffer's full text to be seen and edited. */)
+This allows the buffer's full text to be seen and edited.
+If `buffer-widen-limits` is non-nil, widen only to those limits. */)
(void)
{
+
+ if (!NILP (BVAR(current_buffer, widen_limits)))
+ {
+ Lisp_Object hl = BVAR(current_buffer, widen_limits);
+ CHECK_CONS(hl);
+ CHECK_NUMBER(XCAR(hl));
+ CHECK_NUMBER(XCDR(hl));
+ Fnarrow_to_region(XCAR(hl), XCDR(hl));
+ return Qnil;
+ }
+
if (BEG != BEGV || Z != ZV)
current_buffer->clip_changed = 1;
BEGV = BEG;
[back]
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], (continued)
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Stefan Monnier, 2016/03/21
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/21
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Stefan Monnier, 2016/03/21
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/21
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Stefan Monnier, 2016/03/21
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/21
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]],
Vitalie Spinu <=
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/22
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/22
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Stefan Monnier, 2016/03/22
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/22
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Stefan Monnier, 2016/03/22
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/22
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Stefan Monnier, 2016/03/22
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/23
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Stefan Monnier, 2016/03/23
- Re: [Patch] hard-widen-limits [was Re: Syntax tables for multiple modes [was: bug#22983: syntax-ppss returns wrong result.]], Vitalie Spinu, 2016/03/23