;{{{}}}
;{{{  previous-text-character
(deffun previous-text-character (
  if not(test-begin-line) (O_LEFT)
  else
  (
    O_UP
    ;{{{  move to next text-line
    while and(not(test-text),not(test-top))
    (
      if test-begin-fold
      ;{{{  begin-fold => close it
      (O_CLOSE_FOLD)
      ;}}}
      else
      ;{{{  fold-line => open and move to end
      (
        if test-fold-line
        (
          O_DOWN
          store-line p-t-c-l
          add-counter p-t-c-l -2
          goto-line-counter p-t-c-l
        ) fi
      )
      ;}}}
      fi
      ;{{{  otherwise up
      if not(test-text) (O_UP) fi
      ;}}}
    )
    ;}}}
    O_END_OF_LINE
  ) fi
))
;}}}
;{{{  next_char op
(deffun next_char (
  O_RIGHT
  if test-end-line
  (
    ;{{{  next textline
    do
    (
      O_DOWN
      if test-fold-line (O_OPEN_FOLD)
      else
      (
        if test-end-fold (O_CLOSE_FOLD) fi
      ) fi
    )
    while and(not(test-bottom),not(test-text))
     O_START_OF_LINE
    ;}}}
  ) fi
))
;}}}

(deffun goto-matching-fence (
  store-line matching-fence-y
  store-pos  matching-fence-x
  case
    (or(test-char "{ , test-char "})
      ;{{{  process { or }
      (
        if test-text (
          if not(test-char "{ ) (
            ;{{{  search matching {
            set-counter fence-counter 1
            do (
              previous-text-character
              if test-char "} (add-counter fence-counter 1)
              else (if test-char "{ (add-counter fence-counter -1) fi)
              fi
            ) while and(not(counter-0 fence-counter),not(test-top))
            if test-top (
              goto-line-counter matching-fence-y
              goto-counter matching-fence-x
              message-exit "failed
            ) fi
            ;}}}
          ) else (
            ;{{{  search matching }
            set-counter fence-counter 1
            do (
              next_char
              if test-char "{ (add-counter fence-counter 1)
              else (if test-char "} (add-counter fence-counter -1) fi)
              fi
            ) while and(not(test-bottom),not(counter-0 fence-counter))
            if test-bottom (
              goto-line-counter matching-fence-y
              goto-counter matching-fence-x
              message-exit "failed
            ) fi
            ;}}}
          ) fi
        ) fi
      )
      ;}}}
    )

    (or(test-char "[ , test-char "])
      ;{{{  process [ or ]
      (
        if test-text (
          if not(test-char "[ ) (
            ;{{{  search matching [
            set-counter fence-counter 1
            do (
              previous-text-character
              if test-char "] (add-counter fence-counter 1)
              else (if test-char "[ (add-counter fence-counter -1) fi)
              fi
            ) while and(not(counter-0 fence-counter),not(test-top))
            if test-top (
              goto-line-counter matching-fence-y
              goto-counter matching-fence-x
              message-exit "failed
            ) fi
            ;}}}
          ) else (
            ;{{{  search matching ]
            set-counter fence-counter 1
            do (
              next_char
              if test-char "[ (add-counter fence-counter 1)
              else (if test-char "] (add-counter fence-counter -1) fi)
              fi
            ) while and(not(test-bottom),not(counter-0 fence-counter))
            if test-bottom (
              goto-line-counter matching-fence-y
              goto-counter matching-fence-x
              message-exit "failed
            ) fi
            ;}}}
          ) fi
        ) fi
      )
      ;}}}
    )

    (or(test-char "( , test-char "))
      ;{{{  process ( or )
      (
        if test-text (
          if not(test-char "( ) (
            ;{{{  search matching (
            set-counter fence-counter 1
            do (
              previous-text-character
              if test-char ") (add-counter fence-counter 1)
              else (if test-char "( (add-counter fence-counter -1) fi)
              fi
            ) while and(not(counter-0 fence-counter),not(test-top))
            if test-top (
              goto-line-counter matching-fence-y
              goto-counter matching-fence-x
              message-exit "failed
            ) fi
            ;}}}
          ) else (
            ;{{{  search matching ]
            set-counter fence-counter 1
            do (
              next_char
              if test-char "( (add-counter fence-counter 1)
              else (if test-char ") (add-counter fence-counter -1) fi)
              fi
            ) while and(not(test-bottom),not(counter-0 fence-counter))
            if test-bottom (
              goto-line-counter matching-fence-y
              goto-counter matching-fence-x
              message-exit "failed
            ) fi
            ;}}}
          ) fi
        ) fi
      )
      ;}}}
    )
  esac
))
