Sublimetext2 保存前执行操作(`on\u pre\u save`) 导入升华插件 类测试(升华插件.EventListener): 预存时的def(自存、查看): view.set语法文件(“Packages/Python/Python.tmLanguage”)

Sublimetext2 保存前执行操作(`on\u pre\u save`) 导入升华插件 类测试(升华插件.EventListener): 预存时的def(自存、查看): view.set语法文件(“Packages/Python/Python.tmLanguage”),sublimetext2,sublimetext3,sublimetext,sublime-text-plugin,Sublimetext2,Sublimetext3,Sublimetext,Sublime Text Plugin,下面是一个简单的例子。从逻辑上讲(从我的观点来看),它应该在保存之前更改语法,因此,文件应该保存为.py 但实际上,在save操作之后,语法将发生更改。因此,如果我最初使用的是js文件,它将保存为js,而不是py 我想知道为什么“预存”上的工作得如此奇怪,或者换句话说,“预存”上的和“后存”上的有什么区别吗。另外,这也是我的实际兴趣所在,我如何在保存之前执行一些任意(1)操作 (1) 我特别使用了“任意”这个词,因为我的意思不仅仅是语法上的改变。这可能是不一样的。例如,将字体从ConsoleAS

下面是一个简单的例子。从逻辑上讲(从我的观点来看),它应该在保存之前更改语法,因此,文件应该保存为
.py

但实际上,在save操作之后,语法将发生更改。因此,如果我最初使用的是
js
文件,它将保存为
js
,而不是
py

我想知道为什么“预存”上的
工作得如此奇怪,或者换句话说,“预存”上的
和“后存”上的
有什么区别吗。另外,这也是我的实际兴趣所在,我如何在保存之前执行一些任意(1)操作


(1) 我特别使用了“任意”这个词,因为我的意思不仅仅是语法上的改变。这可能是不一样的。例如,将字体从ConsoleAS更改为Times New Roman。

在将文件缓冲区写入磁盘之前,会发生
on_pre_save
事件,允许您在磁盘上的文件更改之前执行任何可能要执行的操作,例如对缓冲区的内容进行一些更改(例如“保存时重新格式化”)

文件缓冲区写入磁盘后,将立即发生
on_post_save
事件,允许您在保存操作后采取任何可能需要采取的操作,例如,在缓冲区“最终”后检查缓冲区的内容(例如“lint on save”),如果通过外部工具完成,则需要将更改保存在磁盘上,而不仅仅是内存中)

在这两种情况下,用户在事件发生时已经选择了文件的文件名。对于一个新文件,这意味着只有在他们选择了文件的名称和位置之后,才会在保存前执行
。对于现有文件,
save
只需使用相同的文件名重新保存即可

要回答您的问题,您可以在保存前的
中执行大多数“任意”操作,使其在保存之前发生。如果您真的想更改文件名,也可以在这种情况下更改文件名

但是请注意,在用户下更改文件名而不首先询问他们,这显然是不好的。此外,如果您将文件名更改为一个已存在于\u pre\u save
sublime中的文件,sublime将在没有警告的情况下盲目覆盖该文件,这也是一种糟糕的Mojo

对于将要改变磁盘上文件的名称和位置的内容,更合适的方法是让用户显式调用一个命令来实现这一点,以便他们完全了解正在发生的事情


根据注释中的要求,为了完整起见,这里有一个示例,它实现了您希望上面的示例代码所做的事情

这里需要注意的重要一点是,您必须非常小心触发此事件的情况。如前所述,插件将无法保存任何类型的文件,因为它将转换为python文件

在本例中,它被限制为仅对文本文件生效,从而将其转换为python文件。但是请注意,如果该位置已经有一个同名的python文件,它将覆盖该文件,而不会警告您即将发生这种情况

对这一准则要格外小心;很容易意外地阻止您使用正确的名称保存文件,例如,这可能会阻止您使用Sublime修复代码,以及其他一些令人讨厌的问题

导入升华插件
导入操作系统
类TestListener(升华插件.EventListener):
预存时的def(自存、查看):
#这一部分非常重要,因为如上所述
#您的保存操作使您的
#文件名,并使它突然成为没有任何
#警告。如果你不小心,你可能会破坏你的能力
#例如,使用sublime修复插件。
如果不查看.file_name().endswith(“.txt”):
打印(“不执行任何操作:”,view.file_name())
返回
#巨大的警告:这可能并且将故意破坏任何文件
#在没有任何警告的情况下,它已经存在了
#无论如何,这绝对是个坏主意(tm)
python_name=os.path.splitext(view.file_name())[0]+“.py”
视图.重定目标(python_名称)

谢谢!也许你可以加上一些例子?我的意思是,你说这是可能的,但在我的情况下,它不起作用。我编辑了答案,但这部分说得不够:使用此代码时要小心。:)再次感谢。我会尽量小心:)