Когда я делаю отступ в буфере C ++, я хотел бы преобразовать код следующим образом:
void foo(int a)
{
try
{
for (unsigned int i=0; i<10; ++i)
{
if (++a)
{
break;
}
else
{
continue;
}
}
} catch (...)
{
;
}
}
кодировать так:
void foo(int a) {
try {
for (unsigned int i=0; i<10; ++i) {
if (++a) {
break;
}
else {
continue;
}
}
}
} catch (...) {
;
}
Кроме того, я хочу, чтобы определения классов и пространства имен не затрагивались.
Существует ли эта функциональность в Emacs?
Я понимаю, что это можно сделать с помощью регулярных выражений,
но было бы лучше использовать готовую функцию, которая обрабатывает
все крайние случаи и все.
Простой макрос может сделать эту работу, например:
(setq last-kbd-macro
"\C-s{\336\C-e")
С последующим: М-0С-хе.
Примечание: см. Мое редактирование ниже.
Вы можете сделать это с помощью replace-regexp двумя различными способами.
1.) Чтобы сделать это с помощью elisp, перейдите в начало буфера и введите M-: (что позволяет дать s-выражение для оценки). Затем введите
(replace-regexp "\n.*{" " {")
и нажмите возврат.
2.) Чтобы сделать это в интерактивном режиме, либо запустите M-x replace-regexp, либо наберите M-% (что делает то же самое). Когда спросят, что заменить, введите C-q C-j
с последующим .*{
Когда спросят, чем заменить его, наберите " {"
(без кавычек — мне пришлось поместить их туда, чтобы показать пространство перед фигурной скобкой).
Затем нажмите Return, чтобы запустить функцию.
Причина, по которой вы должны ввести C-q C-j
для новой строки потому, что интерактивная замена-регулярное выражение не позволяет вам использовать \n
,
Также, в качестве примечания, если вы пытаетесь найти или выяснить регулярное выражение, используйте re-builder
, Это очень полезно.
Редактировать:
Как указано в комментариях, если код не соответствует заданному стилю входного примера, мой regexp может удалить код. Вот другая версия, которая помогает избежать этого. Это все еще не идеально, но никакое регулярное выражение никогда не должно использоваться вслепую.
(replace-regexp "\n\s *{" " {")
Это обеспечит совпадение и удаление только пробелов.
Проблема в основном решена с помощью astyle:
(defun cpp-astyle()
(interactive)
(let (beg end)
(if (region-active-p)
(setq beg (region-beginning)
end (region-end))
(setq beg (point-min)
end (point-max)))
(shell-command-on-region beg end "astyle -A3 -U -p -k3" nil t)))
Из 12 поддерживаемых стилей ни один не соответствует именно тому, что я хочу,
но этот довольно близок (неверна только открывающая фигурная скобка реализации функции).