0
import sublime_plugin 

class Test(sublime_plugin.EventListener): 

    def on_pre_save(self, view): 
     view.set_syntax_file("Packages/Python/Python.tmLanguage") 

這裏有一個簡單的例子。從邏輯上(從我的觀點來看),它應該在保存之前更改語法,因此,該文件應保存爲<filename>.py保存前執行操作(`on_pre_save`)

但實際上,在保存操作後語法將被改變。所以,如果我原本使用js文件,它將被保存爲js,而不是py

我不知道爲什麼on_pre_save工作這麼奇怪,或者,換句話說,就是有on_pre_saveon_post_save任何區別。另外,這是我的實際興趣,我如何在保存之前執行一些任意(1)操作? (1)我特別使用了「任意」這個詞,因爲我並不只是指語法上的改變。它可能有些不同。例如,將字體從Consolas更改爲Times New Roman。

回答

1

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) 
+0

謝謝!也許你可以添加一些例子?我的意思是,你說這是可能的,但就我而言,這是行不通的。 –

+0

我編輯了答案,但我不能說這部分足夠了:請謹慎使用此代碼。 :) – OdatNurd

+0

再次感謝。我會盡量小心:) –