#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