.SH "Saving Keystrokes"
.PP
All \*n commands are invoked through C functions calls.
This requires the user to type numerous parentheses, quotes,
and semi-colons.
Since the environment includes a full C preprocessor,
the user can define macros for the commands that are used
most frequently.
The example below defines a single-letter macro that can
be used to call the
.CO next
command.
@(E
	1 -> \*u#define N next() ;\*p
@)E
Now the user can enter
.CO N
(followed by a \*(RE) to execute the command.
.PP
Many \*n commands take a string as an argument.
The new
.I '#'
preprocessor operator (part of the ANSI draft standard)
can be used to avoid typing double quotes around these
arguments,
When a macro parameter is preceded by a
.I '#',
its text becomes quoted.
(See the appendix on the ANSI draft standard for more information.)
@(E
	1 -> \*u#define ld(file) load(#file) ;\*p
	2 -> \*uld(source.c)\*p
	Loading: source.c
	(int) 1
	3 ->
@)E
In the example above, the argument
.EX source.c
is quoted, so that the
.CO load
command is called with the argument
.EX """source.c""" .
.PP
Frequently entered commands can be placed in a file and executed
by including the file with the
.PD include
directive.
When a file is included, its contents are read just as if the user
had typed them from the keyboard.
Commands that should be executed at startup should be placed in
the startup file
.FN .saberinit .
.SH "Loading Files"
.PP
\*N does not yet recognize any comments in source code that
are meant to suppress
.SC lint 
warnings (e.g. /*VARARGS1*/ ).
However, it is possible to suppress warnings for any source code
that has been
.PD ifdef'd
for
.SC lint
by adding
.EX """-Dlint"""
to the 
.FL load_options
option.
@(E
	1 -> \*usetopt("load_options","-Dlint") ;\*p
@)E
.PP
To load up an entire project in \*n, it often helps to use an
existing makefile.  One method of using a makefile is to
add a dependency to create a script file that can be included
into \*n.
Here is a simple example of an addition to a makefile:
@(E
saber:
	rm -rf saber.ld
	echo "setopt(\e"load_options\e", \e"$(CFLAGS)\e");" > saber.ld
	echo "load( \e"$(SRCS)\e" ); " >> saber.ld
	echo "load( \e"-l$(LIB)\e" ); " >> saber.ld
	echo "Script 'saber.ld' for Saber-C is finished."
@)E
After the command `make saber'
has been executed, the script can be executed by including
it into the \*n environment
with the 
.PD include 
directive.
@(E
	1 -> \*u#include "saber.ld"\*p
@)E
.SH "Customizing for emacs in a windowing environment"
.PP
If the shell environment variable 
.SV EDITOR
is set to something other than 
.SC vi ,
\*n assumes the editor is of the 
.SC emacs 
variety.
Unfortunately \*n cannot distinguish between the many different dialects of 
.SC emacs ,
so it configures itself for
.SC gnuemacs .
.PP
The implication of this assumption is that the option that describes
the editor command sequence to move between one file and another 
is set to the gnuemacs-specific sequence of 
@(E
     "C-xC-fC-u0C-k%s\enM-<C-u%dC-nC-p"
@)E
Roughly translated, this reads:
visit-file, erase-default-name, %s, goto-top, %d, go-down, go-up-one.
\*N provides the filename and line number in place of the "%s" and "%d"
wherever they occur in this sequence.
.PP
Other versions of emacs have a slightly different sequence to switch
files and jump to a specific line.  In order to have \*n understand
your dialect of emacs, you must place the proper sequence in this
option.  This should be done in the system-wide
.FN .saberinit
file or in the user's
.FN .saberinit
file.
.PP
To provide command line switches for when emacs is invoked, set the
option
.FL edit_startup .
If a "+%d %s" is present, \*n will substitute the starting line number
and filename.  Note: if your version of emacs opens its own window,
you must tell it not to, usually with the -nx or -nw switch.

