【问题标题】:Getting the Sublime Text recently closed file list with the API使用 API 获取 Sublime Text 最近关闭的文件列表
【发布时间】:2016-01-16 13:51:34
【问题描述】:

有没有办法使用 Sublime Text API 获取最近关闭的文件列表?

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

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

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

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

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

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

谢谢。

【问题讨论】:

  • 我相信打开Auto Save Session.sublime_session 阅读应该是安全的。想到的另一种可能性是跟踪文件何时关闭,并维护您自己的最近关闭文件列表。也许这个插件做了类似的事情:packagecontrol.io/packages/GotoRecent
  • 为什么不试试看会发生什么?
  • @KeithHall 感谢您的建议,我已经知道该软件包,但希望有一个更简单的解决方案。这种方法似乎是唯一可靠的前进方式。
  • @MattDMo 我昨晚花了几个小时来做​​这件事,但今天下午才有时间写下来。请参阅下面的答案。

标签: sublime-text-plugin


【解决方案1】:

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

Auto Save Session.sublime_session 是其中包含 ST v3 的“实时”数据的文件;看起来 ST v2 只使用 Session.sublime_session 并且不使用自动保存等效项。

最近关闭的文件列表使用 file_history 键存储在 JSON 中。然而,它比我意识到的要复杂得多。每个单独的窗口都有最近关闭的文件列表,如果有多个 ST 窗口打开,这可以很容易地看到,文件菜单中的Open Recent 将只显示该窗口中最近关闭的文件。

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

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"]

很明显,它只检索第一个窗口的file_history,要获取所有这些,就需要遍历windows 键中保存的窗口条目列表。

那么 JSON 中的哪个窗口对应于活动 ST 窗口?

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

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

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

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

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

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

我希望这可以帮助任何研究此问题或想要使用 .sublime_session 文件获取其他数据的人。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-12-09
  • 2014-03-23
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多