Xref: feenix.metronet.com alt.sources:1339 Path: feenix.metronet.com!news.utdallas.edu!wupost!uunet!math.fu-berlin.de!mailgzrz.TU-Berlin.DE!cs.tu-berlin.de!fauern!faulrs!jat!not-for-mail From: achim@jat.sub.org (Joachim Astel) Newsgroups: alt.sources Subject: tsh-1.0 - tabulator shifter in Perl Date: 7 Jun 1993 11:53:27 +0200 Organization: Mail/News Server Leinburg Lines: 72 Message-ID: <1uv36n$7q8@jat.sub.org> NNTP-Posting-Host: jat.jat.sub.org Suppose you've set a shiftwidth of 4 within vi, and you're missing the '<<' and '>>' operations, because your vi is rather dumb about these settings. So here's a small perl program (or hack ;-)) doing that task. In "vi", you can mark the beginning a text block with >>> ma <<< and pipe it to tsh by typing >>> !'atsh <<< at the end of your text block. As a feature, spaces are shortened to tabs (but only at the beginning of a line). So "tsh" without arguments is a mode that elliminates redundant whitespace, and replaces it by the tabulator character... Instead of >>> !'atsh <<< you could also type >>> !'atsh 1 <<< or give any other option (see the usage at the beginning of the perl script). tsh 1 - shifts to the right tsh 2 - shifts to the right twice tsh 3 - shifts to the right three times [... and so on] tsh -1 - shifts to the left tsh -2 - shifts to the twice [... and so on] This program is in the public domain. Have fun.... And please flame me if there's already another program named "tsh" out there. #!/usr/bin/perl # tsh.pl - tab shifter V1.0 written 1993 by Joachim Astel # Usage: # tsh [-sw=4] [-ts=8] [-+]shlshr [ file(s) ... ] $shiftwidth = 4; $tabstop = 8; $shlshr = 0; foreach $arg (@ARGV) { if ($arg =~ /^-ts=?(.*)/) { $tabstop = $1; shift; } elsif ($arg =~ /^-sw=?(.*)/) { $shiftwidth = $1; shift; } elsif ($arg =~ /^\+?(\d+)$/) { $shlshr = $1; shift; } elsif ($arg =~ /^-(\d+)$/) { $shlshr = -$1; shift; } else { break; } } while (<>) { $pos = 0; do { $oldpos = $pos; if (s/^ //) { # space $pos++; } elsif (s/^\t//) { # tab $pos = int (($pos + $tabstop) / $tabstop) * $tabstop; } } while ($oldpos != $pos); $pos += ($shlshr * $shiftwidth); while ($pos - $tabstop >= 0) { print "\t"; $pos -= $tabstop; } print ' ' x $pos if $pos > 0; print $_; } -- | E-MAIL: jmastel@informatik.uni-erlangen.de, achim@jat.sub.org | v y | | ADDR: Joachim Astel, Wiesenweg 4, W-8566 Leinburg | ,Oo. | | TEL: (0 91 20) 18 99 02 [from abroad: (+49) 9120 18 99 02] | (73) |