summaryrefslogtreecommitdiffstats
path: root/Util/helpfiles
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-04-15 18:05:35 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-04-15 18:05:35 +0000
commit32c2ebbaa5d7927f33ee0ecf98472a71cf902cf3 (patch)
tree212c29fe244d0222bab8efe3032e7fa965842945 /Util/helpfiles
parentInitial revision (diff)
downloadzsh-3.1.5.tar
zsh-3.1.5.tar.gz
zsh-3.1.5.tar.bz2
zsh-3.1.5.tar.lz
zsh-3.1.5.tar.xz
zsh-3.1.5.tar.zst
zsh-3.1.5.zip
zsh-3.1.5zsh-3.1.5
Diffstat (limited to 'Util/helpfiles')
-rwxr-xr-xUtil/helpfiles182
1 files changed, 182 insertions, 0 deletions
diff --git a/Util/helpfiles b/Util/helpfiles
new file mode 100755
index 000000000..472132b29
--- /dev/null
+++ b/Util/helpfiles
@@ -0,0 +1,182 @@
+#!/usr/local/bin/perl -- -*-perl-*-
+
+# helpfiles: make help files for Z-shell builtins from the manual entries.
+
+# Create help files for zsh commands in the current directory;
+# assumes no other files are present.
+# No overwriting check; `.' becomes `dot', `:' becomes `colon'.
+
+# Any command claiming to be `same as <foo>' or `equivalent to <foo>'
+# has its help file appended to the end of <foo>'s and replaced by a
+# link to <foo>. (Arguably the help file should be put at the start
+# instead.)
+
+# Takes one filename argument, or stdin: the zsh manual page as a plain
+# ascii file: `man zshbuiltins | colcrt -' (remember the -) should do
+# the trick.
+
+# If you don't have colcrt, try 'col -bx'. The x is necessary so that
+# spaces don't turn into tabs, which messes up the calculations of
+# indentation on machines which randomly wrap lines round to the
+# previous line (so you see what we're up against).
+
+# Example usage:
+# cd ~/zsh-3.0.0 # or wherever
+# mkdir Help
+# cd Help
+# man zsh | colcrt - | helpfiles
+# run-help() {
+# typeset zhelp=~/zsh-3.0.0/Help # or wherever
+# [[ $1 = . ]] && 1=dot
+# [[ $1 = : ]] && 1=colon
+# if [[ $1 = compctl ]]; then
+# man zshcompctl
+# elif [[ -f $zhelp/$1 ]]; then
+# ${=PAGER:-more} $zhelp/$1
+# else
+# man $1
+# fi
+# }
+# now <Esc>-h works for shell builtins.
+
+while (<>) {
+ last if /^\s*SHELL BUILTIN COMMANDS/;
+ /zshbuiltins/ && $zb++;
+ last if ($zb && /^\s*DESCRIPTIONS/);
+}
+
+$print = 0;
+
+sub namesub {
+ local($cmd) = shift;
+ if ($cmd =~ /^\w+$/) {
+ $cmd;
+ } elsif ($cmd eq '.') {
+ 'dot';
+ } elsif ($cmd eq ':') {
+ 'colon';
+ } else {
+ undef;
+ }
+}
+
+sub getsame {
+ local($_) = shift;
+ if (/same\s*as\s*(\S+)/i || /equivalent\s*to\s*(\S+)/i) {
+ local($name) = $1;
+ ($name =~ /[.,]$/) && chop($name);
+ return $name;
+ } else {
+ return undef;
+ }
+}
+
+sub newcmd {
+ local($_) = shift;
+ local($cmd);
+ # new command
+ if (defined($cmd = &namesub($_))) {
+ # in case there's something nasty here like a link..
+ unlink $cmd;
+ open (OUT, ">$cmd");
+ select OUT;
+ $print = 1;
+ } else {
+ $print = 0;
+ }
+}
+
+sub doprint {
+ local($_) = shift;
+
+ s/^$indentstr//o; # won't work if too many tabs
+ print;
+}
+
+while (<>) { last unless /^\s*$/; }
+
+/^(\s+)(\S+)/;
+$indentstr = $1;
+$indent = length($1);
+&newcmd($2);
+print if $print;
+
+BUILTINS: while (<>) {
+ next if /^\w/;
+
+ undef($undented);
+ if (/^\s*$/ || ($undented = (/^(\s*)/ && length($1) < $indent))) {
+ $undented && &doprint($_);
+ while (defined($_ = <>) && /(^\w)|(^\s*$)/) {
+ last BUILTINS if /^STARTUP\/SHUTDOWN FILES/;
+ }
+ if (/^\s*Page/) {
+ do {
+ $_ = <>;
+ } while (defined($_) && /^\s*$/);
+ if (/^\s*ZSHBUILTINS/) {
+ do {
+ $_ = <>;
+ } while (defined($_) && /^\s*$/);
+ }
+ }
+ # In zshall, the zshcompctl manual page comes after the
+ # builtins.
+ if (/ZSHCOMPCTL\(1\).*ZSHCOMPCTL\(1\)/) {
+ last BUILTINS;
+ }
+ if (/^(\s*)/ && length($1) < $indent) {
+ # This may be just a bug on the SGI, or maybe something
+ # more sinister (don\'t laugh, this is nroff).
+ s/^\s*/ /;
+ $defer = $_;
+ do {
+ $_ = <>;
+ } while (defined($_) && /^\s*$/);
+ last unless defined($_);
+ }
+ if (/^(\s+)(\S+)/ && length($1) == $indent) {
+ &newcmd($2);
+ } else {
+ print "\n";
+ }
+ if ($print) {
+ if (defined($defer)) {
+ chop;
+ &doprint("$_$defer");
+ undef($defer);
+ } else {
+ &doprint($_);
+ }
+ }
+ } else {
+ &doprint($_) if $print;
+ }
+}
+
+select STDOUT;
+close OUT;
+
+foreach $file (<*>) {
+ open (IN, $file);
+ if ($sameas = (&getsame($_ = <IN>) || &getsame($_ = <IN>))) {
+ defined($sameas = &namesub($sameas)) || next;
+# print "$file is the same as $sameas\n";
+ seek (IN, 0, 0);
+
+ # Copy this to base builtin.
+ open (OUT, ">>$sameas");
+ select OUT;
+ print "\n";
+ while (<IN>) { print; }
+ close IN;
+ select STDOUT;
+ close OUT;
+
+ # Make this a link to that.
+ unlink $file;
+ symlink ($sameas, $file);
+ }
+}
+
+__END__