使用 API 获取 Sublime Text 最近关闭的文件列表

Getting the Sublime Text recently closed file list with the API

有没有什么方法可以使用 Sublime Text API 获取最近关闭的文件列表?

SO Where is the list of recent files stored? 问题说它们存储在 Session.sublime_session 配置文件中,尽管我认为该文件仅在 ST 关闭时更新并且当前会话期间关闭的文件位于 [=13] =].

但是 .sublime_session 文件无法使用 API 的 load_settings(base_name) 方法加载。我完全不确定直接打开 .sublime_session 文件是否 安全

您可以使用以下命令(从 0 开始索引)打开最近关闭的文件...

sublime.active_window().run_command('open_recent_file', {"index": 0})

...但是有没有办法获取最近关闭的文件列表(使用 API)?

如果没有,打开 Auto Save Session.sublime_session 阅读是否安全?

谢谢。

首先,据我所知,打开Auto Save Session.sublime_session阅读是安全的。

Auto Save Session.sublime_session 是包含 ST v3 的 'live' 数据的文件;看起来 ST v2 只使用 Session.sublime_session 而没有使用等效的自动保存。

最近关闭的文件列表使用 file_history 键存储在 JSON 中。然而,它比我意识到的要复杂。最近关闭的文件列表是为每个人 window 保留的,如果有多个 ST windows 打开,这可以很容易地看到,文件菜单中的 Open Recent 将显示最近关闭了哪些文件只有 window。

最近关闭的文件列表(注意:复数)可以使用如下方式检索:

win_index = 0
auto_save_session_path = "/path/to/Auto Save Session.sublime_session"
with open(auto_save_session_path) as session_data_file:
    session_data = json.load(session_data_file)
    recently_closed_files = session_data["windows"][win_index]["file_history"]

显然,只检索第一个 window 的 file_history,要获取所有这些,需要循环遍历 [=17] 中保存的 window 条目列表=]键。

那么JSON中的哪个window对应激活的STwindow?

不幸的是,这比我希望的要棘手。 windows 键列表中的每个条目都有一个有用的发音 window_id,例如"window_id": 425,但它的值不对应于 API 的 sublime.active_window().id() 方法返回的整数。我文件中的 JSON "window_id": 425 条目对应于 window id() 数字 3。显然 ST 为每个 window 持有(至少)两个不同的 ID,一个用于.sublime_session 个文件和一个 Python API.

我可以看到识别活动 window 的唯一方法是使用 window 当前打开的缓冲区。 JSON windows 键列表中的每个条目都有一个 buffers 列表,其中包含 window 中当前打开的文件,这些可以与活动中打开的文件进行比较 window(可以使用 API 检索)以确定 JSON 文件中的哪个 window 条目包含活动 ST window 最近关闭的文件列表。

这种方法在理论上会有一些缺陷。例如,如果有 2 windows 打开但其中没有打开的文件,或者如果在 2 windows 中打开了一个文件(同一个文件),它将不起作用。当然,在现实世界中,这通常不会发生;多个 windows 被用户打开,以便他们可以在其中包含不同的文件。

原来还有一个问题; Auto Save Session.sublime_session 的更新频率。我认为没有静态的固定时间间隔。保存文件会触发立即更新,但打开和关闭文件以及 windows 不会,并且更新之间通常至少有几分钟的间隔。

这意味着使用 .sublime_session 文件中最近关闭的文件列表的插件甚至不能保证包含最近关闭的文件。

Keith 建议监控文件关闭并维护最近关闭文件的独立列表,正如 GotoRecent 所做的那样,这似乎是前进的方向,直到 ST API 添加获取最近关闭的文件列表的能力。

我希望这可以帮助任何调查此问题或想要使用 .sublime_session 文件存储其他数据的人。