|
|
1.1 ! root 1: /* Buffer manipulation primitives for GNU Emacs. ! 2: Copyright (C) 1985, 1986, 1987, 1988, 1990 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU Emacs. ! 5: ! 6: GNU Emacs is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 1, or (at your option) ! 9: any later version. ! 10: ! 11: GNU Emacs is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU Emacs; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: #include <sys/param.h> ! 22: ! 23: #ifndef MAXPATHLEN ! 24: /* in 4.1, param.h fails to define this. */ ! 25: #define MAXPATHLEN 1024 ! 26: #endif /* not MAXPATHLEN */ ! 27: ! 28: #ifdef NULL ! 29: #undef NULL ! 30: #endif ! 31: #include "config.h" ! 32: #include "lisp.h" ! 33: #include "window.h" ! 34: #include "commands.h" ! 35: #include "buffer.h" ! 36: #include "syntax.h" ! 37: ! 38: struct buffer *current_buffer; /* the current buffer */ ! 39: ! 40: /* First buffer in chain of all buffers (in reverse order of creation). ! 41: Threaded through ->next. */ ! 42: ! 43: struct buffer *all_buffers; ! 44: ! 45: /* This structure holds the default values of the buffer-local variables ! 46: defined with DEFVAR_PER_BUFFER, that have special slots in each buffer. ! 47: The default value occupies the same slot in this structure ! 48: as an individual buffer's value occupies in that buffer. ! 49: Setting the default value also goes through the alist of buffers ! 50: and stores into each buffer that does not say it has a local value. */ ! 51: ! 52: struct buffer buffer_defaults; ! 53: /* A Lisp_Object pointer to the above, used for staticpro */ ! 54: static Lisp_Object Vbuffer_defaults; ! 55: ! 56: /* This structure marks which slots in a buffer have corresponding ! 57: default values in buffer_defaults. ! 58: Each such slot has a nonzero value in this structure. ! 59: The value has only one nonzero bit. ! 60: ! 61: When a buffer has its own local value for a slot, ! 62: the bit for that slot (found in the same slot in this structure) ! 63: is turned on in the buffer's local_var_flags slot. ! 64: ! 65: If a slot in this structure is -1, then even though there may ! 66: be a DEFVAR_PER_BUFFER for the slot, there is no default value for it; ! 67: and the corresponding slot in buffer_defaults is not used. ! 68: ! 69: If a slot is -2, then there is no DEFVAR_PER_BUFFER for it, ! 70: but there is a default value which is copied into each buffer. ! 71: ! 72: If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is ! 73: zero, that is a bug */ ! 74: ! 75: struct buffer buffer_local_flags; ! 76: ! 77: /* This structure holds the names of symbols whose values may be ! 78: buffer-local. It is indexed and accessed in the same way as the above. */ ! 79: ! 80: struct buffer buffer_local_symbols; ! 81: /* A Lisp_Object pointer to the above, used for staticpro */ ! 82: static Lisp_Object Vbuffer_local_symbols; ! 83: ! 84: Lisp_Object Fset_buffer (); ! 85: ! 86: /* Alist of all buffer names vs the buffers. */ ! 87: /* This used to be a variable, but is no longer, ! 88: to prevent lossage due to user rplac'ing this alist or its elements. */ ! 89: Lisp_Object Vbuffer_alist; ! 90: ! 91: Lisp_Object Qfundamental_mode, Qmode_class; ! 92: ! 93: Lisp_Object QSFundamental; /* A string "Fundamental" */ ! 94: ! 95: /* For debugging; temporary. See set_buffer_internal. */ ! 96: /* Lisp_Object Qlisp_mode, Vcheck_symbol; */ ! 97: ! 98: nsberror (spec) ! 99: Lisp_Object spec; ! 100: { ! 101: if (XTYPE (spec) == Lisp_String) ! 102: error ("No buffer named %s", XSTRING (spec)->data); ! 103: error ("Invalid buffer argument"); ! 104: } ! 105: ! 106: DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 0, 0, ! 107: "Return a list of all buffers.") ! 108: () ! 109: { ! 110: return Fmapcar (Qcdr, Vbuffer_alist); ! 111: } ! 112: ! 113: DEFUN ("get-buffer", Fget_buffer, Sget_buffer, 1, 1, 0, ! 114: "Return the buffer named NAME (a string).\n\ ! 115: It is found by looking up NAME in buffer-alist.\n\ ! 116: If there is no buffer named NAME, nil is returned.\n\ ! 117: NAME may also be a buffer; it is returned.") ! 118: (name) ! 119: register Lisp_Object name; ! 120: { ! 121: if (XTYPE (name) == Lisp_Buffer) ! 122: return name; ! 123: CHECK_STRING (name, 0); ! 124: ! 125: return Fcdr (Fassoc (name, Vbuffer_alist)); ! 126: } ! 127: ! 128: DEFUN ("get-file-buffer", Fget_file_buffer, Sget_file_buffer, 1, 1, 0, ! 129: "Return the buffer visiting file FILENAME (a string).\n\ ! 130: If there is no such buffer, nil is returned.") ! 131: (filename) ! 132: register Lisp_Object filename; ! 133: { ! 134: register Lisp_Object tail, buf, tem; ! 135: CHECK_STRING (filename, 0); ! 136: filename = Fexpand_file_name (filename, Qnil); ! 137: ! 138: for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr) ! 139: { ! 140: buf = Fcdr (XCONS (tail)->car); ! 141: if (XTYPE (buf) != Lisp_Buffer) continue; ! 142: if (XTYPE (XBUFFER (buf)->filename) != Lisp_String) continue; ! 143: tem = Fstring_equal (XBUFFER (buf)->filename, filename); ! 144: if (!NULL (tem)) ! 145: return buf; ! 146: } ! 147: return Qnil; ! 148: } ! 149: ! 150: DEFUN ("get-buffer-create", Fget_buffer_create, Sget_buffer_create, 1, 1, 0, ! 151: "Like get-buffer but creates a buffer named NAME and returns it if none already exists.") ! 152: (name) ! 153: register Lisp_Object name; ! 154: { ! 155: register Lisp_Object buf, function, tem; ! 156: int count = specpdl_ptr - specpdl; ! 157: register struct buffer *b; ! 158: register unsigned char *data; ! 159: /* register struct buffer *bx; */ ! 160: ! 161: buf = Fget_buffer (name); ! 162: if (!NULL (buf)) return buf; ! 163: ! 164: b = (struct buffer *) malloc (sizeof (struct buffer)); ! 165: if (!b) memory_full (); ! 166: ! 167: BUF_GAP_SIZE (b) = 20; ! 168: data = (unsigned char *) malloc (BUF_GAP_SIZE (b)); ! 169: if (!data) ! 170: { ! 171: free (b); ! 172: memory_full (); ! 173: } ! 174: BUF_BEG_ADDR (b) = data; ! 175: BUF_PT (b) = 1; ! 176: BUF_GPT (b) = 1; ! 177: BUF_BEGV (b) = 1; ! 178: BUF_ZV (b) = 1; ! 179: BUF_Z (b) = 1; ! 180: BUF_MODIFF (b) = 1; ! 181: ! 182: /* Put this on the chain of all buffers including killed ones. */ ! 183: b->next = all_buffers; ! 184: all_buffers = b; ! 185: ! 186: /* Put this in the alist of all live buffers. */ ! 187: XSET (buf, Lisp_Buffer, b); ! 188: #if 0 ! 189: XSETTYPE (buf, Lisp_Buffer); ! 190: bx = b; /* Use of bx avoids compiler bug on Sun */ ! 191: XSETBUFFER (buf, bx); ! 192: #endif ! 193: Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil)); ! 194: ! 195: b->mark = Fmake_marker (); ! 196: b->markers = Qnil; ! 197: b->name = name; ! 198: ! 199: /* Enable undo in this buffer unless name starts with a space. */ ! 200: if (XSTRING (name)->data[0] != ' ') ! 201: b->undo_list = Qnil; ! 202: else ! 203: b->undo_list = Qt; ! 204: ! 205: reset_buffer (b); ! 206: ! 207: function = buffer_defaults.major_mode; ! 208: if (NULL (function)) ! 209: { ! 210: tem = Fget (current_buffer->major_mode, Qmode_class); ! 211: if (EQ (tem, Qnil)) ! 212: function = current_buffer->major_mode; ! 213: } ! 214: ! 215: if (NULL (function) || EQ (function, Qfundamental_mode)) ! 216: return buf; ! 217: ! 218: /* To select a nonfundamental mode, ! 219: select the buffer temporarily and then call the mode function. */ ! 220: ! 221: record_unwind_protect (save_excursion_restore, save_excursion_save ()); ! 222: ! 223: Fset_buffer (buf); ! 224: call0 (function); ! 225: ! 226: unbind_to (count); ! 227: return buf; ! 228: } ! 229: ! 230: /* Reinitialize everything about a buffer except its name and contents. */ ! 231: ! 232: void ! 233: reset_buffer (b) ! 234: register struct buffer *b; ! 235: { ! 236: b->filename = Qnil; ! 237: b->directory = (current_buffer) ? current_buffer->directory : Qnil; ! 238: b->modtime = 0; ! 239: b->save_modified = 1; ! 240: b->save_length = 0; ! 241: b->last_window_start = 1; ! 242: b->backed_up = Qnil; ! 243: b->auto_save_modified = 0; ! 244: b->auto_save_file_name = Qnil; ! 245: b->read_only = Qnil; ! 246: reset_buffer_local_variables(b); ! 247: } ! 248: ! 249: reset_buffer_local_variables(b) ! 250: register struct buffer *b; ! 251: { ! 252: register int offset; ! 253: ! 254: /* Reset the major mode to Fundamental, together with all the ! 255: things that depend on the major mode. ! 256: default-major-mode is handled at a higher level. ! 257: We ignore it here. */ ! 258: b->major_mode = Qfundamental_mode; ! 259: b->keymap = Qnil; ! 260: b->abbrev_table = Vfundamental_mode_abbrev_table; ! 261: b->mode_name = QSFundamental; ! 262: ! 263: /* Reset all per-buffer variables to their defaults. */ ! 264: b->local_var_alist = Qnil; ! 265: b->local_var_flags = 0; ! 266: ! 267: /* For each slot that has a default value, ! 268: copy that into the slot. */ ! 269: ! 270: for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags; ! 271: offset < sizeof (struct buffer); ! 272: offset += sizeof (Lisp_Object)) /* sizeof int == sizeof Lisp_Object */ ! 273: if (*(int *)(offset + (char *) &buffer_local_flags) > 0 ! 274: || *(int *)(offset + (char *) &buffer_local_flags) == -2) ! 275: *(Lisp_Object *)(offset + (char *)b) = ! 276: *(Lisp_Object *)(offset + (char *)&buffer_defaults); ! 277: } ! 278: ! 279: DEFUN ("generate-new-buffer", Fgenerate_new_buffer, Sgenerate_new_buffer, ! 280: 1, 1, 0, ! 281: "Creates and returns a buffer named NAME if one does not already exist,\n\ ! 282: else tries adding successive suffixes to NAME until a new buffer-name is\n\ ! 283: formed, then creates and returns a new buffer with that new name.") ! 284: (name) ! 285: register Lisp_Object name; ! 286: { ! 287: register Lisp_Object gentemp, tem; ! 288: int count; ! 289: char number[10]; ! 290: ! 291: CHECK_STRING (name, 0); ! 292: ! 293: tem = Fget_buffer (name); ! 294: if (NULL (tem)) ! 295: return Fget_buffer_create (name); ! 296: ! 297: count = 1; ! 298: while (1) ! 299: { ! 300: sprintf (number, "<%d>", ++count); ! 301: gentemp = concat2 (name, build_string (number)); ! 302: tem = Fget_buffer (gentemp); ! 303: if (NULL (tem)) ! 304: return Fget_buffer_create (gentemp); ! 305: } ! 306: } ! 307: ! 308: ! 309: DEFUN ("buffer-name", Fbuffer_name, Sbuffer_name, 0, 1, 0, ! 310: "Return the name of BUFFER, as a string.\n\ ! 311: No arg means return name of current buffer.") ! 312: (buffer) ! 313: register Lisp_Object buffer; ! 314: { ! 315: if (NULL (buffer)) ! 316: return current_buffer->name; ! 317: CHECK_BUFFER (buffer, 0); ! 318: return XBUFFER (buffer)->name; ! 319: } ! 320: ! 321: #ifdef NOTDEF /* Useless. If you need this, you should be using `eq' ! 322: DEFUN ("buffer-number", Fbuffer_number, Sbuffer_number, 0, 1, 0, ! 323: "Return the number of BUFFER.\n\ ! 324: No arg means return number of current buffer.") ! 325: (buffer) ! 326: Lisp_Object buffer; ! 327: { ! 328: if (NULL (buffer)) ! 329: return current_buffer->number; ! 330: CHECK_BUFFER (buffer, 0); ! 331: return XBUFFER (buffer)->number; ! 332: } ! 333: */ ! 334: #endif NOTDEF ! 335: ! 336: DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0, ! 337: "Return name of file BUFFER is visiting, or NIL if none.\n\ ! 338: No argument means use current buffer as BUFFER.") ! 339: (buffer) ! 340: register Lisp_Object buffer; ! 341: { ! 342: if (NULL (buffer)) ! 343: return current_buffer->filename; ! 344: CHECK_BUFFER (buffer, 0); ! 345: return XBUFFER (buffer)->filename; ! 346: } ! 347: ! 348: DEFUN ("buffer-local-variables", Fbuffer_local_variables, ! 349: Sbuffer_local_variables, 0, 1, 0, ! 350: "Return alist of variables that are buffer-local in BUFFER.\n\ ! 351: No argument means use current buffer as BUFFER.\n\ ! 352: Each element of the value looks like (SYMBOL . VALUE).\n\ ! 353: Note that storing new VALUEs in these elements\n\ ! 354: does not change the local values.") ! 355: (buffer) ! 356: register Lisp_Object buffer; ! 357: { ! 358: register struct buffer *buf; ! 359: register Lisp_Object val; ! 360: ! 361: if (NULL (buffer)) ! 362: buf = current_buffer; ! 363: else ! 364: { ! 365: CHECK_BUFFER (buffer, 0); ! 366: buf = XBUFFER (buffer); ! 367: } ! 368: ! 369: { ! 370: /* Reference each variable in the alist in our current buffer. ! 371: If inquiring about the current buffer, this gets the current values, ! 372: so store them into the alist so the alist is up to date. ! 373: If inquiring about some other buffer, this swaps out any values ! 374: for that buffer, making the alist up to date automatically. */ ! 375: register Lisp_Object tem; ! 376: for (tem = buf->local_var_alist; CONSP (tem); tem = XCONS (tem)->cdr) ! 377: { ! 378: Lisp_Object v1 = Fsymbol_value (XCONS (XCONS (tem)->car)->car); ! 379: if (buf == current_buffer) ! 380: XCONS (XCONS (tem)->car)->cdr = v1; ! 381: } ! 382: } ! 383: ! 384: /* Make a copy of the alist, to return it. */ ! 385: val = Fcopy_alist (buf->local_var_alist); ! 386: ! 387: /* Add on all the variables stored in special slots. */ ! 388: { ! 389: register int offset, mask; ! 390: ! 391: for (offset = (char *)&buffer_local_symbols.name - (char *)&buffer_local_symbols; ! 392: offset < sizeof (struct buffer); ! 393: offset += (sizeof (int))) /* sizeof int == sizeof Lisp_Object */ ! 394: { ! 395: mask = *(int *)(offset + (char *) &buffer_local_flags); ! 396: if (mask == -1 || (buf->local_var_flags & mask)) ! 397: if (XTYPE (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols)) ! 398: == Lisp_Symbol) ! 399: val = Fcons (Fcons (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols), ! 400: *(Lisp_Object *)(offset + (char *)buf)), ! 401: val); ! 402: } ! 403: } ! 404: return (val); ! 405: } ! 406: ! 407: ! 408: DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p, ! 409: 0, 1, 0, ! 410: "Return t if BUFFER is modified since file last read in or saved.\n\ ! 411: No argument means use current buffer as BUFFER.") ! 412: (buffer) ! 413: register Lisp_Object buffer; ! 414: { ! 415: register struct buffer *buf; ! 416: if (NULL (buffer)) ! 417: buf = current_buffer; ! 418: else ! 419: { ! 420: CHECK_BUFFER (buffer, 0); ! 421: buf = XBUFFER (buffer); ! 422: } ! 423: ! 424: return buf->save_modified < BUF_MODIFF (buf) ? Qt : Qnil; ! 425: } ! 426: ! 427: DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p, ! 428: 1, 1, 0, ! 429: "Mark current buffer as modified or unmodified according to FLAG.") ! 430: (flag) ! 431: register Lisp_Object flag; ! 432: { ! 433: register int already; ! 434: register Lisp_Object fn; ! 435: ! 436: #ifdef CLASH_DETECTION ! 437: /* If buffer becoming modified, lock the file. ! 438: If buffer becoming unmodified, unlock the file. */ ! 439: ! 440: fn = current_buffer->filename; ! 441: if (!NULL (fn)) ! 442: { ! 443: already = current_buffer->save_modified < MODIFF; ! 444: if (!already && !NULL (flag)) ! 445: lock_file (fn); ! 446: else if (already && NULL (flag)) ! 447: unlock_file (fn); ! 448: } ! 449: #endif /* CLASH_DETECTION */ ! 450: ! 451: current_buffer->save_modified = NULL (flag) ? MODIFF : 0; ! 452: update_mode_lines++; ! 453: return flag; ! 454: } ! 455: ! 456: DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 1, ! 457: "sRename buffer (to new name): ", ! 458: "Change current buffer's name to NEWNAME (a string).") ! 459: (name) ! 460: register Lisp_Object name; ! 461: { ! 462: register Lisp_Object tem, buf; ! 463: ! 464: CHECK_STRING (name, 0); ! 465: tem = Fget_buffer (name); ! 466: if (!NULL (tem)) ! 467: error ("Buffer name \"%s\" is in use", XSTRING (name)->data); ! 468: ! 469: XSET (buf, Lisp_Buffer, current_buffer); ! 470: tem = Fmemq (buf, Vminibuffer_list); ! 471: if (!NULL (tem)) ! 472: error ("Cannot rename a minibuffer"); ! 473: ! 474: current_buffer->name = name; ! 475: Fsetcar (Frassq (buf, Vbuffer_alist), name); ! 476: if (NULL (current_buffer->filename) && !NULL (current_buffer->auto_save_file_name)) ! 477: call0 (intern ("rename-auto-save-file")); ! 478: return Qnil; ! 479: } ! 480: ! 481: DEFUN ("other-buffer", Fother_buffer, Sother_buffer, 0, 1, 0, ! 482: "Return most recently selected buffer other than BUFFER.\n\ ! 483: Buffers not visible in windows are preferred to visible buffers.\n\ ! 484: If no other exists, the buffer *scratch* is returned.\n\ ! 485: If BUFFER is omitted or nil, some interesting buffer is returned.") ! 486: (buffer) ! 487: register Lisp_Object buffer; ! 488: { ! 489: register Lisp_Object tail, buf, notsogood, tem; ! 490: notsogood = Qnil; ! 491: ! 492: for (tail = Vbuffer_alist; !NULL (tail); tail = Fcdr (tail)) ! 493: { ! 494: buf = Fcdr (Fcar (tail)); ! 495: if (EQ (buf, buffer)) ! 496: continue; ! 497: if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ') ! 498: continue; ! 499: tem = Fget_buffer_window (buf); ! 500: if (NULL (tem)) ! 501: return buf; ! 502: if (NULL (notsogood)) ! 503: notsogood = buf; ! 504: } ! 505: if (!NULL (notsogood)) ! 506: return notsogood; ! 507: return Fget_buffer_create (build_string ("*scratch*")); ! 508: } ! 509: ! 510: DEFUN ("buffer-flush-undo", Fbuffer_flush_undo, Sbuffer_flush_undo, 1, 1, 0, ! 511: "Make BUFFER stop keeping undo information.") ! 512: (buf) ! 513: register Lisp_Object buf; ! 514: { ! 515: CHECK_BUFFER (buf, 0); ! 516: XBUFFER (buf)->undo_list = Qt; ! 517: return Qnil; ! 518: } ! 519: ! 520: DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo, ! 521: 0, 1, "", ! 522: "Start keeping undo information for buffer BUFFER (default is current buffer).") ! 523: (buf) ! 524: register Lisp_Object buf; ! 525: { ! 526: if (NULL (buf)) ! 527: { ! 528: if (EQ (current_buffer->undo_list, Qt)) ! 529: current_buffer->undo_list = Qnil; ! 530: } ! 531: else ! 532: { ! 533: CHECK_BUFFER (buf, 0); ! 534: if (EQ (XBUFFER (buf)->undo_list, Qt)) ! 535: XBUFFER (buf)->undo_list = Qnil; ! 536: } ! 537: return Qnil; ! 538: } ! 539: ! 540: DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 1, 1, "bKill buffer: ", ! 541: "One arg, a string or a buffer. Get rid of the specified buffer.\n\ ! 542: Any processes that have this buffer as the `process-buffer' are killed\n\ ! 543: with `delete-process'.") ! 544: (bufname) ! 545: Lisp_Object bufname; ! 546: { ! 547: Lisp_Object buf; ! 548: register struct buffer *b; ! 549: register Lisp_Object tem; ! 550: register struct Lisp_Marker *m; ! 551: struct gcpro gcpro1, gcpro2; ! 552: ! 553: if (NULL (bufname)) ! 554: buf = Fcurrent_buffer (); ! 555: else ! 556: buf = Fget_buffer (bufname); ! 557: if (NULL (buf)) ! 558: nsberror (bufname); ! 559: ! 560: b = XBUFFER (buf); ! 561: ! 562: if (FROM_KBD && !NULL (b->filename) ! 563: && BUF_MODIFF (b) > b->save_modified) ! 564: { ! 565: GCPRO2 (buf, bufname); ! 566: tem = Fyes_or_no_p (format1 ("Buffer %s modified; kill anyway? ", ! 567: XSTRING (b->name)->data)); ! 568: UNGCPRO; ! 569: if (NULL (tem)) ! 570: return Qnil; ! 571: } ! 572: ! 573: /* We have no more questions to ask. Verify that it is valid ! 574: to kill the buffer. This must be done after the questions ! 575: since anything can happen within Fyes_or_no_p. */ ! 576: ! 577: /* Don't kill the minibuffer now current. */ ! 578: if (EQ (buf, XWINDOW (minibuf_window)->buffer)) ! 579: return Qnil; ! 580: ! 581: if (NULL (b->name)) ! 582: return Qnil; ! 583: ! 584: /* Make this buffer not be current. ! 585: In the process, notice if this is the sole visible buffer ! 586: and give up if so. */ ! 587: if (b == current_buffer) ! 588: { ! 589: tem = Fother_buffer (buf); ! 590: Fset_buffer (tem); ! 591: if (b == current_buffer) ! 592: return Qnil; ! 593: } ! 594: ! 595: /* Now there is no question: we can kill the buffer. */ ! 596: ! 597: #ifdef CLASH_DETECTION ! 598: /* Unlock this buffer's file, if it is locked. */ ! 599: unlock_buffer (b); ! 600: #endif /* CLASH_DETECTION */ ! 601: ! 602: #ifdef subprocesses ! 603: kill_buffer_processes (buf); ! 604: #endif subprocesses ! 605: ! 606: tem = Vinhibit_quit; ! 607: Vinhibit_quit = Qt; ! 608: Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist); ! 609: Freplace_buffer_in_windows (buf); ! 610: Vinhibit_quit = tem; ! 611: ! 612: /* Unchain all markers of this buffer ! 613: and leave them pointing nowhere. */ ! 614: for (tem = b->markers; !EQ (tem, Qnil); ) ! 615: { ! 616: m = XMARKER (tem); ! 617: m->buffer = 0; ! 618: tem = m->chain; ! 619: m->chain = Qnil; ! 620: } ! 621: b->markers = Qnil; ! 622: ! 623: b->name = Qnil; ! 624: b->undo_list = Qnil; ! 625: free (BUF_BEG_ADDR (b)); ! 626: ! 627: return Qnil; ! 628: } ! 629: ! 630: /* Put the element for buffer `buf' at the front of buffer-alist. ! 631: This is done when a buffer is selected "visibly". ! 632: It keeps buffer-alist in the order of recency of selection ! 633: so that other_buffer will return something nice. */ ! 634: ! 635: record_buffer (buf) ! 636: Lisp_Object buf; ! 637: { ! 638: register Lisp_Object link, prev; ! 639: ! 640: prev = Qnil; ! 641: for (link = Vbuffer_alist; CONSP (link); link = XCONS (link)->cdr) ! 642: { ! 643: if (EQ (XCONS (XCONS (link)->car)->cdr, buf)) ! 644: break; ! 645: prev = link; ! 646: } ! 647: ! 648: /* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist) ! 649: but cannot use Fdelq here it that allows quitting. */ ! 650: ! 651: if (NULL (prev)) ! 652: Vbuffer_alist = XCONS (Vbuffer_alist)->cdr; ! 653: else ! 654: XCONS (prev)->cdr = XCONS (XCONS (prev)->cdr)->cdr; ! 655: ! 656: XCONS(link)->cdr = Vbuffer_alist; ! 657: Vbuffer_alist = link; ! 658: } ! 659: ! 660: DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ", ! 661: "Select buffer BUFFER in the current window.\n\ ! 662: BUFFER may be a buffer or a buffer name.\n\ ! 663: Optional second arg NORECORD non-nil means\n\ ! 664: do not put this buffer at the front of the list of recently selected ones.\n\ ! 665: \n\ ! 666: WARNING: This is NOT the way to work on another buffer temporarily\n\ ! 667: within a Lisp program! Use `set-buffer' instead. That avoids messing with\n\ ! 668: the window-buffer correspondances.") ! 669: (bufname, norecord) ! 670: Lisp_Object bufname, norecord; ! 671: { ! 672: register Lisp_Object buf; ! 673: ! 674: if (EQ (minibuf_window, selected_window)) ! 675: error ("Cannot switch buffers in minibuffer window"); ! 676: ! 677: if (NULL (bufname)) ! 678: buf = Fother_buffer (Fcurrent_buffer ()); ! 679: else ! 680: buf = Fget_buffer_create (bufname); ! 681: Fset_buffer (buf); ! 682: if (NULL (norecord)) ! 683: record_buffer (buf); ! 684: ! 685: Fset_window_buffer (EQ (selected_window, minibuf_window) ! 686: ? Fnext_window (minibuf_window, Qnil) : selected_window, ! 687: buf); ! 688: ! 689: return Qnil; ! 690: } ! 691: ! 692: DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 2, 0, ! 693: "Select buffer BUFFER in some window, preferably a different one.\n\ ! 694: If pop-up-windows is non-nil, windows can be split to do this.\n\ ! 695: If second arg OTHER-WINDOW is non-nil, insist on finding another\n\ ! 696: window even if BUFFER is already visible in the selected window.") ! 697: (bufname, other) ! 698: Lisp_Object bufname, other; ! 699: { ! 700: register Lisp_Object buf; ! 701: if (NULL (bufname)) ! 702: buf = Fother_buffer (Fcurrent_buffer ()); ! 703: else ! 704: buf = Fget_buffer_create (bufname); ! 705: Fset_buffer (buf); ! 706: record_buffer (buf); ! 707: Fselect_window (Fdisplay_buffer (buf, other)); ! 708: return Qnil; ! 709: } ! 710: ! 711: DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0, ! 712: "Return the current buffer as a Lisp buffer object.") ! 713: () ! 714: { ! 715: register Lisp_Object buf; ! 716: XSET (buf, Lisp_Buffer, current_buffer); ! 717: return buf; ! 718: } ! 719: ! 720: DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, ! 721: "Set the current buffer to the buffer or buffer name supplied as argument.\n\ ! 722: That buffer will then be the default for editing operations and printing.\n\ ! 723: This function's effect can't last past end of current command\n\ ! 724: because returning to command level\n\ ! 725: selects the chosen buffer of the current window,\n\ ! 726: and this function has no effect on what buffer that is.\n\ ! 727: See also `save-excursion' when you want to select a buffer temporarily.\n\ ! 728: Use `switch-to-buffer' or `pop-to-buffer' for interactive buffer selection.") ! 729: (bufname) ! 730: register Lisp_Object bufname; ! 731: { ! 732: register Lisp_Object buffer; ! 733: buffer = Fget_buffer (bufname); ! 734: if (NULL (buffer)) ! 735: nsberror (bufname); ! 736: if (NULL (XBUFFER (buffer)->name)) ! 737: error ("Selecting deleted buffer"); ! 738: set_buffer_internal (XBUFFER (buffer)); ! 739: return buffer; ! 740: } ! 741: ! 742: DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only, ! 743: Sbarf_if_buffer_read_only, 0, 0, 0, ! 744: "Signal a buffer-read-only error if the current buffer is read-only.") ! 745: () ! 746: { ! 747: while (!NULL (current_buffer->read_only)) ! 748: Fsignal (Qbuffer_read_only, (Fcons (Fcurrent_buffer (), Qnil))); ! 749: return Qnil; ! 750: } ! 751: ! 752: DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 0, 1, "", ! 753: "Put BUFFER at the end of the list of all buffers.\n\ ! 754: There it is the least likely candidate for other-buffer to return;\n\ ! 755: thus, the least likely buffer for \\[switch-to-buffer] to select by default.\n\ ! 756: BUFFER is also removed from the selected window if it was displayed there.") ! 757: (buf) ! 758: register Lisp_Object buf; ! 759: { ! 760: register Lisp_Object aelt, link; ! 761: ! 762: if (NULL (buf)) ! 763: { ! 764: XSET (buf, Lisp_Buffer, current_buffer); ! 765: Fswitch_to_buffer (Fother_buffer (buf), Qnil); ! 766: } ! 767: else ! 768: { ! 769: Lisp_Object buf1; ! 770: ! 771: buf1 = Fget_buffer (buf); ! 772: if (NULL (buf1)) ! 773: nsberror (buf); ! 774: buf = buf1; ! 775: } ! 776: ! 777: aelt = Frassq (buf, Vbuffer_alist); ! 778: link = Fmemq (aelt, Vbuffer_alist); ! 779: Vbuffer_alist = Fdelq (aelt, Vbuffer_alist); ! 780: XCONS (link)->cdr = Qnil; ! 781: Vbuffer_alist = nconc2 (Vbuffer_alist, link); ! 782: return Qnil; ! 783: } ! 784: ! 785: extern int last_known_column_point; ! 786: ! 787: /* Set the current buffer to B, which is a C pointer, ! 788: rather than a Lisp object. */ ! 789: ! 790: set_buffer_internal (b) ! 791: register struct buffer *b; ! 792: { ! 793: register struct buffer *swb = 0; ! 794: register struct buffer *old_buf; ! 795: register Lisp_Object tail, valcontents; ! 796: enum Lisp_Type tem; ! 797: ! 798: if (current_buffer == b) ! 799: return; ! 800: ! 801: #if 0 ! 802: if (XWINDOW (selected_window) != 0) ! 803: swb = NULL (selected_window) ? 0 : XBUFFER (XWINDOW (selected_window)->buffer); ! 804: #endif ! 805: ! 806: windows_or_buffers_changed = 1; ! 807: ! 808: /* Vcheck_symbol is set up to the symbol paragraph-start ! 809: in order to check for the bug that clobbers it. */ ! 810: /* if (current_buffer && EQ (current_buffer->major_mode, Qlisp_mode) ! 811: && XFASTINT (Vcheck_symbol) != 0 ! 812: && !NULL (Vcheck_symbol)) ! 813: { ! 814: valcontents = XSYMBOL (Vcheck_symbol)->value; ! 815: if (XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value) ! 816: abort (); ! 817: if (current_buffer == XBUFFER (XCONS (XCONS (valcontents)->cdr)->car) ! 818: && (XTYPE (XCONS (valcontents)->car) != Lisp_String ! 819: || XSTRING (XCONS (valcontents)->car)->size != 6)) ! 820: abort (); ! 821: } ! 822: */ ! 823: ! 824: #if 0 ! 825: if (current_buffer == swb && !NULL (selected_window)) ! 826: Fset_marker (XWINDOW (selected_window)->pointm, make_number (point), ! 827: XWINDOW (selected_window)->buffer); ! 828: #endif ! 829: old_buf = current_buffer; ! 830: current_buffer = b; ! 831: #if 0 ! 832: if (b == swb) ! 833: { ! 834: SET_PT (marker_position (XWINDOW (selected_window)->pointm)); ! 835: if (point < BEGV) ! 836: point = BEGV; ! 837: if (point > ZV) ! 838: point = ZV; ! 839: } ! 840: #endif ! 841: last_known_column_point = -1; /* invalidate indentation cache */ ! 842: ! 843: /* Look down buffer's list of local Lisp variables ! 844: to find and update any that forward into C variables. */ ! 845: ! 846: for (tail = b->local_var_alist; !NULL (tail); tail = XCONS (tail)->cdr) ! 847: { ! 848: valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value; ! 849: if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value ! 850: || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) ! 851: && (tem = XTYPE (XCONS (valcontents)->car), ! 852: (tem == Lisp_Boolfwd || tem == Lisp_Intfwd ! 853: || tem == Lisp_Objfwd))) ! 854: /* Just reference the variable ! 855: to cause it to become set for this buffer. */ ! 856: Fsymbol_value (XCONS (XCONS (tail)->car)->car); ! 857: } ! 858: ! 859: /* Do the same with any others that were local to the previous buffer */ ! 860: ! 861: if (old_buf) ! 862: for (tail = old_buf->local_var_alist; !NULL (tail); tail = XCONS (tail)->cdr) ! 863: { ! 864: valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value; ! 865: if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value ! 866: || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value) ! 867: && (tem = XTYPE (XCONS (valcontents)->car), ! 868: (tem == Lisp_Boolfwd || tem == Lisp_Intfwd ! 869: || tem == Lisp_Objfwd))) ! 870: /* Just reference the variable ! 871: to cause it to become set for this buffer. */ ! 872: Fsymbol_value (XCONS (XCONS (tail)->car)->car); ! 873: } ! 874: /* Vcheck_symbol is set up to the symbol paragraph-start ! 875: in order to check for the bug that clobbers it. */ ! 876: /*if (EQ (b->major_mode, Qlisp_mode) ! 877: && Vcheck_symbol ! 878: && !NULL (Vcheck_symbol)) ! 879: { ! 880: valcontents = XSYMBOL (Vcheck_symbol)->value; ! 881: if (XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value) ! 882: abort (); ! 883: if (b == XBUFFER (XCONS (XCONS (valcontents)->cdr)->car) ! 884: && (XTYPE (XCONS (valcontents)->car) != Lisp_String ! 885: || XSTRING (XCONS (valcontents)->car)->size != 6)) ! 886: abort (); ! 887: Fsymbol_value (Vcheck_symbol); ! 888: valcontents = XSYMBOL (Vcheck_symbol)->value; ! 889: if (b != XBUFFER (XCONS (XCONS (valcontents)->cdr)->car) ! 890: || XTYPE (XCONS (valcontents)->car) != Lisp_String ! 891: || XSTRING (XCONS (valcontents)->car)->size != 6) ! 892: abort (); ! 893: } ! 894: */ ! 895: } ! 896: ! 897: DEFUN ("erase-buffer", Ferase_buffer, Serase_buffer, 0, 0, 0, ! 898: "Delete the entire contents of the current buffer.") ! 899: () ! 900: { ! 901: Fwiden (); ! 902: del_range (BEG, Z); ! 903: current_buffer->last_window_start = 1; ! 904: /* Prevent warnings, or suspension of auto saving, that would happen ! 905: if future size is less than past size. Use of erase-buffer ! 906: implies that the future text is not really related to the past text. */ ! 907: XFASTINT (current_buffer->save_length) = 0; ! 908: return Qnil; ! 909: } ! 910: ! 911: validate_region (b, e) ! 912: register Lisp_Object *b, *e; ! 913: { ! 914: register int i; ! 915: ! 916: CHECK_NUMBER_COERCE_MARKER (*b, 0); ! 917: CHECK_NUMBER_COERCE_MARKER (*e, 1); ! 918: ! 919: if (XINT (*b) > XINT (*e)) ! 920: { ! 921: i = XFASTINT (*b); /* This is legit even if *b is < 0 */ ! 922: *b = *e; ! 923: XFASTINT (*e) = i; /* because this is all we do with i. */ ! 924: } ! 925: ! 926: if (!(BEGV <= XINT (*b) && XINT (*b) <= XINT (*e) ! 927: && XINT (*e) <= ZV)) ! 928: args_out_of_range (*b, *e); ! 929: } ! 930: ! 931: Lisp_Object ! 932: list_buffers_1 (files) ! 933: Lisp_Object files; ! 934: { ! 935: register Lisp_Object tail, tem, buf; ! 936: Lisp_Object col1, col2, col3, minspace; ! 937: register struct buffer *old = current_buffer, *b; ! 938: int desired_point = 0; ! 939: ! 940: XFASTINT (col1) = 19; ! 941: XFASTINT (col2) = 25; ! 942: XFASTINT (col3) = 40; ! 943: XFASTINT (minspace) = 1; ! 944: ! 945: Fset_buffer (Vstandard_output); ! 946: ! 947: tail = intern ("Buffer-menu-mode"); ! 948: if (!EQ (tail, current_buffer->major_mode) ! 949: && (tem = Ffboundp (tail), !NULL (tem))) ! 950: call0 (tail); ! 951: Fbuffer_flush_undo (Vstandard_output); ! 952: current_buffer->read_only = Qnil; ! 953: ! 954: write_string ("\ ! 955: MR Buffer Size Mode File\n\ ! 956: -- ------ ---- ---- ----\n", -1); ! 957: ! 958: for (tail = Vbuffer_alist; !NULL (tail); tail = Fcdr (tail)) ! 959: { ! 960: buf = Fcdr (Fcar (tail)); ! 961: b = XBUFFER (buf); ! 962: /* Don't mention the minibuffers. */ ! 963: if (XSTRING (b->name)->data[0] == ' ') ! 964: continue; ! 965: /* Optionally don't mention buffers that lack files. */ ! 966: if (!NULL (files) && NULL (b->filename)) ! 967: continue; ! 968: /* Identify the current buffer. */ ! 969: if (b == old) ! 970: desired_point = point; ! 971: write_string (b == old ? "." : " ", -1); ! 972: /* Identify modified buffers */ ! 973: write_string (BUF_MODIFF (b) > b->save_modified ? "*" : " ", -1); ! 974: write_string (NULL (b->read_only) ? " " : "% ", -1); ! 975: Fprinc (b->name, Qnil); ! 976: Findent_to (col1, make_number (2)); ! 977: XFASTINT (tem) = BUF_Z (b) - BUF_BEG (b); ! 978: Fprin1 (tem, Qnil); ! 979: Findent_to (col2, minspace); ! 980: Fprinc (b->mode_name, Qnil); ! 981: Findent_to (col3, minspace); ! 982: if (!NULL (b->filename)) ! 983: Fprinc (b->filename, Qnil); ! 984: write_string ("\n", -1); ! 985: } ! 986: ! 987: current_buffer->read_only = Qt; ! 988: set_buffer_internal (old); ! 989: /* Foo. This doesn't work since temp_output_buffer_show sets point to 1 ! 990: if (desired_point) ! 991: BUF_PT (XBUFFER (Vstandard_output)) = desired_point; ! 992: */ ! 993: return Qnil; ! 994: } ! 995: ! 996: DEFUN ("list-buffers", Flist_buffers, Slist_buffers, 0, 1, "P", ! 997: "Display a list of names of existing buffers.\n\ ! 998: Inserts it in buffer *Buffer List* and displays that.\n\ ! 999: Note that buffers with names starting with spaces are omitted.\n\ ! 1000: Non-null optional arg FILES-ONLY means mention only file buffers.\n\ ! 1001: \n\ ! 1002: The M column contains a * for buffers that are modified.\n\ ! 1003: The R column contains a % for buffers that are read-only.") ! 1004: (files) ! 1005: Lisp_Object files; ! 1006: { ! 1007: internal_with_output_to_temp_buffer ("*Buffer List*", ! 1008: list_buffers_1, files); ! 1009: return Qnil; ! 1010: } ! 1011: ! 1012: DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables, ! 1013: 0, 0, 0, ! 1014: "Eliminate all the buffer-local variable values of the current buffer.\n\ ! 1015: This buffer will then see the default values of all variables.") ! 1016: () ! 1017: { ! 1018: register Lisp_Object alist, sym, tem; ! 1019: ! 1020: for (alist = current_buffer->local_var_alist; !NULL (alist); alist = XCONS (alist)->cdr) ! 1021: { ! 1022: sym = XCONS (XCONS (alist)->car)->car; ! 1023: ! 1024: /* Need not do anything if some other buffer's binding is now encached. */ ! 1025: tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car; ! 1026: if (XBUFFER (tem) == current_buffer) ! 1027: { ! 1028: /* Symbol is set up for this buffer's old local value. ! 1029: Set it up for the current buffer with the default value. */ ! 1030: ! 1031: tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr; ! 1032: XCONS (tem)->car = tem; ! 1033: XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Fcurrent_buffer (); ! 1034: store_symval_forwarding (sym, XCONS (XSYMBOL (sym)->value)->car, ! 1035: XCONS (tem)->cdr); ! 1036: } ! 1037: } ! 1038: ! 1039: reset_buffer_local_variables (current_buffer); ! 1040: return Qnil; ! 1041: } ! 1042: ! 1043: extern Lisp_Object Vprin1_to_string_buffer; /* in print.c */ ! 1044: init_buffer_once () ! 1045: { ! 1046: register Lisp_Object tem; ! 1047: ! 1048: /* Make sure all markable slots in buffer_defaults ! 1049: are initialized reasonably, so mark_buffer won't choke. */ ! 1050: reset_buffer (&buffer_defaults); ! 1051: reset_buffer (&buffer_local_symbols); ! 1052: XSET (Vbuffer_defaults, Lisp_Buffer, &buffer_defaults); ! 1053: XSET (Vbuffer_local_symbols, Lisp_Buffer, &buffer_local_symbols); ! 1054: ! 1055: /* Set up the default values of various buffer slots. */ ! 1056: /* Must do these before making the first buffer! */ ! 1057: ! 1058: /* real setup is done in loaddefs.el */ ! 1059: buffer_defaults.mode_line_format = build_string ("%-"); ! 1060: buffer_defaults.abbrev_mode = Qnil; ! 1061: buffer_defaults.overwrite_mode = Qnil; ! 1062: buffer_defaults.case_fold_search = Qt; ! 1063: buffer_defaults.auto_fill_hook = Qnil; ! 1064: buffer_defaults.selective_display = Qnil; ! 1065: buffer_defaults.selective_display_ellipses = Qt; ! 1066: buffer_defaults.abbrev_table = Qnil; ! 1067: buffer_defaults.undo_list = Qnil; ! 1068: ! 1069: XFASTINT (buffer_defaults.tab_width) = 8; ! 1070: buffer_defaults.truncate_lines = Qnil; ! 1071: buffer_defaults.ctl_arrow = Qt; ! 1072: ! 1073: XFASTINT (buffer_defaults.fill_column) = 70; ! 1074: XFASTINT (buffer_defaults.left_margin) = 0; ! 1075: ! 1076: /* Assign the local-flags to the slots that have default values. ! 1077: The local flag is a bit that is used in the buffer ! 1078: to say that it has its own local value for the slot. ! 1079: The local flag bits are in the local_var_flags slot of the buffer. */ ! 1080: ! 1081: /* Nothing can work if this isn't true */ ! 1082: if (sizeof (int) != sizeof (Lisp_Object)) abort (); ! 1083: ! 1084: /* 0 means not a lisp var, -1 means always local, else mask */ ! 1085: bzero (&buffer_local_flags, sizeof buffer_local_flags); ! 1086: XFASTINT (buffer_local_flags.filename) = -1; ! 1087: XFASTINT (buffer_local_flags.directory) = -1; ! 1088: XFASTINT (buffer_local_flags.backed_up) = -1; ! 1089: XFASTINT (buffer_local_flags.save_length) = -1; ! 1090: XFASTINT (buffer_local_flags.auto_save_file_name) = -1; ! 1091: XFASTINT (buffer_local_flags.read_only) = -1; ! 1092: XFASTINT (buffer_local_flags.major_mode) = -1; ! 1093: XFASTINT (buffer_local_flags.mode_name) = -1; ! 1094: XFASTINT (buffer_local_flags.undo_list) = -1; ! 1095: ! 1096: XFASTINT (buffer_local_flags.mode_line_format) = 1; ! 1097: XFASTINT (buffer_local_flags.abbrev_mode) = 2; ! 1098: XFASTINT (buffer_local_flags.overwrite_mode) = 4; ! 1099: XFASTINT (buffer_local_flags.case_fold_search) = 8; ! 1100: XFASTINT (buffer_local_flags.auto_fill_hook) = 0x10; ! 1101: XFASTINT (buffer_local_flags.selective_display) = 0x20; ! 1102: XFASTINT (buffer_local_flags.selective_display_ellipses) = 0x40; ! 1103: XFASTINT (buffer_local_flags.tab_width) = 0x80; ! 1104: XFASTINT (buffer_local_flags.truncate_lines) = 0x100; ! 1105: XFASTINT (buffer_local_flags.ctl_arrow) = 0x200; ! 1106: XFASTINT (buffer_local_flags.fill_column) = 0x400; ! 1107: XFASTINT (buffer_local_flags.left_margin) = 0x800; ! 1108: XFASTINT (buffer_local_flags.abbrev_table) = 0x1000; ! 1109: XFASTINT (buffer_local_flags.syntax_table) = 0x2000; ! 1110: ! 1111: Vbuffer_alist = Qnil; ! 1112: current_buffer = 0; ! 1113: all_buffers = 0; ! 1114: ! 1115: QSFundamental = build_string ("Fundamental"); ! 1116: ! 1117: Qfundamental_mode = intern ("fundamental-mode"); ! 1118: buffer_defaults.major_mode = Qfundamental_mode; ! 1119: ! 1120: Qmode_class = intern ("mode-class"); ! 1121: ! 1122: Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1")); ! 1123: /* super-magic invisible buffer */ ! 1124: Vbuffer_alist = Qnil; ! 1125: ! 1126: Fset_buffer (Fget_buffer_create (build_string ("*scratch*"))); ! 1127: } ! 1128: ! 1129: init_buffer () ! 1130: { ! 1131: char buf[MAXPATHLEN+1]; ! 1132: ! 1133: Fset_buffer (Fget_buffer_create (build_string ("*scratch*"))); ! 1134: if (getwd (buf) == 0) ! 1135: fatal ("`getwd' failed: %s.\n", buf); ! 1136: ! 1137: #ifndef VMS ! 1138: /* Maybe this should really use some standard subroutine ! 1139: whose definition is filename syntax dependent. */ ! 1140: if (buf[strlen (buf) - 1] != '/') ! 1141: strcat (buf, "/"); ! 1142: #endif /* not VMS */ ! 1143: current_buffer->directory = build_string (buf); ! 1144: } ! 1145: ! 1146: /* initialize the buffer routines */ ! 1147: syms_of_buffer () ! 1148: { ! 1149: staticpro (&Vbuffer_defaults); ! 1150: staticpro (&Vbuffer_local_symbols); ! 1151: staticpro (&Qfundamental_mode); ! 1152: staticpro (&Qmode_class); ! 1153: staticpro (&QSFundamental); ! 1154: staticpro (&Vbuffer_alist); ! 1155: ! 1156: /*staticpro (&Qlisp_mode); ! 1157: Qlisp_mode = intern ("lisp-mode"); ! 1158: */ ! 1159: ! 1160: /* All these use DEFVAR_LISP_NOPRO because the slots in ! 1161: buffer_defaults will all be marked via Vbuffer_defaults. */ ! 1162: ! 1163: DEFVAR_LISP_NOPRO ("default-mode-line-format", ! 1164: &buffer_defaults.mode_line_format, ! 1165: "Default mode-line-format for buffers that do not override it.\n\ ! 1166: This is the same as (default-value 'mode-line-format)."); ! 1167: ! 1168: DEFVAR_LISP_NOPRO ("default-abbrev-mode", ! 1169: &buffer_defaults.abbrev_mode, ! 1170: "Default abbrev-mode for buffers that do not override it.\n\ ! 1171: This is the same as (default-value 'abbrev-mode)."); ! 1172: ! 1173: DEFVAR_LISP_NOPRO ("default-ctl-arrow", ! 1174: &buffer_defaults.ctl_arrow, ! 1175: "Default ctl-arrow for buffers that do not override it.\n\ ! 1176: This is the same as (default-value 'ctl-arrow)."); ! 1177: ! 1178: DEFVAR_LISP_NOPRO ("default-truncate-lines", ! 1179: &buffer_defaults.truncate_lines, ! 1180: "Default truncate-lines for buffers that do not override it.\n\ ! 1181: This is the same as (default-value 'truncate-lines)."); ! 1182: ! 1183: DEFVAR_LISP_NOPRO ("default-fill-column", ! 1184: &buffer_defaults.fill_column, ! 1185: "Default fill-column for buffers that do not override it.\n\ ! 1186: This is the same as (default-value 'fill-column)."); ! 1187: ! 1188: DEFVAR_LISP_NOPRO ("default-left-margin", ! 1189: &buffer_defaults.left_margin, ! 1190: "Default left-margin for buffers that do not override it.\n\ ! 1191: This is the same as (default-value 'left-margin)."); ! 1192: ! 1193: DEFVAR_LISP_NOPRO ("default-tab-width", ! 1194: &buffer_defaults.tab_width, ! 1195: "Default tab-width for buffers that do not override it.\n\ ! 1196: This is the same as (default-value 'tab-width)."); ! 1197: ! 1198: DEFVAR_LISP_NOPRO ("default-case-fold-search", ! 1199: &buffer_defaults.case_fold_search, ! 1200: "Default case-fold-search for buffers that do not override it.\n\ ! 1201: This is the same as (default-value 'case-fold-search)."); ! 1202: ! 1203: DEFVAR_PER_BUFFER ("mode-line-format", ¤t_buffer->mode_line_format, 0); ! 1204: ! 1205: /* This doc string is too long for cpp; cpp dies. ! 1206: DEFVAR_PER_BUFFER ("mode-line-format", ¤t_buffer->mode_line_format, ! 1207: "Template for displaying mode line for current buffer.\n\ ! 1208: Each buffer has its own value of this variable.\n\ ! 1209: Value may be a string, a symbol or a list or cons cell.\n\ ! 1210: For a symbol, its value is used (but it is ignored if t or nil).\n\ ! 1211: A string appearing directly as the value of a symbol is processed verbatim\n\ ! 1212: in that the %-constructs below are not recognized.\n\ ! 1213: For a list whose car is a symbol, the symbol's value is taken,\n\ ! 1214: and if that is non-nil, the cadr of the list is processed recursively.\n\ ! 1215: Otherwise, the caddr of the list (if there is one) is processed.\n\ ! 1216: For a list whose car is a string or list, each element is processed\n\ ! 1217: recursively and the results are effectively concatenated.\n\ ! 1218: For a list whose car is an integer, the cdr of the list is processed\n\ ! 1219: and padded (if the number is positive) or truncated (if negative)\n\ ! 1220: to the width specified by that number.\n\ ! 1221: A string is printed verbatim in the mode line except for %-constructs:\n\ ! 1222: (%-constructs are allowed when the string is the entire mode-line-format\n\ ! 1223: or when it is found in a cons-cell or a list)\n\ ! 1224: %b -- print buffer name. %f -- print visited file name.\n\ ! 1225: %* -- print *, % or hyphen. %m -- print value of mode-name (obsolete).\n\ ! 1226: %s -- print process status. %M -- print value of global-mode-string. (obs)\n\ ! 1227: %p -- print percent of buffer above top of window, or top, bot or all.\n\ ! 1228: %n -- print Narrow if appropriate.\n\ ! 1229: %[ -- print one [ for each recursive editing level. %] similar.\n\ ! 1230: %% -- print %. %- -- print infinitely many dashes.\n\ ! 1231: Decimal digits after the % specify field width to which to pad."); ! 1232: */ ! 1233: ! 1234: DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults.major_mode, ! 1235: "*Major mode for new buffers. Defaults to fundamental-mode.\n\ ! 1236: nil here means use current buffer's major mode."); ! 1237: ! 1238: DEFVAR_PER_BUFFER ("major-mode", ¤t_buffer->major_mode, ! 1239: "Symbol for current buffer's major mode."); ! 1240: ! 1241: DEFVAR_PER_BUFFER ("abbrev-mode", ¤t_buffer->abbrev_mode, ! 1242: "Non-nil turns on automatic expansion of abbrevs when inserted.\n\ ! 1243: Automatically becomes local when set in any fashion."); ! 1244: ! 1245: DEFVAR_PER_BUFFER ("case-fold-search", ¤t_buffer->case_fold_search, ! 1246: "*Non-nil if searches should ignore case.\n\ ! 1247: Automatically becomes local when set in any fashion."); ! 1248: ! 1249: DEFVAR_PER_BUFFER ("mode-name", ¤t_buffer->mode_name, ! 1250: "Pretty name of current buffer's major mode (a string)."); ! 1251: ! 1252: DEFVAR_PER_BUFFER ("fill-column", ¤t_buffer->fill_column, ! 1253: "*Column beyond which automatic line-wrapping should happen.\n\ ! 1254: Automatically becomes local when set in any fashion."); ! 1255: ! 1256: DEFVAR_PER_BUFFER ("left-margin", ¤t_buffer->left_margin, ! 1257: "*Column for the default indent-line-function to indent to.\n\ ! 1258: Linefeed indents to this column in Fundamental mode.\n\ ! 1259: Automatically becomes local when set in any fashion."); ! 1260: ! 1261: DEFVAR_PER_BUFFER ("tab-width", ¤t_buffer->tab_width, ! 1262: "*Distance between tab stops (for display of tab characters), in columns.\n\ ! 1263: Automatically becomes local when set in any fashion."); ! 1264: ! 1265: DEFVAR_PER_BUFFER ("ctl-arrow", ¤t_buffer->ctl_arrow, ! 1266: "*Non-nil means display control chars with uparrow.\n\ ! 1267: Nil means use backslash and octal digits.\n\ ! 1268: Automatically becomes local when set in any fashion."); ! 1269: ! 1270: DEFVAR_PER_BUFFER ("truncate-lines", ¤t_buffer->truncate_lines, ! 1271: "*Non-nil means do not display continuation lines;\n\ ! 1272: give each line of text one screen line.\n\ ! 1273: Automatically becomes local when set in any fashion.\n\ ! 1274: \n\ ! 1275: Note that this is overridden by the variable\n\ ! 1276: truncate-partial-width-windows if that variable is non-nil\n\ ! 1277: and this buffer is not full-screen width."); ! 1278: ! 1279: DEFVAR_PER_BUFFER ("default-directory", ¤t_buffer->directory, ! 1280: "Name of default directory of current buffer. Should end with slash."); ! 1281: ! 1282: DEFVAR_PER_BUFFER ("auto-fill-hook", ¤t_buffer->auto_fill_hook, ! 1283: "Function called (if non-nil) after self-inserting a space at column beyond fill-column"); ! 1284: ! 1285: DEFVAR_PER_BUFFER ("buffer-file-name", ¤t_buffer->filename, ! 1286: "Name of file visited in current buffer, or nil if not visiting a file."); ! 1287: ! 1288: DEFVAR_PER_BUFFER ("buffer-auto-save-file-name", ! 1289: ¤t_buffer->auto_save_file_name, ! 1290: "Name of file for auto-saving current buffer,\n\ ! 1291: or nil if buffer should not be auto-saved."); ! 1292: ! 1293: DEFVAR_PER_BUFFER ("buffer-read-only", ¤t_buffer->read_only, ! 1294: "Non-nil if this buffer is read-only."); ! 1295: ! 1296: DEFVAR_PER_BUFFER ("buffer-backed-up", ¤t_buffer->backed_up, ! 1297: "Non-nil if this buffer's file has been backed up.\n\ ! 1298: Backing up is done before the first time the file is saved."); ! 1299: ! 1300: DEFVAR_PER_BUFFER ("buffer-saved-size", ¤t_buffer->save_length, ! 1301: "Length of current buffer when last read in, saved or auto-saved.\n\ ! 1302: 0 initially."); ! 1303: ! 1304: DEFVAR_PER_BUFFER ("selective-display", ¤t_buffer->selective_display, ! 1305: "t enables selective display:\n\ ! 1306: after a ^M, all the rest of the line is invisible.\n\ ! 1307: ^M's in the file are written into files as newlines.\n\ ! 1308: Integer n as value means display only lines\n\ ! 1309: that start with less than n columns of space.\n\ ! 1310: Automatically becomes local when set in any fashion."); ! 1311: ! 1312: DEFVAR_PER_BUFFER ("selective-display-ellipses", ! 1313: ¤t_buffer->selective_display_ellipses, ! 1314: "t means display ... on previous line when a line is invisible.\n\ ! 1315: Automatically becomes local when set in any fashion."); ! 1316: ! 1317: DEFVAR_PER_BUFFER ("overwrite-mode", ¤t_buffer->overwrite_mode, ! 1318: "Non-nil if self-insertion should replace existing text.\n\ ! 1319: Automatically becomes local when set in any fashion."); ! 1320: ! 1321: DEFVAR_PER_BUFFER ("buffer-undo-list", ¤t_buffer->undo_list, ! 1322: "List of undo entries in current buffer."); ! 1323: ! 1324: /*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol, ! 1325: "Don't ask."); ! 1326: */ ! 1327: defsubr (&Sbuffer_list); ! 1328: defsubr (&Sget_buffer); ! 1329: defsubr (&Sget_file_buffer); ! 1330: defsubr (&Sget_buffer_create); ! 1331: defsubr (&Sgenerate_new_buffer); ! 1332: defsubr (&Sbuffer_name); ! 1333: /*defsubr (&Sbuffer_number);*/ ! 1334: defsubr (&Sbuffer_file_name); ! 1335: defsubr (&Sbuffer_local_variables); ! 1336: defsubr (&Sbuffer_modified_p); ! 1337: defsubr (&Sset_buffer_modified_p); ! 1338: defsubr (&Srename_buffer); ! 1339: defsubr (&Sother_buffer); ! 1340: defsubr (&Sbuffer_flush_undo); ! 1341: defsubr (&Sbuffer_enable_undo); ! 1342: defsubr (&Skill_buffer); ! 1343: defsubr (&Serase_buffer); ! 1344: defsubr (&Sswitch_to_buffer); ! 1345: defsubr (&Spop_to_buffer); ! 1346: defsubr (&Scurrent_buffer); ! 1347: defsubr (&Sset_buffer); ! 1348: defsubr (&Sbarf_if_buffer_read_only); ! 1349: defsubr (&Sbury_buffer); ! 1350: defsubr (&Slist_buffers); ! 1351: defsubr (&Skill_all_local_variables); ! 1352: } ! 1353: ! 1354: keys_of_buffer () ! 1355: { ! 1356: ndefkey (Vctl_x_map, 'b', "switch-to-buffer"); ! 1357: ndefkey (Vctl_x_map, 'k', "kill-buffer"); ! 1358: ndefkey (Vctl_x_map, Ctl ('B'), "list-buffers"); ! 1359: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.