Mercurial > hg > xemacs-beta
view man/xemacs/buffers.texi @ 5353:38e24b8be4ea
Improve the lexical scoping in #'block, #'return-from.
lisp/ChangeLog addition:
2011-02-07 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el:
* bytecomp.el (byte-compile-initial-macro-environment):
Shadow `block', `return-from' here, we implement them differently
when byte-compiling.
* bytecomp.el (byte-compile-active-blocks): New.
* bytecomp.el (byte-compile-block-1): New.
* bytecomp.el (byte-compile-return-from-1): New.
* bytecomp.el (return-from-1): New.
* bytecomp.el (block-1): New.
These are two aliases that exist to have their own associated
byte-compile functions, which functions implement `block' and
`return-from'.
* cl-extra.el (cl-macroexpand-all):
Fix a bug here when macros in the environment have been compiled.
* cl-macs.el (block):
* cl-macs.el (return):
* cl-macs.el (return-from):
Be more careful about lexical scope in these macros.
* cl.el:
* cl.el ('cl-block-wrapper): Removed.
* cl.el ('cl-block-throw): Removed.
These aren't needed in code generated by this XEmacs. They
shouldn't be needed in code generated by XEmacs 21.4, but if it
turns out the packages do need them, we can put them back.
2011-01-30 Mike Sperber <mike@xemacs.org>
* font-lock.el (font-lock-fontify-pending-extents): Don't fail if
`font-lock-mode' is unset, which can happen in the middle of
`revert-buffer'.
2011-01-23 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (delete):
* cl-macs.el (delq):
* cl-macs.el (remove):
* cl-macs.el (remq):
Don't use the compiler macro if these functions were given the
wrong number of arguments, as happens in lisp-tests.el.
* cl-seq.el (remove, remq): Removed.
I added these to subr.el, and forgot to remove them from here.
2011-01-22 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-setq, byte-compile-set):
Remove kludge allowing keywords' values to be set, all the code
that does that is gone.
* cl-compat.el (elt-satisfies-test-p):
* faces.el (set-face-parent):
* faces.el (face-doc-string):
* gtk-font-menu.el:
* gtk-font-menu.el (gtk-reset-device-font-menus):
* msw-font-menu.el:
* msw-font-menu.el (mswindows-reset-device-font-menus):
* package-get.el (package-get-installedp):
* select.el (select-convert-from-image-data):
* sound.el:
* sound.el (load-sound-file):
* x-font-menu.el (x-reset-device-font-menus-core):
Don't quote keywords, they're self-quoting, and the
win from backward-compatibility is sufficiently small now that the
style problem overrides it.
2011-01-22 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (block, return-from): Require that NAME be a symbol
in these macros, as always documented in the #'block docstring and
as required by Common Lisp.
* descr-text.el (unidata-initialize-unihan-database):
Correct the use of non-symbols in #'block and #'return-from in
this function.
2011-01-15 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (concatenate): Accept more complicated TYPEs in this
function, handing the sequences over to #'coerce if we don't
understand them here.
* cl-macs.el (inline): Don't proclaim #'concatenate as inline, its
compiler macro is more useful than doing that.
2011-01-11 Aidan Kehoe <kehoea@parhasard.net>
* subr.el (delete, delq, remove, remq): Move #'remove, #'remq
here, they don't belong in cl-seq.el; move #'delete, #'delq here
from fns.c, implement them in terms of #'delete*, allowing support
for sequences generally.
* update-elc.el (do-autoload-commands): Use #'delete*, not #'delq
here, now the latter's no longer dumped.
* cl-macs.el (delete, delq): Add compiler macros transforming
#'delete and #'delq to #'delete* calls.
2011-01-10 Aidan Kehoe <kehoea@parhasard.net>
* dialog.el (make-dialog-box): Correct a misplaced parenthesis
here, thank you Mats Lidell in 87zkr9gqrh.fsf@mail.contactor.se !
2011-01-02 Aidan Kehoe <kehoea@parhasard.net>
* dialog.el (make-dialog-box):
* list-mode.el (display-completion-list):
These functions used to use cl-parsing-keywords; change them to
use defun* instead, fixing the build. (Not sure what led to me
not including this change in d1b17a33450b!)
2011-01-02 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (define-star-compiler-macros):
Make sure the form has ITEM and LIST specified before attempting
to change to calls with explicit tests; necessary for some tests
in lisp-tests.el to compile correctly.
(stable-union, stable-intersection): Add compiler macros for these
functions, in the same way we do for most of the other functions
in cl-seq.el.
2011-01-01 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (dolist, dotimes, do-symbols, macrolet)
(symbol-macrolet):
Define these macros with defmacro* instead of parsing the argument
list by hand, for the sake of style and readability; use backquote
where appropriate, instead of calling #'list and and friends, for
the same reason.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* x-misc.el (device-x-display):
Provide this function, documented in the Lispref for years, but
not existing previously. Thank you Julian Bradfield, thank you
Jeff Mincy.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* cl-seq.el:
Move the heavy lifting from this file to C. Dump the
cl-parsing-keywords macro, but don't use defun* for the functions
we define that do take keywords, dynamic scope lossage makes that
not practical.
* subr.el (sort, fillarray): Move these aliases here.
(map-plist): #'nsublis is now built-in, but at this point #'eql
isn't necessarily available as a test; use #'eq.
* obsolete.el (cl-delete-duplicates): Make this available for old
compiler macros and old code.
(memql): Document that this is equivalent to #'member*, and worse.
* cl.el (adjoin, subst): Removed. These are in C.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* simple.el (assoc-ignore-case): Remove a duplicate definition of
this function (it's already in subr.el).
* iso8859-1.el (char-width):
On non-Mule, make this function equivalent to that produced by
(constantly 1), but preserve its docstring.
* subr.el (subst-char-in-string): Define this in terms of
#'substitute, #'nsubstitute.
(string-width): Define this using #'reduce and #'char-width.
(char-width): Give this a simpler definition, it makes far more
sense to check for mule at load time and redefine, as we do in
iso8859-1.el.
(store-substring): Implement this in terms of #'replace, now
#'replace is cheap.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* update-elc.el (lisp-files-needed-for-byte-compilation)
(lisp-files-needing-early-byte-compilation):
cl-macs belongs in the former, not the latter, it is as
fundamental as bytecomp.el.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* cl.el:
Provde the Common Lisp program-error, type-error as error
symbols. This doesn't nearly go far enough for anyone using the
Common Lisp errors.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (delete-duplicates):
If the form has an incorrect number of arguments, don't attempt a
compiler macroexpansion.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (cl-safe-expr-p):
Forms that start with the symbol lambda are also safe.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (= < > <= >=):
For these functions' compiler macros, the optimisation is safe
even if the first and the last arguments have side effects, since
they're only used the once.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (inline-side-effect-free-compiler-macros):
Unroll a loop here at macro-expansion time, so these compiler
macros are compiled. Use #'eql instead of #'eq in a couple of
places for better style.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (notany, notevery): Avoid some dynamic scope
stupidity with local variable names in these functions, when they
weren't prefixed with cl-; go into some more detail in the doc
strings.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (side-effect-free-fns): #'remove, #'remq are
free of side-effects.
(side-effect-and-error-free-fns):
Drop dot, dot-marker from the list.
2010-11-17 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (coerce):
In the argument list, name the first argument OBJECT, not X; the
former name was always used in the doc string and is clearer.
Handle vector type specifications which include the length of the
target sequence, error if there's a mismatch.
* cl-macs.el (cl-make-type-test): Handle type specifications
starting with the symbol 'eql.
2010-11-14 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (eql): Don't remove the byte-compile property of this
symbol. That was necessary to override a bug in bytecomp.el where
#'eql was confused with #'eq, which bug we no longer have.
If neither expression is constant, don't attempt to handle the
expression in this compiler macro, leave it to byte-compile-eql,
which produces better code anyway.
* bytecomp.el (eq): #'eql is not the function associated with the
byte-eq byte code.
(byte-compile-eql): Add an explicit compile method for this
function, for cases where the cl-macs compiler macro hasn't
reduced it to #'eq or #'equal.
2010-10-25 Aidan Kehoe <kehoea@parhasard.net>
Add compiler macros and compilation sanity-checking for various
functions that take keywords.
* byte-optimize.el (side-effect-free-fns): #'symbol-value is
side-effect free and not error free.
* bytecomp.el (byte-compile-normal-call): Check keyword argument
lists for sanity; store information about the positions where
keyword arguments start using the new byte-compile-keyword-start
property.
* cl-macs.el (cl-const-expr-val): Take a new optional argument,
cl-not-constant, defaulting to nil, in this function; return it if
the expression is not constant.
(cl-non-fixnum-number-p): Make this into a separate function, we
want to pass it to #'every.
(eql): Use it.
(define-star-compiler-macros): Use the same code to generate the
member*, assoc* and rassoc* compiler macros; special-case some
code in #'add-to-list in subr.el.
(remove, remq): Add compiler macros for these two functions, in
preparation for #'remove being in C.
(define-foo-if-compiler-macros): Transform (remove-if-not ...) calls to
(remove ... :if-not) at compile time, which will be a real win
once the latter is in C.
(define-substitute-if-compiler-macros)
(define-subst-if-compiler-macros): Similarly for these functions.
(delete-duplicates): Change this compiler macro to use
#'plists-equal; if we don't have information about the type of
SEQUENCE at compile time, don't bother attempting to inline the
call, the function will be in C soon enough.
(equalp): Remove an old commented-out compiler macro for this, if
we want to see it it's in version control.
(subst-char-in-string): Transform this to a call to nsubstitute or
nsubstitute, if that is appropriate.
* cl.el (ldiff): Don't call setf here, this makes for a load-time
dependency problem in cl-macs.el
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* term/vt100.el:
Refer to XEmacs, not GNU Emacs, in permissions.
* term/bg-mouse.el:
* term/sup-mouse.el:
Put copyright notice in canonical "Copyright DATE AUTHOR" form.
Refer to XEmacs, not GNU Emacs, in permissions.
* site-load.el:
Add permission boilerplate.
* mule/canna-leim.el:
* alist.el:
Refer to XEmacs, not APEL/this program, in permissions.
* mule/canna-leim.el:
Remove my copyright, I've assigned it to the FSF.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* gtk.el:
* gtk-widget-accessors.el:
* gtk-package.el:
* gtk-marshal.el:
* gtk-compose.el:
* gnome.el:
Add copyright notice based on internal evidence.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* easymenu.el: Add reference to COPYING to permission notice.
* gutter.el:
* gutter-items.el:
* menubar-items.el:
Fix typo "Xmacs" in permissions notice.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* auto-save.el:
* font.el:
* fontconfig.el:
* mule/kinsoku.el:
Add "part of XEmacs" text to permission notice.
2010-10-14 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (side-effect-free-fns):
* cl-macs.el (remf, getf):
* cl-extra.el (tailp, cl-set-getf, cl-do-remf):
* cl.el (ldiff, endp):
Tighten up Common Lisp compatibility for #'ldiff, #'endp, #'tailp;
add circularity checking for the first two.
#'cl-set-getf and #'cl-do-remf were Lisp implementations of
#'plist-put and #'plist-remprop; change the names to aliases,
changes the macros that use them to using #'plist-put and
#'plist-remprop directly.
2010-10-12 Aidan Kehoe <kehoea@parhasard.net>
* abbrev.el (fundamental-mode-abbrev-table, global-abbrev-table):
Create both these abbrev tables using the usual
#'define-abbrev-table calls, rather than attempting to
special-case them.
* cl-extra.el: Force cl-macs to be loaded here, if cl-extra.el is
being loaded interpreted. Previously other, later files would
redundantly call (load "cl-macs") when interpreted, it's more
reasonable to do it here, once.
* cmdloop.el (read-quoted-char-radix): Use defcustom here, we
don't have any dump-order dependencies that would prevent that.
* custom.el (eval-when-compile): Don't load cl-macs when
interpreted or when byte-compiling, rely on cl-extra.el in the
former case and the appropriate entry in bytecomp-load-hook in the
latter. Get rid of custom-declare-variable-list, we have no
dump-time dependencies that would require it.
* faces.el (eval-when-compile): Don't load cl-macs when
interpreted or when byte-compiling.
* packages.el: Remove some inaccurate comments.
* post-gc.el (cleanup-simple-finalizers): Use #'delete-if-not
here, now the order of preloaded-file-list has been changed to
make it available.
* subr.el (custom-declare-variable-list): Remove. No need for it.
Also remove a stub define-abbrev-table from this file, given the
current order of preloaded-file-list there's no need for it.
2010-10-10 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-constp) Forms quoted with FUNCTION are
also constant.
(byte-compile-initial-macro-environment): In #'the, if FORM is
constant and does not match TYPE, warn at byte-compile time.
2010-10-10 Aidan Kehoe <kehoea@parhasard.net>
* backquote.el (bq-vector-contents, bq-list*): Remove; the former
is equivalent to (append VECTOR nil), the latter to (list* ...).
(bq-process-2): Use (append VECTOR nil) instead of using
#'bq-vector-contents to convert to a list.
(bq-process-1): Now we use list* instead of bq-list
* subr.el (list*): Moved from cl.el, since it is now required to
be available the first time a backquoted form is encountered.
* cl.el (list*): Move to subr.el.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* test-harness.el (Check-Message):
Add an omitted comma here, thank you the buildbot.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* hash-table.el (hash-table-key-list, hash-table-value-list)
(hash-table-key-value-alist, hash-table-key-value-plist):
Remove some useless #'nreverse calls in these files; our hash
tables have no order, it's not helpful to pretend they do.
* behavior.el (read-behavior):
Do the same in this file, in some code evidently copied from
hash-table.el.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* info.el (Info-insert-dir):
* format.el (format-deannotate-region):
* files.el (cd, save-buffers-kill-emacs):
Use #'some, #'every and related functions for applying boolean
operations to lists, instead of rolling our own ones that cons and
don't short-circuit.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-initial-macro-environment):
* cl-macs.el (the):
Rephrase the docstring, make its implementation when compiling
files a little nicer.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* descr-text.el (unidata-initialize-unicodedata-database)
(unidata-initialize-unihan-database, describe-char-unicode-data)
(describe-char-unicode-data):
Wrap calls to the database functions with (with-fboundp ...),
avoiding byte compile warnings on builds without support for the
database functions.
(describe-char): (reduce #'max ...), not (apply #'max ...), no
need to cons needlessly.
(describe-char): Remove a redundant lambda wrapping
#'extent-properties.
(describe-char-unicode-data): Call #'nsubst when replacing "" with
nil in the result of #'split-string, instead of consing inside
mapcar.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* x-faces.el (x-available-font-sizes):
* specifier.el (let-specifier):
* package-ui.el (pui-add-required-packages):
* msw-faces.el (mswindows-available-font-sizes):
* modeline.el (modeline-minor-mode-menu):
* minibuf.el (minibuf-directory-files):
Replace the O2N (delq nil (mapcar (lambda (W) (and X Y)) Z)) with
the ON (mapcan (lambda (W) (and X (list Y))) Z) in these files.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (= < > <= >=):
When these functions are handed more than two arguments, and those
arguments have no side effects, transform to a series of two
argument calls, avoiding funcall in the byte-compiled code.
* mule/mule-cmds.el (finish-set-language-environment):
Take advantage of this change in a function called 256 times at
startup.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-function-form, byte-compile-quote)
(byte-compile-quote-form):
Warn at compile time, and error at runtime, if a (quote ...) or a
(function ...) form attempts to quote more than one object.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (byte-optimize-apply): Transform (apply 'nconc
(mapcar ...)) to (mapcan ...); warn about use of the first idiom.
* update-elc.el (do-autoload-commands):
* packages.el (packages-find-package-library-path):
* frame.el (frame-list):
* extents.el (extent-descendants):
* etags.el (buffer-tag-table-files):
* dumped-lisp.el (preloaded-file-list):
* device.el (device-list):
* bytecomp-runtime.el (proclaim-inline, proclaim-notinline)
Use #'mapcan, not (apply #'nconc (mapcar ...) in all these files.
* bytecomp-runtime.el (eval-when-compile, eval-and-compile):
In passing, mention that these macros also evaluate the body when
interpreted.
tests/ChangeLog addition:
2011-02-07 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Test lexical scope for `block', `return-from'; add a
Known-Bug-Expect-Failure for a contorted example that fails when
byte-compiled.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Mon, 07 Feb 2011 12:01:24 +0000 |
parents | abe6d1db359e |
children |
line wrap: on
line source
@node Buffers, Windows, Files, Top @chapter Using Multiple Buffers @cindex buffers Text you are editing in Emacs resides in an object called a @dfn{buffer}. Each time you visit a file, Emacs creates a buffer to hold the file's text. Each time you invoke Dired, Emacs creates a buffer to hold the directory listing. If you send a message with @kbd{C-x m}, a buffer named @samp{*mail*} is used to hold the text of the message. When you ask for a command's documentation, it appears in a buffer called @samp{*Help*}. @cindex selected buffer @cindex current buffer At any time, one and only one buffer is @dfn{selected}. It is also called the @dfn{current buffer}. Saying a command operates on ``the buffer'' really means that the command operates on the selected buffer, as most commands do. When Emacs creates multiple windows, each window has a chosen buffer which is displayed there, but at any time only one of the windows is selected and its chosen buffer is the selected buffer. Each window's mode line displays the name of the buffer the window is displaying (@pxref{Windows}). Each buffer has a name which can be of any length but is case-sensitive. You can select a buffer using its name. Most buffers are created when you visit files; their names are derived from the files' names. You can also create an empty buffer with any name you want. A newly started Emacs has a buffer named @samp{*scratch*} which you can use for evaluating Lisp expressions in Emacs. Each buffer records what file it is visiting, whether it is modified, and what major mode and minor modes are in effect in it (@pxref{Major Modes}). Any Emacs variable can be made @dfn{local to} a particular buffer, meaning its value in that buffer can be different from the value in other buffers. @xref{Locals}. @menu * Select Buffer:: Creating a new buffer or reselecting an old one. * List Buffers:: Getting a list of buffers that exist. * Misc Buffer:: Renaming; changing read-onliness; copying text. * Kill Buffer:: Killing buffers you no longer need. * Several Buffers:: How to go through the list of all buffers and operate variously on several of them. @end menu @node Select Buffer, List Buffers, Buffers, Buffers @section Creating and Selecting Buffers @cindex changing buffers @cindex switching buffers @table @kbd @item C-x b @var{buffer} @key{RET} Select or create a buffer named @var{buffer} (@code{switch-to-buffer}). @item C-x 4 b @var{buffer} @key{RET} Similar, but select a buffer named @var{buffer} in another window (@code{switch-to-buffer-other-window}). @item M-x switch-to-other-buffer @var{n} Switch to the previous buffer. @end table @kindex C-x 4 b @kindex C-x 5 b @findex switch-to-buffer-other-window @kindex C-x b @findex switch-to-buffer @findex switch-to-buffer-other-frame To select a buffer named @var{bufname}, type @kbd{C-x b @var{bufname} @key{RET}}. This is the command @code{switch-to-buffer} with argument @var{bufname}. You can use completion on an abbreviation for the buffer name you want (@pxref{Completion}). An empty argument to @kbd{C-x b} specifies the most recently selected buffer that is not displayed in any window.@refill Most buffers are created when you visit files, or use Emacs commands that display text. You can also create a buffer explicitly by typing @kbd{C-x b @var{bufname} @key{RET}}, which creates a new, empty buffer that is not visiting any file, and selects it for editing. The new buffer's major mode is determined by the value of @code{default-major-mode} (@pxref{Major Modes}). Buffers not visiting files are usually used for making notes to yourself. If you try to save one, you are asked for the file name to use. The function @code{switch-to-buffer-other-frame} is similar to @code{switch-to-buffer} except that it creates a new frame in which to display the selected buffer. @findex switch-to-other-buffer Use @kbd{M-x switch-to-other-buffer} to visit the previous buffer. If you supply a positive integer @var{n}, the @var{n}th most recent buffer is displayed. If you supply an argument of 0, the current buffer is moved to the bottom of the buffer stack. Note that you can also use @kbd{C-x C-f} and any other command for visiting a file to switch buffers. @xref{Visiting}. @node List Buffers, Misc Buffer, Select Buffer, Buffers @section Listing Existing Buffers @table @kbd @item C-x C-b List the existing buffers (@code{list-buffers}). @end table @kindex C-x C-b @findex list-buffers To print a list of all existing buffers, type @kbd{C-x C-b}. Each line in the list shows one buffer's name, major mode, and visited file. A @samp{*} at the beginning of a line indicates the buffer has been ``modified''. If several buffers are modified, it may be time to save some with @kbd{C-x s} (@pxref{Saving}). A @samp{%} indicates a read-only buffer. A @samp{.} marks the selected buffer. Here is an example of a buffer list:@refill @smallexample MR Buffer Size Mode File -- ------ ---- ---- ---- .* emacs.tex 383402 Texinfo /u2/emacs/man/emacs.tex *Help* 1287 Fundamental files.el 23076 Emacs-Lisp /u2/emacs/lisp/files.el % RMAIL 64042 RMAIL /u/rms/RMAIL *% man 747 Dired /u2/emacs/man/ net.emacs 343885 Fundamental /u/rms/net.emacs fileio.c 27691 C /u2/emacs/src/fileio.c NEWS 67340 Text /u2/emacs/etc/NEWS *scratch* 0 Lisp Interaction @end smallexample @noindent Note that the buffer @samp{*Help*} was made by a help request; it is not visiting any file. The buffer @code{man} was made by Dired on the directory @file{/u2/emacs/man/}. As you move the mouse over the @samp{*Buffer List*} buffer, the lines are highlighted. This visual cue indicates that clicking the right mouse button (@code{button3}) will pop up a menu of commands on the buffer represented by this line. This menu duplicates most of those commands which are bound to keys in the @samp{*Buffer List*} buffer. @node Misc Buffer, Kill Buffer, List Buffers, Buffers @section Miscellaneous Buffer Operations @table @kbd @item C-x C-q Toggle read-only status of buffer (@code{toggle-read-only}). @item M-x rename-buffer Change the name of the current buffer. @item M-x view-buffer Scroll through a buffer. @end table @cindex read-only buffer @kindex C-x C-q @findex toggle-read-only @vindex buffer-read-only A buffer can be @dfn{read-only}, which means that commands to change its text are not allowed. Normally, read-only buffers are created by subsystems such as Dired and Rmail that have special commands to operate on the text. Emacs also creates a read-only buffer if you visit a file that is protected. To make changes in a read-only buffer, use the command @kbd{C-x C-q} (@code{toggle-read-only}). It makes a read-only buffer writable, and makes a writable buffer read-only. This works by setting the variable @code{buffer-read-only}, which has a local value in each buffer and makes a buffer read-only if its value is non-@code{nil}. @findex rename-buffer @kbd{M-x rename-buffer} changes the name of the current buffer, prompting for the new name in the minibuffer. There is no default. If you specify a name that is used by a different buffer, an error is signalled and renaming is not done. @findex view-buffer @kbd{M-x view-buffer} is similar to @kbd{M-x view-file} (@pxref{Misc File Ops}), but it examines an already existing Emacs buffer. View mode provides convenient commands for scrolling through the buffer but not for changing it. When you exit View mode, the resulting value of point remains in effect. To copy text from one buffer to another, use the commands @kbd{M-x append-to-buffer} and @kbd{M-x insert-buffer}. @xref{Accumulating Text}.@refill @node Kill Buffer, Several Buffers, Misc Buffer, Buffers @section Killing Buffers After using Emacs for a while, you may accumulate a large number of buffers and may want to eliminate the ones you no longer need. There are several commands for doing this. @c WideCommands @table @kbd @item C-x k Kill a buffer, specified by name (@code{kill-buffer}). @item M-x kill-some-buffers Offer to kill each buffer, one by one. @end table @findex kill-buffer @findex kill-some-buffers @kindex C-x k @kbd{C-x k} (@code{kill-buffer}) kills one buffer, whose name you specify in the minibuffer. If you type just @key{RET} in the minibuffer, the default, killing the current buffer, is used. If the current buffer is killed, the buffer that has been selected recently but does not appear in any window now is selected. If the buffer being killed contains unsaved changes, you are asked to confirm with @kbd{yes} before the buffer is killed. The command @kbd{M-x kill-some-buffers} asks about each buffer, one by one. An answer of @kbd{y} means to kill the buffer. Killing the current buffer or a buffer containing unsaved changes selects a new buffer or asks for confirmation just like @code{kill-buffer}. @node Several Buffers,, Kill Buffer, Buffers @section Operating on Several Buffers @cindex buffer menu The @dfn{buffer-menu} facility is like a ``Dired for buffers''; it allows you to request operations on various Emacs buffers by editing a buffer containing a list of them. You can save buffers, kill them (here called @dfn{deleting} them, for consistency with Dired), or display them. @table @kbd @item M-x buffer-menu Begin editing a buffer listing all Emacs buffers. @end table @findex buffer-menu The command @code{buffer-menu} writes a list of all Emacs buffers into the buffer @samp{*Buffer List*}, and selects that buffer in Buffer Menu mode. The buffer is read-only. You can only change it using the special commands described in this section. Most of the commands are graphic characters. You can use Emacs cursor motion commands in the @samp{*Buffer List*} buffer. If the cursor is on a line describing a buffer, the following special commands apply to that buffer: @table @kbd @item d Request to delete (kill) the buffer, then move down. A @samp{D} before the buffer name on a line indicates a deletion request. Requested deletions actually take place when you use the @kbd{x} command. @item k Synonym for @kbd{d}. @item C-d Like @kbd{d} but move up afterwards instead of down. @item s Request to save the buffer. An @samp{S} before the buffer name on a line indicates the request. Requested saves actually take place when you use the @kbd{x} command. You can request both saving and deletion for the same buffer. @item ~ Mark buffer ``unmodified''. The command @kbd{~} does this immediately when typed. @item x Perform previously requested deletions and saves. @item u Remove any request made for the current line, and move down. @item @key{DEL} Move to previous line and remove any request made for that line. @end table All commands that add or remove flags to request later operations also move down a line. They accept a numeric argument as a repeat count, unless otherwise specified. There are also special commands to use the buffer list to select another buffer, and to specify one or more other buffers for display in additional windows. @table @kbd @item 1 Select the buffer in a full-frame window. This command takes effect immediately. @item 2 Immediately set up two windows, with this buffer in one and the buffer selected before @samp{*Buffer List*} in the other. @item f Immediately select the buffer in place of the @samp{*Buffer List*} buffer. @item o Immediately select the buffer in another window as if by @kbd{C-x 4 b}, leaving @samp{*Buffer List*} visible. @item q Immediately select this buffer, and display any buffers previously flagged with the @kbd{m} command in other windows. If there are no buffers flagged with @kbd{m}, this command is equivalent to @kbd{1}. @item m Flag this buffer to be displayed in another window if the @kbd{q} command is used. The request shows as a @samp{>} at the beginning of the line. The same buffer may not have both a delete request and a display request. @end table Going back between a @code{buffer-menu} buffer and other Emacs buffers is easy. You can, for example, switch from the @samp{*Buffer List*} buffer to another Emacs buffer, and edit there. You can then reselect the @code{buffer-menu} buffer and perform operations already requested, or you can kill that buffer or pay no further attention to it. All that @code{buffer-menu} does directly is create and select a suitable buffer, and turn on Buffer Menu mode. All the other capabilities of the buffer menu are implemented by special commands provided in Buffer Menu mode. The only difference between @code{buffer-menu} and @code{list-buffers} is that @code{buffer-menu} selects the @samp{*Buffer List*} buffer and @code{list-buffers} does not. If you run @code{list-buffers} (that is, type @kbd{C-x C-b}) and select the buffer list manually, you can use all the commands described here.