home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / text / textra / scripts / scoot.textra < prev    next >
Text File  |  1995-02-27  |  6KB  |  237 lines

  1.     /*******************************************************************
  2.      *   TEXTRA AREXX script -- Mike Haas, 1991, All Rights Reserved.  *
  3.      * Freely distributable ONLY as a component of the TEXTRA package. *
  4.      * This banner may not be removed or altered (improvements to the  *
  5.      *    actual program welcome).  Please document and send to me.    *
  6.      *        !!! PLACE THIS FILE IN YOUR REXX: DIRECTORY !!!          *
  7.      *******************************************************************/
  8.  
  9. /* SCOOT <num> {notab}
  10.  *
  11.  * Converted from INDENT.TEXTRA by Ron Charlton.
  12.  *
  13.  * SCOOT moves lines containing any portion of a selection
  14.  * (or the current cursor line) by <NUM> spaces.  All whitespace at the
  15.  * beginning of the line is replaced with the appropriate number of TABs
  16.  * and BLANKs (with Tab Width as specified in "Editing Preferences"),
  17.  * _or_ if NOTAB is specified, then only BLANKs will be used.
  18.  *
  19.  * If <num> is positive, the move is to the right. Negative, left.
  20.  *
  21.  * If <num> is not provided, then shift right by "Tab Width" as above.
  22.  * if <num> is "-" then shift left by "Tab Width" as above.
  23.  *
  24.  * Moving a line to the left will terminate if a line either runs out of
  25.  * characters or some character other than BLANK enters the first column.
  26.  *
  27.  * SCOOT 0    will "entab" the beginning of each line in a selection.
  28.  *
  29.  * Some examples:
  30.  *
  31.  * scoot  8        move 8 spaces to the right
  32.  * scoot -8        move 8 spaces to the left
  33.  * scoot  4        move 4 spaces to the right
  34.  * scoot -4        move 4 spaces to the left
  35.  * scoot  8 notab   move 8 spaces to the right, use BLANKs only
  36.  * scoot -8 notab   move 8 spaces to the left, use BLANKs only
  37.  * scoot  0        replace leading whitespace with equivalent TABs/BLANKS
  38.  * scoot        move line(s) Tab Width to the right
  39.  * scoot  -        move line(s) Tab Width to the left
  40.  *
  41.  * SCOOTing an entire 997-line C source file takes about 125 seconds.
  42.  * SCOOTTEST will check the same file in 29 seconds (Amiga 3000/25).
  43.  *
  44.  * NOTE: If you SCOOT by amounts other than the Tab Width from Editing
  45.  *       Preferences, TABs that are embedded in the text of a line may cause
  46.  *      the text to change length.  This will not damage C code, but may
  47.  *     be less than esthically pleasing.
  48.  */
  49.  
  50. /* 00001 mdh 10-nov-92  Added ability to cancel script */
  51. /* 00002 mdh 20-nov-92  check version (cause of 'CheckCancel') */
  52.  
  53. OPTIONS results
  54.  
  55. rex = 0; result = "NOTSUPPORTED"    /*00002*/
  56. textraversion
  57. parse var result maj min rex
  58. if (result == "NOTSUPPORTED") | (rex < 3) then do
  59.     notify "Textra V1.13 or later required for this script."
  60.     exit
  61. end
  62.  
  63.  
  64.  
  65. tabchar = d2c(9)
  66.  
  67.  
  68. /* figure out how far to move and which direction */
  69.  
  70. prefs TabWidth read
  71. tabwidth = result
  72.  
  73. parse upper arg num ' ' notab         /* get the argument(s) */
  74.  
  75. if (num == "") then
  76.     num = tabwidth        /* right by tab width from prefs */
  77.  
  78. else if (num == "-") then
  79.     num = -tabwidth        /* left by tab width from prefs */
  80.  
  81. else if (num == "NOTAB") then
  82.     do
  83.         /*  num is omitted and notab is specified */
  84.         notify "Scoot: You must specify a <num> if you specify {notab}."
  85.         exit
  86.     end
  87.  
  88.  
  89. /* figure out what which line(s) to work on */
  90.  
  91. get select position   /* get the select boundary, if any */
  92.  
  93. if (result == "NO SELECT") then   /* is nothing selected? */
  94.  
  95.     do
  96.         get cursor position   /* nothing selected, get cursor pos */
  97.         parse var result   cursx ' ' cursy
  98.         LinesSelected = 0   /* means 'just cursor' */
  99.     
  100.     end
  101.     
  102. else
  103.  
  104.     do
  105.         /* yes, there is a selection, get it's boundaries */
  106.         parse var result   startx ' ' starty ' ' endx ' ' endy
  107.         LinesSelected = (endy - starty)
  108.     
  109.         /* if only the 'eol' of the previous line is selected
  110.            (nothing on this line is actually included, i.e. x==0),
  111.            then don't include it.
  112.         */
  113.         if (endx > 0) then  LinesSelected = LinesSelected + 1
  114.     
  115.     end
  116.  
  117. if (LinesSelected == 0) then
  118.  
  119.     do
  120.         currline = cursy
  121.         gotoxy 0 cursy
  122.         call scootline
  123.         if (num > 0) then
  124.             gotoxy cursx+num cursy
  125.         else
  126.             do
  127.                 if (firstcharpos == 0) then
  128.                     gotoxy cursx cursy
  129.                 else
  130.                     gotoxy max(cursx+num,0) cursy
  131.             end
  132.     end
  133.  
  134. else
  135.  
  136.     do
  137.         currline = starty; numLeft = LinesSelected
  138.         do while (numLeft > 0)
  139.             do
  140.                 CheckCancel; if (result == CANCEL) then exit   /*00001*/
  141.                 gotoxy 0 currline
  142.                 call scootline
  143.                 currline = currline + 1
  144.                 numLeft = numLeft - 1
  145.             end
  146.         end
  147.         gotoxy 0 starty
  148.         selectto 0 starty+LinesSelected
  149.     end
  150.     
  151. exit
  152.  
  153.  
  154. scootline:
  155.  
  156.     get cursor char
  157.     if (result == "-1") then
  158.         /* empty line */
  159.         return
  160.     cursorchar = result
  161.     
  162.     if (cursorchar == ' ' | cursorchar == tabchar) then
  163.         do
  164.             hopto next char
  165.             if (result == "NOT FOUND") then
  166.                 /* at end of file */
  167.                 return
  168.         end
  169.  
  170.     get cursor position    
  171.     if (result == "SELECT") then
  172.         /* cannot (?) happen */
  173.         return
  174.  
  175.     parse var result   firstcharpos ' ' cursoryscoot
  176.     if (cursoryscoot ~= currline) then
  177.         /* nothing on currline */
  178.         return
  179.  
  180.     newoffset = firstcharpos + num
  181.     if (newoffset < 0) then
  182.         newoffset = 0
  183.     
  184.     /* select leading whitespace */
  185.     gotoxy 0 currline
  186.     selectto firstcharpos currline
  187.     if (num < 0) then killselect
  188.     
  189.  
  190.     /* figure what to replace leading whitespace with */
  191.     if (notab == "NOTAB") then
  192.         do
  193.             tabcount = 0
  194.                 spacecount = newoffset
  195.             end
  196.     else
  197.         do
  198.             tabcount   = newoffset %  tabwidth
  199.                 spacecount = newoffset // tabwidth
  200.         end
  201.  
  202.  
  203.     /* insert TABs/BLANKs at beginning of line */
  204.     text '"' || copies(tabchar, tabcount) || copies(' ', spacecount) || '"'
  205.  
  206. /*
  207. if (num < 0 & abs(num) > firstcharpos) then
  208.     do
  209.         notify "Scoot: Line " || currline+1 || " cannot move left far enough." 
  210.         exit
  211.     end
  212. */
  213. return
  214.  
  215. Debug: procedure
  216.     parse arg theString
  217.     get select position   /* get the select boundary, if any */
  218.     if (result == "NO SELECT") then   /* is nothing selected? */
  219.         do
  220.             get cursor position   /* nothing selected, get cursor pos */
  221.             parse var result   cursxdbg ' ' cursydbg
  222.             WasSelected = 0   /* means 'just cursor' */
  223.         end
  224.     else
  225.         do
  226.             /* yes, there is a selection, get it's boundaries */
  227.             parse var result   cursxdbg ' ' cursydbg ' ' endxdbg ' ' endydbg
  228.             WasSelected = 1
  229.         end
  230.     lastline
  231.     text theString
  232.     gotoxy cursxdbg cursydbg
  233.     if (WasSelected == 1) then   selectto endxdbg endydbg
  234. return
  235.  
  236.  
  237.