diff options
-rw-r--r-- | ale_linters/elm/make.vim | 1 | ||||
-rw-r--r-- | autoload/ale/cursor.vim | 49 | ||||
-rw-r--r-- | autoload/ale/engine.vim | 4 | ||||
-rw-r--r-- | doc/ale.txt | 8 | ||||
-rw-r--r-- | plugin/ale.vim | 4 | ||||
-rw-r--r-- | test/test_cursor_warnings.vader | 25 |
6 files changed, 73 insertions, 18 deletions
diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim index 23297838..3a4febc9 100644 --- a/ale_linters/elm/make.vim +++ b/ale_linters/elm/make.vim @@ -25,6 +25,7 @@ function! ale_linters#elm#make#Handle(buffer, lines) abort \ 'col': l:error.region.start.column, \ 'type': (l:error.type ==? 'error') ? 'E' : 'W', \ 'text': l:error.overview, + \ 'detail': l:error.overview . "\n\n" . l:error.details \}) endif endfor diff --git a/autoload/ale/cursor.vim b/autoload/ale/cursor.vim index 9aaa8e91..7a9cfc80 100644 --- a/autoload/ale/cursor.vim +++ b/autoload/ale/cursor.vim @@ -38,34 +38,32 @@ function! ale#cursor#TruncatedEcho(message) abort endtry endfunction +function! s:FindItemAtCursor() abort + let l:info = get(g:ale_buffer_info, bufnr('%'), {'loclist': []}) + let l:pos = getcurpos() + let l:index = ale#util#BinarySearch(l:info.loclist, l:pos[1], l:pos[2]) + let l:loc = l:index >= 0 ? l:info.loclist[l:index] : {} + + return [l:info, l:loc] +endfunction + function! ale#cursor#EchoCursorWarning(...) abort " Only echo the warnings in normal mode, otherwise we will get problems. if mode() !=# 'n' return endif - let l:buffer = bufnr('%') - - if !has_key(g:ale_buffer_info, l:buffer) - return - endif - - let l:pos = getcurpos() - let l:loclist = g:ale_buffer_info[l:buffer].loclist - let l:index = ale#util#BinarySearch(l:loclist, l:pos[1], l:pos[2]) + let [l:info, l:loc] = s:FindItemAtCursor() - if l:index >= 0 - let l:loc = l:loclist[l:index] + if !empty(l:loc) let l:msg = s:GetMessage(l:loc.linter_name, l:loc.type, l:loc.text) call ale#cursor#TruncatedEcho(l:msg) - let g:ale_buffer_info[l:buffer].echoed = 1 - else + let l:info.echoed = 1 + elseif get(l:info, 'echoed') " We'll only clear the echoed message when moving off errors once, " so we don't continually clear the echo line. - if get(g:ale_buffer_info[l:buffer], 'echoed') - echo - let g:ale_buffer_info[l:buffer].echoed = 0 - endif + echo + let l:info.echoed = 1 endif endfunction @@ -93,3 +91,20 @@ function! ale#cursor#EchoCursorWarningWithDelay() abort let s:cursor_timer = timer_start(10, function('ale#cursor#EchoCursorWarning')) endif endfunction + +function! ale#cursor#ShowCursorDetail(...) abort + " Only echo the warnings in normal mode, otherwise we will get problems. + if mode() !=# 'n' + return + endif + + let [l:info, l:loc] = s:FindItemAtCursor() + + if !empty(l:loc) + if has_key(l:loc, 'detail') + echo l:loc.detail + else + echo l:loc.text + endif + endif +endfunction diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim index ffef76a9..0707aa40 100644 --- a/autoload/ale/engine.vim +++ b/autoload/ale/engine.vim @@ -338,6 +338,10 @@ function! ale#engine#FixLocList(buffer, linter, loclist) abort \ 'linter_name': a:linter.name, \} + if has_key(l:old_item, 'detail') + let l:item.detail = l:old_item.detail + endif + if l:item.lnum == 0 " When errors appear at line 0, put them at line 1 instead. let l:item.lnum = 1 diff --git a/doc/ale.txt b/doc/ale.txt index 72daa97f..af26b9c9 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -1173,6 +1173,14 @@ ALEToggle *ALEToggle* quickfix items, signs, current jobs, etc. Calling this option will change the |g:ale_enabled| variable. + +ALEDetail *ALEDetail* + + Show the full linter message for the current line. This will only have an + effect on lines that contain a linter message. + + A plug mapping `<Plug>(ale_detail)` is defined for this command. + =============================================================================== 7. API *ale-api* diff --git a/plugin/ale.vim b/plugin/ale.vim index 90505f29..e69aba18 100644 --- a/plugin/ale.vim +++ b/plugin/ale.vim @@ -212,6 +212,9 @@ command! ALEPreviousWrap :call ale#loclist_jumping#Jump('before', 1) command! ALENext :call ale#loclist_jumping#Jump('after', 0) command! ALENextWrap :call ale#loclist_jumping#Jump('after', 1) +" A command for showing error details. +command! ALEDetail :call ale#cursor#ShowCursorDetail() + " A command for turning ALE on or off. command! ALEToggle :call s:ALEToggle() " A command for linting manually. @@ -229,6 +232,7 @@ nnoremap <silent> <Plug>(ale_next) :ALENext<Return> nnoremap <silent> <Plug>(ale_next_wrap) :ALENextWrap<Return> nnoremap <silent> <Plug>(ale_toggle) :ALEToggle<Return> nnoremap <silent> <Plug>(ale_lint) :ALELint<Return> +nnoremap <silent> <Plug>(ale_detail) :ALEDetail<Return> " Housekeeping diff --git a/test/test_cursor_warnings.vader b/test/test_cursor_warnings.vader index ab7937bd..75d6c975 100644 --- a/test/test_cursor_warnings.vader +++ b/test/test_cursor_warnings.vader @@ -10,7 +10,8 @@ Before: \ 'nr': -1, \ 'type': 'E', \ 'col': 10, - \ 'text': 'Missing semicolon. (semi)' + \ 'text': 'Missing semicolon. (semi)', + \ 'detail': 'Every statement should end with a semicolon' \ }, \ { \ 'lnum': 2, @@ -123,3 +124,25 @@ Then(Check the cursor output): let g:lines = split(g:output, "\n") AssertEqual 'Infix operators must be spaced. (space-infix-ops)', g:lines[-1] + +Execute(Evaluate the cursor detail function at line 1): + :1 + call ale#cursor#ShowCursorDetail() + +Then(Check the cursor output): + redir => g:output + :mess + redir END + + AssertEqual "Every statement should end with a semicolon", g:lines[-1] + +Execute(Evaluate the cursor detail function at line 2): + :2 + call ale#cursor#ShowCursorDetail() + +Then(Check the cursor output): + redir => g:output + :mess + redir END + + AssertEqual "Infix operators must be spaced. (space-infix-ops)", g:lines[-1] |