Фільтрація вмісту буфера Sublime Text 2 через зовнішню програму


1

Я намагаюся додати незрозумілий формат мого коду C ++ у Sublime Editor 2.

Я знаю, що є кілька способів запустити зовнішній процес у SE2. Але головна проблема полягає в тому, що не можна оновити буфер (view) з моїм кодом, коли форматування завершено.

Чи може хтось намалювати плагін, який запустить зовнішній процес на вміст поточного буфера, а потім оновить його?

Відповіді:


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-menuв Userпакеті:

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

Перед:

Знімок екрана

Після:

Знімок екрана


Як зберегти позицію курсора? Тому що в моєму випадку це завжди йде до останнього рядка.
користувач14416

@ user14416 Зауважте, що ST2 має довільну кількість позицій курсора та вибору, і визначити правильну поведінку для збереження будь-якого з програм, які повністю змінюють вміст файлу, не дуже просто (наприклад, рядок / стовпець недостатній, навіть якщо просто нормалізація вкладок / пробілів, зміщення від початку документування також непотрібне, ...). Тут ви знайдете основні будівельні блоки для збереження вибору в першому блоці коду , і він прекрасно працює на моєму прикладі, який змінює лише випадки символів.
Даніель Бек

Дякую. Дуже корисний. Як результат, я можу зберегти положення курсору, але не можу зберегти поточну видиму область. Він завжди зміщується трохи вниз. Для цього я використовую такий код: 'origRegion = self.view.visible_region ()', потім виконайте smth та 'self.view.show (origRegion)'.
користувач14416

@ user14416 Зауважте, що регіони визначаються за зміщенням від початку документа. Якщо ви переформатуєте, наприклад, 5000-й персонаж, ймовірно, в іншому рядку. Можливо, text_pointтут може допомогти, або ця моя раніше відповідь . Також, viewport_positionвиглядає перспективно.
Даніель Бек

Чи можете ви допомогти мені з цією іншою проблемою PLZ тут ( stackoverflow.com/questions/15053679/python-code-inconsistentcy ). У мене немає поняття, що там відбувається не так.
користувач14416
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.