修改或扩展项目的默认设置

时间:2016-04-06 17:52:51

标签: sublimetext3

在sublimetext3项目中,有没有办法修改或扩展,而不是替换默认设置?

具体而言,在项目中,我指定要包含在项目中的文件夹的路径。每个文件夹都包含我要使用folder_exclude_patternsfile_exclude_patterns排除的文件夹所特有的文件和目录;请参阅Projects的文档。

但据我了解,这些项目设置替换而非扩展默认设置。但是,我想要的是将项目设置附加到默认模式而不是替换它。这可能吗?

表示我想做的伪代码:

"folders":
[
    {
        "path": "c:\\dir1",
        "folder_exclude_patterns": default_folder_exclude_patterns + ["junk"]
    },
    {
        "path": "C:\\dir2"
        "folder_exclude_patterns": default_folder_exclude_patterns + ["old"]
    },
]

如果这是不可能的,那么我相信我唯一能做的就是复制默认设置并为每个文件夹项复制它们。由于我有多个项目/文件夹,并且需要对文件排除,文件夹排除和二进制文件设置执行此操作,因此这将变得乏味且难以维护。当然,这似乎对插件来说已经成熟,但这不在我想要做的范围内。 (当然,如果其他人有一个类似这样的插件,我很乐意尝试一下!: - ))

1 个答案:

答案 0 :(得分:4)

不幸的是,由于Sublime的设置方式,更高 - precedence设置替换优先级较低的设置,而不是补充它们。这是一件好事,因为很多设置都是/或 - 例如,如果您的用户设置"highlight_line": false而项目有"highlight_line": true,那么您会怎么做?

一个插件应该可以做到这一点。 sublime.Window包含project_data()set_project_data()方法,分别允许您检索和编写项目设置。您可以为项目中的每个文件夹添加"more_folder_exclude_patterns"密钥,并添加要添加到Preferences.sublime-settings文件中设置的默认值的其他模式。然后,插件可以检查"more"密钥是否存在,读取两个数组,连接它们,并将结果写回.sublime-project文件,同时擦除"more"密钥。最后,您可以设置一个事件监听器来随时运行插件 - 保存,加载新文件等等。

修改

这是一个有效的例子:

import sublime
import sublime_plugin
from copy import deepcopy


class ModifyExcludedFoldersCommand(sublime_plugin.WindowCommand):
    def run(self):
        proj_data = self.window.project_data() # dict
        orig_proj_data = deepcopy(proj_data) # for comparison later
        settings = sublime.load_settings("Preferences.sublime-settings")
        fep = settings.get("folder_exclude_patterns") # list

        for folder in proj_data["folders"]:
            try:
                if folder["folder_exclude_patterns"]:
                    break # if f_e_p is already present, our work is done
            except KeyError:
                pass # if it doesn't exist, move on to mfep

            try:
                mfep = folder["more_folder_exclude_patterns"]
                new_fep = sorted(list(set(fep + mfep))) # combine f_e_p from
                                                        # Preferences and project,
                                                        # excluding duplicates using
                                                        # a set.
                folder["folder_exclude_patterns"] = new_fep
                del folder["more_folder_exclude_patterns"]
            except KeyError:
                pass # if mfep doesn't exist, just move on to the next folder

        if proj_data != orig_proj_data:
            self.window.set_project_data(proj_data)


class UpdateProjectData(sublime_plugin.EventListener):
    def on_activated(self, view):
        window = view.window()
        window.run_command("modify_excluded_folders")

将文件另存为Packages/User/modify_excluded_folders.py(其中Packages是选择 Preferences -> Browse Packages... 时打开的文件夹),该文件应立即生效。每次激活视图时它都会运行。它检查当前"folder_exclude_patterns"文件中定义的每个文件夹中是否存在.sublime-project数组,如果找到则假定一切正常并传递到下一个文件夹。如果找不到该数组,则会检查是否存在"more_folder_exclude_patterns"数组。如果找到,它就会发挥作用并将内容与您的首选项(默认或用户)中的现有"folder_exclude_patterns"数组合并。然后它会将新的"folder_exclude_patterns"数组写入该文件夹并删除"more_folder_exclude_patterns"数组。最后,它检查是否进行了任何更改,如果是,则将新数据写回.sublime-project文件。