включить файл и сделать отступ для каждой строки - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу включить файл и сделать все строки с отступом.Я хочу, чтобы это был блок кода в документе уценки.

В основном я хочу что-то вроде этого:

text
include(somefile)
text

, чтобы иметь такой вывод:

text
    content
    from
    somefile
text

Iпросмотрел руководство и нашел patsubst.Я также нашел этот вопрос и ответ: Как сделать отступ блока текста в макросе m4

Это работает для файлов без запятых:

$ cat textnocomma 
some text.
with sentences.
and no commas.

$ cat patsubstincludenocomma
text
patsubst(include(textnocomma), `^', `    ')
text

$ m4 patsubstincludenocomma
text
    some text.
    with sentences.
    and no commas.

text

Но когдаЯ include файл, который содержит запятую:

$ cat textcomma 
some text.
with sentences.
and, commas.

$ cat patsubstincludecomma
text
patsubst(include(textcomma), `^', `    ')
text

$ m4 patsubstincludecomma
text
m4:patsubstincludecommanoquote:3: Warning: excess arguments to builtin `patsubst' ignored
some text.
with sentences.
and
text

Кажется, проблема в наивном способе, которым m4 выполняет расширение макросов.Запятая из включенного текста интерпретируется как синтаксис макроса patsubst.Решение (должно быть) простое: процитируйте включенный текст.

Но если я процитирую include, то просто первая строка будет с отступом:

$ cat patsubstincludecommaquote 
text
patsubst(`include(textcomma)', `^', `    ')
text

$ m4 patsubstincludecommaquote
text
    some text.
with sentences.
and, commas.

text

Я пробовал разные комбинациицитирование и буквальные переводы строк вместо регулярных выражений.Но все, что я получил до сих пор, это либо сообщение об ошибке excess arguments, либо просто первая строка с отступом.

Как я могу включить текст с запятой и, возможно, другой синтаксис m4, с отступом в m4?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я провел некоторое исследование и могу заключить, что цитирование include заставляет patsubst больше не распознавать ^ (начало строки) в тексте, кроме первой строки.по крайней мере, в моей системе.

$ m4 --version
m4 (GNU M4) 1.4.18
...

Обратите внимание:

$ cat textnocomma 
some text.
with sentences.
and no commas.

$ cat includenocomma 
foo
patsubst(include(textnocomma), `^', `    ')
bar
patsubst(`include(textnocomma)', `^', `    ')
baz

$ m4 includenocomma 
foo
    some text.
    with sentences.
    and no commas.

bar
    some text.
with sentences.
and no commas.

baz

это также происходит при определении текста как "строковые литералы" вместо include:

$ cat definestringliterals 
define(`sometext', `first line
second line
third line')dnl
foo
patsubst(sometext, `^', `    ')
bar
patsubst(`sometext', `^', `    ')
baz

$ m4 definestringliterals 
foo
    first line
    second line
    third line
bar
    first line
second line
third line
baz

вот вопрос и ответ, который поддерживает это наблюдение: Как сопоставить символы новой строки в GNU M4 _properly_

странно, что этого не происходит, если поместить строковые литералы непосредственно внутри patsubst:

$ cat patsubststringliterals 
foo
patsubst(first line
second line
third line, `^', `    ')
bar
patsubst(`first line
second line
third line', `^', `    ')
baz

$ m4 patsubststringliterals 
foo
    first line
    second line
    third line
bar
    first line
    second line
    third line
baz

Использование паренов для "цитирования" текста не имеет этой проблемы.но теперь в моем тексте есть круглые скобки:

$ cat textcomma 
some text.
with sentences.
and, commas.

$ cat includecomma 
foo
patsubst(include(textcomma), `^', `    ')
bar
patsubst(`include(textcomma)', `^', `    ')
baz
patsubst((include(textcomma)), `^', `    ')
qux

$ m4 includecomma 
foo
m4:includecomma:2: Warning: excess arguments to builtin `patsubst' ignored
some text.
with sentences.
and
bar
    some text.
with sentences.
and, commas.

baz
    (some text.
    with sentences.
    and, commas.
    )
qux

, так что я думаю, что это ошибка.если кавычка include, то patsubst больше не будет распознавать ^, кроме первой строки.Но цитирование include необходимо, чтобы запятая в тексте не интерпретировалась как синтаксис.

0 голосов
/ 21 февраля 2019

Почему вы не используете внешние команды?

esyscmd(`sed "s,^,    ," textcomma')
...