diff options
| author | Lars Magne Ingebrigtsen | 2014-11-16 23:36:58 +0100 |
|---|---|---|
| committer | Lars Magne Ingebrigtsen | 2014-11-16 23:41:55 +0100 |
| commit | d1b04a9e7ada7070dbd84bb450411c1f169b3739 (patch) | |
| tree | 8f0e26d1e2154f91364fd1b919df8bd8855604fd /src | |
| parent | c94988f4b740738cbc4660ee9c64637e55ad5d76 (diff) | |
| download | emacs-d1b04a9e7ada7070dbd84bb450411c1f169b3739.tar.gz emacs-d1b04a9e7ada7070dbd84bb450411c1f169b3739.zip | |
Implement an `inhibit-read-only' text property
* doc/lispref/text.texi (Special Properties): Mention `inhibit-read-only'.
* src/buffer.c (Fbarf_if_buffer_read_only): Don't raise an error if
the text at POSITION (new optional argument) has the
`inhibit-read-only' text property set.
* src/callint.c (Fcall_interactively): Pass in nil as argument to
Fbarf_if_buffer_read_only.
* src/fileio.c (Finsert_file_contents): Ditto.
* src/insdel.c (prepare_to_modify_buffer_1): Pass start region in.
* src/intervals.h (INTERVAL_WRITABLE_P): Check the `inhibit-read-only'
text property.
* src/textprop.c (verify_interval_modification): Check buffer
readedness after the last interval.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 19 | ||||
| -rw-r--r-- | src/buffer.c | 16 | ||||
| -rw-r--r-- | src/callint.c | 6 | ||||
| -rw-r--r-- | src/fileio.c | 2 | ||||
| -rw-r--r-- | src/insdel.c | 4 | ||||
| -rw-r--r-- | src/intervals.h | 1 | ||||
| -rw-r--r-- | src/textprop.c | 5 |
7 files changed, 44 insertions, 9 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 7bb16668406..d1888987dbc 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,22 @@ | |||
| 1 | 2014-11-16 Lars Magne Ingebrigtsen <larsi@gnus.org> | ||
| 2 | |||
| 3 | * intervals.h (INTERVAL_WRITABLE_P): Check the `inhibit-read-only' | ||
| 4 | text property. | ||
| 5 | |||
| 6 | * callint.c (Fcall_interactively): Pass in nil as argument to | ||
| 7 | Fbarf_if_buffer_read_only. | ||
| 8 | |||
| 9 | * fileio.c (Finsert_file_contents): Ditto. | ||
| 10 | |||
| 11 | * insdel.c (prepare_to_modify_buffer_1): Pass start region in. | ||
| 12 | |||
| 13 | * textprop.c (verify_interval_modification): Check buffer | ||
| 14 | readedness after the last interval. | ||
| 15 | |||
| 16 | * buffer.c (Fbarf_if_buffer_read_only): Don't raise an error if | ||
| 17 | the text at POSITION (new optional argument) has the | ||
| 18 | `inhibit-read-only' text property set. | ||
| 19 | |||
| 1 | 2014-11-16 Eli Zaretskii <eliz@gnu.org> | 20 | 2014-11-16 Eli Zaretskii <eliz@gnu.org> |
| 2 | 21 | ||
| 3 | * window.c (window_scroll_pixel_based): Avoid truncation/rounding | 22 | * window.c (window_scroll_pixel_based): Avoid truncation/rounding |
diff --git a/src/buffer.c b/src/buffer.c index 80791a1fdb1..9bdbfb830fd 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -2184,12 +2184,20 @@ set_buffer_if_live (Lisp_Object buffer) | |||
| 2184 | } | 2184 | } |
| 2185 | 2185 | ||
| 2186 | DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only, | 2186 | DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only, |
| 2187 | Sbarf_if_buffer_read_only, 0, 0, 0, | 2187 | Sbarf_if_buffer_read_only, 0, 1, 0, |
| 2188 | doc: /* Signal a `buffer-read-only' error if the current buffer is read-only. */) | 2188 | doc: /* Signal a `buffer-read-only' error if the current buffer is read-only. |
| 2189 | (void) | 2189 | If the text under POSITION (which defaults to point) has the |
| 2190 | `inhibit-read-only' text property set, the error will not be raised. */) | ||
| 2191 | (Lisp_Object pos) | ||
| 2190 | { | 2192 | { |
| 2193 | if (NILP (pos)) | ||
| 2194 | XSETFASTINT (pos, PT); | ||
| 2195 | else | ||
| 2196 | CHECK_NUMBER (pos); | ||
| 2197 | |||
| 2191 | if (!NILP (BVAR (current_buffer, read_only)) | 2198 | if (!NILP (BVAR (current_buffer, read_only)) |
| 2192 | && NILP (Vinhibit_read_only)) | 2199 | && NILP (Vinhibit_read_only) |
| 2200 | && NILP (Fget_text_property (pos, Qinhibit_read_only, Qnil))) | ||
| 2193 | xsignal1 (Qbuffer_read_only, Fcurrent_buffer ()); | 2201 | xsignal1 (Qbuffer_read_only, Fcurrent_buffer ()); |
| 2194 | return Qnil; | 2202 | return Qnil; |
| 2195 | } | 2203 | } |
diff --git a/src/callint.c b/src/callint.c index 9a4573c77be..94676952b25 100644 --- a/src/callint.c +++ b/src/callint.c | |||
| @@ -448,13 +448,13 @@ invoke it. If KEYS is omitted or nil, the return value of | |||
| 448 | { | 448 | { |
| 449 | if (! (*p == 'r' || *p == 'p' || *p == 'P' | 449 | if (! (*p == 'r' || *p == 'p' || *p == 'P' |
| 450 | || *p == '\n')) | 450 | || *p == '\n')) |
| 451 | Fbarf_if_buffer_read_only (); | 451 | Fbarf_if_buffer_read_only (Qnil); |
| 452 | p++; | 452 | p++; |
| 453 | } | 453 | } |
| 454 | record_then_fail = 1; | 454 | record_then_fail = 1; |
| 455 | } | 455 | } |
| 456 | else | 456 | else |
| 457 | Fbarf_if_buffer_read_only (); | 457 | Fbarf_if_buffer_read_only (Qnil); |
| 458 | } | 458 | } |
| 459 | } | 459 | } |
| 460 | /* Ignore this for semi-compatibility with Lucid. */ | 460 | /* Ignore this for semi-compatibility with Lucid. */ |
| @@ -865,7 +865,7 @@ invoke it. If KEYS is omitted or nil, the return value of | |||
| 865 | XSETINT (args[i], marker_position (args[i])); | 865 | XSETINT (args[i], marker_position (args[i])); |
| 866 | 866 | ||
| 867 | if (record_then_fail) | 867 | if (record_then_fail) |
| 868 | Fbarf_if_buffer_read_only (); | 868 | Fbarf_if_buffer_read_only (Qnil); |
| 869 | 869 | ||
| 870 | Vthis_command = save_this_command; | 870 | Vthis_command = save_this_command; |
| 871 | Vthis_original_command = save_this_original_command; | 871 | Vthis_original_command = save_this_original_command; |
diff --git a/src/fileio.c b/src/fileio.c index 7d7b0b3148f..b8dec3a2041 100644 --- a/src/fileio.c +++ b/src/fileio.c | |||
| @@ -3471,7 +3471,7 @@ by calling `format-decode', which see. */) | |||
| 3471 | error ("Cannot do file visiting in an indirect buffer"); | 3471 | error ("Cannot do file visiting in an indirect buffer"); |
| 3472 | 3472 | ||
| 3473 | if (!NILP (BVAR (current_buffer, read_only))) | 3473 | if (!NILP (BVAR (current_buffer, read_only))) |
| 3474 | Fbarf_if_buffer_read_only (); | 3474 | Fbarf_if_buffer_read_only (Qnil); |
| 3475 | 3475 | ||
| 3476 | val = Qnil; | 3476 | val = Qnil; |
| 3477 | p = Qnil; | 3477 | p = Qnil; |
diff --git a/src/insdel.c b/src/insdel.c index 463392dcada..3133ca4bd2c 100644 --- a/src/insdel.c +++ b/src/insdel.c | |||
| @@ -1797,9 +1797,11 @@ prepare_to_modify_buffer_1 (ptrdiff_t start, ptrdiff_t end, | |||
| 1797 | ptrdiff_t *preserve_ptr) | 1797 | ptrdiff_t *preserve_ptr) |
| 1798 | { | 1798 | { |
| 1799 | struct buffer *base_buffer; | 1799 | struct buffer *base_buffer; |
| 1800 | Lisp_Object temp; | ||
| 1800 | 1801 | ||
| 1802 | XSETFASTINT (temp, start); | ||
| 1801 | if (!NILP (BVAR (current_buffer, read_only))) | 1803 | if (!NILP (BVAR (current_buffer, read_only))) |
| 1802 | Fbarf_if_buffer_read_only (); | 1804 | Fbarf_if_buffer_read_only (temp); |
| 1803 | 1805 | ||
| 1804 | bset_redisplay (current_buffer); | 1806 | bset_redisplay (current_buffer); |
| 1805 | 1807 | ||
diff --git a/src/intervals.h b/src/intervals.h index 4e7a177140e..bd1f49dc383 100644 --- a/src/intervals.h +++ b/src/intervals.h | |||
| @@ -197,6 +197,7 @@ set_interval_plist (INTERVAL i, Lisp_Object plist) | |||
| 197 | /* Is this interval writable? Replace later with cache access. */ | 197 | /* Is this interval writable? Replace later with cache access. */ |
| 198 | #define INTERVAL_WRITABLE_P(i) \ | 198 | #define INTERVAL_WRITABLE_P(i) \ |
| 199 | (i && (NILP (textget ((i)->plist, Qread_only)) \ | 199 | (i && (NILP (textget ((i)->plist, Qread_only)) \ |
| 200 | || !NILP (textget ((i)->plist, Qinhibit_read_only)) \ | ||
| 200 | || ((CONSP (Vinhibit_read_only) \ | 201 | || ((CONSP (Vinhibit_read_only) \ |
| 201 | ? !NILP (Fmemq (textget ((i)->plist, Qread_only), \ | 202 | ? !NILP (Fmemq (textget ((i)->plist, Qread_only), \ |
| 202 | Vinhibit_read_only)) \ | 203 | Vinhibit_read_only)) \ |
diff --git a/src/textprop.c b/src/textprop.c index 91ade8ae298..7ecac62be98 100644 --- a/src/textprop.c +++ b/src/textprop.c | |||
| @@ -2298,6 +2298,11 @@ verify_interval_modification (struct buffer *buf, | |||
| 2298 | } | 2298 | } |
| 2299 | } | 2299 | } |
| 2300 | 2300 | ||
| 2301 | if (i->position + LENGTH (i) < end | ||
| 2302 | && (!NILP (BVAR (current_buffer, read_only)) | ||
| 2303 | && NILP (Vinhibit_read_only))) | ||
| 2304 | xsignal1 (Qbuffer_read_only, Fcurrent_buffer ()); | ||
| 2305 | |||
| 2301 | i = next_interval (i); | 2306 | i = next_interval (i); |
| 2302 | } | 2307 | } |
| 2303 | /* Keep going thru the interval containing the char before END. */ | 2308 | /* Keep going thru the interval containing the char before END. */ |