README.md | 3 ++- autoload/lsp/diag.vim | 5 +++-- doc/lsp.txt | 12 ++++++++++-- plugin/lsp.vim | 2 ++ test/clangd_tests.vim | 3 +++ diff --git a/README.md b/README.md index 43e529c3bc9c13f24e6b204d08c46fa8dbadb95b..b65626ed1b089e123982fa270d62c5c7f8f81404 100644 --- a/README.md +++ b/README.md @@ -148,12 +148,13 @@ Command|Description -------|----------- :LspCodeAction|Apply the code action supplied by the language server to the diagnostic in the current line. :LspDiagCurrent|Display the diagnostic message for the current line -:LspDiagFirst|Display the first diagnostic message for the current buffer +:LspDiagFirst|Jump to the first diagnostic message for the current buffer :LspDiagHighlightDisable|Disable diagnostic message highlights :LspDiagHighlightEnable|Enable diagnostic message highlights :LspDiagNext|Jump to the next diagnostic message after the current position :LspDiagPrev|Jump to the previous diagnostic message before the current position :LspDiagShow|Display the diagnostics messages from the language server for the current buffer in a new location list. +:LspDiagThis|Jump to the current diagnostic message in the current line :LspFold|Fold the current file :LspFormat|Format a range of lines in the current file using the language server. The **shiftwidth** and **expandtab** values set for the current buffer are used when format is applied. The default range is the entire file. :LspGotoDeclaration|Go to the declaration of the keyword under cursor diff --git a/autoload/lsp/diag.vim b/autoload/lsp/diag.vim index ebe379cf961c54ced8ee7b97bd94b9396ec307a0..559217ce6c8badca36a448ae1f5c373b240b944e 100644 --- a/autoload/lsp/diag.vim +++ b/autoload/lsp/diag.vim @@ -350,11 +350,12 @@ # Find the entry just before the current line (binary search) var curlnum: number = line('.') var curcol: number = charcol('.') - for diag in (which == 'next') ? diags : diags->copy()->reverse() + for diag in (which == 'next' || which == 'this') ? diags : diags->copy()->reverse() var lnum = diag.range.start.line + 1 var col = diag.range.start.character + 1 - if (which == 'next' && (lnum > curlnum || lnum == curlnum && col > curcol)) + if (which == 'next' && (lnum > curlnum || lnum == curlnum && col > curcol)) || (which == 'prev' && (lnum < curlnum || lnum == curlnum && col < curcol)) + || (which == 'this' && (lnum == curlnum && col > curcol)) setcursorcharpos(lnum, col) return endif diff --git a/doc/lsp.txt b/doc/lsp.txt index d26b6b42ef2ca2b7aac2713c154d16f66428c83b..f1fd20935d8d9ca5f92dd00a7aa2b998185b743d 100644 --- a/doc/lsp.txt +++ b/doc/lsp.txt @@ -84,6 +84,8 @@ :LspDiagPrev Jump to the previous diagnostic message for the current buffer before the current current position. :LspDiagShow Display the diagnostics messages from the language server for the current buffer in a location list. +:LspDiagThis Jump to the current diagnostic message for the current + buffer in the current line (start from current column). :LspFold Fold the current file :LspFormat Format a range of lines in the current file using the language server. The default range is the entire file. @@ -395,6 +397,10 @@ messages (if any) from the language server for the current file and opens the location list window. You can use the Vim location list commands to browse the list. + + *:LspDiagThis* +:LspDiagThis Jumps to the location of the diagnostic message in + the current line (start from current column). *:LspFold* :LspFold Create folds for the current buffer. @@ -765,8 +771,10 @@ the current file in a |location-list-window|. You can use the |:LspDiagFirst| command to jump to the line with the first diagnostic message, the |:LspDiagNext| command to jump to the next nearest line with the diagnostic message, the |:LspDiagPrev| command to jump to the previous nearest line with -the diagnostic message. You can use the |:LspDiagCurrent| command to display -the entire diagnostic message from the language server for the current line. +the diagnostic message, the |:LspDiagThis| command to jump to the diagnostic +message in the current line. You can use the |:LspDiagCurrent| command to +display the entire diagnostic message from the language server for the current +line. By default, the lines with a diagnostic message have a sign placed on them and are highlighted. You can temporarily disable them for the current Vim session diff --git a/plugin/lsp.vim b/plugin/lsp.vim index f2f4aabad39f55595e3516f23500bfd9c06acf1b..0329114070efbfc5c24af681cafc0093001f4585 100644 --- a/plugin/lsp.vim +++ b/plugin/lsp.vim @@ -85,6 +85,7 @@ command! -nargs=0 -bar LspDiagHighlightEnable lsp.DiagHighlightEnable() command! -nargs=0 -bar LspDiagNext lsp.JumpToDiag('next') command! -nargs=0 -bar LspDiagPrev lsp.JumpToDiag('prev') command! -nargs=0 -bar LspDiagShow lsp.ShowDiagnostics() +command! -nargs=0 -bar LspDiagThis lsp.JumpToDiag('this') command! -nargs=0 -bar LspFold lsp.FoldDocument() command! -nargs=0 -bar -range=% LspFormat lsp.TextDocFormat(, , ) command! -nargs=0 -bar LspGotoDeclaration lsp.GotoDeclaration(v:false, ) @@ -149,6 +150,7 @@ anoremenu L&sp.Diagnostics.Show\ All :LspDiagShow anoremenu L&sp.Diagnostics.First :LspDiagFirst anoremenu L&sp.Diagnostics.Next :LspDiagNext anoremenu L&sp.Diagnostics.Prev :LspDiagPrev + anoremenu L&sp.Diagnostics.This :LspDiagThis if &mousemodel =~ 'popup' anoremenu PopUp.L&sp.Go\ to\ Definition diff --git a/test/clangd_tests.vim b/test/clangd_tests.vim index e38d2339a3a05f42c094f7c46d94570b07a47fa0..f405a860456cc559e66461529b7e5722817734bc 100644 --- a/test/clangd_tests.vim +++ b/test/clangd_tests.vim @@ -244,6 +244,9 @@ :LspDiagFirst assert_equal([3, 14], [line('.'), col('.')]) output = execute('LspDiagCurrent')->split("\n") assert_equal("Expected ';' at end of declaration (fix available)", output[0]) + :normal! 0 + :LspDiagThis + assert_equal([3, 14], [line('.'), col('.')]) :LspDiagNext assert_equal([5, 2], [line('.'), col('.')]) :LspDiagNext