home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 35 Internet
/
35-Internet.zip
/
ircii30.zip
/
script
/
complete
< prev
next >
Wrap
Text File
|
1994-07-30
|
8KB
|
212 lines
# Complete - by Ian Frechette (Daemon)
# inspired by the tcsh shell 'complete' command
# version .8 (alpha) Do NOT distribute
# Tue Jul 13 13:16:01 MDT 1993
@ RCS.complete = [$$Header: /local/cvs/ircii/script/complete,v 1.1 1994/07/30 18:07:23 mrg stable $$]
#
# Commands:
# compl.add [-null] [-nomatch] <command pattern> <command parser name>
# or
# compl.add <[-nulll] [-nomatch]> <command parser name>
# to add patterns and assciated parsers or just parsers to null and nomatch
# condition. (See notes below for me info)
#
# compl.list Just list everything out..
# don't clobber existing lists when reloading complete
if (!compl.list) {@ compl.list = []}
if (!compl.parse) {@ compl.parse = []}
if (!compl.null) {@ compl.null = []}
if (!compl.null) {@ compl.nomatch = []}
# Bind TAB to call compl.parse with the contents of the input line
bind ^I parse_command compl.parse $L
# alias compl.add
# Usage: compl.add [-null] [-nomatch] <command pattern> <command parser>
# Usage: compl.add <[-null] [-nomatch]> <command parser>
# e.g. compl.add /msg message_parser will call the message_parser
# when TAB is pressed and /msg
# is the current command on the
# input line
# -null specifies that the given <command parser> should be used when
# TAB is pressed and the input line is blank
# -nomatch specifies that the given <command parser> should be used
# when the current command at the head of the input line is not
# found in the list of <command pattern>s
# can use just compl.add -null message_parser
# or compl.add -null -nomatch message_parser
#
#
alias compl.add {
if ([$1])
{
@ compl.add.last = [$*]
@ compl.add.last = #compl.add.last
@ compl.tmp = 0
@ compl.flag.null = 0
@ compl.flag.nm = 0
if (compl.flag.null = rmatch(-null $*)) {@ compl.tmp = compl.tmp +1}
if (compl.flag.nm = rmatch(-nomatch $*)) {@ compl.tmp = compl.tmp +1 }
# Need to make sure there is at least one morpe argument beyond
# the -null or -nomatch which we'll take as the parser name
if (compl.add.last > compl.tmp)
{
if (compl.flag.null)
{
if (compl.null) {echo *** compl.add: null call replaced.}
@ compl.null = [$(${compl.add.last -1 })]
echo *** compl.add: null calls $compl.null
}
if (compl.flag.nm)
{
if (compl.nomatch) {echo *** compl.add: nomatch call replaced.}
@ compl.nomatch = [$(${compl.add.last -1})]
echo *** compl.add: nomatch calls $compl.nomatch
}
# Need both the pattern and parser for this part.
if ((compl.add.last - 2) == compl.tmp)
{
# At this point compl.tmp should be 0 1 or 2
# basically 1 past the last -null or -nomatch found
push compl.list $($compl.tmp)
push compl.parse $(${compl.tmp+1})
echo *** compl.add: $($compl.tmp) $(${compl.tmp +1}) added
}
}
{ echo *** compl.add: Not enough arguments to do anything (1)}
}
{ echo *** compl.add: Not enough arguments to do anything (2)}
^assign -compl.tmp
^assign -compl.flag.null
^assign -compl.flag.nm
}
# alias compl.list No arguments.
# just list the various completion lists.
alias compl.list {
# if there are items in the list
@compl.list.cnt = 0
@compl.list.flag = 0
echo *** $format(4 num): $lformat(17 Command Pattern) $lformat(15 Action taken)
if (compl.list)
{
@ compl.list.flag = 1
@ compl.tmp = #compl.list
while (compl.list.cnt < compl.tmp)
{
echo *** $format(4 ${compl.list.cnt +1}): $lformat(17 $word($compl.list.cnt $compl.list)) $lformat(15 $word($compl.list.cnt $compl.parse))
@ compl.list.cnt = compl.list.cnt + 1
}
}
if (compl.null)
{
@compl.list.cnt = compl.list.cnt + 1
@compl.list.flag = 1
echo *** $format(4 $compl.list.cnt): $lformat(17 <NULL PATTERN>) $lformat(15 $compl.null)
}
if (compl.nomatch)
{
@compl.list.cnt = compl.list.cnt + 1
@compl.list.flag = 1
echo *** $format(4 $compl.list.cnt): $lformat(17 <NO MATCH>) $lformat(15 $compl.nomatch)
}
if (!compl.list.flag) { echo *** compl.list: no completions set }
^assign -compl.tmp
^assign -compl.list.flag
^assign -compl.list.cnt
}
# alias compl.del Delete an entry from the list of completions
# Do a 'compl.list' first to get a list with numbers.
# then issue a compl.del <item number> and walla.. gone poof.
alias compl.del {
if (index(0123456789 $0) > -1)
{
@ c.d.len = #compl.list
if (([$0] > 0) && ([$0] <= c.d.len))
{
# notword() does boundary checking
@ compl.list = notword($0 $compl.list)
@ compl.parse = notword($0 $compl.parse)
if (#comp.list == c.d.len)
{ echo *** compl.del: Failed to remove item $0 from compl.list}
{ echo *** compl.del: removed item $0 from list of completions}
}
{if ([$0] == (c.d.len + 1))
{
if (compl.null)
{
echo *** compl.del: Removed default null action
@ compl.null = []
}
{
echo *** compl.del: Removed default nomatch action
@ compl.nomatch = []
}
}
{if (([$0] == (c.d.len + 2)) && (compl.null != []) && (compl.nomatch != []))
{
echo *** compl.del: Removed default nomatch action
@ compl.nomatch = []
}
{
echo *** compl.del: Selection not in range. /coml.list for list
}}}
}
{
echo *** compl.del: Not a valid number. /compl.del <number to delete>
echo *** compl.del: /compl.list for a list of current completions
}
^assign -c.d.len
}
# alias compl.parse
# This is the real guts of the whole script. Don't let all the other
# fool you. This is what is called when you press TAB.
# It simply tries to find a match for the command word
# ($0 of the input line) and if it finds one it calls the corresponding
# parser with the entire input line as an argument.
# There are two additional states
# null == the command in the compl.null var is called when the input line
# is empty and compl.parse is called
# nomatch == the command in the compl.nomatch var is called when the input
# line command word ($0) is not found in the list of commands
# compl.list
alias compl.parse {
if ([$0])
{
if (compl.ptr = rmatch($0 $compl.list))
{
$word(${compl.ptr -1} $compl.parse) $*
}
{
if (compl.nomatch) {$compl.nomatch $*}
}
}
{
$compl.null
}
^assign -compl.ptr
}
# push an item onto the head of a list
# this only takes the name of the list instead of the variable itself.
# examples.
# /push list Item
# or if (push(list Item)) { echo push sucessful } { echo push failed }
# echo $list returns 'Item'
alias push {
if (![$1])
{ @function_return = 0 }
{ eval @ $0 = [$1- $($0)];@function_return = 1}
}
alias debug if (ddebug) {echo *D* $*}