Отступ Emacs после макроса в C

#define INIT_MACRO create(); some(); enviroment();
...
void function(){
  INIT_MACRO
    extra_indented();
  normal_indented();
}

как заставить emacs правильно справляться с описанной выше ситуацией, когда запрашивается автоматический отступ?

РЕДАКТИРОВАТЬ единственное решение, которое я вижу, - это указать emacs обрабатывать строки, содержащие только заглавные буквы, символы подчеркивания и пробелы, как если бы они имели точку с запятой в конце... но как мне это сделать?


person fakedrake    schedule 12.07.2011    source источник
comment
Я не думаю, что это выполнимо. Вы можете удалить последний ; и добавить его в сам макрос. Это не обманет отступ emacs.   -  person Diego Sevilla    schedule 12.07.2011
comment
Почему макрос, а не функция?   -  person Bo Persson    schedule 12.07.2011


Ответы (4)


Это работает:

#define INIT_MACRO do { create(); some(); enviroment(); } while (0)
...
void function(){
  INIT_MACRO;
  extra_indented();
  normal_indented();
}

Обычно лучше использовать этот трюк, чтобы избежать проблем при использовании:

if (...)
  MACRO();
else
  ...

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

person Simon    schedule 12.07.2011
comment
Так я до сих пор обходился, но мне было бы неудобно изменять код в репозитории по своему желанию, потому что мой отступ ломается... (см. РЕДАКТИРОВАТЬ) - person fakedrake; 12.07.2011
comment
Как я уже говорил, для меня это не только ради отступов, но и для безопасности и удобства чтения. - person Simon; 12.07.2011
comment
верный момент, но мне все равно бы понравилось, если бы я мог просто делать то, что я предлагаю в редактировании в некоторых случаях - person fakedrake; 12.07.2011

cc-mode можно настроить через переменную c-macro-names-with-semicolon. Дополнительную информацию см. в документации.

person immerrr    schedule 13.05.2013

Почему бы вам просто не закончить строку INIT_MACRO символом ;?

person Dave    schedule 12.07.2011

Использование макроса в качестве оболочки функции без (); в конце, когда вы его вызываете, и без окружения определения с помощью do { и } while(0) в любом случае не выполняется.. делает код уродливым, трудным в обслуживании, и он не поддерживается ни одним стандартом кодирования C... другими словами, это называется код кровоточащего глаза. Так что это невозможно с настройками по умолчанию.

Вам нужно будет сделать свой собственный основной / второстепенный режим. Для поддержки этого нового типа синтаксиса... Или вы можете взглянуть на свой текущий cc-mode.el.

person DipSwitch    schedule 12.07.2011