home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR36 / KEXX.ZIP / SINDENT.KML < prev    next >
Text File  |  1989-12-20  |  6KB  |  165 lines

  1. *
  2. *  Smart autoindenting support - determine indentation based on context
  3. *   Some Template Logic to support matching braces and do-end pairs
  4. *
  5. :NUMENTER
  6. *
  7. 'Editv Getf Smart'; If Smart = "" Then Smart = 0
  8.  
  9. If \Smart Then Do
  10.    * Just do normal ENTER function
  11.    'Macro ENTER'
  12.    Exit
  13. End
  14.  
  15. LeftMargin = Margins.1()
  16.  
  17. 'Editv Getf CSupport'; If CSupport = "" Then CSupport = 0
  18. 'Editv Getf RexxSupport'; If RexxSupport = "" Then RexxSupport = 0
  19. 'Editv Getf Templates'; If Templates = "" Then Templates = 0
  20. If Templates = "" Then Templates = 0
  21. TabOffset.2 = 1
  22. TabCmd.2 = "Tab"
  23.  
  24. * Decipher Template Relative Tab Values
  25. If Templates Then Do
  26.    TabOffset.1 = 1; TabOffset.2 = 1; TabOffset.3 = 1
  27.    *Parse would help out handling this
  28.    'Editv Getf Indents'
  29.    Do XX = 1 to 3
  30.       YY = Word(Indents, XX); If YY \= "" Then TabOffset.XX = YY
  31.       TabCmd.XX = "Tab"
  32.       If TabOffset.XX < 0 Then Do
  33.          TabOffset.XX = - TabOffset.XX
  34.          TabCmd.XX = 'TabB'
  35.       End
  36.    End
  37. End
  38.  
  39. TabsBack = TabOffset.2
  40. If TabCmd.2 = "Tab"
  41.    Then TabsBackCmd = "TabB"
  42.    Else TabsBackCmd = "Tab"
  43. Drop XX YY Temp X
  44.  
  45. * Put cursor at first character in appropriate line
  46. If Command() Then 'SOS Current FirstChar'
  47. Else If EOF() Then 'SOS CUp FirstChar'
  48. Else If \Blank() Then 'SOS FirstChar'
  49.  
  50. * Set commonly referenced values
  51. C = Lower(Curline.3()); L = Length(C)
  52.  
  53. ***** C Language Support ****
  54. If CSupport Then Do
  55.    LastChar = SubStr(C, Max(L, 1))
  56.    W = Lower(Word(C, 1))
  57.    If SubStr(W, 1, 2) = '/*' | substr(c, max(l - 1, 1), 1) = '*/' Then Do
  58.       If \Tab() Then Do TabsBack; 'SOS' TabsBackCmd; End
  59.    End
  60.    Else If Pos(' 'W' ',' if else for while ') \= 0 Then Do
  61.       If LastChar = ')' | LastChar = '{' | C = 'else' Then Do
  62.          If LastChar = '{' & Templates Then Do
  63.             * Handle matching braces
  64.             'SOS SaveCol'
  65.             Do TabOffset.3; 'SOS' TabCmd.3; End
  66.             'SOS LineAdd'; 'Text }'; 'Up'; 'SOS RestoreCol'
  67.          End
  68.          Do TabOffset.2; 'SOS' TabCmd.2; End
  69.       End
  70.    End
  71.    Else If W = '}' | W = 'break;' Then Do TabsBack; 'SOS' TabsBackCmd; End
  72.    Else If W = 'switch' | (W = 'else' & LastChar \= ';') Then Do
  73.       Do TabOffset.2; 'SOS' TabCmd.2; End
  74.    End
  75.    Else If W = 'do' | LastChar = ')' | LastChar = ':' Then Do
  76.       Do TabOffset.2; 'SOS' TabCmd.2; End
  77.    End
  78.    Else If Lastchar = ';' Then Do
  79.       'Up'
  80.       L1 = Lower(Curline.3()); PrevLast = SubStr(L1, Max(Length(L1), 1))
  81.       W1 = Word(L1, 1)
  82.       If SubStr(L1, 1, Cursor.4() - 1) \= '' & SubStr(L1, 1, 1) = '' Then
  83.          If Prevlast \= '{' & Prevlast \= ':' Then Do
  84.             Do TabsBack; 'SOS' TabsBackCmd; End
  85.          End
  86.          Else Nop
  87.       Else If Pos(' 'W1' ', ' if while else for ') \= 0 Then Do
  88.          Do TabsBack; 'SOS' TabsBackCmd; End
  89.       End
  90.       'Down'
  91.    End
  92.    Else If Word(C, 1) = '{' & Templates Then Do
  93.       Do TabsBack; 'SOS' TabsBackCmd; End
  94.       'SOS SaveCol'
  95.       Do TabOffset.1; 'SOS' TabCmd.1; End
  96.       'Set Margins' Cursor.4() '*'; 'LeftAdjust'; 'SOS RestoreCol'
  97.       Do TabOffset.3; 'SOS' TabCmd.3; End
  98.       'SOS LineAdd'; 'Text }'; 'Up'; 'SOS RestoreCol'
  99.       Do TabOffset.2; 'SOS' TabCmd.2; End
  100.    End
  101. End
  102.  
  103. ***** KEX KML REX CMD RXT ****
  104. Else If RexxSupport Then Do
  105.    * note: multiple IFs are used so everything fits in 80 columns
  106.    If SubStr(C, Max(L - 3, 1)) = 'then' | C = 'else' Then Do
  107.       Do TabOffset.2; 'SOS' TabCmd.2; End
  108.    End
  109.    Else If SubStr(C, Max(L-1, 1), 2) = 'do' | Word(C, 1) = 'do' Then Do
  110.       If Templates Then Do
  111.          CC = ' 'Curline.3()' '; I = ' Do  DO  do  '; J = 'End END end '
  112.          Matching = 'end'
  113.          Do K = 1 To 9 By 4
  114.             If Pos(SubStr(I, K, 4), CC) \= 0 Then Matching = SubStr(J, K, 3)
  115.          End
  116.          'SOS SaveCol'
  117.          Do TabOffset.3; 'SOS' TabCmd.3; End
  118.          'SOS LineAdd'; 'Text' Matching; 'Up'; 'SOS RestoreCol'
  119.       End
  120.       Do TabOffset.2; 'SOS' TabCmd.2; End
  121.    End
  122.    Else If Pos('then do', C) \= 0 | Pos('else do', c) \= 0 Then Do
  123.       If Templates Then Do
  124.          CC = ' 'Curline.3()' '; I = ' Do  DO  do  '; J = 'End END end '
  125.          Matching = 'end'
  126.          Do K = 1 To 9 By 4
  127.             If Pos(SubStr(I, K, 4), CC) \= 0 Then Matching = SubStr(J, K, 3)
  128.          End
  129.          'SOS SaveCol'
  130.          Do TabOffset.3; 'SOS' TabCmd.3; End
  131.          'SOS LineAdd'; 'Text' Matching; 'Up'; 'SOS RestoreCol'
  132.       End
  133.       Do TabOffset.2; 'SOS' TabCmd.2; End
  134.    End
  135.    Else If Word(C, 1) = 'if' Then Do TabOffset.2; 'SOS' TabCmd.2; End
  136.    Else If Word(C, 1) = 'select' Then Do TabOffset.2; 'SOS' TabCmd.2; End
  137.    Else If Word(C, 1) = 'when'Then Do TabOffset.2; 'SOS' TabCmd.2; End
  138.    Else If Word(C, 1) = 'otherwise' Then Do TabOffset.2; 'SOS' TabCmd.2; End
  139.    Else If Word(C, 1) = 'end' & Column.1() \= Word(Tabs.1(), 1) Then Do
  140.       Do TabsBack; 'SOS' TabsBackCmd; End
  141.    End
  142.    Else If TOF() Then 'SOS FirstChar'
  143.    Else Do
  144.       'Up'
  145.       C = Lower(CurLine.3())
  146.       If SubStr(C, Max(Length(C) - 3, 1)) = 'then' | C = 'else' Then Do
  147.          Do TabsBack; 'SOS' TabsBackCmd; End
  148.       End
  149.       Else If Word(c, 1) = 'otherwise' & Word(c, 2) = '' Then Do
  150.          Do TabsBack; 'SOS' TabsBackCmd; End
  151.       End
  152.       'Down'
  153.    End
  154. End
  155.  
  156. ***** COMMON HANDLING ****
  157. 'Set Margins' Cursor.4() '*'
  158. 'SOS LineAdd Marginl'
  159.  
  160. * If Regular Indenting isn't being run, then unset the left margin setting
  161. 'Editv Getf Regular'; If Regular = "" Then Regular = 0
  162. If \Regular Then 'Set Margins' LeftMargin '*'
  163.  
  164. Exit
  165.