- 文件操作(
file-actions.wit,API 1.3):创建、重命名或删除文件的快速修复和重构,作为一次可撤销的工作区编辑应用。 - 项目文件(
workspace.wit):读取、写入、查找和搜索打开项目中的文件。 - 其他文件(
fs.wit,API 1.3):在明确授权下访问项目之外的文件,以及插件自己的私有目录。 - 文件模板:文件 › 新建… 菜单中的条目,不需要代码。
文件操作
文件操作是一种代码操作,结果是一组文件操作加文本编辑。声明code-actions 提供者类型(与纯文本快速修复相同),
实现 openidea_plugin::file_actions::FileActions,并与 providers 一起注册:
⌥⏎ / Alt+Enter)中,同样受 50 ms 编辑器预算约束。
FileAction 记录
规则:
- 文件操作和编辑是一次工作区编辑:任何一步失败都不会应用任何改动,一次撤销即可全部还原。撤销
Delete会恢复文件。 - 文件已存在时
Create会失败,除非设置overwrite;缺失的父目录会自动创建。 - 路径为绝对路径或相对项目根目录,且必须在项目内;路径超出项目时该操作不可用。
选中时再计算
返回带data、operations 和 edits 为空的操作即可推迟计算。用户选中它时,宿主调用
resolve_file_action(doc, action),使用 5 秒命令预算而不是 50 ms。与 resolve_code_action 一样,
host::pick、pick_many、input 和 confirm 会在编辑器所在窗口询问,等待时间不计入预算。
返回 Error::Cancelled 或没有任何改动的操作即可放弃。
项目文件
在打开的项目中,插件通过Project 句柄操作文件(命令和事件中用 ctx.project(),提供者中用
host::project_of(path),所有打开的项目用 host::projects())。除 write_file 外都需要 project.read:
路径为绝对路径或相对根目录。
.. 以及跳出根目录的符号链接会被拒绝。在远程项目中,这些调用在服务器上、紧挨着文件执行。
另有两个相关调用不需要权限,只能在窗口的命令或事件中使用:host::pick_directory(title, initial)(API 1.3)
打开系统的文件夹选择器;host::open_project(path, new_window)(API 1.3)走正常的 文件 › 打开… 流程,
包括信任提示。路径都属于界面所在的机器。
项目之外的文件
host::fs(WIT fs.wit,API 1.3)读写打开项目之外的文件:插件所集成工具的配置、许可证文件、安装在别处的程序等。
每次调用都会对照授权检查:
- 路径为绝对路径,或以
~/开头。授权可以覆盖一个目录(任意深度)或一个文件。比较前会先解析为真实路径, 所以指向授权目录之外的符号链接会被拒绝,/opt/see也不会覆盖/opt/seeyon。 - 授权整个文件系统(
/、C:\)会在读取清单时被拒绝。 fs.write不包含fs.read。目录不存在、文本无法按原编码写入,或编辑器中有该文件未保存的修改时,写入返回Error::Invalid。- 两者都是高风险权限,安装页面会明确提示用户。
私有目录
host::fs::plugin_dir() 返回只属于本插件的目录,与插件安装的代码和键值 storage 分开。在其中读写不需要任何
fs.* 或 project.read 授权,即使在激活期间或没有项目的提供者调用中也可以。目录以仅所有者可访问的方式创建
(Unix 上为 0700,Windows 上为仅所有者 ACL),在空闲回收、重新加载、更新和重启后都保留,卸载时删除。
适合存放生成的内容或超过 storage 容量的缓存。其中的路径可以用于 host::open_location,也可以作为已批准程序的参数。
文件模板
[[contributes.fileTemplates]] 在 文件 › 新建… 菜单中添加条目。不需要代码,也不授予任何文件访问权限:
只有用户调用模板时,才通过 IDE 正常的新建文件流程创建文件。
engines.openidea = "^1.3" 后,fileName 可以直接创建确切的文件名(包括点文件),不再询问名称;
variables 会在新建文件对话框中添加必填文本框,用 $NAME$ 或 ${NAME} 插入:
NAME、PACKAGE、END 等)。$PACKAGE$
按扩展名使用内置规则推断(Java 和 Kotlin 用源码根目录,PHP 用 Composer PSR-4 映射等)。