외부 프로그램을 통해 Sublime Text 2 버퍼 내용 필터링


1

Sublime Editor 2에서 C ++ 코드 형식에 대한 비 정확성을 추가하려고합니다.

SE2에서 외부 프로세스를 실행하는 방법이 있다는 것을 알고 있습니다. 그러나 주요 문제는 포맷이 완료되면 내 코드로 버퍼 (보기)를 업데이트 할 수 없다는 것입니다.

누군가 현재 버퍼의 내용에 대해 외부 프로세스를 실행하고 업데이트하는 플러그인을 스케치 할 수 있습니까?

답변:


2

다음 텍스트 플러그인은 파일의 모든 소문자를 대문자로 바꿉니다. 이 bash -c호출은 큰 인수 입력에 작용하는 명령의 (흔하지 않은) 경우에 대한 유용한 예를 제공하기위한 해결 방법이었습니다. 일반적으로 파일 또는 표준 입력을 처리합니다.

자신의 명령을 사용하려면 첫 번째 Popen인수 의 처음 세 목록 항목을 자신의 명령으로 바꾸십시오 . 마지막은 전체 버퍼 내용입니다.

import sublime, sublime_plugin, subprocess

def insert_output(view, edit):
    r = sublime.Region(0, view.size())
    try:
        proc = subprocess.Popen( [ "bash", "-c", 'echo "$0" | tr [a-z] [A-Z]', view.substr(r) ], stdout=subprocess.PIPE )
        output = proc.communicate()[0]
        view.replace(edit, r, output)
    except:
        pass


class ReplaceWithOutputCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        e = self.view.begin_edit()
        insert_output(self.view, e)
        self.view.end_edit(e)

메뉴 항목을 만들려면 이러한받는 다음과 같은 항목을 추가 Main.sublime-menuUser패키지 :

{"command": "replace_with_output", "caption": "Replace with Output" }

전에:

스크린 샷

후:

스크린 샷


커서 위치를 유지하는 방법? 내 경우에는 항상 마지막 줄로 이동하기 때문입니다.
user14416

@ user14416 ST2는 임의의 수의 커서 위치와 선택을 가지고 있으며, 파일 내용을 완전히 변경하는 프로그램에서이를 유지하기위한 올바른 동작을 정확하게 결정하는 것은 쉽지 않습니다 (예 : 행 / 열이 충분하지 않은 경우에도) 탭 / 공백을 정규화하고 문서 시작과의 오프셋도 쓸모가 없습니다 ...) 여기서 첫 번째 코드 블록에서 선택을 유지하기위한 기본 구성 요소를 찾을 수 있으며 , 문자 사례 만 변경하는 예제와 함께 잘 작동합니다.
Daniel Beck

고마워. 매우 도움이됩니다. 결과적으로 커서 위치는 저장할 수 있지만 현재 보이는 영역은 저장할 수 없습니다. 다음 코드를 사용하여 'origRegion = self.view.visible_region ()'을 사용한 다음 smth 및 'self.view.show (origRegion)'을 사용합니다.
user14416

@ user14416 영역은 문서 시작 부분의 오프셋으로 정의됩니다. 다시 포맷하면 5000 번째 문자가 다른 행에있을 수 있습니다. 어쩌면 text_point여기 또는 내 초기 답변에 도움이 될 수 있습니다 . 또한 viewport_position유망 해 보입니다.
Daniel Beck

이 또 다른 문제 plz here ( stackoverflow.com/questions/15053679/python-code-inconsistency ) 를 도와 주시겠습니까 ? 나는 거기에 무슨 일이 일어나고 있는지 실마리가 없습니다.
user14416
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.