[comp.sys.amiga] CED Scripts - Right/Left Shift Block

mrr@mrsoft.Newport.RI.US (Mark Rinfret) (08/18/90)

Enclosed with this message are a couple of quick hacks I cooked up this
weekend. I often find myself adding or
removing a level of nesting from a block of code. The usual approach was
to insert/delete blanks on a line-by-line basis. The enclosed ARexx
scripts can be used with CygnusEd Professional to shift a selected block
of text left or right by one tab stop. They're pretty crude, but so far
they seem to do the job. Enjoy!

/************************************************************************
 *  left-shift-block.ced
 *
 *  This ARexx program for CygnusEd Pro moves the selected block left
 *  one tab position. 
 *
 *  Author:     Mark R. Rinfret, August 1990
 *
 ************************************************************************/

/* Allow CygnusEd to pass status variables */
options results

/* Tell ARexx to talk to CygnusEd */
address 'rexx_ced'

cr = '0A'x

/* Is a block marked? */

status 69

if result = -1 then do
    okay1 "No block marked for left-shift-block!"
    exit
end

beginLine = result + 1

/* Get current line number. */

status 57
endLine = result + 1

if endLine < beginLine then do
    temp = endLine
    endLine = beginLine
    beginLine = temp
end

saveBegin = beginLine

status 7                                /* Get the tab picture string. */
tabString = result

firstTab = pos('T',tabString,1)         /* Find first tab position. */

/* copy block */                        /* copy (unmark) the block */

newLine = ""

do while beginLine <= endLine
    jumpto beginLine 1
    status 55                           /* Get contents of current line. */
    oldLine = result
    crPos = pos('0A'x, oldLine)         /* Line contains newline char? */
    if crPos > 0 then do
        oldLine = delstr(oldLine, crPos, 1)
        end

    if length(oldLine) > 0 then do
        LeftShiftLine()                 /* newLine gets the result */
        delete to eol                   /* Delete old line of text. */
        text newLine                    /* Replace with new line of text. */
        end
    beginLine = beginLine + 1
end

exit

/* LeftShiftLine - shift a line left one tab position.
 * Global variables used:
 *      firstTab    - first tab stop position
 *      oldLine     - string containing original line
 *      newLine     - string to receive result
 */
      
LeftShiftLine: procedure expose firstTab oldLine newLine

    /* Watch out for zero-length strings. */

    oldLineLength = length(oldLine)
    if  oldLineLength = 0 then do
        newLine = ""
        return 0
    end

    /* Search for first non-blank character or tab stop. */

    blanks = 0
    spacePos = 1
    do spacePos = 1 to oldLineLength
        if spacePos > firstTab | substr(oldLine,spacePos,1) ~= " " then do
            blanks = spacePos - 1
            leave spacePos
        end
    end

    /* If the original line has embedded tabs, get cheap 'n dirty. Just 
     * delete the first tab we see. Actually, to do this with precision,
     * we should find the last tab that occurs before the first non-white
     * character and delete it. That approach would support variable tab
     * settings more accurately. An exercise for the reader... :-)
     */

    tabFound = pos('09'X, oldLine)

    if tabFound > 0 & tabFound < blanks then do
        newLine = delstr(oldLine,tabFound,1)
        return 0
    end

    /* There's a (remote) possibility that we've found a line of blanks. */

    if blanks > 0 then do
        newLine = delstr(oldLine, 1, blanks)
        end
    else do
        newLine = oldLine
        end
    return 0

---------------------------------------------------------------------------

/************************************************************************
 *  right-shift-block.ced
 *
 *  This ARexx program for CygnusEd Pro moves the selected block right
 *  one tab position. This script uses a very simplistic approach, simply
 *  inserting a tab character at the beginning of each line in the block.
 *  CED will automatically substitute spaces for the tab, if you have that
 *  feature enabled.
 *
 *  Author:     Mark R. Rinfret, August 1990
 *
 ************************************************************************/

/* Allow CygnusEd to pass status variables */
options results

/* Tell ARexx to talk to CygnusEd */
address 'rexx_ced'

tab = '09'x

/* Is a block marked? */

status 69

if result = -1 then do
    okay1 "No block marked for right-shift-block!"
    exit
end

beginLine = result + 1
saveBegin = beginLine

/* Get current line number. */

status 57
endLine = result + 1

if endLine < beginLine then do
    temp = endLine
    endLine = beginLine
    beginLine = temp
end

do while beginLine <= endLine
    jumpto beginLine     
    text tab
    beginLine = beginLine + 1
end

exit


--
#################################################################
# Mark R. Rinfret, MRSoft               Home: 401-846-7639      #
# mrr@mrsoft, galaxia!mrsoft!mrr        Work: 401-849-9930 x301 #
#################################################################