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という名前で保存されます。

なぜon_pre_saveが奇妙なのか、換言すればon_pre_saveon_post_saveの間に違いがあるのでしょうか。また、それは私の実際的な関心事です、私は保存する前に何らかの恣意的な(1)行動をどうやって行うことができますか?

(1)構文の変更だけではないので、私は特に「任意」という言葉を使用しました。それは違うかもしれません。たとえば、フォントをConsolasからTimes New Romanに変更します。

答えて

1

on_pre_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

もう一度ありがとうございます。私は慎重にしようとします:) –

関連する問題