Могу ли я использовать эль или синтаксис в качестве хука перед записью, а не после записи?

У меня есть пара файлов YAML, которые всегда должны содержать действительный YAML, поэтому я надеялся использовать (что-то вроде) ale или syntastic, чтобы помочь мне обеспечить это.

Похоже, что синтаксис работает следующим образом: после :w он запускает чекеры (после записи) и сообщает обо всех ошибках. Ale работает асинхронно, но не предотвращает запись при наличии ошибок. И они оба отлично работают, как рекламируется.

Но могу ли я использовать средства проверки, чтобы предотвратить запись файлов на диск с помощью :w или :wq, если они не проходят проверку(и) своего рода перехватчиком перед записью?

Или есть альтернативы элю и синтаксису, которые позволяют это сделать?


person Peter V. Mørch    schedule 06.12.2019    source источник


Ответы (1)


Буфер по-прежнему должен быть сохранен (например, во временном файле), чтобы средство проверки могло его проверить. Это дополнительные усилия, и я не уверен, есть ли что-то подобное в Syntastic.

Для ALE, поскольку он работает асинхронно, он может сделать это легко. Все, что осталось сделать, это предотвратить запись в случае ошибок. Ошибки можно получить через ale#statusline#Count( ); вам просто нужно проверить это в BufWritePre и прервать запись; это можно сделать, :throw создав исключение в обработчике:

autocmd! BufWritePre <buffer> if ale#statusline#Count(bufnr('')).error > 0 | throw "You have errors in the file; fix them first." | endif

Чтобы применить это автоматически к «паре файлов YAML», вы можете определить пользовательскую :command (например, :EnforceNoErrors), который позволяет легко настроить :autocmd (тогда предпочтительно внутри :augroup), или использовать другой :autocmd, чтобы сделать эту настройку автоматически:

:autocmd BufNewFile,BufRead /path/to/the/*.yaml autocmd! BufWritePre ...
person Ingo Karkat    schedule 06.12.2019