труба и заменить контекстом
Я использую трубку Какунэ (
|
) для форматирования документа ryd , который по сути является обычным файлом YAML, состоящим из нескольких документов YAML, некоторые из которых имеют в корне (помеченный) литеральный скаляр:
--- !Python |
print('hello world')
--- !Output |
this results in:
(В этом случае
!Output
предполагается, что помеченный скаляр представляет собой ReST, к которому конкатенируется вывод предыдущей «программы» «hello world»).
Каждый из этих скаляров/документов имеет разные потребности в форматировании в зависимости от тега и/или конфигурации. Что я обычно делаю, так это выбираю весь буфер, передаю его в программу, которая понимает каждый документ, форматирую каждый документ соответствующим «подформатером» и повторно комбинирую их. Форматирование может пойти не так, когда я делаю частичный выбор, так как тогда я не могу легко определить, какой модуль форматирования использовать, если только выбор не начинается с тега для литерального скаляра.
Я могу вызывать соответствующие субформатеры напрямую, но это одновременно громоздко, иногда неуместно (попробуйте форматировать Python, начиная с середины метода класса) или неприменимо, например, при множественном выборе из разных типов документов (таким образом, требуются разные субформатеры).
То, что я хотел бы иметь, - это функциональность команды pipe, но когда вызываемый внешний модуль форматирования получает полный буфер в качестве стандартного ввода и получает (несколько) выборок в буфере в качестве индексов начального и конечного байтов в качестве аргумента. Что-то, как если бы я выбрал из примера выше строчку с Python и слова
this results
и вызовите средство форматирования, например:
myfmt -s 13,32 -s45,60
Когда
myfmt
имеет полный буфер, он может сканировать с самого начала и выбирать, что делать с каждым выбором. Возможно, имеет смысл расширить выборку (до полных строк, полного определения класса или полной программы), поэтому нужно будет вернуть полный результат, но не весь файл нужно будет переформатировать, что я и сделал. нужно сделать сейчас, основываясь на выборе всего буфера (используя
%
)
Есть ли способ добиться этого в какунэ?