{{{F fun/regions
:::F fun/regions
}}}
{{{  fold-error
( deffun fold-error
   ( add-mode-view
     bell
     visible-bell
     switch-to-edit-mode
     @if-using (SCR-OFF)
        screen-on
        redraw-display
     @fi
     message-exit (M_FOLDERR ", "  "switch "  "to "  "edit-mode )
   )
)
}}}
{{{  change-position
( deffun change-position
   ( set-end-mark
     go-start-mark
     change-mark-counters
   )
)
}}}
{{{  go-local-line
( deffun go-local-line
   ( para
     prompt-counter go-line-arg ( M_GOTO "? "  )
     moves
     go-line
   )
)
}}}
{{{  mov-check-view
( deffun mov-check-view
   ( if counter>0 edit-view ( "  ) fi
   )
)
}}}
{{{  kill-mark-region
( deffun kill-mark-region
   ( mov-check-view
     @if-using (SCR-OFF)
        screen-off
     @fi
     set-end-mark
     delete-mode-view
     fold-region
     if counter>0 folderr ( fold-error ) fi
     {{{  kill all lines
     enter-fold
     while not(test-bottom)
      ( kill-line- )
     exit-fold
     }}}
     unfold-fold
     if and(counter>0 start-splitted,counter>0 end-splitted)
      ( combine-splitted-parts-start )
     fi
     add-mode-view
     @if-using (SCR-OFF)
        screen-on
        redraw-display
     @fi
     set-counter command 1
     switch-to-edit-mode
   )
)
}}}
{{{  delete-mark-region
( deffun delete-mark-region
   ( mov-check-view
     @if-using (SCR-OFF)
       screen-off
     @fi
     set-end-mark
     delete-mode-view
     fold-region
     if counter>0 folderr ( fold-error ) fi
     delete-line
     if and(counter>0 start-splitted,counter>0 end-splitted)
      ( combine-splitted-parts-start )
     fi
     add-mode-view
     set-counter command 1
     switch-to-edit-mode
     @if-using (SCR-OFF)
       screen-on
       redraw-display
     @fi
   )
)
}}}
{{{  copy-mark-region
( deffun copy-mark-region
   ( mov-check-view
     @if-using (SCR-OFF)
       screen-off
     @fi
     set-end-mark
     {{{  store change-status
     if test-file-changed
      ( set-counter was-changed 1 )
     else
      ( set-counter was-changed 0 )
     fi
     }}}
     delete-mode-view
     {{{  double the marked region
     fold-region
     if counter>0 folderr ( fold-error ) fi
     double-line
     unfold-fold
     previous-line
     unfold-fold
     }}}
     {{{  maybe combine splitted start
     if counter>0 start-splitted ( combine-splitted-parts-start ) fi
     }}}
     {{{  maybe combine both splitted ends
     if counter>0 end-splitted
      {{{  combine both end-lines
      ( combine-splitted-parts-end
        set-counter end-y +(end-y -(end-y start-y))
        {{{  go-line end-y
        set-counter go-line-arg end-y
        go-line
        }}}
        end-of-line
        set-counter end-x store-pos
        combine-splitted-parts-end
      )
      }}}
     fi
     }}}
     add-mode-view
     set-counter command 1
     switch-to-edit-mode
     @if-using (SCR-OFF)
       screen-on
       redraw-display
     @fi
   )
)
}}}
{{{  copy-kill-mark-region
( deffun copy-kill-mark-region
   ( @if-using (SCR-OFF)
       screen-off
     @fi
     set-end-mark
     {{{  store change-status
     if test-file-changed
      ( set-counter was-changed 1 )
     else
      ( set-counter was-changed 0 )
     fi
     }}}
     {{{  copy kill the region
     delete-mode-view
     fold-region
     if counter>0 folderr ( fold-error ) fi
     {{{  kill all lines
     enter-fold
     while not(test-bottom)
      ( copy-to-kill-buffer-
        next-line
      )
     exit-fold
     }}}
     unfold-fold
     }}}
     {{{  maybe combine start
     if counter>0 start-splitted
      ( combine-splitted-parts-start )
     fi
     }}}
     {{{  maybe combine end
     if counter>0 end-splitted
      ( combine-splitted-parts-end )
     fi
     }}}
     add-mode-view
     {{{  maybe set file unchanged again
     if counter-0 was-changed
      ( set-file-unchanged )
     fi
     }}}
     set-counter command 1
     switch-to-edit-mode
     @if-using (SCR-OFF)
       screen-on
       redraw-display
     @fi
   )
)
}}}
{{{  fold-mark-region
( deffun fold-mark-region
   ( mov-check-view
     @if-using (SCR-OFF)
       screen-off
     @fi
     set-end-mark
     delete-mode-view
     {{{  create the fold
     if and(counter-0 -(start-x end-x) counter-0 -(start-y end-y))
      ( create-fold create-fold )
     else
      ( fold-region
        if counter>0 folderr ( fold-error ) fi
      )
     fi
     }}}
     add-mode-view
     set-counter command 1
     switch-to-edit-mode
     @if-using (SCR-OFF)
       screen-on
       redraw-display
     @fi
   )
)
}}}
{{{  indent-region macros
{{{  indent-region-sub
( deffun indent-region-sub
   ( delete-mode-view
     set-end-mark
     if counter-0 command
      ( set-counter irsx start-x
        set-counter irsy start-y
        set-counter irex end-x
        set-counter irey end-y
      )
     else
      ( set-counter start-x irsx
        set-counter start-y irsy
        set-counter end-x irex
        set-counter end-y irey
      )
     fi
     indent-region
     add-mode-view
     if counter>0 folderr ( switch-to-edit-mode ) fi
     set-counter command 1
   )
)
}}}
{{{  space-in-region
( deffun space-in-region
   ( set-counter x 1
     indent-region-sub
   )
)
}}}
{{{  tab-in-region
( deffun tab-in-region
   ( if counter-0 hard-tab
      ( set-counter x 8 )
     else
      ( set-counter x hard-tab )
     fi
     indent-region-sub
   )
)
}}}
{{{  tab-out-region
( deffun tab-out-region
   ( set-counter x -1
     indent-region-sub
   )
)
}}}
{{{  tab-var-region
( deffun tab-var-region
   ( para
     prompt-counter x ( "shift-width-spaces "? "  )
     moves
     if counter-0 x
      ( key-not-bound-macro )
     else
      ( indent-region-sub )
     fi
   )
)
}}}
}}}
{{{  unkill-unfolded-at-position
{{{  splitt-put-line
( defvar ( y cy ) )
( deffun splitt-put-line
   ( if test-text
      {{{  maybe splitt the text-line
      (
        if and(test-text,
               {{{  cursor inside a line
               or(test-end-line,
                  pre
                   ( set-counter y store-pos
                     beginning-of-line
                     set-counter cy store-pos
                     goto-counter y
                   )
                   test-behind-counter cy
                 )
               }}}
              )
         {{{  splitt
         (
           set-counter start-x store-pos
           set-counter start-y store-line
           newline-and-indent
           set-counter end-x store-pos
           set-counter end-y store-line
         )
         }}}
        else
         {{{  don't splitt
         ( set-counter start-y 0 )
         }}}
        fi
      )
      }}}
     else
      {{{  else unkill before the line
      ( beginning-of-line
        set-counter start-y 0
      )
      }}}
     fi
   )
)
( undeclare ( y cy ) )
}}}

( deffun unkill-unfolded-at-position
   ( local
      ( start-x start-y end-x end-y )
      ( @if-using (SCR-OFF)
          screen-off
        @fi
        delete-mode-view
        splitt-put-line
        insert-folded-kill-buffer-
        next-line
        set-counter end-y store-line
        previous-line
        unfold-fold
        {{{  maybe make start of unkill ok
        if and(counter>0 start-y,test-text)
         ( beginning-of-line
           "$
           previous-line
           end-of-line
           while test-char "  ( delete-character )
           delete-character
           "  ;
           set-counter end-y +(end-y -3)
         )
        else
         ( set-counter end-y +(end-y -2) )
        fi
        }}}
        {{{  maybe make end of put ok
        if counter>0 start-y
         (
           {{{  go-line end-y
           set-counter go-line-arg end-y
           go-line
           }}}
           previous-line
           if test-text
            {{{  combine lines
            ( next-line
              goto-counter end-x
              "$
              previous-line
              end-of-line
              while test-char "  ( delete-character )
              delete-character "  ;
            )
            }}}
           fi
         )
        fi
        }}}
        set-counter command 1
        switch-to-edit-mode
        @if-using (SCR-OFF)
          screen-on
          redraw-display
        @fi
      )
   )
)
}}}
{{{  help-
( deffun help-
   ( set-counter enable-move-para 1
     help
     while in-prompt
      ( prompt-char-counter x ( "[ M_ANY_Q "] ) insert-ascii x )
     set-counter enable-move-para 0
   )
)
}}}
{{{  describe-bindings-
( deffun describe-bindings-
   ( set-counter enable-move-para 1
     describe-bindings
     while in-prompt
      ( prompt-char-counter x ( "[ M_ANY_Q "] ) insert-ascii x )
     set-counter enable-move-para 0
   )
)
}}}
{{{  move-mark-region
( deffun move-mark-region
   ( if counter-0 moving-line
      {{{  fold region and move to move-buffer
      ( @if-using (SCR-OFF)
           screen-off
        @fi
        set-end-mark
        delete-mode-view
        fold-region
        if counter>0 folderr ( fold-error ) fi
        if counter-0 -(start-y end-y) ( unfold-fold ) fi
        move-line
        set-counter moving-line 1
        set-user-mode ML
        if and(counter>0 start-splitted,counter>0 end-splitted)
         ( combine-splitted-parts-start )
        fi
        add-mode-view
        @if-using (SCR-OFF)
           screen-on
           redraw-display
        @fi
        set-counter command 1
        switch-to-edit-mode
      )
      }}}
     else
      {{{  insert fold to position
      ( local
         ( start-x start-y end-x end-y )
         ( @if-using (SCR-OFF)
             screen-off
           @fi
           set-start-mark
           set-end-mark
           delete-mode-view
           splitt-put-line
           move-line
           set-counter moving-line 0
           reset-user-mode ML
           next-line
           set-counter end-y store-line
           previous-line
           {{{  maybe make start of unkill ok
           if and(counter>0 start-y,test-text)
            ( beginning-of-line
              "$
              previous-line
              end-of-line
              while test-char "  ( delete-character )
              delete-character
              "  ;
              set-counter end-y +(end-y -1)
            )
           fi
           }}}
           {{{  maybe make end of put ok
           if counter>0 start-y
            (
              {{{  go-line end-y
              set-counter go-line-arg end-y
              go-line
              }}}
              previous-line
              if test-text
               {{{  combine lines
               ( next-line
                 goto-counter end-x
                 "$
                 previous-line
                 end-of-line
                 while test-char "  ( delete-character )
                 delete-character "  ;
               )
               }}}
              fi
            )
           fi
           }}}
           set-counter command 1
           switch-to-edit-mode
           @if-using (SCR-OFF)
             screen-on
             redraw-display
           @fi
         )
      )
      }}}
     fi
   )
)
}}}
{{{  incremental-search-forward-
( deffun incremental-search-forward-
   ( set-counter enable-move-para 1
     incremental-search-forward
   )
)
}}}
{{{  switch-to-edit-mode-insert
( deffun switch-to-edit-mode-insert
   ( delete-mode-overwrite
     switch-to-edit-mode
   )
)
}}}
{{{  switch-to-edit-mode-overwrite
( deffun switch-to-edit-mode-overwrite
   ( add-mode-overwrite
     switch-to-edit-mode
   )
)
}}}
{{{  file-menu-
( deffun file-menu-
   ( if in-prompt ( return-from-macro ) fi
     set-counter x 0
     para
     menu-counter x ( "bindings "  "help "  "ok )
     moves
     case
      ( counter-0 x ( describe-bindings- ) )
      ( counter-0 +(x -1) ( help- ) )
     default
      ( return-from-macro )
     esac
   )
)
}}}
