This is part 5 of the XEmacs Frequently Asked Questions list. This section is devoted to anything that doesn't fit neatly into the other sections.
If you have a Web browser, the official hypertext version is at: <URL:http://www.sccon.com/~andreas/xemacs-miscellaneous.html>, and also at: <URL:http://www.xemacs.org/faq/xemacs-miscellaneous.html>. This version is much nicer than the unofficial hypertext versions that are archived at Utrecht, Oxford, Smart Pages, and other FAQ archives.
Changes this month:
This file was last modified on Feburary 23, 1998.
(add-hook 'emacs-lisp-mode-hook 'turn-on-font-lock) (add-hook 'dired-mode-hook 'turn-on-font-lock)to your .emacs. See the file etc/sample.emacs for more examples.
c-set-offset
instead.
You might also consider using the package cc-compat
.
But, if you still insist, add the following lines to your .emacs:
(fmakunbound 'c-mode) (makunbound 'c-mode-map) (fmakunbound 'c++-mode) (makunbound 'c++-mode-map) (makunbound 'c-style-alist) (load-library "old-c-mode") (load-library "old-c++-mode")
This must be done before any other reference is made to either c-mode or c++-mode.
(setq-default font-lock-maximum-decoration t)In versions of XEmacs prior to 19.14, you had to use a kludgy solution like this:
(setq c-font-lock-keywords c-font-lock-keywords-2 setq c++-font-lock-keywords c++-font-lock-keywords-2 setq lisp-font-lock-keywords lisp-font-lock-keywords-2)It will work for C, C++ and Lisp.
(setq indent-line-function 'indent-relative-maybe)If you want to get fancy, try the filladapt package available standard with XEmacs. Put this into your .emacs
(require 'filladapt) (add-hook 'text-mode-hook 'turn-on-filladapt-mode) ;;; and so forth ...Note that well-behaving text-lookalike modes will run text-mode-hook by default (e.g. that's what Message does). For the nasty ones, you'll have to provide the add-hook's yourself.
Please note that the fa-extras package is no longer useful.
(setq default-major-mode 'text-mode) (setq text-mode-hook 'turn-on-auto-fill)
WARNING: note that changing the value of
default-major-mode
from fundamental-mode
can
break a large amount of built-in code that expects newly created
buffers to be in fundamental-mode
. (Changing from
fundamental-mode
to text-mode
might not
wreak too much havoc, but changing to something more exotic like a
lisp-mode would break many Emacs packages).
Note that Emacs by default starts up in buffer *scratch* in
initial-major-mode
, which defaults to
lisp-interaction-mode
. Thus adding the following form to
your Emacs init file will cause the initial *scratch*
buffer to be put into auto-fill'ed text-mode
.
(setq initial-major-mode (function (lambda () (text-mode) (turn-on-auto-fill))))
Note that after your init file is loaded, if
inhibit-startup-message
is null (the default) and the startup buffer is *scratch*
then the startup message will be inserted into *scratch*;
it will be removed after a timeout by erasing the entire
*scratch* buffer. Keep in mind this default usage of
*scratch* if you desire any prior manipulation of
*scratch* from within your Emacs init file. In particular,
anything you insert into *scratch* from your init file will
be later erased. Also, if you change the mode of the
*scratch* buffer, be sure that this will not interfere with
possible later insertion of the startup message (e.g. if you put
*scratch* into a nonstandard mode that has automatic font
lock rules, then the startup message might get fontified in a strange
foreign manner, e.g. as code in some programming language).
M-x rename-buffer RET *shell-1* RET M-x shell RETThis will then start a second shell. The key is that no buffer named *shell* can exist. It might be preferable to use M-x rename-uniquely to rename the *shell* buffer instead of M-x rename-buffer.
Use M-x rsh or M-x telnet to open remote sessions rather than doing rsh or telnet within the local shell buffer.
(load "tpu-edt")
If you don't want it to replace C-h with an edt-style help menu add this as well:
(global-set-key '(control h) 'help-for-help)
Our recommended VI emulator is viper. To make viper-mode the default, add this to your .emacs:
(viper-mode)Michael Kifer <kifer@CS.SunySB.EDU> writes:
This should be added as close to the top of .emacs as you can get it, otherwise some minor modes may not get viper-ized.
(setq-default filladapt-mode t)Use
turn-on-filladapt-mode
to turn Filladapt on in particular
major modes, like this:
(add-hook 'text-mode-hook 'turn-on-filladapt-mode)
(setq gnuserv-frame (selected-frame))early on in your .emacs, to ensure that the first frame created is the one used for your gnuserv buffers.
Starting in 19.15, there is an option to set the gnuserv target to the current frame. See `Options->"Other Window" Location->Make current frame gnuserv target'
(gnuserv-start)
Start your first XEmacs as usual. After that, you can do
gnuclient randomfilenamefrom the command line to get your existing XEmacs process to open a new frame and visit randomfilename in that window. When you're done editing randomfilename, hit C-x # to kill the buffer and get rid of the frame.
Martin Buchholz <Martin.Buchholz@sun.com> writes:
There is a known problem with interaction between csh and the filec
option and XEmacs.
You should add
if ( "$TERM" == emacs || "$TERM" == unknown ) unset filecto your .cshrc.
This can be had from <URL:http://www.python.org/ftp/emacs/>.
auto-show-mode
controls whether or not a horizontal scrollbar
magically appears when a line is too long to be displayed. This is enabled
by default. To turn it off,
put the following in your .emacs:(setq auto-show-mode nil) (setq-default auto-show-mode nil)
It turns out I was using an older version of gnuserv. The installation didn't put the binary into the public bin directory. It put it in lib/xemacs-19.14/hppa1.1-hp-hpux9.05/gnuserv. Shouldn't it have been put in bin/hppa1.1-hp-hpux9.0?
Emacs has a legacy of keyboards that produced characters with modifier bits, and therefore map a variety of input systems into this scheme even today. XEmacs is instead optimized for X events. This causes an incompatibility in the way key sequences are specified, but both Emacs and XEmacs will accept a key sequence as a vector of lists of modifiers that ends with a key, e.g., to bind M-C-a, you would say [(meta control a)] in both Emacsen. XEmacs has an abbreviated form for a single key, just (meta control a). Emacs has an abbreviated form for the Control and the Meta modifiers to string-characters (the ASCII characters), as in "\M-\C-a". XEmacs users need to be aware that the abbreviated form works only for one-character key sequences, while Emacs users need to be aware that the string-character is rather limited. Specifically, the string-character can accomodate only 256 different values, 128 of which have the Meta modifier and 128 of which have not. In each of these blocks, only 32 characters have the Control modifier. Whereas [(meta control A)] differs from [(meta control a)] because the case differs, "\M-\C-a" and "\M-\C-A" do not. Programmers are advised to use the full common form, both because it is more readable and less error-prone, and because it is supported by both Emacsen.
Another (even safer) way to be sure of the key-sequences is to use
the `read-kbd-macro' function, which takes a string like `C-c
This seems to work:
The exact "human-readable" syntax is defined in the docstring of
edmacro-mode. I'll repeat it here, for completeness.
Format of keyboard macros during editing:
Text is divided into "words" separated by whitespace. Except for
the words described below, the characters of each word go directly
as characters of the macro. The whitespace that separates words is
ignored. Whitespace in the macro must be written explicitly, as in
foo SPC bar RET.
* The special words `RET', `SPC', `TAB', `DEL', `LFD', `ESC',
and `NUL' represent special control characters. The words
must be written in uppercase.
* A word in angle brackets, e.g., `
* Keys can be written by their ASCII code, using a backslash
followed by up to six octal digits. This is the only way to
represent keys with codes above
* One or more prefixes `M-' (meta), `C-' (control), `S-'
(shift), `A-' (alt), `H-' (hyper), and `s-' (super) may
precede a character or key notation. For function keys, the
prefixes may go inside or outside of the brackets: `C-
Prefixes are not allowed on multi-key words, e.g., `C-abc',
except that the Meta prefix is allowed on a sequence of
digits and optional minus sign: `M--123' == `M-- M-1 M-2 M-3'.
* The `^' notation for control characters also works: `^M' ==
`C-m'.
* Double angle brackets enclose command names: `<
* Finally, `REM' or `;;' causes the rest of the line to be
ignored as a comment.
Any word may be prefixed by a multiplier in the form of a decimal
number and `*': `3*
Multiple text keys can normally be strung together to form a word,
but you may need to add whitespace if the word would look like one
of the above notations: `; ; ;' is a keyboard macro with three
semicolons, but `;;;' is a comment. Likewise, `\ 1 2 3' is four
keys but `\123' is a single key written in octal, and `< right >'
is seven keys but `
You will typically defvar your global variable to a default
value, and use setq to set it later.
It is never a good practice to setq user variables (like
case-fold-search, etc.), as it ignores the user's choice
unconditionally. Note that defvar doesn't change the value of a
variable if it was bound previously. If you wish to change a
user-variable temporarily, use let:
* Local variables
Bind them with let, which will unbind them (or restore their
previous value, if they were bound) after exiting from the let
form. Change the value of local variables with setq or whatever
you like (e.g. incf, setf and such). The let form can even return one of its local variables.
Typical usage:
Note that even global variables should not be setqed without
defvaring them first, because the byte-compiler issues warnings. The
reason for the warning is the following:
Many of the advanced features of this package, such as defun*,
loop, and setf, are implemented as Lisp macros. In
byte-compiled code, these complex notations will be expanded into
equivalent Lisp code which is simple and efficient. For example,
the forms
*Interpreted* code, on the other hand, must expand these macros
every time they are executed. For this reason it is strongly
recommended that code making heavy use of macros be compiled. (The
features labelled "Special Form" instead of "Function" in this
manual are macros.) A loop using incf a hundred times will
execute considerably faster if compiled, and will also
garbage-collect less because the macro expansion will not have to
be generated, used, and thrown away a hundred times.
You can find out how a macro expands by using the cl-prettyexpand
function.
Please try not to make your code much uglier to gain a very small
speed gain. It's not usually worth it.
You can turn this to a function (that optionally prompts you for a
file name), and inserts the glyph at (point) instead of (point-min).
The sound support in XEmacs 19.14 is greatly improved over previous
versions.
Markus Gutschke <gutschk@uni-muenster.de> writes:
One way is to add, to .emacs:
This was caused by a bug in the Postscript font-lock regular
expressions. It should be fixed in 19.13. For earlier versions of
XEmacs, have a look at your .emacs file. You will probably have
a line like:
Take it out, restart XEmacs, and it won't try to fontify your
postscript files anymore.
The package ps-print.el, which is now included with
XEmacs, provides the
ability to do this. The source code contains complete instructions
on its use:
<xemacs_src_root>/lisp/packages/ps-print.el
Most of the time, however, the simplest fix is: DO NOT
specify paths as
you might for GNU Emacs. XEmacs can generally determine the
necessary paths dynamically at run time. The only path that generally
needs to be specified is the root directory to install into. That can
be specified by passing the
Try this:
Yes, abbrevs only expands word-syntax strings. While XEmacs does
not prevent you from defining (e.g. with C-x a g or
C-x a l)
abbrevs that contain special characters, it will refuse to
expand them. So you need to ensure, that the abbreviation
contains letters and digits only. This means that xd,
d5,
and 5d are valid abbrevs, but &d, and
x d are not.
If this sounds confusing to you, (re-)read the online
documentation for abbrevs:
Then the steps are
However, 2 things might be wrong:
Some versions of pbmtoicon produces some header lines that is not
expected by the version of compface that I grabbed. So I found I had
to include a 'tail +3' in the pipeline like this:
Some people have also found that if one uses the (insert-file ...)
method, one should NOT quote the face string using the sed script .
It might also be helpful to use Stig <stig@hackvan.com>'s script
(included in the compface distribution at XEmacs.org) to do the conversion.
For convenience xbm2xface is available for anonymous FTP at
Contributors for this item:
Emacs Info and XEmacs Info do many things differently. If you're trying to
support a number of versions of Emacs, here are some notes to remember:
Another alternative is to convert the documentation to HTML with texi2html
and read it from a web browser like Lynx or W3.
For postscript printing there are three analogous variables to customize.
NOTE: It is an undocumented limitation in XEmacs 19.14 that postscript
printing (the Pretty Print Buffer menu item)
requires a window system environment. It cannot be used
outside of X11.
This FAQ is Copyright © 1998 by various people and edited by Andreas Kaempf.
Please send comments, and suggestions to Andreas Kaempf
<andreas@sccon.com>.
I wonder if there is an interactive function that can generate
fake keyboard events.
This way, I could simply map them inside XEmacs.
Q5.1.2 Can I generate fake keyboard events?
(defun cg--generate-char-event (ch)
"Generate an event, as if ch has been typed"
(dispatch-event (character-to-event ch)))
;; Backspace and Delete stuff
(global-set-key '(backspace)
'(lambda () (interactive) (cg--generate-char-event 127)))
(global-set-key '(unknown_keysym_0x4)
'(lambda () (interactive) (cg--generate-char-event 4)))
The read-kbd-macro function returns the internal Emacs
representation of a human-readable string (which is its argument).
Thus:
Q5.1.3 Could you explain `read-kbd-macro' in more detail?
(read-kbd-macro "C-c C-a")
=> [(control ?c) (control ?a)]
(read-kbd-macro "C-c C-.
In GNU Emacs the same forms will be evaluated to what GNU Emacs
understands internally--the sequences \C-x\C-c and [3 67108910
up], respectively.
\377
.
In most cases, not noticable. Besides, there's no avoiding
let--you have to bind your local variables, after all. Some pose a
question whether to nest let's, or use one let' per function. I think because of clarity and maintenance (and possible future
implementation), let-s should be used (nested) in a way to provide
the clearest code.
Q5.1.4 What is the performance hit of `let'?
* Global variables
Q5.1.5 What is the recommended use of setq?
(let ((case-fold-search nil))
... ; code with searches that must be case-sensitive
...)
You will notice the user-variables by their docstrings beginning
with an asterisk (a convention).
;; iterate through the elements of the list returned by
;; `hairy-function-that-returns-list'
(let ((l (hairy-function-that-returns-list)))
(while l
... do something with (car l) ...
(setq l (cdr l))))
Another typical usage includes building a value simply to work
with it.
;; Build the mode keymap out of the key-translation-alist
(let ((inbox (file-truename (expand-file-name box)))
(i 0))
... code dealing with inbox ...
inbox)
This piece of code uses the local variable inbox, which becomes
unbound (or regains old value) after exiting the form. The form
also returns the value of inbox, which can be reused, for
instance:
(setq foo-processed-inbox
(let .....))
A typical misuse is probably setqing a variable that was meant to
be local. Such a variable will remain bound forever, never to be
garbage-collected. For example, the code doing:
Q5.1.6 What is the typical misuse of setq?
(defun my-function (whatever)
(setq a nil)
... build a large list ...
... and exit ...)
does a bad thing, as `a' will keep consuming memory, never to be
unbound. The correct thing is to do it like this:
(defun my-function (whatever)
(let (a) ; default initialization is to nil
... build a large list ...
... and exit, unbinding `a' in the process ...)
Not only is this prettier syntactically, but it makes it possible for
Emacs to garbage-collect the objects which a used to reference.
(defun flurgoze nil) ; ok, global internal variable
...
(setq flurghoze t) ; ops! a typo, but semantically correct.
; however, the byte-compiler warns.
While compiling toplevel forms:
** assignment to free variable flurghoze
It shouldn't. Here is what Dave Gillespie has to say about cl.el
performance:
Q5.1.7 I like the the do form of cl, does it slow things down?
(incf i n)
(push x (car p))
are expanded at compile-time to the Lisp forms
(setq i (+ i n))
(setcar p (cons x (car p)))
which are the most efficient ways of doing these respective
operations in Lisp. Thus, there is no performance penalty for
using the more readable incf and push forms in your compiled code.
Yes. Emacs byte-compiler cannot do much to optimize recursion. But
think well whether this is a real concern in Emacs. Much of the Emacs
slowness comes from internal mechanisms such as redisplay, or from the
fact that it is an interpreter.
Q5.1.8 I like recursion, does it slow things down?
Here is a solution that will insert the glyph annotation at the
beginning of buffer:
Q5.1.9 How do I put a glyph as annotation in a buffer?
(make-annotation (make-glyph '([FORMAT :file FILE]
[string :data "fallback-text"]))
(point-min)
'text
(current-buffer))
Replace FORMAT with an unquoted symbol representing the format of
the image (e.g. `xpm', `xbm', `gif', `jpeg', etc.) Instead of FILE,
use the image file name (e.g.
`/usr/local/lib/xemacs-20.2/etc/recycle.xpm').
5.2 Sound
Add the following line to your .emacs:
Q5.2.1 How do I turn off the sound?
(setq bell-volume 0)
(setq sound-alist nil)
That will make your XEmacs totally silent - even the default ding
sound (TTY beep on TTY-s) will be gone.
Make sure your XEmacs was compiled with sound support, and then
put this in your .emacs:
Q5.2.2 How do I get funky sounds instead of a boring beep?
(load-default-sounds)
See Part 2, Q2.0.3 which
has an explanation of the Network Audio System.
Q5.2.3 What's NAS, how do I get it?
I'm having some trouble with sounds I've downloaded from sunsite. They
play when I run them through showaudio or cat them directly
to /dev/audio, but XEmacs refuses to play them.
Q5.2.4 Sunsite sounds don't play
[Many of] These files have an (erroneous) 24byte header that tells about
the format that they have been recorded in. If you cat them
to /dev/audio, the header will be ignored and the default
behavior for /dev/audio will be used. This happens to be 8kHz
uLaw. It is probably possible to fix the header by piping
through sox and passing explicit parameters for specifying
the sampling format; you then need to perform a 'null'
conversion from SunAudio to SunAudio.
5.3 Miscellaneous
I'd like XEmacs to indent all the clauses of a Common Lisp `if' the
same amount instead of indenting the 3rd clause differently from the
first two.
Q5.3.1 How do you make XEmacs indent CL if-clauses correctly?
(put 'if 'lisp-indent-function nil)
However, note that the package cl-indent.el that comes with
XEmacs sets up this kind of indentation by default.
cl-indent also
knows about many other CL-specific forms.
To use cl-indent, one can
do this:
(load "cl-indent")
(setq lisp-indent-function (function common-lisp-indent-function))
One can also customize cl-indent.el so it mimics the
default if
indentation then indented more than the else).
Here's how:
(put 'if 'common-lisp-indent-function '(nil nil &body))
Also, a new version (1.2) of cl-indent.el was posted to
comp.emacs.xemacs on 12/9/94.
This version includes more
documentation than previous versions. This may prove useful if you
need to customize any indent-functions.
When I try to edit a postscript file it gets stuck saying:
fontifying 'filename' (regexps....) and it just sits there.
If I press C-c in the window where XEmacs was started, it suddenly
becomes alive again.
Q5.3.2 Fontifying hang when editing a postscript file.
(add-hook 'postscript-mode-hook 'turn-on-font-lock)
Font-lock looks nice. How can I print (WYSIWYG) the highlighted document?
Q5.3.3 How can I print WYSIWYG a font-locked buffer?
My printer is a Postscript printer and Q5.3.4 Getting M-x lpr to work with postscript printer.
lpr
only works
for Postscript files, so how do I get M-x lpr-region and
M-x lpr-buffer to work?
Put something like this in your .emacs:
(setq lpr-command "a2ps")
(setq lpr-switches '("-p" "-1"))
If you don't use a2ps to convert ASCII to postscript (why not, it's free?),
replace with the command you do use. Note also that some versions of a2ps
require a -Pprinter to ensure spooling.
You can specify what paths to use by using a number of different flags
when running configure. See the section MAKE VARIABLES in the top-level
file INSTALL in the XEmacs distribution for a listing of those flags.
Q5.3.5 How do I specify the paths that XEmacs uses for finding files?
--prefix
flag to configure. For a
description of the XEmacs install tree, please consult the
NEWS file.
Obsolete question, left blank to avoid renumbering.
Q5.3.6 [This question intentionally left blank]
Say, with: [END]?
Q5.3.7 Can I have the end of the buffer delimited in some way?
(let ((ext (make-extent (point-min) (point-max))))
(set-extent-property ext 'start-closed t)
(set-extent-property ext 'end-closed t)
(set-extent-property ext 'detachable nil)
(set-extent-end-glyph ext (make-glyph [string :data "[END]"])))
Since this is XEmacs, you can specify an icon to be shown on
window-system devices. To do so, change the make-glyph call to
something like this:
(make-glyph '([xpm :file "~/something.xpm"]
[string :data "[END]"]))
You can inline the XPM definition yourself by specifying :data
instead of :file. Here is such a full-featured version that works on
both X and TTY devices:
(let ((ext (make-extent (point-min) (point-max))))
(set-extent-property ext 'start-closed t)
(set-extent-property ext 'end-closed t)
(set-extent-property ext 'detachable nil)
(set-extent-end-glyph ext (make-glyph '([xpm :data "\
/* XPM */
static char* eye = {
\"20 11 7 2\",
\"__ c None\"
\"_` c #7f7f7f\",
\"_a c #fefefe\",
\"_b c #7f0000\",
\"_c c #fefe00\",
\"_d c #fe0000\",
\"_e c #bfbfbf\",
\"___________`_`_`___b_b_b_b_________`____\",
\"_________`_`_`___b_c_c_c_b_b____________\",
\"_____`_`_`_e___b_b_c_c_c___b___b_______`\",
\"___`_`_e_a___b_b_d___b___b___b___b______\",
\"_`_`_e_a_e___b_b_d_b___b___b___b___b____\",
\"_`_`_a_e_a___b_b_d___b___b___b___b___b__\",
\"_`_`_e_a_e___b_b_d_b___b___b___b___b_b__\",
\"___`_`_e_a___b_b_b_d_c___b___b___d_b____\",
\"_____`_`_e_e___b_b_b_d_c___b_b_d_b______\",
\"_`_____`_`_`_`___b_b_b_d_d_d_d_b________\",
\"___`_____`_`_`_`___b_b_b_b_b_b__________\",
} ;"]
[string :data "[END]"]))))
Note that you might want to make this a function, and put it to a
hook. We leave that as an excercise for the reader.
Like this:
Q5.3.8 How do I insert today's date into a buffer?
(insert (current-time-string))
Markus Gutschke <gutschk@uni-muenster.de> writes:
Q5.3.9 Are only certain syntactic character classes available for abbrevs?
M-x Info-goto-node RET
(Emacs)Abbrevs RET
or C-h i m Emacs RET m Abbrevs RET and
then come back and read this question/answer again.
Firstly there is an ftp site which describes X-faces and has the associated
tools mentioned below.Q5.3.10 How can I get those oh-so-neat X-Face lines?
<URL:ftp://ftp.cs.indiana.edu:/pub/faces/>.
cat file.xbm | xbm2ikon |compface > file.face
cat ./file.face | sed 's/\\/\\\\/g' | sed 's/\"/\\\"/g' > ./file.face.quoted
(setq mail-default-headers
"X-Face: <Ugly looking text string here>")
or
(defun mail-insert-x-face ()
(save-excursion
(goto-char (point-min))
(search-forward mail-header-separator)
(beginning-of-line nil)
(insert "X-Face:")
(insert-file "~/.face")))
(add-hook 'mail-setup-hook 'mail-insert-x-face)
cat file.xbm | xbm2ikon | tail +3 |compface > file.face
ftp://ftp.miranova.com/pub/xemacs/xbm2xface.pl.
Paul Emsley,
Ricardo Marek,
Amir J. Katz,
Glen McCort,
Heinz Uphoff,
Peter Arius,
Paul Harrison, and
Vegard Vesterheim
You use something like:
Q5.3.11 How do I add new Info directories?
(setq Info-directory-list (cons
(expand-file-name "~/info")
Info-default-directory-list))
David Masterson <davidm@prism.kla.com> writes:
For regular printing there are two variables that can be customized.
Q5.3.12 What do I need to change to make printing work?
lpr-command
(setq lpr-command "lp")
lpr-switches
(setq lpr-switches '("-depson"))
ps-lpr-command
ps-lpr-switches
ps-lpr-command
to do its job.
ps-print-color-p