Отступ Emacs с последовательными скобками в C++

Автоматический отступ Emacs для последовательных скобок не работает нормально:

int main() {
    something(int i)(
        "test", "something"
                    );
}

Как исправить этот отступ, чтобы он был похож на обычный отступ:

int main() {
  something(int i)(
      "test", "something"
  );
}

Информация об основном режиме:

  • major-mode — это переменная, определенная в «исходном коде C».
  • Его значение — «c++-режим».

РЕШЕНИЕ:

Спасибо, @pickle rick и @0x5453,

(c-add-style "cc-style"
         '("linux"  ;; it can be google or k&r or other c-style.
           (c-basic-offset . 2)
           (c-offsets-alist
        (arglist-close . c-lineup-close-paren))))
(add-hook 'c++-mode-hook
      (lambda()
        (c-set-style "cc-style")))

person mortymacs    schedule 13.11.2019    source источник
comment
@phils major-mode — это переменная, определенная в «исходном коде C». Его значение — «c++-mode». Исходное значение — «фундаментальный режим».   -  person mortymacs    schedule 14.11.2019
comment
Проверьте значение 'arglist-close в c-offsets-alist. У меня установлено значение +cc-lineup-arglist-close, что, похоже, соответствует тому поведению, которое вы ищете. (Хотя на основании описания этой функции кажется, что она должна вести себя как ваш первый пример, так что может быть что-то еще.)   -  person 0x5453    schedule 14.11.2019
comment
@ 0x5453, не могли бы вы сообщить мне, как я могу получить значения этих переменных?   -  person mortymacs    schedule 14.11.2019
comment
@0x5453 показывает: c-offsets-alist is a variable defined in ‘cc-vars.el’. Its value is nil.   -  person mortymacs    schedule 14.11.2019
comment
@mortezaipo Вы можете использовать C-h v c-offsets-alist, а затем искать arglist-close вручную. Или M-S-z (assq 'arglist-close c-offsets-alist), чтобы получить значение напрямую. Обратите внимание, что c-offsets-alist является локальным для буфера и устанавливается только тогда, когда вы находитесь в одном из режимов на основе C, поэтому в вашем случае вам придется проверять его из буфера, который в настоящее время находится в c++-mode.   -  person 0x5453    schedule 14.11.2019


Ответы (1)


cc-mode может интеллектуально угадывать настройки, которые вы хотите для c-offsets-alist, на основе отступа в буфере. Для этого выровняйте код в буфере по своему усмотрению и оцените M-xc-guess.

Сделайте отступ буфера и, если он выглядит нормально, вы можете увидеть предполагаемые настройки с помощью M-xc-guess-view. Затем вы можете скопировать весь стиль в свой инициализатор или выбрать соответствующие настройки.

Кроме того, вы можете получить представление о том, какие правила применяются к данной линии, запустив M-xc-show-syntactic-information с точкой, расположенной там. Однако обратите внимание, что это не даст всей соответствующей информации, поскольку другие правила/стили влияют друг на друга, но сообщит, что arglist-close является соответствующим правилом в вашем примере.

person Rorschach    schedule 13.11.2019
comment
Спасибо, когда я включаю c-guess, он работает нормально, но когда я копирую результат c-guess-view в конфиг emacs, при следующем перезапуске он снова не работает. Как запустить c-guess при запуске Emacs? Тоже хорошая идея? - person mortymacs; 14.11.2019
comment
нет, не вызывайте c-guess в инициализации — дайте стилю имя и вызовите (c-set-style "your-style") в c++-mode-hook - person Rorschach; 14.11.2019
comment
@mortezaipo, если вы определяете только arglist-close, вы также можете просто использовать (c-set-offset 'arglist-close 'c-lineup-close-paren) в своем хуке - person Rorschach; 18.11.2019
comment
Теперь все работает нормально, но мой стиль кодирования Google работает плохо :D Знаете, как я могу переопределить только этот атрибут? - person mortymacs; 18.11.2019
comment
вы пробовали код в моем предыдущем комментарии? это должно просто установить значение для arglist-close - person Rorschach; 18.11.2019
comment
Да, но это не сработало. Я добавил решение в свой пост с вопросами на основе вашего руководства и справки, и оно отлично работает. Но он игнорирует весь стиль кодирования Google. Пожалуйста, проверьте мой вопрос, чтобы увидеть решение. - person mortymacs; 18.11.2019
comment
Я нашел это: D, я должен изменить Linux на Google. Теперь он работает отлично! - person mortymacs; 18.11.2019