Handle syntax without syntax or indent files

A syntax in the config without a syntax file, like postcss, showed
E484 on opening a file. Skip loading it, with a warning in debug.

A syntax without an indent file used cindent, which broke indent of
languages like pug, stylus without their plugins, or toml. Keep the
indent instead. Lines outside blocks still use cindent.
This commit is contained in:
leafOfTree committed 2026-10-21 13:51:38 +00:00
1 parent 824aff651d
commit de9fbec1ad
5 files changed
+43 -2

No files matched your search

+4
View File
@@ -263,6 +263,10 @@ endfunction
" Load all syntax files in 'runtimepath' " Load all syntax files in 'runtimepath'
" Useful if there is no default syntax file provided by vim " Useful if there is no default syntax file provided by vim
function! vue#LoadFullSyntax(group, syntax) function! vue#LoadFullSyntax(group, syntax)
if empty(globpath(&runtimepath, 'syntax/'.a:syntax.'.vim'))
call vue#Warn(a:syntax.': syntax not found in runtimepath')
return
endif
call vue#Log(a:syntax.': load full') call vue#Log(a:syntax.': load full')
call s:SetCurrentSyntax(a:syntax) call s:SetCurrentSyntax(a:syntax)
execute 'syntax include '.a:group.' syntax/'.a:syntax.'.vim' execute 'syntax include '.a:group.' syntax/'.a:syntax.'.vim'
+5
View File
@@ -75,6 +75,11 @@ function! s:GetBlockIndent(syntax)
let indentexpr = get(s:indent, syntax) let indentexpr = get(s:indent, syntax)
if !empty(indentexpr) if !empty(indentexpr)
let ind = eval(indentexpr) let ind = eval(indentexpr)
elseif has_key(s:indent, syntax)
" No indent file for syntax in config, keep indent as cindent may break
" languages like pug or toml
call vue#LogWithLnum('indentexpr not found for '.syntax.', keep indent')
let ind = -1
else else
call vue#LogWithLnum('indentexpr not found for '.syntax.', use cindent') call vue#LogWithLnum('indentexpr not found for '.syntax.', use cindent')
let ind = cindent(v:lnum) let ind = cindent(v:lnum)
+15
View File
@@ -0,0 +1,15 @@
" postcss has no syntax or indent file, toml has no indent file. They have
" their blocks and keep indent
let g:vim_vue_plugin_config = {
\'syntax': {
\ 'template': ['html'],
\ 'style': ['css', 'postcss'],
\ 'i18n': ['toml'],
\},
\}
function! Check()
call ExpectBlock('color: blue', 'style', 'postcss', 'postcssStyleBlock')
call ExpectBlock('hello', 'i18n', 'toml', 'tomlI18nBlock')
call ExpectIndentEachLine()
endfunction
+15
View File
@@ -0,0 +1,15 @@
<template>
<div>x</div>
</template>
<style lang="postcss">
p
color: red
a
color: blue
</style>
<i18n lang="toml">
[en]
hello = "hi"
</i18n>
+4 -2
View File
@@ -92,7 +92,8 @@ function! ExpectTag(lnum, tag)
endfunction endfunction
" Call GetVueIndent() for each non-blank line from line 2 as when typing it, " Call GetVueIndent() for each non-blank line from line 2 as when typing it,
" which shows errors hidden by 'indentexpr', and check the indent " which shows errors hidden by 'indentexpr', and check the indent. -1 keeps
" the indent
function! ExpectIndentEachLine() function! ExpectIndentEachLine()
for lnum in range(2, line('$')) for lnum in range(2, line('$'))
if getline(lnum) =~ '^\s*$' if getline(lnum) =~ '^\s*$'
@@ -101,7 +102,8 @@ function! ExpectIndentEachLine()
call cursor(lnum, 1) call cursor(lnum, 1)
let v:lnum = lnum let v:lnum = lnum
try try
call ExpectEqual(GetVueIndent(), indent(lnum), let ind = GetVueIndent()
call ExpectEqual(ind == -1 ? indent(lnum) : ind, indent(lnum),
\ printf('GetVueIndent() at line %d', lnum)) \ printf('GetVueIndent() at line %d', lnum))
catch catch
call Fail(printf('GetVueIndent() at line %d: %s', lnum, v:exception)) call Fail(printf('GetVueIndent() at line %d: %s', lnum, v:exception))