在sublimetext3项目中,有没有办法修改或扩展,而不是替换默认设置?
具体而言,在项目中,我指定要包含在项目中的文件夹的路径。每个文件夹都包含我要使用folder_exclude_patterns
或file_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"]
},
]
如果这是不可能的,那么我相信我唯一能做的就是复制默认设置并为每个文件夹项复制它们。由于我有多个项目/文件夹,并且需要对文件排除,文件夹排除和二进制文件设置执行此操作,因此这将变得乏味且难以维护。当然,这似乎对插件来说已经成熟,但这不在我想要做的范围内。 (当然,如果其他人有一个类似这样的插件,我很乐意尝试一下!: - ))
答案 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
文件。