|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T l
Length: 52475 (0xccfb)
Types: TextFile
Names: »lispref-17«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
└─⟦c06c473ab⟧ »./UNRELEASED/lispref.tar.Z«
└─⟦1b57a2ffe⟧
└─⟦this⟧ »lispref-17«
Info file: lispref, -*-Text-*-
produced by texinfo-format-buffer
from file: lispref.texinfo
This file documents GNU Emacs Lisp.
This is Edition 0.1 Beta of the GNU Emacs Lisp Reference Manual, for
Emacs Version 18, with some references to Emacs Version 19.
Please read this document for review purposes.
Published by the Free Software Foundation, 675 Massachusetts Avenue,
Cambridge, MA 02139 USA
Copyright (C) 1989 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation
approved by the Foundation.
▶1f◀
File: lispref Node: Creating a Synchronous Process, Prev: Functions that Create Subprocesses, Up: Processes, Next: Creating an Asynchronous Process
Creating a Synchronous Process
==============================
After a "synchronous process" is created, Emacs waits for the process
to terminate before continuing. Starting `dired' is an example of this:
it runs `ls' in a synchronous process, then modifies the output
slightly. You are not able to type a command until this is finished.
* Function: call-process PROGRAM &optional INFILE BUFFER-OR-NAME DISPLAY &rest ARGS
This function calls PROGRAM in a separate process and waits for
it to finish. It returns `nil'.
The process standard input comes from file INFILE if INFILE is
not `nil' and from `/dev/null' otherwise. The process output gets
inserted in buffer BUFFER-OR-NAME before point if the argument
names a buffer. If BUFFER-OR-NAME is `t', output is sent to the
current buffer; and if BUFFER-OR-NAME is `nil', output is
discarded.
If BUFFER-OR-NAME is 0, the output is discarded and
`call-process' returns immediately. In this case, the process is
not truly synchronous, since it can run in parallel with Emacs; but
since Emacs gets no output from it, you can think of it as that.
Emacs is essentially finished with the subprocess when the function
returns.
If DISPLAY is non-`nil', then `call-process' redisplays the
buffer as output is inserted. Otherwise the function does no
redisplay; you will see the results (put in a buffer) only if and
when Emacs redisplays that buffer.
The remaining arguments, ARGS, are strings that will be supplied
as the command line arguments for the program.
While the `call-process' function waits for PROGRAM to terminate;
if you quit by typing `C-g', the process is killed by sending it a
SIGKILL signal.
The examples below are both run with the buffer `foo' current.
(call-process "pwd" nil t)
=> nil
---------- Buffer: foo ----------
/usr/user/lewis/manual
---------- Buffer: foo ----------
(call-process "grep" nil "bar" nil "lewis" "/etc/passwd")
=> nil
---------- Buffer: bar ----------
lewis:5LTsHm66CSWKg:398:21:Bil Lewis:/user/lewis:/bin/csh
---------- Buffer: bar ----------
The `dired-readin' function contains a good example of the use of
`call-process':
(call-process "ls" nil buffer nil dired-listing-switches dirname)
* Function: call-process-region START END PROGRAM &optional DELETE BUFFER-OR-NAME DISPLAY &rest ARGS
This function sends the text between START to END as standard
input to a process running PROGRAM. It deletes the text sent if
DELETE is non-`nil'. You might want to do this if you are going to
insert the output back in the curent buffer.
If BUFFER-OR-NAME names a buffer, the output is inserted in that
buffer at point. If BUFFER-OR-NAME is `t', then the output is sent
to the current buffer. If BUFFER-OR-NAME is `nil', the output is
discarded.
If DISPLAY is non-`nil', then `call-process-region' redisplays
the buffer as output is inserted. Otherwise the function does no
redisplay; you will see the results (put in a buffer) only if and
when Emacs redisplays that buffer.
The remaining arguments, ARGS, are strings that are supplied as
the command line arguments for the program.
The `shell-command-on-region' function uses `call-process-region':
(call-process-region start end
shell-file-name ; Name of program.
nil ; Do not delete region.
buffer ; Send output to BUFFER.
nil ; No redisplay during output.
"-c" command) ; Arguments supplied program.
The `call-process-region' function normally waits for the process
to terminate; but if you quit (for example, by typing `C-g'), the
process is killed.
In the first example below, the `cat' utility is called with
standard input being the first five characters in buffer `foo' (the
word `input'). `cat' copies its standard input into its standard
output. This causes it to be inserted into the buffer. The
function returns `nil'.
---------- Buffer: foo ----------
input
---------- Buffer: foo ----------
(call-process-region 1 6 "cat" nil t)
=> nil
---------- Buffer: foo ----------
inputinput
---------- Buffer: foo ----------
▶1f◀
File: lispref Node: Creating an Asynchronous Process, Prev: Creating a Synchronous Process, Up: Processes, Next: Deleting Processes
Creating an Asynchronous Process
================================
After an "asynchronous process" is created by `start-process', control
returns to Emacs. The process may thereafter run at the same time as
Emacs; and it and Emacs may communicate with each other using the
functions described in following sections.
* Function: start-process NAME BUFFER-OR-NAME PROGRAM &rest ARGS
This function creates a new process and starts a program in that
process. The process will be named NAME (modified as necessary to
be unique). The buffer BUFFER-OR-NAME is the buffer to associate
with the process. PROGRAM is the program to run.
The remaining arguments, ARGS, are strings that will be supplied
as the command line arguments for the program.
`start-process' returns the process object created.
The name given to the process is guaranteed to be unique among
processes. It will be the name supplied by the user, or the name
modified (by appending `<1>', `<2>', etc.) if necessary to make it
unique.
In the example below, the first process is started and runs
(well, sleeps) for 100 seconds. Meanwhile, the second process is
started and runs to completion, inserting the directory listing at
the end of the buffer `foo' before the first process finishes.
After the first process finishes, Emacs inserts `Process my-process
finished' at the end of the buffer.
(start-process "my-process" "foo" "sleep" "100")
=> #<process my-process>
(start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin")
=> #<process my-process<1>>
---------- Buffer: foo ----------
total 2
lrwxrwxrwx 1 lewis 14 Jul 22 10:12 gnuemacs --> /emacs
-rwxrwxrwx 1 lewis 19 Jul 30 21:02 lemon
Process my-process<1> finished
Process my-process finished
---------- Buffer: foo ----------
* Variable: process-connection-type
This global variable controls the type of device used to
communicate with subprocesses. If it is `nil', then pipes are
used. If it is `t', then PTYS are used (or pipes if PTYS not
supported---this is determined by the C constant `HAVE_PTYS', which
must be defined when Emacs is compiled.). PTYS are usually
preferable because they allow job control (`C-c, C-z, etc.') to
work between the process and its children whereas pipes do not; the
`shell' command uses PTYS by default.
The value `process-connection-type' is used when `start-process'
is called, so to change it for just one call of `start-process',
temporarily rebind it with `let'.
(let ((process-connection-type nil)) ; use a pipe
(start-process ...))
▶1f◀
File: lispref Node: Deleting Processes, Prev: Creating an Asynchronous Process, Up: Processes, Next: Process Information
Deleting Processes
==================
* Variable: delete-exited-processes
This global variable determines when exited processes will be
deleted. If it is `nil', then they will not be deleted until
`list-processes' is run; otherwise, they will be deleted
immediately after they exit.
* Function: delete-process NAME
This function deletes the process associated with NAME. NAME may
be a process, the name of a process, a buffer, or the name of a
buffer. The subprocess is killed with a `SIGHUP' signal.
(delete-process "*shell*")
=> nil
* Function: process-kill-without-query PROCESS
This function declares that Emacs need not query the user if
PROCESS is still running when Emacs is exited. It returns `t'.
(process-kill-without-query (get-process "shell"))
=> t
▶1f◀
File: lispref Node: Process Information, Prev: Deleting Processes, Up: Processes, Next: Sending Input to Processes
Process Information
===================
Several functions return information about processes. `list-processes'
is provided for interactive use.
* Command: list-processes
This command displays a listing of all living processes. (Any
processes listed as Exited or Signaled are actually eliminated
after the listing is made.) This function returns `nil'.
* Function: process-list
This function returns a list of all processes that are still
alive.
(process-list)
=> (#<process display-time> #<process shell>)
* Function: get-process NAME
This function returns the process named NAME, or `nil' if there
is none. It is an error if NAME is not a string.
(get-process "shell")
=> #<process shell>
* Variable: mode-line-process
This buffer-local variable contains the mode line information on
process status. It is displayed immediately following the major
mode name, with no intervening space. For example, its value in
the `*shell*' buffer is `(": %s")', which allows the shell to
display its status along with the major mode as: `(Shell: run)'.
Normally this variable is `nil'.
* Function: process-command PROCESS
This function returns the command that was executed to start
PROCESS. This is a list of strings, the first string being the
program executed and the rest of the strings being the arguments
given to it.
(process-command (get-process "shell"))
=> ("/bin/csh" "-i")
* Function: process-exit-status PROCESS
This function returns the exit status of PROCESS or the signal
number that killed it. If PROCESS has not yet exited or died, the
value is 0.
* Function: process-id PROCESS
This function returns the process id of PROCESS. This is the PID
of the Unix process which PROCESS refers to.
* Function: process-mark PROCESS
This function returns the marker which indicates the end of the
last output from PROCESS into its buffer (*Note Process Buffers::).
This marker controls where additional output from the process will
be inserted. Usually, it will be at the end of the buffer.
If PROCESS does not insert its output into a buffer, then
`process-mark' returns a marker that points nowhere.
* Function: process-name PROCESS
This function returns the name of PROCESS.
* Function: process-status PROCESS-NAME
This function returns the status of PROCESS-NAME as a symbol.
PROCESS-NAME must be either a process or a string. If it is a
string, it need not name an actual process.
The possible values are:
`run'
for a process that is running.
`stop'
for a process that is stopped but continuable.
`exit'
for a process that has exited.
`signal'
for a process that has received a fatal signal.
`nil'
if PROCESS-NAME does not exist.
(process-status "shell")
=> run
(process-status "never-existed")
=> nil
x
=> #<process xx<1>>
(process-status x)
=> exit
For a network stream, `process-status' returns the symbols `open'
or `closed'. The latter means that the other side closed the
connection, or Emacs did `delete-process'.
▶1f◀
File: lispref Node: Sending Input to Processes, Prev: Process Information, Up: Processes, Next: Sending Signals to Processes
Sending Input to Processes
==========================
Asynchronous subprocesses receive input when it is sent to them by
Emacs. This is done by calling one of the functions in this section.
You must specify the process to send input to, and the input. The data
you send appears on the ``standard input'' of the subprocess.
The kernel may fail if you send more characters than it will hold in
an input buffer. If necessary, use a temporary file, and send a program
to read it.
* Function: process-send-string PROCESS-NAME STRING
This function sends PROCESS-NAME the contents of STRING as
standard input. PROCESS-NAME must be a process or the name of one.
The function returns `nil'.
(process-send-string "shell<1>" "ls\n")
=> nil
---------- Buffer: *shell* ----------
...
introduction.texinfo syntax-tables.texinfo~
introduction.texinfo~ text.texinfo
introduction.txt text.texinfo~
...
---------- Buffer: *shell* ----------
* Command: process-send-region PROCESS-NAME START END
This function sends the text in the region defined by START and
END as standard input to PROCESS-NAME, which is a process or a
process name.
It is an error unless both START and END are integers or markers
that indicate positions in the current buffer. It is unimportant
which number is larger.
* Function: process-send-eof &optional PROCESS-NAME
This function makes PROCESS-NAME see an end-of-file in its input.
The EOF comes after any text already sent to it.
If PROCESS-NAME is not supplied, or if it is `nil', then this
function send the EOF to the current buffer's process. It is an
error if the current buffer has no process.
The function returns PROCESS-NAME.
(process-send-eof "shell")
=> "shell"
▶1f◀
File: lispref Node: Sending Signals to Processes, Prev: Sending Input to Processes, Up: Processes, Next: Receiving Information from Processes
Sending Signals to Processes
============================
"Sending a signal" to a subprocess is a way of interrupting its
activities. There are several different signals, each with its own
meaning. For example, the signal `SIGINT' means that the user has typed
`C-c', or that some analogous thing has happened.
Each signal has a standard effect on the subprocess. Most signals
kill the subprocess, but some stop execution or resume execution
instead. Some programs handle certain signals and non-standard things.
The set of signals and their names is defined by the operating system;
Emacs has facilities for sending only a few of the signals that are
defined.
Emacs can send signals only to its own subprocesses. This is done
with the functions below, or automatically: killing a buffer sends a
`SIGHUP' signal to all its associated processes; killing Emacs sends a
`SIGHUP' signal to all remaining processes. (`SIGHUP' is a signal that
usually indicates that the user hung up the phone.)
Each of the signal-sending functions takes two optional arguments:
PROCESS-NAME and CURRENT-GROUP.
The argument PROCESS-NAME must be either a process, the name of one,
or `nil'. If it is `nil', the process defaults to the process
associated with the current buffer. It is an error if PROCESS-NAME does
not identify a process.
The argument CURRENT-GROUP is a flag which makes a difference when you
are running a job-control shell as an Emacs subprocess. If it is
non-`nil', then the signal is sent to the current process-group of the
terminal which Emacs uses to communicate with the subprocess. If the
process is a job-control shell, this means the shell's current subjob.
If it is `nil', the signal is sent to the process group of the immediate
subprocess of Emacs. If the subprocess is a job-control shell, this is
the shell itself.
The flag CURRENT-GROUP has no effect when a pipe is used to
communicate with the subprocess, because the operating system does not
support the distinction in the case of pipes. For the same reason,
job-control shells won't work when a pipe is used. See
`process-connection-type' in *Note Creating an Asynchronous Process::.
* Function: interrupt-process &optional PROCESS-NAME CURRENT-GROUP
This function interrupts the process PROCESS-NAME by sending the
Unix signal `SIGINT'. When you are not in Emacs, typing the
``interrupt character'' (usually `C-c' on Berkeley Unix) sends this
signal.
When the argument CURRENT-GROUP is non-`nil', you can think of this
function as ``typing `C-c''' on the terminal by which Emacs talks
to the subprocess.
* Function: kill-process &optional PROCESS-NAME CURRENT-GROUP
This function kills the process PROCESS-NAME by sending the Unix
signal `SIGKILL'. This signal kills the subprocess immediately; it
cannot be handled by the subprocess.
* Function: quit-process &optional PROCESS-NAME CURRENT-GROUP
This function sends the Unix signal `SIGQUIT' to the process
PROCESS-NAME. This signal is the one sent by the ``quit
character'' (usually `C-b' or `C-\') when you are not inside Emacs.
* Function: stop-process &optional PROCESS-NAME CURRENT-GROUP
This function stops the process PROCESS-NAME by sending the Unix
signal `SIGTSTP'. Use `continue-process' to resume its execution.
On systems with job control, the ``stop character'' (usually
`C-z') sends this signal (when you are not inside Emacs). When
CURRENT-GROUP is non-`nil', you can think of this function as
``typing `C-z''' on the terminal Emacs uses to communicate with the
subprocess.
* Function: continue-process &optional PROCESS-NAME CURRENT-GROUP
This function causes the process PROCESS to be continued by
sending the Unix signal `SIGCONT'. This presumes that PROCESS-NAME
was stopped previously.
▶1f◀
File: lispref Node: Receiving Information from Processes, Prev: Sending Signals to Processes, Up: Processes, Next: Subprocess Functions for VMS
Receiving Information from Processes
====================================
There are three ways to receive information asynchronously from a
process; two are for standard output and the third is for the process
status. It is important to note that the filter and sentinel functions
are only called when Emacs is waiting for something; they never run
while other Lisp code is running. Similarly, output is only inserted in
an associated buffer when Emacs is waiting.
You may explicitly cause Emacs to wait by calling `sit-for',
`sleep-for', or `accept-process-output'. Emacs also waits in the
command loop for the next key command.
All sentinels and filters that do regexp searching or matching should
save and restore the match data. Otherwise, a sentinel that runs during
a call to `sit-for' might clobber the match data of the program that
called `sit-for'. *Note Match Data::.
* Function: accept-process-output &optional PROCESS
This function allows pending output from any processes to be read
by Emacs. It is read into the process buffers or given to their
filter functions. If PROCESS is non-`nil' then this function does
not return until some output has been received from that process.
* Function: waiting-for-user-input-p
This function returns non-`nil' if Emacs is waiting for keyboard
input from the user, `nil' if it is not. This is intended for use
by asynchronous process output filters and sentinels.
* Menu:
* Process Filters::
* Process Buffers::
* Process Sentinels::
▶1f◀
File: lispref Node: Process Filters, Prev: Receiving Information from Processes, Up: Receiving Information from Processes, Next: Process Buffers
Process Filters
---------------
A "process filter" is a function that receives the standard output
from the associated process. If a process has a filter, then *all*
standard output from that process will be sent to the filter rather than
be inserted into a buffer or discarded.
A filter function runs onlywhile Emacs is waiting.
A filter function must accept two arguments: the associated process
and a string, which is the output. The function is then free to do
whatever it chooses to with the output.
The output to the function may come in any sized chunks. A Unix
command that produces the same output twice in a row may send it as one
string of 200 characters one time, and five strings of 40 characters the
next.
* Function: set-process-filter PROCESS FILTER
This function gives PROCESS the filter function FILTER. If
FILTER is `nil', then the process will have no filter.
(defun keep-output (process output)
(setq kept (cons output kept)))
=> keep-output
(setq kept nil)
=> nil
(set-process-filter (get-process "shell") 'keep-output)
=> keep-output
(process-send-string "shell" "ls ~/other\n")
=> nil
kept
=> ("lewis@slug[8] % "
"FINAL-W87-SHORT.MSS backup.otl kolstad.mss~
address.txt backup.psf kolstad.psf
backup.bib~ david.mss resume-Dec-86.mss~
backup.err david.psf resume-Dec.psf
backup.mss dland syllabus.mss
"
"#backups.mss# backup.mss~ kolstad.mss
")
;; Insert input in the buffer specified by `my-shell-buffer'
;; and make sure that buffer is shown in some window.
(defun my-process-filter (proc str)
(let ((cur (selected-window))
(pop-up-windows t))
(pop-to-buffer my-shell-buffer)
(goto-char (point-max))
(insert str)
(set-marker (process-mark proc) (point-max))
(select-window cur)))
* Function: process-filter PROCESS
This function returns the filter function of PROCESS, or `nil' if
has none.
▶1f◀
File: lispref Node: Process Buffers, Prev: Process Filters, Up: Receiving Information from Processes, Next: Process Sentinels
Process Buffers
---------------
The buffer that a process is associated with is where the standard
output from that process will be inserted (if the process does not have
a filter function). Output is always inserted at the `process-mark'
(*Note Process Information::), which is then updated to point to the end
of the text just inserted. Often, the `process-mark' will be at the end
of the buffer.
* Function: set-process-buffer PROCESS BUFFER
This function sets the buffer associated with PROCESS to BUFFER.
If BUFFER is `nil', then the process will not be associated with
any buffer at all.
* Function: process-buffer PROCESS
This function returns the buffer PROCESS is associated with.
(process-buffer (get-process "shell"))
=> #<buffer *shell*>
* Function: get-buffer-process BUFFER-OR-NAME
This function returns the process associated with BUFFER-OR-NAME.
If there are several processes associated with it, then one is
chosen. (Presently, the one chosen is the one most recently
created.) Normally, you should avoid having more than one process
with the same buffer.
(get-buffer-process "*shell*")
=> #<process shell>
If the process's buffer is killed, the actual child process is
killed with a `SIGHUP' signal (*Note Sending Signals to
Processes::).
▶1f◀
File: lispref Node: Process Sentinels, Prev: Process Buffers, Up: Receiving Information from Processes
Process Sentinels
-----------------
A "process sentinel" is a function that is called whenever the
associated process changes status. This includes anything that
terminates, stops, or continues the process; and the "process sentinel"
is called if the process exits on its own. The sentinel is called with
two arguments: the process for which the event occurred, and a string
describing the type of event.
The string describing the event looks like one of the following:
A sentinel is called for any signal that Emacs finds out about (anything
fatal or that stops the process). A sentinel is also called if Emacs
sends a `SIGCONT' signal to a process.
* Function: set-process-sentinel PROCESS SENTINEL
This function associates SENTINEL with PROCESS. If SENTINEL is
`nil', then the process will have no sentinel. The default
behavior when there is no sentinel is to insert a message in the
process's buffer.
(defun msg-me (process event)
(princ
(format "Process: %s had the event `%s'" process event)))
(set-process-sentinel (get-process "shell") 'msg-me)
=> msg-me
(kill-process (get-process "shell"))
=> Process: #<process shell> had the event `killed'
=> #<process shell>
* Function: process-sentinel PROCESS
This function returns the sentinel of PROCESS, or `nil' if it has
none.
▶1f◀
File: lispref Node: Subprocess Functions for VMS, Prev: Receiving Information from Processes, Up: Processes, Next: TCP
Subprocess Functions for VMS
============================
The ordinary subprocess functions do not work on VMS. Instead, these
are available.
* Function: default-subprocess-input-handler
This function is the default input handler for input from spawned
subprocesses.
* Function: send-command-to-subprocess NAME COMMAND
This function sends the string COMMAND to a VMS subprocess named
NAME.
* Function: spawn-subprocess
This function spawns an asynchronous VMS subprocess for command
processing.
* Function: stop-subprocess PROCESS-NAME
This function stops a VMS subprocess named NAME.
▶1f◀
File: lispref Node: TCP, Prev: Subprocess Functions for VMS, Up: Processes
TCP
===
This is how you can open a network connection to any program or server
that might be listening. This much like communication with a subprocess
except that the process is not a chile of Emacs and it must already
exist. The connection is represented by a process object, just like an
ordinary subprocess. You can distinguish connections from subprocesses
using `process-status'.
Input and output work as for subprocesses; `delete-process' closes the
connection.
* Function: open-network-stream NAME BUFFER HOST SERVICE
This function opens a TCP connection for a service to a host. It
returns a subprocess-object to represent the connection.
The NAME argument is the name for the `process'. It is modified
if necessary to make it unique.
The BUFFER-OR-NAME argument is the buffer to associate with the
connection. Output from the connection goes at end of the buffer,
unless you specify an output stream or filter function to handle
the output. BUFFER-OR-NAME may be also `nil', which means that the
connection is not associated with any buffer
SERVICE is name of the service desired, or an integer specifying a
port number to connect to.
▶1f◀
File: lispref Node: Operating System Interface, Prev: Processes, Up: Top, Next: Emacs Display
Operating System Interface
**************************
This chapter is about starting and getting out of Emacs, access to
values in the operating system environment, and terminal input, output
and flow control.
*Note Building Emacs::, *Note Emacs Display::,
* Menu:
* When Emacs Starts Up::
* Getting out of Emacs::
* Operating System Environment::
* Terminal Input::
* Terminal Output::
* Flow Control::
* Variable: noninteractive
When Emacs is running in batch mode (without an interactive
terminal), then this variable is non-`nil'.
▶1f◀
File: lispref Node: When Emacs Starts Up, Prev: Operating System Interface, Up: Operating System Interface, Next: Getting out of Emacs
When Emacs Starts Up
====================
The order of operations performed by Emacs when it is started up (by
`startup.el') is as follows:
1. Read command line switches.
2. Load `.emacs' unless `-q' specified on command line.
3. Load `default.el' unless `inhibit-default-init' is non-`nil'.
4. Load terminal specific file.
5. Run `term-setup-hook'.
6. Run `window-setup-hook'.
7. Display copyleft information, unless `inhibit-startup-message' is
non-`nil'.
8. Process remaining command line arguments.
* Menu:
* Init File::
* Terminal-specific Initialization::
* Command Line Arguments::
* User Option: inhibit-startup-message
This global variable inhibits the initial startup messages (the
non-warranty etc.). If it is non-`nil', then the messages are not
printed. This is for use in your personal init file, once you are
familiar with the contents of the startup message.
▶1f◀
File: lispref Node: Init File, Prev: When Emacs Starts Up, Up: When Emacs Starts Up, Next: Terminal-specific Initialization
The Init File: .emacs
---------------------
When you start Emacs, it normally attempts to load the `.emacs' file
from your home directory. This file, if it exists, must contain Lisp
code. It is called your "init file". The command line switches `-q'
and `-u' can be used to tell Emacs whether to load an init file. (The
`-q' switch tells Emacs not to load your init file; and the `-u' switch
tell Emacs to load a named user's init file instead of yours.) (*Note
Entering Emacs: (emacs)Entering Emacs).
Emacs may also have a "default init file", which is the library named
`default.el'. (A Lisp library is a file containing Lisp function
definitions and other code.) Emacs finds the `default.el' file through
the standard search path for libraries. The Emacs distribution does not
have any such file; you may create one at your site for local
customizations. If the default init file exists, it is loaded whenever
you start Emacs. But your own personal init file, if any, is loaded
first; if it sets `inhibit-default-init' to a non-`nil' value, then
Emacs will not load the `default.el' file.
If you have a large amount of code in your `.emacs' file, you should
move it into another file named `SOMETHING.el', byte-compile it (*Note
Byte Compilation::), and make your `.emacs' file load the other file
using `load' (*Note Loading::).
*Note Init File Examples: (emacs)Init File Examples, for examples of
how to make various commonly desired customizations in your `.emacs'
file.
* User Option: inhibit-default-init
This global variable prevents Emacs from loading the default
initialization library file for your session of Emacs. If its
value is non-`nil', then the default library is not loaded. The
default value is `nil'.
▶1f◀
File: lispref Node: Terminal-specific Initialization, Prev: Init File, Up: When Emacs Starts Up, Next: Command Line Arguments
Terminal-specific Initialization
--------------------------------
Each terminal type can have its own Lisp library that Emacs will load
when run on that type of terminal. For a terminal type named TERMTYPE,
the library is called `term/TERMTYPE'. Emacs find the file by searching
the `load-path' directories as it does for other files and trying the
`.elc' and `.el' suffixes. Normally, terminal-specific Lisp library is
located in `emacs/lisp/term', a subdirectory of the `emacs/lisp'
directory in which most Emacs Lisp libraries are kept.
The library's name is constructed by concatenating the value of the
variable `term-file-prefix' and the terminal type.
The usual purpose of a terminal-specific library is to define the
escape sequences used by a terminal's function keys.
Function keys are handled by a two-level process. The first level is
dependent and the specific type of terminal and maps Emacs's input
sequences to the function keys that they represent. The second level is
independent of terminal type and is customized by users; function keys
are mapped into meanings at this level. The terminal-specific library
handles the first level of the process and the library `keypad.el'
handles the second level of mapping.
See the file `term/vt100.el' for an example of of a terminal-specific
library.
When the name of the terminal type contains a hyphen, only the part of
the name before the first hyphen is significant in choosing the library
name. Thus, terminal types `aaa-48' and `aaa-30-rv' both use the
`term/aaa' library. If necessary, the library can evaluate `(getenv
"TERM")' to find the full name of the terminal type.
Your `.emacs' file can prevent the loading of the terminal-specific
library by setting `term-file-prefix' to `nil'. This feature is very
useful for when you experimenting with your own peculiar customizations;
but a more elegant long-term mechanism for handling your own
customizations is to include a value for `term-setup-hook' in your
`.emacs'.
If it is not `nil', Emacs calls the value of the variable
`term-setup-hook' as a function of no arguments at the end of Emacs
initialization, after Emacs has already loaded both your `.emacs' file
and any terminal-specific libraries. You can set the value of the
`term-setup-hook' variable in your `.emacs' file to override part of any
of the terminal-specific libraries and to define initializations for
terminals that do not have a library.
* Variable: term-file-prefix
If the `term-file-prefix' global variable is non-`nil', Emacs
loads your `.emacs' file and the default initialization file and
then evaluates the following expression:
(load (concat term-file-prefix (getenv"TERM")))
You may set the `term-file-prefix' variable to `nil' in your
`.emacs' file if you do not wish to load the
terminal-initialization file. (To do this, put the following in
your `.emacs' file: `(setq term-file-prefix nil)'.)
* Variable: term-setup-hook
The value of this variable is either `nil' or that of a function
that Emacs calls after loading your `.emacs' file, the default
initialization file (if any) and after loading terminal-specific
lisp code. The value of `term-setup-hook' is called with no
arguments.
The expression in `startup.el' is
(and term-setup-hook (funcall term-setup-hook))
To prevent the hook from being run twice, `term-setup-hook' is
set to `nil' after it is used.
You can use `term-setup-hook' to override the definitions made by
a terminal-specific file.
* Variable: window-setup-hook
The value of the `window-setup-hook' variable is either `nil' or
that of a function that Emacs calls after loading your `.emacs'
file, the default initialization file (if any), after loading
terminal-specific lisp code, and after calling `term-setup-hook'.
`window-setup-hook' is called with no arguments.
▶1f◀
File: lispref Node: Command Line Arguments, Prev: Terminal-specific Initialization, Up: When Emacs Starts Up
Command Line Arguments
----------------------
You can use command line arguments to request various actions when you
start Emacs. Since you do not need to start Emacs more than once per
day, and will often leave your Emacs session running longer than that,
command line arguments are hardly ever needed. As a practical matter,
it is best to avoid them. They exist to permit you to do several
sophisticated actions and for compatibility with other editors.
(Note that some other editors require you to start afresh each time
you want to edit a file. With this kind of editor, you will probably
specify the file as a command line argument. The recommended way to use
GNU Emacs is to start it only once, just after you log in, and do all
your editing in the same Emacs process. Each time you want to edit a
different file, you visit it with the existing Emacs, which eventually
comes to have many files in it ready for editing. Usually you do not
kill the Emacs until you are about to log out.)
* Function: command-line
This function parses the command line which Emacs was called
with, processes it, loads the user's `.emacs' file and displays the
initial warranty information, etc.
* Variable: command-line-processed
The value of this variable is `t' once the command line has been
processed.
* Variable: command-switch-alist
The value of this variable is an alist of user-defined
command-line switches and associated handler functions. This
variable exists so you can add elements to it.
A "command line switch" is an argument on the command line of the
form:
-SWITCH-STRING
The elements of the `command-switch-alist' look like this:
(SWITCH-STRING . HANDLER-FUNCTION)
For each element, the HANDLER-FUNCTION receives the switch name
as its sole argument.
In some cases, the command line switch is followed by an
argument. In these cases, the command-line arguments are in the
variable `command-line-args'.
The command line arguments are parsed by the `command-line-1'
function in the `startup.el' file. Also, *Note Command Line
Switches and Arguments: (emacs)Command Switches..
* Variable: command-line-args
The value of this variable is the arguments passed by the shell
to Emacs, as a list of strings.
▶1f◀
File: lispref Node: Getting out of Emacs, Prev: When Emacs Starts Up, Up: Operating System Interface, Next: Operating System Environment
Getting out of Emacs
====================
As a practical matter, in everyday use, you seldom quit Emacs---only
when you are about to log out. The rest of the time, you will work in
Emacs or in a shell inside of Emacs. If you do have to leave Emacs
temporarily, it is best to suspend Emacs rather than quit it. (*Note
Suspending Emacs::.)
* Menu:
* Killing Emacs::
* Suspending Emacs::
▶1f◀
File: lispref Node: Killing Emacs, Prev: Getting out of Emacs, Up: Getting out of Emacs, Next: Suspending Emacs
Killing Emacs
-------------
Killing Emacs means ending the execution of the Emacs job. It will
return to its superior process.
All the information in the Emacs, aside from files that are saved, is
lost when the Emacs is killed. Because killing Emacs inadvertently can
lose a lot of work, Emacs will query for confirmation before actually
terminating, if you have files that need saving or subprocesses that are
running.
* Function: kill-emacs &optional NO-QUERY
This function exits the Emacs job and kills it. If NO-QUERY is
supplied and non-`nil', then Emacs will exit directly.
Normally, if there are modified files or if there are running
processes, Emacs will ask the user whether it should *really* exit.
If Emacs is running noninteractively and NO-QUERY is an integer,
then it returns NO-QUERY as the Unix program's exit code.
(kill-emacs)
=> nil
---------- Buffer: Minibuffer ----------
1 modified buffer exists, do you really want to exit? (yes or no) yes
Subprocesses are executing; kill them and exit? (yes or no) no
---------- Buffer: Minibuffer ----------
* Variable: kill-emacs-hook
The value of the `kill-emacs-hook' variable is either `nil' or is
that of a function that Emacs calls whenever `kill-emacs' is
called. The hook is called before anything else is done by
`kill-emacs'.
▶1f◀
File: lispref Node: Suspending Emacs, Prev: Killing Emacs, Up: Getting out of Emacs
Suspending Emacs
----------------
``Suspending Emacs'' means stopping Emacs temporarily and returning
control to its superior, which is usually the shell. This allows you to
resume editing later in the same Emacs job, with the same files, the
same kill ring, the same undo history, and so on. This is very
convenient. As a practical matter, you seldom need to suspend Emacs;
you can do almost all your work inside Emacs or inside a shell inside of
Emacs.
* Function: suspend-emacs STRING
This function stops Emacs and returns to the superior process.
After suspending Emacs, you may still resume Emacs. (This is in
contrast to your situation after killing Emacs.) This function
does nothing if Emacs is running under X windows.
If STRING is non-`nil', its characters are sent to be read as
terminal input by Emacs's superior shell. The characters in STRING
will not be echoed by the superior shell; just the results will
appear.
Before suspending, Emacs examines the symbol `suspend-hook'. If
it is bound, and its value is non-`nil', then the value will be
called as a function of no arguments. Emacs won't be suspended
unless this called function returns `nil'.
After Emacs resumes, the symbol `suspend-resume-hook' will be
examined. If it is bound and non-`nil', then the value will be
called as a function of no arguments. The next redisplay after
resumption will redraw the entire screen, unless `no-redraw-on
recenter' is set (*Note Screen Attributes::).
`suspend-emacs' returns `nil'.
In the example, note that `pwd' is not echoed by the shell after
Emacs is suspended.
(suspend-emacs)
=> nil
(setq suspend-hook
(function (lambda ()
(not (y-or-n-p "Really suspend? ")))))
=> (lambda nil (not (y-or-n-p "Really suspend? ")))
(setq suspend-resume-hook
(function (lambda () (message "Resumed!"))))
=> (lambda nil (message "Resumed!"))
(suspend-emacs "pwd")
=> nil
---------- Buffer: Minibuffer ----------
Really suspend? y
---------- Parent Shell ----------
lewis@slug[23] % /user/lewis/manual
lewis@slug[24] % fg
---------- Echo Area ----------
Resumed!
* Variable: suspend-hook
The value of the `suspend-hook' variable is either `nil', or a
function to be called (with no arguments) before Emacs is suspended
with `suspend-emacs'. Emacs won't be suspended unless the called
function returns `nil'.
* Variable: suspend-resume-hook
The value of the `suspend-resume-hook' variable is either `nil'
or is called as a function after resumption of an Emacs session
that was suspended with `suspend-emacs'.
▶1f◀
File: lispref Node: Operating System Environment, Prev: Getting out of Emacs, Up: Operating System Interface, Next: Terminal Input
Operating System Environment
============================
Emacs provides access to variables in the operating system environment
through various functions. These variables include the name of the
system, the user's UID, and so on.
* Variable: system-type
The value of this global variable is a symbol indicating the type
of operating system Emacs is operating on. Here is a table of the
symbols for the operating systems that Emacs can run on up to
version 18.51.
system-type
=> berkeley-unix
`berkeley-unix'
Berkeley BSD 4.1, 4.2, or 4.3
`hpux'
Hewlet Packard release 5.0
`silicon-graphics-unix'
Silicon Graphics Iris 3.5 or 3.6
`rtu'
RTU 3.0, ucb universe
`unisoft-unix'
UniSoft's UniPlus 5.0 or 5.2
`usg-unix-v'
AT&T's System V.0, System V Release 2.0, 2.2, or 3
`vax-vms'
VMS VMS 4.0, 4.2, 4.4
`xenix'
SCO Xenix 386 Release 2.2
We do not wish to add new symbols to make finer distinctions unless
it is absolutely necessary!
* Function: getenv VAR
This function returns the value of the environment variable VAR,
as a string.
(getenv "USER")
=> "lewis"
lewis@slug[10] % printenv
PATH=.:/user/lewis/bin:/usr/bin:/usr/local/bin
USER=lewis
TERM=ibmapa16
SHELL=/bin/csh
HOME=/user/lewis
* Function: user-login-name
This function returns the name under which the user is logged in.
This is based on the effective UID, not the real UID.
(user-login-name)
=> "lewis"
* Function: user-real-login-name
This function returns the name under which the user logged in.
This is based on the real UID, not the effective UID. This differs
from `user-login-name' only when running with the setuid bit.
* Function: user-full-name
This function returns the full name of the user.
(user-full-name)
=> "Bil Lewis"
* Function: user-real-uid
This function returns the real UID of the user.
(user-real-uid)
=> 19
* Function: user-uid
This function returns the effective UID of the user.
* Function: system-name
This function returns the name of the machine you are running
on.
(system-name)
=> "wheaties.ai.mit.edu"
* Function: current-time-string
This function returns the current time, as a humanly readable
string. The format of the string is unvarying; the number of
characters used for each part is always the same, so you can
reliably use `substring' to extract pieces of it.
(current-time-string)
=> "Wed Oct 14 22:21:05 1987"
* Function: load-average
This function returns the current 1 minute, 5 minute and 15
minute load averages in a list. The values are intergers that are
100 times the system load averages. (The load averages indicate
the number of processes trying to run.)
(load-average)
=> (68 48 35)
lewis@rocky[5] % uptime
11:55am up 1 day, 19:37, 3 users, load average: 0.69, 0.48, 0.36
* Variable: default-directory
The value of this buffer-local variable is the default directory
for the current buffer. This is always a string ending with a
slash on Unix systems.
default-directory
=> "/user/lewis/manual/"
* Function: setprv PRIVILEGE-NAME &optional SETP GETPRV
This function sets or resets a VMS privilege. The first arg is
the privilege name. The second argument, SETP, is `t' or `nil',
indicating whether the privilege is to be set or reset. Its
default is `nil'. The funtion returns `t' if success, `nil' if
not.
If the third argument, GETPRV, is non-`nil', `setprv' does not
change the privilege, but returns `t' or `nil', depending upon
whether the privilege is already enabled.
▶1f◀
File: lispref Node: Terminal Input, Prev: Operating System Environment, Up: Operating System Interface, Next: Terminal Output
Terminal Input
==============
The terminal input functions and variables keep track of or manipulate
terminal input.
Also, *Note Emacs Display::, for related functions.
* Function: recent-keys
This function returns a string comprising the last 100 characters
read from terminal. These are the last 100 characters read by
Emacs, no exceptions.
(recent-keys)
=> "erminal. These are the last 100 characters read by Emacs, no
exceptions.
@example
(recent-keys)^U^X^E"
* Variable: last-input-char
This global variable is set to the last terminal input character
that was typed (as part of a command or not).
In the example below, a character is read (the character `1',
ASCII `49'). It becomes the value of `last-input-char', while
`C-e' (from the `C-x C-e' command used to evaluate this expression)
remains the value of `last-command-char'.
(progn (print (read-char))
(print last-command-char)
last-input-char)
-| 49
-| 5
=> 49
* Command: open-dribble-file FILENAME
This function opens a "dribble file" named FILENAME. When a
dribble file is open, Emacs copies all keyboard input characters to
that file. (Inserted keyboard macros are not typed on the keyboard
so they are not copied.) The function is normally called only
interactively to debug Emacs input. It returns `nil'. You close
the dribble file by calling this function with an argument of
`nil'.
(open-dribble-file "$j/dribble")
=> nil
See also the `open-termscript' function (*Note Terminal Output::).
* Function: set-input-mode INTERRUPT FLOW
This function sets the mode for reading keyboard input. If
INTERRUPT is non-null, then Emacs uses input interrupts. If it is
`nil', then it uses CBREAK mode.
If FLOW is non-`nil', then Emacs uses XON/XOFF (`C-q', `C-s')
flow control for output to terminal. This has no effect except in
CBREAK mode.
The normal setting is system dependent.
*Note Flow Control::.
* Variable: meta-flag
This global variable tells Emacs if it should treat the 0200 bit
in keyboard input as the Meta bit.
* Variable: keyboard-translate-table
This global variable defines the translate table for keyboard
input. This allows the user to redefine the keys on the keyboard
without changing any command bindings.
If `keyboard-translate-table' is a string, then each character
read from the keyboard is looked up in this string and the
character in the string is used instead. If the string is of
length N, character codes N and up are untranslated.
In the example, `keyboard-translate-table' is set to a string of
128 characters. Then the characters `C-s' and `C-\' are swapped
and the characters `C-q' and `C-^' are swapped. After executing
this function, typing `C-\' behaves exactly like typing `C-s' and
vice versa. (*Note Flow Control:: for more information on this
subject.)
(defun evade-flow-control ()
"Replace ^S with ^\ and ^Q with ^^."
(interactive)
(let ((the-table (make-string 128 0)))
(let ((i 0))
(while (< i 128)
(aset the-table i i)
(setq i (1+ i))))
;; Swap ^S and ^\
(aset the-table ?\034 ?\^s)
(aset the-table ?\^s ?\034)
;; Swap ^Q and ^^
(aset the-table ?\036 ?\^q)
(aset the-table ?\^q ?\036)
(setq keyboard-translate-table the-table)))
▶1f◀