Before: runtime ale_linters/python/flake8.vim silent! execute 'cd /testplugin/test/command_callback' let g:dir = getcwd() After: silent execute 'cd ' . fnameescape(g:dir) " Set the file to something else, " or we'll cause issues when running other tests silent file 'dummy.py' unlet! g:dir call ale#linter#Reset() let g:ale_python_flake8_executable = 'flake8' let g:ale_python_flake8_options = '' let g:ale_python_flake8_use_global = 0 call ale_linters#python#flake8#ClearVersionCache() Execute(The flake8 callbacks should return the correct default values): AssertEqual \ 'flake8', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''flake8'' --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''flake8'' --stdin-display-name %s -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['3.0.0']) " Try with older versions. call ale_linters#python#flake8#ClearVersionCache() AssertEqual \ '''flake8'' -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9']) Execute(The flake8 command callback should let you set options): let g:ale_python_flake8_options = '--some-option' AssertEqual \ '''flake8'' --some-option --stdin-display-name %s -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['3.0.4']) call ale_linters#python#flake8#ClearVersionCache() AssertEqual \ '''flake8'' --some-option -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9']) Execute(You should be able to set a custom executable and it should be escaped): let g:ale_python_flake8_executable = 'executable with spaces' AssertEqual \ 'executable with spaces', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''executable with spaces'' --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''executable with spaces'' --stdin-display-name %s -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['3.0.0']) Execute(The flake8 callbacks should detect virtualenv directories): silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/bar.py') AssertEqual \ g:dir . '/python_paths/with_virtualenv/env/bin/flake8', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''' . g:dir . '/python_paths/with_virtualenv/env/bin/flake8'' --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''' . g:dir . '/python_paths/with_virtualenv/env/bin/flake8''' \ . ' --stdin-display-name %s -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['3.0.0']) " Some users currently run flake8 this way, so we should support it. Execute(Using `python -m flake8` should be supported for running flake8): silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/bar.py') let g:ale_python_flake8_executable = 'python' let g:ale_python_flake8_options = '-m flake8 --some-option' AssertEqual \ 'python', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''python'' -m flake8 --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''python'' -m flake8 --some-option -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9']) call ale_linters#python#flake8#ClearVersionCache() " Leading spaces shouldn't matter let g:ale_python_flake8_options = ' -m flake8 --some-option' AssertEqual \ 'python', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''python'' -m flake8 --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''python'' -m flake8 --some-option -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9'])