的on_pre_save
事件發生之前一個文件緩衝區寫入磁盤,並允許你把你可能想在磁盤上更改文件之前採取任何行動,例如做一些改變緩衝區的內容(例如「重新保存」)。
的on_post_save
事件發生後立即將文件緩衝區寫入磁盤,使您可以採取任何行動,你可能想保存操作後,例如檢驗緩衝區,一旦它的「最後」的內容(例如, 「lint on save」,如果通過外部工具完成,則需要將更改存儲在磁盤上,而不僅僅存儲在內存中)。
在這兩種情況下,文件的文件名已經在事件發生時由用戶選擇。對於新文件,這意味着on_pre_save
直到他們選擇了文件的名稱和位置之後纔會發生。對於現有文件,save
只是使用相同的文件名重新保存。
要回答你的問題,你可以在on_pre_save
中做任何你想要的任意「任意」事情,讓它在發生保存之前發生。如果你真的想要,也可以在這種情況下更改文件名。
但請注意,在不詢問用戶的情況下將用戶名下的文件名改爲用戶體驗差的UX。此外,如果您將文件名更改爲on_pre_save
中已存在的文件,崇高將盲目覆蓋文件,而不會出現警告,這也是Bad Mojo。
對於某些會改變磁盤上文件名稱和位置的東西,更合適的方法是使用用戶必須明確調用的命令,以便它們完全知道發生了什麼上。
正如評論和完整性的要求,這裏有一個例子,做什麼你想你上面的例子代碼做。
這裏需要注意的重要一點是,您必須非常小心您觸發此事件的情況。如上所述,您的插件將無法保存任何類型的文件,因爲它會交換改爲一個python文件。
在這個例子中,它只能在一個文本文件上生效,並將它變成一個python文件。但是請注意,如果在該位置已經有一個名稱爲python的文件,它會覆蓋它而不會提醒您即將發生。
對此代碼要非常小心;意外地阻止自己無法使用正確的名稱保存文件非常容易,這可能會阻止您使用Sublime修復代碼以及其他不良問題。
import sublime_plugin
import os
class TestListener(sublime_plugin.EventListener):
def on_pre_save(self, view):
# This part is extremely important because as mentioned above it's
# entirely disconcerting for your save operation to gank your
# filename and make it suddenly be something else without any
# warning. If you're not careful you might destroy your ability to
# use sublime to fix your plugin, for example.
if not view.file_name().endswith(".txt"):
print("Doing nothing for: ", view.file_name())
return
# HUGE WARNING: This CAN and WILL willfully clobber over any file
# that already happens to exist without any warning to you
# whatsoever, and is most decidedly a Bad Idea(tm)
python_name = os.path.splitext(view.file_name())[0] + ".py"
view.retarget(python_name)
謝謝!也許你可以添加一些例子?我的意思是,你說這是可能的,但就我而言,這是行不通的。 –
我編輯了答案,但我不能說這部分足夠了:請謹慎使用此代碼。 :) – OdatNurd
再次感謝。我會盡量小心:) –