Mercurial > hg > xemacs-beta
view man/xemacs/buffers.texi @ 1292:f3437b56874d
[xemacs-hg @ 2003-02-13 09:57:04 by ben]
profile updates
profile.c: Major reworking. Keep track of new information -- total
function timing (includes descendants), GC usage, total GC usage
(includes descendants). New functions to be called appropriately
from eval.c, alloc.c to keep track of this information. Keep track
of when we're actually in a function vs. in its profile, for more
accurate timing counts. Track profile overhead separately. Create
new mechanism for specifying "internal sections" that are tracked
just like regular Lisp functions and even appear in the backtrace
if `backtrace-with-internal-sections' is non-nil (t by default
for error-checking builds). Add some KKCC information for the
straight (non-Elisp) hash table used by profile, which contains
Lisp objects in its keys -- but not used yet. Remove old ad-hoc
methods for tracking garbage collection, redisplay (which was
incorrect anyway when Lisp was called within these sections).
Don't record any tick info when blocking under MS Windows, since
the timer there is in real time rather than in process time.
Make `start-profiling', `stop-profiling' interactive. Be consistent
wrt. recursive functions and functions currently on the stack when
starting or stopping -- together these make implementing the
`total' values extremely difficult. When we start profiling, we
act as if we just entered all the functions currently on the stack.
Likewise when exiting. Create vars in_profile for tracking
time spent inside of profiling, and profiling_lock for setting
exclusive access to the main hash table when reading from it or
modifying it. (protects against getting screwed up by the signal
handle going off at the same time.
profile.h: New file.
Create macros for declaring internal profiling sections.
lisp.h: Move profile-related stuff to profile.h.
alloc.c: Keep track of total consing, for profile.
Tell profile when we are consing.
Use new profile-section method for noting garbage-collection.
alloc.c: Abort if we attempt to call the allocator reentrantly.
backtrace.h, eval.c: Add info for use by profile in the backtrace frame and transfer
PUSH_BACKTRACE/POP_BACKTRACE from eval.c, for use with profile.
elhash.c: Author comment.
eval.c, lisp.h: New Lisp var `backtrace-with-internal-sections'. Set to t when
error-checking is on.
eval.c: When unwinding,
eval.c: Report to profile when we are about-to-call and just-called wrt. a
function.
alloc.c, eval.c: Allow for "fake" backtrace frames, for internal sections (used by
profile and `backtrace-with-internal-sections'.
event-Xt.c, event-gtk.c, event-msw.c, event-tty.c: Record when we are actually blocking on an event, for profile's sake.
event-stream.c: Record internal profiling sections for getting, dispatching events.
extents.c: Record internal profiling sections for map_extents.
hash.c, hash.h: Add pregrow_hash_table_if_necessary(). (Used in profile code
since the signal handler is the main grower but can't allow
a realloc(). We make sure, at critical points, that the table
is large enough.)
lread.c: Create internal profiling sections for `load' (which may be triggered
internally by autoload, etc.).
redisplay.c: Remove old profile_redisplay_flag. Use new macros to declare
internal profiling section for redisplay.
text.c: Use new macros to declare internal profiling sections for
char-byte conversion and internal-external conversion.
SEMI-UNRELATED CHANGES:
-----------------------
text.c: Update the long comments.
author | ben |
---|---|
date | Thu, 13 Feb 2003 09:57:08 +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.