428
+ − 1 /* Buffer manipulation primitives for XEmacs.
+ − 2 Copyright (C) 1985-1989, 1992-1995 Free Software Foundation, Inc.
+ − 3 Copyright (C) 1995 Sun Microsystems, Inc.
+ − 4 Copyright (C) 1995, 1996 Ben Wing.
+ − 5
+ − 6 This file is part of XEmacs.
+ − 7
+ − 8 XEmacs is free software; you can redistribute it and/or modify it
+ − 9 under the terms of the GNU General Public License as published by the
+ − 10 Free Software Foundation; either version 2, or (at your option) any
+ − 11 later version.
+ − 12
+ − 13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ − 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ − 15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ − 16 for more details.
+ − 17
+ − 18 You should have received a copy of the GNU General Public License
+ − 19 along with XEmacs; see the file COPYING. If not, write to
+ − 20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ − 21 Boston, MA 02111-1307, USA. */
+ − 22
+ − 23 /* Synched up with: Mule 2.0, FSF 19.30. */
+ − 24
+ − 25 /* Authorship:
+ − 26
+ − 27 FSF: long ago.
+ − 28 JWZ: some changes for Lemacs, long ago. (e.g. separate buffer
+ − 29 list per frame.)
+ − 30 Mly: a few changes for buffer-local vars, 19.8 or 19.9.
+ − 31 Ben Wing: some changes and cleanups for Mule, 19.12.
+ − 32 */
+ − 33
+ − 34 /* This file contains functions that work with buffer objects.
+ − 35 Functions that manipulate a buffer's text, however, are not
+ − 36 in this file:
+ − 37
+ − 38 1) The low-level functions that actually know about the
+ − 39 implementation of a buffer's text are located in insdel.c.
+ − 40 2) The higher-level (mostly Lisp) functions that manipulate a
+ − 41 buffer's text are in editfns.c.
+ − 42 3) The highest-level Lisp commands are in cmds.c.
+ − 43
+ − 44 However:
+ − 45
+ − 46 -- Functions that know about syntax tables (forward-word,
+ − 47 scan-sexps, etc.) are in syntax.c, as are functions
+ − 48 that manipulate syntax tables.
+ − 49 -- Functions that know about case tables (upcase, downcase,
+ − 50 etc.) are in casefiddle.c. Functions that manipulate
+ − 51 case tables (case-table-p, set-case-table, etc.) are
+ − 52 in casetab.c.
+ − 53 -- Functions that do searching and replacing are in
+ − 54 search.c. The low-level functions that implement
+ − 55 regular expressions are in regex.c.
+ − 56
+ − 57 Also:
+ − 58
+ − 59 -- Some file and process functions (in fileio.c and process.c)
+ − 60 copy text from or insert text into a buffer; they call
+ − 61 low-level functions in insdel.c to do this.
+ − 62 -- insdel.c calls low-level functions in undo.c and extents.c
+ − 63 to record buffer modifications for undoing and to handle
+ − 64 extent adjustment and extent-data creation and insertion.
+ − 65
+ − 66 */
+ − 67
+ − 68 #include <config.h>
+ − 69 #include "lisp.h"
+ − 70
+ − 71 #include "buffer.h"
+ − 72 #include "chartab.h"
446
+ − 73 #include "casetab.h"
428
+ − 74 #include "commands.h"
+ − 75 #include "elhash.h"
+ − 76 #include "extents.h"
+ − 77 #include "faces.h"
440
+ − 78 #ifdef FILE_CODING
+ − 79 #include "file-coding.h"
+ − 80 #endif
428
+ − 81 #include "frame.h"
+ − 82 #include "insdel.h"
440
+ − 83 #include "lstream.h"
428
+ − 84 #include "process.h" /* for kill_buffer_processes */
+ − 85 #ifdef REGION_CACHE_NEEDS_WORK
+ − 86 #include "region-cache.h"
+ − 87 #endif
442
+ − 88 #include "select.h" /* for select_notify_buffer_kill */
428
+ − 89 #include "specifier.h"
+ − 90 #include "syntax.h"
+ − 91 #include "sysdep.h" /* for getwd */
+ − 92 #include "window.h"
+ − 93
+ − 94 #include "sysfile.h"
+ − 95
+ − 96 struct buffer *current_buffer; /* the current buffer */
+ − 97
+ − 98 /* This structure holds the default values of the buffer-local variables
+ − 99 defined with DEFVAR_BUFFER_LOCAL, that have special slots in each buffer.
+ − 100 The default value occupies the same slot in this structure
+ − 101 as an individual buffer's value occupies in that buffer.
+ − 102 Setting the default value also goes through the alist of buffers
+ − 103 and stores into each buffer that does not say it has a local value. */
+ − 104 Lisp_Object Vbuffer_defaults;
+ − 105 static void *buffer_defaults_saved_slots;
+ − 106
+ − 107 /* This structure marks which slots in a buffer have corresponding
+ − 108 default values in Vbuffer_defaults.
+ − 109 Each such slot has a nonzero value in this structure.
+ − 110 The value has only one nonzero bit.
+ − 111
+ − 112 When a buffer has its own local value for a slot,
+ − 113 the bit for that slot (found in the same slot in this structure)
+ − 114 is turned on in the buffer's local_var_flags slot.
+ − 115
+ − 116 If a slot in this structure is 0, then there is a DEFVAR_BUFFER_LOCAL
+ − 117 for the slot, but there is no default value for it; the corresponding
+ − 118 slot in Vbuffer_defaults is not used except to initialize newly-created
+ − 119 buffers.
+ − 120
+ − 121 If a slot is -1, then there is a DEFVAR_BUFFER_LOCAL for it
+ − 122 as well as a default value which is used to initialize newly-created
+ − 123 buffers and as a reset-value when local-vars are killed.
+ − 124
+ − 125 If a slot is -2, there is no DEFVAR_BUFFER_LOCAL for it.
+ − 126 (The slot is always local, but there's no lisp variable for it.)
+ − 127 The default value is only used to initialize newly-creation buffers.
+ − 128
+ − 129 If a slot is -3, then there is no DEFVAR_BUFFER_LOCAL for it but
+ − 130 there is a default which is used to initialize newly-creation
+ − 131 buffers and as a reset-value when local-vars are killed. */
+ − 132 struct buffer buffer_local_flags;
+ − 133
+ − 134 /* This is the initial (startup) directory, as used for the *scratch* buffer.
+ − 135 We're making this a global to make others aware of the startup directory.
+ − 136 `initial_directory' is stored in external format.
+ − 137 */
+ − 138 char initial_directory[MAXPATHLEN+1];
+ − 139
+ − 140 /* This structure holds the names of symbols whose values may be
+ − 141 buffer-local. It is indexed and accessed in the same way as the above. */
+ − 142 static Lisp_Object Vbuffer_local_symbols;
+ − 143 static void *buffer_local_symbols_saved_slots;
+ − 144
+ − 145 /* Alist of all buffer names vs the buffers. */
+ − 146 /* This used to be a variable, but is no longer,
+ − 147 to prevent lossage due to user rplac'ing this alist or its elements.
+ − 148 Note that there is a per-frame copy of this as well; the frame slot
+ − 149 and the global variable contain the same data, but possibly in different
+ − 150 orders, so that the buffer ordering can be per-frame.
+ − 151 */
+ − 152 Lisp_Object Vbuffer_alist;
+ − 153
+ − 154 /* Functions to call before and after each text change. */
+ − 155 Lisp_Object Qbefore_change_functions;
+ − 156 Lisp_Object Qafter_change_functions;
+ − 157 Lisp_Object Vbefore_change_functions;
+ − 158 Lisp_Object Vafter_change_functions;
+ − 159
+ − 160 /* #### Obsolete, for compatibility */
+ − 161 Lisp_Object Qbefore_change_function;
+ − 162 Lisp_Object Qafter_change_function;
+ − 163 Lisp_Object Vbefore_change_function;
+ − 164 Lisp_Object Vafter_change_function;
+ − 165
+ − 166 #if 0 /* FSFmacs */
+ − 167 Lisp_Object Vtransient_mark_mode;
+ − 168 #endif
+ − 169
+ − 170 /* t means ignore all read-only text properties.
+ − 171 A list means ignore such a property if its value is a member of the list.
+ − 172 Any non-nil value means ignore buffer-read-only. */
+ − 173 Lisp_Object Vinhibit_read_only;
+ − 174
+ − 175 /* List of functions to call that can query about killing a buffer.
+ − 176 If any of these functions returns nil, we don't kill it. */
+ − 177 Lisp_Object Vkill_buffer_query_functions;
+ − 178
+ − 179 /* Non-nil means delete a buffer's auto-save file when the buffer is saved. */
+ − 180 int delete_auto_save_files;
+ − 181
+ − 182 Lisp_Object Qbuffer_live_p;
+ − 183 Lisp_Object Qbuffer_or_string_p;
+ − 184
+ − 185 /* List of functions to call before changing an unmodified buffer. */
+ − 186 Lisp_Object Vfirst_change_hook;
+ − 187 Lisp_Object Qfirst_change_hook;
+ − 188
+ − 189 Lisp_Object Qfundamental_mode;
+ − 190 Lisp_Object Qmode_class;
+ − 191 Lisp_Object Qpermanent_local;
+ − 192
+ − 193 Lisp_Object Qprotected_field;
+ − 194
+ − 195 Lisp_Object QSFundamental; /* A string "Fundamental" */
+ − 196 Lisp_Object QSscratch; /* "*scratch*" */
+ − 197 Lisp_Object Qdefault_directory;
+ − 198
+ − 199 Lisp_Object Qkill_buffer_hook;
+ − 200
+ − 201 Lisp_Object Qrename_auto_save_file;
+ − 202
+ − 203 Lisp_Object Qget_file_buffer;
+ − 204 Lisp_Object Qchange_major_mode_hook, Vchange_major_mode_hook;
+ − 205
+ − 206 Lisp_Object Qfind_file_compare_truenames;
+ − 207
+ − 208 Lisp_Object Qswitch_to_buffer;
+ − 209
+ − 210 /* Two thresholds controlling how much undo information to keep. */
458
+ − 211 Fixnum undo_threshold;
+ − 212 Fixnum undo_high_threshold;
428
+ − 213
+ − 214 int find_file_compare_truenames;
+ − 215 int find_file_use_truenames;
+ − 216
+ − 217
+ − 218 static void reset_buffer_local_variables (struct buffer *, int first_time);
+ − 219 static void nuke_all_buffer_slots (struct buffer *b, Lisp_Object zap);
+ − 220
+ − 221 Lisp_Object
+ − 222 make_buffer (struct buffer *buf)
+ − 223 {
+ − 224 Lisp_Object obj;
+ − 225 XSETBUFFER (obj, buf);
+ − 226 return obj;
+ − 227 }
+ − 228
+ − 229 static Lisp_Object
+ − 230 mark_buffer (Lisp_Object obj)
+ − 231 {
+ − 232 struct buffer *buf = XBUFFER (obj);
+ − 233
+ − 234 /* Truncate undo information. */
+ − 235 buf->undo_list = truncate_undo_list (buf->undo_list,
+ − 236 undo_threshold,
+ − 237 undo_high_threshold);
+ − 238
+ − 239 #define MARKED_SLOT(x) mark_object (buf->x)
+ − 240 #include "bufslots.h"
+ − 241 #undef MARKED_SLOT
+ − 242
+ − 243 mark_object (buf->extent_info);
+ − 244 if (buf->text)
+ − 245 mark_object (buf->text->line_number_cache);
+ − 246
+ − 247 /* Don't mark normally through the children slot.
+ − 248 (Actually, in this case, it doesn't matter.) */
+ − 249 if (! EQ (buf->indirect_children, Qnull_pointer))
+ − 250 mark_conses_in_list (buf->indirect_children);
+ − 251
+ − 252 return buf->base_buffer ? make_buffer (buf->base_buffer) : Qnil;
+ − 253 }
+ − 254
+ − 255 static void
+ − 256 print_buffer (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
+ − 257 {
+ − 258 struct buffer *b = XBUFFER (obj);
+ − 259
+ − 260 if (print_readably)
+ − 261 {
+ − 262 if (!BUFFER_LIVE_P (b))
+ − 263 error ("printing unreadable object #<killed buffer>");
+ − 264 else
+ − 265 error ("printing unreadable object #<buffer %s>",
+ − 266 XSTRING_DATA (b->name));
+ − 267 }
+ − 268 else if (!BUFFER_LIVE_P (b))
+ − 269 write_c_string ("#<killed buffer>", printcharfun);
+ − 270 else if (escapeflag)
+ − 271 {
+ − 272 write_c_string ("#<buffer ", printcharfun);
+ − 273 print_internal (b->name, printcharfun, 1);
+ − 274 write_c_string (">", printcharfun);
+ − 275 }
+ − 276 else
+ − 277 {
+ − 278 print_internal (b->name, printcharfun, 0);
+ − 279 }
+ − 280 }
+ − 281
+ − 282 /* We do not need a finalize method to handle a buffer's children list
+ − 283 because all buffers have `kill-buffer' applied to them before
+ − 284 they disappear, and the children removal happens then. */
+ − 285 DEFINE_LRECORD_IMPLEMENTATION ("buffer", buffer,
+ − 286 mark_buffer, print_buffer, 0, 0, 0, 0,
+ − 287 struct buffer);
+ − 288
+ − 289 DEFUN ("bufferp", Fbufferp, 1, 1, 0, /*
+ − 290 Return t if OBJECT is an editor buffer.
+ − 291 */
+ − 292 (object))
+ − 293 {
+ − 294 return BUFFERP (object) ? Qt : Qnil;
+ − 295 }
+ − 296
+ − 297 DEFUN ("buffer-live-p", Fbuffer_live_p, 1, 1, 0, /*
+ − 298 Return t if OBJECT is an editor buffer that has not been deleted.
+ − 299 */
+ − 300 (object))
+ − 301 {
+ − 302 return BUFFERP (object) && BUFFER_LIVE_P (XBUFFER (object)) ? Qt : Qnil;
+ − 303 }
+ − 304
+ − 305 static void
+ − 306 nsberror (Lisp_Object spec)
+ − 307 {
+ − 308 if (STRINGP (spec))
+ − 309 error ("No buffer named %s", XSTRING_DATA (spec));
+ − 310 signal_simple_error ("Invalid buffer argument", spec);
+ − 311 }
+ − 312
+ − 313 DEFUN ("buffer-list", Fbuffer_list, 0, 1, 0, /*
+ − 314 Return a list of all existing live buffers.
+ − 315 The order is specific to the selected frame; if the optional FRAME
+ − 316 argument is provided, the ordering for that frame is returned instead.
+ − 317 If the FRAME argument is t, then the global (non-frame) ordering is
+ − 318 returned instead.
+ − 319 */
+ − 320 (frame))
+ − 321 {
+ − 322 return Fmapcar (Qcdr,
+ − 323 EQ (frame, Qt) ? Vbuffer_alist :
+ − 324 decode_frame (frame)->buffer_alist);
+ − 325 }
+ − 326
+ − 327 Lisp_Object
+ − 328 get_buffer (Lisp_Object name, int error_if_deleted_or_does_not_exist)
+ − 329 {
+ − 330 if (BUFFERP (name))
+ − 331 {
+ − 332 if (!BUFFER_LIVE_P (XBUFFER (name)))
+ − 333 {
+ − 334 if (error_if_deleted_or_does_not_exist)
+ − 335 nsberror (name);
+ − 336 return Qnil;
+ − 337 }
+ − 338 return name;
+ − 339 }
+ − 340 else
+ − 341 {
+ − 342 Lisp_Object buf;
+ − 343 struct gcpro gcpro1;
+ − 344
+ − 345 CHECK_STRING (name);
+ − 346 name = LISP_GETTEXT (name); /* I18N3 */
+ − 347 GCPRO1 (name);
+ − 348 buf = Fcdr (Fassoc (name, Vbuffer_alist));
+ − 349 UNGCPRO;
+ − 350 if (NILP (buf) && error_if_deleted_or_does_not_exist)
+ − 351 nsberror (name);
+ − 352 return buf;
+ − 353 }
+ − 354 }
+ − 355
+ − 356 struct buffer *
+ − 357 decode_buffer (Lisp_Object buffer, int allow_string)
+ − 358 {
+ − 359 if (NILP (buffer))
+ − 360 return current_buffer;
+ − 361
+ − 362 if (allow_string && STRINGP (buffer))
+ − 363 return XBUFFER (get_buffer (buffer, 1));
+ − 364
+ − 365 CHECK_LIVE_BUFFER (buffer);
+ − 366 return XBUFFER (buffer);
+ − 367 }
+ − 368
+ − 369 DEFUN ("decode-buffer", Fdecode_buffer, 1, 1, 0, /*
+ − 370 Validate BUFFER or if BUFFER is nil, return the current buffer.
+ − 371 If BUFFER is a valid buffer or a string representing a valid buffer,
+ − 372 the corresponding buffer object will be returned. Otherwise an error
+ − 373 will be signaled.
+ − 374 */
+ − 375 (buffer))
+ − 376 {
+ − 377 struct buffer *b = decode_buffer (buffer, 1);
+ − 378 XSETBUFFER (buffer, b);
+ − 379 return buffer;
+ − 380 }
+ − 381
+ − 382 #if 0 /* FSFmacs */
+ − 383 /* bleagh!!! */
+ − 384 /* Like Fassoc, but use Fstring_equal to compare
+ − 385 (which ignores text properties),
+ − 386 and don't ever QUIT. */
+ − 387
+ − 388 static Lisp_Object
+ − 389 assoc_ignore_text_properties (REGISTER Lisp_Object key, Lisp_Object list)
+ − 390 {
+ − 391 REGISTER Lisp_Object tail;
+ − 392 for (tail = list; !NILP (tail); tail = Fcdr (tail))
+ − 393 {
+ − 394 REGISTER Lisp_Object elt, tem;
+ − 395 elt = Fcar (tail);
+ − 396 tem = Fstring_equal (Fcar (elt), key);
+ − 397 if (!NILP (tem))
+ − 398 return elt;
+ − 399 }
+ − 400 return Qnil;
+ − 401 }
+ − 402
+ − 403 #endif /* FSFmacs */
+ − 404
+ − 405 DEFUN ("get-buffer", Fget_buffer, 1, 1, 0, /*
444
+ − 406 Return the buffer named BUFFER-NAME (a string), or nil if there is none.
+ − 407 BUFFER-NAME may also be a buffer; if so, the value is that buffer.
428
+ − 408 */
444
+ − 409 (buffer_name))
428
+ − 410 {
+ − 411 #ifdef I18N3
+ − 412 /* #### Doc string should indicate that the buffer name will get
+ − 413 translated. */
+ − 414 #endif
+ − 415
+ − 416 /* #### This might return a dead buffer. This is gross. This is
+ − 417 called FSF compatibility. */
444
+ − 418 if (BUFFERP (buffer_name))
+ − 419 return buffer_name;
+ − 420 return get_buffer (buffer_name, 0);
428
+ − 421 /* FSFmacs 19.29 calls assoc_ignore_text_properties() here.
+ − 422 Bleagh!! */
+ − 423 }
+ − 424
+ − 425
+ − 426 DEFUN ("get-file-buffer", Fget_file_buffer, 1, 1, 0, /*
+ − 427 Return the buffer visiting file FILENAME (a string).
+ − 428 The buffer's `buffer-file-name' must match exactly the expansion of FILENAME.
+ − 429 If there is no such live buffer, return nil.
+ − 430
+ − 431 Normally, the comparison is done by canonicalizing FILENAME (using
+ − 432 `expand-file-name') and comparing that to the value of `buffer-file-name'
+ − 433 for each existing buffer. However, If `find-file-compare-truenames' is
+ − 434 non-nil, FILENAME will be converted to its truename and the search will be
+ − 435 done on each buffer's value of `buffer-file-truename' instead of
+ − 436 `buffer-file-name'. Otherwise, if `find-file-use-truenames' is non-nil,
+ − 437 FILENAME will be converted to its truename and used for searching, but
+ − 438 the search will still be done on `buffer-file-name'.
+ − 439 */
+ − 440 (filename))
+ − 441 {
442
+ − 442 /* This function can GC. GC checked and fixed 7-11-2000 ben. */
428
+ − 443 REGISTER Lisp_Object buf;
+ − 444 struct gcpro gcpro1;
+ − 445
+ − 446 #ifdef I18N3
+ − 447 /* DO NOT translate the filename. */
+ − 448 #endif
+ − 449 GCPRO1 (filename);
+ − 450 CHECK_STRING (filename);
+ − 451 filename = Fexpand_file_name (filename, Qnil);
+ − 452 {
+ − 453 /* If the file name has special constructs in it,
+ − 454 call the corresponding file handler. */
+ − 455 Lisp_Object handler = Ffind_file_name_handler (filename, Qget_file_buffer);
+ − 456 if (!NILP (handler))
+ − 457 {
+ − 458 UNGCPRO;
+ − 459 return call2 (handler, Qget_file_buffer, filename);
+ − 460 }
+ − 461 }
+ − 462 UNGCPRO;
+ − 463
+ − 464 if (find_file_compare_truenames || find_file_use_truenames)
+ − 465 {
+ − 466 struct gcpro ngcpro1, ngcpro2, ngcpro3;
+ − 467 Lisp_Object fn = Qnil;
+ − 468 Lisp_Object dn = Qnil;
+ − 469
+ − 470 NGCPRO3 (fn, dn, filename);
+ − 471 fn = Ffile_truename (filename, Qnil);
+ − 472 if (NILP (fn))
+ − 473 {
+ − 474 dn = Ffile_name_directory (filename);
+ − 475 fn = Ffile_truename (dn, Qnil);
+ − 476 if (! NILP (fn)) dn = fn;
442
+ − 477 /* Formerly the two calls below were combined, but that is
+ − 478 not GC-safe because the first call returns unprotected
+ − 479 data and the second call can GC. --ben */
+ − 480 fn = Ffile_name_nondirectory (filename);
+ − 481 fn = Fexpand_file_name (fn, dn);
428
+ − 482 }
+ − 483 filename = fn;
+ − 484 NUNGCPRO;
+ − 485 }
+ − 486
+ − 487 {
+ − 488 LIST_LOOP_2 (elt, Vbuffer_alist)
+ − 489 {
+ − 490 buf = Fcdr (elt);
+ − 491 if (!BUFFERP (buf)) continue;
+ − 492 if (!STRINGP (XBUFFER (buf)->filename)) continue;
+ − 493 if (!NILP (Fstring_equal (filename,
+ − 494 (find_file_compare_truenames
+ − 495 ? XBUFFER (buf)->file_truename
+ − 496 : XBUFFER (buf)->filename))))
+ − 497 return buf;
+ − 498 }
+ − 499 }
+ − 500 return Qnil;
+ − 501 }
+ − 502
+ − 503
+ − 504 static void
+ − 505 push_buffer_alist (Lisp_Object name, Lisp_Object buf)
+ − 506 {
+ − 507 Lisp_Object cons = Fcons (name, buf);
+ − 508 Lisp_Object frmcons, devcons, concons;
+ − 509
+ − 510 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (cons, Qnil));
+ − 511 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
+ − 512 {
+ − 513 struct frame *f;
+ − 514 f = XFRAME (XCAR (frmcons));
+ − 515 f->buffer_alist = nconc2 (f->buffer_alist, Fcons (cons, Qnil));
+ − 516 }
+ − 517 }
+ − 518
+ − 519 static void
+ − 520 delete_from_buffer_alist (Lisp_Object buf)
+ − 521 {
+ − 522 Lisp_Object cons = Frassq (buf, Vbuffer_alist);
+ − 523 Lisp_Object frmcons, devcons, concons;
+ − 524 if (NILP (cons))
+ − 525 return; /* abort() ? */
+ − 526 Vbuffer_alist = delq_no_quit (cons, Vbuffer_alist);
+ − 527
+ − 528 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
+ − 529 {
+ − 530 struct frame *f;
+ − 531 f = XFRAME (XCAR (frmcons));
+ − 532 f->buffer_alist = delq_no_quit (cons, f->buffer_alist);
+ − 533 }
+ − 534 }
+ − 535
+ − 536 Lisp_Object
+ − 537 get_truename_buffer (REGISTER Lisp_Object filename)
+ − 538 {
442
+ − 539 /* This function can GC. GC correct 7-11-00 ben */
428
+ − 540 /* FSFmacs has its own code here and doesn't call get-file-buffer.
+ − 541 That's because their equivalent of find-file-compare-truenames
+ − 542 (find-file-existing-other-name) isn't looked at in get-file-buffer.
+ − 543 This way is more correct. */
+ − 544 int count = specpdl_depth ();
+ − 545
+ − 546 specbind (Qfind_file_compare_truenames, Qt);
+ − 547 return unbind_to (count, Fget_file_buffer (filename));
+ − 548 }
+ − 549
+ − 550 static struct buffer *
+ − 551 allocate_buffer (void)
+ − 552 {
+ − 553 struct buffer *b = alloc_lcrecord_type (struct buffer, &lrecord_buffer);
+ − 554
+ − 555 copy_lcrecord (b, XBUFFER (Vbuffer_defaults));
+ − 556
+ − 557 return b;
+ − 558 }
+ − 559
+ − 560 static Lisp_Object
+ − 561 finish_init_buffer (struct buffer *b, Lisp_Object name)
+ − 562 {
+ − 563 Lisp_Object buf;
+ − 564
+ − 565 XSETBUFFER (buf, b);
+ − 566
+ − 567 name = Fcopy_sequence (name);
+ − 568 /* #### This really does not need to be called. We already
+ − 569 initialized the buffer-local variables in allocate_buffer().
+ − 570 local_var_alist is set to Qnil at the same point, in
+ − 571 nuke_all_buffer_slots(). */
+ − 572 reset_buffer_local_variables (b, 1);
442
+ − 573 b->directory = current_buffer ? current_buffer->directory : Qnil;
428
+ − 574
+ − 575 b->last_window_start = 1;
+ − 576
+ − 577 b->name = name;
+ − 578 if (string_byte (XSTRING (name), 0) != ' ')
+ − 579 b->undo_list = Qnil;
+ − 580 else
+ − 581 b->undo_list = Qt;
+ − 582
+ − 583 /* initialize the extent list */
+ − 584 init_buffer_extents (b);
+ − 585
+ − 586 /* Put this in the alist of all live buffers. */
+ − 587 push_buffer_alist (name, buf);
+ − 588
+ − 589 init_buffer_markers (b);
+ − 590
+ − 591 b->generated_modeline_string = Fmake_string (make_int (84), make_int (' '));
+ − 592 b->modeline_extent_table = make_lisp_hash_table (20, HASH_TABLE_KEY_WEAK,
+ − 593 HASH_TABLE_EQ);
+ − 594
+ − 595 return buf;
+ − 596 }
+ − 597
+ − 598 DEFUN ("get-buffer-create", Fget_buffer_create, 1, 1, 0, /*
+ − 599 Return the buffer named NAME, or create such a buffer and return it.
+ − 600 A new buffer is created if there is no live buffer named NAME.
+ − 601 If NAME starts with a space, the new buffer does not keep undo information.
+ − 602 If NAME is a buffer instead of a string, then it is the value returned.
+ − 603 The value is never nil.
+ − 604 */
+ − 605 (name))
+ − 606 {
+ − 607 /* This function can GC */
+ − 608 Lisp_Object buf;
+ − 609 REGISTER struct buffer *b;
+ − 610
+ − 611 #ifdef I18N3
+ − 612 /* #### Doc string should indicate that the buffer name will get
+ − 613 translated. */
+ − 614 #endif
+ − 615
+ − 616 name = LISP_GETTEXT (name);
+ − 617 buf = Fget_buffer (name);
+ − 618 if (!NILP (buf))
+ − 619 return buf;
+ − 620
+ − 621 if (XSTRING_LENGTH (name) == 0)
+ − 622 error ("Empty string for buffer name is not allowed");
+ − 623
+ − 624 b = allocate_buffer ();
+ − 625
+ − 626 b->text = &b->own_text;
+ − 627 b->base_buffer = 0;
+ − 628 b->indirect_children = Qnil;
+ − 629 init_buffer_text (b);
+ − 630
+ − 631 return finish_init_buffer (b, name);
+ − 632 }
+ − 633
+ − 634 DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, 2, 2,
+ − 635 "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", /*
444
+ − 636 Create and return an indirect buffer for buffer BASE-BUFFER, named NAME.
+ − 637 BASE-BUFFER should be an existing buffer (or buffer name).
428
+ − 638 NAME should be a string which is not the name of an existing buffer.
444
+ − 639
+ − 640 If BASE-BUFFER is itself an indirect buffer, the base buffer for that buffer
428
+ − 641 is made the base buffer for the newly created buffer. (Thus, there will
+ − 642 never be indirect buffers whose base buffers are themselves indirect.)
+ − 643 */
+ − 644 (base_buffer, name))
+ − 645 {
+ − 646 /* This function can GC */
+ − 647
+ − 648 /* #### The above interactive specification is totally bogus,
+ − 649 because it offers an existing buffer as default answer to the
+ − 650 second question. However, the second argument may not BE an
+ − 651 existing buffer! */
+ − 652 struct buffer *b;
+ − 653
+ − 654 base_buffer = get_buffer (base_buffer, 1);
+ − 655
+ − 656 #ifdef I18N3
+ − 657 /* #### Doc string should indicate that the buffer name will get
+ − 658 translated. */
+ − 659 #endif
+ − 660 CHECK_STRING (name);
+ − 661 name = LISP_GETTEXT (name);
+ − 662 if (!NILP (Fget_buffer (name)))
+ − 663 signal_simple_error ("Buffer name already in use", name);
+ − 664 if (XSTRING_LENGTH (name) == 0)
+ − 665 error ("Empty string for buffer name is not allowed");
+ − 666
+ − 667 b = allocate_buffer ();
+ − 668
+ − 669 b->base_buffer = BUFFER_BASE_BUFFER (XBUFFER (base_buffer));
+ − 670
+ − 671 /* Use the base buffer's text object. */
+ − 672 b->text = b->base_buffer->text;
+ − 673 b->indirect_children = Qnil;
+ − 674 b->base_buffer->indirect_children =
+ − 675 Fcons (make_buffer (b), b->base_buffer->indirect_children);
+ − 676 init_buffer_text (b);
+ − 677
+ − 678 return finish_init_buffer (b, name);
+ − 679 }
+ − 680
+ − 681
+ − 682
+ − 683 static void
+ − 684 reset_buffer_local_variables (struct buffer *b, int first_time)
+ − 685 {
+ − 686 struct buffer *def = XBUFFER (Vbuffer_defaults);
+ − 687
+ − 688 b->local_var_flags = 0;
+ − 689 /* For each slot that has a default value,
+ − 690 copy that into the slot. */
+ − 691 #define MARKED_SLOT(slot) \
+ − 692 { int mask = XINT (buffer_local_flags.slot); \
+ − 693 if ((mask > 0 || mask == -1 || mask == -3) \
+ − 694 && (first_time \
+ − 695 || NILP (Fget (XBUFFER (Vbuffer_local_symbols)->slot, \
+ − 696 Qpermanent_local, Qnil)))) \
+ − 697 b->slot = def->slot; \
+ − 698 }
+ − 699 #include "bufslots.h"
+ − 700 #undef MARKED_SLOT
+ − 701 }
+ − 702
+ − 703
+ − 704 /* We split this away from generate-new-buffer, because rename-buffer
+ − 705 and set-visited-file-name ought to be able to use this to really
+ − 706 rename the buffer properly. */
+ − 707
+ − 708 DEFUN ("generate-new-buffer-name", Fgenerate_new_buffer_name, 1, 2, 0, /*
+ − 709 Return a string that is the name of no existing buffer based on NAME.
+ − 710 If there is no live buffer named NAME, then return NAME.
+ − 711 Otherwise modify name by appending `<NUMBER>', incrementing NUMBER
+ − 712 until an unused name is found, and then return that name.
+ − 713 Optional second argument IGNORE specifies a name that is okay to use
+ − 714 \(if it is in the sequence to be tried)
+ − 715 even if a buffer with that name exists.
+ − 716 */
+ − 717 (name, ignore))
+ − 718 {
+ − 719 REGISTER Lisp_Object gentemp, tem;
+ − 720 int count;
+ − 721 char number[10];
+ − 722
+ − 723 CHECK_STRING (name);
+ − 724
+ − 725 name = LISP_GETTEXT (name);
+ − 726 #ifdef I18N3
+ − 727 /* #### Doc string should indicate that the buffer name will get
+ − 728 translated. */
+ − 729 #endif
+ − 730
+ − 731 tem = Fget_buffer (name);
+ − 732 if (NILP (tem))
+ − 733 return name;
+ − 734
+ − 735 count = 1;
+ − 736 while (1)
+ − 737 {
+ − 738 sprintf (number, "<%d>", ++count);
+ − 739 gentemp = concat2 (name, build_string (number));
+ − 740 if (!NILP (ignore))
+ − 741 {
+ − 742 tem = Fstring_equal (gentemp, ignore);
+ − 743 if (!NILP (tem))
+ − 744 return gentemp;
+ − 745 }
+ − 746 tem = Fget_buffer (gentemp);
+ − 747 if (NILP (tem))
+ − 748 return gentemp;
+ − 749 }
+ − 750 }
+ − 751
+ − 752
+ − 753 DEFUN ("buffer-name", Fbuffer_name, 0, 1, 0, /*
+ − 754 Return the name of BUFFER, as a string.
+ − 755 With no argument or nil as argument, return the name of the current buffer.
+ − 756 */
+ − 757 (buffer))
+ − 758 {
+ − 759 /* For compatibility, we allow a dead buffer here.
+ − 760 Earlier versions of Emacs didn't provide buffer-live-p. */
+ − 761 if (NILP (buffer))
+ − 762 return current_buffer->name;
+ − 763 CHECK_BUFFER (buffer);
+ − 764 return XBUFFER (buffer)->name;
+ − 765 }
+ − 766
+ − 767 DEFUN ("buffer-file-name", Fbuffer_file_name, 0, 1, 0, /*
+ − 768 Return name of file BUFFER is visiting, or nil if none.
+ − 769 No argument or nil as argument means use the current buffer.
+ − 770 */
+ − 771 (buffer))
+ − 772 {
+ − 773 /* For compatibility, we allow a dead buffer here. Yuck! */
+ − 774 if (NILP (buffer))
+ − 775 return current_buffer->filename;
+ − 776 CHECK_BUFFER (buffer);
+ − 777 return XBUFFER (buffer)->filename;
+ − 778 }
+ − 779
+ − 780 DEFUN ("buffer-base-buffer", Fbuffer_base_buffer, 0, 1, 0, /*
+ − 781 Return the base buffer of indirect buffer BUFFER.
+ − 782 If BUFFER is not indirect, return nil.
+ − 783 */
+ − 784 (buffer))
+ − 785 {
+ − 786 struct buffer *buf = decode_buffer (buffer, 0);
+ − 787
+ − 788 return buf->base_buffer ? make_buffer (buf->base_buffer) : Qnil;
+ − 789 }
+ − 790
+ − 791 DEFUN ("buffer-indirect-children", Fbuffer_indirect_children, 0, 1, 0, /*
+ − 792 Return a list of all indirect buffers whose base buffer is BUFFER.
+ − 793 If BUFFER is indirect, the return value will always be nil; see
+ − 794 `make-indirect-buffer'.
+ − 795 */
+ − 796 (buffer))
+ − 797 {
+ − 798 struct buffer *buf = decode_buffer (buffer, 0);
+ − 799
+ − 800 return Fcopy_sequence (buf->indirect_children);
+ − 801 }
+ − 802
+ − 803 DEFUN ("buffer-local-variables", Fbuffer_local_variables, 0, 1, 0, /*
+ − 804 Return an alist of variables that are buffer-local in BUFFER.
+ − 805 Most elements look like (SYMBOL . VALUE), describing one variable.
+ − 806 For a symbol that is locally unbound, just the symbol appears in the value.
+ − 807 Note that storing new VALUEs in these elements doesn't change the variables.
+ − 808 No argument or nil as argument means use current buffer as BUFFER.
+ − 809 */
+ − 810 (buffer))
+ − 811 {
+ − 812 struct buffer *buf = decode_buffer (buffer, 0);
+ − 813 Lisp_Object result = Qnil;
+ − 814
+ − 815 {
+ − 816 Lisp_Object tail;
+ − 817 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
+ − 818 {
+ − 819 Lisp_Object elt = XCAR (tail);
+ − 820 /* Reference each variable in the alist in buf.
+ − 821 If inquiring about the current buffer, this gets the current values,
+ − 822 so store them into the alist so the alist is up to date.
+ − 823 If inquiring about some other buffer, this swaps out any values
+ − 824 for that buffer, making the alist up to date automatically. */
+ − 825 Lisp_Object val = find_symbol_value (XCAR (elt));
+ − 826 /* Use the current buffer value only if buf is the current buffer. */
+ − 827 if (buf != current_buffer)
+ − 828 val = XCDR (elt);
+ − 829
+ − 830 /* If symbol is unbound, put just the symbol in the list. */
+ − 831 if (UNBOUNDP (val))
+ − 832 result = Fcons (XCAR (elt), result);
+ − 833 /* Otherwise, put (symbol . value) in the list. */
+ − 834 else
+ − 835 result = Fcons (Fcons (XCAR (elt), val), result);
+ − 836 }
+ − 837 }
+ − 838
+ − 839 /* Add on all the variables stored in special slots. */
+ − 840 {
+ − 841 struct buffer *syms = XBUFFER (Vbuffer_local_symbols);
+ − 842 #define MARKED_SLOT(slot) \
+ − 843 { int mask = XINT (buffer_local_flags.slot); \
+ − 844 if (mask == 0 || mask == -1 \
+ − 845 || ((mask > 0) && (buf->local_var_flags & mask))) \
+ − 846 result = Fcons (Fcons (syms->slot, buf->slot), result); \
+ − 847 }
+ − 848 #include "bufslots.h"
+ − 849 #undef MARKED_SLOT
+ − 850 }
+ − 851 return result;
+ − 852 }
+ − 853
+ − 854
+ − 855 DEFUN ("buffer-modified-p", Fbuffer_modified_p, 0, 1, 0, /*
+ − 856 Return t if BUFFER was modified since its file was last read or saved.
+ − 857 No argument or nil as argument means use current buffer as BUFFER.
+ − 858 */
+ − 859 (buffer))
+ − 860 {
+ − 861 struct buffer *buf = decode_buffer (buffer, 0);
+ − 862
+ − 863 return BUF_SAVE_MODIFF (buf) < BUF_MODIFF (buf) ? Qt : Qnil;
+ − 864 }
+ − 865
+ − 866 DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, 1, 2, 0, /*
+ − 867 Mark BUFFER as modified or unmodified according to FLAG.
+ − 868 A non-nil FLAG means mark the buffer modified. No argument or nil
+ − 869 as BUFFER means use current buffer.
+ − 870 */
+ − 871 (flag, buffer))
+ − 872 {
+ − 873 /* This function can GC */
+ − 874 struct buffer *buf = decode_buffer (buffer, 0);
+ − 875
+ − 876 #ifdef CLASH_DETECTION
+ − 877 /* If buffer becoming modified, lock the file.
+ − 878 If buffer becoming unmodified, unlock the file. */
+ − 879
+ − 880 Lisp_Object fn = buf->file_truename;
+ − 881 if (!NILP (fn))
+ − 882 {
+ − 883 int already = BUF_SAVE_MODIFF (buf) < BUF_MODIFF (buf);
+ − 884 if (already == NILP (flag))
+ − 885 {
+ − 886 int count = specpdl_depth ();
+ − 887 /* lock_file() and unlock_file() currently use current_buffer */
+ − 888 /* #### - dmoore, what if lock_file or unlock_file kill
+ − 889 the current buffer? */
+ − 890 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
+ − 891 set_buffer_internal (buf);
+ − 892 if (!already && !NILP (flag))
+ − 893 lock_file (fn);
+ − 894 else if (already && NILP (flag))
+ − 895 unlock_file (fn);
+ − 896 unbind_to (count, Qnil);
+ − 897 }
+ − 898 }
+ − 899 #endif /* CLASH_DETECTION */
+ − 900
+ − 901 /* This is often called when the buffer contents are altered but we
+ − 902 don't want to treat the changes that way (e.g. selective
+ − 903 display). We still need to make sure redisplay realizes that the
+ − 904 contents have potentially altered and it needs to do some
+ − 905 work. */
444
+ − 906 buf = decode_buffer (buffer, 0);
428
+ − 907 BUF_MODIFF (buf)++;
+ − 908 BUF_SAVE_MODIFF (buf) = NILP (flag) ? BUF_MODIFF (buf) : 0;
+ − 909 MARK_MODELINE_CHANGED;
+ − 910
+ − 911 return flag;
+ − 912 }
+ − 913
+ − 914 DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, 0, 1, 0, /*
+ − 915 Return BUFFER's tick counter, incremented for each change in text.
+ − 916 Each buffer has a tick counter which is incremented each time the text in
+ − 917 that buffer is changed. It wraps around occasionally.
+ − 918 No argument or nil as argument means use current buffer as BUFFER.
+ − 919 */
+ − 920 (buffer))
+ − 921 {
+ − 922 struct buffer *buf = decode_buffer (buffer, 0);
+ − 923
+ − 924 return make_int (BUF_MODIFF (buf));
+ − 925 }
+ − 926
+ − 927 DEFUN ("rename-buffer", Frename_buffer, 1, 2,
+ − 928 "sRename buffer (to new name): \nP", /*
+ − 929 Change current buffer's name to NEWNAME (a string).
+ − 930 If second arg UNIQUE is nil or omitted, it is an error if a
+ − 931 buffer named NEWNAME already exists.
+ − 932 If UNIQUE is non-nil, come up with a new name using
+ − 933 `generate-new-buffer-name'.
+ − 934 Interactively, one can set UNIQUE with a prefix argument.
+ − 935 Returns the name we actually gave the buffer.
+ − 936 This does not change the name of the visited file (if any).
+ − 937 */
+ − 938 (newname, unique))
+ − 939 {
+ − 940 /* This function can GC */
+ − 941 Lisp_Object tem, buf;
+ − 942
+ − 943 #ifdef I18N3
+ − 944 /* #### Doc string should indicate that the buffer name will get
+ − 945 translated. */
+ − 946 #endif
+ − 947 CHECK_STRING (newname);
+ − 948 newname = LISP_GETTEXT (newname);
+ − 949
+ − 950 if (XSTRING_LENGTH (newname) == 0)
+ − 951 error ("Empty string is invalid as a buffer name");
+ − 952
+ − 953 tem = Fget_buffer (newname);
+ − 954 /* Don't short-circuit if UNIQUE is t. That is a useful way to rename
+ − 955 the buffer automatically so you can create another with the original name.
+ − 956 It makes UNIQUE equivalent to
+ − 957 (rename-buffer (generate-new-buffer-name NEWNAME)). */
+ − 958 /* XEmacs change: added check for nil */
+ − 959 if (NILP (unique) && !NILP (tem) && XBUFFER (tem) == current_buffer)
+ − 960 return current_buffer->name;
+ − 961 if (!NILP (tem))
+ − 962 {
+ − 963 if (!NILP (unique))
+ − 964 newname = Fgenerate_new_buffer_name (newname, current_buffer->name);
+ − 965 else
+ − 966 error ("Buffer name \"%s\" is in use",
+ − 967 XSTRING_DATA (newname));
+ − 968 }
+ − 969
+ − 970 current_buffer->name = newname;
+ − 971
+ − 972 /* Catch redisplay's attention. Unless we do this, the modelines for
+ − 973 any windows displaying current_buffer will stay unchanged. */
+ − 974 MARK_MODELINE_CHANGED;
+ − 975
+ − 976 buf = Fcurrent_buffer ();
+ − 977
+ − 978 /* The aconses in the Vbuffer_alist are shared with frame->buffer_alist,
+ − 979 so this will change it in the per-frame ordering as well. */
+ − 980 Fsetcar (Frassq (buf, Vbuffer_alist), newname);
442
+ − 981
428
+ − 982 if (NILP (current_buffer->filename)
+ − 983 && !NILP (current_buffer->auto_save_file_name))
+ − 984 call0 (Qrename_auto_save_file);
+ − 985 /* refetch since that last call may have done GC */
+ − 986 /* (hypothetical relocating GC) */
+ − 987 return current_buffer->name;
+ − 988 }
+ − 989
+ − 990 DEFUN ("other-buffer", Fother_buffer, 0, 3, 0, /*
+ − 991 Return most recently selected buffer other than BUFFER.
+ − 992 Buffers not visible in windows are preferred to visible buffers,
+ − 993 unless optional third argument VISIBLE-OK is non-nil.
+ − 994 If no other buffer exists, the buffer `*scratch*' is returned.
+ − 995 If BUFFER is omitted or nil, some interesting buffer is returned.
+ − 996
+ − 997 The ordering is for this frame; If second optional argument FRAME
+ − 998 is provided, then the ordering is for that frame. If the second arg
+ − 999 is t, then the global ordering is returned.
+ − 1000
+ − 1001 Note: In FSF Emacs, this function takes two arguments: BUFFER and
+ − 1002 VISIBLE-OK.
+ − 1003 */
+ − 1004 (buffer, frame, visible_ok))
+ − 1005 {
+ − 1006 /* This function can GC */
+ − 1007 Lisp_Object tail, buf, notsogood, tem;
+ − 1008 Lisp_Object alist;
+ − 1009
+ − 1010 notsogood = Qnil;
+ − 1011
+ − 1012 if (EQ (frame, Qt))
+ − 1013 alist = Vbuffer_alist;
+ − 1014 else
+ − 1015 {
+ − 1016 struct frame *f = decode_frame (frame);
+ − 1017
+ − 1018 XSETFRAME (frame, f);
+ − 1019 alist = f->buffer_alist;
+ − 1020 }
+ − 1021
+ − 1022 for (tail = alist; !NILP (tail); tail = Fcdr (tail))
+ − 1023 {
+ − 1024 buf = Fcdr (Fcar (tail));
+ − 1025 if (EQ (buf, buffer))
+ − 1026 continue;
+ − 1027 if (string_byte (XSTRING (XBUFFER (buf)->name), 0) == ' ')
+ − 1028 continue;
+ − 1029 /* If FRAME has a buffer_predicate,
+ − 1030 disregard buffers that don't fit the predicate. */
+ − 1031 if (FRAMEP (frame))
+ − 1032 {
+ − 1033 tem = XFRAME (frame)->buffer_predicate;
+ − 1034 if (!NILP (tem))
+ − 1035 {
+ − 1036 tem = call1 (tem, buf);
+ − 1037 if (NILP (tem))
+ − 1038 continue;
+ − 1039 }
+ − 1040 }
+ − 1041
+ − 1042 if (NILP (visible_ok))
+ − 1043 {
+ − 1044 /* get-buffer-window will handle nil or t frame */
+ − 1045 tem = Fget_buffer_window (buf, frame, Qnil);
+ − 1046 }
+ − 1047 else
+ − 1048 tem = Qnil;
+ − 1049 if (NILP (tem))
+ − 1050 return buf;
+ − 1051 if (NILP (notsogood))
+ − 1052 notsogood = buf;
+ − 1053 }
+ − 1054 if (!NILP (notsogood))
+ − 1055 return notsogood;
+ − 1056 return Fget_buffer_create (QSscratch);
+ − 1057 }
+ − 1058
+ − 1059 DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, 0, 1, "", /*
444
+ − 1060 Stop keeping undo information for BUFFER.
428
+ − 1061 Any undo records it already has are discarded.
+ − 1062 No argument or nil as argument means do this for the current buffer.
+ − 1063 */
+ − 1064 (buffer))
+ − 1065 {
+ − 1066 /* Allowing nil is an RMSism */
+ − 1067 struct buffer *real_buf = decode_buffer (buffer, 1);
+ − 1068 real_buf->undo_list = Qt;
+ − 1069 return Qnil;
+ − 1070 }
+ − 1071
+ − 1072 DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, 0, 1, "", /*
444
+ − 1073 Start keeping undo information for BUFFER.
428
+ − 1074 No argument or nil as argument means do this for the current buffer.
+ − 1075 */
+ − 1076 (buffer))
+ − 1077 {
+ − 1078 /* Allowing nil is an RMSism */
+ − 1079 struct buffer *real_buf = decode_buffer (buffer, 1);
+ − 1080 if (EQ (real_buf->undo_list, Qt))
+ − 1081 real_buf->undo_list = Qnil;
+ − 1082
+ − 1083 return Qnil;
+ − 1084 }
+ − 1085
+ − 1086 DEFUN ("kill-buffer", Fkill_buffer, 1, 1, "bKill buffer: ", /*
+ − 1087 Kill the buffer BUFFER.
+ − 1088 The argument may be a buffer or may be the name of a buffer.
+ − 1089 An argument of nil means kill the current buffer.
+ − 1090
+ − 1091 Value is t if the buffer is actually killed, nil if user says no.
+ − 1092
+ − 1093 The value of `kill-buffer-hook' (which may be local to that buffer),
+ − 1094 if not void, is a list of functions to be called, with no arguments,
+ − 1095 before the buffer is actually killed. The buffer to be killed is current
+ − 1096 when the hook functions are called.
+ − 1097
+ − 1098 Any processes that have this buffer as the `process-buffer' are killed
+ − 1099 with `delete-process'.
+ − 1100 */
+ − 1101 (buffer))
+ − 1102 {
+ − 1103 /* This function can call lisp */
+ − 1104 Lisp_Object buf;
+ − 1105 REGISTER struct buffer *b;
+ − 1106 struct gcpro gcpro1, gcpro2;
+ − 1107
+ − 1108 if (NILP (buffer))
+ − 1109 buf = Fcurrent_buffer ();
+ − 1110 else if (BUFFERP (buffer))
+ − 1111 buf = buffer;
+ − 1112 else
+ − 1113 {
+ − 1114 buf = get_buffer (buffer, 0);
+ − 1115 if (NILP (buf)) nsberror (buffer);
+ − 1116 }
+ − 1117
+ − 1118 b = XBUFFER (buf);
+ − 1119
+ − 1120 /* OK to delete an already-deleted buffer. */
+ − 1121 if (!BUFFER_LIVE_P (b))
+ − 1122 return Qnil;
+ − 1123
+ − 1124 /* Don't kill the minibuffer now current. */
+ − 1125 if (EQ (buf, Vminibuffer_zero))
+ − 1126 return Qnil;
+ − 1127
+ − 1128 /* Or the echo area. */
+ − 1129 if (EQ (buf, Vecho_area_buffer))
+ − 1130 return Qnil;
+ − 1131
+ − 1132 /* Query if the buffer is still modified. */
+ − 1133 if (INTERACTIVE && !NILP (b->filename)
+ − 1134 && BUF_MODIFF (b) > BUF_SAVE_MODIFF (b))
+ − 1135 {
+ − 1136 Lisp_Object killp;
+ − 1137 GCPRO1 (buf);
+ − 1138 killp = call1
+ − 1139 (Qyes_or_no_p,
+ − 1140 (emacs_doprnt_string_c
442
+ − 1141 ((const Bufbyte *) GETTEXT ("Buffer %s modified; kill anyway? "),
428
+ − 1142 Qnil, -1, XSTRING_DATA (b->name))));
+ − 1143 UNGCPRO;
+ − 1144 if (NILP (killp))
+ − 1145 return Qnil;
+ − 1146 b = XBUFFER (buf); /* Hypothetical relocating GC. */
+ − 1147 }
+ − 1148
+ − 1149 /* Run hooks with the buffer to be killed temporarily selected,
+ − 1150 unless the buffer is already dead (could have been deleted
+ − 1151 in the question above).
+ − 1152 */
+ − 1153 if (BUFFER_LIVE_P (b))
+ − 1154 {
+ − 1155 int speccount = specpdl_depth ();
+ − 1156 Lisp_Object tail = Qnil;
+ − 1157
+ − 1158 GCPRO2 (buf, tail);
+ − 1159 record_unwind_protect (save_excursion_restore, save_excursion_save ());
+ − 1160 Fset_buffer (buf);
+ − 1161
+ − 1162 /* First run the query functions; if any query is answered no,
+ − 1163 don't kill the buffer. */
+ − 1164 EXTERNAL_LIST_LOOP (tail, Vkill_buffer_query_functions)
+ − 1165 {
+ − 1166 if (NILP (call0 (Fcar (tail))))
+ − 1167 {
+ − 1168 UNGCPRO;
+ − 1169 return unbind_to (speccount, Qnil);
+ − 1170 }
+ − 1171 }
+ − 1172
+ − 1173 /* Then run the hooks. */
+ − 1174 run_hook (Qkill_buffer_hook);
442
+ − 1175
+ − 1176 /* Inform the selection code that a buffer just got killed.
+ − 1177 We do this in C because (a) it's faster, and (b) it needs
+ − 1178 to access data internal to select.c that can't be seen from
+ − 1179 Lisp (so the Lisp code would just call into C anyway. */
+ − 1180 select_notify_buffer_kill (buf);
+ − 1181
428
+ − 1182 unbind_to (speccount, Qnil);
+ − 1183 UNGCPRO;
+ − 1184 b = XBUFFER (buf); /* Hypothetical relocating GC. */
+ − 1185 }
+ − 1186
+ − 1187 /* We have no more questions to ask. Verify that it is valid
+ − 1188 to kill the buffer. This must be done after the questions
+ − 1189 since anything can happen within yes-or-no-p. */
+ − 1190
+ − 1191 /* Might have been deleted during the last question above */
+ − 1192 if (!BUFFER_LIVE_P (b))
+ − 1193 return Qnil;
+ − 1194
+ − 1195 /* Don't kill the minibuffer now current. */
+ − 1196 if (EQ (buf, XWINDOW (minibuf_window)->buffer))
+ − 1197 return Qnil;
+ − 1198
+ − 1199 /* When we kill a base buffer, kill all its indirect buffers.
+ − 1200 We do it at this stage so nothing terrible happens if they
+ − 1201 ask questions or their hooks get errors. */
+ − 1202 if (! b->base_buffer)
+ − 1203 {
+ − 1204 Lisp_Object rest;
+ − 1205
+ − 1206 GCPRO1 (buf);
+ − 1207
+ − 1208 LIST_LOOP (rest, b->indirect_children)
+ − 1209 {
+ − 1210 Fkill_buffer (XCAR (rest));
+ − 1211 /* Keep indirect_children updated in case a
+ − 1212 query-function/hook throws. */
+ − 1213 b->indirect_children = XCDR (rest);
+ − 1214 }
+ − 1215
+ − 1216 UNGCPRO;
+ − 1217 }
+ − 1218
+ − 1219 /* Make this buffer not be current.
+ − 1220 In the process, notice if this is the sole visible buffer
+ − 1221 and give up if so. */
+ − 1222 if (b == current_buffer)
+ − 1223 {
+ − 1224 Fset_buffer (Fother_buffer (buf, Qnil, Qnil));
+ − 1225 if (b == current_buffer)
+ − 1226 return Qnil;
+ − 1227 }
+ − 1228
+ − 1229 /* Now there is no question: we can kill the buffer. */
+ − 1230
+ − 1231 #ifdef CLASH_DETECTION
+ − 1232 /* Unlock this buffer's file, if it is locked. unlock_buffer
+ − 1233 can both GC and kill the current buffer, and wreak general
+ − 1234 havok by running lisp code. */
+ − 1235 GCPRO1 (buf);
+ − 1236 unlock_buffer (b);
+ − 1237 UNGCPRO;
+ − 1238 b = XBUFFER (buf);
+ − 1239
+ − 1240 if (!BUFFER_LIVE_P (b))
+ − 1241 return Qnil;
+ − 1242
+ − 1243 if (b == current_buffer)
+ − 1244 {
+ − 1245 Fset_buffer (Fother_buffer (buf, Qnil, Qnil));
+ − 1246 if (b == current_buffer)
+ − 1247 return Qnil;
+ − 1248 }
+ − 1249 #endif /* CLASH_DETECTION */
+ − 1250
+ − 1251 {
+ − 1252 int speccount = specpdl_depth ();
+ − 1253 specbind (Qinhibit_quit, Qt);
+ − 1254
+ − 1255 kill_buffer_processes (buf);
+ − 1256
442
+ − 1257 delete_from_buffer_alist (buf);
+ − 1258
428
+ − 1259 /* #### This is a problem if this buffer is in a dedicated window.
+ − 1260 Need to undedicate any windows of this buffer first (and delete them?)
+ − 1261 */
448
+ − 1262 GCPRO1 (buf);
+ − 1263 Freplace_buffer_in_windows (buf, Qnil, Qall);
+ − 1264 UNGCPRO;
428
+ − 1265
+ − 1266 font_lock_buffer_was_killed (b);
+ − 1267
+ − 1268 /* Delete any auto-save file, if we saved it in this session. */
+ − 1269 if (STRINGP (b->auto_save_file_name)
+ − 1270 && b->auto_save_modified != 0
+ − 1271 && BUF_SAVE_MODIFF (b) < b->auto_save_modified)
+ − 1272 {
+ − 1273 if (delete_auto_save_files != 0)
+ − 1274 {
+ − 1275 /* deleting the auto save file might kill b! */
+ − 1276 /* #### dmoore - fix this crap, we do this same gcpro and
+ − 1277 buffer liveness check multiple times. Let's get a
+ − 1278 macro or something for it. */
+ − 1279 GCPRO1 (buf);
+ − 1280 internal_delete_file (b->auto_save_file_name);
+ − 1281 UNGCPRO;
+ − 1282 b = XBUFFER (buf);
+ − 1283
+ − 1284 if (!BUFFER_LIVE_P (b))
+ − 1285 return Qnil;
+ − 1286
+ − 1287 if (b == current_buffer)
+ − 1288 {
+ − 1289 Fset_buffer (Fother_buffer (buf, Qnil, Qnil));
+ − 1290 if (b == current_buffer)
+ − 1291 return Qnil;
+ − 1292 }
+ − 1293 }
+ − 1294 }
+ − 1295
+ − 1296 uninit_buffer_markers (b);
+ − 1297
+ − 1298 kill_buffer_local_variables (b);
+ − 1299
+ − 1300 b->name = Qnil;
+ − 1301 uninit_buffer_text (b);
+ − 1302 b->undo_list = Qnil;
+ − 1303 uninit_buffer_extents (b);
+ − 1304 if (b->base_buffer)
+ − 1305 {
+ − 1306 #ifdef ERROR_CHECK_BUFPOS
+ − 1307 assert (!NILP (memq_no_quit (buf, b->base_buffer->indirect_children)));
+ − 1308 #endif
+ − 1309 b->base_buffer->indirect_children =
+ − 1310 delq_no_quit (buf, b->base_buffer->indirect_children);
+ − 1311 }
+ − 1312
+ − 1313 /* Clear away all Lisp objects, so that they
+ − 1314 won't be protected from GC. */
+ − 1315 nuke_all_buffer_slots (b, Qnil);
+ − 1316
+ − 1317 unbind_to (speccount, Qnil);
+ − 1318 }
+ − 1319 return Qt;
+ − 1320 }
+ − 1321
+ − 1322 DEFUN ("record-buffer", Frecord_buffer, 1, 1, 0, /*
+ − 1323 Place buffer BUFFER first in the buffer order.
+ − 1324 Call this function when a buffer is selected "visibly".
+ − 1325
+ − 1326 This function changes the global buffer order and the per-frame buffer
+ − 1327 order for the selected frame. The buffer order keeps track of recency
+ − 1328 of selection so that `other-buffer' will return a recently selected
+ − 1329 buffer. See `other-buffer' for more information.
+ − 1330 */
+ − 1331 (buffer))
+ − 1332 {
+ − 1333 REGISTER Lisp_Object lynk, prev;
+ − 1334 struct frame *f = selected_frame ();
+ − 1335
+ − 1336 prev = Qnil;
+ − 1337 for (lynk = Vbuffer_alist; CONSP (lynk); lynk = XCDR (lynk))
+ − 1338 {
+ − 1339 if (EQ (XCDR (XCAR (lynk)), buffer))
+ − 1340 break;
+ − 1341 prev = lynk;
+ − 1342 }
+ − 1343 /* Effectively do Vbuffer_alist = delq_no_quit (lynk, Vbuffer_alist) */
+ − 1344 if (NILP (prev))
+ − 1345 Vbuffer_alist = XCDR (Vbuffer_alist);
+ − 1346 else
+ − 1347 XCDR (prev) = XCDR (XCDR (prev));
+ − 1348 XCDR (lynk) = Vbuffer_alist;
+ − 1349 Vbuffer_alist = lynk;
+ − 1350
+ − 1351 /* That was the global one. Now do the same thing for the
+ − 1352 per-frame buffer-alist. */
+ − 1353 prev = Qnil;
+ − 1354 for (lynk = f->buffer_alist; CONSP (lynk); lynk = XCDR (lynk))
+ − 1355 {
+ − 1356 if (EQ (XCDR (XCAR (lynk)), buffer))
+ − 1357 break;
+ − 1358 prev = lynk;
+ − 1359 }
+ − 1360 /* Effectively do f->buffer_alist = delq_no_quit (lynk, f->buffer_alist) */
+ − 1361 if (NILP (prev))
+ − 1362 f->buffer_alist = XCDR (f->buffer_alist);
+ − 1363 else
+ − 1364 XCDR (prev) = XCDR (XCDR (prev));
+ − 1365 XCDR (lynk) = f->buffer_alist;
+ − 1366 f->buffer_alist = lynk;
+ − 1367
+ − 1368 return Qnil;
+ − 1369 }
+ − 1370
+ − 1371 DEFUN ("set-buffer-major-mode", Fset_buffer_major_mode, 1, 1, 0, /*
+ − 1372 Set an appropriate major mode for BUFFER, according to `default-major-mode'.
+ − 1373 Use this function before selecting the buffer, since it may need to inspect
+ − 1374 the current buffer's major mode.
+ − 1375 */
+ − 1376 (buffer))
+ − 1377 {
+ − 1378 int speccount = specpdl_depth ();
+ − 1379 Lisp_Object function = XBUFFER (Vbuffer_defaults)->major_mode;
+ − 1380
+ − 1381 if (NILP (function))
+ − 1382 {
+ − 1383 Lisp_Object tem = Fget (current_buffer->major_mode, Qmode_class, Qnil);
+ − 1384 if (NILP (tem))
+ − 1385 function = current_buffer->major_mode;
+ − 1386 }
+ − 1387
+ − 1388 if (NILP (function) || EQ (function, Qfundamental_mode))
+ − 1389 return Qnil;
+ − 1390
+ − 1391 /* To select a nonfundamental mode,
+ − 1392 select the buffer temporarily and then call the mode function. */
+ − 1393
+ − 1394 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
+ − 1395
+ − 1396 Fset_buffer (buffer);
+ − 1397 call0 (function);
+ − 1398
+ − 1399 return unbind_to (speccount, Qnil);
+ − 1400 }
+ − 1401
+ − 1402 void
+ − 1403 switch_to_buffer (Lisp_Object bufname, Lisp_Object norecord)
+ − 1404 {
+ − 1405 call2 (Qswitch_to_buffer, bufname, norecord);
+ − 1406 }
+ − 1407
+ − 1408
+ − 1409 DEFUN ("current-buffer", Fcurrent_buffer, 0, 0, 0, /*
+ − 1410 Return the current buffer as a Lisp object.
+ − 1411 */
+ − 1412 ())
+ − 1413 {
+ − 1414 Lisp_Object buffer;
+ − 1415 XSETBUFFER (buffer, current_buffer);
+ − 1416 return buffer;
+ − 1417 }
+ − 1418
+ − 1419 /* Set the current buffer to B. */
+ − 1420
+ − 1421 void
+ − 1422 set_buffer_internal (struct buffer *b)
+ − 1423 {
+ − 1424 REGISTER struct buffer *old_buf;
+ − 1425 REGISTER Lisp_Object tail;
+ − 1426
+ − 1427 if (current_buffer == b)
+ − 1428 return;
+ − 1429
+ − 1430 INVALIDATE_PIXEL_TO_GLYPH_CACHE;
+ − 1431
+ − 1432 old_buf = current_buffer;
+ − 1433 current_buffer = b;
+ − 1434 invalidate_current_column (); /* invalidate indentation cache */
+ − 1435
+ − 1436 if (old_buf)
+ − 1437 {
+ − 1438 /* Put the undo list back in the base buffer, so that it appears
+ − 1439 that an indirect buffer shares the undo list of its base. */
+ − 1440 if (old_buf->base_buffer)
+ − 1441 old_buf->base_buffer->undo_list = old_buf->undo_list;
+ − 1442 }
+ − 1443
+ − 1444 /* Get the undo list from the base buffer, so that it appears
+ − 1445 that an indirect buffer shares the undo list of its base. */
+ − 1446 if (b->base_buffer)
+ − 1447 b->undo_list = b->base_buffer->undo_list;
+ − 1448
+ − 1449 /* Look down buffer's list of local Lisp variables
+ − 1450 to find and update any that forward into C variables. */
+ − 1451
+ − 1452 LIST_LOOP (tail, b->local_var_alist)
+ − 1453 {
+ − 1454 Lisp_Object sym = XCAR (XCAR (tail));
+ − 1455 Lisp_Object valcontents = XSYMBOL (sym)->value;
+ − 1456 if (SYMBOL_VALUE_MAGIC_P (valcontents))
+ − 1457 {
+ − 1458 /* Just reference the variable
+ − 1459 to cause it to become set for this buffer. */
+ − 1460 /* Use find_symbol_value_quickly to avoid an unnecessary O(n)
+ − 1461 lookup. */
+ − 1462 (void) find_symbol_value_quickly (XCAR (tail), 1);
+ − 1463 }
+ − 1464 }
+ − 1465
+ − 1466 /* Do the same with any others that were local to the previous buffer */
+ − 1467
+ − 1468 if (old_buf)
+ − 1469 {
+ − 1470 LIST_LOOP (tail, old_buf->local_var_alist)
+ − 1471 {
+ − 1472 Lisp_Object sym = XCAR (XCAR (tail));
+ − 1473 Lisp_Object valcontents = XSYMBOL (sym)->value;
+ − 1474
+ − 1475 if (SYMBOL_VALUE_MAGIC_P (valcontents))
+ − 1476 {
+ − 1477 /* Just reference the variable
+ − 1478 to cause it to become set for this buffer. */
+ − 1479 /* Use find_symbol_value_quickly with find_it_p as 0 to avoid an
+ − 1480 unnecessary O(n) lookup which is guaranteed to be worst case.
+ − 1481 Any symbols which are local are guaranteed to have been
+ − 1482 handled in the previous loop, above. */
+ − 1483 (void) find_symbol_value_quickly (sym, 0);
+ − 1484 }
+ − 1485 }
+ − 1486 }
+ − 1487 }
+ − 1488
+ − 1489 DEFUN ("set-buffer", Fset_buffer, 1, 1, 0, /*
+ − 1490 Make the buffer BUFFER current for editing operations.
+ − 1491 BUFFER may be a buffer or the name of an existing buffer.
+ − 1492 See also `save-excursion' when you want to make a buffer current temporarily.
+ − 1493 This function does not display the buffer, so its effect ends
+ − 1494 when the current command terminates.
+ − 1495 Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently.
+ − 1496 */
+ − 1497 (buffer))
+ − 1498 {
+ − 1499 buffer = get_buffer (buffer, 0);
+ − 1500 if (NILP (buffer))
+ − 1501 error ("Selecting deleted or non-existent buffer");
+ − 1502 set_buffer_internal (XBUFFER (buffer));
+ − 1503 return buffer;
+ − 1504 }
+ − 1505
+ − 1506
+ − 1507 DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only, 0, 3, 0, /*
444
+ − 1508 Signal a `buffer-read-only' error if BUFFER is read-only.
428
+ − 1509 Optional argument BUFFER defaults to the current buffer.
+ − 1510
+ − 1511 If optional argument START is non-nil, all extents in the buffer
+ − 1512 which overlap that part of the buffer are checked to ensure none has a
+ − 1513 `read-only' property. (Extents that lie completely within the range,
+ − 1514 however, are not checked.) END defaults to the value of START.
+ − 1515
+ − 1516 If START and END are equal, the range checked is [START, END] (i.e.
+ − 1517 closed on both ends); otherwise, the range checked is (START, END)
+ − 1518 \(open on both ends), except that extents that lie completely within
+ − 1519 [START, END] are not checked. See `extent-in-region-p' for a fuller
+ − 1520 discussion.
+ − 1521 */
+ − 1522 (buffer, start, end))
+ − 1523 {
+ − 1524 struct buffer *b = decode_buffer (buffer, 0);
+ − 1525 Bufpos s, e;
+ − 1526
+ − 1527 if (NILP (start))
+ − 1528 s = e = -1;
+ − 1529 else
+ − 1530 {
+ − 1531 if (NILP (end))
+ − 1532 end = start;
+ − 1533 get_buffer_range_char (b, start, end, &s, &e, 0);
+ − 1534 }
+ − 1535 barf_if_buffer_read_only (b, s, e);
+ − 1536
+ − 1537 return Qnil;
+ − 1538 }
+ − 1539
+ − 1540 static void
+ − 1541 bury_buffer_1 (Lisp_Object buffer, Lisp_Object before,
+ − 1542 Lisp_Object *buffer_alist)
+ − 1543 {
+ − 1544 Lisp_Object aelt = rassq_no_quit (buffer, *buffer_alist);
+ − 1545 Lisp_Object lynk = memq_no_quit (aelt, *buffer_alist);
+ − 1546 Lisp_Object iter, before_before;
+ − 1547
+ − 1548 *buffer_alist = delq_no_quit (aelt, *buffer_alist);
+ − 1549 for (before_before = Qnil, iter = *buffer_alist;
+ − 1550 !NILP (iter) && !EQ (XCDR (XCAR (iter)), before);
+ − 1551 before_before = iter, iter = XCDR (iter))
+ − 1552 ;
+ − 1553 XCDR (lynk) = iter;
+ − 1554 if (!NILP (before_before))
+ − 1555 XCDR (before_before) = lynk;
+ − 1556 else
+ − 1557 *buffer_alist = lynk;
+ − 1558 }
+ − 1559
+ − 1560 DEFUN ("bury-buffer", Fbury_buffer, 0, 2, "", /*
+ − 1561 Put BUFFER at the end of the list of all buffers.
+ − 1562 There it is the least likely candidate for `other-buffer' to return;
+ − 1563 thus, the least likely buffer for \\[switch-to-buffer] to select by default.
+ − 1564 If BUFFER is nil or omitted, bury the current buffer.
+ − 1565 Also, if BUFFER is nil or omitted, remove the current buffer from the
+ − 1566 selected window if it is displayed there.
434
+ − 1567 Because of this, you may need to specify (current-buffer) as
+ − 1568 BUFFER when calling from minibuffer.
428
+ − 1569 If BEFORE is non-nil, it specifies a buffer before which BUFFER
+ − 1570 will be placed, instead of being placed at the end.
+ − 1571 */
+ − 1572 (buffer, before))
+ − 1573 {
+ − 1574 /* This function can GC */
+ − 1575 struct buffer *buf = decode_buffer (buffer, 1);
+ − 1576 /* If we're burying the current buffer, unshow it. */
+ − 1577 /* Note that the behavior of (bury-buffer nil) and
+ − 1578 (bury-buffer (current-buffer)) is not the same.
+ − 1579 This is illogical but is historical. Changing it
+ − 1580 breaks mh-e and TeX and such packages. */
+ − 1581 if (NILP (buffer))
+ − 1582 switch_to_buffer (Fother_buffer (Fcurrent_buffer (), Qnil, Qnil), Qnil);
+ − 1583 XSETBUFFER (buffer, buf);
+ − 1584
+ − 1585 if (!NILP (before))
+ − 1586 before = get_buffer (before, 1);
+ − 1587
+ − 1588 if (EQ (before, buffer))
+ − 1589 error ("Cannot place a buffer before itself");
+ − 1590
+ − 1591 bury_buffer_1 (buffer, before, &Vbuffer_alist);
+ − 1592 bury_buffer_1 (buffer, before, &selected_frame ()->buffer_alist);
+ − 1593
+ − 1594 return Qnil;
+ − 1595 }
+ − 1596
+ − 1597
+ − 1598 DEFUN ("erase-buffer", Ferase_buffer, 0, 1, "*", /*
+ − 1599 Delete the entire contents of the BUFFER.
+ − 1600 Any clipping restriction in effect (see `narrow-to-region') is removed,
+ − 1601 so the buffer is truly empty after this.
+ − 1602 BUFFER defaults to the current buffer if omitted.
+ − 1603 */
+ − 1604 (buffer))
+ − 1605 {
+ − 1606 /* This function can GC */
+ − 1607 struct buffer *b = decode_buffer (buffer, 1);
+ − 1608 /* #### yuck yuck yuck. This is gross. The old echo-area code,
+ − 1609 however, was the only place that called erase_buffer() with a
+ − 1610 non-zero NO_CLIP argument.
+ − 1611
+ − 1612 Someone needs to fix up the redisplay code so it is smarter
+ − 1613 about this, so that the NO_CLIP junk isn't necessary. */
+ − 1614 int no_clip = (b == XBUFFER (Vecho_area_buffer));
+ − 1615
+ − 1616 INVALIDATE_PIXEL_TO_GLYPH_CACHE;
+ − 1617
+ − 1618 widen_buffer (b, no_clip);
+ − 1619 buffer_delete_range (b, BUF_BEG (b), BUF_Z (b), 0);
+ − 1620 b->last_window_start = 1;
+ − 1621
+ − 1622 /* Prevent warnings, or suspension of auto saving, that would happen
+ − 1623 if future size is less than past size. Use of erase-buffer
+ − 1624 implies that the future text is not really related to the past text. */
+ − 1625 b->saved_size = Qzero;
+ − 1626
+ − 1627 return Qnil;
+ − 1628 }
+ − 1629
+ − 1630
+ − 1631
+ − 1632 DEFUN ("kill-all-local-variables", Fkill_all_local_variables, 0, 0, 0, /*
+ − 1633 Switch to Fundamental mode by killing current buffer's local variables.
+ − 1634 Most local variable bindings are eliminated so that the default values
+ − 1635 become effective once more. Also, the syntax table is set from
+ − 1636 `standard-syntax-table', the category table is set from
+ − 1637 `standard-category-table' (if support for Mule exists), local keymap is set
+ − 1638 to nil, the abbrev table is set from `fundamental-mode-abbrev-table',
+ − 1639 and all specifier specifications whose locale is the current buffer
+ − 1640 are removed. This function also forces redisplay of the modeline.
+ − 1641
+ − 1642 Every function to select a new major mode starts by
+ − 1643 calling this function.
+ − 1644
+ − 1645 As a special exception, local variables whose names have
+ − 1646 a non-nil `permanent-local' property are not eliminated by this function.
+ − 1647
+ − 1648 The first thing this function does is run
+ − 1649 the normal hook `change-major-mode-hook'.
+ − 1650 */
+ − 1651 ())
+ − 1652 {
+ − 1653 /* This function can GC */
+ − 1654 run_hook (Qchange_major_mode_hook);
+ − 1655
+ − 1656 reset_buffer_local_variables (current_buffer, 0);
+ − 1657
+ − 1658 kill_buffer_local_variables (current_buffer);
+ − 1659
+ − 1660 kill_specifier_buffer_locals (Fcurrent_buffer ());
+ − 1661
+ − 1662 /* Force modeline redisplay. Useful here because all major mode
+ − 1663 commands call this function. */
+ − 1664 MARK_MODELINE_CHANGED;
+ − 1665
+ − 1666 return Qnil;
+ − 1667 }
+ − 1668
+ − 1669 #ifdef MEMORY_USAGE_STATS
+ − 1670
+ − 1671 struct buffer_stats
+ − 1672 {
+ − 1673 int text;
+ − 1674 int markers;
+ − 1675 int extents;
+ − 1676 int other;
+ − 1677 };
+ − 1678
+ − 1679 static size_t
+ − 1680 compute_buffer_text_usage (struct buffer *b, struct overhead_stats *ovstats)
+ − 1681 {
+ − 1682 int was_requested = b->text->z - 1;
+ − 1683 size_t gap = b->text->gap_size + b->text->end_gap_size;
+ − 1684 size_t malloc_use = malloced_storage_size (b->text->beg, was_requested + gap, 0);
+ − 1685
+ − 1686 ovstats->gap_overhead += gap;
+ − 1687 ovstats->was_requested += was_requested;
+ − 1688 ovstats->malloc_overhead += malloc_use - (was_requested + gap);
+ − 1689 return malloc_use;
+ − 1690 }
+ − 1691
+ − 1692 static void
+ − 1693 compute_buffer_usage (struct buffer *b, struct buffer_stats *stats,
+ − 1694 struct overhead_stats *ovstats)
+ − 1695 {
+ − 1696 xzero (*stats);
+ − 1697 stats->other += malloced_storage_size (b, sizeof (*b), ovstats);
+ − 1698 stats->text += compute_buffer_text_usage (b, ovstats);
+ − 1699 stats->markers += compute_buffer_marker_usage (b, ovstats);
+ − 1700 stats->extents += compute_buffer_extent_usage (b, ovstats);
+ − 1701 }
+ − 1702
+ − 1703 DEFUN ("buffer-memory-usage", Fbuffer_memory_usage, 1, 1, 0, /*
+ − 1704 Return stats about the memory usage of buffer BUFFER.
+ − 1705 The values returned are in the form of an alist of usage types and byte
+ − 1706 counts. The byte counts attempt to encompass all the memory used
+ − 1707 by the buffer (separate from the memory logically associated with a
+ − 1708 buffer or frame), including internal structures and any malloc()
+ − 1709 overhead associated with them. In practice, the byte counts are
+ − 1710 underestimated because certain memory usage is very hard to determine
+ − 1711 \(e.g. the amount of memory used inside the Xt library or inside the
+ − 1712 X server) and because there is other stuff that might logically
+ − 1713 be associated with a window, buffer, or frame (e.g. window configurations,
+ − 1714 glyphs) but should not obviously be included in the usage counts.
+ − 1715
+ − 1716 Multiple slices of the total memory usage may be returned, separated
+ − 1717 by a nil. Each slice represents a particular view of the memory, a
+ − 1718 particular way of partitioning it into groups. Within a slice, there
+ − 1719 is no overlap between the groups of memory, and each slice collectively
+ − 1720 represents all the memory concerned.
+ − 1721 */
+ − 1722 (buffer))
+ − 1723 {
+ − 1724 struct buffer_stats stats;
+ − 1725 struct overhead_stats ovstats;
+ − 1726 Lisp_Object val = Qnil;
+ − 1727
+ − 1728 CHECK_BUFFER (buffer); /* dead buffers should be allowed, no? */
+ − 1729 xzero (ovstats);
+ − 1730 compute_buffer_usage (XBUFFER (buffer), &stats, &ovstats);
+ − 1731
+ − 1732 val = acons (Qtext, make_int (stats.text), val);
+ − 1733 val = acons (Qmarkers, make_int (stats.markers), val);
+ − 1734 val = acons (Qextents, make_int (stats.extents), val);
+ − 1735 val = acons (Qother, make_int (stats.other), val);
+ − 1736 val = Fcons (Qnil, val);
+ − 1737 val = acons (Qactually_requested, make_int (ovstats.was_requested), val);
+ − 1738 val = acons (Qmalloc_overhead, make_int (ovstats.malloc_overhead), val);
+ − 1739 val = acons (Qgap_overhead, make_int (ovstats.gap_overhead), val);
+ − 1740 val = acons (Qdynarr_overhead, make_int (ovstats.dynarr_overhead), val);
+ − 1741
+ − 1742 return Fnreverse (val);
+ − 1743 }
+ − 1744
+ − 1745 #endif /* MEMORY_USAGE_STATS */
+ − 1746
440
+ − 1747
+ − 1748 /************************************************************************/
+ − 1749 /* Implement TO_EXTERNAL_FORMAT, TO_INTERNAL_FORMAT */
+ − 1750 /************************************************************************/
+ − 1751
+ − 1752 /* This implementation should probably be elsewhere, but it can't be
+ − 1753 in file-coding.c since that file is only available if FILE_CODING
+ − 1754 is defined. */
+ − 1755 #ifdef FILE_CODING
+ − 1756 static int
+ − 1757 coding_system_is_binary (Lisp_Object coding_system)
+ − 1758 {
+ − 1759 Lisp_Coding_System *cs = XCODING_SYSTEM (coding_system);
+ − 1760 return
+ − 1761 (CODING_SYSTEM_TYPE (cs) == CODESYS_NO_CONVERSION &&
+ − 1762 CODING_SYSTEM_EOL_TYPE (cs) == EOL_LF &&
+ − 1763 EQ (CODING_SYSTEM_POST_READ_CONVERSION (cs), Qnil) &&
+ − 1764 EQ (CODING_SYSTEM_PRE_WRITE_CONVERSION (cs), Qnil));
+ − 1765 }
+ − 1766 #else
+ − 1767 #define coding_system_is_binary(coding_system) 1
+ − 1768 #endif
+ − 1769
442
+ − 1770 typedef struct
+ − 1771 {
+ − 1772 Dynarr_declare (Bufbyte_dynarr *);
+ − 1773 } Bufbyte_dynarr_dynarr;
+ − 1774
+ − 1775 typedef struct
+ − 1776 {
+ − 1777 Dynarr_declare (Extbyte_dynarr *);
+ − 1778 } Extbyte_dynarr_dynarr;
+ − 1779
+ − 1780 static Extbyte_dynarr_dynarr *conversion_out_dynarr_list;
+ − 1781 static Bufbyte_dynarr_dynarr *conversion_in_dynarr_list;
440
+ − 1782
+ − 1783 static int dfc_convert_to_external_format_in_use;
+ − 1784 static int dfc_convert_to_internal_format_in_use;
+ − 1785
+ − 1786 static Lisp_Object
+ − 1787 dfc_convert_to_external_format_reset_in_use (Lisp_Object value)
+ − 1788 {
+ − 1789 dfc_convert_to_external_format_in_use = XINT (value);
+ − 1790 return Qnil;
+ − 1791 }
+ − 1792
+ − 1793 static Lisp_Object
+ − 1794 dfc_convert_to_internal_format_reset_in_use (Lisp_Object value)
+ − 1795 {
+ − 1796 dfc_convert_to_internal_format_in_use = XINT (value);
+ − 1797 return Qnil;
+ − 1798 }
+ − 1799
+ − 1800 void
+ − 1801 dfc_convert_to_external_format (dfc_conversion_type source_type,
+ − 1802 dfc_conversion_data *source,
+ − 1803 #ifdef FILE_CODING
+ − 1804 Lisp_Object coding_system,
+ − 1805 #endif
+ − 1806 dfc_conversion_type sink_type,
+ − 1807 dfc_conversion_data *sink)
+ − 1808 {
+ − 1809 int count = specpdl_depth ();
442
+ − 1810 Extbyte_dynarr *conversion_out_dynarr;
440
+ − 1811
+ − 1812 type_checking_assert
+ − 1813 (((source_type == DFC_TYPE_DATA) ||
+ − 1814 (source_type == DFC_TYPE_LISP_LSTREAM && LSTREAMP (source->lisp_object)) ||
+ − 1815 (source_type == DFC_TYPE_LISP_STRING && STRINGP (source->lisp_object)))
+ − 1816 &&
+ − 1817 ((sink_type == DFC_TYPE_DATA) ||
+ − 1818 (sink_type == DFC_TYPE_LISP_LSTREAM && LSTREAMP (source->lisp_object))));
+ − 1819
+ − 1820 record_unwind_protect (dfc_convert_to_external_format_reset_in_use,
442
+ − 1821 make_int (dfc_convert_to_external_format_in_use));
+ − 1822 if (Dynarr_length (conversion_out_dynarr_list) <=
+ − 1823 dfc_convert_to_external_format_in_use)
+ − 1824 Dynarr_add (conversion_out_dynarr_list, Dynarr_new (Extbyte));
+ − 1825 conversion_out_dynarr = Dynarr_at (conversion_out_dynarr_list,
+ − 1826 dfc_convert_to_external_format_in_use);
+ − 1827 dfc_convert_to_external_format_in_use++;
+ − 1828 Dynarr_reset (conversion_out_dynarr);
440
+ − 1829
+ − 1830 #ifdef FILE_CODING
+ − 1831 coding_system = Fget_coding_system (coding_system);
+ − 1832 #endif
+ − 1833
+ − 1834 /* Here we optimize in the case where the coding system does no
+ − 1835 conversion. However, we don't want to optimize in case the source
+ − 1836 or sink is an lstream, since writing to an lstream can cause a
+ − 1837 garbage collection, and this could be problematic if the source
+ − 1838 is a lisp string. */
+ − 1839 if (source_type != DFC_TYPE_LISP_LSTREAM &&
+ − 1840 sink_type != DFC_TYPE_LISP_LSTREAM &&
+ − 1841 coding_system_is_binary (coding_system))
+ − 1842 {
+ − 1843 const Bufbyte *ptr;
+ − 1844 Bytecount len;
+ − 1845
+ − 1846 if (source_type == DFC_TYPE_LISP_STRING)
+ − 1847 {
+ − 1848 ptr = XSTRING_DATA (source->lisp_object);
+ − 1849 len = XSTRING_LENGTH (source->lisp_object);
+ − 1850 }
+ − 1851 else
+ − 1852 {
+ − 1853 ptr = (Bufbyte *) source->data.ptr;
+ − 1854 len = source->data.len;
+ − 1855 }
+ − 1856
+ − 1857 #ifdef MULE
+ − 1858 {
+ − 1859 const Bufbyte *end;
+ − 1860 for (end = ptr + len; ptr < end;)
+ − 1861 {
+ − 1862 Bufbyte c =
+ − 1863 (BYTE_ASCII_P (*ptr)) ? *ptr :
+ − 1864 (*ptr == LEADING_BYTE_CONTROL_1) ? (*(ptr+1) - 0x20) :
+ − 1865 (*ptr == LEADING_BYTE_LATIN_ISO8859_1) ? (*(ptr+1)) :
+ − 1866 '~';
+ − 1867
+ − 1868 Dynarr_add (conversion_out_dynarr, (Extbyte) c);
+ − 1869 INC_CHARPTR (ptr);
+ − 1870 }
+ − 1871 bufpos_checking_assert (ptr == end);
+ − 1872 }
+ − 1873 #else
+ − 1874 Dynarr_add_many (conversion_out_dynarr, ptr, len);
+ − 1875 #endif
+ − 1876
+ − 1877 }
+ − 1878 else
+ − 1879 {
+ − 1880 Lisp_Object streams_to_delete[3];
+ − 1881 int delete_count = 0;
+ − 1882 Lisp_Object instream, outstream;
+ − 1883 Lstream *reader, *writer;
+ − 1884 struct gcpro gcpro1, gcpro2;
+ − 1885
+ − 1886 if (source_type == DFC_TYPE_LISP_LSTREAM)
+ − 1887 instream = source->lisp_object;
+ − 1888 else if (source_type == DFC_TYPE_DATA)
+ − 1889 streams_to_delete[delete_count++] = instream =
+ − 1890 make_fixed_buffer_input_stream (source->data.ptr, source->data.len);
+ − 1891 else
+ − 1892 {
+ − 1893 type_checking_assert (source_type == DFC_TYPE_LISP_STRING);
+ − 1894 streams_to_delete[delete_count++] = instream =
+ − 1895 make_lisp_string_input_stream (source->lisp_object, 0, -1);
+ − 1896 }
+ − 1897
+ − 1898 if (sink_type == DFC_TYPE_LISP_LSTREAM)
+ − 1899 outstream = sink->lisp_object;
+ − 1900 else
+ − 1901 {
+ − 1902 type_checking_assert (sink_type == DFC_TYPE_DATA);
+ − 1903 streams_to_delete[delete_count++] = outstream =
+ − 1904 make_dynarr_output_stream
+ − 1905 ((unsigned_char_dynarr *) conversion_out_dynarr);
+ − 1906 }
+ − 1907
+ − 1908 #ifdef FILE_CODING
+ − 1909 streams_to_delete[delete_count++] = outstream =
+ − 1910 make_encoding_output_stream (XLSTREAM (outstream), coding_system);
+ − 1911 #endif
+ − 1912
+ − 1913 reader = XLSTREAM (instream);
+ − 1914 writer = XLSTREAM (outstream);
+ − 1915 /* decoding_stream will gc-protect outstream */
+ − 1916 GCPRO2 (instream, outstream);
+ − 1917
+ − 1918 while (1)
+ − 1919 {
462
+ − 1920 Lstream_data_count size_in_bytes;
440
+ − 1921 char tempbuf[1024]; /* some random amount */
+ − 1922
+ − 1923 size_in_bytes = Lstream_read (reader, tempbuf, sizeof (tempbuf));
+ − 1924
+ − 1925 if (size_in_bytes == 0)
+ − 1926 break;
+ − 1927 else if (size_in_bytes < 0)
+ − 1928 error ("Error converting to external format");
+ − 1929
+ − 1930 size_in_bytes = Lstream_write (writer, tempbuf, size_in_bytes);
+ − 1931
+ − 1932 if (size_in_bytes <= 0)
+ − 1933 error ("Error converting to external format");
+ − 1934 }
+ − 1935
+ − 1936 /* Closing writer will close any stream at the other end of writer. */
+ − 1937 Lstream_close (writer);
+ − 1938 Lstream_close (reader);
+ − 1939 UNGCPRO;
+ − 1940
+ − 1941 /* The idea is that this function will create no garbage. */
+ − 1942 while (delete_count)
+ − 1943 Lstream_delete (XLSTREAM (streams_to_delete [--delete_count]));
+ − 1944 }
+ − 1945
+ − 1946 unbind_to (count, Qnil);
+ − 1947
+ − 1948 if (sink_type != DFC_TYPE_LISP_LSTREAM)
+ − 1949 {
+ − 1950 sink->data.len = Dynarr_length (conversion_out_dynarr);
444
+ − 1951 Dynarr_add (conversion_out_dynarr, '\0'); /* NUL-terminate! */
440
+ − 1952 sink->data.ptr = Dynarr_atp (conversion_out_dynarr, 0);
+ − 1953 }
+ − 1954 }
+ − 1955
+ − 1956 void
+ − 1957 dfc_convert_to_internal_format (dfc_conversion_type source_type,
+ − 1958 dfc_conversion_data *source,
+ − 1959 #ifdef FILE_CODING
+ − 1960 Lisp_Object coding_system,
+ − 1961 #endif
+ − 1962 dfc_conversion_type sink_type,
+ − 1963 dfc_conversion_data *sink)
+ − 1964 {
+ − 1965 int count = specpdl_depth ();
442
+ − 1966 Bufbyte_dynarr *conversion_in_dynarr;
440
+ − 1967
+ − 1968 type_checking_assert
+ − 1969 ((source_type == DFC_TYPE_DATA ||
+ − 1970 source_type == DFC_TYPE_LISP_LSTREAM)
+ − 1971 &&
+ − 1972 (sink_type == DFC_TYPE_DATA ||
+ − 1973 sink_type == DFC_TYPE_LISP_LSTREAM));
+ − 1974
+ − 1975 record_unwind_protect (dfc_convert_to_internal_format_reset_in_use,
442
+ − 1976 make_int (dfc_convert_to_internal_format_in_use));
+ − 1977 if (Dynarr_length (conversion_in_dynarr_list) <=
+ − 1978 dfc_convert_to_internal_format_in_use)
+ − 1979 Dynarr_add (conversion_in_dynarr_list, Dynarr_new (Bufbyte));
+ − 1980 conversion_in_dynarr = Dynarr_at (conversion_in_dynarr_list,
+ − 1981 dfc_convert_to_internal_format_in_use);
+ − 1982 dfc_convert_to_internal_format_in_use++;
+ − 1983 Dynarr_reset (conversion_in_dynarr);
440
+ − 1984
+ − 1985 #ifdef FILE_CODING
+ − 1986 coding_system = Fget_coding_system (coding_system);
+ − 1987 #endif
+ − 1988
+ − 1989 if (source_type != DFC_TYPE_LISP_LSTREAM &&
+ − 1990 sink_type != DFC_TYPE_LISP_LSTREAM &&
+ − 1991 coding_system_is_binary (coding_system))
+ − 1992 {
+ − 1993 #ifdef MULE
+ − 1994 const Bufbyte *ptr = (const Bufbyte *) source->data.ptr;
+ − 1995 Bytecount len = source->data.len;
+ − 1996 const Bufbyte *end = ptr + len;
+ − 1997
+ − 1998 for (; ptr < end; ptr++)
+ − 1999 {
444
+ − 2000 Bufbyte c = *ptr;
440
+ − 2001
+ − 2002 if (BYTE_ASCII_P (c))
+ − 2003 Dynarr_add (conversion_in_dynarr, c);
+ − 2004 else if (BYTE_C1_P (c))
+ − 2005 {
+ − 2006 Dynarr_add (conversion_in_dynarr, LEADING_BYTE_CONTROL_1);
+ − 2007 Dynarr_add (conversion_in_dynarr, c + 0x20);
+ − 2008 }
+ − 2009 else
+ − 2010 {
+ − 2011 Dynarr_add (conversion_in_dynarr, LEADING_BYTE_LATIN_ISO8859_1);
+ − 2012 Dynarr_add (conversion_in_dynarr, c);
+ − 2013 }
+ − 2014 }
+ − 2015 #else
+ − 2016 Dynarr_add_many (conversion_in_dynarr, source->data.ptr, source->data.len);
+ − 2017 #endif
+ − 2018 }
+ − 2019 else
+ − 2020 {
+ − 2021 Lisp_Object streams_to_delete[3];
+ − 2022 int delete_count = 0;
+ − 2023 Lisp_Object instream, outstream;
+ − 2024 Lstream *reader, *writer;
+ − 2025 struct gcpro gcpro1, gcpro2;
+ − 2026
+ − 2027 if (source_type == DFC_TYPE_LISP_LSTREAM)
+ − 2028 instream = source->lisp_object;
+ − 2029 else
+ − 2030 {
+ − 2031 type_checking_assert (source_type == DFC_TYPE_DATA);
+ − 2032 streams_to_delete[delete_count++] = instream =
+ − 2033 make_fixed_buffer_input_stream (source->data.ptr, source->data.len);
+ − 2034 }
+ − 2035
+ − 2036 if (sink_type == DFC_TYPE_LISP_LSTREAM)
+ − 2037 outstream = sink->lisp_object;
+ − 2038 else
+ − 2039 {
+ − 2040 type_checking_assert (sink_type == DFC_TYPE_DATA);
+ − 2041 streams_to_delete[delete_count++] = outstream =
+ − 2042 make_dynarr_output_stream
+ − 2043 ((unsigned_char_dynarr *) conversion_in_dynarr);
+ − 2044 }
+ − 2045
+ − 2046 #ifdef FILE_CODING
+ − 2047 streams_to_delete[delete_count++] = outstream =
+ − 2048 make_decoding_output_stream (XLSTREAM (outstream), coding_system);
+ − 2049 #endif
+ − 2050
+ − 2051 reader = XLSTREAM (instream);
+ − 2052 writer = XLSTREAM (outstream);
+ − 2053 /* outstream will gc-protect its sink stream, if necessary */
+ − 2054 GCPRO2 (instream, outstream);
+ − 2055
+ − 2056 while (1)
+ − 2057 {
462
+ − 2058 Lstream_data_count size_in_bytes;
440
+ − 2059 char tempbuf[1024]; /* some random amount */
+ − 2060
+ − 2061 size_in_bytes = Lstream_read (reader, tempbuf, sizeof (tempbuf));
+ − 2062
+ − 2063 if (size_in_bytes == 0)
+ − 2064 break;
+ − 2065 else if (size_in_bytes < 0)
+ − 2066 error ("Error converting to internal format");
+ − 2067
+ − 2068 size_in_bytes = Lstream_write (writer, tempbuf, size_in_bytes);
+ − 2069
+ − 2070 if (size_in_bytes <= 0)
+ − 2071 error ("Error converting to internal format");
+ − 2072 }
+ − 2073
+ − 2074 /* Closing writer will close any stream at the other end of writer. */
+ − 2075 Lstream_close (writer);
+ − 2076 Lstream_close (reader);
+ − 2077 UNGCPRO;
+ − 2078
+ − 2079 /* The idea is that this function will create no garbage. */
+ − 2080 while (delete_count)
+ − 2081 Lstream_delete (XLSTREAM (streams_to_delete [--delete_count]));
+ − 2082 }
+ − 2083
+ − 2084 unbind_to (count, Qnil);
+ − 2085
+ − 2086 if (sink_type != DFC_TYPE_LISP_LSTREAM)
+ − 2087 {
+ − 2088 sink->data.len = Dynarr_length (conversion_in_dynarr);
444
+ − 2089 Dynarr_add (conversion_in_dynarr, '\0'); /* NUL-terminate! */
440
+ − 2090 sink->data.ptr = Dynarr_atp (conversion_in_dynarr, 0);
+ − 2091 }
+ − 2092 }
+ − 2093
+ − 2094
428
+ − 2095 void
+ − 2096 syms_of_buffer (void)
+ − 2097 {
442
+ − 2098 INIT_LRECORD_IMPLEMENTATION (buffer);
+ − 2099
428
+ − 2100 defsymbol (&Qbuffer_live_p, "buffer-live-p");
+ − 2101 defsymbol (&Qbuffer_or_string_p, "buffer-or-string-p");
+ − 2102 defsymbol (&Qmode_class, "mode-class");
+ − 2103 defsymbol (&Qrename_auto_save_file, "rename-auto-save-file");
+ − 2104 defsymbol (&Qkill_buffer_hook, "kill-buffer-hook");
+ − 2105 defsymbol (&Qpermanent_local, "permanent-local");
+ − 2106
+ − 2107 defsymbol (&Qfirst_change_hook, "first-change-hook");
+ − 2108 defsymbol (&Qbefore_change_functions, "before-change-functions");
+ − 2109 defsymbol (&Qafter_change_functions, "after-change-functions");
+ − 2110
+ − 2111 /* #### Obsolete, for compatibility */
+ − 2112 defsymbol (&Qbefore_change_function, "before-change-function");
+ − 2113 defsymbol (&Qafter_change_function, "after-change-function");
+ − 2114
+ − 2115 defsymbol (&Qdefault_directory, "default-directory");
+ − 2116
+ − 2117 defsymbol (&Qget_file_buffer, "get-file-buffer");
+ − 2118 defsymbol (&Qchange_major_mode_hook, "change-major-mode-hook");
+ − 2119
+ − 2120 defsymbol (&Qfundamental_mode, "fundamental-mode");
+ − 2121
+ − 2122 defsymbol (&Qfind_file_compare_truenames, "find-file-compare-truenames");
+ − 2123
+ − 2124 defsymbol (&Qswitch_to_buffer, "switch-to-buffer");
+ − 2125
+ − 2126 DEFSUBR (Fbufferp);
+ − 2127 DEFSUBR (Fbuffer_live_p);
+ − 2128 DEFSUBR (Fbuffer_list);
+ − 2129 DEFSUBR (Fdecode_buffer);
+ − 2130 DEFSUBR (Fget_buffer);
+ − 2131 DEFSUBR (Fget_file_buffer);
+ − 2132 DEFSUBR (Fget_buffer_create);
+ − 2133 DEFSUBR (Fmake_indirect_buffer);
+ − 2134
+ − 2135 DEFSUBR (Fgenerate_new_buffer_name);
+ − 2136 DEFSUBR (Fbuffer_name);
+ − 2137 DEFSUBR (Fbuffer_file_name);
+ − 2138 DEFSUBR (Fbuffer_base_buffer);
+ − 2139 DEFSUBR (Fbuffer_indirect_children);
+ − 2140 DEFSUBR (Fbuffer_local_variables);
+ − 2141 DEFSUBR (Fbuffer_modified_p);
+ − 2142 DEFSUBR (Fset_buffer_modified_p);
+ − 2143 DEFSUBR (Fbuffer_modified_tick);
+ − 2144 DEFSUBR (Frename_buffer);
+ − 2145 DEFSUBR (Fother_buffer);
+ − 2146 DEFSUBR (Fbuffer_disable_undo);
+ − 2147 DEFSUBR (Fbuffer_enable_undo);
+ − 2148 DEFSUBR (Fkill_buffer);
+ − 2149 DEFSUBR (Ferase_buffer);
+ − 2150 DEFSUBR (Frecord_buffer);
+ − 2151 DEFSUBR (Fset_buffer_major_mode);
+ − 2152 DEFSUBR (Fcurrent_buffer);
+ − 2153 DEFSUBR (Fset_buffer);
+ − 2154 DEFSUBR (Fbarf_if_buffer_read_only);
+ − 2155 DEFSUBR (Fbury_buffer);
+ − 2156 DEFSUBR (Fkill_all_local_variables);
+ − 2157 #ifdef MEMORY_USAGE_STATS
+ − 2158 DEFSUBR (Fbuffer_memory_usage);
+ − 2159 #endif
+ − 2160
442
+ − 2161 DEFERROR (Qprotected_field, "Attempt to modify a protected field",
+ − 2162 Qinvalid_change);
428
+ − 2163 }
+ − 2164
+ − 2165 void
+ − 2166 reinit_vars_of_buffer (void)
+ − 2167 {
442
+ − 2168 conversion_in_dynarr_list = Dynarr_new2 (Bufbyte_dynarr_dynarr,
+ − 2169 Bufbyte_dynarr *);
+ − 2170 conversion_out_dynarr_list = Dynarr_new2 (Extbyte_dynarr_dynarr,
+ − 2171 Extbyte_dynarr *);
440
+ − 2172
428
+ − 2173 staticpro_nodump (&Vbuffer_alist);
+ − 2174 Vbuffer_alist = Qnil;
+ − 2175 current_buffer = 0;
+ − 2176 }
+ − 2177
+ − 2178 /* initialize the buffer routines */
+ − 2179 void
+ − 2180 vars_of_buffer (void)
+ − 2181 {
+ − 2182 /* This function can GC */
+ − 2183 reinit_vars_of_buffer ();
+ − 2184
+ − 2185 staticpro (&QSFundamental);
+ − 2186 staticpro (&QSscratch);
+ − 2187
+ − 2188 QSFundamental = build_string ("Fundamental");
+ − 2189 QSscratch = build_string (DEFER_GETTEXT ("*scratch*"));
+ − 2190
+ − 2191 DEFVAR_LISP ("change-major-mode-hook", &Vchange_major_mode_hook /*
+ − 2192 List of hooks to be run before killing local variables in a buffer.
+ − 2193 This should be used by any mode that temporarily alters the contents or
+ − 2194 the read-only state of the buffer. See also `kill-all-local-variables'.
+ − 2195 */ );
+ − 2196 Vchange_major_mode_hook = Qnil;
+ − 2197
+ − 2198 DEFVAR_BOOL ("find-file-compare-truenames", &find_file_compare_truenames /*
444
+ − 2199 If this is true, then the `find-file' command will check the truenames
428
+ − 2200 of all visited files when deciding whether a given file is already in
444
+ − 2201 a buffer, instead of just `buffer-file-name'. This means that if you
+ − 2202 attempt to visit another file which is a symbolic link to a file which
+ − 2203 is already in a buffer, the existing buffer will be found instead of a
+ − 2204 newly-created one. This works if any component of the pathname
+ − 2205 (including a non-terminal component) is a symbolic link as well, but
+ − 2206 doesn't work with hard links (nothing does).
+ − 2207
+ − 2208 See also the variable `find-file-use-truenames'.
428
+ − 2209 */ );
446
+ − 2210 #if defined(CYGWIN) || defined(WIN32_NATIVE)
+ − 2211 find_file_compare_truenames = 1;
+ − 2212 #else
428
+ − 2213 find_file_compare_truenames = 0;
446
+ − 2214 #endif
428
+ − 2215
+ − 2216 DEFVAR_BOOL ("find-file-use-truenames", &find_file_use_truenames /*
+ − 2217 If this is true, then a buffer's visited file-name will always be
+ − 2218 chased back to the real file; it will never be a symbolic link, and there
+ − 2219 will never be a symbolic link anywhere in its directory path.
+ − 2220 That is, the buffer-file-name and buffer-file-truename will be equal.
+ − 2221 This doesn't work with hard links.
+ − 2222
444
+ − 2223 See also the variable `find-file-compare-truenames'.
428
+ − 2224 */ );
+ − 2225 find_file_use_truenames = 0;
+ − 2226
+ − 2227 DEFVAR_LISP ("before-change-functions", &Vbefore_change_functions /*
+ − 2228 List of functions to call before each text change.
+ − 2229 Two arguments are passed to each function: the positions of
+ − 2230 the beginning and end of the range of old text to be changed.
+ − 2231 \(For an insertion, the beginning and end are at the same place.)
+ − 2232 No information is given about the length of the text after the change.
+ − 2233
+ − 2234 Buffer changes made while executing the `before-change-functions'
+ − 2235 don't call any before-change or after-change functions.
+ − 2236 */ );
+ − 2237 Vbefore_change_functions = Qnil;
+ − 2238
+ − 2239 /* FSF Emacs has the following additional doc at the end of
+ − 2240 before-change-functions and after-change-functions:
+ − 2241
+ − 2242 That's because these variables are temporarily set to nil.
+ − 2243 As a result, a hook function cannot straightforwardly alter the value of
+ − 2244 these variables. See the Emacs Lisp manual for a way of
+ − 2245 accomplishing an equivalent result by using other variables.
+ − 2246
+ − 2247 But this doesn't apply under XEmacs because things are
+ − 2248 handled better. */
+ − 2249
+ − 2250 DEFVAR_LISP ("after-change-functions", &Vafter_change_functions /*
+ − 2251 List of functions to call after each text change.
+ − 2252 Three arguments are passed to each function: the positions of
+ − 2253 the beginning and end of the range of changed text,
+ − 2254 and the length of the pre-change text replaced by that range.
+ − 2255 \(For an insertion, the pre-change length is zero;
+ − 2256 for a deletion, that length is the number of characters deleted,
+ − 2257 and the post-change beginning and end are at the same place.)
+ − 2258
+ − 2259 Buffer changes made while executing `after-change-functions'
+ − 2260 don't call any before-change or after-change functions.
+ − 2261 */ );
+ − 2262 Vafter_change_functions = Qnil;
+ − 2263
+ − 2264 DEFVAR_LISP ("before-change-function", &Vbefore_change_function /*
+ − 2265
+ − 2266 */ ); /* obsoleteness will be documented */
+ − 2267 Vbefore_change_function = Qnil;
+ − 2268
+ − 2269 DEFVAR_LISP ("after-change-function", &Vafter_change_function /*
+ − 2270
+ − 2271 */ ); /* obsoleteness will be documented */
+ − 2272 Vafter_change_function = Qnil;
+ − 2273
+ − 2274 DEFVAR_LISP ("first-change-hook", &Vfirst_change_hook /*
+ − 2275 A list of functions to call before changing a buffer which is unmodified.
+ − 2276 The functions are run using the `run-hooks' function.
+ − 2277 */ );
+ − 2278 Vfirst_change_hook = Qnil;
+ − 2279
+ − 2280 #if 0 /* FSFmacs */
+ − 2281 xxDEFVAR_LISP ("transient-mark-mode", &Vtransient_mark_mode /*
+ − 2282 *Non-nil means deactivate the mark when the buffer contents change.
+ − 2283 */ );
+ − 2284 Vtransient_mark_mode = Qnil;
+ − 2285 #endif /* FSFmacs */
+ − 2286
+ − 2287 DEFVAR_INT ("undo-threshold", &undo_threshold /*
+ − 2288 Keep no more undo information once it exceeds this size.
+ − 2289 This threshold is applied when garbage collection happens.
+ − 2290 The size is counted as the number of bytes occupied,
+ − 2291 which includes both saved text and other data.
+ − 2292 */ );
+ − 2293 undo_threshold = 20000;
+ − 2294
+ − 2295 DEFVAR_INT ("undo-high-threshold", &undo_high_threshold /*
+ − 2296 Don't keep more than this much size of undo information.
+ − 2297 A command which pushes past this size is itself forgotten.
+ − 2298 This threshold is applied when garbage collection happens.
+ − 2299 The size is counted as the number of bytes occupied,
+ − 2300 which includes both saved text and other data.
+ − 2301 */ );
+ − 2302 undo_high_threshold = 30000;
+ − 2303
+ − 2304 DEFVAR_LISP ("inhibit-read-only", &Vinhibit_read_only /*
+ − 2305 *Non-nil means disregard read-only status of buffers or characters.
+ − 2306 If the value is t, disregard `buffer-read-only' and all `read-only'
+ − 2307 text properties. If the value is a list, disregard `buffer-read-only'
+ − 2308 and disregard a `read-only' extent property or text property if the
+ − 2309 property value is a member of the list.
+ − 2310 */ );
+ − 2311 Vinhibit_read_only = Qnil;
+ − 2312
+ − 2313 DEFVAR_LISP ("kill-buffer-query-functions", &Vkill_buffer_query_functions /*
+ − 2314 List of functions called with no args to query before killing a buffer.
+ − 2315 */ );
+ − 2316 Vkill_buffer_query_functions = Qnil;
+ − 2317
+ − 2318 DEFVAR_BOOL ("delete-auto-save-files", &delete_auto_save_files /*
+ − 2319 *Non-nil means delete auto-save file when a buffer is saved or killed.
+ − 2320 */ );
+ − 2321 delete_auto_save_files = 1;
+ − 2322 }
+ − 2323
+ − 2324 /* The docstrings for DEFVAR_* are recorded externally by make-docfile. */
+ − 2325
+ − 2326 /* Renamed from DEFVAR_PER_BUFFER because FSFmacs D_P_B takes
+ − 2327 a bogus extra arg, which confuses an otherwise identical make-docfile.c */
+ − 2328 #define DEFVAR_BUFFER_LOCAL_1(lname, field_name, forward_type, magicfun) do { \
442
+ − 2329 static const struct symbol_value_forward I_hate_C = \
+ − 2330 { /* struct symbol_value_forward */ \
+ − 2331 { /* struct symbol_value_magic */ \
+ − 2332 { /* struct lcrecord_header */ \
+ − 2333 { /* struct lrecord_header */ \
+ − 2334 lrecord_type_symbol_value_forward, /* lrecord_type_index */ \
+ − 2335 1, /* mark bit */ \
+ − 2336 1, /* c_readonly bit */ \
+ − 2337 1 /* lisp_readonly bit */ \
+ − 2338 }, \
+ − 2339 0, /* next */ \
+ − 2340 0, /* uid */ \
+ − 2341 0 /* free */ \
+ − 2342 }, \
+ − 2343 &(buffer_local_flags.field_name), \
+ − 2344 forward_type \
+ − 2345 }, \
+ − 2346 magicfun \
+ − 2347 }; \
+ − 2348 \
428
+ − 2349 { \
+ − 2350 int offset = ((char *)symbol_value_forward_forward (&I_hate_C) - \
+ − 2351 (char *)&buffer_local_flags); \
+ − 2352 defvar_magic (lname, &I_hate_C); \
+ − 2353 \
+ − 2354 *((Lisp_Object *)(offset + (char *)XBUFFER (Vbuffer_local_symbols))) \
+ − 2355 = intern (lname); \
+ − 2356 } \
+ − 2357 } while (0)
+ − 2358
+ − 2359 #define DEFVAR_BUFFER_LOCAL_MAGIC(lname, field_name, magicfun) \
+ − 2360 DEFVAR_BUFFER_LOCAL_1 (lname, field_name, \
+ − 2361 SYMVAL_CURRENT_BUFFER_FORWARD, magicfun)
+ − 2362 #define DEFVAR_BUFFER_LOCAL(lname, field_name) \
+ − 2363 DEFVAR_BUFFER_LOCAL_MAGIC (lname, field_name, 0)
+ − 2364 #define DEFVAR_CONST_BUFFER_LOCAL_MAGIC(lname, field_name, magicfun) \
+ − 2365 DEFVAR_BUFFER_LOCAL_1 (lname, field_name, \
+ − 2366 SYMVAL_CONST_CURRENT_BUFFER_FORWARD, magicfun)
+ − 2367 #define DEFVAR_CONST_BUFFER_LOCAL(lname, field_name) \
+ − 2368 DEFVAR_CONST_BUFFER_LOCAL_MAGIC (lname, field_name, 0)
+ − 2369
+ − 2370 #define DEFVAR_BUFFER_DEFAULTS_MAGIC(lname, field_name, magicfun) \
+ − 2371 DEFVAR_SYMVAL_FWD (lname, &(buffer_local_flags.field_name), \
+ − 2372 SYMVAL_DEFAULT_BUFFER_FORWARD, magicfun)
+ − 2373 #define DEFVAR_BUFFER_DEFAULTS(lname, field_name) \
+ − 2374 DEFVAR_BUFFER_DEFAULTS_MAGIC (lname, field_name, 0)
+ − 2375
+ − 2376 static void
+ − 2377 nuke_all_buffer_slots (struct buffer *b, Lisp_Object zap)
+ − 2378 {
+ − 2379 zero_lcrecord (b);
+ − 2380
+ − 2381 b->extent_info = Qnil;
+ − 2382 b->indirect_children = Qnil;
+ − 2383 b->own_text.line_number_cache = Qnil;
+ − 2384
+ − 2385 #define MARKED_SLOT(x) b->x = zap
+ − 2386 #include "bufslots.h"
+ − 2387 #undef MARKED_SLOT
+ − 2388 }
+ − 2389
+ − 2390 static void
+ − 2391 common_init_complex_vars_of_buffer (void)
+ − 2392 {
+ − 2393 /* Make sure all markable slots in buffer_defaults
+ − 2394 are initialized reasonably, so mark_buffer won't choke. */
+ − 2395 struct buffer *defs = alloc_lcrecord_type (struct buffer, &lrecord_buffer);
+ − 2396 struct buffer *syms = alloc_lcrecord_type (struct buffer, &lrecord_buffer);
+ − 2397
+ − 2398 staticpro_nodump (&Vbuffer_defaults);
+ − 2399 staticpro_nodump (&Vbuffer_local_symbols);
+ − 2400 XSETBUFFER (Vbuffer_defaults, defs);
+ − 2401 XSETBUFFER (Vbuffer_local_symbols, syms);
+ − 2402
+ − 2403 nuke_all_buffer_slots (syms, Qnil);
+ − 2404 nuke_all_buffer_slots (defs, Qnil);
+ − 2405 defs->text = &defs->own_text;
+ − 2406 syms->text = &syms->own_text;
+ − 2407
+ − 2408 /* Set up the non-nil default values of various buffer slots.
+ − 2409 Must do these before making the first buffer. */
+ − 2410 defs->major_mode = Qfundamental_mode;
+ − 2411 defs->mode_name = QSFundamental;
+ − 2412 defs->abbrev_table = Qnil; /* real default setup by Lisp code */
+ − 2413
446
+ − 2414 defs->case_table = Vstandard_case_table;
428
+ − 2415 #ifdef MULE
+ − 2416 defs->category_table = Vstandard_category_table;
+ − 2417 #endif /* MULE */
+ − 2418 defs->syntax_table = Vstandard_syntax_table;
+ − 2419 defs->mirror_syntax_table =
+ − 2420 XCHAR_TABLE (Vstandard_syntax_table)->mirror_table;
+ − 2421 defs->modeline_format = build_string ("%-"); /* reset in loaddefs.el */
+ − 2422 defs->case_fold_search = Qt;
+ − 2423 defs->selective_display_ellipses = Qt;
+ − 2424 defs->tab_width = make_int (8);
+ − 2425 defs->ctl_arrow = Qt;
+ − 2426 defs->fill_column = make_int (70);
+ − 2427 defs->left_margin = Qzero;
+ − 2428 defs->saved_size = Qzero; /* lisp code wants int-or-nil */
+ − 2429 defs->modtime = 0;
+ − 2430 defs->auto_save_modified = 0;
+ − 2431 defs->auto_save_failure_time = -1;
+ − 2432 defs->invisibility_spec = Qt;
448
+ − 2433 defs->buffer_local_face_property = 0;
428
+ − 2434
+ − 2435 defs->indirect_children = Qnil;
+ − 2436 syms->indirect_children = Qnil;
+ − 2437
+ − 2438 {
+ − 2439 /* 0 means var is always local. Default used only at creation.
+ − 2440 * -1 means var is always local. Default used only at reset and
+ − 2441 * creation.
+ − 2442 * -2 means there's no lisp variable corresponding to this slot
+ − 2443 * and the default is only used at creation.
+ − 2444 * -3 means no Lisp variable. Default used only at reset and creation.
+ − 2445 * >0 is mask. Var is local if ((buffer->local_var_flags & mask) != 0)
+ − 2446 * Otherwise default is used.
+ − 2447 */
+ − 2448 Lisp_Object always_local_no_default = make_int (0);
+ − 2449 Lisp_Object always_local_resettable = make_int (-1);
+ − 2450 Lisp_Object resettable = make_int (-3);
+ − 2451
+ − 2452 /* Assign the local-flags to the slots that have default values.
+ − 2453 The local flag is a bit that is used in the buffer
+ − 2454 to say that it has its own local value for the slot.
+ − 2455 The local flag bits are in the local_var_flags slot of the
+ − 2456 buffer. */
+ − 2457
+ − 2458 nuke_all_buffer_slots (&buffer_local_flags, make_int (-2));
+ − 2459 buffer_local_flags.filename = always_local_no_default;
+ − 2460 buffer_local_flags.directory = always_local_no_default;
+ − 2461 buffer_local_flags.backed_up = always_local_no_default;
+ − 2462 buffer_local_flags.saved_size = always_local_no_default;
+ − 2463 buffer_local_flags.auto_save_file_name = always_local_no_default;
+ − 2464 buffer_local_flags.read_only = always_local_no_default;
+ − 2465
+ − 2466 buffer_local_flags.major_mode = always_local_resettable;
+ − 2467 buffer_local_flags.mode_name = always_local_resettable;
+ − 2468 buffer_local_flags.undo_list = always_local_no_default;
+ − 2469 #if 0 /* FSFmacs */
+ − 2470 buffer_local_flags.mark_active = always_local_resettable;
+ − 2471 #endif
+ − 2472 buffer_local_flags.point_before_scroll = always_local_resettable;
+ − 2473 buffer_local_flags.file_truename = always_local_no_default;
+ − 2474 buffer_local_flags.invisibility_spec = always_local_resettable;
+ − 2475 buffer_local_flags.file_format = always_local_resettable;
+ − 2476 buffer_local_flags.generated_modeline_string = always_local_no_default;
+ − 2477
+ − 2478 buffer_local_flags.keymap = resettable;
446
+ − 2479 buffer_local_flags.case_table = resettable;
428
+ − 2480 buffer_local_flags.syntax_table = resettable;
+ − 2481 #ifdef MULE
+ − 2482 buffer_local_flags.category_table = resettable;
+ − 2483 #endif
+ − 2484
+ − 2485 buffer_local_flags.modeline_format = make_int (1<<0);
+ − 2486 buffer_local_flags.abbrev_mode = make_int (1<<1);
+ − 2487 buffer_local_flags.overwrite_mode = make_int (1<<2);
+ − 2488 buffer_local_flags.case_fold_search = make_int (1<<3);
+ − 2489 buffer_local_flags.auto_fill_function = make_int (1<<4);
+ − 2490 buffer_local_flags.selective_display = make_int (1<<5);
+ − 2491 buffer_local_flags.selective_display_ellipses = make_int (1<<6);
+ − 2492 buffer_local_flags.tab_width = make_int (1<<7);
+ − 2493 buffer_local_flags.truncate_lines = make_int (1<<8);
+ − 2494 buffer_local_flags.ctl_arrow = make_int (1<<9);
+ − 2495 buffer_local_flags.fill_column = make_int (1<<10);
+ − 2496 buffer_local_flags.left_margin = make_int (1<<11);
+ − 2497 buffer_local_flags.abbrev_table = make_int (1<<12);
+ − 2498 #ifdef REGION_CACHE_NEEDS_WORK
+ − 2499 buffer_local_flags.cache_long_line_scans = make_int (1<<13);
+ − 2500 #endif
+ − 2501 #ifdef FILE_CODING
+ − 2502 buffer_local_flags.buffer_file_coding_system = make_int (1<<14);
+ − 2503 #endif
+ − 2504
+ − 2505 /* #### Warning: 1<<31 is the largest number currently allowable
+ − 2506 due to the XINT() handling of this value. With some
+ − 2507 rearrangement you can get 3 more bits. */
+ − 2508 }
+ − 2509 }
+ − 2510
+ − 2511 #define BUFFER_SLOTS_SIZE (offsetof (struct buffer, BUFFER_SLOTS_LAST_NAME) - offsetof (struct buffer, BUFFER_SLOTS_FIRST_NAME) + sizeof (Lisp_Object))
+ − 2512 #define BUFFER_SLOTS_COUNT (BUFFER_SLOTS_SIZE / sizeof (Lisp_Object))
+ − 2513
+ − 2514 void
+ − 2515 reinit_complex_vars_of_buffer (void)
+ − 2516 {
+ − 2517 struct buffer *defs, *syms;
+ − 2518
+ − 2519 common_init_complex_vars_of_buffer ();
+ − 2520
+ − 2521 defs = XBUFFER (Vbuffer_defaults);
+ − 2522 syms = XBUFFER (Vbuffer_local_symbols);
+ − 2523 memcpy (&defs->BUFFER_SLOTS_FIRST_NAME,
+ − 2524 buffer_defaults_saved_slots,
+ − 2525 BUFFER_SLOTS_SIZE);
+ − 2526 memcpy (&syms->BUFFER_SLOTS_FIRST_NAME,
+ − 2527 buffer_local_symbols_saved_slots,
+ − 2528 BUFFER_SLOTS_SIZE);
+ − 2529 }
+ − 2530
+ − 2531
+ − 2532 static const struct lrecord_description buffer_slots_description_1[] = {
440
+ − 2533 { XD_LISP_OBJECT_ARRAY, 0, BUFFER_SLOTS_COUNT },
428
+ − 2534 { XD_END }
+ − 2535 };
+ − 2536
+ − 2537 static const struct struct_description buffer_slots_description = {
+ − 2538 BUFFER_SLOTS_SIZE,
+ − 2539 buffer_slots_description_1
+ − 2540 };
+ − 2541
+ − 2542 void
+ − 2543 complex_vars_of_buffer (void)
+ − 2544 {
+ − 2545 struct buffer *defs, *syms;
+ − 2546
+ − 2547 common_init_complex_vars_of_buffer ();
+ − 2548
+ − 2549 defs = XBUFFER (Vbuffer_defaults);
+ − 2550 syms = XBUFFER (Vbuffer_local_symbols);
+ − 2551 buffer_defaults_saved_slots = &defs->BUFFER_SLOTS_FIRST_NAME;
+ − 2552 buffer_local_symbols_saved_slots = &syms->BUFFER_SLOTS_FIRST_NAME;
452
+ − 2553 dump_add_root_struct_ptr (&buffer_defaults_saved_slots, &buffer_slots_description);
+ − 2554 dump_add_root_struct_ptr (&buffer_local_symbols_saved_slots, &buffer_slots_description);
440
+ − 2555
428
+ − 2556 DEFVAR_BUFFER_DEFAULTS ("default-modeline-format", modeline_format /*
+ − 2557 Default value of `modeline-format' for buffers that don't override it.
+ − 2558 This is the same as (default-value 'modeline-format).
+ − 2559 */ );
+ − 2560
+ − 2561 DEFVAR_BUFFER_DEFAULTS ("default-abbrev-mode", abbrev_mode /*
+ − 2562 Default value of `abbrev-mode' for buffers that do not override it.
+ − 2563 This is the same as (default-value 'abbrev-mode).
+ − 2564 */ );
+ − 2565
+ − 2566 DEFVAR_BUFFER_DEFAULTS ("default-ctl-arrow", ctl_arrow /*
+ − 2567 Default value of `ctl-arrow' for buffers that do not override it.
+ − 2568 This is the same as (default-value 'ctl-arrow).
+ − 2569 */ );
+ − 2570
+ − 2571 #if 0 /* #### make this a specifier! */
+ − 2572 DEFVAR_BUFFER_DEFAULTS ("default-display-direction", display_direction /*
+ − 2573 Default display-direction for buffers that do not override it.
+ − 2574 This is the same as (default-value 'display-direction).
+ − 2575 Note: This is not yet implemented.
+ − 2576 */ );
+ − 2577 #endif
+ − 2578
+ − 2579 DEFVAR_BUFFER_DEFAULTS ("default-truncate-lines", truncate_lines /*
+ − 2580 Default value of `truncate-lines' for buffers that do not override it.
+ − 2581 This is the same as (default-value 'truncate-lines).
+ − 2582 */ );
+ − 2583
+ − 2584 DEFVAR_BUFFER_DEFAULTS ("default-fill-column", fill_column /*
+ − 2585 Default value of `fill-column' for buffers that do not override it.
+ − 2586 This is the same as (default-value 'fill-column).
+ − 2587 */ );
+ − 2588
+ − 2589 DEFVAR_BUFFER_DEFAULTS ("default-left-margin", left_margin /*
+ − 2590 Default value of `left-margin' for buffers that do not override it.
+ − 2591 This is the same as (default-value 'left-margin).
+ − 2592 */ );
+ − 2593
+ − 2594 DEFVAR_BUFFER_DEFAULTS ("default-tab-width", tab_width /*
+ − 2595 Default value of `tab-width' for buffers that do not override it.
+ − 2596 This is the same as (default-value 'tab-width).
+ − 2597 */ );
+ − 2598
+ − 2599 DEFVAR_BUFFER_DEFAULTS ("default-case-fold-search", case_fold_search /*
+ − 2600 Default value of `case-fold-search' for buffers that don't override it.
+ − 2601 This is the same as (default-value 'case-fold-search).
+ − 2602 */ );
+ − 2603
+ − 2604 DEFVAR_BUFFER_LOCAL ("modeline-format", modeline_format /*
+ − 2605 Template for displaying modeline for current buffer.
+ − 2606 Each buffer has its own value of this variable.
442
+ − 2607 Value may be a string, symbol, glyph, generic specifier, list or cons cell.
+ − 2608 For a symbol, its value is processed (but it is ignored if t or nil).
428
+ − 2609 A string appearing directly as the value of a symbol is processed verbatim
+ − 2610 in that the %-constructs below are not recognized.
+ − 2611 For a glyph, it is inserted as is.
442
+ − 2612 For a generic specifier (i.e. a specifier of type `generic'), its instance
+ − 2613 is computed in the current window using the equivalent of `specifier-instance'
+ − 2614 and the value is processed.
428
+ − 2615 For a list whose car is a symbol, the symbol's value is taken,
+ − 2616 and if that is non-nil, the cadr of the list is processed recursively.
+ − 2617 Otherwise, the caddr of the list (if there is one) is processed.
+ − 2618 For a list whose car is a string or list, each element is processed
+ − 2619 recursively and the results are effectively concatenated.
+ − 2620 For a list whose car is an integer, the cdr of the list is processed
442
+ − 2621 and padded (if the number is positive) or truncated (if negative)
+ − 2622 to the width specified by that number.
428
+ − 2623 For a list whose car is an extent, the cdr of the list is processed
+ − 2624 normally but the results are displayed using the face of the
+ − 2625 extent, and mouse clicks over this section are processed using the
+ − 2626 keymap of the extent. (In addition, if the extent has a help-echo
+ − 2627 property, that string will be echoed when the mouse moves over this
442
+ − 2628 section.) If extents are nested, all keymaps are properly consulted
+ − 2629 when processing mouse clicks, but multiple faces are not correctly
+ − 2630 merged (only the first face is used), and lists of faces are not
+ − 2631 correctly handled. See `generated-modeline-string' for more information.
428
+ − 2632 A string is printed verbatim in the modeline except for %-constructs:
+ − 2633 (%-constructs are processed when the string is the entire modeline-format
+ − 2634 or when it is found in a cons-cell or a list)
+ − 2635 %b -- print buffer name. %c -- print the current column number.
+ − 2636 %f -- print visited file name.
+ − 2637 %* -- print %, * or hyphen. %+ -- print *, % or hyphen.
+ − 2638 % means buffer is read-only and * means it is modified.
+ − 2639 For a modified read-only buffer, %* gives % and %+ gives *.
+ − 2640 %s -- print process status. %l -- print the current line number.
+ − 2641 %S -- print name of selected frame (only meaningful under X Windows).
+ − 2642 %p -- print percent of buffer above top of window, or Top, Bot or All.
+ − 2643 %P -- print percent of buffer above bottom of window, perhaps plus Top,
+ − 2644 or print Bottom or All.
+ − 2645 %n -- print Narrow if appropriate.
+ − 2646 %C -- under XEmacs/mule, print the mnemonic for `buffer-file-coding-system'.
+ − 2647 %[ -- print one [ for each recursive editing level. %] similar.
+ − 2648 %% -- print %. %- -- print infinitely many dashes.
+ − 2649 Decimal digits after the % specify field width to which to pad.
+ − 2650 */ );
+ − 2651
+ − 2652 DEFVAR_BUFFER_DEFAULTS ("default-major-mode", major_mode /*
+ − 2653 *Major mode for new buffers. Defaults to `fundamental-mode'.
+ − 2654 nil here means use current buffer's major mode.
+ − 2655 */ );
+ − 2656
+ − 2657 DEFVAR_BUFFER_DEFAULTS ("fundamental-mode-abbrev-table", abbrev_table /*
+ − 2658 The abbrev table of mode-specific abbrevs for Fundamental Mode.
+ − 2659 */ );
+ − 2660
+ − 2661 DEFVAR_BUFFER_LOCAL ("major-mode", major_mode /*
+ − 2662 Symbol for current buffer's major mode.
+ − 2663 */ );
+ − 2664
+ − 2665 DEFVAR_BUFFER_LOCAL ("mode-name", mode_name /*
+ − 2666 Pretty name of current buffer's major mode (a string).
+ − 2667 */ );
+ − 2668
+ − 2669 DEFVAR_BUFFER_LOCAL ("abbrev-mode", abbrev_mode /*
+ − 2670 Non-nil turns on automatic expansion of abbrevs as they are inserted.
+ − 2671 Automatically becomes buffer-local when set in any fashion.
+ − 2672 */ );
+ − 2673
+ − 2674 DEFVAR_BUFFER_LOCAL ("case-fold-search", case_fold_search /*
+ − 2675 *Non-nil if searches should ignore case.
+ − 2676 Automatically becomes buffer-local when set in any fashion.
+ − 2677
+ − 2678 BUG: Under XEmacs/Mule, translations to or from non-ASCII characters
+ − 2679 (this includes chars in the range 128 - 255) are ignored by
+ − 2680 the string/buffer-searching routines. Thus, `case-fold-search'
+ − 2681 will not correctly conflate a-umlaut and A-umlaut even if the
+ − 2682 case tables call for this.
+ − 2683 */ );
+ − 2684
+ − 2685 DEFVAR_BUFFER_LOCAL ("fill-column", fill_column /*
+ − 2686 *Column beyond which automatic line-wrapping should happen.
+ − 2687 Automatically becomes buffer-local when set in any fashion.
+ − 2688 */ );
+ − 2689
+ − 2690 DEFVAR_BUFFER_LOCAL ("left-margin", left_margin /*
+ − 2691 *Column for the default indent-line-function to indent to.
+ − 2692 Linefeed indents to this column in Fundamental mode.
+ − 2693 Automatically becomes buffer-local when set in any fashion.
+ − 2694 Do not confuse this with the specifier `left-margin-width';
+ − 2695 that controls the size of a margin that is displayed outside
+ − 2696 of the text area.
+ − 2697 */ );
+ − 2698
+ − 2699 DEFVAR_BUFFER_LOCAL_MAGIC ("tab-width", tab_width /*
+ − 2700 *Distance between tab stops (for display of tab characters), in columns.
+ − 2701 Automatically becomes buffer-local when set in any fashion.
+ − 2702 */ , redisplay_variable_changed);
+ − 2703
+ − 2704 DEFVAR_BUFFER_LOCAL_MAGIC ("ctl-arrow", ctl_arrow /*
+ − 2705 *Non-nil means display control chars with uparrow.
+ − 2706 Nil means use backslash and octal digits.
+ − 2707 An integer means characters >= ctl-arrow are assumed to be printable, and
+ − 2708 will be displayed as a single glyph.
+ − 2709 Any other value is the same as 160 - the code SPC with the high bit on.
+ − 2710
+ − 2711 The interpretation of this variable is likely to change in the future.
+ − 2712
+ − 2713 Automatically becomes buffer-local when set in any fashion.
+ − 2714 This variable does not apply to characters whose display is specified
+ − 2715 in the current display table (if there is one).
+ − 2716 */ , redisplay_variable_changed);
+ − 2717
+ − 2718 #if 0 /* #### Make this a specifier! */
+ − 2719 xxDEFVAR_BUFFER_LOCAL ("display-direction", display_direction /*
+ − 2720 *Non-nil means lines in the buffer are displayed right to left.
+ − 2721 Nil means left to right. (Not yet implemented.)
+ − 2722 */ );
+ − 2723 #endif /* Not yet implemented */
+ − 2724
+ − 2725 DEFVAR_BUFFER_LOCAL_MAGIC ("truncate-lines", truncate_lines /*
+ − 2726 *Non-nil means do not display continuation lines;
+ − 2727 give each line of text one frame line.
+ − 2728 Automatically becomes buffer-local when set in any fashion.
+ − 2729
+ − 2730 Note that this is overridden by the variable
+ − 2731 `truncate-partial-width-windows' if that variable is non-nil
+ − 2732 and this buffer is not full-frame width.
+ − 2733 */ , redisplay_variable_changed);
+ − 2734
+ − 2735 DEFVAR_BUFFER_LOCAL ("default-directory", directory /*
+ − 2736 Name of default directory of current buffer. Should end with slash.
+ − 2737 Each buffer has its own value of this variable.
+ − 2738 */ );
+ − 2739
+ − 2740 #ifdef FILE_CODING
+ − 2741 DEFVAR_BUFFER_DEFAULTS ("default-buffer-file-coding-system", buffer_file_coding_system /*
+ − 2742 Default value of `buffer-file-coding-system' for buffers that do not override it.
+ − 2743 This is the same as (default-value 'buffer-file-coding-system).
+ − 2744 This value is used both for buffers without associated files and
+ − 2745 for buffers whose files do not have any apparent coding system.
+ − 2746 See `buffer-file-coding-system'.
+ − 2747 */ );
+ − 2748
+ − 2749 DEFVAR_BUFFER_LOCAL ("buffer-file-coding-system", buffer_file_coding_system /*
+ − 2750 *Current coding system for the current buffer.
+ − 2751 When the buffer is written out into a file, this coding system will be
+ − 2752 used for the encoding. Automatically buffer-local when set in any
+ − 2753 fashion. This is normally set automatically when a file is loaded in
+ − 2754 based on the determined coding system of the file (assuming that
+ − 2755 `buffer-file-coding-system-for-read' is set to `undecided', which
+ − 2756 calls for automatic determination of the file's coding system).
+ − 2757 Normally the modeline indicates the current file coding system using
+ − 2758 its mnemonic abbreviation.
+ − 2759
+ − 2760 The default value for this variable (which is normally used for
+ − 2761 buffers without associated files) is also used when automatic
+ − 2762 detection of a file's encoding is called for and there was no
+ − 2763 discernible encoding in the file (i.e. it was entirely or almost
+ − 2764 entirely ASCII). The default value should generally *not* be set to
+ − 2765 nil (equivalent to `no-conversion'), because if extended characters
+ − 2766 are ever inserted into the buffer, they will be lost when the file is
+ − 2767 written out. A good choice is `iso-2022-8' (the simple ISO 2022 8-bit
+ − 2768 encoding), which will write out ASCII and Latin-1 characters in the
+ − 2769 standard (and highly portable) fashion and use standard escape
+ − 2770 sequences for other charsets. Another reasonable choice is
+ − 2771 `escape-quoted', which is equivalent to `iso-2022-8' but prefixes
+ − 2772 certain control characters with ESC to make sure they are not
+ − 2773 interpreted as escape sequences when read in. This latter coding
+ − 2774 system results in more "correct" output in the presence of control
+ − 2775 characters in the buffer, in the sense that when read in again using
+ − 2776 the same coding system, the result will virtually always match the
+ − 2777 original contents of the buffer, which is not the case with
+ − 2778 `iso-2022-8'; but the output is less portable when dealing with binary
+ − 2779 data -- there may be stray ESC characters when the file is read by
+ − 2780 another program.
+ − 2781
+ − 2782 `buffer-file-coding-system' does *not* control the coding system used when
+ − 2783 a file is read in. Use the variables `buffer-file-coding-system-for-read'
+ − 2784 and `buffer-file-coding-system-alist' for that. From a Lisp program, if
+ − 2785 you wish to unilaterally specify the coding system used for one
+ − 2786 particular operation, you should bind the variable
+ − 2787 `coding-system-for-read' rather than changing the other two
+ − 2788 variables just mentioned, which are intended to be used for
+ − 2789 global environment specification.
+ − 2790 */ );
+ − 2791 #endif /* FILE_CODING */
+ − 2792
+ − 2793 DEFVAR_BUFFER_LOCAL ("auto-fill-function", auto_fill_function /*
+ − 2794 Function called (if non-nil) to perform auto-fill.
+ − 2795 It is called after self-inserting a space at a column beyond `fill-column'.
+ − 2796 Each buffer has its own value of this variable.
+ − 2797 NOTE: This variable is not an ordinary hook;
+ − 2798 It may not be a list of functions.
+ − 2799 */ );
+ − 2800
+ − 2801 DEFVAR_BUFFER_LOCAL ("buffer-file-name", filename /*
+ − 2802 Name of file visited in current buffer, or nil if not visiting a file.
+ − 2803 Each buffer has its own value of this variable.
+ − 2804 */ );
+ − 2805
+ − 2806 #if 0 /* FSFmacs */
+ − 2807 /*
+ − 2808 Abbreviated truename of file visited in current buffer, or nil if none.
+ − 2809 The truename of a file is calculated by `file-truename'
+ − 2810 and then abbreviated with `abbreviate-file-name'.
+ − 2811 Each buffer has its own value of this variable.
+ − 2812 */
+ − 2813 #endif /* FSFmacs */
+ − 2814
+ − 2815 DEFVAR_BUFFER_LOCAL ("buffer-file-truename", file_truename /*
+ − 2816 The real name of the file visited in the current buffer,
+ − 2817 or nil if not visiting a file. This is the result of passing
+ − 2818 buffer-file-name to the `file-truename' function. Every buffer has
+ − 2819 its own value of this variable. This variable is automatically
+ − 2820 maintained by the functions that change the file name associated
+ − 2821 with a buffer.
+ − 2822 */ );
+ − 2823
+ − 2824 DEFVAR_BUFFER_LOCAL ("buffer-auto-save-file-name", auto_save_file_name /*
+ − 2825 Name of file for auto-saving current buffer,
+ − 2826 or nil if buffer should not be auto-saved.
+ − 2827 Each buffer has its own value of this variable.
+ − 2828 */ );
+ − 2829
+ − 2830 DEFVAR_BUFFER_LOCAL ("buffer-read-only", read_only /*
+ − 2831 Non-nil if this buffer is read-only.
+ − 2832 Each buffer has its own value of this variable.
+ − 2833 */ );
+ − 2834
+ − 2835 DEFVAR_BUFFER_LOCAL ("buffer-backed-up", backed_up /*
+ − 2836 Non-nil if this buffer's file has been backed up.
+ − 2837 Backing up is done before the first time the file is saved.
+ − 2838 Each buffer has its own value of this variable.
+ − 2839 */ );
+ − 2840
+ − 2841 DEFVAR_BUFFER_LOCAL ("buffer-saved-size", saved_size /*
+ − 2842 Length of current buffer when last read in, saved or auto-saved.
+ − 2843 0 initially.
+ − 2844 Each buffer has its own value of this variable.
+ − 2845 */ );
+ − 2846
+ − 2847 DEFVAR_BUFFER_LOCAL_MAGIC ("selective-display", selective_display /*
+ − 2848 Non-nil enables selective display:
+ − 2849 Integer N as value means display only lines
+ − 2850 that start with less than n columns of space.
+ − 2851 A value of t means, after a ^M, all the rest of the line is invisible.
+ − 2852 Then ^M's in the file are written into files as newlines.
+ − 2853
+ − 2854 Automatically becomes buffer-local when set in any fashion.
+ − 2855 */, redisplay_variable_changed);
+ − 2856
+ − 2857 #ifndef old
+ − 2858 DEFVAR_BUFFER_LOCAL_MAGIC ("selective-display-ellipses",
+ − 2859 selective_display_ellipses /*
+ − 2860 t means display ... on previous line when a line is invisible.
+ − 2861 Automatically becomes buffer-local when set in any fashion.
+ − 2862 */, redisplay_variable_changed);
+ − 2863 #endif
+ − 2864
+ − 2865 DEFVAR_BUFFER_LOCAL ("local-abbrev-table", abbrev_table /*
+ − 2866 Local (mode-specific) abbrev table of current buffer.
+ − 2867 */ );
+ − 2868
+ − 2869 DEFVAR_BUFFER_LOCAL ("overwrite-mode", overwrite_mode /*
+ − 2870 Non-nil if self-insertion should replace existing text.
+ − 2871 The value should be one of `overwrite-mode-textual',
+ − 2872 `overwrite-mode-binary', or nil.
+ − 2873 If it is `overwrite-mode-textual', self-insertion still
+ − 2874 inserts at the end of a line, and inserts when point is before a tab,
+ − 2875 until the tab is filled in.
+ − 2876 If `overwrite-mode-binary', self-insertion replaces newlines and tabs too.
+ − 2877 Automatically becomes buffer-local when set in any fashion.
+ − 2878
+ − 2879 Normally, you shouldn't modify this variable by hand, but use the functions
+ − 2880 `overwrite-mode' and `binary-overwrite-mode' instead. However, you can
+ − 2881 customize the default value from the options menu.
+ − 2882 */ );
+ − 2883
+ − 2884 #if 0 /* FSFmacs */
+ − 2885 /* Adds the following to the doc string for buffer-undo-list:
+ − 2886
+ − 2887 An entry (nil PROPERTY VALUE BEG . END) indicates that a text property
+ − 2888 was modified between BEG and END. PROPERTY is the property name,
+ − 2889 and VALUE is the old value.
+ − 2890 */
+ − 2891 #endif /* FSFmacs */
+ − 2892
+ − 2893 DEFVAR_BUFFER_LOCAL ("buffer-undo-list", undo_list /*
+ − 2894 List of undo entries in current buffer.
+ − 2895 Recent changes come first; older changes follow newer.
+ − 2896
444
+ − 2897 An entry (START . END) represents an insertion which begins at
+ − 2898 position START and ends at position END.
428
+ − 2899
+ − 2900 An entry (TEXT . POSITION) represents the deletion of the string TEXT
+ − 2901 from (abs POSITION). If POSITION is positive, point was at the front
+ − 2902 of the text being deleted; if negative, point was at the end.
+ − 2903
+ − 2904 An entry (t HIGH . LOW) indicates that the buffer previously had
+ − 2905 "unmodified" status. HIGH and LOW are the high and low 16-bit portions
+ − 2906 of the visited file's modification time, as of that time. If the
+ − 2907 modification time of the most recent save is different, this entry is
+ − 2908 obsolete.
+ − 2909
+ − 2910 An entry of the form EXTENT indicates that EXTENT was attached in
+ − 2911 the buffer. Undoing an entry of this form detaches EXTENT.
+ − 2912
+ − 2913 An entry of the form (EXTENT START END) indicates that EXTENT was
+ − 2914 detached from the buffer. Undoing an entry of this form attaches
+ − 2915 EXTENT from START to END.
+ − 2916
+ − 2917 An entry of the form POSITION indicates that point was at the buffer
+ − 2918 location given by the integer. Undoing an entry of this form places
+ − 2919 point at POSITION.
+ − 2920
+ − 2921 nil marks undo boundaries. The undo command treats the changes
+ − 2922 between two undo boundaries as a single step to be undone.
+ − 2923
+ − 2924 If the value of the variable is t, undo information is not recorded.
+ − 2925 */ );
+ − 2926
+ − 2927 #if 0 /* FSFmacs */
+ − 2928 xxDEFVAR_BUFFER_LOCAL ("mark-active", mark_active /*
+ − 2929 Non-nil means the mark and region are currently active in this buffer.
+ − 2930 Automatically local in all buffers.
+ − 2931 */ );
+ − 2932 #endif /* FSFmacs */
+ − 2933
+ − 2934 #ifdef REGION_CACHE_NEEDS_WORK
+ − 2935 xxDEFVAR_BUFFER_LOCAL ("cache-long-line-scans", cache_long_line_scans /*
+ − 2936 Non-nil means that Emacs should use caches to handle long lines more quickly.
+ − 2937 This variable is buffer-local, in all buffers.
+ − 2938
+ − 2939 Normally, the line-motion functions work by scanning the buffer for
+ − 2940 newlines. Columnar operations (like move-to-column and
+ − 2941 compute-motion) also work by scanning the buffer, summing character
+ − 2942 widths as they go. This works well for ordinary text, but if the
+ − 2943 buffer's lines are very long (say, more than 500 characters), these
+ − 2944 motion functions will take longer to execute. Emacs may also take
+ − 2945 longer to update the display.
+ − 2946
+ − 2947 If cache-long-line-scans is non-nil, these motion functions cache the
+ − 2948 results of their scans, and consult the cache to avoid rescanning
+ − 2949 regions of the buffer until the text is modified. The caches are most
+ − 2950 beneficial when they prevent the most searching---that is, when the
+ − 2951 buffer contains long lines and large regions of characters with the
+ − 2952 same, fixed screen width.
+ − 2953
+ − 2954 When cache-long-line-scans is non-nil, processing short lines will
+ − 2955 become slightly slower (because of the overhead of consulting the
+ − 2956 cache), and the caches will use memory roughly proportional to the
+ − 2957 number of newlines and characters whose screen width varies.
+ − 2958
+ − 2959 The caches require no explicit maintenance; their accuracy is
+ − 2960 maintained internally by the Emacs primitives. Enabling or disabling
+ − 2961 the cache should not affect the behavior of any of the motion
+ − 2962 functions; it should only affect their performance.
+ − 2963 */ );
+ − 2964 #endif /* REGION_CACHE_NEEDS_WORK */
+ − 2965
+ − 2966 DEFVAR_BUFFER_LOCAL ("point-before-scroll", point_before_scroll /*
+ − 2967 Value of point before the last series of scroll operations, or nil.
+ − 2968 */ );
+ − 2969
+ − 2970 DEFVAR_BUFFER_LOCAL ("buffer-file-format", file_format /*
+ − 2971 List of formats to use when saving this buffer.
+ − 2972 Formats are defined by `format-alist'. This variable is
+ − 2973 set when a file is visited. Automatically local in all buffers.
+ − 2974 */ );
+ − 2975
+ − 2976 DEFVAR_BUFFER_LOCAL_MAGIC ("buffer-invisibility-spec", invisibility_spec /*
+ − 2977 Invisibility spec of this buffer.
+ − 2978 The default is t, which means that text is invisible
+ − 2979 if it has (or is covered by an extent with) a non-nil `invisible' property.
+ − 2980 If the value is a list, a text character is invisible if its `invisible'
+ − 2981 property is an element in that list.
444
+ − 2982 If an element is a cons cell of the form (PROPERTY . ELLIPSIS),
+ − 2983 then characters with property value PROPERTY are invisible,
428
+ − 2984 and they have an ellipsis as well if ELLIPSIS is non-nil.
+ − 2985 Note that the actual characters used for the ellipsis are controllable
+ − 2986 using `invisible-text-glyph', and default to "...".
+ − 2987 */, redisplay_variable_changed);
+ − 2988
+ − 2989 DEFVAR_CONST_BUFFER_LOCAL ("generated-modeline-string",
+ − 2990 generated_modeline_string /*
+ − 2991 String of characters in this buffer's modeline as of the last redisplay.
+ − 2992 Each time the modeline is recomputed, the resulting characters are
+ − 2993 stored in this string, which is resized as necessary. You may not
+ − 2994 set this variable, and modifying this string will not change the
+ − 2995 modeline; you have to change `modeline-format' if you want that.
+ − 2996
+ − 2997 For each extent in `modeline-format' that is encountered when
+ − 2998 processing the modeline, a corresponding extent is placed in
+ − 2999 `generated-modeline-string' and covers the text over which the
+ − 3000 extent in `modeline-format' applies. The extent in
+ − 3001 `generated-modeline-string' is made a child of the extent in
+ − 3002 `modeline-format', which means that it inherits all properties from
+ − 3003 that extent. Note that the extents in `generated-modeline-string'
+ − 3004 are managed automatically. You should not explicitly put any extents
+ − 3005 in `generated-modeline-string'; if you do, they will disappear the
+ − 3006 next time the modeline is processed.
+ − 3007
+ − 3008 For extents in `modeline-format', the following properties are currently
+ − 3009 handled:
+ − 3010
+ − 3011 `face'
+ − 3012 Affects the face of the modeline text. Currently, faces do
+ − 3013 not merge properly; only the most recently encountered face
+ − 3014 is used. This is a bug.
+ − 3015
+ − 3016 `keymap'
+ − 3017 Affects the disposition of button events over the modeline
+ − 3018 text. Multiple applicable keymaps *are* handled properly,
+ − 3019 and `modeline-map' still applies to any events that don't
+ − 3020 have bindings in extent-specific keymaps.
+ − 3021
+ − 3022 `help-echo'
+ − 3023 If a string, causes the string to be displayed when the mouse
+ − 3024 moves over the text.
+ − 3025 */ );
+ − 3026
+ − 3027 /* Check for DEFVAR_BUFFER_LOCAL without initializing the corresponding
+ − 3028 slot of buffer_local_flags and vice-versa. Must be done after all
+ − 3029 DEFVAR_BUFFER_LOCAL() calls. */
+ − 3030 #define MARKED_SLOT(slot) \
+ − 3031 if ((XINT (buffer_local_flags.slot) != -2 && \
+ − 3032 XINT (buffer_local_flags.slot) != -3) \
+ − 3033 != !(NILP (XBUFFER (Vbuffer_local_symbols)->slot))) \
+ − 3034 abort ()
+ − 3035 #include "bufslots.h"
+ − 3036 #undef MARKED_SLOT
+ − 3037
+ − 3038 {
+ − 3039 Lisp_Object scratch = Fget_buffer_create (QSscratch);
+ − 3040 Fset_buffer (scratch);
+ − 3041 /* Want no undo records for *scratch* until after Emacs is dumped */
+ − 3042 Fbuffer_disable_undo (scratch);
+ − 3043 }
+ − 3044 }
+ − 3045
442
+ − 3046 #ifndef WIN32_NATIVE
428
+ − 3047 /* Is PWD another name for `.' ? */
+ − 3048 static int
440
+ − 3049 directory_is_current_directory (Extbyte *pwd)
428
+ − 3050 {
+ − 3051 Bufbyte *pwd_internal;
440
+ − 3052 Bytecount pwd_internal_len;
428
+ − 3053 struct stat dotstat, pwdstat;
+ − 3054
440
+ − 3055 TO_INTERNAL_FORMAT (DATA, (pwd, strlen ((char *)pwd) + 1),
+ − 3056 ALLOCA, (pwd_internal, pwd_internal_len),
+ − 3057 Qfile_name);
428
+ − 3058
+ − 3059 return (IS_DIRECTORY_SEP (*pwd_internal)
442
+ − 3060 && xemacs_stat ((char *) pwd_internal, &pwdstat) == 0
+ − 3061 && xemacs_stat (".", &dotstat) == 0
428
+ − 3062 && dotstat.st_ino == pwdstat.st_ino
+ − 3063 && dotstat.st_dev == pwdstat.st_dev
440
+ − 3064 && pwd_internal_len < MAXPATHLEN);
428
+ − 3065 }
442
+ − 3066 #endif
428
+ − 3067
+ − 3068 void
+ − 3069 init_initial_directory (void)
+ − 3070 {
+ − 3071 /* This function can GC */
+ − 3072
442
+ − 3073 #ifndef WIN32_NATIVE
440
+ − 3074 Extbyte *pwd;
442
+ − 3075 #endif
428
+ − 3076
+ − 3077 initial_directory[0] = 0;
+ − 3078
+ − 3079 /* If PWD is accurate, use it instead of calling getcwd. This is faster
+ − 3080 when PWD is right, and may avoid a fatal error. */
442
+ − 3081 #ifndef WIN32_NATIVE
440
+ − 3082 if ((pwd = (Extbyte *) getenv ("PWD")) != NULL
428
+ − 3083 && directory_is_current_directory (pwd))
440
+ − 3084 strcpy (initial_directory, (char *) pwd);
442
+ − 3085 else
+ − 3086 #endif
+ − 3087 if (getcwd (initial_directory, MAXPATHLEN) == NULL)
+ − 3088 fatal ("`getcwd' failed: %s\n", strerror (errno));
428
+ − 3089
+ − 3090 /* Make sure pwd is DIRECTORY_SEP-terminated.
+ − 3091 Maybe this should really use some standard subroutine
+ − 3092 whose definition is filename syntax dependent. */
+ − 3093 {
+ − 3094 int len = strlen (initial_directory);
+ − 3095
+ − 3096 if (! IS_DIRECTORY_SEP (initial_directory[len - 1]))
+ − 3097 {
+ − 3098 initial_directory[len] = DIRECTORY_SEP;
+ − 3099 initial_directory[len + 1] = '\0';
+ − 3100 }
+ − 3101 }
+ − 3102
442
+ − 3103 #ifdef CORRECT_DIR_SEPS
+ − 3104 CORRECT_DIR_SEPS (initial_directory);
428
+ − 3105 #endif
+ − 3106 }
+ − 3107
+ − 3108 void
+ − 3109 init_buffer (void)
+ − 3110 {
+ − 3111 /* This function can GC */
+ − 3112
+ − 3113 Fset_buffer (Fget_buffer_create (QSscratch));
+ − 3114
+ − 3115 current_buffer->directory =
440
+ − 3116 build_ext_string (initial_directory, Qfile_name);
428
+ − 3117
+ − 3118 #if 0 /* FSFmacs */
+ − 3119 /* #### is this correct? */
+ − 3120 temp = get_minibuffer (0);
+ − 3121 XBUFFER (temp)->directory = current_buffer->directory;
+ − 3122 #endif /* FSFmacs */
+ − 3123 }