Nicholas Clark wrote:
I hate the way tcsh uses ^D for filename completion.
Unless, of course, your line is empty in which case ^D means EOF.
Around here, we use .*rc files we copy from each other (the files apparently
came from another planet since following the traces did not lead to a human
author). These files make tcsh complete things using Tab, which is a bit safer.
Why did I say "complete things" and not "filenames"? Because these
extraterrestrial .*rc files are too clever to complete filenames, mind you. They
complete whatever you (should) want, depending on the context. For example, for
ping they complete hostnames. For make, they complete nothing since make targets
are not files, and the aliens were smart enough to avoid parsing Makefiles.
What's that, you say? Actually most of make targets are files? Interesting. Oh,
and for gcc it won't complete anything so you don't screw yourself with `gcc -o
src.c`, and for rm it will complete *.c filenames, but not *.h. After all, it's
the interfaces that are important, not the implementation. You surely don't want
that accidentally deleted.
Of course there are wizards who don't count on the anonymous humanoids and hack
up vast software layers on top of tcsh (like having it complete `vi -t` from a
tags file using a perl one-liner) themselves. An encounter with a shell of a
mere mortal is a cultural shock for these people - without the aliases they
behave like a fish taken out of the water. There are only two choices: jump back
into the water (su - wizard) and drown the offender to get some water around (cp
~wizard/.*rc ~victim).
And I remember trying to work up various substitutions in t?csh involving
$ { and }, and getting them to interpolate at the right time. In a sane
shell it's easy enough - just get the right level of backslashes, by
backslashing your backslashes for each level of interpolation you wish to
pass through before substitution.
I beleive the purpose of the life of those souls doomed to programming in the
current incarnation is to Find the Right Level of Backslashes.
In the end I switched my .tschrc to set things up as appropriate then exec
bash. And for the things that needed sourcing, wrote a tsch wrapper that
dumped out the environment variables that it had created or changed, munged
via a real programming language [see previous paragraph] to a format that
bash could eval.
And then I was happy*.
I try to run most scripts trashing the environment in subshells, so that these
scripts don't mess with each other's precious env vars (for instance, if a
scripts sets $MODE and you have a Makefile getting a MODE argument, etc). And to
set tcsh env vars I use scripts which emit tcsh commands for setting the env
vars and eval them.
I don't switch to a different shell since I like people to feel comfortable when
they work with me on my machine. If I cared more about the shell features, this
would probably not make sence.