$96 GRAYBYTE WORDPRESS FILE MANAGER $36

SERVER : vnpttt-amd7f72-h1.vietnix.vn #1 SMP Fri May 24 12:42:50 UTC 2024
SERVER IP : 103.200.23.149 | ADMIN IP 216.73.216.22
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/usr/share/vim/vim80/indent/

HOME
Current File : /usr/share/vim/vim80/indent//mp.vim
" MetaPost indent file
" Language:           MetaPost
" Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
" Former Maintainers: Eugene Minkovskii <emin@mccme.ru>
" Last Change:        2016 Oct 2, 4:13pm
" Version: 0.2

if exists("b:did_indent")
  finish
endif
let b:did_indent = 1

setlocal indentexpr=GetMetaPostIndent()
setlocal indentkeys+==end,=else,=fi,=fill,0),0]

let b:undo_indent = "setl indentkeys< indentexpr<"

" Only define the function once.
if exists("*GetMetaPostIndent")
  finish
endif
let s:keepcpo= &cpo
set cpo&vim

function GetMetaPostIndent()
  let ignorecase_save = &ignorecase
  try
    let &ignorecase = 0
    return GetMetaPostIndentIntern()
  finally
    let &ignorecase = ignorecase_save
  endtry
endfunc

" Regexps {{{
" Note: the next three variables are made global so that a user may add
" further keywords.
"
" Example:
"
"    Put these in ~/.vim/after/indent/mp.vim
"
"    let g:mp_open_tag .= '\|\<begintest\>'
"    let g:mp_close_tag .= '\|\<endtest\>'

" Expressions starting indented blocks
let g:mp_open_tag = ''
      \ . '\<if\>'
      \ . '\|\<else\%[if]\>'
      \ . '\|\<for\%(\|ever\|suffixes\)\>'
      \ . '\|\<begingroup\>'
      \ . '\|\<\%(\|var\|primary\|secondary\|tertiary\)def\>'
      \ . '\|^\s*\<begin\%(fig\|graph\|glyph\|char\|logochar\)\>'
      \ . '\|[([{]'

" Expressions ending indented blocks
let g:mp_close_tag = ''
      \ . '\<fi\>'
      \ . '\|\<else\%[if]\>'
      \ . '\|\<end\%(\|for\|group\|def\|fig\|char\|glyph\|graph\)\>'
      \ . '\|[)\]}]'

" 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.
let g:mp_statement = ''
      \ . '\<\%(\|un\|cut\)draw\>'
      \ . '\|\<\%(\|un\)fill\%[draw]\>'
      \ . '\|\<draw\%(dbl\)\=arrow\>'
      \ . '\|\<clip\>'
      \ . '\|\<addto\>'
      \ . '\|\<save\>'
      \ . '\|\<setbounds\>'
      \ . '\|\<message\>'
      \ . '\|\<errmessage\>'
      \ . '\|\<errhelp\>'
      \ . '\|\<fontmapline\>'
      \ . '\|\<pickup\>'
      \ . '\|\<show\>'
      \ . '\|\<special\>'
      \ . '\|\<write\>'
      \ . '\|\%(^\|;\)\%([^;=]*\%('.g:mp_open_tag.'\)\)\@!.\{-}:\=='

" A line ends with zero or more spaces, possibly followed by a comment.
let s:eol = '\s*\%($\|%\)'
" }}}

" Auxiliary functions {{{
" Returns 1 if (0-based) position immediately preceding `pos` in `line` is
" inside a string or a comment; returns 0 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.
function! s:CommentOrString(line, pos)
  let in_string = 0
  let q = stridx(a:line, '"')
  let c = stridx(a:line, '%')
  while q >= 0 && q < a:pos
    if c >= 0 && c < q
      if in_string " Find next percent symbol
        let c = stridx(a:line, '%', q + 1)
      else " Inside comment
        return 1
      endif
    endif
    let in_string = 1 - in_string
    let q = stridx(a:line, '"', q + 1) " Find next quote
  endwhile
  return in_string || (c >= 0 && c <= a:pos)
endfunction

" Find the first non-comment non-blank line before the current line.
function! s:PrevNonBlankNonComment(lnum)
  let l:lnum = prevnonblank(a:lnum - 1)
  while getline(l:lnum) =~# '^\s*%'
    let l:lnum = prevnonblank(l:lnum - 1)
  endwhile
  return l:lnum
endfunction

" Returns true if the last tag appearing in the line is an open tag; returns
" false otherwise.
function! s:LastTagIsOpen(line)
  let o = s:LastValidMatchEnd(a:line, g:mp_open_tag, 0)
  if o == - 1 | return v:false | endif
  return s:LastValidMatchEnd(a:line, g:mp_close_tag, o) < 0
endfunction

" 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
" GetMetaPostIndentIntern()).
"
" 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

function! s:Weight(line)
  let [o, i] = [0, s:ValidMatchEnd(a:line, g:mp_open_tag, 0)]
  while i > 0
    let o += 1
    let i = s:ValidMatchEnd(a:line, g:mp_open_tag, i)
  endwhile
  let [c, i] = [0, matchend(a:line, '^\s*\<else\%[if]\>')] " Skip a leading else[if]
  let i = s:ValidMatchEnd(a:line, g:mp_close_tag, i)
  while i > 0
    let c += 1
    let i = s:ValidMatchEnd(a:line, g:mp_close_tag, i)
  endwhile
  return o - c
endfunction

" Similar to matchend(), but skips strings and comments.
" line: a String
function! s:ValidMatchEnd(line, pat, start)
  let i = matchend(a:line, a:pat, a:start)
  while i > 0 && s:CommentOrString(a:line, i)
    let i = matchend(a:line, a:pat, i)
  endwhile
  return i
endfunction

" Like s:ValidMatchEnd(), but returns the end position of the last (i.e.,
" rightmost) match.
function! s:LastValidMatchEnd(line, pat, start)
  let last_found = -1
  let i = matchend(a:line, a:pat, a:start)
  while i > 0
    if !s:CommentOrString(a:line, i)
      let last_found = i
    endif
    let i = matchend(a:line, a:pat, i)
  endwhile
  return last_found
endfunction

function! s:DecreaseIndentOnClosingTag(curr_indent)
  let cur_text = getline(v:lnum)
  if cur_text =~# '^\s*\%('.g:mp_close_tag.'\)'
    return max([a:curr_indent - shiftwidth(), 0])
  endif
  return a:curr_indent
endfunction
" }}}

" Main function {{{
"
" Note: 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).
"
" By using '%>...', '%<...' and '%=', the indentation the user wants is
" preserved by commands like gg=G, even if it does not follow the rules of
" this script.
"
" Example:
"
"    def foo =
"        makepen(
"            subpath(T-n,t) of r  %>
"                shifted .5down   %>
"                    --subpath(t,T) of r shifted .5up -- cycle   %<<<
"        )
"        withcolor black
"    enddef
"
" The default indentation of the previous example would be:
"
"    def foo =
"        makepen(
"            subpath(T-n,t) of r
"            shifted .5down
"            --subpath(t,T) of r shifted .5up -- cycle
"        )
"        withcolor black
"    enddef
"
" Personally, I prefer the latter, but anyway...
function! GetMetaPostIndentIntern()
  " Do not touch indentation inside verbatimtex/btex.. etex blocks.
  if synIDattr(synID(v:lnum, 1, 1), "name") =~# '^mpTeXinsert$\|^tex\|^Delimiter'
    return -1
  endif

  " This is the reference line relative to which the current line is indented
  " (but see below).
  let lnum = s:PrevNonBlankNonComment(v:lnum)

  " At the start of the file use zero indent.
  if lnum == 0
    return 0
  endif

  let prev_text = getline(lnum)

  " User-defined overrides take precedence over anything else.
  " See above for an example.
  let j = match(prev_text, '%[<>=]')
  if j > 0
    let i = strlen(matchstr(prev_text, '%>\+', j)) - 1
    if i > 0
      return indent(lnum) + i * shiftwidth()
    endif

    let i = strlen(matchstr(prev_text, '%<\+', j)) - 1
    if i > 0
      return max([indent(lnum) - i * shiftwidth(), 0])
    endif

    if match(prev_text, '%=', j)
      return indent(lnum)
    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 s:LastTagIsOpen(prev_text)
    return s: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 s:Weight(prev_text) > 0
    return s: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 `:=`.
  "
  let i = s:LastValidMatchEnd(prev_text, g:mp_statement, 0)
  if i >= 0 " Does the line contain a statement?
    if s:ValidMatchEnd(prev_text, ';', i) < 0 " Is the statement unterminated?
      return indent(lnum) + shiftwidth()
    else
      return s: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 s:ValidMatchEnd(prev_text, ';'.s:eol, 0) >= 0 " L ends with a semicolon
    let stm_lnum = s:PrevNonBlankNonComment(lnum)
    while stm_lnum > 0
      let prev_text = getline(stm_lnum)
      let sc_pos = s:LastValidMatchEnd(prev_text, ';', 0)
      let stm_pos = s:ValidMatchEnd(prev_text, g:mp_statement, sc_pos)
      if stm_pos > sc_pos
        let lnum = stm_lnum
        break
      elseif sc_pos > stm_pos
        break
      endif
      let stm_lnum = s:PrevNonBlankNonComment(stm_lnum)
    endwhile
  endif

  return s:DecreaseIndentOnClosingTag(indent(lnum))
endfunction
" }}}

let &cpo = s:keepcpo
unlet s:keepcpo

" vim:sw=2:fdm=marker

Current_dir [ NOT WRITEABLE ] Document_root [ WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
16 Dec 2025 9.30 PM
root / root
0755
README.txt
1.601 KB
12 Oct 2025 7.23 AM
root / root
0644
aap.vim
0.259 KB
12 Oct 2025 7.23 AM
root / root
0644
ada.vim
10.972 KB
12 Oct 2025 7.23 AM
root / root
0644
ant.vim
0.283 KB
12 Oct 2025 7.23 AM
root / root
0644
automake.vim
0.237 KB
12 Oct 2025 7.23 AM
root / root
0644
awk.vim
7.593 KB
12 Oct 2025 7.23 AM
root / root
0644
bib.vim
0.338 KB
12 Oct 2025 7.23 AM
root / root
0644
bst.vim
1.892 KB
12 Oct 2025 7.23 AM
root / root
0644
bzl.vim
2.426 KB
12 Oct 2025 7.23 AM
root / root
0644
c.vim
0.317 KB
12 Oct 2025 7.23 AM
root / root
0644
cdl.vim
4.153 KB
12 Oct 2025 7.23 AM
root / root
0644
ch.vim
0.459 KB
12 Oct 2025 7.23 AM
root / root
0644
chaiscript.vim
1.111 KB
12 Oct 2025 7.23 AM
root / root
0644
changelog.vim
0.258 KB
12 Oct 2025 7.23 AM
root / root
0644
clojure.vim
10.195 KB
12 Oct 2025 7.23 AM
root / root
0644
cmake.vim
2.62 KB
12 Oct 2025 7.23 AM
root / root
0644
cobol.vim
8.11 KB
12 Oct 2025 7.23 AM
root / root
0644
config.vim
2.131 KB
12 Oct 2025 7.23 AM
root / root
0644
context.vim
0.734 KB
12 Oct 2025 7.23 AM
root / root
0644
cpp.vim
0.321 KB
12 Oct 2025 7.23 AM
root / root
0644
cs.vim
0.319 KB
12 Oct 2025 7.23 AM
root / root
0644
css.vim
1.748 KB
12 Oct 2025 7.23 AM
root / root
0644
cucumber.vim
2.615 KB
12 Oct 2025 7.23 AM
root / root
0644
cuda.vim
0.298 KB
12 Oct 2025 7.23 AM
root / root
0644
d.vim
0.498 KB
12 Oct 2025 7.23 AM
root / root
0644
dictconf.vim
0.329 KB
12 Oct 2025 7.23 AM
root / root
0644
dictdconf.vim
0.33 KB
12 Oct 2025 7.23 AM
root / root
0644
docbk.vim
0.328 KB
12 Oct 2025 7.23 AM
root / root
0644
dtd.vim
11.591 KB
12 Oct 2025 7.23 AM
root / root
0644
dtrace.vim
0.44 KB
12 Oct 2025 7.23 AM
root / root
0644
dylan.vim
2.644 KB
12 Oct 2025 7.23 AM
root / root
0644
eiffel.vim
3.239 KB
12 Oct 2025 7.23 AM
root / root
0644
erlang.vim
45.292 KB
12 Oct 2025 7.23 AM
root / root
0644
eruby.vim
2.736 KB
12 Oct 2025 7.23 AM
root / root
0644
eterm.vim
0.652 KB
12 Oct 2025 7.23 AM
root / root
0644
falcon.vim
13.725 KB
12 Oct 2025 7.23 AM
root / root
0644
fortran.vim
7.271 KB
12 Oct 2025 7.23 AM
root / root
0644
framescript.vim
0.797 KB
12 Oct 2025 7.23 AM
root / root
0644
gitconfig.vim
0.821 KB
12 Oct 2025 7.23 AM
root / root
0644
gitolite.vim
1.247 KB
12 Oct 2025 7.23 AM
root / root
0644
go.vim
1.634 KB
12 Oct 2025 7.23 AM
root / root
0644
haml.vim
2.159 KB
12 Oct 2025 7.23 AM
root / root
0644
hamster.vim
1.392 KB
12 Oct 2025 7.23 AM
root / root
0644
hog.vim
1.848 KB
12 Oct 2025 7.23 AM
root / root
0644
html.vim
32.469 KB
12 Oct 2025 7.23 AM
root / root
0644
htmldjango.vim
0.267 KB
12 Oct 2025 7.23 AM
root / root
0644
idlang.vim
1.582 KB
12 Oct 2025 7.23 AM
root / root
0644
ishd.vim
1.833 KB
12 Oct 2025 7.23 AM
root / root
0644
j.vim
1.771 KB
12 Oct 2025 7.23 AM
root / root
0644
java.vim
4.187 KB
12 Oct 2025 7.23 AM
root / root
0644
javascript.vim
15.002 KB
12 Oct 2025 7.23 AM
root / root
0644
json.vim
4.317 KB
12 Oct 2025 7.23 AM
root / root
0644
jsp.vim
0.451 KB
12 Oct 2025 7.23 AM
root / root
0644
ld.vim
1.75 KB
12 Oct 2025 7.23 AM
root / root
0644
less.vim
0.237 KB
12 Oct 2025 7.23 AM
root / root
0644
lifelines.vim
0.622 KB
12 Oct 2025 7.23 AM
root / root
0644
liquid.vim
1.854 KB
12 Oct 2025 7.23 AM
root / root
0644
lisp.vim
0.345 KB
12 Oct 2025 7.23 AM
root / root
0644
logtalk.vim
1.703 KB
12 Oct 2025 7.23 AM
root / root
0644
lua.vim
1.882 KB
12 Oct 2025 7.23 AM
root / root
0644
mail.vim
0.301 KB
12 Oct 2025 7.23 AM
root / root
0644
make.vim
3.406 KB
12 Oct 2025 7.23 AM
root / root
0644
matlab.vim
1.918 KB
12 Oct 2025 7.23 AM
root / root
0644
mf.vim
0.152 KB
12 Oct 2025 7.23 AM
root / root
0644
mma.vim
2.184 KB
12 Oct 2025 7.23 AM
root / root
0644
mp.vim
11.056 KB
12 Oct 2025 7.23 AM
root / root
0644
nsis.vim
3.181 KB
12 Oct 2025 7.23 AM
root / root
0644
objc.vim
1.606 KB
12 Oct 2025 7.23 AM
root / root
0644
ocaml.vim
8.938 KB
12 Oct 2025 7.23 AM
root / root
0644
occam.vim
4.528 KB
12 Oct 2025 7.23 AM
root / root
0644
pascal.vim
5.523 KB
12 Oct 2025 7.23 AM
root / root
0644
perl.vim
5.764 KB
12 Oct 2025 7.23 AM
root / root
0644
perl6.vim
3.457 KB
12 Oct 2025 7.23 AM
root / root
0644
php.vim
21.905 KB
12 Oct 2025 7.23 AM
root / root
0644
postscr.vim
1.61 KB
12 Oct 2025 7.23 AM
root / root
0644
pov.vim
2.6 KB
12 Oct 2025 7.23 AM
root / root
0644
prolog.vim
1.455 KB
12 Oct 2025 7.23 AM
root / root
0644
pyrex.vim
0.318 KB
12 Oct 2025 7.23 AM
root / root
0644
python.vim
5.609 KB
12 Oct 2025 7.23 AM
root / root
0644
r.vim
13.579 KB
12 Oct 2025 7.23 AM
root / root
0644
readline.vim
0.694 KB
12 Oct 2025 7.23 AM
root / root
0644
rhelp.vim
2.773 KB
12 Oct 2025 7.23 AM
root / root
0644
rmd.vim
1.169 KB
12 Oct 2025 7.23 AM
root / root
0644
rnoweb.vim
1.061 KB
12 Oct 2025 7.23 AM
root / root
0644
rpl.vim
1.818 KB
12 Oct 2025 7.23 AM
root / root
0644
rrst.vim
1.167 KB
12 Oct 2025 7.23 AM
root / root
0644
rst.vim
1.366 KB
12 Oct 2025 7.23 AM
root / root
0644
ruby.vim
22.432 KB
12 Oct 2025 7.23 AM
root / root
0644
rust.vim
6.346 KB
12 Oct 2025 7.23 AM
root / root
0644
sas.vim
5.007 KB
12 Oct 2025 7.23 AM
root / root
0644
sass.vim
0.928 KB
12 Oct 2025 7.23 AM
root / root
0644
scala.vim
18.975 KB
12 Oct 2025 7.23 AM
root / root
0644
scheme.vim
0.363 KB
12 Oct 2025 7.23 AM
root / root
0644
scss.vim
0.187 KB
12 Oct 2025 7.23 AM
root / root
0644
sdl.vim
2.729 KB
12 Oct 2025 7.23 AM
root / root
0644
sh.vim
5.582 KB
12 Oct 2025 7.23 AM
root / root
0644
sml.vim
6.326 KB
12 Oct 2025 7.23 AM
root / root
0644
sql.vim
1.176 KB
12 Oct 2025 7.23 AM
root / root
0644
sqlanywhere.vim
12.857 KB
12 Oct 2025 7.23 AM
root / root
0644
systemd.vim
0.2 KB
12 Oct 2025 7.23 AM
root / root
0644
systemverilog.vim
8.376 KB
12 Oct 2025 7.23 AM
root / root
0644
tcl.vim
1.591 KB
12 Oct 2025 7.23 AM
root / root
0644
tcsh.vim
1.24 KB
12 Oct 2025 7.23 AM
root / root
0644
teraterm.vim
1.333 KB
12 Oct 2025 7.23 AM
root / root
0644
tex.vim
13.182 KB
12 Oct 2025 7.23 AM
root / root
0644
tf.vim
1.513 KB
12 Oct 2025 7.23 AM
root / root
0644
tilde.vim
0.988 KB
12 Oct 2025 7.23 AM
root / root
0644
treetop.vim
0.69 KB
12 Oct 2025 7.23 AM
root / root
0644
vb.vim
2.04 KB
12 Oct 2025 7.23 AM
root / root
0644
verilog.vim
7.974 KB
12 Oct 2025 7.23 AM
root / root
0644
vhdl.vim
14.322 KB
12 Oct 2025 7.23 AM
root / root
0644
vim.vim
2.919 KB
12 Oct 2025 7.23 AM
root / root
0644
vroom.vim
0.37 KB
12 Oct 2025 7.23 AM
root / root
0644
xf86conf.vim
0.692 KB
12 Oct 2025 7.23 AM
root / root
0644
xhtml.vim
0.263 KB
12 Oct 2025 7.23 AM
root / root
0644
xinetd.vim
1.202 KB
12 Oct 2025 7.23 AM
root / root
0644
xml.vim
2.782 KB
12 Oct 2025 7.23 AM
root / root
0644
xsd.vim
0.247 KB
12 Oct 2025 7.23 AM
root / root
0644
xslt.vim
0.29 KB
12 Oct 2025 7.23 AM
root / root
0644
yacc.vim
0.763 KB
12 Oct 2025 7.23 AM
root / root
0644
yaml.vim
5.344 KB
12 Oct 2025 7.23 AM
root / root
0644
zimbu.vim
3.844 KB
12 Oct 2025 7.23 AM
root / root
0644
zsh.vim
0.401 KB
12 Oct 2025 7.23 AM
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF