Before: Save g:ale_run_synchronously Save g:ale_buffer_info Save g:ale_linters let g:ale_buffer_info = {} let g:ale_run_synchronously = 1 call ale#ResetLintFileMarkers() let g:buffer_result = [ \ { \ 'lnum': 1, \ 'col': 1, \ 'text': 'buffer error', \ 'type': 'E', \ }, \ { \ 'lnum': 2, \ 'col': 1, \ 'text': 'buffer warning', \ 'type': 'W', \ }, \] function! LintFileCallback(buffer, output) return [ \ { \ 'lnum': 1, \ 'col': 3, \ 'text': 'file warning', \ 'type': 'W', \ }, \ { \ 'lnum': 2, \ 'col': 3, \ 'text': 'file error', \ 'type': 'E', \ }, \] endfunction function! BufferCallback(buffer, output) return deepcopy(g:buffer_result) endfunction function! GetSimplerLoclist() let l:loclist = [] for l:item in getloclist(0) call add(l:loclist, { \ 'lnum': l:item.lnum, \ 'col': l:item.col, \ 'text': l:item.text, \ 'type': l:item.type, \}) endfor return l:loclist endfunction call ale#linter#Define('foobar', { \ 'name': 'lint_file_linter', \ 'callback': 'LintFileCallback', \ 'executable': 'echo', \ 'command': 'echo', \ 'lint_file': 1, \}) call ale#linter#Define('foobar', { \ 'name': 'buffer_linter', \ 'callback': 'BufferCallback', \ 'executable': 'echo', \ 'command': 'echo', \ 'read_buffer': 0, \}) let g:filename = tempname() call writefile([], g:filename) call ale#test#SetFilename(g:filename) After: Restore unlet g:buffer_result let g:ale_buffer_info = {} call ale#linter#Reset() call setloclist(0, []) delfunction LintFileCallback delfunction BufferCallback if filereadable(g:filename) call delete(g:filename) endif unlet g:filename Given foobar (Some imaginary filetype): foo bar baz Execute(Running linters without 'lint_file' should run only buffer linters): call ale#Queue(0) AssertEqual [ \ { \ 'lnum': 1, \ 'col': 1, \ 'text': 'buffer error', \ 'type': 'E', \ }, \ { \ 'lnum': 2, \ 'col': 1, \ 'text': 'buffer warning', \ 'type': 'W', \ }, \], GetSimplerLoclist() Execute(Running linters with 'lint_file' should run all linters): Assert filereadable(expand('%:p')), 'The file was not readable' call ale#Queue(0, 'lint_file') AssertEqual [ \ { \ 'lnum': 1, \ 'col': 1, \ 'text': 'buffer error', \ 'type': 'E', \ }, \ { \ 'lnum': 1, \ 'col': 3, \ 'text': 'file warning', \ 'type': 'W', \ }, \ { \ 'lnum': 2, \ 'col': 1, \ 'text': 'buffer warning', \ 'type': 'W', \ }, \ { \ 'lnum': 2, \ 'col': 3, \ 'text': 'file error', \ 'type': 'E', \ }, \], GetSimplerLoclist() Execute(Linter errors from files should be kept): Assert filereadable(expand('%:p')), 'The file was not readable' call ale#Queue(0, 'lint_file') " Change the results for the buffer callback. let g:buffer_result = [ \ { \ 'lnum': 1, \ 'col': 1, \ 'text': 'new buffer error', \ 'type': 'E', \ }, \] call ale#Queue(0) AssertEqual [ \ { \ 'lnum': 1, \ 'col': 1, \ 'text': 'new buffer error', \ 'type': 'E', \ }, \ { \ 'lnum': 1, \ 'col': 3, \ 'text': 'file warning', \ 'type': 'W', \ }, \ { \ 'lnum': 2, \ 'col': 3, \ 'text': 'file error', \ 'type': 'E', \ }, \], GetSimplerLoclist() Execute(Linter errors from files should be kept when no other linters are run): let g:ale_linters = {'foobar': ['lint_file_linter']} Assert filereadable(expand('%:p')), 'The file was not readable' call ale#Queue(0, 'lint_file') AssertEqual [ \ { \ 'lnum': 1, \ 'col': 3, \ 'text': 'file warning', \ 'type': 'W', \ }, \ { \ 'lnum': 2, \ 'col': 3, \ 'text': 'file error', \ 'type': 'E', \ }, \], GetSimplerLoclist() call ale#Queue(0) AssertEqual [ \ { \ 'lnum': 1, \ 'col': 3, \ 'text': 'file warning', \ 'type': 'W', \ }, \ { \ 'lnum': 2, \ 'col': 3, \ 'text': 'file error', \ 'type': 'E', \ }, \], GetSimplerLoclist()