Before: runtime ale_linters/v/v.vim After: call ale#linter#Reset() Execute (The v handler should correctly parse error messages): AssertEqual \ [{ \ 'lnum': 4, \ 'col': 3, \ 'filename': ale#path#GetAbsPath(expand('%:p:h'), 'const ants.v'), \ 'type': 'W', \ 'end_col': 14, \ 'text': 'const names cannot contain uppercase letters, use snake_case instead' \ }, \ { \ 'lnum': 4, \ 'col': 8, \ 'filename': ale#path#GetAbsPath(expand('%:p:h'), 'main.v'), \ 'type': 'W', \ 'end_col': 10, \ 'text': 'module "os" is imported but never used' \ }, \ { \ 'lnum': 20, \ 'col': 10, \ 'filename': ale#path#GetAbsPath(expand('%:p:h'), 'main.v'), \ 'type': 'E', \ 'end_col': 18, \ 'text': 'undefined ident: `win_widt`' \ }], \ ale_linters#v#v#Handler('', [ \ './const ants.v:4:3: warning: const names cannot contain uppercase letters, use snake_case instead', \ ' 2 |', \ ' 3 | const (', \ ' 4 | BUTTON_TEXT = "OK"', \ ' | ~~~~~~~~~~~', \ ' 5 | )', \ './main.v:4:8: warning: module "os" is imported but never used', \ ' 2 |', \ ' 3 | import ui', \ ' 4 | import os', \ ' | ~~', \ ' 5 |', \ ' 6 | const (', \ './main.v:20:10: error: undefined ident: `win_widt`', \ ' 18 | mut app := &App{}', \ ' 19 | app.window = ui.window({', \ ' 20 | width: win_widt', \ ' | ~~~~~~~~', \ ' 21 | height: win_height', \ ' 22 | title: "Counter"', \ ])