{{{F prev_char
:::F prev_char
}}}
{{{  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
))
