source: commands.c @ b363d83

barnowl_perlaimdebianrelease-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since b363d83 was b363d83, checked in by Nelson Elhage <nelhage@mit.edu>, 17 years ago
Adding a -s switch to change the location of the config dir (~/.owl)
  • Property mode set to 100644
File size: 77.1 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <unistd.h>
5#include "owl.h"
6
7static const char fileIdent[] = "$Id$";
8
9/* fn is "char *foo(int argc, char **argv, char *buff)" */
10#define OWLCMD_ARGS(name, fn, ctx, summary, usage, description) \
11        { name, summary, usage, description, ctx, \
12          NULL, fn, NULL, NULL, NULL, NULL, NULL }
13
14/* fn is "void foo(void)" */
15#define OWLCMD_VOID(name, fn, ctx, summary, usage, description) \
16        { name, summary, usage, description, ctx, \
17          NULL, NULL, fn, NULL, NULL, NULL, NULL }
18
19/* fn is "void foo(int)" */
20#define OWLCMD_INT(name, fn, ctx, summary, usage, description) \
21        { name, summary, usage, description, ctx, \
22          NULL, NULL, NULL, fn, NULL, NULL, NULL }
23
24#define OWLCMD_ALIAS(name, actualname) \
25        { name, OWL_CMD_ALIAS_SUMMARY_PREFIX actualname, "", "", OWL_CTX_ANY, \
26          actualname, NULL, NULL, NULL, NULL, NULL, NULL }
27
28/* fn is "char *foo(void *ctx, int argc, char **argv, char *buff)" */
29#define OWLCMD_ARGS_CTX(name, fn, ctx, summary, usage, description) \
30        { name, summary, usage, description, ctx, \
31          NULL, NULL, NULL, NULL, ((char*(*)(void*,int,char**,char*))fn), NULL, NULL }
32
33/* fn is "void foo(void)" */
34#define OWLCMD_VOID_CTX(name, fn, ctx, summary, usage, description) \
35        { name, summary, usage, description, ctx, \
36          NULL, NULL, NULL, NULL, NULL, ((void(*)(void*))(fn)), NULL }
37
38/* fn is "void foo(int)" */
39#define OWLCMD_INT_CTX(name, fn, ctx, summary, usage, description) \
40        { name, summary, usage, description, ctx, \
41          NULL, NULL, NULL, NULL, NULL, NULL, ((void(*)(void*,int))fn) }
42
43
44owl_cmd commands_to_init[]
45  = {
46  OWLCMD_ARGS("zlog", owl_command_zlog, OWL_CTX_ANY,
47              "send a login or logout notification",
48              "zlog in [tty]\nzlog out",
49              "zlog in will send a login notification, zlog out will send a\n"
50              "logout notification.  By default a login notification is sent\n"
51              "when owl is started and a logout notification is sent when owl\n"
52              "is exited.  This behavior can be changed with the 'startuplogin'\n"
53              "and 'shudownlogout' variables.  If a tty is specified for zlog in\n"
54              "then the owl variable 'tty' will be set to that string, causing\n"
55              "it to be used as the zephyr location tty.\n"),
56
57  OWLCMD_VOID("quit", owl_command_quit, OWL_CTX_ANY,
58              "exit owl",
59              "",
60              "Exit owl and run any shutdown activities."),
61  OWLCMD_ALIAS("exit", "quit"),
62  OWLCMD_ALIAS("q",    "quit"),
63
64  OWLCMD_ARGS("term", owl_command_term, OWL_CTX_ANY,
65              "control the terminal",
66              "term raise\n"
67              "term deiconify\n",
68              ""),
69
70  OWLCMD_VOID("nop", owl_command_nop, OWL_CTX_ANY,
71              "do nothing",
72              "",
73              ""),
74 
75  OWLCMD_ARGS("start-command", owl_command_start_command, OWL_CTX_INTERACTIVE,
76              "prompts the user to enter a command",
77              "start-command [initial-value]",
78              "Initializes the command field to initial-value."),
79
80  OWLCMD_ARGS("start-question", owl_command_start_question, OWL_CTX_INTERACTIVE,
81              "prompts the user to enter a response to some question",
82              "start-command <question>",
83              ""),
84
85  OWLCMD_ARGS("start-password", owl_command_start_password, OWL_CTX_INTERACTIVE,
86              "prompts the user to enter a password",
87              "start-password <question>",
88              ""),
89
90  OWLCMD_ARGS("alias", owl_command_alias, OWL_CTX_ANY,
91              "creates a command alias",
92              "alias <new_command> <old_command>",
93              "Creates a command alias from new_command to old_command.\n"
94              "Any arguments passed to <new_command> will be appended to\n"
95              "<old_command> before it is executed.\n"),
96
97  OWLCMD_ARGS("bindkey", owl_command_bindkey, OWL_CTX_ANY,
98              "creates a binding in a keymap",
99              "bindkey <keymap> <keyseq> command <command>",
100              "Binds a key sequence to a command within a keymap.\n"
101              "Use 'show keymaps' to see the existing keymaps.\n"
102              "Key sequences may be things like M-C-t or NPAGE.\n"),
103
104  OWLCMD_ARGS("style", owl_command_style, OWL_CTX_ANY,
105              "creates a new style",
106              "style <name> perl <function_name>",
107              "Creates a new style for formatting messages.\n"
108              "A style named <name> will be created that will\n"
109              "format messages using the perl function <function_name>.\n\n"
110              "SEE ALSO: show styles, view -s, filter -s\n"),
111
112  OWLCMD_ARGS("zwrite", owl_command_zwrite, OWL_CTX_INTERACTIVE,
113              "send a zephyr",
114              "zwrite [-n] [-C] [-c class] [-i instance] [-r realm] [-O opcde] [<user> ...] [-m <message...>]",
115              "Zwrite send a zephyr to the one or more users specified.\n\n"
116              "The following options are available:\n\n"
117              "-m    Specifies a message to send without prompting.\n"
118              "      Note that this does not yet log an outgoing message.\n"
119              "      This must be the last argument.\n\n"
120              "-n    Do not send a ping message.\n\n"
121              "-C    If the message is sent to more than one user include a\n"
122              "      \"cc:\" line in the text\n\n"
123              "-c class\n"
124              "      Send to the specified zephyr class\n\n"
125              "-i instance\n"
126              "      Send to the specified zephyr instance\n\n"
127              "-r realm\n"
128              "      Send to a foreign realm\n"
129              "-O opcode\n"
130              "      Send to the specified opcode\n"),
131
132  OWLCMD_ARGS("aimwrite", owl_command_aimwrite, OWL_CTX_INTERACTIVE,
133              "send an AIM message",
134              "aimzwrite <user>",
135              "Send an aim message to a user.\n"),
136
137  OWLCMD_ARGS("loopwrite", owl_command_loopwrite, OWL_CTX_INTERACTIVE,
138              "send a loopback message",
139              "loopwrite",
140              "Send a local message.\n"),
141
142  OWLCMD_ARGS("zcrypt", owl_command_zcrypt, OWL_CTX_INTERACTIVE,
143              "send an encrypted zephyr",
144              "zcrypt [-n] [-C] [-c class] [-i instance] [-r realm] [-O opcde] [-m <message...>]\n",
145              "Behaves like zwrite but uses encryption.  Not for use with\n"
146              "personal messages\n"),
147 
148  OWLCMD_ARGS("reply", owl_command_reply,  OWL_CTX_INTERACTIVE,
149              "reply to the current message",
150              "reply [-e] [ sender | all | zaway ]",
151              "If -e is specified, the zwrite command line is presented to\n"
152              "allow editing.\n\n"
153              "If 'sender' is specified, reply to the sender.\n\n"
154              "If 'all' or no args are specified, reply publically to the\n"
155              "same class/instance for non-personal messages and to the\n"
156              "sender for personal messages.\n\n"
157              "If 'zaway' is specified, replies with a zaway message.\n\n"),
158
159  OWLCMD_ARGS("set", owl_command_set, OWL_CTX_ANY,
160              "set a variable value",
161              "set [-q] [<variable>] [<value>]\n"
162              "set",
163              "Set the named variable to the specified value.  If no\n"
164              "arguments are given, print the value of all variables.\n"
165              "If the value is unspecified and the variable is a boolean, it will be\n"
166              "set to 'on'.  If -q is used, set is silent and does not print a\n"
167              "message.\n"),
168
169  OWLCMD_ARGS("unset", owl_command_unset, OWL_CTX_ANY,
170              "unset a boolean variable value",
171              "set [-q] <variable>\n"
172              "set",
173              "Set the named boolean variable to off.\n"
174              "If -q is specified, is silent and doesn't print a message.\n"),
175
176  OWLCMD_ARGS("print", owl_command_print, OWL_CTX_ANY,
177              "print a variable value",
178              "print <variable>\n"
179              "print",
180              "Print the value of the named variable.  If no arugments\n"
181              "are used print the value of all variables.\n"),
182
183  OWLCMD_ARGS("startup", owl_command_startup, OWL_CTX_ANY,
184              "run a command and set it to be run at every Owl startup",
185              "startup <commands> ...",
186              "Everything on the command line after the startup command\n"
187              "is executed as a normal owl command and is also placed in\n"
188              "a file so that the command is executed every time owl\n"
189              "is started"),
190
191  OWLCMD_ARGS("unstartup", owl_command_unstartup, OWL_CTX_ANY,
192              "remove a command from the list of those to be run at Owl startup",
193              "unstartup <commands> ...",
194              ""),
195
196  OWLCMD_VOID("version", owl_command_version, OWL_CTX_ANY,
197              "print the version of the running owl", "", ""),
198
199  OWLCMD_ARGS("subscribe", owl_command_subscribe, OWL_CTX_ANY,
200              "subscribe to a zephyr class, instance, recipient",
201              "subscribe [-t] <class> <instance> [recipient]",
202              "Subscribe the specified class and instance.  If the recipient\n"
203              "is not listed on the command line it defaults\n"
204              "to * (the wildcard recipient).  If the -t option is present\n"
205              "the subscription will only be temporary, i.e., it will not\n"
206              "be written to the subscription file and will therefore not\n"
207              "be present the next time owl is started.\n"),
208  OWLCMD_ALIAS("sub", "subscribe"),
209
210  OWLCMD_ARGS("unsubscribe", owl_command_unsubscribe, OWL_CTX_ANY,
211              "unsubscribe from a zephyr class, instance, recipient",
212              "unsubscribe [-t] <class> <instance> [recipient]",
213              "Unsubscribe from the specified class and instance.  If the\n"
214              "recipient is not listed on the command line it defaults\n"
215              "to * (the wildcard recipient).  If the -t option is present\n"
216              "the unsubscription will only be temporary, i.e., it will not\n"
217              "be updated in the subscription file and will therefore not\n"
218              "be in effect the next time owl is started.\n"),
219  OWLCMD_ALIAS("unsub", "unsubscribe"),
220
221  OWLCMD_VOID("unsuball", owl_command_unsuball, OWL_CTX_ANY,
222              "unsubscribe from all zephyrs", "", ""),
223 
224  OWLCMD_VOID("getsubs", owl_command_getsubs, OWL_CTX_ANY,
225              "print all current subscriptions",
226              "getsubs",
227              "getsubs retrieves the current subscriptions from the server\n"
228              "and displays them.\n"),
229
230  OWLCMD_ARGS("dump", owl_command_dump, OWL_CTX_ANY,
231              "dump messages to a file",
232              "dump <filename>",
233              "Dump messages in current view to the named file."),
234
235  OWLCMD_ARGS("source", owl_command_source, OWL_CTX_ANY,
236              "execute owl commands from a file",
237              "source <filename>",
238              "Execute the owl commands in <filename>.\n"),
239
240  OWLCMD_ARGS("aim", owl_command_aim, OWL_CTX_INTERACTIVE,
241              "AIM specific commands",
242              "aim search <email>",
243              ""),
244
245  OWLCMD_ARGS("addbuddy", owl_command_addbuddy, OWL_CTX_INTERACTIVE,
246              "add a buddy to a buddylist",
247              "addbuddy <protocol> <screenname>",
248              "Add the named buddy to your buddylist.  <protocol> can be aim or zephyr\n"),
249
250  OWLCMD_ARGS("delbuddy", owl_command_delbuddy, OWL_CTX_INTERACTIVE,
251              "delete a buddy from a buddylist",
252              "delbuddy <protocol> <screenname>",
253              "Delete the named buddy to your buddylist.  <protocol< can be aim or zephyr\n"),
254
255  OWLCMD_ARGS("join", owl_command_join, OWL_CTX_INTERACTIVE,
256              "join a chat group",
257              "join aim <groupname> [exchange]",
258              "Join the AIM chatroom with 'groupname'.\n"),
259
260  OWLCMD_ARGS("smartzpunt", owl_command_smartzpunt, OWL_CTX_INTERACTIVE,
261              "creates a zpunt based on the current message",
262              "smartzpunt [-i | --instance]",
263              "Starts a zpunt command based on the current message's class\n"
264              "(and instance if -i is specified).\n"),
265
266  OWLCMD_ARGS("zpunt", owl_command_zpunt, OWL_CTX_ANY,
267              "suppress a given zephyr triplet",
268              "zpunt <class> <instance> [recipient]\n"
269              "zpunt <instance>",
270              "The zpunt command will supress message to the specified\n"
271              "zephyr triplet.  In the second usage messages as supressed\n"
272              "for class MESSAGE and the named instance.\n\n"
273              "SEE ALSO:  zunpunt, show zpunts\n"),
274
275  OWLCMD_ARGS("zunpunt", owl_command_zunpunt, OWL_CTX_ANY,
276              "undo a previous zpunt",
277              "zunpunt <class> <instance> [recipient]\n"
278              "zunpunt <instance>",
279              "The zunpunt command will allow messages that were previosly\n"
280              "suppressed to be received again.\n\n"
281              "SEE ALSO:  zpunt, show zpunts\n"),
282
283  OWLCMD_VOID("info", owl_command_info, OWL_CTX_INTERACTIVE,
284              "display detailed information about the current message",
285              "", ""),
286 
287  OWLCMD_ARGS("help", owl_command_help, OWL_CTX_INTERACTIVE,
288              "display help on using owl",
289              "help [command]", ""),
290
291  OWLCMD_ARGS("zlist", owl_command_zlist, OWL_CTX_INTERACTIVE,
292              "List users logged in",
293              "znol [-f file]",
294              "Print a znol-style listing of users logged in"),
295
296  OWLCMD_ARGS("alist", owl_command_alist, OWL_CTX_INTERACTIVE,
297              "List AIM users logged in",
298              "alist",
299              "Print a listing of AIM users logged in"),
300
301  OWLCMD_ARGS("blist", owl_command_blist, OWL_CTX_INTERACTIVE,
302              "List all buddies logged in",
303              "blist",
304              "Print a listing of buddies logged in, regardless of protocol."),
305
306  OWLCMD_ARGS("toggle-oneline", owl_command_toggleoneline, OWL_CTX_INTERACTIVE,
307              "Toggle the style between oneline and the default style",
308              "toggle-oneline",
309              ""),
310
311  OWLCMD_VOID("recv:shiftleft", owl_command_shift_left, OWL_CTX_INTERACTIVE,
312              "scrolls receive window to the left", "", ""),
313
314  OWLCMD_VOID("recv:shiftright", owl_command_shift_right, OWL_CTX_INTERACTIVE,
315              "scrolls receive window to the left", "", ""),
316
317  OWLCMD_VOID("recv:pagedown", owl_function_mainwin_pagedown, 
318              OWL_CTX_INTERACTIVE,
319              "scrolls down by a page", "", ""),
320
321  OWLCMD_VOID("recv:pageup", owl_function_mainwin_pageup, OWL_CTX_INTERACTIVE,
322              "scrolls up by a page", "", ""),
323
324  OWLCMD_INT ("recv:scroll", owl_function_page_curmsg, OWL_CTX_INTERACTIVE,
325              "scrolls current message up or down", 
326              "recv:scroll <numlines>", 
327              "Scrolls the current message up or down by <numlines>.\n"
328              "Scrolls up if <numlines> is negative, else scrolls down.\n"),
329
330  OWLCMD_ARGS("next", owl_command_next, OWL_CTX_INTERACTIVE,
331              "move the pointer to the next message",
332              "recv:next [ --filter <name> ] [ --skip-deleted ] [ --last-if-none ]\n"
333              "          [ --smart-filter | --smart-filter-instance ]",
334              "Moves the pointer to the next message in the current view.\n"
335              "If --filter is specified, will only consider messages in\n"
336              "the filter <name>.\n"
337              "If --smart-filter or --smart-filter-instance is specified,\n"
338              "goes to the next message that is similar to the current message.\n"
339              "If --skip-deleted is specified, deleted messages will\n"
340              "be skipped.\n"
341              "If --last-if-none is specified, will stop at last message\n"
342              "in the view if no other suitable messages are found.\n"),
343  OWLCMD_ALIAS("recv:next", "next"),
344
345  OWLCMD_ARGS("prev", owl_command_prev, OWL_CTX_INTERACTIVE,
346              "move the pointer to the previous message",
347              "recv:prev [ --filter <name> ] [ --skip-deleted ] [ --first-if-none ]\n"
348              "          [ --smart-filter | --smart-filter-instance ]",
349              "Moves the pointer to the next message in the current view.\n"
350              "If --filter is specified, will only consider messages in\n"
351              "the filter <name>.\n"
352              "If --smart-filter or --smart-filter-instance is specified,\n"
353              "goes to the previous message that is similar to the current message.\n"
354              "If --skip-deleted is specified, deleted messages will\n"
355              "be skipped.\n"
356              "If --first-if-none is specified, will stop at first message\n"
357              "in the view if no other suitable messages are found.\n"),
358  OWLCMD_ALIAS("recv:prev", "prev"),
359
360  OWLCMD_ALIAS("recv:next-notdel", "recv:next --skip-deleted --last-if-none"),
361  OWLCMD_ALIAS("next-notdel",      "recv:next --skip-deleted --last-if-none"),
362
363  OWLCMD_ALIAS("recv:prev-notdel", "recv:prev --skip-deleted --first-if-none"),
364  OWLCMD_ALIAS("prev-notdel",      "recv:prev --skip-deleted --first-if-none"),
365
366  OWLCMD_ALIAS("recv:next-personal", "recv:next --filter personal"),
367
368  OWLCMD_ALIAS("recv:prev-personal", "recv:prev --filter personal"),
369
370  OWLCMD_VOID("first", owl_command_first, OWL_CTX_INTERACTIVE,
371              "move the pointer to the first message", "", ""),
372  OWLCMD_ALIAS("recv:first", "first"),
373
374  OWLCMD_VOID("last", owl_command_last, OWL_CTX_INTERACTIVE,
375              "move the pointer to the last message", "", 
376              "Moves the pointer to the last message in the view.\n"
377              "If we are already at the last message in the view,\n"
378              "blanks the screen and moves just past the end of the view\n"
379              "so that new messages will appear starting at the top\n"
380              "of the screen.\n"),
381  OWLCMD_ALIAS("recv:last", "last"),
382
383  OWLCMD_VOID("expunge", owl_command_expunge, OWL_CTX_INTERACTIVE,
384              "remove all messages marked for deletion", "", ""),
385
386  OWLCMD_VOID("resize", owl_command_resize, OWL_CTX_ANY,
387              "resize the window to the current screen size", "", ""),
388
389  OWLCMD_VOID("redisplay", owl_command_redisplay, OWL_CTX_ANY,
390              "redraw the entire window", "", ""),
391
392  OWLCMD_VOID("suspend", owl_command_suspend, OWL_CTX_ANY,
393              "suspend owl", "", ""),
394
395  OWLCMD_ARGS("echo", owl_command_echo, OWL_CTX_ANY,
396              "pops up a message in popup window",
397              "echo [args .. ]\n\n", ""),
398
399  OWLCMD_ARGS("exec", owl_command_exec, OWL_CTX_ANY,
400              "run a command from the shell",
401              "exec [args .. ]", ""),
402
403  OWLCMD_ARGS("aexec", owl_command_aexec, OWL_CTX_INTERACTIVE,
404              "run a command from the shell and display in an admin message",
405              "aexec [args .. ]", ""),
406
407  OWLCMD_ARGS("pexec", owl_command_pexec, OWL_CTX_INTERACTIVE,
408              "run a command from the shell and display in a popup window",
409              "pexec [args .. ]", ""),
410
411  OWLCMD_ARGS("perl", owl_command_perl, OWL_CTX_ANY,
412              "run a perl expression",
413              "perl [args .. ]", ""),
414
415  OWLCMD_ARGS("aperl", owl_command_aperl, OWL_CTX_INTERACTIVE,
416              "run a perl expression and display in an admin message",
417              "aperl [args .. ]", ""),
418
419  OWLCMD_ARGS("pperl", owl_command_pperl, OWL_CTX_INTERACTIVE,
420              "run a perl expression and display in a popup window",
421              "pperl [args .. ]", ""),
422
423  OWLCMD_ARGS("multi", owl_command_multi, OWL_CTX_ANY,
424              "runs multiple ;-separated commands",
425              "multi <command1> ( ; <command2> )*\n",
426              "Runs multiple semicolon-separated commands in order.\n"
427              "Note quoting isn't supported here yet.\n"
428              "If you want to do something fancy, use perl.\n"),
429
430  OWLCMD_ARGS("(", owl_command_multi, OWL_CTX_ANY,
431              "runs multiple ;-separated commands",
432              "'(' <command1> ( ; <command2> )* ')'\n",
433              "Runs multiple semicolon-separated commands in order.\n"
434              "You must have a space before the final ')'\n"
435              "Note quoting isn't supported here yet.\n"
436              "If you want to do something fancy, use perl.\n"),
437
438  OWLCMD_VOID("pop-message", owl_command_pop_message, OWL_CTX_RECWIN,
439              "pops up a message in a window", "", ""),
440
441  OWLCMD_VOID("openurl", owl_command_openurl, OWL_CTX_INTERACTIVE,
442              "opens up a URL from the current message",
443              "", 
444              "Uses the 'webbrowser' variable to determine\n"
445              "which browser to use.  Currently, 'netscape'\n"
446              "and 'galeon' are supported.\n"),
447
448  OWLCMD_ARGS("zaway", owl_command_zaway, OWL_CTX_INTERACTIVE,
449              "Set, enable or disable zephyr away message",
450              "zaway [ on | off | toggle ]\n"
451              "zaway <message>",
452              "Turn on or off a zaway message.  If 'message' is\n"
453              "specified turn on zaway with that message, otherwise\n"
454              "use the default.\n"),
455
456  OWLCMD_ARGS("aaway", owl_command_aaway, OWL_CTX_INTERACTIVE,
457              "Set, enable or disable AIM away message",
458              "aaway [ on | off | toggle ]\n"
459              "aaway <message>",
460              "Turn on or off the AIM away message.  If 'message' is\n"
461              "specified turn on aaway with that message, otherwise\n"
462              "use the default.\n"),
463
464  OWLCMD_ARGS("away", owl_command_away, OWL_CTX_INTERACTIVE,
465              "Set, enable or disable both AIM and zephyr away messages",
466              "away [ on | off | toggle ]\n"
467              "away <message>",
468              "Turn on or off the AIM and zephyr away message.  If\n"
469              "'message' is specified turn them on with that message,\n"
470              "otherwise use the default.\n"
471              "\n"
472              "This command really just runs the 'aaway' and 'zaway'\n"
473              "commands together\n"
474              "\n"
475              "SEE ALSO: aaway, zaway"),
476
477  OWLCMD_ARGS("load-subs", owl_command_loadsubs, OWL_CTX_ANY,
478              "load subscriptions from a file",
479              "load-subs <file>\n", ""),
480
481  OWLCMD_ARGS("loadsubs", owl_command_loadsubs, OWL_CTX_ANY,
482              "load subscriptions from a file",
483              "loadsubs <file>\n", ""),
484
485  OWLCMD_ARGS("loadloginsubs", owl_command_loadloginsubs, OWL_CTX_ANY,
486              "load login subscriptions from a file",
487              "loadloginsubs <file>\n",
488              "The file should contain a list of usernames, one per line."),
489
490  OWLCMD_VOID("about", owl_command_about, OWL_CTX_INTERACTIVE,
491              "print information about owl", "", ""),
492
493  OWLCMD_VOID("status", owl_command_status, OWL_CTX_ANY,
494              "print status information about the running owl", "", ""),
495 
496  OWLCMD_ARGS("zlocate", owl_command_zlocate, OWL_CTX_INTERACTIVE,
497              "locate a user",
498              "zlocate [-d] <user> ...", 
499              "Performs a zlocate on one ore more users and puts the result\n"
500              "int a popwin.  If -d is specified, does not authenticate\n"
501              "the lookup request.\n"),
502 
503  OWLCMD_ARGS("filter", owl_command_filter, OWL_CTX_ANY,
504              "create a message filter",
505              "filter <name> [ -c fgcolor ] [ -b bgcolor ] [ <expression> ... ]",
506              "The filter command creates a filter with the specified name,\n"
507              "or if one already exists it is replaced.  Example filter\n"
508              "syntax would be:\n\n"
509              "     filter myfilter -c red ( class ^foobar$ ) or ( class ^quux$ and instance ^bar$ )\n\n"
510              "Valid matching fields are:\n"
511              "    sender     -  sender\n"
512              "    recipient  -  recipient\n"
513              "    class      -  zephyr class name\n"
514              "    instance   -  zephyr instance name\n"
515              "    opcode     -  zephyr opcode\n"
516              "    realm      -  zephyr realm\n"
517              "    body       -  message body\n"
518              "    hostname   -  hostname of sending host\n"
519              "    type       -  message type (zephyr, aim, admin)\n"
520              "    direction  -  either 'in' 'out' or 'none'\n"
521              "    login      -  either 'login' 'logout' or 'none'\n"
522              "Also you may match on the validity of another filter:\n"
523              "    filter <filtername>\n"
524              "Also you may pass the message to a perl function returning 0 or 1,\n"
525              "where 1 indicates that the function matches the filter:\n"
526              "    perl <subname>\n"
527              "Valid operators are:\n"
528              "    and\n"
529              "    or\n"
530              "    not\n"
531              "And additionally you may use the static values:\n"
532              "    true\n"
533              "    false\n"
534              "Spaces must be present before and after parenthesis.  If the\n"
535              "optional color arguments are used they specifies the colors that\n"
536              "messages matching this filter should be displayed in.\n\n"
537              "SEE ALSO: view, viewclass, viewuser\n"),
538
539  OWLCMD_ARGS("colorview", owl_command_colorview, OWL_CTX_INTERACTIVE,
540              "change the colors on the current filter",
541              "colorview <fgcolor> [<bgcolor>]",
542              "The colors of messages in the current filter will be changed\n"
543              "to <fgcolor>,<bgcolor>.  Use the 'show colors' command for a list\n"
544              "of valid colors.\n\n"
545              "SEE ALSO: 'show colors'\n"),
546
547  OWLCMD_ARGS("colorclass", owl_command_colorclass, OWL_CTX_INTERACTIVE,
548              "create a filter to color messages of the given class name",
549              "colorclass <class> <fgcolor> [<bgcolor>]",
550              "A filter will be created to color messages in <class>"
551              "in <fgcolor>,<bgcolor>.  Use the 'show colors' command for a list\n"
552              "of valid colors.\n\n"
553              "SEE ALSO: 'show colors'\n"),
554
555  OWLCMD_ARGS("view", owl_command_view, OWL_CTX_INTERACTIVE,
556              "view messages matching a filter",
557              "view [<viewname>] [-f <filter> | --home | -r ] [-s <style>]\n"
558              "view <filter>\n"
559              "view -d <expression>\n"
560              "view --home",
561              "The view command sets information associated with a particular view,\n"
562              "such as view's filter or style.  In the first general usage listed\n"
563              "above <viewname> is the name of the view to be changed.  If not\n"
564              "specified the default view 'main' will be used.  A filter can be set\n"
565              "for the view by listing a named filter after the -f argument.  If\n"
566              "the --home argument is used the filter will be set to the filter named\n"
567              "by the\n 'view_home' variable.  The style can be set by listing the\n"
568              "name style after the -s argument.\n"
569              "\n"
570              "The other usages listed above are abbreivated forms that simply set\n"
571              "the filter of the current view. The -d option allows you to write a\n"
572              "filter expression that will be dynamically created by owl and then\n"
573              "applied as the view's filter\n"
574              "SEE ALSO: filter, viewclass, viewuser\n"),
575
576  OWLCMD_ARGS("smartnarrow", owl_command_smartnarrow, OWL_CTX_INTERACTIVE,
577              "view only messages similar to the current message",
578              "smartnarrow [-i | --instance]",
579              "If the curmsg is a personal message narrow\n"
580              "   to the converstaion with that user.\n"
581              "If the curmsg is a class message, instance foo, recip *\n"
582              "   message, narrow to the class, inst.\n"
583              "If the curmsg is a class message then narrow\n"
584              "    to the class.\n"
585              "If the curmsg is a class message and '-i' is specied\n"
586              "    then narrow to the class, instance\n"),
587
588  OWLCMD_ARGS("smartfilter", owl_command_smartfilter, OWL_CTX_INTERACTIVE,
589              "returns the name of a filter based on the current message",
590              "smartfilter [-i | --instance]",
591              "If the curmsg is a personal message, the filter is\n"
592              "   the converstaion with that user.\n"
593              "If the curmsg is a class message, instance foo, recip *\n"
594              "   message, the filter is the class, inst.\n"
595              "If the curmsg is a class message, the filter is that class.\n"
596              "If the curmsg is a class message and '-i' is specied\n"
597              "    the filter is that <class,instance> pair\n"),
598
599  OWLCMD_ARGS("viewclass", owl_command_viewclass, OWL_CTX_INTERACTIVE,
600              "view messages matching a particular class",
601              "viewclass <class>",
602              "The viewclass command will automatically create a filter\n"
603              "matching the specified class and switch the current view\n"
604              "to it.\n\n"
605              "SEE ALSO: filter, view, viewuser\n"),
606  OWLCMD_ALIAS("vc", "viewclass"),
607
608  OWLCMD_ARGS("viewuser", owl_command_viewuser, OWL_CTX_INTERACTIVE,
609              "view messages matching a particular user",
610              "viewuser <user>",
611              "The viewuser command will automatically create a filter\n"
612              "matching the specified user and switch the current\n"
613              "view to it.\n\n"
614              "SEE ALSO: filter, view, viewclass\n"),
615  OWLCMD_ALIAS("vu", "viewuser"),
616
617  OWLCMD_ARGS("show", owl_command_show, OWL_CTX_INTERACTIVE,
618              "show information",
619              "show colors\n"
620              "show commands\n"
621              "show command <command>\n"
622              "show errors\n"
623              "show filters\n"
624              "show filter <filter>\n"
625              "show keymaps\n"
626              "show keymap <keymap>\n"
627              "show license\n"
628              "show startup\n"
629              "show status\n"
630              "show styles\n"
631              "show subscriptions / show subs\n"
632              "show terminal\n"
633              "show variables\n"
634              "show variable <variable>\n"
635              "show version\n"
636              "show view [<view>]\n"
637              "show zpunts\n",
638
639              "Show colors will display a list of valid colors for the\n"
640              "     terminal."
641              "Show filters will list the names of all filters.\n"
642              "Show filter <filter> will show the definition of a particular\n"
643              "     filter.\n\n"
644              "Show startup will display the custom startup config\n\n"
645              "Show zpunts will show the active zpunt filters.\n\n"
646              "Show keymaps will list the names of all keymaps.\n"
647              "Show keymap <keymap> will show the key bindings in a keymap.\n\n"
648              "Show commands will list the names of all keymaps.\n"
649              "Show command <command> will provide information about a command.\n\n"
650              "Show styles will list the names of all styles available\n"
651              "for formatting messages.\n\n"
652              "Show variables will list the names of all variables.\n\n"
653              "Show errors will show a list of errors ecountered by Owl.\n\n"
654              "SEE ALSO: filter, view, alias, bindkey, help\n"),
655 
656  OWLCMD_ARGS("delete", owl_command_delete, OWL_CTX_INTERACTIVE,
657              "mark a message for deletion",
658              "delete [ -id msgid ] [ --no-move ]\n"
659              "delete view\n"
660              "delete trash",
661              "If no message id is specified the current message is marked\n"
662              "for deletion.  Otherwise the message with the given message\n"
663              "id is marked for deltion.\n"
664              "If '--no-move' is specified, don't move after deletion.\n"
665              "If 'trash' is specified, deletes all trash/auto messages\n"
666              "in the current view.\n"
667              "If 'view' is specified, deletes all messages in the\n"
668              "current view.\n"),
669  OWLCMD_ALIAS("del", "delete"),
670
671  OWLCMD_ARGS("undelete", owl_command_undelete, OWL_CTX_INTERACTIVE,
672              "unmark a message for deletion",
673              "undelete [ -id msgid ] [ --no-move ]\n"
674              "undelete view",
675              "If no message id is specified the current message is\n"
676              "unmarked for deletion.  Otherwise the message with the\n"
677              "given message id is marked for undeltion.\n"
678              "If '--no-move' is specified, don't move after deletion.\n"
679              "If 'view' is specified, undeletes all messages\n"
680              "in the current view.\n"),
681  OWLCMD_ALIAS("undel", "undelete"),
682
683  OWLCMD_VOID("beep", owl_command_beep, OWL_CTX_ANY,
684              "ring the terminal bell",
685              "beep",
686              "Beep will ring the terminal bell.\n"
687              "If the variable 'bell' has been\n"
688              "set to 'off' this command does nothing.\n"),
689
690  OWLCMD_ARGS("debug", owl_command_debug, OWL_CTX_ANY,
691              "prints a message into the debug log",
692              "debug <message>", ""),
693
694  OWLCMD_ARGS("getview", owl_command_getview, OWL_CTX_INTERACTIVE,
695              "returns the name of the filter for the current view",
696              "", ""),
697
698  OWLCMD_ARGS("getvar", owl_command_getvar, OWL_CTX_INTERACTIVE,
699              "returns the value of a variable",
700              "getvar <varname>", ""),
701
702  OWLCMD_ARGS("getstyle", owl_command_getstyle, OWL_CTX_INTERACTIVE,
703              "returns the name of the style for the current view",
704              "", ""),
705
706  OWLCMD_ARGS("search", owl_command_search, OWL_CTX_INTERACTIVE,
707              "search messages for a particular string",
708              "search [-r] [<string>]",
709              "The search command will find messages that contain the\n"
710              "specified string and move the cursor there.  If no string\n"
711              "argument is supplied then the previous one is used.  By\n"
712              "default searches are done fowards, if -r is used the search\n"
713              "is performed backwards"),
714
715  OWLCMD_ARGS("setsearch", owl_command_setsearch, OWL_CTX_INTERACTIVE,
716              "set the search highlight string without searching",
717              "setsearch <string>",
718              "The setsearch command highlights all occurences of its\n"
719          "argument and makes it the default argument for future\n"
720          "search commands, but does not move the cursor.  With\n"
721          "no argument, it makes search inactive."),
722
723  OWLCMD_ARGS("aimlogin", owl_command_aimlogin, OWL_CTX_ANY,
724              "login to an AIM account",
725              "aimlogin <screenname> [<password>]\n",
726              ""),
727
728  OWLCMD_ARGS("aimlogout", owl_command_aimlogout, OWL_CTX_ANY,
729              "logout from AIM",
730              "aimlogout\n",
731              ""),
732
733  OWLCMD_ARGS("error", owl_command_error, OWL_CTX_ANY,
734              "Display an error message",
735              "error <message>",
736              ""),
737
738  OWLCMD_ARGS("message", owl_command_message, OWL_CTX_ANY,
739              "Display an informatative message",
740              "message <message>",
741              ""),
742
743  OWLCMD_VOID("yes", owl_command_yes, OWL_CTX_RECV,
744              "Answer yes to a question",
745              "yes",
746              ""),
747
748  OWLCMD_VOID("no", owl_command_no, OWL_CTX_RECV,
749              "Answer no to a question",
750              "no",
751              ""),
752
753  /****************************************************************/
754  /************************* EDIT-SPECIFIC ************************/
755  /****************************************************************/
756
757  OWLCMD_VOID_CTX("edit:move-next-word", owl_editwin_move_to_nextword, 
758                  OWL_CTX_EDIT,
759                  "moves cursor forward a word",
760                  "", ""),
761
762  OWLCMD_VOID_CTX("edit:move-prev-word", owl_editwin_move_to_previousword, 
763                  OWL_CTX_EDIT,
764                  "moves cursor backwards a word",
765                  "", ""),
766
767  OWLCMD_VOID_CTX("edit:move-to-buffer-start", owl_editwin_move_to_top,
768                  OWL_CTX_EDIT,
769                  "moves cursor to the top left (start) of the buffer",
770                  "", ""),
771
772  OWLCMD_VOID_CTX("edit:move-to-buffer-end", owl_editwin_move_to_end, 
773                  OWL_CTX_EDIT,
774                  "moves cursor to the bottom right (end) of the buffer",
775                  "", ""),
776
777  OWLCMD_VOID_CTX("edit:move-to-line-end", owl_editwin_move_to_line_end, 
778                  OWL_CTX_EDIT,
779                  "moves cursor to the end of the line",
780                  "", ""),
781
782  OWLCMD_VOID_CTX("edit:move-to-line-start", owl_editwin_move_to_line_start, 
783                  OWL_CTX_EDIT,
784                  "moves cursor to the beginning of the line",
785                  "", ""),
786
787  OWLCMD_VOID_CTX("edit:move-left", owl_editwin_key_left, 
788                  OWL_CTX_EDIT,
789                  "moves the cursor left by a character",
790                  "", ""),
791
792  OWLCMD_VOID_CTX("edit:move-right", owl_editwin_key_right,
793                  OWL_CTX_EDIT,
794                  "moves the cursor right by a character",
795                  "", ""),
796
797  OWLCMD_VOID_CTX("edit:delete-next-word", owl_editwin_delete_nextword,
798                  OWL_CTX_EDIT,
799                  "deletes the word to the right of the cursor",
800                  "", ""),
801
802  OWLCMD_VOID_CTX("edit:delete-prev-word", owl_editwin_delete_previousword,
803                  OWL_CTX_EDIT,
804                  "deletes the word to the left of the cursor",
805                  "", ""),
806
807  OWLCMD_VOID_CTX("edit:delete-prev-char", owl_editwin_backspace,
808                  OWL_CTX_EDIT,
809                  "deletes the character to the left of the cursor",
810                  "", ""),
811
812  OWLCMD_VOID_CTX("edit:delete-next-char", owl_editwin_delete_char, 
813                  OWL_CTX_EDIT,
814                  "deletes the character to the right of the cursor",
815                  "", ""),
816
817  OWLCMD_VOID_CTX("edit:delete-to-line-end", owl_editwin_delete_to_endofline,
818                  OWL_CTX_EDIT,
819                  "deletes from the cursor to the end of the line",
820                  "", ""),
821
822  OWLCMD_VOID_CTX("edit:delete-all", owl_editwin_clear, 
823                  OWL_CTX_EDIT,
824                  "deletes all of the contents of the buffer",
825                  "", ""),
826
827  OWLCMD_VOID_CTX("edit:transpose-chars", owl_editwin_transpose_chars,
828                  OWL_CTX_EDIT,
829                  "Interchange characters around point, moving forward one character.",
830                  "", ""),
831
832  OWLCMD_VOID_CTX("edit:fill-paragraph", owl_editwin_fill_paragraph, 
833                  OWL_CTX_EDIT,
834                  "fills the current paragraph to line-wrap well",
835                  "", ""),
836
837  OWLCMD_VOID_CTX("edit:recenter", owl_editwin_recenter, 
838                  OWL_CTX_EDIT,
839                  "recenters the buffer",
840                  "", ""),
841
842  OWLCMD_ARGS_CTX("edit:insert-text", owl_command_edit_insert_text, 
843                  OWL_CTX_EDIT,
844                  "inserts text into the buffer",
845                  "edit:insert-text <text>", ""),
846
847  OWLCMD_VOID_CTX("edit:cancel", owl_command_edit_cancel, 
848                  OWL_CTX_EDIT,
849                  "cancels the current command",
850                  "", ""),
851
852  OWLCMD_VOID_CTX("edit:history-next", owl_command_edit_history_next, 
853                  OWL_CTX_EDIT,
854                  "replaces the text with the previous history",
855                  "", ""),
856
857  OWLCMD_VOID_CTX("edit:history-prev", owl_command_edit_history_prev, 
858                  OWL_CTX_EDIT,
859                  "replaces the text with the previous history",
860                  "", ""),
861
862  OWLCMD_VOID_CTX("editline:done", owl_command_editline_done, 
863                  OWL_CTX_EDITLINE,
864                  "completes the command (eg, executes command being composed)",
865                  "", ""),
866
867  OWLCMD_VOID_CTX("editresponse:done", owl_command_editresponse_done, 
868                  OWL_CTX_EDITRESPONSE,
869                  "completes the response to a question",
870                  "", ""),
871
872  OWLCMD_VOID_CTX("editmulti:move-up-line", owl_editwin_key_up, 
873                  OWL_CTX_EDITMULTI,
874                  "moves the cursor up one line",
875                  "", ""),
876
877  OWLCMD_VOID_CTX("editmulti:move-down-line", owl_editwin_key_down, 
878                  OWL_CTX_EDITMULTI,
879                  "moves the cursor down one line",
880                  "", ""),
881
882  OWLCMD_VOID_CTX("editmulti:done", owl_command_editmulti_done, 
883                  OWL_CTX_EDITMULTI,
884                  "completes the command (eg, sends message being composed)",
885                  "", ""),
886
887  OWLCMD_VOID_CTX("editmulti:done-or-delete", owl_command_editmulti_done_or_delete, 
888                  OWL_CTX_EDITMULTI,
889                  "completes the command, but only if at end of message",
890                  "", 
891                  "If only whitespace is to the right of the cursor,\n"
892                  "runs 'editmulti:done'.\n"\
893                  "Otherwise runs 'edit:delete-next-char'\n"),
894
895  /****************************************************************/
896  /********************** POPLESS-SPECIFIC ************************/
897  /****************************************************************/
898
899  OWLCMD_VOID_CTX("popless:scroll-down-page", owl_viewwin_pagedown, 
900                  OWL_CTX_POPLESS,
901                  "scrolls down one page",
902                  "", ""),
903
904  OWLCMD_VOID_CTX("popless:scroll-down-line", owl_viewwin_linedown, 
905                  OWL_CTX_POPLESS,
906                  "scrolls down one line",
907                  "", ""),
908
909  OWLCMD_VOID_CTX("popless:scroll-up-page", owl_viewwin_pageup, 
910                  OWL_CTX_POPLESS,
911                  "scrolls up one page",
912                  "", ""),
913
914  OWLCMD_VOID_CTX("popless:scroll-up-line", owl_viewwin_lineup, 
915                  OWL_CTX_POPLESS,
916                  "scrolls up one line",
917                  "", ""),
918
919  OWLCMD_VOID_CTX("popless:scroll-to-top", owl_viewwin_top, 
920                  OWL_CTX_POPLESS,
921                  "scrolls to the top of the buffer",
922                  "", ""),
923
924  OWLCMD_VOID_CTX("popless:scroll-to-bottom", owl_viewwin_bottom, 
925                  OWL_CTX_POPLESS,
926                  "scrolls to the bottom of the buffer",
927                  "", ""),
928
929  OWLCMD_INT_CTX ("popless:scroll-right", owl_viewwin_right, 
930                  OWL_CTX_POPLESS,
931                  "scrolls right in the buffer",
932                  "popless:scroll-right <num-chars>", ""),
933
934  OWLCMD_INT_CTX ("popless:scroll-left", owl_viewwin_left, 
935                  OWL_CTX_POPLESS,
936                  "scrolls left in the buffer",
937                  "popless:scroll-left <num-chars>", ""),
938
939  OWLCMD_VOID_CTX("popless:quit", owl_command_popless_quit, 
940                  OWL_CTX_POPLESS,
941                  "exits the popless window",
942                  "", ""),
943
944  /* This line MUST be last! */
945  { NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
946
947};
948
949void owl_command_info()
950{
951  owl_function_info();
952}
953
954void owl_command_nop()
955{
956}
957
958char *owl_command_help(int argc, char **argv, char *buff)
959{
960  if (argc!=2) {
961    owl_help();
962    return NULL;
963  }
964 
965  owl_function_help_for_command(argv[1]);
966  return NULL;
967}
968
969char *owl_command_zlist(int argc, char **argv, char *buff)
970{
971  int elapsed=0, timesort=0;
972  char *file=NULL;
973
974  argc--;
975  argv++;
976  while (argc) {
977    if (!strcmp(argv[0], "-e")) {
978      elapsed=1;
979      argc--;
980      argv++;
981    } else if (!strcmp(argv[0], "-t")) {
982      timesort=1;
983      argc--;
984      argv++;
985    } else if (!strcmp(argv[0], "-f")) {
986      if (argc==1) {
987        owl_function_makemsg("zlist: -f needs an argument");
988        return(NULL);
989      }
990      file=argv[1];
991      argc-=2;
992      argv+=2;
993    } else {
994      owl_function_makemsg("zlist: unknown argument");
995      return(NULL);
996    }
997  }
998  owl_function_buddylist(0, 1, file);
999  return(NULL);
1000}
1001
1002char *owl_command_alist()
1003{
1004  owl_function_buddylist(1, 0, NULL);
1005  return(NULL);
1006}
1007
1008char *owl_command_blist()
1009{
1010  owl_function_buddylist(1, 1, NULL);
1011  return(NULL);
1012}
1013
1014char *owl_command_toggleoneline()
1015{
1016  owl_function_toggleoneline();
1017  return(NULL);
1018}
1019
1020void owl_command_about()
1021{
1022  owl_function_about();
1023}
1024
1025void owl_command_version()
1026{
1027  char buff[1024];
1028
1029  sprintf(buff, "Owl version %s", OWL_VERSION_STRING);
1030  owl_function_makemsg(buff);
1031}
1032
1033char *owl_command_aim(int argc, char **argv, char *buff)
1034{
1035  if (argc<2) {
1036    owl_function_makemsg("not enough arguments to aim command");
1037    return(NULL);
1038  }
1039
1040  if (!strcmp(argv[1], "search")) {
1041    if (argc!=3) {
1042      owl_function_makemsg("not enough arguments to aim search command");
1043      return(NULL);
1044    }
1045    owl_aim_search(argv[2]);
1046  } else {
1047    owl_function_makemsg("unknown subcommand '%s' for aim command", argv[1]);
1048    return(NULL);
1049  }
1050  return(NULL);
1051}
1052
1053char *owl_command_addbuddy(int argc, char **argv, char *buff)
1054{
1055  if (argc!=3) {
1056    owl_function_makemsg("usage: addbuddy <protocol> <buddyname>");
1057    return(NULL);
1058  }
1059
1060  if (!strcasecmp(argv[1], "aim")) {
1061    if (!owl_global_is_aimloggedin(&g)) {
1062      owl_function_makemsg("addbuddy: You must be logged into aim to use this command.");
1063      return(NULL);
1064    }
1065    /*
1066    owl_function_makemsg("This function is not yet operational.  Stay tuned.");
1067    return(NULL);
1068    */
1069    owl_aim_addbuddy(argv[2]);
1070    owl_function_makemsg("%s added as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g));
1071  } else if (!strcasecmp(argv[1], "zephyr")) {
1072    owl_zephyr_addbuddy(argv[2]);
1073    owl_function_makemsg("%s added as zephyr buddy", argv[2]);
1074  } else {
1075    owl_function_makemsg("addbuddy: currently the only supported protocols are 'zephyr' and 'aim'");
1076  }
1077
1078  return(NULL);
1079}
1080
1081char *owl_command_delbuddy(int argc, char **argv, char *buff)
1082{
1083  if (argc!=3) {
1084    owl_function_makemsg("usage: delbuddy <protocol> <buddyname>");
1085    return(NULL);
1086  }
1087
1088  if (!strcasecmp(argv[1], "aim")) {
1089    if (!owl_global_is_aimloggedin(&g)) {
1090      owl_function_makemsg("delbuddy: You must be logged into aim to use this command.");
1091      return(NULL);
1092    }
1093    owl_aim_delbuddy(argv[2]);
1094    owl_function_makemsg("%s deleted as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g));
1095  } else if (!strcasecmp(argv[1], "zephyr")) {
1096    owl_zephyr_delbuddy(argv[2]);
1097    owl_function_makemsg("%s deleted as zephyr buddy", argv[2]);
1098  } else {
1099    owl_function_makemsg("delbuddy: currently the only supported protocols are 'zephyr' and 'aim'");
1100  }
1101
1102  return(NULL);
1103}
1104
1105char *owl_command_join(int argc, char **argv, char *buff)
1106{
1107  if (argc!=3 && argc!=4) {
1108    owl_function_makemsg("usage: join <protocol> <buddyname> [exchange]");
1109    return(NULL);
1110  }
1111
1112  if (!strcasecmp(argv[1], "aim")) {
1113    if (!owl_global_is_aimloggedin(&g)) {
1114      owl_function_makemsg("join aim: You must be logged into aim to use this command.");
1115      return(NULL);
1116    }
1117    if (argc==3) {
1118      owl_aim_chat_join(argv[2], 4);
1119    } else {
1120      owl_aim_chat_join(argv[2], atoi(argv[3]));
1121    }
1122    /* owl_function_makemsg("%s deleted as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g)); */
1123  } else {
1124    owl_function_makemsg("join: currently the only supported protocol is 'aim'");
1125  }
1126  return(NULL);
1127}
1128
1129char *owl_command_startup(int argc, char **argv, char *buff)
1130{
1131  char *ptr;
1132
1133  if (argc<2) {
1134    owl_function_makemsg("usage: %s <commands> ...", argv[0]);
1135    return(NULL);
1136  }
1137
1138  ptr=strchr(buff, ' ');
1139  if (!ptr) {
1140    owl_function_makemsg("Parse error finding command for startup");
1141    return(NULL);
1142  }
1143
1144  owl_function_command(ptr+1);
1145  owl_function_addstartup(ptr+1);
1146
1147  return(NULL);
1148}
1149
1150char *owl_command_unstartup(int argc, char **argv, char *buff)
1151{
1152  char *ptr;
1153
1154  if (argc<2) {
1155    owl_function_makemsg("usage: %s <commands> ...", argv[0]);
1156    return(NULL);
1157  }
1158
1159  ptr=strchr(buff, ' ');
1160  if (!ptr) {
1161    owl_function_makemsg("Parse error finding command for unstartup");
1162    return(NULL);
1163  }
1164
1165  owl_function_delstartup(ptr+1);
1166
1167  return(NULL);
1168}
1169
1170char *owl_command_dump(int argc, char **argv, char *buff)
1171{
1172  char *filename;
1173 
1174  if (argc!=2) {
1175    owl_function_makemsg("usage: dump <filename>");
1176    return(NULL);
1177  }
1178  filename=owl_util_makepath(argv[1]);
1179  owl_function_dump(filename);
1180  owl_free(filename);
1181  return(NULL);
1182}
1183
1184char *owl_command_source(int argc, char **argv, char *buff)
1185{
1186  if (argc!=2) {
1187    owl_function_makemsg("usage: source <filename>");
1188    return(NULL);
1189  }
1190
1191  owl_function_source(argv[1]);
1192  return(NULL);
1193}
1194
1195char *owl_command_next(int argc, char **argv, char *buff)
1196{
1197  char *filter=NULL;
1198  int skip_deleted=0, last_if_none=0;
1199  while (argc>1) {
1200    if (argc>=1 && !strcmp(argv[1], "--skip-deleted")) {
1201      skip_deleted=1;
1202      argc-=1; argv+=1; 
1203    } else if (argc>=1 && !strcmp(argv[1], "--last-if-none")) {
1204      last_if_none=1;
1205      argc-=1; argv+=1; 
1206    } else if (argc>=2 && !strcmp(argv[1], "--filter")) {
1207      filter = owl_strdup(argv[2]);
1208      argc-=2; argv+=2; 
1209    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter")) {
1210      filter = owl_function_smartfilter(0);
1211      argc-=2; argv+=2; 
1212    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter-instance")) {
1213      filter = owl_function_smartfilter(1);
1214      argc-=2; argv+=2; 
1215    } else {
1216      owl_function_makemsg("Invalid arguments to command 'next'.");
1217      return(NULL);
1218    }
1219  }
1220  owl_function_nextmsg_full(filter, skip_deleted, last_if_none);
1221  if (filter) owl_free(filter);
1222  return(NULL);
1223}
1224
1225char *owl_command_prev(int argc, char **argv, char *buff)
1226{
1227  char *filter=NULL;
1228  int skip_deleted=0, first_if_none=0;
1229  while (argc>1) {
1230    if (argc>=1 && !strcmp(argv[1], "--skip-deleted")) {
1231      skip_deleted=1;
1232      argc-=1; argv+=1; 
1233    } else if (argc>=1 && !strcmp(argv[1], "--first-if-none")) {
1234      first_if_none=1;
1235      argc-=1; argv+=1; 
1236    } else if (argc>=2 && !strcmp(argv[1], "--filter")) {
1237      filter = owl_strdup(argv[2]);
1238      argc-=2; argv+=2; 
1239    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter")) {
1240      filter = owl_function_smartfilter(0);
1241      argc-=2; argv+=2; 
1242    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter-instance")) {
1243      filter = owl_function_smartfilter(1);
1244      argc-=2; argv+=2; 
1245   } else {
1246      owl_function_makemsg("Invalid arguments to command 'prev'.");
1247      return(NULL);
1248    }
1249  }
1250  owl_function_prevmsg_full(filter, skip_deleted, first_if_none);
1251  if (filter) owl_free(filter);
1252  return(NULL);
1253}
1254
1255char *owl_command_smartnarrow(int argc, char **argv, char *buff)
1256{
1257  char *filtname = NULL;
1258
1259  if (argc == 1) {
1260    filtname = owl_function_smartfilter(0);
1261  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
1262    filtname = owl_function_smartfilter(1);
1263  } else {
1264    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
1265  }
1266  if (filtname) {
1267    owl_function_change_currentview_filter(filtname);
1268    owl_free(filtname);
1269  }
1270  return NULL;
1271}
1272
1273char *owl_command_smartfilter(int argc, char **argv, char *buff)
1274{
1275  char *filtname = NULL;
1276
1277  if (argc == 1) {
1278    filtname = owl_function_smartfilter(0);
1279  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
1280    filtname = owl_function_smartfilter(1);
1281  } else {
1282    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
1283  }
1284  return filtname;
1285}
1286
1287void owl_command_expunge()
1288{
1289  owl_function_expunge();
1290}
1291
1292void owl_command_first()
1293{
1294  owl_global_set_rightshift(&g, 0);
1295  owl_function_firstmsg();
1296}
1297
1298void owl_command_last()
1299{
1300  owl_function_lastmsg();
1301}
1302
1303void owl_command_resize()
1304{
1305  owl_function_resize();
1306}
1307
1308void owl_command_redisplay()
1309{
1310  owl_function_full_redisplay();
1311  owl_global_set_needrefresh(&g);
1312}
1313
1314void owl_command_shift_right()
1315{
1316  owl_function_shift_right();
1317}
1318
1319void owl_command_shift_left()
1320{
1321  owl_function_shift_left();
1322}
1323
1324void owl_command_unsuball()
1325{
1326  owl_function_unsuball();
1327}
1328
1329char *owl_command_loadsubs(int argc, char **argv, char *buff)
1330{
1331  if (argc == 2) {
1332    owl_function_loadsubs(argv[1]);
1333  } else if (argc == 1) {
1334    owl_function_loadsubs(NULL);
1335  } else {
1336    owl_function_makemsg("Wrong number of arguments for load-subs.");
1337    return(NULL);
1338  }
1339  return(NULL);
1340}
1341
1342
1343char *owl_command_loadloginsubs(int argc, char **argv, char *buff)
1344{
1345  if (argc == 2) {
1346    owl_function_loadloginsubs(argv[1]);
1347  } else if (argc == 1) {
1348    owl_function_loadloginsubs(NULL);
1349  } else {
1350    owl_function_makemsg("Wrong number of arguments for load-subs.");
1351    return(NULL);
1352  }
1353  return(NULL);
1354}
1355
1356void owl_command_suspend()
1357{
1358  owl_function_suspend();
1359}
1360
1361char *owl_command_start_command(int argc, char **argv, char *buff)
1362{
1363  buff = skiptokens(buff, 1);
1364  owl_function_start_command(buff);
1365  return(NULL);
1366}
1367
1368char *owl_command_start_question(int argc, char **argv, char *buff)
1369{
1370  buff = skiptokens(buff, 1);
1371  owl_function_start_question(buff);
1372  return(NULL);
1373}
1374
1375char *owl_command_start_password(int argc, char **argv, char *buff)
1376{
1377  buff = skiptokens(buff, 1);
1378  owl_function_start_password(buff);
1379  return(NULL);
1380}
1381
1382char *owl_command_zaway(int argc, char **argv, char *buff)
1383{
1384  if ((argc==1) ||
1385      ((argc==2) && !strcmp(argv[1], "on"))) {
1386    owl_global_set_zaway_msg(&g, owl_global_get_zaway_msg_default(&g));
1387    owl_function_zaway_on();
1388    return NULL;
1389  }
1390
1391  if (argc==2 && !strcmp(argv[1], "off")) {
1392    owl_function_zaway_off();
1393    return NULL;
1394  }
1395
1396  if (argc==2 && !strcmp(argv[1], "toggle")) {
1397    owl_function_zaway_toggle();
1398    return NULL;
1399  }
1400
1401  buff = skiptokens(buff, 1);
1402  owl_global_set_zaway_msg(&g, buff);
1403  owl_function_zaway_on();
1404  return NULL;
1405}
1406
1407
1408char *owl_command_aaway(int argc, char **argv, char *buff)
1409{
1410  if ((argc==1) ||
1411      ((argc==2) && !strcmp(argv[1], "on"))) {
1412    owl_global_set_aaway_msg(&g, owl_global_get_aaway_msg_default(&g));
1413    owl_function_aaway_on();
1414    return NULL;
1415  }
1416
1417  if (argc==2 && !strcmp(argv[1], "off")) {
1418    owl_function_aaway_off();
1419    return NULL;
1420  }
1421
1422  if (argc==2 && !strcmp(argv[1], "toggle")) {
1423    owl_function_aaway_toggle();
1424    return NULL;
1425  }
1426
1427  buff = skiptokens(buff, 1);
1428  owl_global_set_aaway_msg(&g, buff);
1429  owl_function_aaway_on();
1430  return NULL;
1431}
1432
1433
1434char *owl_command_away(int argc, char **argv, char *buff)
1435{
1436  if ((argc==1) ||
1437      ((argc==2) && !strcmp(argv[1], "on"))) {
1438    owl_global_set_aaway_msg(&g, owl_global_get_aaway_msg_default(&g));
1439    owl_global_set_zaway_msg(&g, owl_global_get_zaway_msg_default(&g));
1440    owl_function_aaway_on();
1441    owl_function_zaway_on();
1442    owl_function_makemsg("Away messages set.", owl_global_get_aaway_msg_default(&g));
1443    return NULL;
1444  }
1445
1446  if (argc==2 && !strcmp(argv[1], "off")) {
1447    owl_function_aaway_off();
1448    owl_function_zaway_off();
1449    return NULL;
1450  }
1451
1452  if (argc==2 && !strcmp(argv[1], "toggle")) {
1453    /* if either one is on, turn it off, otherwise toggle both (turn
1454     *  them both on)
1455     */
1456    if (!owl_global_is_zaway(&g) && !owl_global_is_aaway(&g)) {
1457      owl_function_aaway_toggle();
1458      owl_function_zaway_toggle();
1459      owl_function_makemsg("Away messages set.");
1460    } else {
1461      if (owl_global_is_zaway(&g)) owl_function_zaway_toggle();
1462      if (owl_global_is_aaway(&g)) owl_function_aaway_toggle();
1463      owl_function_makemsg("Away messages off.");
1464    }
1465    return NULL;
1466  }
1467
1468  buff = skiptokens(buff, 1);
1469  owl_global_set_aaway_msg(&g, buff);
1470  owl_global_set_zaway_msg(&g, buff);
1471  owl_function_aaway_on();
1472  owl_function_zaway_on();
1473  owl_function_makemsg("Away messages set.");
1474  return NULL;
1475}
1476
1477char *owl_command_set(int argc, char **argv, char *buff)
1478{
1479  char *var, *val;
1480  int  silent=0;
1481  int requirebool=0;
1482
1483  if (argc == 1) {
1484    owl_function_printallvars();
1485    return NULL;
1486  } 
1487
1488  if (argc > 1 && !strcmp("-q",argv[1])) {
1489    silent = 1;
1490    argc--; argv++;
1491  }
1492
1493  if (argc == 2) {
1494    var=argv[1];
1495    val="on";
1496    requirebool=1;
1497  } else if (argc == 3) {
1498    var=argv[1];
1499    val=argv[2];
1500  } else {
1501    owl_function_makemsg("Wrong number of arguments for set command");
1502    return NULL;
1503  }
1504  owl_variable_set_fromstring(owl_global_get_vardict(&g), var, val, !silent, requirebool);
1505  return NULL;
1506}
1507
1508char *owl_command_unset(int argc, char **argv, char *buff)
1509{
1510  char *var, *val;
1511  int  silent=0;
1512
1513  if (argc > 1 && !strcmp("-q",argv[1])) {
1514    silent = 1;
1515    argc--; argv++;
1516  }
1517  if (argc == 2) {
1518    var=argv[1];
1519    val="off";
1520  } else {
1521    owl_function_makemsg("Wrong number of arguments for unset command");
1522    return NULL;
1523  }
1524  owl_variable_set_fromstring(owl_global_get_vardict(&g), var, val, !silent, 1);
1525  return NULL;
1526}
1527
1528char *owl_command_print(int argc, char **argv, char *buff)
1529{
1530  char *var;
1531  char valbuff[1024];
1532
1533  if (argc==1) {
1534    owl_function_printallvars();
1535    return NULL;
1536  } else if (argc!=2) {
1537    owl_function_makemsg("Wrong number of arguments for print command");
1538    return NULL;
1539  }
1540
1541  var=argv[1];
1542   
1543  if (0 == owl_variable_get_tostring(owl_global_get_vardict(&g), 
1544                                     var, valbuff, 1024)) {
1545    owl_function_makemsg("%s = '%s'", var, valbuff);
1546  } else {
1547    owl_function_makemsg("Unknown variable '%s'.", var);
1548  }
1549  return NULL;
1550}
1551
1552
1553char *owl_command_exec(int argc, char **argv, char *buff)
1554{
1555  return owl_function_exec(argc, argv, buff, 0);
1556}
1557
1558char *owl_command_pexec(int argc, char **argv, char *buff)
1559{
1560  return owl_function_exec(argc, argv, buff, 1);
1561}
1562
1563char *owl_command_aexec(int argc, char **argv, char *buff)
1564{
1565  return owl_function_exec(argc, argv, buff, 2);
1566}
1567
1568char *owl_command_perl(int argc, char **argv, char *buff)
1569{
1570  return owl_function_perl(argc, argv, buff, 0);
1571}
1572
1573char *owl_command_pperl(int argc, char **argv, char *buff)
1574{
1575  return owl_function_perl(argc, argv, buff, 1);
1576}
1577
1578char *owl_command_aperl(int argc, char **argv, char *buff)
1579{
1580  return owl_function_perl(argc, argv, buff, 2);
1581}
1582
1583char *owl_command_multi(int argc, char **argv, char *buff)
1584{
1585  char *lastrv = NULL, *dupbuff, *newbuff;
1586  char **commands;
1587  int  ncommands, i;
1588  if (argc < 2) {
1589    owl_function_makemsg("Invalid arguments to 'multi' command.");   
1590    return NULL;
1591  }
1592  dupbuff = owl_strdup(buff);
1593  newbuff = skiptokens(dupbuff, 1);
1594  if (!strcmp(argv[0], "(")) {
1595    for (i=strlen(newbuff)-1; i>=0; i--) {
1596      if (newbuff[i] == ')') {
1597        newbuff[i] = '\0';
1598        break;
1599      } else if (newbuff[i] != ' ') {
1600        owl_function_makemsg("Invalid arguments to 'multi' command.");   
1601        owl_free(newbuff);
1602        return NULL;
1603      }
1604    }
1605  }
1606  commands = atokenize(newbuff, ";", &ncommands);
1607  for (i=0; i<ncommands; i++) {
1608    if (lastrv) {
1609      owl_free(lastrv);
1610    }
1611    lastrv = owl_function_command(commands[i]);
1612  }
1613  owl_free(dupbuff);
1614  atokenize_free(commands, ncommands);
1615  return lastrv;
1616}
1617
1618
1619char *owl_command_alias(int argc, char **argv, char *buff)
1620{
1621  if (argc < 3) {
1622    owl_function_makemsg("Invalid arguments to 'alias' command.");
1623    return NULL;
1624  }
1625  buff = skiptokens(buff, 2);
1626  owl_function_command_alias(argv[1], buff);
1627  return (NULL);
1628}
1629
1630
1631char *owl_command_bindkey(int argc, char **argv, char *buff)
1632{
1633  owl_keymap *km;
1634  int ret;
1635
1636  if (argc < 5 || strcmp(argv[3], "command")) {
1637    owl_function_makemsg("Usage: bindkey <keymap> <binding> command <cmd>");
1638    return NULL;
1639  }
1640  km = owl_keyhandler_get_keymap(owl_global_get_keyhandler(&g), argv[1]);
1641  if (!km) {
1642    owl_function_makemsg("No such keymap '%s'", argv[1]);
1643    return NULL;
1644  }
1645  buff = skiptokens(buff, 4);
1646  ret = owl_keymap_create_binding(km, argv[2], buff, NULL, "*user*");
1647  if (ret!=0) {
1648    owl_function_makemsg("Unable to bind '%s' in keymap '%s' to '%s'.",
1649                         argv[2], argv[1], buff);
1650    return NULL;
1651  }
1652  return NULL;
1653}
1654
1655char *owl_command_style(int argc, char **argv, char *buff) {
1656  owl_style *s;
1657
1658  /* Usage: style <name> perl <function> */
1659  if (argc != 4 || strcmp(argv[2], "perl")) {
1660    owl_function_makemsg("Usage: style <name> perl <function>");
1661    return NULL;
1662  }
1663  if (!owl_perlconfig_is_function(argv[3])) {
1664    owl_function_makemsg("Unable to create style '%s': no perl function '%s'",
1665                         argv[1], argv[3]);
1666    return NULL;
1667  }
1668  s=owl_malloc(sizeof(owl_style));
1669  owl_style_create_perl(s, argv[1], argv[3], NULL);
1670  owl_global_add_style(&g, s);
1671
1672  return NULL;
1673}
1674
1675
1676void owl_command_quit()
1677{
1678  owl_function_quit();
1679}
1680
1681char *owl_command_debug(int argc, char **argv, char *buff)
1682{
1683  if (argc<2) {
1684    owl_function_makemsg("Need at least one argument to debug command");
1685    return(NULL);
1686  }
1687
1688  if (!owl_global_is_debug_fast(&g)) {
1689    owl_function_makemsg("Debugging is not turned on");
1690    return(NULL);
1691  }
1692
1693  owl_function_debugmsg(argv[1]);
1694  return(NULL);
1695}
1696
1697char *owl_command_term(int argc, char **argv, char *buff)
1698{
1699  if (argc<2) {
1700    owl_function_makemsg("Need at least one argument to the term command");
1701    return(NULL);
1702  }
1703
1704  if (!strcmp(argv[1], "raise")) {
1705    owl_function_xterm_raise();
1706  } else if (!strcmp(argv[1], "deiconify")) {
1707    owl_function_xterm_deiconify();
1708  } else {
1709    owl_function_makemsg("Unknown terminal subcommand");
1710  }
1711  return(NULL);
1712}
1713
1714char *owl_command_zlog(int argc, char **argv, char *buff)
1715{
1716  if ((argc<2) || (argc>3)) {
1717    owl_function_makemsg("Wrong number of arguments for zlog command");
1718    return(NULL);
1719  }
1720
1721  if (!strcmp(argv[1], "in")) {
1722    if (argc>2) {
1723      owl_global_set_tty(&g, argv[2]);
1724    }
1725    owl_zephyr_zlog_in();
1726  } else if (!strcmp(argv[1], "out")) {
1727    if (argc!=2) {
1728      owl_function_makemsg("Wrong number of arguments for zlog command");
1729      return(NULL);
1730    }
1731    owl_zephyr_zlog_out();
1732  } else {
1733    owl_function_makemsg("Invalid subcommand for zlog");
1734  }
1735  return(NULL);
1736}
1737
1738
1739void owl_command_zlog_out(void)
1740{
1741  owl_zephyr_zlog_out();
1742}
1743
1744
1745char *owl_command_subscribe(int argc, char **argv, char *buff)
1746{
1747  char *recip="";
1748  int temp=0;
1749 
1750  if (argc<3) {
1751    owl_function_makemsg("Not enough arguments to the subscribe command");
1752    return(NULL);
1753  }
1754  argc--;
1755  argv++;
1756
1757  if (!strcmp(argv[0], "-t")) {
1758    temp=1;
1759    argc--;
1760    argv++;
1761  }
1762  if (argc<2) {
1763    owl_function_makemsg("Not enough arguments to the subscribe command");
1764    return(NULL);
1765  }
1766
1767  if (argc>3) {
1768    owl_function_makemsg("Too many arguments to the subscribe command");
1769    return(NULL);
1770  }
1771
1772  if (argc==2) {
1773    recip="";
1774  } else if (argc==3) {
1775    recip=argv[2];
1776  }
1777
1778  owl_function_subscribe(argv[0], argv[1], recip);
1779  if (!temp) {
1780    owl_zephyr_addsub(NULL, argv[0], argv[1], recip);
1781  }
1782  return(NULL);
1783}
1784
1785
1786char *owl_command_unsubscribe(int argc, char **argv, char *buff)
1787{
1788  char *recip="";
1789  int temp=0;
1790
1791  if (argc<3) {
1792    owl_function_makemsg("Not enough arguments to the unsubscribe command");
1793    return(NULL);
1794  }
1795  argc--;
1796  argv++;
1797
1798  if (!strcmp(argv[0], "-t")) {
1799    temp=1;
1800    argc--;
1801    argv++;
1802  }
1803  if (argc<2) {
1804    owl_function_makemsg("Not enough arguments to the subscribe command");
1805    return(NULL);
1806  }
1807
1808  if (argc>3) {
1809    owl_function_makemsg("Too many arguments to the unsubscribe command");
1810    return(NULL);
1811  }
1812
1813  if (argc==2) {
1814    recip="";
1815  } else if (argc==3) {
1816    recip=argv[2];
1817  }
1818
1819  owl_function_unsubscribe(argv[0], argv[1], recip);
1820  if (!temp) {
1821    owl_zephyr_delsub(NULL, argv[0], argv[1], recip);
1822  }
1823  return(NULL);
1824}
1825
1826char *owl_command_echo(int argc, char **argv, char *buff)
1827{
1828  buff = skiptokens(buff, 1);
1829  owl_function_popless_text(buff);
1830  return NULL;
1831}
1832
1833void owl_command_getsubs(void)
1834{
1835  owl_function_getsubs();
1836}
1837
1838void owl_command_status(void)
1839{
1840  owl_function_status();
1841}
1842
1843char *owl_command_zwrite(int argc, char **argv, char *buff)
1844{
1845  owl_zwrite z;
1846
1847  if (!owl_global_is_havezephyr(&g)) {
1848    owl_function_makemsg("Zephyr is not available");
1849    return(NULL);
1850  }
1851  /* check for a zwrite -m */
1852  owl_zwrite_create_from_line(&z, buff);
1853  if (owl_zwrite_is_message_set(&z)) {
1854    owl_function_zwrite(buff, NULL);
1855    owl_zwrite_free(&z);
1856    return (NULL);
1857  }
1858
1859  if (argc < 2) {
1860    owl_function_makemsg("Not enough arguments to the zwrite command.");
1861  } else {
1862    owl_function_zwrite_setup(buff);
1863  }
1864  return(NULL);
1865}
1866
1867char *owl_command_aimwrite(int argc, char **argv, char *buff)
1868{
1869  char *newbuff;
1870  int i, j;
1871 
1872  if (!owl_global_is_aimloggedin(&g)) {
1873    owl_function_makemsg("You are not logged in to AIM.");
1874    return(NULL);
1875  }
1876
1877  if (argc < 2) {
1878    owl_function_makemsg("Not enough arguments to the aimwrite command.");
1879    return(NULL);
1880  }
1881
1882  /* squish arguments together to make one screenname w/o spaces for now */
1883  newbuff=owl_malloc(strlen(buff)+5);
1884  sprintf(newbuff, "%s ", argv[0]);
1885  j=argc-1;
1886  for (i=0; i<j; i++) {
1887    strcat(newbuff, argv[i+1]);
1888  }
1889   
1890  owl_function_aimwrite_setup(newbuff);
1891  owl_free(newbuff);
1892  return(NULL);
1893}
1894
1895char *owl_command_loopwrite(int argc, char **argv, char *buff)
1896{
1897  owl_function_loopwrite_setup();
1898  return(NULL);
1899}
1900
1901char *owl_command_zcrypt(int argc, char **argv, char *buff)
1902{
1903#ifdef OWL_ENABLE_ZCRYPT
1904  owl_zwrite z;
1905
1906  if (!owl_global_is_havezephyr(&g)) {
1907    owl_function_makemsg("Zephyr is not available");
1908    return(NULL);
1909  }
1910  /* check for a zcrypt -m */
1911  owl_zwrite_create_from_line(&z, buff);
1912  if (owl_zwrite_is_message_set(&z)) {
1913    owl_function_zcrypt(buff, NULL);
1914    owl_zwrite_free(&z);
1915    return (NULL);
1916  }
1917
1918  if (argc < 2) {
1919    owl_function_makemsg("Not enough arguments to the zcrypt command.");
1920  } else {
1921    owl_function_zwrite_setup(buff);
1922  }
1923  return(NULL);
1924#else
1925  owl_function_makemsg("This Owl does not support zcrypt");
1926#endif
1927}
1928
1929char *owl_command_reply(int argc, char **argv, char *buff)
1930{
1931  int edit=0;
1932 
1933  if (argc>=2 && !strcmp("-e", argv[1])) {
1934    edit=1;
1935    argv++;
1936    argc--;
1937  }
1938
1939  if ((argc==1) || (argc==2 && !strcmp(argv[1], "all"))) {   
1940    owl_function_reply(0, !edit);
1941  } else if (argc==2 && !strcmp(argv[1], "sender")) {
1942    owl_function_reply(1, !edit);
1943  } else if (argc==2 && !strcmp(argv[1], "zaway")) {
1944    owl_message *m;
1945    owl_view    *v;
1946    v = owl_global_get_current_view(&g);   
1947    m = owl_view_get_element(v, owl_global_get_curmsg(&g));
1948    if (m) owl_zephyr_zaway(m);
1949  } else {
1950    owl_function_makemsg("Invalid arguments to the reply command.");
1951  }
1952  return NULL;
1953}
1954
1955char *owl_command_filter(int argc, char **argv, char *buff)
1956{
1957  owl_function_create_filter(argc, argv);
1958  return NULL;
1959}
1960
1961char *owl_command_zlocate(int argc, char **argv, char *buff)
1962{
1963  int auth;
1964 
1965  if (argc<2) {
1966    owl_function_makemsg("Too few arguments for zlocate command");
1967    return NULL;
1968  }
1969
1970  auth=1;
1971  if (!strcmp(argv[1], "-d")) {
1972    if (argc>2) {
1973      auth=0;
1974      argc--;
1975      argv++;
1976    } else {
1977      owl_function_makemsg("Missing arguments for zlocate command");
1978      return NULL;
1979    }
1980  }
1981
1982  argc--;
1983  argv++;
1984  owl_function_zlocate(argc, argv, auth);
1985  return NULL;
1986}
1987
1988
1989/* Backwards compatability has made this kind of complicated:
1990 * view [<viewname>] [-f <filter> | -d <expression> | --home | -r ] [-s <style>]
1991 * view <filter>
1992 * view -d <expression>
1993 * view --home
1994 */
1995char *owl_command_view(int argc, char **argv, char *buff)
1996{
1997  /* First take the 'view --home' and 'view -r' cases */
1998  if (argc == 2) {
1999    if (!strcmp(argv[1], "--home")) {
2000      owl_function_change_currentview_filter(owl_global_get_view_home(&g));
2001      return(NULL);
2002    } else if (!strcmp(argv[1], "-r")) {
2003      char *foo;
2004      foo=owl_function_create_negative_filter(owl_view_get_filtname(owl_global_get_current_view(&g)));
2005      owl_function_change_currentview_filter(foo);
2006      owl_free(foo);
2007      return(NULL);
2008    }
2009  }
2010
2011  /* Now look for 'view <filter>' */
2012  if (argc==2) {
2013    owl_function_change_currentview_filter(argv[1]);
2014    return(NULL);
2015  }
2016
2017  /* Now get 'view -d <expression>' */
2018  if (argc>=3 && !strcmp(argv[1], "-d")) {
2019    char **myargv;
2020    int i;
2021
2022    myargv=owl_malloc((argc*sizeof(char *))+50);
2023    myargv[0]="";
2024    myargv[1]="owl-dynamic";
2025    for (i=2; i<argc; i++) {
2026      myargv[i]=argv[i];
2027    }
2028    owl_function_create_filter(argc, myargv);
2029    owl_function_change_currentview_filter("owl-dynamic");
2030    owl_free(myargv);
2031    return NULL;
2032  }
2033
2034  /* Finally handle the general case */
2035  if (argc<3) {
2036    owl_function_makemsg("Too few arguments to the view command.");
2037    return(NULL);
2038  }
2039  argc--;
2040  argv++;
2041  if (strcmp(argv[0], "-f") &&
2042      strcmp(argv[0], "-d") &&
2043      strcmp(argv[0], "--home") &&
2044      strcmp(argv[0], "-s") &&
2045      strcmp(argv[0], "-r")) {
2046    if (strcmp(argv[0], "main")) {
2047      owl_function_makemsg("No view named '%s'", argv[0]);
2048      return(NULL);
2049    }
2050    argc--;
2051    argv++;
2052  }
2053  while (argc) {
2054    if (!strcmp(argv[0], "-f")) {
2055      if (argc<2) {
2056        owl_function_makemsg("Too few argments to the view command");
2057        return(NULL);
2058      }
2059      owl_function_change_currentview_filter(argv[1]);
2060      argc-=2;
2061      argv+=2;
2062    } else if (!strcmp(argv[0], "--home")) {
2063      owl_function_change_currentview_filter(owl_global_get_view_home(&g));
2064      argc--;
2065      argv++;
2066    } else if (!strcmp(argv[0], "-r")) {
2067      char *foo;
2068      foo=owl_function_create_negative_filter(owl_view_get_filtname(owl_global_get_current_view(&g)));
2069      owl_function_change_currentview_filter(foo);
2070    } else if (!strcmp(argv[0], "-s")) {
2071      if (argc<2) {
2072        owl_function_makemsg("Too few argments to the view command");
2073        return(NULL);
2074      }
2075      owl_function_change_style(owl_global_get_current_view(&g), argv[1]);
2076      argc-=2;
2077      argv+=2;
2078    } else {
2079      owl_function_makemsg("Too few argments to the view command");
2080      return(NULL);
2081    }
2082   
2083  }
2084  return(NULL);
2085}
2086
2087char *owl_command_show(int argc, char **argv, char *buff)
2088{
2089  if (argc<2) {
2090    owl_function_help_for_command("show");
2091    return NULL;
2092  }
2093
2094  if (!strcmp(argv[1], "filter") || !strcmp(argv[1], "filters")) {
2095    if (argc==2) {
2096      owl_function_show_filters();
2097    } else {
2098      owl_function_show_filter(argv[2]);
2099    }
2100  } else if (argc==2 
2101             && (!strcmp(argv[1], "zpunts") || !strcmp(argv[1], "zpunted"))) {
2102    owl_function_show_zpunts();
2103  } else if (!strcmp(argv[1], "command") || !strcmp(argv[1], "commands")) {
2104    if (argc==2) {
2105      owl_function_show_commands();
2106    } else {
2107      owl_function_show_command(argv[2]);
2108    }
2109  } else if (!strcmp(argv[1], "variable") || !strcmp(argv[1], "variables")) {
2110    if (argc==2) {
2111      owl_function_show_variables();
2112    } else {
2113      owl_function_show_variable(argv[2]);
2114    }
2115  } else if (!strcmp(argv[1], "keymap") || !strcmp(argv[1], "keymaps")) {
2116    if (argc==2) {
2117      owl_function_show_keymaps();
2118    } else {
2119      owl_function_show_keymap(argv[2]);
2120    }
2121  } else if (!strcmp(argv[1], "view")) {
2122    if (argc==3) {
2123      owl_function_show_view(argv[2]);
2124    } else {
2125      owl_function_show_view(NULL);
2126    }
2127  } else if (!strcmp(argv[1], "colors")) {
2128    owl_function_show_colors();
2129  } else if (!strcmp(argv[1], "styles")) {
2130    owl_function_show_styles();
2131  } else if (!strcmp(argv[1], "subs") || !strcmp(argv[1], "subscriptions")) {
2132    owl_function_getsubs();
2133  } else if (!strcmp(argv[1], "terminal") || !strcmp(argv[1], "term")) {
2134    owl_function_show_term();
2135  } else if (!strcmp(argv[1], "version")) {
2136    owl_function_about();
2137  } else if (!strcmp(argv[1], "status")) {
2138    owl_function_status();
2139  } else if (!strcmp(argv[1], "license")) {
2140    owl_function_show_license();
2141  } else if (!strcmp(argv[1], "startup")) {
2142    char *filename;
2143   
2144    filename=owl_global_get_startupfile(&g);
2145    owl_function_popless_file(filename);
2146  } else if (!strcmp(argv[1], "errors")) {
2147    owl_function_showerrs();
2148  } else {
2149    owl_function_makemsg("Unknown subcommand for 'show' command (see 'help show' for allowed args)");
2150    return NULL;
2151  }
2152  return NULL;
2153}
2154
2155char *owl_command_viewclass(int argc, char **argv, char *buff)
2156{
2157  char *filtname;
2158  if (argc!=2) {
2159    owl_function_makemsg("Wrong number of arguments to viewclass command");
2160    return NULL;
2161  }
2162  filtname = owl_function_classinstfilt(argv[1], NULL);
2163  owl_function_change_currentview_filter(filtname);
2164  owl_free(filtname);
2165  return NULL;
2166}
2167
2168char *owl_command_viewuser(int argc, char **argv, char *buff)
2169{
2170  char *filtname;
2171  if (argc!=2) {
2172    owl_function_makemsg("Wrong number of arguments to viewuser command");
2173    return NULL;
2174  }
2175  filtname=owl_function_zuserfilt(argv[1]);
2176  owl_function_change_currentview_filter(filtname);
2177  owl_free(filtname);
2178  return NULL;
2179}
2180
2181
2182void owl_command_pop_message(void)
2183{
2184  owl_function_curmsg_to_popwin();
2185}
2186
2187void owl_command_openurl(void)
2188{
2189  owl_function_openurl();
2190}
2191
2192char *owl_command_delete(int argc, char **argv, char *buff)
2193{
2194  int move_after = 1;
2195
2196  if (argc>1 && !strcmp(argv[1], "--no-move")) {
2197    move_after = 0;
2198    argc--; 
2199    argv++;
2200  }
2201
2202  if (argc==1) {
2203    owl_function_deletecur(move_after);
2204    return NULL;
2205  }
2206
2207  if (argc==2 && !strcmp(argv[1], "view")) {
2208    owl_function_delete_curview_msgs(1);
2209    return NULL;
2210  }
2211
2212  if (argc==2 && !strcmp(argv[1], "trash")) {
2213    owl_function_delete_automsgs();
2214    return NULL;
2215  }
2216
2217  if (argc==3 && (!strcmp(argv[1], "-id") || !strcmp(argv[1], "--id"))) {
2218    owl_function_delete_by_id(atoi(argv[2]), 1);
2219    return NULL;
2220  }
2221
2222  owl_function_makemsg("Unknown arguments to delete command");
2223  return NULL;
2224}
2225
2226char *owl_command_undelete(int argc, char **argv, char *buff)
2227{
2228  int move_after = 1;
2229
2230  if (argc>1 && !strcmp(argv[1], "--no-move")) {
2231    move_after = 0;
2232    argc--; 
2233    argv++;
2234  }
2235
2236  if (argc==1) {
2237    owl_function_undeletecur(move_after);
2238    return NULL;
2239  }
2240
2241  if (argc==2 && !strcmp(argv[1], "view")) {
2242    owl_function_delete_curview_msgs(0);
2243    return NULL;
2244  }
2245
2246  if (argc==3 && (!strcmp(argv[1], "-id") || !strcmp(argv[1], "--id"))) {
2247    owl_function_delete_by_id(atoi(argv[2]), 0);
2248    return NULL;
2249  }
2250
2251  owl_function_makemsg("Unknown arguments to delete command");
2252  return NULL;
2253}
2254
2255void owl_command_beep()
2256{
2257  owl_function_beep();
2258}
2259
2260char *owl_command_colorview(int argc, char **argv, char *buff)
2261{
2262  if (argc < 2 || argc > 3) {
2263    owl_function_makemsg("Wrong number of arguments to colorview command");
2264    return NULL;
2265  }
2266  owl_function_color_current_filter(argv[1], (argc == 3 ? argv[2] : NULL));
2267  return NULL;
2268}
2269
2270char *owl_command_colorclass(int argc, char **argv, char *buff)
2271{
2272  char *filtname;
2273 
2274  if (argc < 3 || argc > 4) {
2275    owl_function_makemsg("Wrong number of arguments to colorclass command");
2276    return NULL;
2277  }
2278
2279  filtname=owl_function_classinstfilt(argv[1], NULL);
2280  (void) owl_function_color_filter(filtname, argv[2], (argc == 4 ? argv[3] : NULL));
2281  return NULL;
2282}
2283
2284char *owl_command_zpunt(int argc, char **argv, char *buff)
2285{
2286  owl_command_zpunt_and_zunpunt(argc, argv, 0);
2287  return NULL;
2288}
2289
2290char *owl_command_zunpunt(int argc, char **argv, char *buff)
2291{
2292  owl_command_zpunt_and_zunpunt(argc, argv, 1);
2293  return NULL;
2294}
2295
2296
2297void owl_command_zpunt_and_zunpunt(int argc, char **argv, int type)
2298{
2299  /* if type==0 then zpunt
2300   * if type==1 then zunpunt
2301   */
2302  char *class, *inst, *recip;
2303
2304  class="message";
2305  inst="";
2306  recip="*";
2307
2308  if (argc==1) {
2309    /* show current punt filters */
2310    owl_function_show_zpunts();
2311    return;
2312  } else if (argc==2) {
2313    inst=argv[1];
2314  } else if (argc==3) {
2315    class=argv[1];
2316    inst=argv[2];
2317  } else if (argc==4) {
2318    class=argv[1];
2319    inst=argv[2];
2320    recip=argv[3];
2321  } else {
2322    owl_function_makemsg("Wrong number of arguments to the zpunt command");
2323    return;
2324  }
2325
2326  owl_function_zpunt(class, inst, recip, type);
2327  if (type==0) {
2328    owl_function_makemsg("<%s, %s, %s> added to punt list.", class, inst, recip);
2329  } else if (type==1) {
2330    owl_function_makemsg("<%s, %s, %s> removed from punt list.", class, inst, recip);
2331  }
2332}
2333
2334char *owl_command_smartzpunt(int argc, char **argv, char *buff)
2335{
2336  if (argc == 1) {
2337    owl_function_smartzpunt(0);
2338  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
2339    owl_function_smartzpunt(1);
2340  } else {
2341    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
2342  }
2343  return NULL;
2344}
2345
2346char *owl_command_getview(int argc, char **argv, char *buff)
2347{
2348  char *filtname;
2349  if (argc != 1) {
2350    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2351    return NULL;
2352  }
2353  filtname = owl_view_get_filtname(owl_global_get_current_view(&g));
2354  if (filtname) filtname = owl_strdup(filtname);
2355  return filtname;
2356}
2357
2358char *owl_command_getvar(int argc, char **argv, char *buff)
2359{
2360  char tmpbuff[1024];
2361  if (argc != 2) {
2362    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2363    return NULL;
2364  }
2365  if (owl_variable_get_tostring(owl_global_get_vardict(&g), 
2366                                argv[1], tmpbuff, 1024)) {
2367    return NULL;
2368  }
2369  return owl_strdup(tmpbuff); 
2370}
2371
2372char *owl_command_search(int argc, char **argv, char *buff)
2373{
2374  int direction;
2375  char *buffstart;
2376
2377  direction=OWL_DIRECTION_DOWNWARDS;
2378  buffstart=skiptokens(buff, 1);
2379  if (argc>1 && !strcmp(argv[1], "-r")) {
2380    direction=OWL_DIRECTION_UPWARDS;
2381    buffstart=skiptokens(buff, 2);
2382  }
2383   
2384  if (argc==1 || (argc==2 && !strcmp(argv[1], "-r"))) {
2385    owl_function_search_continue(direction);
2386  } else {
2387    owl_function_search_start(buffstart, direction);
2388  }
2389 
2390  return(NULL);
2391}
2392
2393char *owl_command_setsearch(int argc, char **argv, char *buff)
2394{
2395  char *buffstart;
2396
2397  buffstart=skiptokens(buff, 1);
2398
2399  owl_global_set_search_active(&g, buffstart);
2400
2401  if (!*buffstart) {
2402    owl_global_set_search_inactive(&g);
2403  }
2404
2405  owl_mainwin_redisplay(owl_global_get_mainwin(&g));
2406 
2407  return(NULL);
2408}
2409
2410char *owl_command_aimlogin(int argc, char **argv, char *buff)
2411{
2412  if ((argc<2) || (argc>3)) {
2413    owl_function_makemsg("Wrong number of arguments to aimlogin command");
2414    return(NULL);
2415  }
2416
2417  /* if we get two arguments, ask for the password */
2418  if (argc==2) {
2419    owl_global_set_buffercommand(&g, argv[1]);
2420    owl_global_set_buffercallback(&g, &owl_callback_aimlogin);
2421    owl_function_start_password("AIM Password: ");
2422    return(NULL);
2423  } else {
2424    owl_function_aimlogin(argv[1], argv[2]);
2425  }
2426
2427  /* this is a test */
2428  return(NULL);
2429}
2430
2431char *owl_command_aimlogout(int argc, char **argv, char *buff)
2432{
2433  /* clear the buddylist */
2434  owl_buddylist_clear(owl_global_get_buddylist(&g));
2435
2436  owl_aim_logout();
2437  return(NULL);
2438}
2439
2440char *owl_command_getstyle(int argc, char **argv, char *buff)
2441{
2442  char *stylename;
2443  if (argc != 1) {
2444    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2445    return NULL;
2446  }
2447  stylename = owl_view_get_style_name(owl_global_get_current_view(&g));
2448  if (stylename) stylename = owl_strdup(stylename);
2449  return stylename;
2450}
2451
2452char *owl_command_error(int argc, char **argv, char *buff)
2453{
2454    buff = skiptokens(buff, 1);
2455    owl_function_error(buff);
2456    return NULL;
2457}
2458
2459char *owl_command_message(int argc, char **argv, char *buff)
2460{
2461    buff = skiptokens(buff, 1);
2462    owl_function_makemsg(buff);
2463    return NULL;
2464}
2465
2466void owl_command_yes(void)
2467{
2468  owl_message *m;
2469  owl_view *v;
2470
2471  v = owl_global_get_current_view(&g);
2472
2473  /* bail if there's no current message */
2474  if (owl_view_get_size(v) < 1) {
2475    owl_function_error("No current message.");
2476    return;
2477  }
2478
2479  m = owl_view_get_element(v, owl_global_get_curmsg(&g));
2480  if(!owl_message_is_question(m)) {
2481    owl_function_error("That message isn't a question.");
2482    return;
2483  }
2484  if(owl_message_is_answered(m)) {
2485    owl_function_error("You already answered that question.");
2486    return;
2487  }
2488  char * cmd = owl_message_get_attribute_value(m, "yescommand");
2489  if(!cmd) {
2490    owl_function_error("No yes command!");
2491    return;
2492  }
2493
2494  owl_function_command_norv(cmd);
2495  owl_message_set_isanswered(m);
2496  return;
2497}
2498
2499void owl_command_no(void)
2500{
2501  owl_message *m;
2502  owl_view *v;
2503
2504  v = owl_global_get_current_view(&g);
2505
2506  /* bail if there's no current message */
2507  if (owl_view_get_size(v) < 1) {
2508    owl_function_error("No current message.");
2509    return;
2510  }
2511
2512  m = owl_view_get_element(v, owl_global_get_curmsg(&g));
2513  if(!owl_message_is_question(m)) {
2514    owl_function_error("That message isn't a question.");
2515    return;
2516  }
2517  if(owl_message_is_answered(m)) {
2518    owl_function_error("You already answered that question.");
2519    return;
2520  }
2521  char * cmd = owl_message_get_attribute_value(m, "nocommand");
2522  if(!cmd) {
2523    owl_function_error("No no command!");
2524    return;
2525  }
2526
2527  owl_function_command_norv(cmd);
2528  owl_message_set_isanswered(m);
2529  return;
2530}
2531
2532/*********************************************************************/
2533/************************** EDIT SPECIFIC ****************************/
2534/*********************************************************************/
2535
2536void owl_command_edit_cancel(owl_editwin *e)
2537{
2538  owl_history *hist;
2539
2540  owl_function_makemsg("Command cancelled.");
2541
2542  hist=owl_editwin_get_history(e);
2543  owl_history_store(hist, owl_editwin_get_text(e));
2544  owl_history_reset(hist);
2545
2546  owl_editwin_fullclear(e);
2547  owl_global_set_needrefresh(&g);
2548  wnoutrefresh(owl_editwin_get_curswin(e));
2549  owl_global_set_typwin_inactive(&g);
2550  owl_editwin_new_style(e, OWL_EDITWIN_STYLE_ONELINE, NULL);
2551
2552  owl_function_activate_keymap("recv");
2553}
2554
2555void owl_command_edit_history_prev(owl_editwin *e)
2556{
2557  owl_history *hist;
2558  char *ptr;
2559
2560  hist=owl_editwin_get_history(e);
2561  if (!owl_history_is_touched(hist)) {
2562    owl_history_store(hist, owl_editwin_get_text(e));
2563    owl_history_set_partial(hist);
2564  }
2565  ptr=owl_history_get_prev(hist);
2566  if (ptr) {
2567    owl_editwin_clear(e);
2568    owl_editwin_insert_string(e, ptr);
2569    owl_editwin_redisplay(e, 0);
2570    owl_global_set_needrefresh(&g);
2571  } else {
2572    owl_function_beep();
2573  }
2574}
2575
2576void owl_command_edit_history_next(owl_editwin *e)
2577{
2578  owl_history *hist;
2579  char *ptr;
2580
2581  hist=owl_editwin_get_history(e);
2582  ptr=owl_history_get_next(hist);
2583  if (ptr) {
2584    owl_editwin_clear(e);
2585    owl_editwin_insert_string(e, ptr);
2586    owl_editwin_redisplay(e, 0);
2587    owl_global_set_needrefresh(&g);
2588  } else {
2589    owl_function_beep();
2590  }
2591}
2592
2593char *owl_command_edit_insert_text(owl_editwin *e, int argc, char **argv, char *buff)
2594{
2595  buff = skiptokens(buff, 1);
2596  owl_editwin_insert_string(e, buff);
2597  owl_editwin_redisplay(e, 0);
2598  owl_global_set_needrefresh(&g); 
2599  return NULL;
2600}
2601
2602void owl_command_editline_done(owl_editwin *e)
2603{
2604  owl_history *hist=owl_editwin_get_history(e);
2605  char *rv, *cmd;
2606
2607  owl_history_store(hist, owl_editwin_get_text(e));
2608  owl_history_reset(hist);
2609  owl_global_set_typwin_inactive(&g);
2610  cmd = owl_strdup(owl_editwin_get_text(e));
2611  owl_editwin_fullclear(e);
2612  rv = owl_function_command(cmd);
2613  owl_free(cmd);
2614
2615  wnoutrefresh(owl_editwin_get_curswin(e));
2616  owl_global_set_needrefresh(&g);
2617
2618  if (rv) {
2619    owl_function_makemsg("%s", rv);
2620    owl_free(rv);
2621  }
2622}
2623
2624
2625void owl_command_editresponse_done(owl_editwin *e)
2626{
2627  owl_function_run_buffercommand();
2628
2629  owl_global_set_typwin_inactive(&g);
2630  owl_editwin_fullclear(e);
2631  wnoutrefresh(owl_editwin_get_curswin(e));
2632  owl_global_set_needrefresh(&g);
2633}
2634
2635
2636void owl_command_editmulti_done(owl_editwin *e)
2637{
2638  owl_history *hist=owl_editwin_get_history(e);
2639
2640  owl_history_store(hist, owl_editwin_get_text(e));
2641  owl_history_reset(hist);
2642
2643  owl_function_run_buffercommand();
2644  owl_editwin_new_style(e, OWL_EDITWIN_STYLE_ONELINE, NULL);
2645  owl_editwin_fullclear(e);
2646  owl_global_set_typwin_inactive(&g);
2647  owl_global_set_needrefresh(&g);
2648  wnoutrefresh(owl_editwin_get_curswin(e));
2649}
2650
2651void owl_command_editmulti_done_or_delete(owl_editwin *e)
2652{
2653  if (owl_editwin_is_at_end(e)) {
2654    owl_command_editmulti_done(e);
2655  } else {
2656    owl_editwin_delete_char(e);
2657  }
2658}
2659
2660
2661/*********************************************************************/
2662/*********************** POPLESS SPECIFIC ****************************/
2663/*********************************************************************/
2664
2665void owl_command_popless_quit(owl_viewwin *vw)
2666{
2667  owl_popwin_close(owl_global_get_popwin(&g));
2668  owl_viewwin_free(vw);
2669  owl_global_set_needrefresh(&g);
2670}
Note: See TracBrowser for help on using the repository browser.