已知可获取文件所有符号,如何获取VS Code光标所在函数名?
获取VSCode光标所在函数名称的方法
当然可以,你可以结合vscode.executeDocumentSymbolProvider的结果和光标位置来实现,具体步骤如下:
第一步,获取当前编辑器的光标位置
通过vscode.window.activeTextEditor拿到当前编辑器实例,再通过selection.active获取光标所在的行、列位置。第二步,获取当前文档的所有符号
调用vscode.executeDocumentSymbolProvider并传入当前文档的URI,得到包含函数、类等元素的符号列表,每个符号都带有range属性标记自身的位置范围。第三步,匹配光标所在的函数符号
遍历所有符号,检查光标位置是否落在某个函数符号的range范围内。需要注意处理嵌套场景(比如函数内定义的子函数),要优先选择最内层的匹配符号。
示例代码片段:
async function getCurrentFunctionName() { const editor = vscode.window.activeTextEditor; if (!editor) return; const document = editor.document; const cursorPos = editor.selection.active; const symbols = await vscode.executeDocumentSymbolProvider(document.uri); // 递归遍历符号,定位最内层包含光标位置的函数 function findInnerFunction(symbols: vscode.DocumentSymbol[]): vscode.DocumentSymbol | undefined { let targetSymbol: vscode.DocumentSymbol | undefined; for (const symbol of symbols) { if (symbol.range.contains(cursorPos)) { targetSymbol = symbol; // 检查子符号,确认是否存在更内层的匹配 const innerMatch = findInnerFunction(symbol.children); if (innerMatch) targetSymbol = innerMatch; } } // 仅返回类型为函数的符号 return targetSymbol?.kind === vscode.SymbolKind.Function ? targetSymbol : undefined; } const functionSymbol = findInnerFunction(symbols as vscode.DocumentSymbol[]); return functionSymbol?.name; }
你也可以根据实际需求调整符号遍历逻辑,确保精准定位到光标当前所在的函数。
内容的提问来源于stack exchange,提问作者mike27
相关产品推荐
相关产品推荐

