*ft_mp.txt*	For Vim version 9.0.  Last change: 2022 Aug 12

This is the documentation for the METAFONT and MetaPost filetype plugins.
Unless otherwise specified, the commands, settings and mappings defined below
apply equally to both filetypes.

NOTE: the plugin requires +vim9script.

==============================================================================
CONTENTS						*mp.vim* *ft-metapost*
							*mf.vim* *ft-metafont*

1. Introduction				|ft-metapost-intro|
2. Commands				|ft-metapost-commands|
3. Settings				|ft-metapost-settings|
4. Mappings				|ft-metapost-mappings|

==============================================================================
							*ft-metapost-intro*
							*ft-metafont-intro*
Introduction ~
This filetype plugin provides extensive support for editing METAFONT and
MetaPost documents, including syntax coloring, indentation, and completion.

Defining indentation rules for METAFONT and MetaPost code is tricky and
somewhat subjective, because the syntax is quite liberal. The plugin uses some
heuristics that work well most of the time, but in particular cases you may
want to to override the automatic rules, so that the manually defined
indentation is preserved by commands like `gg=G`.

This can be achieved by appending `%>`, `%<`, `%=` or `%!` to a line to
explicitly control the indentation of the next line. The `<` and `>` symbols
may be repeated many times: for instance, `%>>` will cause the next line to be
indented twice. Of course, `%<` means that the next line should be
de-indented; `%=` sets the indentation of the next line to be equal to the
indentation of the current line; and `%!` means that the indentation of the
next line should not change from whatever it has been manually set.

For example, this is the default indentation of a simple macro:
>
   def foo =
       makepen(
           subpath(T-n,t) of r
           shifted .5down
           --subpath(t,T) of r shifted .5up -- cycle
       )
       withcolor black
   enddef
<
By adding the special comments, the indentation can be adjusted arbitrarily:
>
   def foo =
       makepen(
           subpath(T-n,t) of r  %>
               shifted .5down   %>
                   --subpath(t,T) of r shifted .5up -- cycle   %<<<
       )
       withcolor black
   enddef
<
							*ft-metapost-commands*
Commands ~
					*:FixBeginfigs*
Renumber beginfig() blocks in the current buffer so that the n-th figure has
number n. MetaPost only.

							*ft-metapost-settings*
							*ft-metafont-settings*
Settings ~
					*'g:mf_other_macros'*
Highlight some other basic macro names, e.g., from cmbase, logo, etc. This is
set to 1 by default in METAFONT buffers, and it is set to 0 by default in
MetaPost buffers.

					*'g:mf_plain_macros'*
Highlight keywords defined by plain.mf. This is set to 1 by default in
METAFONT buffers, and it is set to 0 by default in MetaPost buffers.

					*'g:mf_plain_modes'*
Highlight keywords defined by modes.mf. This is set to 1 by default in
METAFONT buffers, and it is set to 0 by default in MetaPost buffers.

					*'g:mp_close_tag'*
Define additional keywords that end indented blocks. For instance, if you
define:
>
	g:mp_end_tag = ['\<endfoo\>']
<
any line starting with `endfoo` will be de-indented compared to its previous
line.
>
	g:mp_close_tag = []
<
					*'b:mp_metafun'*
					*'g:mp_metafun'*
If set to 1, highlight ConTeXt's MetaFun keywords. MetaPost only.
>
	g:mp_metafun = 0
<
					*'g:mp_mfplain_macros'*
Highlight keywords defined by mfplain.mp. MetaPost only.
>
	g:mp_mfplain_macros = 1
<
					*'g:mp_open_tag'*
Define additional keywords that start indented blocks. For instance, if you
define:
>
	g:mp_open_tag = ['\<beginfoo\>']
<
the line following `beginfoo` will be indented.
>
	g:mp_open_tag = []
<
					*'g:mp_other_macros'*
Highlight keywords defined by all base macro packages (boxes, rboxes, format,
graph, marith, sarith, string, TEX). This option affects only MetaPost
buffers.
>
	g:mp_other_macros = 1
<
					*'g:mp_plain_macros'*
Highlight keywords defined by plain.mp. MetaPost only.
>
	g:mp_plain_macros = 1
<
					*'g:no_mp_maps'*
					*'g:no_mf_maps'*
When set, do not define any mapping in buffers with the corresponding
filetype.
>
	g:no_mp_maps = 0
	g:no_mf_maps = 0
<
							*ft-metapost-mappings*
							*ft-metafont-mappings*
Mappings ~

]]			[count] vardefs, macros or figures forward.

[[			[count] vardefs, macros or figures backward.

][			[count] end of vardefs, macros or figures forward.

[]			[count] end of vardefs, macros or figures backward.

]}			[count] end of blocks (fi, endfor, endgroup) forward.

[{			[count] begin of blocks (if, for, begingroup) backward.

 vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
