Add meson support
This commit is contained in:
parent
63922a1d1e
commit
efa1a55dc7
@ -8,7 +8,7 @@ A collection of language packs for Vim.
|
||||
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
|
||||
|
||||
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
|
||||
- It **installs and updates 100+ times faster** than the <!--Package Count-->122<!--/Package Count--> packages it consists of.
|
||||
- It **installs and updates 100+ times faster** than the <!--Package Count-->123<!--/Package Count--> packages it consists of.
|
||||
- Solid syntax and indentation support (other features skipped). Only the best language packs.
|
||||
- All unnecessary files are ignored (like enormous documentation from php support).
|
||||
- No support for esoteric languages, only most popular ones (modern too, like `slim`).
|
||||
@ -107,6 +107,7 @@ If you need full functionality of any plugin, please use it directly with your p
|
||||
- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin)
|
||||
- [markdown](https://github.com/plasticboy/vim-markdown) (syntax, indent)
|
||||
- [mathematica](https://github.com/rsmenon/vim-mathematica) (syntax, ftplugin)
|
||||
- [meson](https://github.com/mesonbuild/meson) (syntax, indent, ftplugin)
|
||||
- [moonscript](https://github.com/leafo/moonscript-vim) (syntax, indent, ftplugin)
|
||||
- [nginx](https://github.com/chr4/nginx.vim) (syntax, indent, ftplugin)
|
||||
- [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent)
|
||||
|
3
build
3
build
@ -68,7 +68,7 @@ extract() {
|
||||
continue
|
||||
fi
|
||||
|
||||
[ -d "${dir}/ftdetect" ] && for f in "${dir}/ftdetect/"*; do
|
||||
[ -d "${dir}${subtree:-/}ftdetect" ] && for f in "${dir}${subtree:-/}ftdetect/"*; do
|
||||
cat <<EOF >> tmp/polyglot.vim
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, '${pack%%:*}') == -1
|
||||
augroup filetypedetect
|
||||
@ -215,6 +215,7 @@ PACKS="
|
||||
mako:sophacles/vim-bundle-mako
|
||||
markdown:plasticboy/vim-markdown:_SYNTAX
|
||||
mathematica:rsmenon/vim-mathematica
|
||||
meson:mesonbuild/meson:_ALL:/data/syntax-highlighting/vim/
|
||||
moonscript:leafo/moonscript-vim
|
||||
nginx:chr4/nginx.vim
|
||||
nim:zah/nim.vim:_BASIC
|
||||
|
@ -683,6 +683,14 @@ au BufRead,BufNewFile *.{md,mdown,mkd,mkdn,markdown,mdwn}.{des3,des,bf,bfa,aes,i
|
||||
augroup end
|
||||
endif
|
||||
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'meson') == -1
|
||||
augroup filetypedetect
|
||||
" meson, from meson.vim in mesonbuild/meson:_ALL:/data/syntax-highlighting/vim/
|
||||
au BufNewFile,BufRead meson.build set filetype=meson
|
||||
au BufNewFile,BufRead meson_options.txt set filetype=meson
|
||||
augroup end
|
||||
endif
|
||||
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'moonscript') == -1
|
||||
augroup filetypedetect
|
||||
" moonscript, from moon.vim in leafo/moonscript-vim
|
||||
|
19
ftplugin/meson.vim
Normal file
19
ftplugin/meson.vim
Normal file
@ -0,0 +1,19 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'meson') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" Vim filetype plugin file
|
||||
" Language: meson
|
||||
" Original Author: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
" Last Change: 2018 Nov 27
|
||||
|
||||
if exists("b:did_ftplugin") | finish | endif
|
||||
let b:did_ftplugin = 1
|
||||
let s:keepcpo= &cpo
|
||||
set cpo&vim
|
||||
|
||||
setlocal shiftwidth=2
|
||||
setlocal softtabstop=2
|
||||
|
||||
let &cpo = s:keepcpo
|
||||
unlet s:keepcpo
|
183
indent/meson.vim
Normal file
183
indent/meson.vim
Normal file
@ -0,0 +1,183 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'meson') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" Vim indent file
|
||||
" Language: Meson
|
||||
" Maintainer: Nirbheek Chauhan <nirbheek.chauhan@gmail.com>
|
||||
" Original Authors: David Bustos <bustos@caltech.edu>
|
||||
" Bram Moolenaar <Bram@vim.org>
|
||||
" Last Change: 2015 Feb 23
|
||||
|
||||
" Only load this indent file when no other was loaded.
|
||||
if exists("b:did_indent")
|
||||
finish
|
||||
endif
|
||||
let b:did_indent = 1
|
||||
|
||||
" Some preliminary settings
|
||||
setlocal nolisp " Make sure lisp indenting doesn't supersede us
|
||||
setlocal autoindent " indentexpr isn't much help otherwise
|
||||
|
||||
setlocal indentexpr=GetMesonIndent(v:lnum)
|
||||
setlocal indentkeys+==elif,=else,=endforeach,=endif,0)
|
||||
|
||||
" Only define the function once.
|
||||
if exists("*GetMesonIndent")
|
||||
finish
|
||||
endif
|
||||
let s:keepcpo= &cpo
|
||||
setlocal cpo&vim
|
||||
|
||||
" Come here when loading the script the first time.
|
||||
|
||||
let s:maxoff = 50 " maximum number of lines to look backwards for ()
|
||||
|
||||
function GetMesonIndent(lnum)
|
||||
echom getline(line("."))
|
||||
|
||||
" If this line is explicitly joined: If the previous line was also joined,
|
||||
" line it up with that one, otherwise add two 'shiftwidth'
|
||||
if getline(a:lnum - 1) =~ '\\$'
|
||||
if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$'
|
||||
return indent(a:lnum - 1)
|
||||
endif
|
||||
return indent(a:lnum - 1) + (exists("g:mesonindent_continue") ? eval(g:mesonindent_continue) : (shiftwidth() * 2))
|
||||
endif
|
||||
|
||||
" If the start of the line is in a string don't change the indent.
|
||||
if has('syntax_items')
|
||||
\ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$"
|
||||
return -1
|
||||
endif
|
||||
|
||||
" Search backwards for the previous non-empty line.
|
||||
let plnum = prevnonblank(v:lnum - 1)
|
||||
|
||||
if plnum == 0
|
||||
" This is the first non-empty line, use zero indent.
|
||||
return 0
|
||||
endif
|
||||
|
||||
" If the previous line is inside parenthesis, use the indent of the starting
|
||||
" line.
|
||||
" Trick: use the non-existing "dummy" variable to break out of the loop when
|
||||
" going too far back.
|
||||
call cursor(plnum, 1)
|
||||
let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW',
|
||||
\ "line('.') < " . (plnum - s:maxoff) . " ? dummy :"
|
||||
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
|
||||
\ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
|
||||
if parlnum > 0
|
||||
let plindent = indent(parlnum)
|
||||
let plnumstart = parlnum
|
||||
else
|
||||
let plindent = indent(plnum)
|
||||
let plnumstart = plnum
|
||||
endif
|
||||
|
||||
|
||||
" When inside parenthesis: If at the first line below the parenthesis add
|
||||
" a 'shiftwidth', otherwise same as previous line.
|
||||
" i = (a
|
||||
" + b
|
||||
" + c)
|
||||
call cursor(a:lnum, 1)
|
||||
let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
|
||||
\ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
|
||||
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
|
||||
\ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
|
||||
if p > 0
|
||||
if p == plnum
|
||||
" When the start is inside parenthesis, only indent one 'shiftwidth'.
|
||||
let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
|
||||
\ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
|
||||
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
|
||||
\ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
|
||||
if pp > 0
|
||||
return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth())
|
||||
endif
|
||||
return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : shiftwidth())
|
||||
endif
|
||||
if plnumstart == p
|
||||
return indent(plnum)
|
||||
endif
|
||||
return plindent
|
||||
endif
|
||||
|
||||
|
||||
" Get the line and remove a trailing comment.
|
||||
" Use syntax highlighting attributes when possible.
|
||||
let pline = getline(plnum)
|
||||
let pline_len = strlen(pline)
|
||||
if has('syntax_items')
|
||||
" If the last character in the line is a comment, do a binary search for
|
||||
" the start of the comment. synID() is slow, a linear search would take
|
||||
" too long on a long line.
|
||||
if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$"
|
||||
let min = 1
|
||||
let max = pline_len
|
||||
while min < max
|
||||
let col = (min + max) / 2
|
||||
if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$"
|
||||
let max = col
|
||||
else
|
||||
let min = col + 1
|
||||
endif
|
||||
endwhile
|
||||
let pline = strpart(pline, 0, min - 1)
|
||||
endif
|
||||
else
|
||||
let col = 0
|
||||
while col < pline_len
|
||||
if pline[col] == '#'
|
||||
let pline = strpart(pline, 0, col)
|
||||
break
|
||||
endif
|
||||
let col = col + 1
|
||||
endwhile
|
||||
endif
|
||||
|
||||
" If the previous line ended the conditional/loop
|
||||
if getline(plnum) =~ '^\s*\(endif\|endforeach\)\>\s*'
|
||||
" Maintain indent
|
||||
return -1
|
||||
endif
|
||||
|
||||
" If the previous line ended with a builtin, indent this line
|
||||
if pline =~ '^\s*\(foreach\|if\|else\|elif\)\>\s*'
|
||||
return plindent + shiftwidth()
|
||||
endif
|
||||
|
||||
" If the current line begins with a header keyword, deindent
|
||||
if getline(a:lnum) =~ '^\s*\(else\|elif\|endif\|endforeach\)'
|
||||
|
||||
" Unless the previous line was a one-liner
|
||||
if getline(plnumstart) =~ '^\s*\(foreach\|if\)\>\s*'
|
||||
return plindent
|
||||
endif
|
||||
|
||||
" Or the user has already dedented
|
||||
if indent(a:lnum) <= plindent - shiftwidth()
|
||||
return -1
|
||||
endif
|
||||
|
||||
return plindent - shiftwidth()
|
||||
endif
|
||||
|
||||
" When after a () construct we probably want to go back to the start line.
|
||||
" a = (b
|
||||
" + c)
|
||||
" here
|
||||
if parlnum > 0
|
||||
return plindent
|
||||
endif
|
||||
|
||||
return -1
|
||||
|
||||
endfunction
|
||||
|
||||
let &cpo = s:keepcpo
|
||||
unlet s:keepcpo
|
||||
|
||||
" vim:sw=2
|
166
syntax/meson.vim
Normal file
166
syntax/meson.vim
Normal file
@ -0,0 +1,166 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'meson') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" Vim syntax file
|
||||
" Language: Meson
|
||||
" Maintainer: Nirbheek Chauhan <nirbheek.chauhan@gmail.com>
|
||||
" Last Change: 2016 Dec 7
|
||||
" Credits: Zvezdan Petkovic <zpetkovic@acm.org>
|
||||
" Neil Schemenauer <nas@meson.ca>
|
||||
" Dmitry Vasiliev
|
||||
"
|
||||
" This version is copied and edited from python.vim
|
||||
" It's very basic, and doesn't do many things I'd like it to
|
||||
" For instance, it should show errors for syntax that is valid in
|
||||
" Python but not in Meson.
|
||||
"
|
||||
" Optional highlighting can be controlled using these variables.
|
||||
"
|
||||
" let meson_space_error_highlight = 1
|
||||
"
|
||||
|
||||
" For version 5.x: Clear all syntax items.
|
||||
" For version 6.x: Quit when a syntax file was already loaded.
|
||||
if version < 600
|
||||
syntax clear
|
||||
elseif exists("b:current_syntax")
|
||||
finish
|
||||
endif
|
||||
|
||||
" We need nocompatible mode in order to continue lines with backslashes.
|
||||
" Original setting will be restored.
|
||||
let s:cpo_save = &cpo
|
||||
setlocal cpo&vim
|
||||
|
||||
" http://mesonbuild.com/Syntax.html
|
||||
syn keyword mesonConditional elif else if endif
|
||||
syn keyword mesonRepeat foreach endforeach
|
||||
syn keyword mesonOperator and not or
|
||||
|
||||
syn match mesonComment "#.*$" contains=mesonTodo,@Spell
|
||||
syn keyword mesonTodo FIXME NOTE NOTES TODO XXX contained
|
||||
|
||||
" Strings can either be single quoted or triple counted across multiple lines,
|
||||
" but always with a '
|
||||
syn region mesonString
|
||||
\ start="\z('\)" end="\z1" skip="\\\\\|\\\z1"
|
||||
\ contains=mesonEscape,@Spell
|
||||
syn region mesonString
|
||||
\ start="\z('''\)" end="\z1" keepend
|
||||
\ contains=mesonEscape,mesonSpaceError,@Spell
|
||||
|
||||
syn match mesonEscape "\\[abfnrtv'\\]" contained
|
||||
syn match mesonEscape "\\\o\{1,3}" contained
|
||||
syn match mesonEscape "\\x\x\{2}" contained
|
||||
syn match mesonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained
|
||||
" Meson allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
|
||||
syn match mesonEscape "\\N{\a\+\%(\s\a\+\)*}" contained
|
||||
syn match mesonEscape "\\$"
|
||||
|
||||
" Meson only supports integer numbers
|
||||
" http://mesonbuild.com/Syntax.html#numbers
|
||||
syn match mesonNumber "\<\d\+\>"
|
||||
|
||||
" booleans
|
||||
syn keyword mesonConstant false true
|
||||
|
||||
" Built-in functions
|
||||
syn keyword mesonBuiltin
|
||||
\ add_global_arguments
|
||||
\ add_global_link_arguments
|
||||
\ add_languages
|
||||
\ add_project_arguments
|
||||
\ add_project_link_arguments
|
||||
\ add_test_setup
|
||||
\ assert
|
||||
\ benchmark
|
||||
\ both_libraries
|
||||
\ build_machine
|
||||
\ build_target
|
||||
\ configuration_data
|
||||
\ configure_file
|
||||
\ custom_target
|
||||
\ declare_dependency
|
||||
\ dependency
|
||||
\ disabler
|
||||
\ environment
|
||||
\ error
|
||||
\ executable
|
||||
\ files
|
||||
\ find_library
|
||||
\ find_program
|
||||
\ generator
|
||||
\ get_option
|
||||
\ get_variable
|
||||
\ gettext
|
||||
\ host_machine
|
||||
\ import
|
||||
\ include_directories
|
||||
\ install_data
|
||||
\ install_headers
|
||||
\ install_man
|
||||
\ install_subdir
|
||||
\ is_variable
|
||||
\ jar
|
||||
\ join_paths
|
||||
\ library
|
||||
\ meson
|
||||
\ message
|
||||
\ option
|
||||
\ project
|
||||
\ run_command
|
||||
\ run_target
|
||||
\ set_variable
|
||||
\ shared_library
|
||||
\ shared_module
|
||||
\ static_library
|
||||
\ subdir
|
||||
\ subdir_done
|
||||
\ subproject
|
||||
\ target_machine
|
||||
\ test
|
||||
\ vcs_tag
|
||||
\ warning
|
||||
|
||||
if exists("meson_space_error_highlight")
|
||||
" trailing whitespace
|
||||
syn match mesonSpaceError display excludenl "\s\+$"
|
||||
" mixed tabs and spaces
|
||||
syn match mesonSpaceError display " \+\t"
|
||||
syn match mesonSpaceError display "\t\+ "
|
||||
endif
|
||||
|
||||
if version >= 508 || !exists("did_meson_syn_inits")
|
||||
if version <= 508
|
||||
let did_meson_syn_inits = 1
|
||||
command -nargs=+ HiLink hi link <args>
|
||||
else
|
||||
command -nargs=+ HiLink hi def link <args>
|
||||
endif
|
||||
|
||||
" The default highlight links. Can be overridden later.
|
||||
HiLink mesonStatement Statement
|
||||
HiLink mesonConditional Conditional
|
||||
HiLink mesonRepeat Repeat
|
||||
HiLink mesonOperator Operator
|
||||
HiLink mesonComment Comment
|
||||
HiLink mesonTodo Todo
|
||||
HiLink mesonString String
|
||||
HiLink mesonEscape Special
|
||||
HiLink mesonNumber Number
|
||||
HiLink mesonBuiltin Function
|
||||
HiLink mesonConstant Number
|
||||
if exists("meson_space_error_highlight")
|
||||
HiLink mesonSpaceError Error
|
||||
endif
|
||||
|
||||
delcommand HiLink
|
||||
endif
|
||||
|
||||
let b:current_syntax = "meson"
|
||||
|
||||
let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim:set sw=2 sts=2 ts=8 noet:
|
Loading…
Reference in New Issue
Block a user