Ctrl+R是最直接可靠的函数列表视图,无需插件、不卡顿、单文件即用;其显示内容完全依赖语法包是否声明entity.name.function作用域,若右下角为Plain Text或文件未保存则无法索引。

Ctrl+R 是最直接、最可靠的方式,无需插件、不卡顿、单文件即用;其他方式要么不准,要么依赖额外索引或配置。
Ctrl+R 为什么有时只列类不列函数
它不是“搜索”,而是读取当前文件的 symbol_list,完全依赖语法高亮包是否声明了 entity.name.function 作用域。常见失效点:
- 右下角显示
Plain Text→ 点击它手动选为Python或JavaScript,否则符号解析器根本没启动 - 刚写完
def my_func():就按Ctrl+R→ 先按Ctrl+S保存,未保存内容不进索引 - Python 中
_private_func不出现 → 这是语言包默认行为,不是 bug;JS 中const fn = () => {}也不识别,原生只捕获function fn() {}和class声明 - 输
init能命中__init__、initialize→ 支持模糊匹配,不用输全名
Ctrl+P @xxx 跨文件跳转总失败
这个功能不走 LSP,但对输入格式和项目状态极其敏感:
-
@必须紧贴函数名前:@load_config✅,load_config@❌,@ load_config(带空格)❌ - 首次使用大项目会卡顿 2–5 秒 → 等状态栏 “
Indexing…” 消失再输,索引未完成时结果为空或不准 - 输
utils.py@parse_config→ 直接打开utils.py并跳转到定义行;输@parse_config→ 在所有已索引文件中匹配def parse_config或function parse_config - 函数名含下划线或驼峰,支持分词匹配:
@handCli可命中handle_click;但@MyClass.method无效,不支持嵌套层级
F12 / Ctrl+Click 为什么总跳到 import 行
原生 goto_definition 是纯字符串匹配,完全不理解模块路径、import 别名或作用域:
-
from requests import get→ 光标在get()上按F12,大概率跳到这行import,而不是requests/api.py里的def get() -
import numpy as np→ 点np.array不跳,因为np是别名,原生不resolve -
@cache包裹的函数 → 匹配目标变成装饰器返回值,不是原始def行 -
getattr(obj, 'load')或obj.__getattribute__('load')→ 完全无法推断,直接跳空
什么时候必须上 LSP
如果你遇到以下任意一种情况,LSP 不是“增强项”,而是必要项:
- 需要跳进第三方库源码(比如点
pd.DataFrame进pandas/core/frame.py) - 要识别类型提示(
def foo(x: str) -> int:)、泛型、协议(Protocol) - 处理装饰器链(
@lru_cache @staticmethod)、动态属性访问(getattr、__getattr__) - 跨文件跳转在复杂框架中频繁失效(Django 视图、FastAPI 路由、Spring Boot Controller)
真正容易被忽略的是:LSP 的精度取决于语言服务器本身是否支持你用的语法特性,比如 Python 的 pyright 对 __future__.annotations 支持好,但对某些自定义 AST 插件就无能为力——得看 server,不是看 Sublime。











