lockai
一个面向「板端开发」的 VS Code 插件,把 SSH/SFTP 远程设备文件管理、编辑器内远程文件编辑、保存即同步、板端运行脚本等能力整合进 VS Code,让本地—板端协作开发像在同一台机器上一样顺畅。
功能概览
- 板端文件树:在活动栏的 Lockai 视图中以树形浏览板端 SFTP 目录,支持展开/折叠、跳转路径、刷新。
- 编辑器内直接编辑远程文件:通过虚拟文件系统
lockai-sftp:// 把板端文件像本地文件一样在 VS Code 编辑器中打开、编辑、保存(保存即写回板端)。
- 完整的文件操作:上传/下载、新建文件/文件夹、重命名、删除、复制路径,支持多选。
- 拖拽上传:从 Windows 资源管理器 / macOS Finder 直接把文件或文件夹拖到「板端文件」视图即可上传。
- 集成 SSH 终端:在 VS Code 集成终端中打开板端交互式 Shell,键盘输入实时转发到远程。
- 保存即同步:本地保存文件时按配置的本地→板端路径映射自动上传,支持排除规则和静默模式。
- 在板端运行:针对
.py / .sh 文件,在编辑器运行按钮下拉中提供「在板端运行」入口,自动上传并复用同一终端执行。
项目结构
j:\my\lockai
├── src/
│ ├── extension.ts # 插件入口:命令注册、事件监听、自动同步逻辑
│ └── ssh/
│ ├── sshManager.ts # SSH/SFTP 连接管理器(单例),状态/配置/路径工具
│ ├── sftpExplorerProvider.ts # 板端文件树视图(TreeDataProvider)
│ ├── sftpFileSystemProvider.ts # lockai-sftp:// 虚拟文件系统,支持编辑器内编辑
│ ├── sftpTreeDragAndDropController.ts # 外部文件拖拽上传控制器
│ └── sshTerminalProvider.ts # VS Code 终端 ↔ ssh2 Shell/exec 桥接(Pseudoterminal)
├── package.json # 命令、菜单、配置项、视图声明
├── tsconfig.json
└── README.md
核心模块说明
- 单例模式管理 SSH
Client 与 SFTPWrapper。
- 维护连接状态
disconnected | connecting | connected | error,通过 onDidChangeStatus 与 onDidChangeSftp 事件向外通知。
- 读取
lockai.ssh.* 配置(host/port/username/password/remotePath/keepaliveInterval/readyTimeout)。
- 提供远程路径工具函数:
normalizeRemotePath / joinRemotePath / parentRemotePath / basenameRemote。
- 实现
TreeDataProvider<SftpNode>,驱动 lockai.sftpExplorer 视图。
SftpNode 带 contextValue(root / folder / file / disconnected),用于在 package.json 的 view/item/context 中按节点类型条件显示菜单。
- 断开连接时返回
disconnected 占位节点,避免 VS Code 因空数组显示 viewsWelcome 而阻塞右键菜单交互。
- 实现刷新、跳转路径、打开远程文件、上传/下载/删除/重命名/新建等操作,并支持外部 Webview 媒体预览。
- 注册
lockai-sftp:// 虚拟文件系统,URI 形如 lockai-sftp:///home/user/file.txt。
- 实现
FileSystemProvider 的 stat / readDirectory / readFile / writeFile / rename / delete / createDirectory 等方法,把对远程文件的操作全部代理到 SFTP。
- 使远程文件能像本地文件一样在编辑器中打开、编辑、保存,保存时自动写回板端并触发树视图刷新。
- 接收
files MIME 类型(即外部文件资源管理器拖入)。
- 拖到文件夹 → 上传到该文件夹;拖到文件 → 上传到其所在目录;拖到空白 → 上传到当前目录。
- 未连接时弹出连接提示,桌面端优先使用
uri,web 端把字节写入临时文件后再上传。
- 实现
Pseudoterminal,把 VS Code 集成终端桥接到 ssh2 通道。
- 默认走交互式 Shell 模式(设备终端),可缓存初始命令在 Shell 就绪后送入。
- 提供
sendText / isAlive 等接口,支持「在板端运行」复用同一终端。
- 终端尺寸(cols/rows)随 VS Code 终端 resize 同步到远程 PTY。
activate 中注册全部命令、视图、文件系统、状态栏、保存事件监听。
- 自动同步核心逻辑:
autoSyncFile 在 onDidSaveTextDocument 触发,按 lockai.autoSync.mappings 解析本地→板端路径,匹配排除规则后用 sftp.fastPut 上传,并刷新树视图。
- 「在板端运行」:解析目标 URI(板端文件直接用,本地文件通过映射或回退到
/tmp/<文件名>),必要时先 ensureRemoteDir + 上传,再复用 boardRunTerminalRef 终端发送命令。
命令清单
| 命令 ID |
标题 |
说明 |
lockai.ssh.connect |
连接板端 |
读取配置并发起 SSH/SFTP 连接 |
lockai.ssh.disconnect |
断开连接 |
关闭当前 SSH 连接 |
lockai.ssh.configure |
配置连接参数 |
通过输入框引导填写 host/port/username/password/remotePath 并保存 |
lockai.ssh.openSettings |
打开设置 |
跳转到 lockai.ssh 设置页 |
lockai.ssh.refreshExplorer |
刷新板端文件 |
刷新树视图当前目录 |
lockai.ssh.goToPath |
跳转到路径 |
输入板端路径直接定位 |
lockai.ssh.openRemoteFile |
打开 |
在编辑器中打开远程文件 |
lockai.ssh.revealRemoteFile |
在板端文件中打开 |
在树中定位当前编辑器打开的远程文件 |
lockai.ssh.uploadFile |
上传文件到板端 |
选择本地文件上传 |
lockai.ssh.uploadFolder |
上传文件夹到板端 |
选择本地文件夹递归上传 |
lockai.ssh.downloadFile |
下载到本地 |
把远程文件下载到本地 |
lockai.ssh.deleteRemote |
删除 |
删除远程文件/文件夹(支持多选、Delete 键) |
lockai.ssh.createRemoteFolder |
新建文件夹 |
在当前/选中目录下创建子目录 |
lockai.ssh.createRemoteFile |
新建文件 |
在当前/选中目录下创建空文件 |
lockai.ssh.renameRemote |
重命名 |
重命名远程节点(支持 F2 键) |
lockai.ssh.copyRemotePath |
复制路径 |
复制板端绝对路径到剪贴板 |
lockai.ssh.openTerminal |
打开 SSH 终端 |
新建集成终端连接板端 Shell |
lockai.autoSync.toggle |
开启/关闭自动同步 |
切换 lockai.autoSync.enabled |
lockai.autoSync.addMapping |
添加本地-板端路径映射 |
通过输入框添加一条映射 |
lockai.autoSync.currentFile |
立即同步当前文件 |
手动触发当前编辑器文件同步 |
lockai.autoSync.openSettings |
打开同步设置 |
跳转到 lockai.autoSync 设置页 |
lockai.runOnBoard |
在板端运行 |
把 .py / .sh 文件上传并在板端终端执行 |
配置项
lockai.ssh.*(连接参数)
| 配置项 |
类型 |
默认值 |
说明 |
lockai.ssh.host |
string |
"" |
板端 IP 地址 |
lockai.ssh.port |
number |
22 |
SSH 端口 |
lockai.ssh.username |
string |
"" |
登录用户名 |
lockai.ssh.password |
string |
"" |
登录密码 |
lockai.ssh.remotePath |
string |
/ |
SFTP 浏览起始路径 |
lockai.ssh.keepaliveInterval |
number |
10000 |
SSH keepalive 间隔(毫秒),0 禁用 |
lockai.ssh.readyTimeout |
number |
20000 |
连接就绪超时(毫秒) |
lockai.autoSync.*(保存即同步)
| 配置项 |
类型 |
默认值 |
说明 |
lockai.autoSync.enabled |
boolean |
true |
是否启用保存后自动同步 |
lockai.autoSync.mappings |
array |
[] |
本地→板端文件夹映射,如 [{ "local": "C:/project", "remote": "/home/user/project" }] |
lockai.autoSync.excludePatterns |
array |
["**/.git/**", "**/node_modules/**", "**/*.log", "**/.DS_Store"] |
同步排除的 glob 模式 |
lockai.autoSync.silentMode |
boolean |
false |
静默模式:成功不弹窗,仅状态栏显示 |
lockai.run.*(在板端运行)
| 配置项 |
类型 |
默认值 |
说明 |
lockai.run.pythonInterpreter |
string |
python3 |
板端运行 .py 使用的解释器 |
lockai.run.shellInterpreter |
string |
bash |
板端运行 .sh 使用的解释器 |
快捷键
| 键 |
命令 |
触发条件 |
F2 |
lockai.ssh.renameRemote |
已连接且焦点在板端文件视图或 lockai-sftp 文件 |
Delete |
lockai.ssh.deleteRemote |
焦点在板端文件视图且已连接 |
使用流程
- 在 VS Code 设置中填写
lockai.ssh.host / port / username / password,或执行 Lockai SSH: 配置连接参数 命令交互式填写。
- 点击活动栏 Lockai 图标,在「板端文件」视图中点连接按钮(或执行
Lockai SSH: 连接板端)。
- 连接成功后即可在树中浏览、右键操作远程文件,或双击在编辑器中直接编辑保存。
- (可选)在
lockai.autoSync.mappings 中配置本地→板端路径映射,开启保存即同步。
- (可选)打开
.py / .sh 文件,点编辑器右上角运行按钮下拉中的「在板端运行」,自动上传并执行。
环境与依赖
- VS Code 最低版本:
^1.100.0(@types/vscode 锁定 1.100.0)
- 运行时依赖:
ssh2 ^1.17.0
- 开发依赖:TypeScript
^6.0.3、ESLint ^10.5.0、@vscode/test-cli / @vscode/test-electron
编译与调试
npm install # 安装依赖
npm run compile # tsc -p ./ 编译到 out/
npm run watch # 增量编译,便于调试
npm run lint # eslint src
npm test # vscode-test 运行单测
按 F5 在「扩展开发宿主」中调试本插件(见 .vscode/launch.json)。
| |