[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Nifty hack



I don't know if anyone will be very interested in this, but here is
another little hack that I dreamed up this weekend in an effort to
create a single .esrc for every architecture that I commonly use.
It isn't exactly blazingly fast (it adds about 1 second onto my login
time), but it is pretty useful.
The following function, build-fn, is used to dynamically build a 
function, or alias, based off of a selection of similarly functional
programs. The best way to describe this is using a couple of 
examples:
 build-fn play player splayer play \
 default {for (file = $*) {cat $file > /dev/audio}}
This will cause a new function 'play' to be created (actually, $fn-play);
say player exists in your $path (in /usr/audio/bin, like it does on my 
system), then:
 ; echo $fn-play
 @ * {/usr/audio/bin/player $*}
If player doesn't exist in your path, but splayer does exist in
/usr/local/bin, then:
 ; echo $fn-play
 @ * {/usr/local/bin/splayer $*}
If there are no matches, then you get the following:
 ; echo $fn-play
 @ * {for(file=$*){%create 1 <={%one /dev/audio} {cat $file}}}
build-fn also allows you to override the default function created for
programs that it manages to find. For example:
 build-fn ll ll { @prog@ -F $* } \
 ls { @prog@ -lF $* }
So, if you actually have a program called ll on your system (I do,
in /bin), then:
 ; echo $fn-ll
 @ * {/bin/ll -F $*}
If ll doesn't exist in your path, then:
 ; echo $fn-ll
 @ * {/bin/ls -lF $*}
Note, that any instances of @prog@ in your supplied code fragment
are replaced with the full path name of the program that matched within
your list.
Caveats:
 o You can't search for a program called 'default'.
 o It doesn't make sense supply @prog@ within a default
 selection.
 o You can't stop @prog@ from being expanded within a code
 fragment.
Have fun!
-scott
--
 _/ _/ _/_/_/ _/_/_/_/ _/_/_/ Scott C. Gray (gray@nas.nasa.gov)
 _/_/ _/ _/ _/ _/_/ _/ _/ NASA Ames Research M/S 258-6
 _/ _/_/ _/_/_/_/ _/_/ _/_/_/_/ For PGP public key, send me mail
_/ _/ _/ _/ _/_/_/_/ _/ _/ with subject line of "PGP request".
----------------------------[ CUT HERE ]-----------------------------------
fn choose-bin bin-list {
 for ( bin = $bin-list ) {
 for ( dir = $path ) {
 if { access -rx $dir/$bin } {
 return $dir/$bin
 }
 }
 }
 return
}
# build-fn function-name { prog-name | default } [script] ...
#
# This function is used to dynamically build a function, or alias,
# using the first occurance of prog-name that actually exists. 
fn build-fn function-name args {
 let ( 
 default-fn = # script specified by the default key word
 prog-name = # current program we are searching for
 prog-name-full = # fully specified program path
 prog-script = # script to be used if prog-name is found
 dir = # variable used in a loop
 success = false
 ) {
 while { ! ~ $#args 0 } {
 prog-name = $args(1)
 if { ~ $args(2) '{'*'}' } {
 prog-script = $args(2)
 args = $args(3 ...)
 } {
 prog-script = 
 args = $args(2 ...)
 }
 if { ~ $prog-name default } {
 if { ~ $#prog-script 0 } {
 throw error build-fn 'build-fn: No code with default'
 }
 default-fn = $prog-script
 } {
 prog-name-full = <={ choose-bin $prog-name }
 if { ! ~ $#prog-name-full 0 } {
 if { ~ $#prog-script 0 } {
 prog-script = '@ * {'^$prog-name-full^' $*}'
 } {
 prog-script = '@ *' `{echo $prog-script | \
 sed -e 's,@prog@,'^$prog-name-full^',g'}
 }
 fn-$function-name = $^prog-script
 success = true
 break
 }
 }
 }
 if { ! ~ $success true } {
 if { ! ~ $#default-fn 0 } {
 default-fn = '@ * ' ^ $^default-fn
 fn-$function-name = $^default-fn
 } {
 throw error build-fn 'build-fn: No match for '^$function-name
 }
 }
 }
 return 0
}
--
 _/ _/ _/_/_/ _/_/_/_/ _/_/_/ Scott C. Gray (gray@nas.nasa.gov)
 _/_/ _/ _/ _/ _/_/ _/ _/ NASA Ames Research M/S 258-6
 _/ _/_/ _/_/_/_/ _/_/ _/_/_/_/ For PGP public key, send me mail
_/ _/ _/ _/ _/_/_/_/ _/ _/ with subject line of "PGP request".

AltStyle によって変換されたページ (->オリジナル) /