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 파일로 작업 한 경우 py이 아니라 js으로 저장됩니다.

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이기도합니다.

디스크의 파일 이름과 위치가 변경 될 경우 사용자가 명시 적으로 실행해야하는 명령이 있어야 더 이상 적절한 방법을 알 수 있습니다. 에.


위에서 언급 한 예제 코드에서 수행하고자하는 내용을 주석과 완전성으로 요청한 예제가 있습니다.

여기서 주목해야 할 중요한 점은이 이벤트를 트리거하는 상황에 대해 매우 신중해야한다는 것입니다. 위에서 설명한 것처럼 플러그인은 스와핑으로 인해 파일을 저장하지 못하게합니다 대신 파이썬 파일을 통해.

이 예제에서는 텍스트 파일에만 적용되어 파이썬 파일로 변환됩니다.그러나 이미 그 위치에 그 이름을 가진 파이썬 파일이 있다면 그것은 일어날 것이라고 경고하지 않고 덮어 쓸 것입니다.

이 코드를 매우주의하십시오. 우연히 올바른 이름으로 파일을 저장할 수 없도록 막기가 쉽습니다. 예를 들어 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

다시 한번 감사드립니다. 내가 조심하려고 노력할 것입니다 :) –