Emacs отстъп с последователни скоби в C++

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

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

Как да коригирате този отстъп, за да бъде като нормален отстъп:

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

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

  • major-mode е променлива, дефинирана в „C изходния код“.
  • Стойността му е „c++-mode“

РЕШЕНИЕ:

Благодаря, @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“ Първоначалната стойност беше fundamental-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. След това можете да копирате целия стил в init някъде или да изберете съответните настройки.

Освен това можете да получите представа кои правила се прилагат към дадена линия, като изпълните 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 във вашия init -- дайте име на стила и извикайте (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