Mercurial > hg > xemacs-beta
diff man/lispref/display.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/lispref/display.texi Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,981 @@ +@c -*-texinfo-*- +@c This is part of the XEmacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c See the file lispref.texi for copying conditions. +@setfilename ../../info/display.info +@node Display, Hash Tables, Annotations, Top +@chapter Emacs Display + + This chapter describes a number of other features related to the display +that XEmacs presents to the user. + +@menu +* Refresh Screen:: Clearing the screen and redrawing everything on it. +* Truncation:: Folding or wrapping long text lines. +* The Echo Area:: Where messages are displayed. +* Invisible Text:: Hiding part of the buffer text. +* Selective Display:: Hiding part of the buffer text (the old way). +* Overlay Arrow:: Display of an arrow to indicate position. +* Temporary Displays:: Displays that go away automatically. +* Blinking:: How XEmacs shows the matching open parenthesis. +* Usual Display:: The usual conventions for displaying nonprinting chars. +* Display Tables:: How to specify other conventions. +* Beeping:: Audible signal to the user. +@end menu + +@node Refresh Screen +@section Refreshing the Screen + +The function @code{redraw-frame} redisplays the entire contents of a +given frame. @xref{Frames}. + +@c Emacs 19 feature +@defun redraw-frame frame +This function clears and redisplays frame @var{frame}. +@end defun + +Even more powerful is @code{redraw-display}: + +@deffn Command redraw-display &optional device +This function redraws all frames on @var{device} marked as having their +image garbled. @var{device} defaults to the selected device. If +@var{device} is @code{t}, all devices will have their frames checked. +@end deffn + + Processing user input takes absolute priority over redisplay. If you +call these functions when input is available, they do nothing +immediately, but a full redisplay does happen eventually---after all the +input has been processed. + + Normally, suspending and resuming XEmacs also refreshes the screen. +Some terminal emulators record separate contents for display-oriented +programs such as XEmacs and for ordinary sequential display. If you are +using such a terminal, you might want to inhibit the redisplay on +resumption. @xref{Suspending XEmacs}. + +@defvar no-redraw-on-reenter +@cindex suspend (cf. @code{no-redraw-on-reenter}) +@cindex resume (cf. @code{no-redraw-on-reenter}) +This variable controls whether XEmacs redraws the entire screen after it +has been suspended and resumed. Non-@code{nil} means yes, @code{nil} +means no. +@end defvar + +@cindex display update +@cindex update display +@cindex refresh display + The above functions do not actually cause the display to be updated; +rather, they clear out the internal display records that XEmacs +maintains, so that the next time the display is updated it will be +redrawn from scratch. Normally this occurs the next time that +@code{next-event} or @code{sit-for} is called; however, a display update +will not occur if there is input pending. @xref{Command Loop}. + +@deffn Command force-redisplay +@cindex force redisplay +This function causes an immediate update of the display in all +circumstances, whether or not input is pending. (This function does +not exist in FSF Emacs.) +@end deffn + +@defun force-cursor-redisplay +This function causes an immediate update of the cursor on the selected +frame. (This function does not exist in FSF Emacs.) +@end defun + +@node Truncation +@section Truncation +@cindex line wrapping +@cindex continuation lines +@cindex @samp{$} in display +@cindex @samp{\} in display + + When a line of text extends beyond the right edge of a window, the +line can either be truncated or continued on the next line. When a line +is truncated, this is normally shown with a @samp{\} in the rightmost +column of the window on X displays, and with a @samp{$} on TTY devices. +When a line is continued or ``wrapped'' onto the next line, this is +shown with a curved arrow in the rightmost column of the window (or with +a @samp{\} on TTY devices). The additional screen lines used to display +a long text line are called @dfn{continuation} lines. + + Normally, whenever line truncation is in effect for a particular +window, a horizontal scrollbar is displayed in that window if the +device supports scrollbars. @xref{Scrollbars}. + + Note that continuation is different from filling; continuation happens +on the screen only, not in the buffer contents, and it breaks a line +precisely at the right margin, not at a word boundary. @xref{Filling}. + +@defopt truncate-lines +This buffer-local variable controls how XEmacs displays lines that +extend beyond the right edge of the window. If it is non-@code{nil}, +then XEmacs does not display continuation lines; rather each line of +text occupies exactly one screen line, and a backslash appears at the +edge of any line that extends to or beyond the edge of the window. The +default is @code{nil}. + +If the variable @code{truncate-partial-width-windows} is non-@code{nil}, +then truncation is always used for side-by-side windows (within one +frame) regardless of the value of @code{truncate-lines}. +@end defopt + +@defopt default-truncate-lines +This variable is the default value for @code{truncate-lines}, for +buffers that do not have local values for it. +@end defopt + +@defopt truncate-partial-width-windows +This variable controls display of lines that extend beyond the right +edge of the window, in side-by-side windows (@pxref{Splitting Windows}). +If it is non-@code{nil}, these lines are truncated; otherwise, +@code{truncate-lines} says what to do with them. +@end defopt + + The backslash and curved arrow used to indicate truncated or continued +lines are only defaults, and can be changed. These images are actually +glyphs (@pxref{Glyphs}). XEmacs provides a great deal of flexibility +in how glyphs can be controlled. (This differs from FSF Emacs, which +uses display tables to control these images.) + + For details, @ref{Redisplay Glyphs}. + +@ignore Not yet in XEmacs + If your buffer contains @strong{very} long lines, and you use +continuation to display them, just thinking about them can make Emacs +redisplay slow. The column computation and indentation functions also +become slow. Then you might find it advisable to set +@code{cache-long-line-scans} to @code{t}. + +@defvar cache-long-line-scans +If this variable is non-@code{nil}, various indentation and motion +functions, and Emacs redisplay, cache the results of scanning the +buffer, and consult the cache to avoid rescanning regions of the buffer +unless they are modified. + +Turning on the cache slows down processing of short lines somewhat. + +This variable is automatically local in every buffer. +@end defvar +@end ignore + +@node The Echo Area +@section The Echo Area +@cindex error display +@cindex echo area + +The @dfn{echo area} is used for displaying messages made with the +@code{message} primitive, and for echoing keystrokes. It is not the +same as the minibuffer, despite the fact that the minibuffer appears +(when active) in the same place on the screen as the echo area. The +@cite{XEmacs Reference Manual} specifies the rules for resolving conflicts +between the echo area and the minibuffer for use of that screen space +(@pxref{Minibuffer,, The Minibuffer, emacs, The XEmacs Reference Manual}). +Error messages appear in the echo area; see @ref{Errors}. + +You can write output in the echo area by using the Lisp printing +functions with @code{t} as the stream (@pxref{Output Functions}), or as +follows: + +@defun message string &rest arguments +This function displays a one-line message in the echo area. The +argument @var{string} is similar to a C language @code{printf} control +string. See @code{format} in @ref{String Conversion}, for the details +on the conversion specifications. @code{message} returns the +constructed string. + +In batch mode, @code{message} prints the message text on the standard +error stream, followed by a newline. + +@c Emacs 19 feature +If @var{string} is @code{nil}, @code{message} clears the echo area. If +the minibuffer is active, this brings the minibuffer contents back onto +the screen immediately. + +@example +@group +(message "Minibuffer depth is %d." + (minibuffer-depth)) + @print{} Minibuffer depth is 0. +@result{} "Minibuffer depth is 0." +@end group + +@group +---------- Echo Area ---------- +Minibuffer depth is 0. +---------- Echo Area ---------- +@end group +@end example +@end defun + +Almost all the messages displayed in the echo area are also recorded +in the @samp{*Messages*} buffer. + +@defopt message-log-max +This variable specifies how many lines to keep in the @samp{*Messages*} +buffer. The value @code{t} means there is no limit on how many lines to +keep. The value @code{nil} disables message logging entirely. Here's +how to display a message and prevent it from being logged: + +@example +(let (message-log-max) + (message @dots{})) +@end example +@end defopt + +@defvar echo-keystrokes +This variable determines how much time should elapse before command +characters echo. Its value must be an integer, which specifies the +number of seconds to wait before echoing. If the user types a prefix +key (such as @kbd{C-x}) and then delays this many seconds before +continuing, the prefix key is echoed in the echo area. Any subsequent +characters in the same command will be echoed as well. + +If the value is zero, then command input is not echoed. +@end defvar + +@defvar cursor-in-echo-area +This variable controls where the cursor appears when a message is +displayed in the echo area. If it is non-@code{nil}, then the cursor +appears at the end of the message. Otherwise, the cursor appears at +point---not in the echo area at all. + +The value is normally @code{nil}; Lisp programs bind it to @code{t} +for brief periods of time. +@end defvar + +@node Invisible Text +@section Invisible Text + +@cindex invisible text +You can make characters @dfn{invisible}, so that they do not appear on +the screen, with the @code{invisible} property. This can be either a +text property or a property of an overlay. + +In the simplest case, any non-@code{nil} @code{invisible} property makes +a character invisible. This is the default case---if you don't alter +the default value of @code{buffer-invisibility-spec}, this is how the +@code{invisibility} property works. This feature is much like selective +display (@pxref{Selective Display}), but more general and cleaner. + +More generally, you can use the variable @code{buffer-invisibility-spec} +to control which values of the @code{invisible} property make text +invisible. This permits you to classify the text into different subsets +in advance, by giving them different @code{invisible} values, and +subsequently make various subsets visible or invisible by changing the +value of @code{buffer-invisibility-spec}. + +Controlling visibility with @code{buffer-invisibility-spec} is +especially useful in a program to display the list of entries in a data +base. It permits the implementation of convenient filtering commands to +view just a part of the entries in the data base. Setting this variable +is very fast, much faster than scanning all the text in the buffer +looking for properties to change. + +@defvar buffer-invisibility-spec +This variable specifies which kinds of @code{invisible} properties +actually make a character invisible. + +@table @asis +@item @code{t} +A character is invisible if its @code{invisible} property is +non-@code{nil}. This is the default. + +@item a list +Each element of the list makes certain characters invisible. +Ultimately, a character is invisible if any of the elements of this list +applies to it. The list can have two kinds of elements: + +@table @code +@item @var{atom} +A character is invisible if its @code{invisible} propery value +is @var{atom} or if it is a list with @var{atom} as a member. + +@item (@var{atom} . t) +A character is invisible if its @code{invisible} propery value +is @var{atom} or if it is a list with @var{atom} as a member. +Moreover, if this character is at the end of a line and is followed +by a visible newline, it displays an ellipsis. +@end table +@end table +@end defvar + + Ordinarily, commands that operate on text or move point do not care +whether the text is invisible. However, the user-level line motion +commands explicitly ignore invisible newlines. + +@node Selective Display +@section Selective Display +@cindex selective display + + @dfn{Selective display} is a pair of features that hide certain +lines on the screen. + + The first variant, explicit selective display, is designed for use in +a Lisp program. The program controls which lines are hidden by altering +the text. Outline mode has traditionally used this variant. It has +been partially replaced by the invisible text feature (@pxref{Invisible +Text}); there is a new version of Outline mode which uses that instead. + + In the second variant, the choice of lines to hide is made +automatically based on indentation. This variant is designed to be a +user-level feature. + + The way you control explicit selective display is by replacing a +newline (control-j) with a carriage return (control-m). The text that +was formerly a line following that newline is now invisible. Strictly +speaking, it is temporarily no longer a line at all, since only newlines +can separate lines; it is now part of the previous line. + + Selective display does not directly affect editing commands. For +example, @kbd{C-f} (@code{forward-char}) moves point unhesitatingly into +invisible text. However, the replacement of newline characters with +carriage return characters affects some editing commands. For example, +@code{next-line} skips invisible lines, since it searches only for +newlines. Modes that use selective display can also define commands +that take account of the newlines, or that make parts of the text +visible or invisible. + + When you write a selectively displayed buffer into a file, all the +control-m's are output as newlines. This means that when you next read +in the file, it looks OK, with nothing invisible. The selective display +effect is seen only within XEmacs. + +@defvar selective-display +This buffer-local variable enables selective display. This means that +lines, or portions of lines, may be made invisible. + +@itemize @bullet +@item +If the value of @code{selective-display} is @code{t}, then any portion +of a line that follows a control-m is not displayed. + +@item +If the value of @code{selective-display} is a positive integer, then +lines that start with more than that many columns of indentation are not +displayed. +@end itemize + +When some portion of a buffer is invisible, the vertical movement +commands operate as if that portion did not exist, allowing a single +@code{next-line} command to skip any number of invisible lines. +However, character movement commands (such as @code{forward-char}) do +not skip the invisible portion, and it is possible (if tricky) to insert +or delete text in an invisible portion. + +In the examples below, we show the @emph{display appearance} of the +buffer @code{foo}, which changes with the value of +@code{selective-display}. The @emph{contents} of the buffer do not +change. + +@example +@group +(setq selective-display nil) + @result{} nil + +---------- Buffer: foo ---------- +1 on this column + 2on this column + 3n this column + 3n this column + 2on this column +1 on this column +---------- Buffer: foo ---------- +@end group + +@group +(setq selective-display 2) + @result{} 2 + +---------- Buffer: foo ---------- +1 on this column + 2on this column + 2on this column +1 on this column +---------- Buffer: foo ---------- +@end group +@end example +@end defvar + +@defvar selective-display-ellipses +If this buffer-local variable is non-@code{nil}, then XEmacs displays +@samp{@dots{}} at the end of a line that is followed by invisible text. +This example is a continuation of the previous one. + +@example +@group +(setq selective-display-ellipses t) + @result{} t + +---------- Buffer: foo ---------- +1 on this column + 2on this column ... + 2on this column +1 on this column +---------- Buffer: foo ---------- +@end group +@end example + +You can use a display table to substitute other text for the ellipsis +(@samp{@dots{}}). @xref{Display Tables}. +@end defvar + +@node Overlay Arrow +@section The Overlay Arrow +@cindex overlay arrow + + The @dfn{overlay arrow} is useful for directing the user's attention +to a particular line in a buffer. For example, in the modes used for +interface to debuggers, the overlay arrow indicates the line of code +about to be executed. + +@defvar overlay-arrow-string +This variable holds the string to display to call attention to a +particular line, or @code{nil} if the arrow feature is not in use. +Despite its name, the value of this variable can be either a string +or a glyph (@pxref{Glyphs}). +@end defvar + +@defvar overlay-arrow-position +This variable holds a marker that indicates where to display the overlay +arrow. It should point at the beginning of a line. The arrow text +appears at the beginning of that line, overlaying any text that would +otherwise appear. Since the arrow is usually short, and the line +usually begins with indentation, normally nothing significant is +overwritten. + +The overlay string is displayed only in the buffer that this marker +points into. Thus, only one buffer can have an overlay arrow at any +given time. +@c !!! overlay-arrow-position: but the overlay string may remain in the display +@c of some other buffer until an update is required. This should be fixed +@c now. Is it? +@end defvar + + You can do the same job by creating an extent with a +@code{begin-glyph} property. @xref{Extent Properties}. + +@node Temporary Displays +@section Temporary Displays + + Temporary displays are used by commands to put output into a buffer +and then present it to the user for perusal rather than for editing. +Many of the help commands use this feature. + +@defspec with-output-to-temp-buffer buffer-name forms@dots{} +This function executes @var{forms} while arranging to insert any +output they print into the buffer named @var{buffer-name}. The buffer +is then shown in some window for viewing, displayed but not selected. + +The string @var{buffer-name} specifies the temporary buffer, which +need not already exist. The argument must be a string, not a buffer. +The buffer is erased initially (with no questions asked), and it is +marked as unmodified after @code{with-output-to-temp-buffer} exits. + +@code{with-output-to-temp-buffer} binds @code{standard-output} to the +temporary buffer, then it evaluates the forms in @var{forms}. Output +using the Lisp output functions within @var{forms} goes by default to +that buffer (but screen display and messages in the echo area, although +they are ``output'' in the general sense of the word, are not affected). +@xref{Output Functions}. + +The value of the last form in @var{forms} is returned. + +@example +@group +---------- Buffer: foo ---------- + This is the contents of foo. +---------- Buffer: foo ---------- +@end group + +@group +(with-output-to-temp-buffer "foo" + (print 20) + (print standard-output)) +@result{} #<buffer foo> + +---------- Buffer: foo ---------- +20 + +#<buffer foo> + +---------- Buffer: foo ---------- +@end group +@end example +@end defspec + +@defvar temp-buffer-show-function +If this variable is non-@code{nil}, @code{with-output-to-temp-buffer} +calls it as a function to do the job of displaying a help buffer. The +function gets one argument, which is the buffer it should display. + +In Emacs versions 18 and earlier, this variable was called +@code{temp-buffer-show-hook}. +@end defvar + +@defun momentary-string-display string position &optional char message +This function momentarily displays @var{string} in the current buffer at +@var{position}. It has no effect on the undo list or on the buffer's +modification status. + +The momentary display remains until the next input event. If the next +input event is @var{char}, @code{momentary-string-display} ignores it +and returns. Otherwise, that event remains buffered for subsequent use +as input. Thus, typing @var{char} will simply remove the string from +the display, while typing (say) @kbd{C-f} will remove the string from +the display and later (presumably) move point forward. The argument +@var{char} is a space by default. + +The return value of @code{momentary-string-display} is not meaningful. + +You can do the same job in a more general way by creating an extent +with a begin-glyph property. @xref{Extent Properties}. + +If @var{message} is non-@code{nil}, it is displayed in the echo area +while @var{string} is displayed in the buffer. If it is @code{nil}, a +default message says to type @var{char} to continue. + +In this example, point is initially located at the beginning of the +second line: + +@example +@group +---------- Buffer: foo ---------- +This is the contents of foo. +@point{}Second line. +---------- Buffer: foo ---------- +@end group + +@group +(momentary-string-display + "**** Important Message! ****" + (point) ?\r + "Type RET when done reading") +@result{} t +@end group + +@group +---------- Buffer: foo ---------- +This is the contents of foo. +**** Important Message! ****Second line. +---------- Buffer: foo ---------- + +---------- Echo Area ---------- +Type RET when done reading +---------- Echo Area ---------- +@end group +@end example + + This function works by actually changing the text in the buffer. As a +result, if you later undo in this buffer, you will see the message come +and go. +@end defun + +@node Blinking +@section Blinking Parentheses +@cindex parenthesis matching +@cindex blinking +@cindex balancing parentheses +@cindex close parenthesis + + This section describes the mechanism by which XEmacs shows a matching +open parenthesis when the user inserts a close parenthesis. + +@vindex blink-paren-hook +@defvar blink-paren-function +The value of this variable should be a function (of no arguments) to +be called whenever a character with close parenthesis syntax is inserted. +The value of @code{blink-paren-function} may be @code{nil}, in which +case nothing is done. + +@quotation +@strong{Please note:} This variable was named @code{blink-paren-hook} in +older Emacs versions, but since it is not called with the standard +convention for hooks, it was renamed to @code{blink-paren-function} in +version 19. +@end quotation +@end defvar + +@defvar blink-matching-paren +If this variable is @code{nil}, then @code{blink-matching-open} does +nothing. +@end defvar + +@defvar blink-matching-paren-distance +This variable specifies the maximum distance to scan for a matching +parenthesis before giving up. +@end defvar + +@defvar blink-matching-paren-delay +This variable specifies the number of seconds for the cursor to remain +at the matching parenthesis. A fraction of a second often gives +good results, but the default is 1, which works on all systems. +@end defvar + +@defun blink-matching-open +This function is the default value of @code{blink-paren-function}. It +assumes that point follows a character with close parenthesis syntax and +moves the cursor momentarily to the matching opening character. If that +character is not already on the screen, it displays the character's +context in the echo area. To avoid long delays, this function does not +search farther than @code{blink-matching-paren-distance} characters. + +Here is an example of calling this function explicitly. + +@smallexample +@group +(defun interactive-blink-matching-open () +@c Do not break this line! -- rms. +@c The first line of a doc string +@c must stand alone. + "Indicate momentarily the start of sexp before point." + (interactive) +@end group +@group + (let ((blink-matching-paren-distance + (buffer-size)) + (blink-matching-paren t)) + (blink-matching-open))) +@end group +@end smallexample +@end defun + +@node Usual Display +@section Usual Display Conventions + + The usual display conventions define how to display each character +code. You can override these conventions by setting up a display table +(@pxref{Display Tables}). Here are the usual display conventions: + +@itemize @bullet +@item +Character codes 32 through 126 map to glyph codes 32 through 126. +Normally this means they display as themselves. + +@item +Character code 9 is a horizontal tab. It displays as whitespace +up to a position determined by @code{tab-width}. + +@item +Character code 10 is a newline. + +@item +All other codes in the range 0 through 31, and code 127, display in one +of two ways according to the value of @code{ctl-arrow}. If it is +non-@code{nil}, these codes map to sequences of two glyphs, where the +first glyph is the @sc{ASCII} code for @samp{^}. (A display table can +specify a glyph to use instead of @samp{^}.) Otherwise, these codes map +just like the codes in the range 128 to 255. + +@item +Character codes 128 through 255 map to sequences of four glyphs, where +the first glyph is the @sc{ASCII} code for @samp{\}, and the others are +digit characters representing the code in octal. (A display table can +specify a glyph to use instead of @samp{\}.) +@end itemize + + The usual display conventions apply even when there is a display +table, for any character whose entry in the active display table is +@code{nil}. Thus, when you set up a display table, you need only +specify the characters for which you want unusual behavior. + + These variables affect the way certain characters are displayed on the +screen. Since they change the number of columns the characters occupy, +they also affect the indentation functions. + +@defopt ctl-arrow +@cindex control characters in display +This buffer-local variable controls how control characters are +displayed. If it is non-@code{nil}, they are displayed as a caret +followed by the character: @samp{^A}. If it is @code{nil}, they are +displayed as a backslash followed by three octal digits: @samp{\001}. +@end defopt + +@c Following may have overfull hbox. +@defvar default-ctl-arrow +The value of this variable is the default value for @code{ctl-arrow} in +buffers that do not override it. @xref{Default Value}. +@end defvar + +@defopt tab-width +The value of this variable is the spacing between tab stops used for +displaying tab characters in Emacs buffers. The default is 8. Note +that this feature is completely independent from the user-settable tab +stops used by the command @code{tab-to-tab-stop}. @xref{Indent Tabs}. +@end defopt + +@node Display Tables +@section Display Tables + +@cindex display table +You can use the @dfn{display table} feature to control how all 256 +possible character codes display on the screen. This is useful for +displaying European languages that have letters not in the @sc{ASCII} +character set. + +The display table maps each character code into a sequence of +@dfn{runes}, each rune being an image that takes up one character +position on the screen. You can also define how to display each rune +on your terminal, using the @dfn{rune table}. + +@menu +* Display Table Format:: What a display table consists of. +* Active Display Table:: How XEmacs selects a display table to use. +* Character Descriptors:: Format of an individual element of a + display table. +@end menu + +@ignore Not yet working in XEmacs? +* ISO Latin 1:: How to use display tables + to support the ISO Latin 1 character set. +@end ignore + +@node Display Table Format +@subsection Display Table Format + + A display table is an array of 256 elements. (In FSF Emacs, a display +table is 262 elements. The six extra elements specify the truncation +and continuation glyphs, etc. This method is very kludgey, and in +XEmacs the variables @code{truncation-glyph}, @code{continuation-glyph}, +etc. are used. @xref{Truncation}.) + +@defun make-display-table +This creates and returns a display table. The table initially has +@code{nil} in all elements. +@end defun + + The 256 elements correspond to character codes; the @var{n}th +element says how to display the character code @var{n}. The value +should be @code{nil}, a string, a glyph, or a vector of strings and +glyphs (@pxref{Character Descriptors}). If an element is @code{nil}, +it says to display that character according to the usual display +conventions (@pxref{Usual Display}). + + If you use the display table to change the display of newline +characters, the whole buffer will be displayed as one long ``line.'' + + For example, here is how to construct a display table that mimics the +effect of setting @code{ctl-arrow} to a non-@code{nil} value: + +@example +(setq disptab (make-display-table)) +(let ((i 0)) + (while (< i 32) + (or (= i ?\t) (= i ?\n) + (aset disptab i (concat "^" (char-to-string (+ i 64))))) + (setq i (1+ i))) + (aset disptab 127 "^?")) +@end example + +@node Active Display Table +@subsection Active Display Table +@cindex active display table + + The active display table is controlled by the variable +@code{current-display-table}. This is a specifier, which means +that you can specify separate values for it in individual buffers, +windows, frames, and devices, as well as a global value. It also +means that you cannot set this variable using @code{setq}; use +@code{set-specifier} instead. @xref{Specifiers}. (FSF Emacs +uses @code{window-display-table}, @code{buffer-display-table}, +@code{standard-display-table}, etc. to control the display table. +However, specifiers are a cleaner and more powerful way of doing +the same thing. FSF Emacs also uses a different format for +the contents of a display table, using additional indirection +to a ``glyph table'' and such. Note that ``glyph'' has a different +meaning in XEmacs.) + + Individual faces can also specify an overriding display table; +this is set using @code{set-face-display-table}. @xref{Faces}. + + If no display table can be determined for a particular window, +then XEmacs uses the usual display conventions. @xref{Usual Display}. + +@node Character Descriptors +@subsection Character Descriptors + +@cindex character descriptor + Each element of the display-table vector describes how to display +a particular character and is called a @dfn{character descriptor}. +A character descriptor can be: + +@table @asis +@item a string +Display this particular string wherever the character is to be displayed. + +@item a glyph +Display this particular glyph wherever the character is to be displayed. + +@item a vector +The vector may contain strings and/or glyphs. Display the elements of +the vector one after another wherever the character is to be displayed. + +@item @code{nil} +Display according to the standard interpretation (@pxref{Usual Display}). +@end table + +@ignore Not yet working in XEmacs? +@node ISO Latin 1 +@subsection ISO Latin 1 + +If you have a terminal that can handle the entire ISO Latin 1 character +set, you can arrange to use that character set as follows: + +@example +(require 'disp-table) +;; @r{Set char codes 160--255 to display as themselves.} +;; @r{(Codes 128--159 are the additional control characters.)} +(standard-display-8bit 160 255) +@end example + +If you are editing buffers written in the ISO Latin 1 character set and +your terminal doesn't handle anything but @sc{ASCII}, you can load the +file @file{iso-ascii} to set up a display table that displays the other +ISO characters as explanatory sequences of @sc{ASCII} characters. For +example, the character ``o with umlaut'' displays as @samp{@{"o@}}. + +Some European countries have terminals that don't support ISO Latin 1 +but do support the special characters for that country's language. You +can define a display table to work one language using such terminals. +For an example, see @file{lisp/iso-swed.el}, which handles certain +Swedish terminals. + +You can load the appropriate display table for your terminal +automatically by writing a terminal-specific Lisp file for the terminal +type. +@end ignore + +@node Beeping +@section Beeping +@cindex beeping +@cindex bell +@cindex sound + + You can make XEmacs ring a bell, play a sound, or blink the screen to +attract the user's attention. Be conservative about how often you do +this; frequent bells can become irritating. Also be careful not to use +beeping alone when signaling an error is appropriate. (@xref{Errors}.) + +@defun ding &optional dont-terminate sound device +@cindex keyboard macro termination +This function beeps, or flashes the screen (see @code{visible-bell} +below). It also terminates any keyboard macro currently executing +unless @var{dont-terminate} is non-@code{nil}. If @var{sound} is +specified, it should be a symbol specifying which sound to make. This +sound will be played if @code{visible-bell} is @code{nil}. (This only +works if sound support was compiled into the executable and you are +running on the console of a Sun SparcStation, SGI, or HP9000s700. +Otherwise you just get a beep.) The optional third argument specifies +what device to make the sound on, and defaults to the selected device. +@end defun + +@defun beep &optional dont-terminate sound device +This is a synonym for @code{ding}. +@end defun + +@defopt visible-bell +This variable determines whether XEmacs should flash the screen to +represent a bell. Non-@code{nil} means yes, @code{nil} means no. On +TTY devices, this is effective only if the Termcap entry for the +terminal type has the visible bell flag (@samp{vb}) set. +@end defopt + +@defvar sound-alist + This variable holds an alist associating names with sounds. When +@code{beep} or @code{ding} is called with one of the name symbols, the +associated sound will be generated instead of the standard beep. + + Each element of @code{sound-alist} is a list describing a sound. The +first element of the list is the name of the sound being defined. +Subsequent elements of the list are alternating keyword/value pairs: + +@table @code +@item sound +A string of raw sound data, or the name of another sound to play. The +symbol @code{t} here means use the default X beep. +@item volume +An integer from 0-100, defaulting to @code{bell-volume}. +@item pitch +If using the default X beep, the pitch (Hz) to generate. +@item duration +If using the default X beep, the duration (milliseconds). +@end table + +For compatibility, elements of `sound-alist' may also be: + +@itemize @bullet +@item +@code{( sound-name . <sound> )} +@item +@code{( sound-name <volume> <sound> )} +@end itemize + +You should probably add things to this list by calling the function +@code{load-sound-file}. + +Caveats: + +@itemize @minus +@item +You can only play audio data if running on the console screen of a Sun +SparcStation, SGI, or HP9000s700. + +@item +The pitch, duration, and volume options are available everywhere, but +many X servers ignore the `pitch' option. +@end itemize + +The following beep-types are used by XEmacs itself: + +@table @code +@item auto-save-error +when an auto-save does not succeed +@item command-error +when the XEmacs command loop catches an error +@item undefined-key +when you type a key that is undefined +@item undefined-click +when you use an undefined mouse-click combination +@item no-completion +during completing-read +@item y-or-n-p +when you type something other than 'y' or 'n' +@item yes-or-no-p +when you type something other than 'yes' or 'no' +@item default +used when nothing else is appropriate. +@end table + +Other lisp packages may use other beep types, but these are the ones that +the C kernel of XEmacs uses. +@end defvar + +@defopt bell-volume +This variable specifies the default volume for sounds, from 0 to 100. +@end defopt + +@deffn Command load-default-sounds +This function loads and installs some sound files as beep-types. +@end deffn + +@deffn Command load-sound-file filename sound-name &optional volume +This function reads in an audio file and adds it to @code{sound-alist}. +The sound file must be in the Sun/NeXT U-LAW format. @var{sound-name} +should be a symbol, specifying the name of the sound. If @var{volume} +is specified, the sound will be played at that volume; otherwise, the +value of @var{bell-volume} will be used. +@end deffn + +@defun play-sound sound &optional volume device +This function plays sound @var{sound}, which should be a symbol +mentioned in @code{sound-alist}. If @var{volume} is specified, it +overrides the value (if any) specified in @code{sound-alist}. +@var{device} specifies the device to play the sound on, and defaults +to the selected device. +@end defun + +@deffn Command play-sound-file file &optional volume device +This function plays the named sound file at volume @var{volume}, which +defaults to @code{bell-volume}. @var{device} specifies the device to +play the sound on, and defaults to the selected device. +@end deffn