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 <achim@jat.sub.org>
# 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, <D-91227> W-8566 Leinburg | ,Oo. |
|    TEL: (0 91 20) 18 99 02 [from abroad: (+49) 9120 18 99 02] | (73) |