From 570fc5d73d699c9bbbaf795cfc274a61d8544e72 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Sun, 7 Mar 2021 12:41:31 -0800 Subject: [PATCH] When jumping to a workspace symbol, save current location in the tag stack. When pushing entries to tag stack, remove later entries. Handle empty matches in symbol search properly --- autoload/handlers.vim | 4 ---- autoload/lsp.vim | 13 +++++++++++-- autoload/lspserver.vim | 22 ++++++---------------- autoload/util.vim | 11 +++++++++++ 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/autoload/handlers.vim b/autoload/handlers.vim index 923e2f3..86191c3 100644 --- a/autoload/handlers.vim +++ b/autoload/handlers.vim @@ -859,10 +859,6 @@ enddef # process the 'workspace/symbol' reply from the LSP server # Result: SymbolInformation[] | null def s:processWorkspaceSymbolReply(lspserver: dict, req: dict, reply: dict) - if reply.result->empty() - return - endif - var symbols: list> = [] var symbolType: string var fileName: string diff --git a/autoload/lsp.vim b/autoload/lsp.vim index 62124ca..f3a8973 100644 --- a/autoload/lsp.vim +++ b/autoload/lsp.vim @@ -7,7 +7,8 @@ import {WarnMsg, ErrMsg, lsp_server_trace, ClearTraceLogs, - GetLineByteFromPos} from './util.vim' + GetLineByteFromPos, + PushCursorToTagStack} from './util.vim' import {LspDiagsUpdated} from './buf.vim' # Needs Vim 8.2.2342 and higher @@ -1184,6 +1185,8 @@ def s:filterSymbols(lspserver: dict, popupID: number, key: string): bool popupID->popup_settext('') if query != '' lspserver.workspaceQuery(query) + else + []->setwinvar(popupID, 'LspSymbolTable') endif echo 'Symbol: ' .. query endif @@ -1208,8 +1211,14 @@ def s:jumpToWorkspaceSymbol(popupID: number, result: number): void return endif - var symTbl: list> = popupID->getwinvar('LspSymbolTable') + var symTbl: list> = popupID->getwinvar('LspSymbolTable', []) + if symTbl->empty() + return + endif try + # Save the current location in the tag stack + PushCursorToTagStack() + # if the selected file is already present in a window, then jump to it var fname: string = symTbl[result - 1].file var winList: list = fname->bufnr()->win_findbuf() diff --git a/autoload/lspserver.vim b/autoload/lspserver.vim index 1ae9c2d..e8942a6 100644 --- a/autoload/lspserver.vim +++ b/autoload/lspserver.vim @@ -13,7 +13,8 @@ import {WarnMsg, TraceLog, LspUriToFile, LspBufnrToUri, - LspFileToUri} from './util.vim' + LspFileToUri, + PushCursorToTagStack} from './util.vim' # LSP server standard output handler def s:output_cb(lspserver: dict, chan: channel, msg: string): void @@ -374,17 +375,6 @@ def s:getCompletion(lspserver: dict, triggerKind_arg: number): void lspserver.sendMessage(req) enddef -# push the current location on to the tag stack -def s:pushCursorToTagStack() - settagstack(winnr(), {items: [ - { - bufnr: bufnr(), - from: getpos('.'), - matchnr: 1, - tagname: expand('') - }]}, 'a') -enddef - # Request: "textDocument/definition" # Param: DefinitionParams def s:gotoDefinition(lspserver: dict): void @@ -395,7 +385,7 @@ def s:gotoDefinition(lspserver: dict): void return endif - s:pushCursorToTagStack() + PushCursorToTagStack() var req = lspserver.createRequest('textDocument/definition') # interface DefinitionParams # interface TextDocumentPositionParams @@ -413,7 +403,7 @@ def s:gotoDeclaration(lspserver: dict): void return endif - s:pushCursorToTagStack() + PushCursorToTagStack() var req = lspserver.createRequest('textDocument/declaration') # interface DeclarationParams @@ -433,7 +423,7 @@ def s:gotoTypeDef(lspserver: dict): void return endif - s:pushCursorToTagStack() + PushCursorToTagStack() var req = lspserver.createRequest('textDocument/typeDefinition') # interface TypeDefinitionParams @@ -453,7 +443,7 @@ def s:gotoImplementation(lspserver: dict): void return endif - s:pushCursorToTagStack() + PushCursorToTagStack() var req = lspserver.createRequest('textDocument/implementation') # interface ImplementationParams diff --git a/autoload/util.vim b/autoload/util.vim index 4da768e..54c334e 100644 --- a/autoload/util.vim +++ b/autoload/util.vim @@ -120,4 +120,15 @@ export def GetLineByteFromPos(bnr: number, pos: dict): number return col enddef +# push the current location on to the tag stack +export def PushCursorToTagStack() + settagstack(winnr(), {items: [ + { + bufnr: bufnr(), + from: getpos('.'), + matchnr: 1, + tagname: expand('') + }]}, 't') +enddef + # vim: shiftwidth=2 softtabstop=2 -- 2.48.1