diff --git a/autoload/LSP.vim b/autoload/LSP.vim index 9cdadb223..243fbe574 100644 --- a/autoload/LSP.vim +++ b/autoload/LSP.vim @@ -1,5 +1,18 @@ " TODO: make buffer aware. +function! LSP#GetQfListIdForTitle(title) abort + echom a:title + let headnr=getqflist({ 'id':0 ,'nr':'$', 'title': 0}).nr + while headnr >= 0 + let qflistat= getqflist({'id':0,'nr':headnr,'title':0}) + if qflistat.title==a:title + return qflistat.id + endif + let headnr = headnr-1 + endwhile + return-1 "not found +endfunction + function! LSP#filename() abort " When executing autocommand, `%` might have already changed. let l:filename = expand(':p') diff --git a/src/language_server_protocol.rs b/src/language_server_protocol.rs index c38a81006..95be57d13 100644 --- a/src/language_server_protocol.rs +++ b/src/language_server_protocol.rs @@ -684,7 +684,15 @@ impl LanguageClient { let diagnostics_list = self.get(|state| state.diagnostics_list)?; match diagnostics_list { DiagnosticsList::Quickfix => { - self.vim()?.setqflist(&qflist, "r", title)?; + //Has to be atomic + self.update(|state| { + let id = state.vim.getqfid(title)?; + if id != -1 { + state.vim.updateqflist(&qflist, title, id) + } else { + state.vim.addnewqflist(&qflist, title) + } + })?; } DiagnosticsList::Location => { self.vim()?.setloclist(&qflist, "r", title)?; diff --git a/src/vim.rs b/src/vim.rs index 1c054a126..7a64671b7 100644 --- a/src/vim.rs +++ b/src/vim.rs @@ -206,6 +206,25 @@ impl Vim { Ok(()) } + pub fn updateqflist(&self, list: &[QuickfixEntry], title: &str, id: i32) -> Result<()> { + info!("Begin updateqflist"); + let parms = json!([[], "r" ,{"title":title,"id":id, "items":list}]); + self.rpcclient.notify("setqflist", parms)?; + Ok(()) + } + + pub fn addnewqflist(&self, list: &[QuickfixEntry], title: &str) -> Result<()> { + info!("Begin addnewqflist"); + let parms = json!([[], " ",{"title":title, "items":list}]); + self.rpcclient.notify("setqflist", parms)?; + Ok(()) + } + + pub fn getqfid(&self, title: &str) -> Result { + info!("Begin getqfid"); + self.rpcclient.call("LSP#GetQfListIdForTitle", title) + } + pub fn setqflist(&self, list: &[QuickfixEntry], action: &str, title: &str) -> Result<()> { info!("Begin setqflist"); let parms = json!([list, action]);