You are on page 1of 13


Version 4



To simplify and automate editing tasks and to further customize the
editor, you can create macros. A macro is simply a series of commands
and/or keystrokes that is assigned to a key.

The simplest type of macro to create is a Keyboard Macro. A Keyboard
Macro is created by recording a series of keystrokes as they are typed
at the keyboard, and assigning that series to a key. For example, if
you wish to repeatedly enter a row of asterisks, three Returns, and then
a Tab, you could record this series and assign it to a single key, such
as <Shift F6>. Then, the next time you wish to enter a row of
asterisks, three Returns, and a Tab, you only have to press <Shift F6>.

More powerful macros can be created using the editor configuration
program (QCONFIG.EXE) and the QMac program (QMAC.EXE). These macros can
be permanently tied to the editor (using the configuration program), or
can be loaded as needed (using QMac). Using these facilities, you can
extend and customize the capabilities of the editor to suit your needs
and preferences. Refer to "Creating Macro Programs" in this file for
more information. (Note that QMac is included only in the registered


Creating Keyboard Macros

Once you have decided to assign a series of commands and keystrokes to a
single key, creating a Keyboard Macro is simply a matter of entering
this series while the editor "records" the macro.

To create a Keyboard Macro, follow these steps:

1. Position the text and cursor to where you wish to begin entering the
series of commands and keys. (You may want to practice your series
once or twice before actually recording the macro.)

2. Execute the MacroRecord <Ctrl M> command. An "R" appears on the
StatusLine to indicate MacroRecord mode is ON. The following message

Assign to what key: (<Enter> for scrap, <Esc> to cancel)

3. Enter the key to which you want to assign the series of commands and
keystrokes. This key must be a "configurable" key. If a key is
specified that has a command already assigned to it, the editor
prompts you to determine if you want to overlay that key assignment.

To assign the macro to a "scrap" or temporary area, simply
press <Enter>. The scrap area holds your macro until a new
macro is recorded (or you exit the editor).

4. Enter the series of commands and keystrokes to be assigned. Note
that the "R" still appears on the StatusLine.

5. Execute the MacroRecord <Ctrl M> command again. MacroRecord mode is
turned OFF, and the "R" no longer appears on the the StatusLine. The
macro is now created and assigned to the key specified in step 3.

Using Keyboard Macros

To use your Keyboard Macro, position the text and cursor properly and
press the key to which you assigned the macro (or use the ExecuteScrap
<Ctrl Enter> command to retrieve the last macro recorded). If the macro
does not behave as you expected, repeat the above steps. Your old macro
assignment is replaced with the new one.

� Tip: �
� Be aware of modes, especially Insert mode, when recording �
� and using macros. Macros recorded with Insert mode ON and �
� then used with Insert mode OFF (and vice-versa) may behave �
� very strangely. �

Saving and Reloading Keyboard Macros

Normally, macros created using this process are lost once the editor is
terminated. However, there is an easy method for saving your macros so
that they may be reloaded for use in any future editing session.

To save macros for future use, you must write them to a Keyboard Macro
file. (This file is in a special binary format, recognizable by the
editor, and should not be edited as a normal text file.) The name of
this file is specified by the user.

To save macros once they have been created, execute the MacroWrite
<Esc><M><W> command. The editor prompts with:

�Macro file to write: �
� �

Enter the name of the file (optionally including drive and/or path) to
contain your macros. All Keyboard Macros currently recorded (and/or
loaded) during the editing session are saved under the specified
filename. (However, macros assigned only to the scrap area, and not to
a specific key, cannot be saved.)
In a future editing session, when you wish to reuse your previously
defined macros, you need only reload the macro file. To do this,
execute the MacroRead <Esc><M><R> command. The editor prompts with:

�Macro file to read: �
� �

Enter the name of the previously saved macro file. Your macros are
reloaded. You may then use them in the same manner as before.

Example of a Keyboard Macro

To create a Keyboard Macro that inserts a formfeed character (ASCII 12)
at column one of the current cursor line, do the following:

1. Position the cursor in the text where you would like to insert the
formfeed character. Set Insert mode ON.

2. Execute MacroRecord <Ctrl M>.

3. Press <Alt F1> to assign the macro to this key.

4. Press the following series of keys:

<Home> (for the BegLine command)
<Ctrl P> (for the Literal command)
<Ctrl L> (a formfeed character)

5. Enter MacroRecord <Ctrl M>. The macro is now created and assigned to
the <Alt F1> key.

Now, when you press <Alt F1>, the cursor moves to column one and a
formfeed character is inserted, just as if you had typed it from the


As mentioned in Chapter 2, "Customizing the Editor" (in the file
TSEJR.DOC), the editor's configuration program (QCONFIG) allows you to
assign multiple commands and/or text to a key (or two-key). With this
facility, you can easily write simple programs using the editor's macro
language. These macros are included in the Keyboard Definition file
(QCONFIG.DAT), and then added to the editor program itself using the
configuration program. Each time the editor is loaded, these macros are
automatically available. For more information on including macros in the
Keyboard Definition file, refer to the "Keyboard Configuration" section
of Chapter 2 (in the file TSEJR.DOC).

To write a macro program, begin by editing your Keyboard Definition file
(QCONFIG.DAT, by default). Locate the key to which you wish to assign
your macro program. To the right of that key, specify any combination
of text strings and commands, each separated by a space. Text should be
enclosed in single or double quotes. Macros can span multiple lines, as
long as 2 simple rules are followed: the key name must begin in column
1, and all succeeding lines must begin in column 2 or greater.

Once the macro is written, save your Keyboard Definition file and exit
the editor. Then execute the configuration program (QCONFIG). Select
the "Keys" option to update the editor program. This assigns your macro
program to the specified key. Now when you run the editor, you can
execute your own custom macros by pressing the applicable key.

Note: The amount of space that is available for macros included in the
Keyboard Definition file is limited to about 2K.

� Example:

f1 EditFile 'help.dat' Return

Press <F1> and this macro loads the file "help.dat". Note that the
Return command is issued after the text. This is required to
terminate the prompt issued by the preceding EditFile command.

� Example:

@t GSave Dos 'tpc ' CurrentFilename Return

Press <Alt T> and this macro saves all files that have been changed,
and then invokes the TURBO PASCAL compiler using the current file.
(Note: There must be a space included within the quotes immediately
following "tpc".)

� Example:

@f1 EditFile 'errors.lst' Return
Dos 'tcc ' CurrentFilename ' >errors.lst' Return Return
EditFile 'errors.lst' Return

Press <Alt F1> and this macro runs the TURBO C compiler on the current
file, saves the results to a file called "errors.lst", and then loads
that file into another window after the compile is finished.

In general, any commonly used sequence of commands (or a useful but
complicated sequence of commands, for that matter) is a good candidate
for a macro.

We have received many helpful macro suggestions from users over the
years. Here is a short list of some of the more useful (and simple)

� A very useful command, GetPrev, copies a character from the line
immediately above the cursor line, onto the cursor line. Often it is
necessary to copy this character to several succeeding lines in the
same column. The GetPrev command, used in a macro, makes this
function easy. Assign this macro to the <Alt 4> key (for example) in
QCONFIG.DAT as follows:

@4 GetPrev CursorLeft CursorDown

� The AddLine and DelLine commands do not change the cursor position.
Many would prefer that the cursor move to column one when these
commands are executed. A solution is to change the QCONFIG.DAT file
as follows:

Default QCONFIG.DAT file:

f2 AddLine
^y DelLine

Customized QCONFIG.DAT file:

f2 AddLine BegLine
^y DelLine BegLine

� The CopyBlock and MoveBlock commands leave the copied or moved Block
marked. Many would prefer the Block to be unmarked. A solution is to
change the QCONFIG.DAT file as follows:

Default QCONFIG.DAT file:

@c CopyBlock
@m MoveBlock

Customized QCONFIG.DAT file:

@c CopyBlock UnmarkBlock
@m MoveBlock UnmarkBlock

� The DropAnchor command ends or extends a Block if executed after a
Block has been initially or entirely marked. Some editors have a
similar command, except that it acts as a toggle. That is, if you are
already marking a Block, and you execute DropAnchor again, the Block
is unmarked and marking begins again at the current cursor position.
To implement this behavior, change the QCONFIG.DAT file as follows:

Default QCONFIG.DAT file:

@a DropAnchor

Customized QCONFIG.DAT file:

@a UnmarkBlock DropAnchor

� This macro allows you to edit a sorted list of files in the current
directory. Assign this macro to the <Alt 5> key (for example) in
QCONFIG.DAT as follows:

@5 Dos "dir *.* | sort>filedir.tmp" Return Return
EditFile "filedir.tmp" Return
DelLine DelLine DelLine DelLine

Advanced Macro Programming

The following commands and features are intended for advanced macro
writers, to make certain macros easier to write. In the examples
provided, the key assignments indicated are suggested assignments only;
you can assign each macro to the key of your choice.

Macro Pause

The Pause command allows you to suspend execution of a macro, make
entries from the keyboard, and then continue execution of the macro.

To use the Pause command, place "Pause" at the appropriate position
within a macro in the QCONFIG.DAT file.

When you execute a macro containing a Pause command, its execution is
suspended when the Pause command is encountered. A "P" appears on the
StatusLine. At this point the User can enter text from the keyboard.
Press <Enter> to resume execution of the macro; press <Esc> to terminate
execution of the suspended macro entirely.

Please note that the <Enter> key entered from the keyboard to resume
execution of a suspended macro is "eaten" by the Pause command; or, in
other words, that <Enter> does not become part of the macro.

� For example, suppose you want to create a "find" command that always
searches forward, ignores case, and does not prompt for options. In
the QCONFIG.DAT file, assign to whatever key you desire (<F7> in this

f7 Find Pause Return 'i' Return

If you want to get really fancy, you could let <F7> be your
find-forward, and <Shift F7> be your find-backward:

#f7 Find Pause Return 'ib' Return

Using Paste within a Macro

It can be handy to use the Paste command in a macro. Following are some
examples of macros using the Paste command.

� With the FillBlock command, you can use the following macro to move a
Block, and blank fill the space used by the Block, instead of the text
closing in around the Block. The macro assumes a Block is already
marked. The Block is Cut to the system scrap buffer. You can then
insert the Block where you like by pressing the Paste key <Grey *>.
You now have a "copy with wipe" command!

f10 GotoBlockBeg Cut Paste FillBlock ' ' Return UnmarkBlock
� A macro to take the filename at the current cursor position and load
that file into the editor (assigned by default to <Ctrl ]>.):

^] AltWordSet MarkWord Copy EditFile Paste Return

This macro does the following:

AltWordSet - sets the proper word set for filenames
MarkWord - marks the filename at the current cursor position
Copy - copies the filename into the scrap buffer
EditFile - initiates the EditFile command
Paste - inserts the copied filename into the prompt box
Return - terminates the EditFile prompt
DefaultWordSet - restores the normal word set

� A macro to initiate a Find on the word at the current cursor position
(assigned by default to <Alt =>.):

@= MarkWord Copy Find Paste Return Return

This macro does the following:

MarkWord - marks the word at the current cursor position
Copy - copies the word into the scrap buffer
Find - initiates the Find command
Paste - inserts the copied word into the prompt box
Return - terminates the search string prompt box
Return - terminates the Find options prompt box

Repeating a Command within a Macro

Within macros, in order to repeat the previous command "n" times, the
following syntax can be used:

command n

Where "n" is a number between 1 and 32767. The immediately preceding
command is executed the number of times indicated. So, for example:

CursorDown 1

would move the cursor down one line (and is equivalent to just
CursorDown by itself).

CursorDown 10

would move the cursor down ten lines.

Conditional Logic for Macros

Several commands are available for conditional logic within macros:
Jump, JTrue, JFalse, MacroQuit, MacroQuitFalse, and MacroQuitTrue.
Placement of one of these commands in a macro following another command
allows for branching or looping during macro execution.

All commands set an internal result code of TRUE upon successful
execution, or FALSE if execution is unsuccessful or no action occurs.
These result codes can be used to determine different courses of action
during execution of a macro, based on the outcome of a particular

The Jump command makes an unconditional jump, regardless of the outcome
of the preceding command. The JTrue command makes a jump only when a
result code of TRUE is returned; JFalse makes a jump only for a result
code of FALSE.

The MacroQuit command unconditionally terminates a macro. The
MacroQuitTrue command terminates a macro only when a result code of
TRUE is returned; MacroQuitFalse terminate a macro only if a result code
of FALSE is returned.

Labels can be defined for branching, in the format "label:". The
maximum label length is 32 characters.

For example, here is a macro to delete the text from the cursor position
to the beginning of the line (assigned to the f10 key):

f10 begin:
Jump begin:

Special-Purpose Macro Commands

The editor includes a number of commands that are intended specifically
for use in macros.

One group of special macro commands is the Set commands. This group of
commands force the indicated mode or setting. If the setting was
already in that condition, they set the internal result code to FALSE;
otherwise, they set it to TRUE.

In many cases, macros can behave differently based on the currently set
editor modes. The following Set commands give you some control in
establishing the proper environment so that your macro always works as
intended. (Refer to the "Modes" section of Chapter 1, in the file
TSEJR.DOC, for more information about modes in the editor.)

Each of these Set commands set the indicated mode or feature ON. To set
the indicated mode or feature OFF, first turn the mode or feature ON by
issuing the Set command, and then turn it OFF by issuing the
corresponding Toggle command.

For example, to set Insert mode OFF, use the following code:

SetInsMode ToggleInsert
Or, to set file backups OFF, use the following code:

SetBakups ToggleBakups

� SetAutoIndentMode
Sets ON AutoIndent mode.

� SetBakups
Sets ON file Backup mode.

� SetBoxDraw
Sets ON Box Drawing mode.

� SetCenterFinds
Sets ON Find centering (to center found text, located by the Find,
FindReplace, or IncrementalSearch commands, vertically on the screen).

� SetCUAMarking
Sets ON CUA-Style Block Marking mode.

� SetEnterMatching
Sets ON EnterMatching mode.

� SetInsMode
Sets ON Insert mode.

� SetPrintAddFF
Sets ON the option to automatically send a formfeed character to the
printer at the end of each print operation.

� SetPromptForEAs
Sets ON the option to have the editor prompt for a .TYPE EA when
saving a file that does not already have Extended Attributes assigned.
(This command is available in the OS/2 version ONLY.)

� SetSortCaseInsensitive
Sets ON the option to have the editor perform case-insensitive (rather
than case-sensitive) sorts.

� SetSortDescending
Sets ON the option to have the editor perform sorting operations in
descending (rather than ascending) order.

� SetSwap
Sets ON the option to swap to EMS or Disk when the Shell and DOS
commands are executed. (This command is NOT available in the
memory-resident or OS/2 versions.)

� SetSyncScroll
Sets ON Synchronized Scrolling mode.

� SetTabsExpand
Sets ON Physical Tab Expansion mode.

� SetTabsOut
Sets ON Tabs Out mode.
� SetWordWrapMode
Sets ON WordWrap mode.

The Find command sounds a tone when the search string cannot be found.
This may be undesirable in a long-running macro, that may possibly
execute hundreds of find operations that fail. The following commands
allow you to selectively turn the sound ON and OFF.

� SetSoundOn
Sets Sound ON.

� SetSoundOff
Sets Sound OFF.

Most macros execute dozens of commands, possibly hundreds of times. This
can cause the screen to flash rapidly as the macro runs. Not only is
this somewhat disconcerting to watch, it actually slows down the speed
of some macros. The following commands allow you to temporarily suspend
or resume screen updating, while a macro is running.

� SetScreenOn
Turns Screen Updating ON.

� SetScreenOff
Turns Screen Updating OFF. You must turn screen updating back ON
before your macro prompts for input, or if there is output from the
macro that you want displayed on the screen.

Note: The editor AUTOMATICALLY turns Screen Updating back ON when the
macro is finished executing. Thus, it is not necessary to issue
the SetScreenOn command at the end of the macro.

Many times, it would be nice for a macro to force a few settings, do its
assigned task, and then restore the original settings. The following
commands allow you to do just that. Note that each time SaveSettings is
executed, the previous settings saved with SaveSettings are overwritten.

� SaveSettings
Saves the current settings of: Insert, AutoIndent, WordWrap, Sound,
and Screen Updating.

� RestoreSettings
Restores the saved settings for the settings indicated in

The following commands set the editor's result code to TRUE or FALSE
based on the condition being tested. These commands make certain types
of macro tests easy and reliable.

� isBegLine
Returns TRUE if the cursor is at column 1; otherwise, FALSE is
� isCurrChar
Returns TRUE if the character at the cursor position in the file is
the same as that specified by the character immediately following the
isCurrChar command.

� isCursorInBlock
Returns TRUE if the cursor is inside a marked Block; otherwise, FALSE
is returned.

� isEndLine
Returns TRUE if the cursor is past the last non-white character on the
current line; otherwise, FALSE is returned (including when the cursor
is on an empty line).

� isEmptyLine
Returns TRUE if the current line is empty or contains only white
space; otherwise, FALSE is returned.

� isFirstLine
Returns TRUE if the cursor is on the first line of the currently
edited file; otherwise, FALSE is returned.

� isLastLine
Returns TRUE if the cursor is on the last line of the currently edited
file; otherwise, FALSE is returned.

� isWord
Returns TRUE if the character at the cursor position in the file is in
the current word set. See the AltWordSet command for more information
on word sets.

In order to tie a few of these concepts together, we present a simple
macro to delete all the blank lines in a marked Block. The cursor
should be at the beginning of the Block when the macro is invoked.

#f9 SetScreenOff * turn off screen for speed
begin: isCursorInBlock MacroQuitFalse * exit if not in Block
isEmptyLine JFalse next: * skip if not empty line
isLastLine JTrue last: * handle last line
DelLine Jump begin: * delete empty lines
next: CursorDown JTrue begin: * try next line
MacroQuit *
last: DelLine * delete the last line
* that's all, folks!

The Main Macro

The editor has a provision for a special-purpose macro that is
automatically executed at editor startup. In a Keyboard Definition
file, assigning a macro to the key "main" causes that macro to be
executed whenever the editor is initially invoked.

� Example:

main MacroRead "c:\macros\mymacs.qm" Return
This causes a macro file named "mymacs.qm" to be loaded into the
editor, every time the editor is started. (Note that the "key" the
macro is assigned to is "main".)


The editor offers a feature that allows you to load and/or execute
macros from the DOS command line.

To load a macro from the DOS command line, type "-l" (this is a dash
character and the letter "l") immediately followed by a macro filename
when you execute the editor. For example, from the DOS prompt type:

q <filename to edit> -l<macro filename>

To execute a macro from the DOS command line, type "-e" immediately
followed by a macro filename when you execute the editor. The editor
then automatically executes the first macro in the macro file after the
file to be edited has been loaded. For example, from the DOS prompt

q <filename to edit> -e<macro filename>

Following are additional notes about the use of Startup macros.

� The macro file to be loaded and/or executed must be created using
either the MacroWrite <Esc><M><W> command or QMac.

� A macro file to be executed (-e) is limited to a maximum size of 500

� A "/" character can be used instead of the "-" character, as "/l" and

� You MUST supply a filename to be edited on the DOS command line to use
this feature.

� When using the execute ("-e") option, only the first macro in the
macro file is executed. This macro is executed only after the file to
be edited has been loaded.

� You can load one macro and execute another macro at the same time.
For example, from the DOS prompt:

q <filename to edit> -e<macro filename> -l<macro filename>

Following is an example of using Startup macros.

Suppose you have created two macro files, called first.mac and
second.mac. Now you want to load a file for editing called work.tmp,
and at the same time, load the macro file called first.mac and execute
the macro file called second.mac. From the DOS command line, enter:

q work.tmp -lfirst.mac -esecond.mac