home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / mlepm.zip / emode.e < prev    next >
Text File  |  1995-08-26  |  9KB  |  294 lines

  1. /* emode.e - this is the E part of the E mode package        940522 */
  2.  
  3. /* The enter and space bar keys have been defined to do             */
  4. /* specific E3 editing features.                                    */
  5.  
  6. /* 940522: Martin Lafaix (lafaix@sophia.inria.fr)                   */
  7. /*                                                                  */
  8. /*  .A new function : E_mode.  It sets current editing mode to      */
  9. /*   be E mode.                                                     */
  10. /*                                                                  */
  11. /* 940510: Martin Lafaix (lafaix@sophia.inria.fr)                   */
  12. /*                                                                  */
  13. /*  .Adapting ekeys.e to hooks.                                     */
  14. /*                                                                  */
  15.  
  16. /* This file is an adaptation of the EPM 'ekeys.e' E Macro file     */
  17.  
  18. compile if not defined(BLACK)
  19. const
  20.    my_e_keys_is_external = 1
  21.    INCLUDING_FILE = 'EMODE.E'
  22.    EXTRA_EX = 0
  23.    include 'stdconst.e'
  24. compile else
  25.    const my_e_keys_is_external = 0
  26. compile endif
  27.  
  28. compile if my_e_keys_is_external = 1
  29.    E_TABS = 3
  30.    E_MARGINS = 1 MAXMARGIN 1
  31.    WANT_CUA_MARKING = 'SWITCH'
  32.    ASSIST_TRIGGER = 'ENTER'
  33.    ENHANCED_ENTER_KEYS = 1
  34.    ENTER_ACTION   = 'ADDATEND'
  35.    c_ENTER_ACTION = 'ADDLINE'
  36.    SYNTAX_INDENT = 3
  37. compile endif
  38.  
  39. compile if INCLUDING_FILE <> 'EXTRA.E'  -- Following only gets defined in the base
  40.  
  41. definit
  42. compile if my_e_keys_is_external = 0
  43.    'maddhook load_hook e_load_hook'
  44. compile endif
  45.  
  46. defc E_mode
  47.    keys my_e_keys
  48.    'msetfilemode E mode'
  49.  
  50. defc e_load_hook
  51.    universal load_ext
  52.    universal load_var
  53.    if load_ext='E' then
  54.  compile if E_TABS <> 0
  55.       if not (load_var // 2) then  -- 1 would be on if tabs set from EA EPM.TABS
  56.          'tabs' E_TABS
  57.       endif
  58.  compile endif
  59.  compile if E_MARGINS <> 0
  60.       if not (load_var%2 - 2*(load_var%4)) then  -- 2 would be on if tabs set from EA EPM.MARGINS
  61.          'ma'   E_MARGINS
  62.       endif
  63.  compile endif
  64.       'E_mode'
  65.    endif
  66.  
  67. compile if WANT_CUA_MARKING & EPM
  68.  defkeys my_e_keys clear
  69. compile else
  70.  defkeys my_e_keys
  71. compile endif
  72.  
  73. def space=
  74.    universal expand_on
  75.    if expand_on then
  76.       if  not my_e_first_expansion() then
  77.          keyin ' '
  78.       endif
  79.    else
  80.       keyin ' '
  81.    endif
  82.    undoaction 1, junk                -- Create a new state
  83.  
  84. compile if ASSIST_TRIGGER = 'ENTER'
  85. def enter=
  86.  compile if ENHANCED_ENTER_KEYS & ENTER_ACTION <> ''
  87.    universal enterkey
  88.  compile endif
  89. compile else
  90. def c_enter=
  91.  compile if ENHANCED_ENTER_KEYS & c_ENTER_ACTION <> ''
  92.    universal c_enterkey
  93.  compile endif
  94. compile endif
  95.    universal ML_autoindent
  96.    universal expand_on
  97.  
  98.    if expand_on then
  99.       if not my_e_second_expansion() then
  100. compile if ASSIST_TRIGGER = 'ENTER'
  101.  compile if ENHANCED_ENTER_KEYS & ENTER_ACTION <> ''
  102.          call enter_common(enterkey)
  103.  compile else
  104.          call my_enter()
  105.  compile endif
  106. compile else  -- ASSIST_TRIGGER
  107.  compile if ENHANCED_ENTER_KEYS & c_ENTER_ACTION <> ''
  108.          call enter_common(c_enterkey)
  109.  compile else
  110.          call my_c_enter()
  111.  compile endif
  112. compile endif -- ASSIST_TRIGGER
  113.          if ML_autoindent then
  114.             call indent_pos()
  115.          endif
  116.       endif
  117.    else
  118. compile if ASSIST_TRIGGER = 'ENTER'
  119.  compile if ENHANCED_ENTER_KEYS & ENTER_ACTION <> ''
  120.       call enter_common(enterkey)
  121.  compile else
  122.       call my_enter()
  123.  compile endif
  124. compile else  -- ASSIST_TRIGGER
  125.  compile if ENHANCED_ENTER_KEYS & c_ENTER_ACTION <> ''
  126.       call enter_common(c_enterkey)
  127.  compile else
  128.       call my_c_enter()
  129.  compile endif
  130. compile endif -- ASSIST_TRIGGER
  131.    endif
  132.  
  133. /* Taken out, interferes with some people's c_enter. */
  134. ;def c_enter=   /* I like Ctrl-Enter to finish the comment field also. */
  135. ;   getline line
  136. ;   if pos('/*',line) then
  137. ;      if not pos('*/',line) then
  138. ;         end_line;keyin' */'
  139. ;      endif
  140. ;   endif
  141. ;   down;begin_line
  142.  
  143. def c_x=       /* Force expansion if we don't have it turned on automatic */
  144.    if not my_e_first_expansion() then
  145.       call my_e_second_expansion()
  146.    endif
  147.  
  148. defc indent_e_line
  149.    call indent_pos()
  150. compile endif  -- EXTRA
  151.  
  152. compile if not EXTRA_EX or INCLUDING_FILE = 'EXTRA.E'  -- Following gets defined in EXTRA.EX if it's being used
  153. defproc my_e_first_expansion
  154.    /*  up;down */
  155.    retc=1
  156.    if .line then
  157.       getline line
  158.       line=strip(line,'T')
  159.       w=line
  160.       wrd=upcase(w)
  161.       if wrd='FOR' then
  162.          replaceline w' =  to'
  163.          insertline substr(wrd,1,length(wrd)-3)'endfor',.line+1
  164.          if not insert_state() then insert_toggle
  165.          endif
  166.          keyin ' '
  167.       elseif wrd='IF' then
  168.          replaceline w' then'
  169.          insertline substr(wrd,1,length(wrd)-2)'else',.line+1
  170.          insertline substr(wrd,1,length(wrd)-2)'endif',.line+2
  171.          if not insert_state() then insert_toggle
  172.              call fixup_cursor()
  173.          endif
  174.          keyin ' '
  175.       elseif wrd='ELSEIF' then
  176.          replaceline w' then'
  177.          if not insert_state() then insert_toggle
  178.              call fixup_cursor()
  179.          endif
  180.          keyin ' '
  181.       elseif wrd='WHILE' then
  182.          replaceline w' do'
  183.          insertline substr(wrd,1,length(wrd)-5)'endwhile',.line+1
  184.          if not insert_state() then insert_toggle
  185.              call fixup_cursor()
  186.          endif
  187.          keyin ' '
  188.       elseif wrd='LOOP' then
  189.          replaceline w
  190.          insertline substr(wrd,1,length(wrd)-4)'endloop',.line+1
  191.          call einsert_line()
  192.          .col=.col+SYNTAX_INDENT
  193. ;      elseif wrd='DO' then
  194. ;         replaceline w
  195. ;         insertline substr(wrd,1,length(wrd)-2)'enddo',.line+1
  196. ;         keyin ' '
  197.       else
  198.          retc=0
  199.       endif
  200.    else
  201.       retc=0
  202.    endif
  203.    return retc
  204.  
  205. defproc my_e_second_expansion
  206.    retc=1
  207.    if .line then
  208.       getline line
  209.       parse value line with wrd rest
  210.       firstword=upcase(wrd)
  211.       if firstword='FOR' then
  212.          /* do tabs to fields of pascal for statement */
  213.          parse value upcase(line) with a '='
  214.          if length(a)>=.col then
  215.             .col=length(a)+3
  216.          else
  217.             parse value upcase(line) with a 'TO'
  218.             if length(a)>=.col then
  219.                .col=length(a)+4
  220.             else
  221.                call einsert_line()
  222.                .col=.col+SYNTAX_INDENT
  223.             endif
  224.          endif
  225.       elseif firstword='IF' or firstword='ELSEIF' or firstword='WHILE' or firstword='LOOP' or firstword='DO' or firstword='ELSE' then
  226.          if pos('END'firstword, upcase(line)) then
  227.             retc = 0
  228.          else
  229.             call einsert_line()
  230.             .col=.col+SYNTAX_INDENT
  231.             if firstword='LOOP' | firstword='DO' then
  232.                insertline substr(line,1,.col-SYNTAX_INDENT-1)'end'lowcase(wrd), .line+1
  233.             endif
  234.          endif
  235.       elseif pos('/*',line) then
  236. ;     elseif substr(firstword,1,2)='/*' then  /*see speed requirements */
  237.          if not pos('*/',line) then
  238.             end_line;keyin' */'
  239.          endif
  240.          call einsert_line()
  241.       else
  242.          retc=0
  243.       endif
  244.    else
  245.       retc=0
  246.    endif
  247.    return retc
  248.  
  249. defproc indent_pos  /* Indent current line */
  250.    if .line then
  251.       oldline=.line
  252.       .line=.line-1
  253.       while .line & textline(.line)='' do
  254.          .line=.line-1
  255.       endwhile
  256.       if .line then
  257.          call pfirst_nonblank()
  258.          getline line
  259.          line=strip(line,'T')
  260.          parse value line with wrd rest
  261.          i=verify(wrd,'({:','M',1)-1
  262.          if i<=0 then i=length(wrd) endif
  263.          firstword=upcase(substr(wrd,1,i))
  264.          if firstword='FOR' then
  265.             .col=.col+SYNTAX_INDENT
  266.          elseif firstword='IF' or firstword='ELSEIF' or firstword='WHILE' or firstword='LOOP' or firstword='DO' or firstword='ELSE' then
  267.             if pos('END'firstword, upcase(line)) = 0 then
  268.                .col=.col+SYNTAX_INDENT
  269.             endif
  270.          endif
  271.       else
  272.          .col=1
  273.       endif
  274.       newpos=.col
  275.       .line=oldline
  276.       call pfirst_nonblank()
  277.       if .col<newpos then
  278.          for i=1 to newpos-.col
  279.             keyin ' '
  280.          endfor
  281.       elseif .col>newpos then
  282.          delta=.col-newpos; .col=.col-delta
  283.          for i=1 to delta
  284.             deletechar
  285.          endfor
  286.       endif
  287.    endif
  288.  
  289. compile endif  -- EXTRA
  290.  
  291. compile if EVERSION >= 6
  292.    EA_comment 'This is an E editing mode, with automatic syntax expansion and indentation'
  293. compile endif
  294.