File: //usr/local/ssl/share/doc/slrn-0.9.8.1pl1/README.macros
-*- mode: text; mode: fold; -*-
The purpose of this note is to provide some instructions on extending the
newsreader in its macro language.
{{{ Introduction
When slrn is started, it reads the .slrnrc user initialization file.
That file may contain one or more `interpret' commands causing the
newsreader to load the specified S-Lang scripts, e.g.,
interpret ".slrn.sl"
interpret "src/slrn/macros/search.sl"
Each script must obey the syntax of the S-Lang language. See the
slang documentation from www.s-lang.org more more information about
the syntax.
Several pre-written macros are included in the slrn distribution in
the macro subdirectory and many more are available from various pages all
over the web.
}}}
---------------------------------------------------------------------------
Defining Key Macros {{{
---------------------------------------------------------------------------
Although one is able to bind keys to specific functions via lines
of the form
setkey group "refresh_groups" "G"
in the .slrnrc file, it is not possible to defined more
complicated actions in this manner. However, macros can be
defined by using a S-Lang script. For example, the
`refresh_groups' internal function refreshes the newsgroups but it
does not cause the cursor to move to the top of the newsgroup
list. On the other hand, the internal function `bob' moves to the
top of the list but it does not refresh the groups. One can
define a S-Lang function to perform both actions:
define refresh_groups_bob ()
{
call ("refresh_groups");
call ("bob");
}
and bind it to a key:
definekey ("refresh_groups_bob", "g", "group");
The `definekey' function takes 3 arguments:
function to execute
keybinding
keymap name ("article" or "group")
Here is another macro that may be used in article mode. It
performs a regular expression search for subjects.
variable Last_Search_Str = "";
define re_subject_search_forward ()
{
variable str;
ERROR_BLOCK
{
() = header_up (1);
}
!if (header_down (1)) return;
str = read_mini ("Subject re-search fwd", Last_Search_Str, "");
!if (strlen (str))
return;
Last_Search_Str = str;
!if (re_fsearch_subject (str))
error ("Not found.");
}
To bind it to, e.g., `s' in the article keymap, use:
definekey ("re_subject_search_forward", "s", "article");
Some slrn keyboard functions require a ``prefix argument''.
Many people find the use of prefix arguments somewhat strange.
For example, instead of typing `ESC 1 ESC p' to reconstruct a thread,
one can simply use the function:
define my_recreate_thread ()
{
set_prefix_argument (1);
call ("get_parent_header");
}
Here is a function that pipes the current article to a
command called `most' (a paging program similar to more/less):
define pipe_to_most ()
{
pipe_article ("most");
}
definekey ("pipe_to_most", "&", "article");
Here it has been bound to the `&' key. Most likely one will want
to pipe the article to a shell script for further processing.
Some of the built-in keyboard functions will prompt for a
string. For example, in article mode, pressing the `:' key will
prompt for an filename. The function `set_input_string' may be
used to provide a response to such a prompt, e.g.,
% The `:' command will prompt for a filename.
set_input_string ("/tmp/decoded");
call ("decode");
For functions that prompt for a single character, such as
Do you really want to quit? [Y]es No
a similar intrinsic function, set_input_chars, may be used to
provide the answer.
}}}
---------------------------------------------------------------------------
Hooks and Command Reference
---------------------------------------------------------------------------
The above examples used ``intrinsic'' functions such as `call',
`set_integer_variable', etc. A description of all slrn intrinsic functions
that are available via the interpreter is included in slrnfuns.txt. A
comprehensive list of all hooks into the newsreader is now also included in
that file.
The S-Lang language includes many other intrinsics, such as `strcmp' and
`is_substr' which are described in the file slangfun.txt that comes with
S-Lang itself.