首页 > 解决方案 > 启动时自动加载 Sublime 工作区

问题描述

我在这里发布了一个问题:更容易访问 Sublime 宏

那太棒了,而且效果很好!但还有最后一件事我想不通。如何设置它以便 Sublime 在打开时自动加载保存的工作区?因为我在侧边栏中有我的宏文件夹,但我希望每次启动 Sublime 时都会自动将它放在那里,所以我添加了文件夹并保存了工作区,但是当我关闭 Sublime 时,文件夹消失了,我必须转到 project->open-recent ->我的工作区

有没有办法在启动 Sublime 时自动加载工作区或在启动 Sublime 时自动将文件夹添加到项目中?

标签: sublimetext3

解决方案


如果在侧栏中打开了相应的文件夹并且您hot_exit打开了设置(默认情况下),那么退出 Sublime 并重新启动它应该将文件夹保留在那里,如果它们正在引用单个窗口也应该如此一个项目或工作区。

根据您所在的平台,关闭最后一个窗口与退出 Sublime 不同,这并不罕见,这可能导致 Sublime 在会话中记录退出时没有打开窗口.

但是,根据您对问题的评论,听起来这实际上不是您的问题,而是您希望有一种方法可以将特定文件夹或文件夹添加到新创建的窗口和项目中,以便您的宏文件夹只是始终可用。

这可以通过一个插件来实现,该插件可以适当地调整特定窗口中的文件夹。这可以是半自动化的(更多内容见下文)。这是我们需要的插件:

import sublime
import sublime_plugin


class AddAdditionalFoldersCommand(sublime_plugin.WindowCommand):
    """
    Adds all of the folders from the `additional_folders` setting in the user
    preferences to the current window, if they are not already present there.
    """
    def run(self):
        # Get the list of folders from the settings
        settings = sublime.load_settings("Preferences.sublime-settings")
        additional = settings.get("additional_folders", [])

        # Get the project data and associated folders from the current window,
        # with sensible defaults if the window has no project data yet
        project_data = self.window.project_data() or {}
        project_folders = project_data.get("folders", [])

        # Add in any additional folders that are not already present
        for folder in additional:
            if not any(o["path"] == folder for o in project_folders):
                project_folders.append({"path": folder})

        # Update project data
        project_data["folders"] = project_folders
        self.window.set_project_data(project_data)


class AdditionalFolderListener(sublime_plugin.EventListener):
    """
    Listens to see if a new window has been created, and if so add additional
    folders if desired.
    """
    def on_post_window_command(self, window, command_name, args):
        if command_name == "new_window":
            settings = sublime.load_settings("Preferences.sublime-settings")
            if settings.get("auto_add_additional_folders", False):
                window = sublime.active_window()
                window.run_command("add_additional_folders")

要使用它,您还需要在Preferences.sublime-settings文件中添加一些设置(根据需要更改值):

    // When true, the folders in "additional_folders" will be
    // automatically added when a new window is created.
    "auto_add_additional_folders": true,

    // Additional folders to add; these must be absolute paths
    "additional_folders": [
        "/home/odatnurd/.config/sublime-text-3/Packages/User/macros"
    ],

这做了两件事:

  1. 运行该add_additional_folders命令时,additional_folders设置中配置的列表中的所有文件夹都将添加到当前窗口,只要它们不存在(否则同一个文件夹会出现多次)。

  2. 创建新窗口时,如果auto_add_additional_folders设置为true(为了安全起见,代码中默认false为),则该命令将自动为新窗口执行。

回到上面的帖子,“半自动化”部分是因为为了工作,new_window必须调用该命令以使事件处理程序能够知道创建了一个新窗口。

如果您使用菜单项或键绑定来创建新窗口,就会出现这种情况,但如果您打开现有项目或工作区,则不会执行该命令。也可以在不使用此命令的情况下创建窗口,例如,如果您在没有窗口的情况下退出 Sublime,它会默认创建一个新窗口,或者在没有窗口的情况下在 MacOS 上单击停靠图标。

因此,根据您使用 Sublime 的方式,您可能希望绑定add_additional_folders到一个键,以便您可以根据需要手动调用它。AdditionalFolders.sublime-commands您还可以在您的包中创建一个名为类似的文件User,其中包含以下内容,以将命令添加到命令面板。您可以调整标题以适应;只要扩展名正确,文件名也不重要。

[
    { "caption": "Add Additional Folders", "command": "add_additional_folders" },
]

最后说明:

  1. 尽管此处使用了 API 的名称,但这将适用于所有窗口,即使它们没有与之关联的项目(或者它们只有与之关联的工作区),因为所有窗口都固有地携带项目数据

  2. 有人暗示下一个版本的 Sublime 将有额外的事件,使检测新窗口变得更容易。以上覆盖到build 3211;如果您正在阅读本文并且有更新的版本可用,则上述内容可能会变得更智能。


推荐阅读