Как написать многострочный макрос в ~/.lldbinit?

#syntax #macros #multiline #lldb

#синтаксис #макросы #многострочный #lldb

Вопрос:

Я хочу написать этот макрос в ~/.lldbinit :

 command regex pxml 's/(. )/p xmlElemDump(stdout, %1, xmlDocGetRootElement(%1))/' -h "Dump the contents of an XML tree."
 

Но он слишком длинный, и я хочу разбить его на несколько строк следующим образом:

 command regex pxml
    's/(. )/p xmlElemDump(stdout, %1, xmlDocGetRootElement(%1))/'
    -h "Dump the contents of an XML tree."
 

или

 command regex pxml
    's/(. )/p xmlElemDump(stdout, %1, xmlDocGetRootElement(%1))/'
    -h "Dump the contents of an XML tree."
 

К сожалению, оба они вызывают эту ошибку:

 Enter one of more sed substitution commands in the form: 's/<regex>/<subst>/'.
Terminate the substitution list with an empty line.
 

Как я могу разбить макрос на несколько строк?

Ответ №1:

у lldb нет символа продолжения. Это было бы сложно в некоторых командах произвольной формы, особенно в команде «печать». Но было бы полезно в этих случаях. Не стесняйтесь отправлять сообщение об ошибке с запросом на это с помощью средства отслеживания ошибок lldb / llvm: https://llvm.org/bugs /.

В большинстве случаев, когда команда имеет несколько опций, а затем принимает набор входных данных, команда может ввести небольшой мини-редактор для набора входных данных. Это верно для command regex . Итак, в lldb командной строки вы увидите:

 (lldb) command regex whatever -h "some help" -s "some syntax"
Enter one of more sed substitution commands in the form: 's/<regex>/<subst>/'.
Terminate the substitution list with an empty line.
> s/First/Replacement/ 
> s/Second/Replacement/ 
>  
 

command source Функция, которая также считывает .lldbinit, работает, передавая командный файл в виде потока интерпретатору. Итак, вам нужно смоделировать, что делает командная строка:

 command regex whatever -h "some help" -s "some syntax"
s/First/Replacement/
s/Second/Replacement/
 

Это не совсем правильно, во входном файле после последней замены должна быть пустая строка, чтобы завершить замены, но я не могу убедить эту разметку включить ее в блок кода. Но вы поняли идею.

Комментарии:

1. Обратите внимание, если ваша команда регулярных выражений подстановки начинает становиться очень длинной, возможно, пришло время подумать о написании ее как команды Python. Инструкции для этого здесь: lldb.llvm.org/python-reference.html .

2. Спасибо за ответ. Но запись макроса таким способом в мини-редакторе и добавление пустой строки после последней подстановки в ~/.lldbinit , а также использование ее для интерпретации при запуске lldb или ее поиске с command source ~/.lldbinit помощью приведет к повторной ошибке. Похоже, что lldb не распознает пустые строки в sourcing как конец ввода.

3. Когда я делаю это, я получаю распечатанный текст о «Введите один или несколько …», Но команда регулярных выражений фактически была создана и работает, как ожидалось. Вы проверили, что команда сработала, или предположили из вывода, что это не так?

4. Да, вы правы! Сообщения печатаются, но команды работают. Спасибо за описание 🙂

Ответ №2:

Я пишу псевдонимы в файле .py и импортирую его ~/.lldbinit .
В файле python мы можем использовать символ продолжения.

например)

вы бы сохранили следующий код как something.py

 def __lldb_init_module(debugger, internal_dict):
    debugger.HandleCommand("command regex pos 's/(.*)?-op?(.*)/ exp -l swift -O  %2 -- %1/'
                                              's/(.*)/ exp -l swift -O -- %1/'")
 

запишите это в ~/.lldbinit

 command script import <path>/something.py