I am attempting to define an error format for the Spectral OpenAPI linter (https://github.com/stoplightio/spectral). The code I have is below, but what I'm seeing is that after I run :make
the quickfix window populates with lines from Spectral, but I can't navigate to error spots using it. There are no errors in Vim, the quick fix window just doesn't do much.
The messages from Spectral look like this:
/path/to/sample.yaml:25:9 error oas3-schema "Property `think` is not expected to be here."
My current Vimscript looks like this:
function! OpenAPIDetect()
if getline(1) =~ 'openapi:'
let &l:makeprg='spectral lint "' . expand('%') . '" -f text'
setlocal errorformat=%f:%l:%c\ (information\\|warning\\|error)\ (\\w\\|-)\+\ %m
setlocal errorformat+=%-GOpenAPI\ 3.x\ detected
endif
endfunction
augroup filetypedetect
au BufRead,BufNewFile *.{yml,yaml} call OpenAPIDetect()
augroup END
The following should be enough:
setlocal errorformat=%f:%l:%c\ %t%.%\\{-}\ %m
%f:%l:%c
matches the colon-separated filename, line, and column,%t
matches a single character, used to infer the type of the error (error
if e
, warning
if w
, info
if i
, hint
is not supported),%.%\\{-}
skips over the rest of the "type" word,%m
matches the rest of the message.Also, the right place for :help 'errorformat'
and :help 'makeprg'
would be a :help :compiler
file:
" in a minimal compiler/spectral.vim
if exists("current_compiler")
finish
endif
let current_compiler = "spectral"
CompilerSet makeprg=spectral\ lint\ %\ -f\ text
CompilerSet errorformat=%f:%l:%c\ %t%.%\\{-}\ %m
and the right place for that OpenAPI detection logic would be a :help ftplugin
:
" in a minimal after/ftplugin/yaml.vim
if getline(1) =~ 'openapi:'
compiler spectral
endif