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)
ありがとう!たぶんあなたはいくつかの例を追加することができますか?私はあなたが可能だと言っていますが、私の場合はうまくいきません。 –
私は答えを編集しましたが、私はこの部分を十分に言うことはできません。このコードでは注意が必要です。 :) – OdatNurd
もう一度ありがとうございます。私は慎重にしようとします:) –