diff --git a/ale_linters/desktop/desktop_file_validate.vim b/ale_linters/desktop/desktop_file_validate.vim new file mode 100644 index 00000000..5a97d315 --- /dev/null +++ b/ale_linters/desktop/desktop_file_validate.vim @@ -0,0 +1,31 @@ +call ale#Set('desktop_desktop_file_validate_options', '') + +" Example matches for pattern: +" +" foo.desktop: warning: key "TerminalOptions" in group ... +" foo.desktop: error: action "new-private-window" is defined, ... +let s:pattern = '\v^(.+): ([a-z]+): (.+)$' + +function! ale_linters#desktop#desktop_file_validate#Handle(buffer, lines) abort + " The error format doesn't specify lines, so we can just put all of the + " errors on line 1. + return ale#util#MapMatches(a:lines, s:pattern, {match -> { + \ 'lnum': 1, + \ 'col': 1, + \ 'type': match[2] is? 'error' ? 'E' : 'W', + \ 'text': match[3], + \}}) +endfunction + +call ale#linter#Define('desktop', { +\ 'name': 'desktop_file_validate', +\ 'aliases': ['desktop-file-validate'], +\ 'executable': 'desktop-file-validate', +\ 'command': {b -> +\ '%e' +\ . ale#Pad(ale#Var(b, 'desktop_desktop_file_validate_options')) +\ . ' %t' +\ }, +\ 'callback': 'ale_linters#desktop#desktop_file_validate#Handle', +\ 'output_stream': 'both', +\}) diff --git a/doc/ale-desktop.txt b/doc/ale-desktop.txt new file mode 100644 index 00000000..62269e9c --- /dev/null +++ b/doc/ale-desktop.txt @@ -0,0 +1,21 @@ +=============================================================================== +ALE desktop Integration *ale-desktop-options* + + +=============================================================================== +desktop-file-validate *ale-desktop-desktop-file-validate* + +ALE supports checking .desktop files with `desktop-file-validate.` + + +g:ale_desktop_desktop_file_validate_options + *g:ale_desktop_desktop_file_validate_options* + *b:ale_desktop_desktop_file_validate_options* + Type: |String| + Default: `''` + + This variable can be changed to set options for `desktop-file-validate`, + such as `'--warn-kde'`. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt index 2e7d2f77..26e91e5c 100644 --- a/doc/ale-supported-languages-and-tools.txt +++ b/doc/ale-supported-languages-and-tools.txt @@ -126,6 +126,8 @@ Notes: * `dartanalyzer`!! * `dartfmt`!! * `language_server` +* desktop + * `desktop-file-validate` * Dhall * `dhall-format` * `dhall-freeze` diff --git a/doc/ale.txt b/doc/ale.txt index 36e02d54..63086611 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -2697,6 +2697,8 @@ documented in additional help files. analysis_server.......................|ale-dart-analysis_server| dartanalyzer..........................|ale-dart-dartanalyzer| dartfmt...............................|ale-dart-dartfmt| + desktop.................................|ale-desktop-options| + desktop-file-validate.................|ale-desktop-desktop-file-validate| dhall...................................|ale-dhall-options| dhall-format..........................|ale-dhall-format| dhall-freeze..........................|ale-dhall-freeze| diff --git a/supported-tools.md b/supported-tools.md index b73d4607..4c65a324 100644 --- a/supported-tools.md +++ b/supported-tools.md @@ -135,6 +135,8 @@ formatting. * [dartanalyzer](https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_cli) :floppy_disk: * [dartfmt](https://github.com/dart-lang/sdk/tree/master/utils/dartfmt) * [language_server](https://github.com/natebosch/dart_language_server) +* desktop + * [desktop-file-validate](https://www.freedesktop.org/wiki/Software/desktop-file-utils/) * Dhall * [dhall-format](https://github.com/dhall-lang/dhall-lang) * [dhall-freeze](https://github.com/dhall-lang/dhall-lang) diff --git a/test/command_callback/test_desktop_file_validate.vader b/test/command_callback/test_desktop_file_validate.vader new file mode 100644 index 00000000..4a49057b --- /dev/null +++ b/test/command_callback/test_desktop_file_validate.vader @@ -0,0 +1,15 @@ +Before: + call ale#assert#SetUpLinterTest('desktop', 'desktop_file_validate') + +After: + call ale#assert#TearDownLinterTest() + +Execute(The default command should be correct): + AssertLinter 'desktop-file-validate', + \ ale#Escape('desktop-file-validate') . ' %t' + +Execute(Extra options should work): + let b:ale_desktop_desktop_file_validate_options = '--warn-kde' + + AssertLinter 'desktop-file-validate', + \ ale#Escape('desktop-file-validate') . ' --warn-kde %t' diff --git a/test/handler/test_desktop_file_validate_handler.vader b/test/handler/test_desktop_file_validate_handler.vader new file mode 100644 index 00000000..88163433 --- /dev/null +++ b/test/handler/test_desktop_file_validate_handler.vader @@ -0,0 +1,26 @@ +Before: + runtime ale_linters/desktop/desktop_file_validate.vim + +After: + call ale#linter#Reset() + +Execute(The desktop-file-validate handler should parse lines correctly): + AssertEqual + \ [ + \ { + \ 'lnum': 1, + \ 'col': 1, + \ 'type': 'W', + \ 'text': 'key "TerminalOptions" in group "Desktop Entry" is deprecated', + \ }, + \ { + \ 'lnum': 1, + \ 'col': 1, + \ 'type': 'E', + \ 'text': 'action "new-private-window" is defined, but there is no matching "Desktop Action new-private-window" group', + \ }, + \ ], + \ ale_linters#desktop#desktop_file_validate#Handle(bufnr(''), [ + \ 'foo.desktop: warning: key "TerminalOptions" in group "Desktop Entry" is deprecated', + \ 'foo.desktop: error: action "new-private-window" is defined, but there is no matching "Desktop Action new-private-window" group', + \ ])