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..d6594db5 100644 --- a/autoload/ale/cursor.vim +++ b/autoload/ale/cursor.vim @@ -93,3 +93,28 @@ function! ale#cursor#EchoCursorWarningWithDelay() abort let s:cursor_timer = timer_start(10, function('ale#cursor#EchoCursorWarning')) endif endfunction + + +function! ale#cursor#ShowCursorDetail(...) abort + " Only show the details 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]) + + if l:index >= 0 + let l:loc = l:loclist[l:index] + if has_key(l:loc, 'detail') + echo l:loc.detail + endif + endif +endfunction diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim index bc834083..fdf19db2 100644 --- a/autoload/ale/engine.vim +++ b/autoload/ale/engine.vim @@ -332,6 +332,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/plugin/ale.vim b/plugin/ale.vim index 1d7f77a5..a3a407c4 100644 --- a/plugin/ale.vim +++ b/plugin/ale.vim @@ -208,6 +208,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. @@ -225,6 +228,7 @@ nnoremap (ale_next) :ALENext nnoremap (ale_next_wrap) :ALENextWrap nnoremap (ale_toggle) :ALEToggle nnoremap (ale_lint) :ALELint +nnoremap (ale_detail) :ALEDetail " Housekeeping diff --git a/test/test_cursor_warnings.vader b/test/test_cursor_warnings.vader index b12f2451..dbf5360f 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, @@ -84,3 +85,14 @@ Then(Check the cursor output): let g:lines = split(g:output, "\n") AssertEqual 'Missing radix parameter (radix)', 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:output[-1]