Annotation of 43BSD/contrib/emacs/src/buffer.c, revision 1.1.1.1

1.1       root        1: /* Buffer manipulation primitives for GNU Emacs.
                      2:    Copyright (C) 1985 Richard M. Stallman.
                      3: 
                      4: This file is part of GNU Emacs.
                      5: 
                      6: GNU Emacs is distributed in the hope that it will be useful,
                      7: but WITHOUT ANY WARRANTY.  No author or distributor
                      8: accepts responsibility to anyone for the consequences of using it
                      9: or for whether it serves any particular purpose or works at all,
                     10: unless he says so in writing.  Refer to the GNU Emacs General Public
                     11: License for full details.
                     12: 
                     13: Everyone is granted permission to copy, modify and redistribute
                     14: GNU Emacs, but only under the conditions described in the
                     15: GNU Emacs General Public License.   A copy of this license is
                     16: supposed to have been given to you along with GNU Emacs so you
                     17: can know your rights and responsibilities.  It should be in a
                     18: file named COPYING.  Among other things, the copyright notice
                     19: and this notice must be preserved on all copies.  */
                     20: 
                     21: 
                     22: #include <sys/param.h>
                     23: 
                     24: #ifndef MAXPATHLEN
                     25: /* in 4.1, param.h fails to define this. */
                     26: #define MAXPATHLEN 1024
                     27: #endif /* not MAXPATHLEN */
                     28: 
                     29: #undef NULL
                     30: #include "config.h"
                     31: #include "lisp.h"
                     32: #include "window.h"
                     33: #include "commands.h"
                     34: #include "buffer.h"
                     35: #include "syntax.h"
                     36: 
                     37: struct buffer *bf_cur;         /* the current buffer */
                     38: 
                     39: /* This structure contains data describing the text of the current buffer.
                     40:  Switching buffers swaps their text data in and out of here */
                     41: 
                     42: struct buffer_text bf_text;
                     43: 
                     44: /* First buffer in chain of all buffers (in reverse order of creation).
                     45:    Threaded through ->next.  */
                     46: 
                     47: struct buffer *all_buffers;
                     48: 
                     49: Lisp_Object Fset_buffer ();
                     50: 
                     51: /* Alist of all buffer names vs the buffers. */
                     52: /* This used to be a variable, but is no longer,
                     53:  to prevent lossage due to user rplac'ing this alist or its elements.  */
                     54: Lisp_Object Vbuffer_alist;
                     55: 
                     56: /* Function to call to install major mode.
                     57:   nil means use the major mode of the selected buffer.  */
                     58: 
                     59: Lisp_Object Vdefault_major_mode;
                     60: 
                     61: Lisp_Object Qfundamental_mode;
                     62: 
                     63: Lisp_Object QSFundamental;     /* A string "Fundamental" */
                     64: 
                     65: /* For debugging; temporary.  See SetBfp.  */
                     66: Lisp_Object Qlisp_mode, Vcheck_symbol;
                     67: 
                     68: Lisp_Object Vdefault_mode_line_format;
                     69: 
                     70: int default_case_fold_search;
                     71: 
                     72: int default_tab_width;
                     73: int default_ctl_arrow;
                     74: int default_truncate_lines;
                     75: 
                     76: int default_fill_column;
                     77: int default_left_margin;
                     78: 
                     79: Lisp_Object Vdefault_abbrev_mode;
                     80: 
                     81: nsberror (spec)
                     82:      Lisp_Object spec;
                     83: {
                     84:   if (XTYPE (spec) == Lisp_String)
                     85:     error ("No buffer named %s", XSTRING (spec)->data);
                     86:   error ("Invalid buffer argument");
                     87: }
                     88: 
                     89: DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 0, 0,
                     90:   "Return a list of all buffers.")
                     91:   ()
                     92: {
                     93:   return Fmapcar (Qcdr, Vbuffer_alist);
                     94: }
                     95: 
                     96: DEFUN ("get-buffer", Fget_buffer, Sget_buffer, 1, 1, 0,
                     97:   "Return the buffer named NAME (a string).\n\
                     98: It is found by looking up NAME in  buffer-alist.\n\
                     99: If there is no buffer named NAME, nil is returned.\n\
                    100: NAME may also be a buffer; it is returned.")
                    101:   (name)
                    102:      Lisp_Object name;
                    103: {
                    104:   if (XTYPE (name) == Lisp_Buffer)
                    105:     return name;
                    106:   CHECK_STRING (name, 0);
                    107: 
                    108:   return Fcdr (Fassoc (name, Vbuffer_alist));
                    109: }
                    110: 
                    111: DEFUN ("get-file-buffer", Fget_file_buffer, Sget_file_buffer, 1, 1, 0,
                    112:   "Return the buffer visiting file FILENAME (a string).\n\
                    113: If there is no such buffer, nil is returned.")
                    114:   (filename)
                    115:      Lisp_Object filename;
                    116: {
                    117:   register Lisp_Object tail, buf, tem;
                    118:   CHECK_STRING (filename, 0);
                    119:   filename = Fexpand_file_name (filename, Qnil);
                    120: 
                    121:   for (tail = Vbuffer_alist; LISTP (tail); tail = XCONS (tail)->cdr)
                    122:     {
                    123:       buf = Fcdr (XCONS (tail)->car);
                    124:       if (XTYPE (buf) != Lisp_Buffer) continue;
                    125:       if (XTYPE (XBUFFER (buf)->filename) != Lisp_String) continue;
                    126:       tem = Fstring_equal (XBUFFER (buf)->filename, filename);
                    127:       if (!NULL (tem))
                    128:        return buf;
                    129:     }
                    130:   return Qnil;
                    131: }
                    132: 
                    133: /* Incremented for each buffer created, to assign the buffer number. */
                    134: int buffer_count;
                    135: 
                    136: DEFUN ("get-buffer-create", Fget_buffer_create, Sget_buffer_create, 1, 1, 0,
                    137:   "Like get-buffer but creates a buffer named NAME and returns it if none already exists.")
                    138:   (name)
                    139:      Lisp_Object name;
                    140: {
                    141:   Lisp_Object buf, function;
                    142:   int count = specpdl_ptr - specpdl;
                    143:   register struct buffer *b;
                    144:   struct buffer *bx;
                    145:   unsigned char *data;
                    146: 
                    147:   buf = Fget_buffer (name);
                    148:   if (!NULL (buf)) return buf;
                    149: 
                    150:   b = (struct buffer *) malloc (sizeof (struct buffer));
                    151:   if (!b) memory_full ();
                    152: 
                    153:   data = (unsigned char *) malloc (b->text.gap = 20);
                    154:   if (!data) memory_full ();
                    155:   b->text.p1 = data - 1;
                    156:   b->text.p2 = data - 1 + b->text.gap;
                    157:   b->text.size1 = b->text.size2 = 0;
                    158:   b->text.modified = 1;
                    159:   b->text.pointloc = 1;
                    160:   b->text.head_clip = 1;
                    161:   b->text.tail_clip = 0;
                    162: 
                    163:   b->next = all_buffers;
                    164:   all_buffers = b;
                    165: 
                    166:   b->save_length = make_number (0);
                    167:   b->last_window_start = 1;
                    168:   b->markers = Qnil;
                    169:   b->mark = Qnil;
                    170:   b->number = make_number (++buffer_count);
                    171:   b->name = name;
                    172:   if (XSTRING (name)->data[0] != ' ')
                    173:     make_undo_records (b);
                    174:   else
                    175:     b->undodata = 0;
                    176: 
                    177:   reset_buffer (b);
                    178: 
                    179:   XSETTYPE (buf, Lisp_Buffer);
                    180:   bx = b;                      /* Use of bx avoids compiler bug on Sun */
                    181:   XSETBUFFER (buf, bx);
                    182:   Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
                    183: 
                    184:   function = Vdefault_major_mode;
                    185:   if (NULL (function))
                    186:     function = bf_cur->major_mode;
                    187: 
                    188:   if (NULL (function) || EQ (function, Qfundamental_mode))
                    189:     return buf;
                    190: 
                    191:   /* To select a nonfundamental mode,
                    192:      select the buffer temporarily and then call the mode function. */
                    193: 
                    194:   record_unwind_protect (save_excursion_restore, save_excursion_save ());
                    195:                         
                    196:   Fset_buffer (buf);
                    197:   Fapply (function, Qnil);
                    198: 
                    199:   unbind_to (count);
                    200:   return buf;
                    201: }
                    202: 
                    203: void
                    204: reset_buffer (b)
                    205:      register struct buffer *b;
                    206: {
                    207:   b->filename = Qnil;
                    208:   b->directory = (bf_cur) ? bf_cur->directory : Qnil;
                    209:   b->modtime = 0;
                    210:   b->save_modified = 1;
                    211:   b->backed_up = *(int*) &Qnil;
                    212:   b->auto_save_modified = 0;
                    213:   b->auto_save_file_name = Qnil;
                    214:   b->read_only = Qnil;
                    215:   reset_buffer_local_variables(b);
                    216: }
                    217: 
                    218: reset_buffer_local_variables(b)
                    219:      register struct buffer *b;
                    220: {
                    221:   b->keymap = Qnil;
                    222:   b->abbrev_table = Vfundamental_mode_abbrev_table;
                    223:   b->tab_width = make_number (default_tab_width);
                    224:   b->fill_column = make_number (default_fill_column);
                    225:   b->left_margin = make_number (default_left_margin);
                    226:   b->case_fold_search = default_case_fold_search ? Qt : Qnil;
                    227: 
                    228:   b->syntax_table_v = XVECTOR (Vstandard_syntax_table);
                    229:   b->mode_line_format = Vdefault_mode_line_format;
                    230:   b->auto_fill_hook = Qnil;
                    231:   b->local_var_alist = Qnil;
                    232:   b->ctl_arrow = default_ctl_arrow ? Qt : Qnil;
                    233:   b->truncate_lines = default_truncate_lines ? Qt : Qnil;
                    234:   b->selective_display = Qnil;
                    235:   b->overwrite_mode = Qnil;
                    236:   b->abbrev_mode = Vdefault_abbrev_mode;
                    237: 
                    238:   b->major_mode = Qfundamental_mode;
                    239:   b->mode_name = QSFundamental;
                    240:   b->minor_modes = Qnil;
                    241: }
                    242: 
                    243: /* create-file-buffer moved into lisp code in lisp/files.el */
                    244: 
                    245: DEFUN ("generate-new-buffer", Fgenerate_new_buffer, Sgenerate_new_buffer,
                    246:   1, 1, 0,
                    247:   "Creates and returns a buffer named NAME if one does not already exist,\n\
                    248: else tries adding successive suffixes to NAME until a new buffer-name is\n\
                    249: formed, then creates and returns a new buffer with that new name.")
                    250:  (name)
                    251:      Lisp_Object name;
                    252: {
                    253:   Lisp_Object gentemp, tem;
                    254:   int count;
                    255:   char number[10];
                    256: 
                    257:   CHECK_STRING (name, 0);
                    258: 
                    259:   tem = Fget_buffer (name);
                    260:   if (NULL (tem))
                    261:     return Fget_buffer_create (name);
                    262: 
                    263:   count = 1;
                    264:   while (1)
                    265:     {
                    266:       sprintf (number, "<%d>", ++count);
                    267:       gentemp = concat2 (name, build_string (number));
                    268:       tem = Fget_buffer (gentemp);
                    269:       if (NULL (tem))
                    270:        return Fget_buffer_create (gentemp);
                    271:     }
                    272: }
                    273: 
                    274: 
                    275: DEFUN ("buffer-name", Fbuffer_name, Sbuffer_name, 0, 1, 0,
                    276:   "Return the name of BUFFER, as a string.\n\
                    277: No arg means return name of current buffer.")
                    278:   (buffer)
                    279:      Lisp_Object buffer;
                    280: {
                    281:   if (NULL (buffer))
                    282:     return bf_cur->name;
                    283:   CHECK_BUFFER (buffer, 0);
                    284:   return XBUFFER (buffer)->name;
                    285: }
                    286: 
                    287: DEFUN ("buffer-number", Fbuffer_number, Sbuffer_number, 0, 1, 0,
                    288:   "Return the number of BUFFER.\n\
                    289: No arg means return number of current buffer.")
                    290:   (buffer)
                    291:      Lisp_Object buffer;
                    292: {
                    293:   if (NULL (buffer))
                    294:     return bf_cur->number;
                    295:   CHECK_BUFFER (buffer, 0);
                    296:   return XBUFFER (buffer)->number;
                    297: }
                    298: 
                    299: DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0,
                    300:   "Return name of file BUFFER is visiting, or NIL if none.\n\
                    301: No argument means use current buffer as BUFFER.")
                    302:   (buffer)
                    303:      Lisp_Object buffer;
                    304: {
                    305:   if (NULL (buffer))
                    306:     return bf_cur->filename;
                    307:   CHECK_BUFFER (buffer, 0);
                    308:   return XBUFFER (buffer)->filename;
                    309: }
                    310: 
                    311: DEFUN ("buffer-local-variables", Fbuffer_local_variables,
                    312:   Sbuffer_local_variables,
                    313:   0, 1, 0,
                    314:   "Return alist of buffer-local variables of BUFFER.\n\
                    315: Each element looks like (SYMBOL . VALUE).\n\
                    316: No argument means use current buffer as BUFFER.")
                    317:   (buffer)
                    318:      Lisp_Object buffer;
                    319: {
                    320:   if (NULL (buffer))
                    321:     return bf_cur->local_var_alist;
                    322:   CHECK_BUFFER (buffer, 0);
                    323:   return XBUFFER (buffer)->local_var_alist;
                    324: }
                    325: 
                    326: DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p,
                    327:   0, 1, 0,
                    328:   "Return t if BUFFER is modified since file last read in or saved.\n\
                    329: No argument means use current buffer as BUFFER.")
                    330:   (buffer)
                    331:      Lisp_Object buffer;
                    332: {
                    333:   register struct buffer *buf;
                    334:   if (NULL (buffer))
                    335:     buf = bf_cur;
                    336:   else
                    337:     {
                    338:       CHECK_BUFFER (buffer, 0);
                    339:       buf = XBUFFER (buffer);
                    340:     }
                    341: 
                    342:   bf_cur->text.modified = bf_modified;
                    343:   return buf->save_modified < buf->text.modified ? Qt : Qnil;
                    344: }
                    345: 
                    346: DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p,
                    347:   1, 1, 0,
                    348:   "Mark current buffer as modified or unmodified according to FLAG.")
                    349:   (flag)
                    350:      Lisp_Object flag;
                    351: {
                    352:   register int already;
                    353:   register Lisp_Object fn;
                    354: 
                    355: #ifdef CLASH_DETECTION
                    356:   /* If buffer becoming modified, lock the file.
                    357:      If buffer becoming unmodified, unlock the file.  */
                    358: 
                    359:   fn = bf_cur->filename;
                    360:   if (!NULL (fn))
                    361:     {
                    362:       already = bf_cur->save_modified < bf_modified;
                    363:       if (!already && !NULL (flag))
                    364:        lock_file (fn);
                    365:       else if (already && NULL (flag))
                    366:        unlock_file (fn);
                    367:     }
                    368: #endif /* CLASH_DETECTION */
                    369: 
                    370:   bf_cur->save_modified = NULL (flag) ? bf_modified : 0;
                    371:   RedoModes++;
                    372:   return flag;
                    373: }
                    374: 
                    375: /* Return number of modified buffers that exist now. */
                    376: 
                    377: int
                    378: ModExist ()
                    379: {
                    380:   register Lisp_Object tail, buf;
                    381:   register struct buffer *b;
                    382:   register int modcount = 0;
                    383: 
                    384:   bf_cur->text.modified = bf_modified;
                    385: 
                    386:   for (tail = Vbuffer_alist; !NULL (tail); tail = Fcdr (tail))
                    387:     {
                    388:       buf = Fcdr (Fcar (tail));
                    389:       b = XBUFFER (buf);
                    390:       if (!NULL (b->filename) && b->save_modified < b->text.modified)
                    391:        modcount++;
                    392:     }
                    393: 
                    394:   return modcount;
                    395: }
                    396: 
                    397: DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 1,
                    398:   "sRename buffer (to new name): ",
                    399:   "Change current buffer's name to NEWNAME (a string).")
                    400:   (name)
                    401:      Lisp_Object name;
                    402: {
                    403:   register Lisp_Object tem, buf;
                    404: 
                    405:   CHECK_STRING (name, 0);
                    406:   tem = Fget_buffer (name);
                    407:   if (!NULL (tem))
                    408:     error("Buffer \"%s\" already exists", XSTRING (name)->data);
                    409: 
                    410:   bf_cur->name = name;
                    411:   XSET (buf, Lisp_Buffer, bf_cur);
                    412:   return Fsetcar (Frassq (buf, Vbuffer_alist), name);
                    413: }
                    414: 
                    415: DEFUN ("other-buffer", Fother_buffer, Sother_buffer, 0, 1, 0,
                    416:   "Return most recently selected buffer other than BUFFER.\n\
                    417: Buffers not visible in windows are preferred to visible buffers.\n\
                    418: If no other exists, the buffer *scratch* is returned.\n\
                    419: If BUFFER is omitted or nil, some interesting buffer is returned.")
                    420:   (buffer)
                    421:      Lisp_Object buffer;
                    422: {
                    423:   register Lisp_Object tail, buf, notsogood, tem;
                    424:   notsogood = Qnil;
                    425: 
                    426:   for (tail = Vbuffer_alist; !NULL (tail); tail = Fcdr (tail))
                    427:     {
                    428:       buf = Fcdr (Fcar (tail));
                    429:       if (EQ (buf, buffer))
                    430:        continue;
                    431:       if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ')
                    432:        continue;
                    433:       tem = Fget_buffer_window (buf);
                    434:       if (NULL (tem))
                    435:        return buf;
                    436:       if (!NULL (notsogood))
                    437:        notsogood = buf;
                    438:     }
                    439:   if (!NULL (notsogood))
                    440:     return notsogood;
                    441:   return Fget_buffer_create (build_string ("*scratch*"));
                    442: }
                    443: 
                    444: DEFUN ("buffer-flush-undo", Fbuffer_flush_undo, Sbuffer_flush_undo, 1, 1, 0,
                    445:   "Make BUFFER stop keeping undo information.")
                    446:   (buf)
                    447:      Lisp_Object buf;
                    448: {
                    449:   CHECK_BUFFER (buf, 0);
                    450:   if (XBUFFER (buf)->undodata)
                    451:     free_undo_records (XBUFFER (buf));
                    452:   XBUFFER (buf)->undodata = 0;
                    453:   return Qnil;
                    454: }
                    455: 
                    456: Lisp_Object
                    457: Fdelete_buffer_internal (buf)
                    458:      Lisp_Object buf;
                    459: {
                    460:   register struct buffer *b = XBUFFER (buf);
                    461:   register Lisp_Object tem;
                    462:   register struct Lisp_Marker *m;
                    463: 
                    464:   if (NULL (b->name))
                    465:     return Qnil;
                    466: 
                    467: #ifdef CLASH_DETECTION
                    468:   /* Unlock this buffer's file, if it is locked.  */
                    469:   Funlock_buffer ();
                    470: #endif /* CLASH_DETECTION */
                    471: 
                    472:   /* make this buffer not be current */
                    473:   if (b == bf_cur)
                    474:     {
                    475:       tem = Fother_buffer (buf);
                    476:       if (NULL (tem))
                    477:        tem = Fget_buffer_create (build_string ("*scratch*"));
                    478:       Fset_buffer (tem);
                    479:     }
                    480: 
                    481: #ifdef subprocesses
                    482:   kill_buffer_processes (buf);
                    483: #endif subprocesses
                    484: 
                    485:   Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist);
                    486:   Freplace_buffer_in_windows (buf);
                    487: 
                    488:   /* Unchain all markers of this buffer
                    489:      and leave them pointing nowhere.  */
                    490:   for (tem = b->markers; !EQ (tem, Qnil); )
                    491:     {
                    492:       m = XMARKER (tem);
                    493:       m->buffer = 0;
                    494:       tem = m->chain;
                    495:       m->chain = Qnil;
                    496:     }
                    497: 
                    498:   b->name = Qnil;
                    499:   free (b->text.p1 + 1);
                    500:   if (b->undodata)
                    501:     free_undo_records (b);
                    502: 
                    503:   return Qnil;
                    504: }
                    505: 
                    506: DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 1, 1, "bKill buffer: ",
                    507:   "One arg, a string or a buffer.  Get rid of the specified buffer.")
                    508:   (bufname)
                    509:      Lisp_Object bufname;
                    510: {
                    511:   register Lisp_Object buf, answer;
                    512: 
                    513:   if (NULL (bufname))
                    514:     buf = Fcurrent_buffer ();
                    515:   else
                    516:     buf = Fget_buffer (bufname);
                    517:   if (NULL (buf))
                    518:     nsberror (bufname);
                    519:   bufname = XBUFFER (buf)->name;
                    520: 
                    521:   bf_cur->text.modified = bf_modified;
                    522: 
                    523:   if (INTERACTIVE && !NULL (XBUFFER (buf)->filename)
                    524:       && XBUFFER (buf)->text.modified > XBUFFER (buf)->save_modified)
                    525:     {
                    526:       answer = Fyes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
                    527:                                      XSTRING (bufname)->data));
                    528:       if (NULL (answer))
                    529:        return Qnil;
                    530:     }
                    531:   Fdelete_buffer_internal (buf);
                    532:   return Qnil;
                    533: }
                    534: 
                    535: /* Put the element for buffer `buf' at the front of buffer-alist.
                    536:  This is done when a buffer is selected "visibly".
                    537:  It keeps buffer-alist in the order of recency of selection
                    538:  so that other_buffer will return something nice.  */
                    539: 
                    540: record_buffer (buf)
                    541:      Lisp_Object buf;
                    542: {
                    543:   register Lisp_Object aelt, link;
                    544:   aelt = Frassq (buf, Vbuffer_alist);
                    545:   link = Fmemq (aelt, Vbuffer_alist);
                    546:   XCONS(link)->cdr = Fdelq (aelt, Vbuffer_alist);
                    547:   Vbuffer_alist = link;
                    548: }
                    549: 
                    550: DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
                    551:   "One arg, a string or buffer.  Select the specified buffer\n\
                    552: in the current window.  Optional arg NORECORD non-nil means\n\
                    553: do not put this buffer at the front of the list of recently selected ones.")
                    554:   (bufname, norecord)
                    555:      Lisp_Object bufname, norecord;
                    556: {
                    557:   register Lisp_Object buf;
                    558:   if (NULL (bufname))
                    559:     buf = Fother_buffer (Fcurrent_buffer ());
                    560:   else
                    561:     buf = Fget_buffer_create (bufname);
                    562:   Fset_buffer (buf);
                    563:   if (NULL (norecord))
                    564:     record_buffer (buf);
                    565: 
                    566:   Fshow_buffer (EQ (selected_window, minibuf_window)
                    567:                  ? Fnext_window (minibuf_window, Qnil) : selected_window,
                    568:                buf);
                    569: 
                    570:   return Qnil;
                    571: }
                    572: 
                    573: DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 2, 0,
                    574:   "Select buffer BUFFER in some window, preferably a different one.\n\
                    575: If  pop-up-windows  is non-nil, windows can be split to do this.\n\
                    576: If second arg  OTHER-WINDOW is non-nil, insist on finding another\n\
                    577: window even if BUFFER is already visible in the selected window.")
                    578:   (bufname, other)
                    579:      Lisp_Object bufname, other;
                    580: {
                    581:   register Lisp_Object buf;
                    582:   if (NULL (bufname))
                    583:     buf = Fother_buffer (Fcurrent_buffer ());
                    584:   else
                    585:     buf = Fget_buffer_create (bufname);
                    586:   Fset_buffer (buf);
                    587:   record_buffer (buf);
                    588:   Fselect_window (Fdisplay_buffer (buf, other));
                    589:   return Qnil;
                    590: }
                    591: 
                    592: DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0,
                    593:   "Return the current buffer as a Lisp buffer object.")
                    594:   ()
                    595: {
                    596:   register Lisp_Object buf;
                    597:   XSET (buf, Lisp_Buffer, bf_cur);
                    598:   return buf;
                    599: }
                    600: 
                    601: DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
                    602:   "Set the current buffer to the buffer or buffer name supplied as argument.\n\
                    603: That buffer will then be the default for editing operations and printing.\n\
                    604: This function's effect can't last past end of current command\n\
                    605: because returning to command level\n\
                    606: selects the chosen buffer of the current window,\n\
                    607: and this function has no effect on what buffer that is.\n\
                    608: Use  switch-to-buffer  or  pop-to-buffer  for interactive buffer selection.")
                    609:   (bufname)
                    610:      Lisp_Object bufname;
                    611: {
                    612:   register Lisp_Object buffer;
                    613:   buffer = Fget_buffer (bufname);
                    614:   if (NULL (buffer))
                    615:     nsberror (bufname);
                    616:   SetBfp (XBUFFER (buffer));
                    617:   return buffer;
                    618: }
                    619: 
                    620: DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only,
                    621:                                   Sbarf_if_buffer_read_only, 0, 0, 0,
                    622:   "Signal a  buffer-read-only  error if the current buffer is read-only.")
                    623:   ()
                    624: {
                    625:   if (!NULL (bf_cur->read_only))
                    626:     Fsignal (Qbuffer_read_only, Qnil);
                    627:   return Qnil;
                    628: }
                    629: 
                    630: DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 1, 1, 0,
                    631:   "Put BUFFER at the end of the list of all buffers.\n\
                    632: There it is the least likely candidate for other-buffer to return;\n\
                    633: thus, the least likely buffer for \\[switch-to-buffer] to select by default.")
                    634:   (buf)
                    635:      Lisp_Object buf;
                    636: {
                    637:   register Lisp_Object aelt, link;
                    638: 
                    639:   buf = Fget_buffer (buf);
                    640: 
                    641:   aelt = Frassq (buf, Vbuffer_alist);
                    642:   link = Fmemq (aelt, Vbuffer_alist);
                    643:   Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
                    644:   XCONS (link)->cdr = Qnil;
                    645:   Vbuffer_alist = nconc2 (Vbuffer_alist, link);
                    646:   return Qnil;
                    647: }
                    648: 
                    649: extern int last_known_column_point;
                    650: 
                    651: /* set the current buffer to p */
                    652: SetBfp (p)
                    653:      register struct buffer *p;
                    654: {
                    655:   register struct buffer *c = bf_cur;
                    656:   register struct window *w = XWINDOW (selected_window);
                    657:   register struct buffer *swb;
                    658:   Lisp_Object tail, valcontents;
                    659:   enum Lisp_Type tem;
                    660: 
                    661:   if (c == p)
                    662:     return;
                    663: 
                    664:   if (w)
                    665:     swb = NULL (selected_window) ? 0 : XBUFFER (w->buffer);
                    666: 
                    667:   if (p && NULL (p->name))
                    668:     error ("Selecting deleted buffer");
                    669:   windows_or_buffers_changed = 1;
                    670: 
                    671:   if (c)
                    672:     {
                    673:       if (c == swb)
                    674:        Fset_marker (w->pointm, make_number (point), w->buffer);
                    675: 
                    676:       if (point < FirstCharacter || point > NumCharacters + 1)
                    677:        abort ();
                    678: 
                    679:       c->text = bf_text;
                    680:     }
                    681:   bf_cur = p;
                    682:   bf_text = p->text;
                    683:   if (p == swb)
                    684:     {
                    685:       SetPoint (marker_position (w->pointm));
                    686:       if (point < FirstCharacter)
                    687:        point = FirstCharacter;
                    688:       if (point > NumCharacters + 1)
                    689:        point = NumCharacters + 1;
                    690:     }
                    691:   last_known_column_point = -1;   /* invalidate indentation cache */
                    692: 
                    693:   /* Vcheck_symbol is set up to the symbol paragraph-start
                    694:      in order to check for the bug that clobbers it.  */
                    695:   if (c && EQ (c->major_mode, Qlisp_mode)
                    696:       && XFASTINT (Vcheck_symbol) != 0
                    697:       && !NULL (Vcheck_symbol))
                    698:     {
                    699:       valcontents = XSYMBOL (Vcheck_symbol)->value;
                    700:       if (XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value)
                    701:        abort ();
                    702:       if (c == XBUFFER (XCONS (XCONS (valcontents)->cdr)->car)
                    703:          && (XTYPE (XCONS (valcontents)->car) != Lisp_String
                    704:              || XSTRING (XCONS (valcontents)->car)->size != 6))
                    705:        abort ();
                    706:     }
                    707: 
                    708:   /* Look down buffer's list of local Lisp variables
                    709:      to find and update any that forward into C variables. */
                    710: 
                    711:   for (tail = p->local_var_alist; !NULL (tail); tail = XCONS (tail)->cdr)
                    712:     {
                    713:       valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
                    714:       if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value
                    715:           || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
                    716:          && (tem = XTYPE (XCONS (valcontents)->car),
                    717:              (tem == Lisp_Boolfwd || tem == Lisp_Intfwd
                    718:               || tem == Lisp_Objfwd)))
                    719:        /* Just reference the variable
                    720:             to cause it to become set for this buffer.  */
                    721:        Fsymbol_value (XCONS (XCONS (tail)->car)->car);
                    722:     }
                    723: 
                    724:   /* Do the same with any others that were local to the previous buffer */
                    725: 
                    726:   if (c)
                    727:     for (tail = c->local_var_alist; !NULL (tail); tail = XCONS (tail)->cdr)
                    728:       {
                    729:        valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
                    730:        if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value
                    731:             || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
                    732:            && (tem = XTYPE (XCONS (valcontents)->car),
                    733:                (tem == Lisp_Boolfwd || tem == Lisp_Intfwd
                    734:                 || tem == Lisp_Objfwd)))
                    735:          /* Just reference the variable
                    736:                to cause it to become set for this buffer.  */
                    737:          Fsymbol_value (XCONS (XCONS (tail)->car)->car);
                    738:       }
                    739:   /* Vcheck_symbol is set up to the symbol paragraph-start
                    740:      in order to check for the bug that clobbers it.  */
                    741:   if (EQ (p->major_mode, Qlisp_mode)
                    742:       && Vcheck_symbol
                    743:       && !NULL (Vcheck_symbol))
                    744:     {
                    745:       valcontents = XSYMBOL (Vcheck_symbol)->value;
                    746:       if (XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value)
                    747:        abort ();
                    748:       if (p == XBUFFER (XCONS (XCONS (valcontents)->cdr)->car)
                    749:          && (XTYPE (XCONS (valcontents)->car) != Lisp_String
                    750:              || XSTRING (XCONS (valcontents)->car)->size != 6))
                    751:        abort ();
                    752:       Fsymbol_value (Vcheck_symbol);
                    753:       valcontents = XSYMBOL (Vcheck_symbol)->value;
                    754:       if (p != XBUFFER (XCONS (XCONS (valcontents)->cdr)->car)
                    755:          || XTYPE (XCONS (valcontents)->car) != Lisp_String
                    756:          || XSTRING (XCONS (valcontents)->car)->size != 6)
                    757:        abort ();
                    758:     }
                    759: }
                    760: 
                    761: /* set the current buffer to p "just for redisplay" */
                    762: SetBfx (p)
                    763:      register struct buffer *p;
                    764: {
                    765:   if (bf_cur == p)
                    766:     return;
                    767: 
                    768:   bf_cur->text = bf_text;
                    769:   bf_cur = p;
                    770:   bf_text = p->text;
                    771: }
                    772: 
                    773: DEFUN ("erase-buffer", Ferase_buffer, Serase_buffer, 0, 0, 0,
                    774:   "Delete the entire contents of the current buffer.")
                    775:   ()
                    776: {
                    777:   Fwiden ();
                    778:   del_range (1, NumCharacters + 1);
                    779:   bf_cur->last_window_start = 1;
                    780:   return Qnil;
                    781: }
                    782: 
                    783: validate_region (b, e)
                    784:      register Lisp_Object *b, *e;
                    785: {
                    786:   register int i;
                    787: 
                    788:   CHECK_NUMBER_COERCE_MARKER (*b, 0);
                    789:   CHECK_NUMBER_COERCE_MARKER (*e, 1);
                    790: 
                    791:   if (XINT (*b) > XINT (*e))
                    792:     {
                    793:       i = XFASTINT (*b);       /* This is legit even if *b is < 0 */
                    794:       *b = *e;
                    795:       XFASTINT (*e) = i;       /* because this is all we do with i.  */
                    796:     }
                    797: 
                    798:   if (!(FirstCharacter <= XINT (*b) && XINT (*b) <= XINT (*e)
                    799:         && XINT (*e) <= 1 + NumCharacters))
                    800:     args_out_of_range (*b, *e);
                    801: }
                    802: 
                    803: Lisp_Object
                    804: list_buffers_1 (files)
                    805:      Lisp_Object files;
                    806: {
                    807:   Lisp_Object tail, buf, col1, col2, col3, minspace, tem, mode;
                    808:   register struct buffer *old = bf_cur, *b;
                    809:   int desired_point = 0;
                    810: 
                    811:   bf_cur->text.modified = bf_modified;
                    812: 
                    813:   XFASTINT (col1) = 19;
                    814:   XFASTINT (col2) = 25;
                    815:   XFASTINT (col3) = 40;
                    816:   XFASTINT (minspace) = 1;
                    817: 
                    818:   SetBfp (XBUFFER (Vstandard_output));
                    819: 
                    820:   mode = intern ("Buffer-menu-mode");
                    821:   if (!EQ (mode, bf_cur->major_mode)
                    822:       && (tem = Ffboundp (mode), !NULL (tem)))
                    823:     Fapply (mode, Qnil);
                    824:   Fbuffer_flush_undo (Vstandard_output);
                    825:   bf_cur->read_only = Qnil;
                    826: 
                    827:   write_string ("\
                    828:  MR Buffer         Size  Mode           File\n\
                    829:  -- ------         ----  ----           ----\n", -1);
                    830: 
                    831:   for (tail = Vbuffer_alist; !NULL (tail); tail = Fcdr (tail))
                    832:     {
                    833:       buf = Fcdr (Fcar (tail));
                    834:       b = XBUFFER (buf);
                    835:       /* Don't mention the minibuffers. */
                    836:       if (XSTRING (b->name)->data[0] == ' ')
                    837:        continue;
                    838:       /* Optionally don't mention buffers that lack files. */
                    839:       if (!NULL (files) && NULL (b->filename))
                    840:        continue;
                    841:       /* Identify the current buffer. */
                    842:       if (b == old)
                    843:        desired_point = point;
                    844:       write_string (b == old ? "." : " ", -1);
                    845:       /* Identify modified buffers */
                    846:       write_string (b->text.modified > b->save_modified ? "*" : " ", -1);
                    847:       write_string (NULL (b->read_only) ? "  " : "% ", -1);
                    848:       Fprinc (b->name, Qnil);
                    849:       Findent_to (col1, make_number (2));
                    850:       XFASTINT (tem) = b->text.size1 + b->text.size2;
                    851:       Fprin1 (tem, Qnil);
                    852:       Findent_to (col2, minspace);
                    853:       Fprinc (b->mode_name, Qnil);
                    854:       Findent_to (col3, minspace);
                    855:       if (!NULL (b->filename))
                    856:        Fprinc (b->filename, Qnil);
                    857:       write_string ("\n", -1);
                    858:     }
                    859: 
                    860:   bf_cur->read_only = Qt;
                    861:   SetBfp (old);
                    862:   /* Foo.  This doesn't work since temp_output_buffer_show sets point to 1 */
                    863:   if (desired_point)
                    864:     XBUFFER (Vstandard_output)->text.pointloc = desired_point;
                    865:   return Qnil;
                    866: }
                    867: 
                    868: DEFUN ("list-buffers", Flist_buffers, Slist_buffers, 0, 1, "",
                    869:   "Display a list of names of existing buffers.\n\
                    870: Inserts it in buffer *Buffer List* and displays that.\n\
                    871: Note that buffers with names starting with spaces are omitted.\n\
                    872: Non-null optional arg FILES-ONLY means mention only file buffers.")
                    873:   (files)
                    874:      Lisp_Object files;
                    875: {
                    876:   internal_with_output_to_temp_buffer ("*Buffer List*",
                    877:                                       list_buffers_1, files);
                    878:   return Qnil;
                    879: }
                    880: 
                    881: /* note: this leaves us in fundamental-mode, not default-major-mode
                    882:    should anything be done about this?
                    883: */
                    884: DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables,
                    885:   0, 0, 0,
                    886:   "Eliminate all the buffer-local variable values of the current buffer.\n\
                    887: This buffer will then see the default values of all variables.")
                    888:   ()
                    889: {
                    890:   register Lisp_Object alist, sym, tem;
                    891: 
                    892:   for (alist = bf_cur->local_var_alist; !NULL (alist); alist = XCONS (alist)->cdr)
                    893:     {
                    894:       sym = XCONS (XCONS (alist)->car)->car;
                    895: 
                    896:       /* Need not do anything if some other buffer's binding is now encached.  */
                    897:       tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car;
                    898:       if (XBUFFER (tem) == bf_cur)
                    899:        {
                    900:          /* Symbol is set up for this buffer's old local value.
                    901:             Set it up for the current buffer with the default value.  */
                    902: 
                    903:          tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr;
                    904:          XCONS (tem)->car = tem;
                    905:          XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Fcurrent_buffer ();
                    906:          store_symval_forwarding (sym, XCONS (XSYMBOL (sym)->value)->car,
                    907:                                   XCONS (tem)->cdr);
                    908:        }
                    909:     }
                    910: 
                    911:   reset_buffer_local_variables (bf_cur);
                    912:   return Qnil;
                    913: }
                    914: 
                    915: extern Lisp_Object Vprin1_to_string_buffer;    /* in print.c */
                    916: init_buffer_once ()
                    917: {
                    918:   register Lisp_Object tem;
                    919: 
                    920:   /* Must do these before making the first buffer! */
                    921: 
                    922:   Vdefault_mode_line_format
                    923:     = build_string ("--%1*%1*-Emacs: %17b   %M   %[(%m)%]----%3p-%-");
                    924:   Vdefault_abbrev_mode = Qnil;
                    925:   default_case_fold_search = 1;
                    926: 
                    927:   default_tab_width = 8;
                    928:   default_truncate_lines = 0;
                    929:   default_ctl_arrow = 1;
                    930: 
                    931:   default_fill_column = 70;
                    932:   default_left_margin = 0;
                    933: 
                    934:   Vbuffer_alist = Qnil;
                    935:   bf_cur = 0;
                    936:   all_buffers = 0;
                    937: 
                    938:   QSFundamental = build_string ("Fundamental");
                    939: 
                    940:   Qfundamental_mode = intern ("fundamental-mode");
                    941:   Vdefault_major_mode = Qfundamental_mode;
                    942: 
                    943:   Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1"));
                    944:   /* super-magic invisible buffer */
                    945:   Vbuffer_alist = Qnil;
                    946: 
                    947:   tem = Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
                    948:   /* Want no undo records for *scratch*
                    949:      until after Emacs is dumped */
                    950:   Fbuffer_flush_undo (tem);
                    951: }
                    952: 
                    953: init_buffer ()
                    954: {
                    955:   char buf[MAXPATHLEN+1];
                    956: 
                    957:   Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
                    958:   getwd (buf);
                    959:   if (buf[strlen (buf) - 1] != '/')
                    960:     strcat (buf, "/");
                    961:   bf_cur->directory = build_string (buf);
                    962:   if (NULL (Vpurify_flag))
                    963:     make_undo_records (bf_cur);
                    964: }
                    965: 
                    966: /* initialize the buffer routines */
                    967: syms_of_buffer ()
                    968: {
                    969:   staticpro (&Qfundamental_mode);
                    970:   staticpro (&QSFundamental);
                    971:   staticpro (&Vbuffer_alist);
                    972: 
                    973:   staticpro (&Qlisp_mode);
                    974:   Qlisp_mode = intern ("lisp-mode");
                    975: 
                    976:   DefLispVar ("default-mode-line-format", &Vdefault_mode_line_format,
                    977:     "Default value of mode-line-format for new buffers.");
                    978: 
                    979:   DefBufferLispVar ("mode-line-format", &bf_cur->mode_line_format,
                    980:     "Template string for displaying mode line for current buffer.\n\
                    981: Each buffer has its own value of this variable.\n\
                    982: The string is printed verbatim in the mode line\n\
                    983: except for %-constructs:\n\
                    984:   %b -- print buffer name.   %f -- print visited file name.\n\
                    985:   %* -- print *, % or hyphen.   %m -- print value of mode-name.\n\
                    986:   %s -- print process status.   %M -- print value of global-mode-string.\n\
                    987:   %p -- print percent of buffer above top of window, or top, bot or all.\n\
                    988:   %[ -- print one [ for each recursive editing level.  %] similar.\n\
                    989:   %% -- print %.   %- -- print infinitely many dashes.\n\
                    990: Decimal digits after the % specify field width to pad or truncate to.");
                    991: 
                    992:   DefLispVar ("default-abbrev-mode", &Vdefault_abbrev_mode,
                    993:     "Default value of abbrev-mode for new buffers.");
                    994: 
                    995:   DefBufferLispVar ("abbrev-mode", &bf_cur->abbrev_mode,
                    996:     "*Non-nil turns on automatic expansion of abbrevs when inserted.");
                    997: 
                    998:   DefBoolVar ("default-case-fold-search", &default_case_fold_search,
                    999:     "*Default value of case-fold-search for new buffers.");
                   1000:   DefBufferLispVar ("case-fold-search", &bf_cur->case_fold_search,
                   1001:     "*Non-nil if searches should ignore case.\n\
                   1002: Separate value in each buffer.");
                   1003: 
                   1004:   DefBufferLispVar ("mode-name", &bf_cur->mode_name,
                   1005:     "Pretty name of current buffer's major mode (a string).");
                   1006: 
                   1007:   DefBufferLispVar ("minor-modes", &bf_cur->minor_modes,
                   1008:     "List of minor modes enabled in current buffer.\n\
                   1009: Each element is (FUNCTION-SYMBOL . PRETTY-STRING).");
                   1010: 
                   1011:   DefIntVar ("default-fill-column", &default_fill_column,
                   1012:     "*Default value of fill-column for new buffers.");
                   1013:   DefBufferLispVar ("fill-column", &bf_cur->fill_column,
                   1014:     "*Column beyond which automatic line-wrapping should happen.\n\
                   1015: Separate value in each buffer.");
                   1016: 
                   1017:   DefIntVar ("default-left-margin", &default_left_margin,
                   1018:     "*Default value of left-margin for buffers that don't override it.");
                   1019:   DefBufferLispVar ("left-margin", &bf_cur->left_margin,
                   1020:     "*Column for the default indent-line-function to indent to.\n\
                   1021: Linefeed indents to this column in Fundamental mode.");
                   1022: 
                   1023:   DefIntVar ("default-tab-width", &default_tab_width,
                   1024:     "*Default value of tab-width for new buffers.");
                   1025:   DefBufferLispVar ("tab-width", &bf_cur->tab_width,
                   1026:     "*Distance between tab stops (for display of tab characters), in columns.\n\
                   1027: Separate value in each buffer.");
                   1028: 
                   1029:   DefBoolVar ("default-ctl-arrow", &default_ctl_arrow,
                   1030:     "*Default value of ctl-arrow for new buffers.");
                   1031:   DefBufferLispVar ("ctl-arrow", &bf_cur->ctl_arrow,
                   1032:     "*Non-nil means display control chars with uparrow.\n\
                   1033: Nil means use backslash and octal digits.\n\
                   1034: Separate value in each buffer.");
                   1035: 
                   1036:   DefBoolVar ("default-truncate-lines", &default_truncate_lines,
                   1037:     "*Default value of truncate-lines for new buffers.");
                   1038:   DefBufferLispVar ("truncate-lines", &bf_cur->truncate_lines,
                   1039:     "*Non-nil means do not display continuation lines;\n\
                   1040: give each line of text one screen line.\n\
                   1041: Separate value in each buffer.");
                   1042: 
                   1043:   DefBufferLispVar ("default-directory", &bf_cur->directory,
                   1044:     "*Name of default directory of current buffer.  Should end with slash.");
                   1045: 
                   1046:   DefBufferLispVar ("auto-fill-hook", &bf_cur->auto_fill_hook,
                   1047:     "Function called (if non-nil) after self-inserting a space at column beyond fill-column");
                   1048: 
                   1049:   DefBufferLispVar ("buffer-file-name", &bf_cur->filename,
                   1050:     "Name of file visited in current buffer, or nil if not visiting a file.");
                   1051: 
                   1052:   DefBufferLispVar ("buffer-auto-save-file-name",
                   1053:                    &bf_cur->auto_save_file_name,
                   1054:     "Name of file for auto-saving current buffer,\n\
                   1055: or nil if buffer should not be auto-saved.");
                   1056: 
                   1057:   DefBufferLispVar ("buffer-read-only", &bf_cur->read_only,
                   1058:     "*Non-nil if this buffer is read-only.");
                   1059: 
                   1060: /* LMCL: Second arg should really be a Lisp_Object but it needs this address.
                   1061:  * A Lisp_Object had better take up only one word! */
                   1062:   DefBufferLispVar ("buffer-backed-up", &bf_cur->backed_up,
                   1063:     "Non-nil if this buffer's file has been backed up.\n\
                   1064: Backing up is done before the first time the file is saved.");
                   1065: 
                   1066:   DefBufferLispVar ("buffer-saved-size", &bf_cur->save_length,
                   1067:     "Length of current buffer when last read in, saved or auto-saved.\n\
                   1068: 0 initially.");
                   1069: 
                   1070:   DefBufferLispVar ("selective-display", &bf_cur->selective_display,
                   1071:     "t enables selective display:\n\
                   1072:  after a ^M, all the rest of the line is invisible.\n\
                   1073:  ^M's in the file are written into files as newlines.\n\
                   1074: Integer n as value means display only lines\n\
                   1075:  that start with less than n columns of space.");
                   1076: 
                   1077:   DefBufferLispVar ("overwrite-mode", &bf_cur->overwrite_mode,
                   1078:     "*Non-nil if self-insertion should replace existing text.");
                   1079: 
                   1080:   DefLispVar ("default-major-mode", &Vdefault_major_mode,
                   1081:     "*Major mode for new buffers.  Defaults to fundamental-mode.\n\
                   1082: nil here means use current buffer's major mode.");
                   1083: 
                   1084:   DefBufferLispVar ("major-mode", &bf_cur->major_mode,
                   1085:     "Symbol for buffer's major mode.");
                   1086: 
                   1087:   DefLispVar ("debug-check-symbol", &Vcheck_symbol,
                   1088:     "Don't ask.");
                   1089: 
                   1090:   defsubr (&Sbuffer_list);
                   1091:   defsubr (&Sget_buffer);
                   1092:   defsubr (&Sget_file_buffer);
                   1093:   defsubr (&Sget_buffer_create);
                   1094:   defsubr (&Sgenerate_new_buffer);
                   1095:   defsubr (&Sbuffer_name);
                   1096:   defsubr (&Sbuffer_number);
                   1097:   defsubr (&Sbuffer_file_name);
                   1098:   defsubr (&Sbuffer_local_variables);
                   1099:   defsubr (&Sbuffer_modified_p);
                   1100:   defsubr (&Sset_buffer_modified_p);
                   1101:   defsubr (&Srename_buffer);
                   1102:   defsubr (&Sother_buffer);
                   1103:   defsubr (&Sbuffer_flush_undo);
                   1104:   defsubr (&Skill_buffer);
                   1105:   defsubr (&Serase_buffer);
                   1106:   defsubr (&Sswitch_to_buffer);
                   1107:   defsubr (&Spop_to_buffer);
                   1108:   defsubr (&Scurrent_buffer);
                   1109:   defsubr (&Sset_buffer);
                   1110:   defsubr (&Sbarf_if_buffer_read_only);
                   1111:   defsubr (&Sbury_buffer);
                   1112:   defsubr (&Slist_buffers);
                   1113:   defsubr (&Skill_all_local_variables);
                   1114: }
                   1115: 
                   1116: keys_of_buffer ()
                   1117: {
                   1118:   defkey (CtlXmap, 'b', "switch-to-buffer");
                   1119:   defkey (CtlXmap, 'k', "kill-buffer");
                   1120:   defkey (CtlXmap, Ctl ('B'), "list-buffers");
                   1121: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.