FnList 函数列表
极速、轻量的函数导航面板。 打开工程立刻看到当前文件的函数、宏、类型与全局变量 ——
不用等语言服务,不用装依赖。
英文简介见文末 → English summary ↓(面板界面目前为中文)
面板从上到下是三块:搜索与排序工具栏(版本号在搜索框最右端)、置顶模块(没有置顶时自动隐藏)、
函数列表(文件名行固定在模块顶部,不随列表滚动,右端是该文件的符号数 ——
搜索时显示「命中 / 共 N」,鼠标悬停可看整个工程的符号与文件总数)。
列表里每个符号都有图标与配色区分类型,图标取自 VSCode 官方 codicon、与自带大纲同源 ——
函数=实心立方体、函数原型=同款空心轮廓、宏=常量方框、类型=结构方块、变量=变量括号;
函数原型另标 「声明」 文字。
功能
符号导航
- 列出当前文件的函数、宏定义、类型(struct / enum / class / typedef)与全局变量
- 跟随编辑器自动切换文件,无需手动刷新
- 「当前文件」= 活动标签页里的那个代码文件:切到扩展详情页、设置、欢迎页这类非代码页面,
或关掉所有文件时,列表会空着并提示原因(与 VSCode 自带大纲的行为一致);
版本对比视图(时间线 / git diff)里认修改侧,也就是你正在编辑的那个工作副本,
点函数只移动光标、不会把你弹出对比
- 声明与定义一眼可辨:函数定义为实心立方体,函数原型为同款空心轮廓并标有
「声明」 文字(与 VSCode 自带大纲写法一致)
- 签名只保留参数类型:
(device_t *dev, block_set_t *blocks) 简化为 (device_t *, block_set_t *),
长函数名也能完整显示;无参函数显示 (void) 而不是空括号
- 带参宏显示参数名
MIN (a, b),与自带大纲一致
置顶(书签)
- 任意行都能置顶:光标在函数起始行记为该函数,否则记该行内容
- 双作用域:当前文件置顶(只在本文档显示)与跨文件置顶(本工作区内所有文件可见)。
置顶随当前工作区存储 —— 换工作区打开、目录改名 / 移动、换机器都不会跟随
- 置顶区固定在顶部,不随下方列表滚动 —— 翻到列表深处想点置顶,不用再滚回去
- 一键清除:置顶栏右侧的按钮点一下即清空全部置顶(所有文件、两种作用域),
并弹出可点的「撤销」,误点也能一键找回,不需要弹窗确认
- 改代码后按名字自动重新绑定行号,函数上下移动也不会失联
- 函数被删掉(或改名)时书签保留并标「函数不存在」;文件被删(或重命名)时标「文件不存在」,
两种情况都灰显不可点,函数或文件回来后自动恢复
搜索
- 包含匹配、不区分大小写:搜
read 会命中 read_stream、ReadBuffer
- 框内按
↑ ↓ 找回历史:回车或点击结果时记入,最多 10 条,去重后最近的在最前
- 搜索只过滤符号列表,置顶区始终完整显示
交互
- 光标跟随:在代码里移动光标,列表自动高亮当前函数并滚动到可见处;切换高亮有一次柔和的放大缓动
- 滚动丝滑:行元素与行索引一一绑定,滚动时零 DOM 重建,由浏览器原生滚动平移
- 键盘操作:搜索框内
↑ ↓ 翻历史,列表内 ↑ ↓ 移动高亮、Enter 跳转、Esc 清空搜索
- 单击 / 双击:单击以预览标签打开、焦点留在列表;双击打开常驻标签并聚焦编辑器
- 深色与浅色主题均完整适配
快捷键
| 命令 |
macOS |
Windows / Linux |
| 搜索函数(聚焦面板搜索框) |
⌃⌥F |
Ctrl+Alt+F |
| 置顶 / 取消置顶当前行(当前文件) |
⌃⌥B |
Ctrl+Alt+B |
| 置顶 / 取消置顶当前行(本工作区跨文件) |
⌃⌥⇧B |
Ctrl+Alt+Shift+B |
| 打开函数列表 |
⌃⌥L |
Ctrl+Alt+L |
自定义快捷键
键位走 VSCode 标准机制,插件不做任何锁定,改键与恢复默认都原生支持。
注意:改键在「键盘快捷方式」面板,不是「设置」页(设置里只能改参数,改不了键):
- 打开面板:左下角齿轮 ⚙ → 键盘快捷方式;或菜单 Code → 设置 → 键盘快捷方式;
快捷键是和弦——macOS 按
⌘K 松开再按 ⌘S,Windows / Linux 按 Ctrl+K 松开再按 Ctrl+S
- 改键:面板里搜索
FnList → 双击命令 → 按下新组合(例如 Alt+N)→ 回车,立即生效
- 一键恢复默认:面板里右键命令 → 重置键位,即回到默认;想整体还原,
打开
keybindings.json 删掉自己加的条目即可
- 「置顶 / 取消置顶」是开关式:同一键按第二次即取消(与 VSCode 切换注释同习惯)
- 「重建索引」「查看被跳过的文件」没有默认键,可在同一面板自行绑定
设置
| 设置项 |
默认值 |
说明 |
fnlist.includeExtensions |
C/C++ 家族与 py(17 项) |
需要索引的文件扩展名;其它语言可自行添加(尽力识别) |
fnlist.excludeGlobs |
[] |
额外排除的 glob,例如 **/third_party/** |
fnlist.maxFileKB |
300 |
超过该大小的文件后台跳过;当前打开的文件放宽到 10 倍(约 3MB),超过仍跳过 |
fnlist.maxFiles |
50000 |
扫描文件数上限 |
fnlist.retainFiles |
2000 |
符号表保留上限(超出按最久未使用淘汰) |
支持的语言与已知取舍
面板的秒出、零依赖、离线可用,靠的是自带启发式扫描器(直接读源码,不依赖语言服务)。
代价是准确度低于语言服务,因此默认只索引验证过的语言:
- C / C++(含 h / hpp / cc / cxx 等别名):宏修饰签名(
API_EXPORT void fn(void))、
C++ 类外定义、__attribute__ 尾缀、extern "C" 包裹、K&R 风格函数、嵌套注释与字符串屏蔽
- Python:
def / class
已知边界(是设计取舍,不是 bug):
- 只收顶层符号,类 / 结构体内的方法不收(例如 Java / C# 工程只会列出类名)
- 条件编译只走主分支:
#if 0 … #else 里的 #else 分支不会被收录
- Python 按行启发识别,文档字符串里形似代码的内容可能产生误报
- 其它语言(Go、Rust、TypeScript、Swift 等)可在
fnlist.includeExtensions 自行添加,
属尽力识别:带类型注解的声明可能被认成变量名,漏检时也没有提示
- 拿不准时与 VSCode 自带大纲对照:大纲有、本面板没有 → 大概率是上述边界;
两边都没有 → 才值得当 bug 报
性能
自带一个轻量扫描器直接读源码建索引,不依赖语言服务,因此打开工程就能出结果:
- 零依赖:纯 JavaScript,无第三方包、无编译步骤、无网络请求
- 后台有界并发索引(8 路,逐个让出事件循环):实测 600 个文件扫描期间最长停顿 11ms,不卡输入
- 增量更新:文件改动即时重解析;与全量扫描共用同一套排除规则(
excludeGlobs、
files.exclude、search.exclude 及内置的 node_modules/build 等)
- 内存与符号数线性相关,约 0.3 KB/符号 —— 万级符号的工程在 2 MB 上下;
超出保留上限时按最久未使用淘汰(当前文件与置顶文件永不淘汰),内存不会无限增长
- 面板查询是纯内存过滤:无论工程多大都在 0.05ms 量级
- 超大文件降级:超过
fnlist.maxFileKB 的文件后台跳过并在文件名行右侧提示,点击可查看清单;
当前打开的文件放宽到 10 倍阈值(约 3MB)内始终全量解析,超过硬上限仍降级跳过
隐私
全部处理都在本地完成:只读取工作区内的源文件,不联网、不上传任何代码。
English
FnList is a fast, lightweight function list for VS Code. Open a project and the panel
immediately shows the functions, macros, types and globals of the current file — no language
server, no dependencies, no network requests. It also gives you per-file / per-workspace pins,
search history, cursor follow and smooth virtual scrolling.
The panel UI is in Chinese — this extension is Chinese-only at the moment, and the
documentation above is Chinese for that reason. This summary is here so English readers can
see what the extension does before installing.
- Symbols of the current file — functions, macros, types (struct / enum / class / typedef)
and global variables. "Current file" means the code file in the active tab: in a comparison
view (timeline / git diff) it is the editable side, while a non-code tab or no open file at
all leaves the panel empty and tells you why
- Pins (bookmarks) — pin any line, with two scopes: this file, or this workspace (visible
from every file). Stored per workspace, and re-bound by name when code moves
- Search — substring match, case-insensitive;
↑ ↓ inside the box walks up to 10 recent
queries
- Click / double-click a symbol — single click opens it as a preview tab and keeps focus in
the list; double click opens a permanent tab and focuses the editor. When the target file is
already the file of the active tab (including the working copy inside a diff view), the
cursor is simply moved and you are not pulled out of the comparison
- Keys —
⌃⌥F search, ⌃⌥B pin in this file, ⌃⌥⇧B pin in this workspace, ⌃⌥L open the
panel (Ctrl+Alt+… on Windows / Linux); all of them are rebindable in Keyboard Shortcuts
- Languages — C / C++ and Python are verified; others can be added through
fnlist.includeExtensions (best-effort heuristics). Only top-level symbols are collected:
methods inside a class or struct are not listed
- Privacy — everything runs locally; it only reads source files in your workspace and never
uploads code
Settings: fnlist.includeExtensions, fnlist.excludeGlobs, fnlist.maxFileKB,
fnlist.maxFiles, fnlist.retainFiles.