source: commands.c @ 6af4068

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