__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
vim9script
# MetaPost indent file
# Language: MetaPost
# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
# Former Maintainers: Eugene Minkovskii <emin@mccme.ru>
# Latest Revision: 2022 Aug 12
if exists("b:did_indent")
finish
endif
b:did_indent = 1
setlocal indentexpr=g:MetaPostIndent()
setlocal indentkeys+==end,=else,=fi,=fill,0),0]
setlocal nolisp
setlocal nosmartindent
b:undo_indent = "setl indentexpr< indentkeys< lisp< smartindent<"
# Regexps {{{
# Expressions starting indented blocks
const MP_OPEN_TAG = [
'\<if\>',
'\<else\%[if]\>',
'\<for\%(\|ever\|suffixes\)\>',
'\<begingroup\>',
'\<\%(\|var\|primary\|secondary\|tertiary\)def\>',
'^\s*\<begin\%(fig\|graph\|glyph\|char\|logochar\)\>',
'[([{]',
]->extend(get(g:, "mp_open_tag", []))->join('\|')
# Expressions ending indented blocks
const MP_CLOSE_TAG = [
'\<fi\>',
'\<else\%[if]\>',
'\<end\%(\|for\|group\|def\|fig\|char\|glyph\|graph\)\>',
'[)\]}]'
]->extend(get(g:, "mp_close_tag", []))->join('\|')
# Statements that may span multiple lines and are ended by a semicolon. To
# keep this list short, statements that are unlikely to be very long or are
# not very common (e.g., keywords like `interim` or `showtoken`) are not
# included.
#
# The regex for assignments and equations (the last branch) is tricky, because
# it must not match things like `for i :=`, `if a=b`, `def...=`, etc... It is
# not perfect, but it works reasonably well.
const MP_STATEMENT = [
'\<\%(\|un\|cut\)draw\%(dot\)\=\>',
'\<\%(\|un\)fill\%[draw]\>',
'\<draw\%(dbl\)\=arrow\>',
'\<clip\>',
'\<addto\>',
'\<save\>',
'\<setbounds\>',
'\<message\>',
'\<errmessage\>',
'\<errhelp\>',
'\<fontmapline\>',
'\<pickup\>',
'\<show\>',
'\<special\>',
'\<write\>',
'\%(^\|;\)\%([^;=]*\%(' .. MP_OPEN_TAG .. '\)\)\@!.\{-}:\==',
]->join('\|')
# A line ends with zero or more spaces, possibly followed by a comment.
const EOL = '\s*\%($\|%\)'
# }}}
# Auxiliary functions {{{
# Returns true if (0-based) position immediately preceding `pos` in `line` is
# inside a string or a comment; returns false otherwise.
# This is the function that is called more often when indenting, so it is
# critical that it is efficient. The method we use is significantly faster
# than using syntax attributes, and more general (it does not require
# syntax_items). It is also faster than using a single regex matching an even
# number of quotes. It helps that MetaPost strings cannot span more than one
# line and cannot contain escaped quotes.
def IsCommentOrString(line: string, pos: number): bool
var in_string = 0
var q = stridx(line, '"')
var c = stridx(line, '%')
while q >= 0 && q < pos
if c >= 0 && c < q
if in_string # Find next percent symbol
c = stridx(line, '%', q + 1)
else # Inside comment
return true
endif
endif
in_string = 1 - in_string
q = stridx(line, '"', q + 1) # Find next quote
endwhile
return in_string || (c >= 0 && c <= pos)
enddef
# Find the first non-comment non-blank line before the given line.
def PrevNonBlankNonComment(lnum: number): number
var nr = prevnonblank(lnum - 1)
while getline(nr) =~# '^\s*%'
nr = prevnonblank(nr - 1)
endwhile
return nr
enddef
# Returns true if the last tag appearing in the line is an open tag; returns
# false otherwise.
def LastTagIsOpen(line: string): bool
var o = LastValidMatchEnd(line, MP_OPEN_TAG, 0)
if o == - 1
return false
endif
return LastValidMatchEnd(line, MP_CLOSE_TAG, o) < 0
enddef
# A simple, efficient and quite effective heuristics is used to test whether
# a line should cause the next line to be indented: count the "opening tags"
# (if, for, def, ...) in the line, count the "closing tags" (endif, endfor,
# ...) in the line, and compute the difference. We call the result the
# "weight" of the line. If the weight is positive, then the next line should
# most likely be indented. Note that `else` and `elseif` are both opening and
# closing tags, so they "cancel out" in almost all cases, the only exception
# being a leading `else[if]`, which is counted as an opening tag, but not as
# a closing tag (so that, for instance, a line containing a single `else:`
# will have weight equal to one, not zero). We do not treat a trailing
# `else[if]` in any special way, because lines ending with an open tag are
# dealt with separately before this function is called (see MetaPostIndent()).
#
# Example:
#
# forsuffixes $=a,b: if x.$ = y.$ : draw else: fill fi
# % This line will be indented because |{forsuffixes,if,else}| > |{else,fi}| (3 > 2)
# endfor
def Weight(line: string): number
var o = 0
var i = ValidMatchEnd(line, MP_OPEN_TAG, 0)
while i > 0
o += 1
i = ValidMatchEnd(line, MP_OPEN_TAG, i)
endwhile
var c = 0
i = matchend(line, '^\s*\<else\%[if]\>') # Skip a leading else[if]
i = ValidMatchEnd(line, MP_CLOSE_TAG, i)
while i > 0
c += 1
i = ValidMatchEnd(line, MP_CLOSE_TAG, i)
endwhile
return o - c
enddef
# Similar to matchend(), but skips strings and comments.
# line: a String
def ValidMatchEnd(line: string, pat: string, start: number): number
var i = matchend(line, pat, start)
while i > 0 && IsCommentOrString(line, i)
i = matchend(line, pat, i)
endwhile
return i
enddef
# Like s:ValidMatchEnd(), but returns the end position of the last (i.e.,
# rightmost) match.
def LastValidMatchEnd(line: string, pat: string, start: number): number
var last_found = -1
var i = matchend(line, pat, start)
while i > 0
if !IsCommentOrString(line, i)
last_found = i
endif
i = matchend(line, pat, i)
endwhile
return last_found
enddef
def DecreaseIndentOnClosingTag(curr_indent: number): number
var cur_text = getline(v:lnum)
if cur_text =~# '^\s*\%(' .. MP_CLOSE_TAG .. '\)'
return max([curr_indent - shiftwidth(), 0])
endif
return curr_indent
enddef
# }}}
# Main function {{{
def g:MetaPostIndent(): number
# Do not touch indentation inside verbatimtex/btex.. etex blocks.
if synIDattr(synID(v:lnum, 1, 1), "name") =~# '^mpTeXinsert$\|^tex\|^Delimiter'
return -1
endif
# At the start of a MetaPost block inside ConTeXt, do not touch indentation
if synIDattr(synID(prevnonblank(v:lnum - 1), 1, 1), "name") == "contextBlockDelim"
return -1
endif
var lnum = PrevNonBlankNonComment(v:lnum)
# At the start of the file use zero indent.
if lnum == 0
return 0
endif
var prev_text = getline(lnum)
# Every rule of indentation in MetaPost is very subjective. We might get
# creative, but things get murky very soon (there are too many corner
# cases). So, we provide a means for the user to decide what to do when this
# script doesn't get it. We use a simple idea: use '%>', '%<', '%=', and
# '%!', to explicitly control indentation. The '<' and '>' symbols may be
# repeated many times (e.g., '%>>' will cause the next line to be indented
# twice).
#
# User-defined overrides take precedence over anything else.
var j = match(prev_text, '%[<>=!]')
if j > 0
var i = strlen(matchstr(prev_text, '%>\+', j)) - 1
if i > 0
return indent(lnum) + i * shiftwidth()
endif
i = strlen(matchstr(prev_text, '%<\+', j)) - 1
if i > 0
return max([indent(lnum) - i * shiftwidth(), 0])
endif
if match(prev_text, '%=', j) > -1
return indent(lnum)
endif
if match(prev_text, '%!', j) > -1
return -1
endif
endif
# If the reference line ends with an open tag, indent.
#
# Example:
#
# if c:
# 0
# else:
# 1
# fi if c2: % Note that this line has weight equal to zero.
# ... % This line will be indented
if LastTagIsOpen(prev_text)
return DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth())
endif
# Lines with a positive weight are unbalanced and should likely be indented.
#
# Example:
#
# def f = enddef for i = 1 upto 5: if x[i] > 0: 1 else: 2 fi
# ... % This line will be indented (because of the unterminated `for`)
if Weight(prev_text) > 0
return DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth())
endif
# Unterminated statements cause indentation to kick in.
#
# Example:
#
# draw unitsquare
# withcolor black; % This line is indented because of `draw`.
# x := a + b + c
# + d + e; % This line is indented because of `:=`.
#
var i = LastValidMatchEnd(prev_text, MP_STATEMENT, 0)
if i >= 0 # Does the line contain a statement?
if ValidMatchEnd(prev_text, ';', i) < 0 # Is the statement unterminated?
return indent(lnum) + shiftwidth()
else
return DecreaseIndentOnClosingTag(indent(lnum))
endif
endif
# Deal with the special case of a statement spanning multiple lines. If the
# current reference line L ends with a semicolon, search backwards for
# another semicolon or a statement keyword. If the latter is found first,
# its line is used as the reference line for indenting the current line
# instead of L.
#
# Example:
#
# if cond:
# draw if a: z0 else: z1 fi
# shifted S
# scaled T; % L
#
# for i = 1 upto 3: % <-- Current line: this gets the same indent as `draw ...`
#
# NOTE: we get here only if L does not contain a statement (among those
# listed in g:MP_STATEMENT).
if ValidMatchEnd(prev_text, ';' .. EOL, 0) >= 0 # L ends with a semicolon
var stm_lnum = PrevNonBlankNonComment(lnum)
while stm_lnum > 0
prev_text = getline(stm_lnum)
var sc_pos = LastValidMatchEnd(prev_text, ';', 0)
var stm_pos = ValidMatchEnd(prev_text, MP_STATEMENT, sc_pos)
if stm_pos > sc_pos
lnum = stm_lnum
break
elseif sc_pos > stm_pos
break
endif
stm_lnum = PrevNonBlankNonComment(stm_lnum)
endwhile
endif
return DecreaseIndentOnClosingTag(indent(lnum))
enddef
# }}}
# vim: sw=2 fdm=marker
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| aap.vim | File | 331 B | 0644 |
|
| ada.vim | File | 11.06 KB | 0644 |
|
| ant.vim | File | 290 B | 0644 |
|
| automake.vim | File | 243 B | 0644 |
|
| awk.vim | File | 7.68 KB | 0644 |
|
| bash.vim | File | 390 B | 0644 |
|
| basic.vim | File | 250 B | 0644 |
|
| bib.vim | File | 346 B | 0644 |
|
| bitbake.vim | File | 583 B | 0644 |
|
| bst.vim | File | 1.86 KB | 0644 |
|
| bzl.vim | File | 2.86 KB | 0644 |
|
| c.vim | File | 391 B | 0644 |
|
| cdl.vim | File | 4.26 KB | 0644 |
|
| ch.vim | File | 556 B | 0644 |
|
| chaiscript.vim | File | 1.18 KB | 0644 |
|
| changelog.vim | File | 264 B | 0644 |
|
| chatito.vim | File | 731 B | 0644 |
|
| clojure.vim | File | 11.29 KB | 0644 |
|
| cmake.vim | File | 2.98 KB | 0644 |
|
| cobol.vim | File | 8.63 KB | 0644 |
|
| config.vim | File | 2.17 KB | 0644 |
|
| context.vim | File | 1.67 KB | 0644 |
|
| cpp.vim | File | 395 B | 0644 |
|
| cs.vim | File | 1.88 KB | 0644 |
|
| css.vim | File | 1.77 KB | 0644 |
|
| cucumber.vim | File | 2.74 KB | 0644 |
|
| cuda.vim | File | 371 B | 0644 |
|
| d.vim | File | 605 B | 0644 |
|
| dictconf.vim | File | 411 B | 0644 |
|
| dictdconf.vim | File | 414 B | 0644 |
|
| docbk.vim | File | 336 B | 0644 |
|
| dosbatch.vim | File | 1.35 KB | 0644 |
|
| dtd.vim | File | 11.79 KB | 0644 |
|
| dtrace.vim | File | 451 B | 0644 |
|
| dts.vim | File | 1.69 KB | 0644 |
|
| dune.vim | File | 430 B | 0644 |
|
| dylan.vim | File | 2.75 KB | 0644 |
|
| eiffel.vim | File | 3.24 KB | 0644 |
|
| elm.vim | File | 3.2 KB | 0644 |
|
| erlang.vim | File | 50.74 KB | 0644 |
|
| eruby.vim | File | 2.95 KB | 0644 |
|
| eterm.vim | File | 743 B | 0644 |
|
| expect.vim | File | 207 B | 0644 |
|
| falcon.vim | File | 13.84 KB | 0644 |
|
| fennel.vim | File | 273 B | 0644 |
|
| fish.vim | File | 2.66 KB | 0644 |
|
| fortran.vim | File | 7.72 KB | 0644 |
|
| framescript.vim | File | 891 B | 0644 |
|
| freebasic.vim | File | 237 B | 0644 |
|
| gdscript.vim | File | 4.26 KB | 0644 |
|
| gitconfig.vim | File | 841 B | 0644 |
|
| gitolite.vim | File | 1.29 KB | 0644 |
|
| go.vim | File | 1.73 KB | 0644 |
|
| gyp.vim | File | 169 B | 0644 |
|
| haml.vim | File | 2.19 KB | 0644 |
|
| hamster.vim | File | 1.65 KB | 0644 |
|
| hare.vim | File | 4.38 KB | 0644 |
|
| hog.vim | File | 1.85 KB | 0644 |
|
| html.vim | File | 33.12 KB | 0644 |
|
| htmldjango.vim | File | 273 B | 0644 |
|
| idlang.vim | File | 1.68 KB | 0644 |
|
| ishd.vim | File | 1.83 KB | 0644 |
|
| j.vim | File | 1.77 KB | 0644 |
|
| java.vim | File | 4.19 KB | 0644 |
|
| javascript.vim | File | 15.13 KB | 0644 |
|
| javascriptreact.vim | File | 109 B | 0644 |
|
| json.vim | File | 4.54 KB | 0644 |
|
| jsonc.vim | File | 4.74 KB | 0644 |
|
| jsp.vim | File | 462 B | 0644 |
|
| julia.vim | File | 15.29 KB | 0644 |
|
| kotlin.vim | File | 1.53 KB | 0644 |
|
| krl.vim | File | 4.25 KB | 0644 |
|
| ld.vim | File | 1.82 KB | 0644 |
|
| less.vim | File | 243 B | 0644 |
|
| lifelines.vim | File | 638 B | 0644 |
|
| liquid.vim | File | 2.03 KB | 0644 |
|
| lisp.vim | File | 349 B | 0644 |
|
| livebook.vim | File | 206 B | 0644 |
|
| logtalk.vim | File | 1.91 KB | 0644 |
|
| lua.vim | File | 2.22 KB | 0644 |
|
| luau.vim | File | 252 B | 0644 |
|
| mail.vim | File | 385 B | 0644 |
|
| make.vim | File | 3.48 KB | 0644 |
|
| matlab.vim | File | 4.81 KB | 0644 |
|
| meson.vim | File | 5.19 KB | 0644 |
|
| mf.vim | File | 164 B | 0644 |
|
| mma.vim | File | 2.31 KB | 0644 |
|
| mp.vim | File | 9.72 KB | 0644 |
|
| nginx.vim | File | 1.7 KB | 0644 |
|
| nsis.vim | File | 3.23 KB | 0644 |
|
| objc.vim | File | 1.65 KB | 0644 |
|
| obse.vim | File | 1.4 KB | 0644 |
|
| ocaml.vim | File | 9.09 KB | 0644 |
|
| occam.vim | File | 4.63 KB | 0644 |
|
| pascal.vim | File | 5.66 KB | 0644 |
|
| perl.vim | File | 5.91 KB | 0644 |
|
| php.vim | File | 25.76 KB | 0644 |
|
| postscr.vim | File | 1.64 KB | 0644 |
|
| pov.vim | File | 2.71 KB | 0644 |
|
| prolog.vim | File | 1.91 KB | 0644 |
|
| ps1.vim | File | 410 B | 0644 |
|
| pyrex.vim | File | 326 B | 0644 |
|
| python.vim | File | 886 B | 0644 |
|
| qb64.vim | File | 232 B | 0644 |
|
| qml.vim | File | 1.27 KB | 0644 |
|
| quarto.vim | File | 23 B | 0644 |
|
| r.vim | File | 13.96 KB | 0644 |
|
| racket.vim | File | 2.87 KB | 0644 |
|
| raku.vim | File | 3.45 KB | 0644 |
|
| raml.vim | File | 285 B | 0644 |
|
| rapid.vim | File | 7.97 KB | 0644 |
|
| readline.vim | File | 786 B | 0644 |
|
| rhelp.vim | File | 2.83 KB | 0644 |
|
| rmd.vim | File | 2.25 KB | 0644 |
|
| rnoweb.vim | File | 1.1 KB | 0644 |
|
| rpl.vim | File | 1.82 KB | 0644 |
|
| rrst.vim | File | 1.19 KB | 0644 |
|
| rst.vim | File | 1.9 KB | 0644 |
|
| ruby.vim | File | 30.33 KB | 0644 |
|
| rust.vim | File | 10.26 KB | 0644 |
|
| sas.vim | File | 5.18 KB | 0644 |
|
| sass.vim | File | 926 B | 0644 |
|
| scala.vim | File | 19.3 KB | 0644 |
|
| scheme.vim | File | 372 B | 0644 |
|
| scss.vim | File | 191 B | 0644 |
|
| sdl.vim | File | 2.76 KB | 0644 |
|
| sh.vim | File | 9.04 KB | 0644 |
|
| sml.vim | File | 6.42 KB | 0644 |
|
| solidity.vim | File | 12.61 KB | 0644 |
|
| sql.vim | File | 1.18 KB | 0644 |
|
| sqlanywhere.vim | File | 12.96 KB | 0644 |
|
| sshconfig.vim | File | 796 B | 0644 |
|
| systemverilog.vim | File | 10.55 KB | 0644 |
|
| tcl.vim | File | 2.48 KB | 0644 |
|
| tcsh.vim | File | 1.35 KB | 0644 |
|
| teraterm.vim | File | 1.38 KB | 0644 |
|
| tex.vim | File | 13.52 KB | 0644 |
|
| tf.vim | File | 1.57 KB | 0644 |
|
| tilde.vim | File | 1.11 KB | 0644 |
|
| treetop.vim | File | 785 B | 0644 |
|
| typescript.vim | File | 14.28 KB | 0644 |
|
| typescriptreact.vim | File | 109 B | 0644 |
|
| vb.vim | File | 4.69 KB | 0644 |
|
| verilog.vim | File | 8.08 KB | 0644 |
|
| vhdl.vim | File | 14.43 KB | 0644 |
|
| vim.vim | File | 675 B | 0644 |
|
| vroom.vim | File | 379 B | 0644 |
|
| vue.vim | File | 385 B | 0644 |
|
| wat.vim | File | 458 B | 0644 |
|
| xf86conf.vim | File | 786 B | 0644 |
|
| xhtml.vim | File | 325 B | 0644 |
|
| xinetd.vim | File | 1.28 KB | 0644 |
|
| xml.vim | File | 7.6 KB | 0644 |
|
| xsd.vim | File | 253 B | 0644 |
|
| xslt.vim | File | 297 B | 0644 |
|
| yacc.vim | File | 858 B | 0644 |
|
| yaml.vim | File | 5.45 KB | 0644 |
|
| zig.vim | File | 2.09 KB | 0644 |
|
| zimbu.vim | File | 3.92 KB | 0644 |
|
| zsh.vim | File | 411 B | 0644 |
|