sh vs. csh format script (was: Re: Vi)

H.Dr.Ehling eh at astbe.UUCP
Sun Jul 23 06:42:50 AEST 1989


In article <2760 at piraat.cs.vu.nl> maart at cs.vu.nl (Maarten Litmaath) writes:

    >Well, here's a Bourne shell script:
    > .....

That script  truly  is  smart  in  demonstrating  what  can be done with
filedescriptors in sh and it's a bit cruel in it's  commentless  placing
the of  `rm' (I had to learn it the hard way that open files never die).
Anyway, I'm really grateful having seen it. 

But `shift_lines', is on no *IX I happen to  know.   And  although  a  C
Programm could  easily  be  written, let me hint to vi's Shift Operators
"<" and ">". 

"<" shifts  at  most `shiftwidth' (sw) blanks to the left (it transposes
tabs before doing that) and can be used to remove offset  causing  nroff
to break  filling.  But  You will not loose nonwhite text and deliberate
indents greater than `sw' will leave a few blanks, so nroff  will  still
break at that. 

The script below shows, how to use more of nroffs commands, so  You  can
set indentation and linelength:
    (which actually is more of a right margin, as these lines show. They
    have been  formatted  with  `3!!fill  4', as the text originally was
    (and incidently still is) 3 lines. 
As there  usually  has  to  be  reformatting,  the  script uses 'tr', to
squeeze out fill blanks from a previous formatting run.  Otherwise  gaps
will became  always bigger, as nroff respects existing blanks (except at
the end of a line, I believe). 

    A final  remark:  I  never saw it documented, but vi remembers
    the last shel command. So after having said `!}fill 4 66'  You
    just have to say `!}!' for the next paragraph or `!G!' for the
    remainder of the buffer. 

(But I  did'nt  do  that,  as  filled  programms  are  so  hard to
understand!)
-------------------------------------------------------
: # << this substitute (: == `noop') for #\!/bin sh works
#      everywhere, I believe

# usage: fill [indent] [linelength]
# To be used with vi, e.g.:

# se sw=4 # Set in Your EXINIT, just once; then
	  # Iff there is leading WS to be removed:
# <}      # this shifts Paragraph by (at most) sw Blanks

# !}fill 2 66  (def: 0 72)

indent=${1-0}
llength=${2-72}

temp_file=/tmp/foobar.$$
umask 077

exec 3>&1 > $temp_file 4< $temp_file
/bin/rm $temp_file

echo ".hy 0
.ll $llength
.in $indent"

tr -s ' ' ' ' # To squeeze blanks

nroff <&4 >&3
-------------------------------------------------------

Have fun!
-------------------------------------------------------
-- 
Hans-Juergen Ehling     |  From Europe:  eh at astbe.uucp
                        |  From USA:     ...!pyramid!tub!astbe!eh
GEI Software-Technik    |  Voice:        +49 30/8282497



More information about the Comp.unix.questions mailing list