on_pre_save
이벤트는 파일 버퍼가 디스크에 기록되기 바로 전에 발생하며 디스크의 파일이 변경되기 전에 취할 수있는 모든 조치 (예 : 버퍼의 내용을 변경합니다 예 : "저장시 다시 포맷").
on_post_save
이벤트는 파일 버퍼가 디스크에 기록 된 직후에 발생합니다. 예를 들어 버퍼의 내용이 "최종"일 경우 저장 작업 후에 취할 수있는 조치를 취할 수 있습니다 (예 : "lint on save". 외부 도구를 통해 수행 된 변경 사항은 메모리뿐 아니라 디스크에 저장해야합니다.
두 경우 모두 파일의 파일 이름은 이벤트가 발생했을 때 사용자가 이미 선택했습니다. 새 파일의 경우 파일의 이름과 위치를 선택한 후에야 on_pre_save
이 발생합니다. 기존 파일의 경우 save
은 동일한 파일 이름으로 다시 저장됩니다.
귀하의 질문에 대한 답변을 얻으려면 on_pre_save
에 저장하려는 "임의적 인"대부분의 작업을 수행하여 저장이 이루어 지도록하십시오. 원하는 경우 해당 상황에서 파일 이름을 변경할 수도 있습니다.
그러나 사용자가 먼저 묻지 않고 파일 이름을 변경하면 분명히 나쁜 UX입니다. 또한 파일 이름을 on_pre_save
에서 이미 존재하는 파일로 변경하면 경고없이 파일을 맹목적으로 덮어 쓰게됩니다. Bad Mojo이기도합니다.
디스크의 파일 이름과 위치가 변경 될 경우 사용자가 명시 적으로 실행해야하는 명령이 있어야 더 이상 적절한 방법을 알 수 있습니다. 에.
위에서 언급 한 예제 코드에서 수행하고자하는 내용을 주석과 완전성으로 요청한 예제가 있습니다.
여기서 주목해야 할 중요한 점은이 이벤트를 트리거하는 상황에 대해 매우 신중해야한다는 것입니다. 위에서 설명한 것처럼 플러그인은 스와핑으로 인해 파일을 저장하지 못하게합니다 대신 파이썬 파일을 통해.
이 예제에서는 텍스트 파일에만 적용되어 파이썬 파일로 변환됩니다.그러나 이미 그 위치에 그 이름을 가진 파이썬 파일이 있다면 그것은 일어날 것이라고 경고하지 않고 덮어 쓸 것입니다.
이 코드를 매우주의하십시오. 우연히 올바른 이름으로 파일을 저장할 수 없도록 막기가 쉽습니다. 예를 들어 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
다시 한번 감사드립니다. 내가 조심하려고 노력할 것입니다 :) –