From c6dc324add0d03cadd624bcd0f990207bdd4210a Mon Sep 17 00:00:00 2001 From: w0rp Date: Tue, 4 Oct 2016 18:24:46 +0100 Subject: [PATCH] Add a function for finding nearest files, and use it to fix JSHint so it will find configuration files automatically. --- ale_linters/javascript/jshint.vim | 28 ++++++++++++++++++++++------ plugin/ale/util.vim | 6 ++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/ale_linters/javascript/jshint.vim b/ale_linters/javascript/jshint.vim index 61f8faa..12c93f2 100644 --- a/ale_linters/javascript/jshint.vim +++ b/ale_linters/javascript/jshint.vim @@ -7,10 +7,26 @@ endif let g:loaded_ale_linters_javascript_jshint = 1 -" Set this to the location of the jshint configuration file -if !exists('g:ale_jshint_config_loc') - let g:ale_jshint_config_loc = '.jshintrc' -endif +function! ale_linters#javascript#jshint#GetCommand(buffer) + " Set this to the location of the jshint configuration file to + " use a fixed location for .jshintrc + if exists('g:ale_jshint_config_loc') + let jshint_config = g:ale_jshint_config_loc + else + " Look for the JSHint config in parent directories. + let jshint_config = ale#util#FindNearestFile(a:buffer, '.jshintrc') + endif + + let command = 'jshint --reporter unix' + + if jshint_config + let command .= ' --config ' . shellescape(jshint_config) + endif + + let command .= ' -' + + return command +endfunction function! ale_linters#javascript#jshint#Handle(buffer, lines) " Matches patterns line the following: @@ -54,13 +70,13 @@ endfunction call ALEAddLinter('javascript', { \ 'name': 'jshint', \ 'executable': 'jshint', -\ 'command': 'jshint --reporter unix --config ' . g:ale_jshint_config_loc . ' -', +\ 'command_callback': 'ale_linters#javascript#jshint#GetCommand', \ 'callback': 'ale_linters#javascript#jshint#Handle', \}) call ALEAddLinter('javascript.jsx', { \ 'name': 'jshint', \ 'executable': 'jshint', -\ 'command': 'jshint --reporter unix --config ' . g:ale_jshint_config_loc . ' -', +\ 'command_callback': 'ale_linters#javascript#jshint#GetCommand', \ 'callback': 'ale_linters#javascript#jshint#Handle', \}) diff --git a/plugin/ale/util.vim b/plugin/ale/util.vim index 64dd59d..d3f4457 100644 --- a/plugin/ale/util.vim +++ b/plugin/ale/util.vim @@ -24,3 +24,9 @@ let g:ale#util#stdin_wrapper = s:FindWrapperScript() function! ale#util#GetLineCount(buffer) return len(getbufline(a:buffer, 1, '$')) endfunction + +" Given a buffer and a filename, find the nearest file by searching upwards +" through the paths relative to the given buffer. +function! ale#util#FindNearestFile(buffer, filename) + return findfile(a:filename, fnamemodify(bufname(a:buffer), ':p') . ';') +endfunction