Отступы public / protected / private emacs для заголовочного файла C ++ не работают для нулевого смещения - PullRequest
6 голосов
/ 20 декабря 2010

Я не могу получить нулевое смещение для некоторых вещей для моих заголовочных файлов C ++ в emacs, даже если оно определено в моем файле .emacs.

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

namespace n1
{
namespace n2 // no offset
{

class SomeClass // no offset from namespace open curly
{
public: // this line with zero offset
    SomeClass(); // offset 4
    ...
};

inline SomeClass::SomeClass() // no offset
{
}

} // n2
} // n2

В мой файл .emacs я добавил метку, подобную этой:

(c-set-offset 'label 0)

Я использовал Ctrl-C Ctrl-S, чтобы узнать, что нужно изменить. Другие смещения, которые я определил в файле .emacs, работают нормально, а также значения, отличные от 0, работают для метки.

Когда я устанавливаю смещение 0 для метки, оно оказывается равным 1 при нажатии на вкладку для этой строки. Это странно и выглядит так, как будто что-то переопределяет или добавляет минимум 1.

Может кто-нибудь объяснить, как я могу достичь того, чего я хочу, и, возможно, также объяснить, что происходит в настоящее время?

Фу, это был мой первый вопрос здесь. Спасибо:)

UPDATE:

Благодаря ответам мне удалось продвинуться немного дальше, но в целом решения пока нет, потому что изменение вещей, необходимых для получения полного смещения 0 для методов доступа, приводит к другим вещам, которые мне не нужны. Вот где я сейчас:

(c-set-offset 'access-label 0)

Мне также нужно было получить файл .h для хранения как C ++, поэтому я добавил:

(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))

Это само по себе не удаляет 1 смещение, которое я видел, но, похоже, есть и класс доступа для средства доступа. Установка этого значения в 0 фактически приводит к общему смещению 0.

(c-set-offset 'inclass 0)

Проблема в том, что теперь другие вещи, такие как участники, имеют в общей сложности 0, как показано ниже:

class Foo
{
public:
Foo();
~Foo();

Чтобы исправить это, я изменил topmost-intro на offset 4

(c-set-offset 'topmost-intro 4)

Что, в свою очередь, привело к другим изменениям, например: встроенные объявления функций в том же файле. В общем, я не уверен, как настроить это так, как я хочу.

UPDATE2:

Добавлено встроенное объявление ctor SomeClass без смещения.

Ответы [ 4 ]

2 голосов
/ 20 декабря 2010

Вы хотите access-label вместо метки, и если CC CS дал вам ((label 1)), это означает, что вы находитесь в режиме C, а не в режиме C ++ (режим C по умолчанию используется для файлов .h).Если это ваша проблема, добавьте

// Emacs, please set these
// Local Variables: ***
// mode: c++ ***
// End: ***

в конец вашего .h файла или

// -*- C++ -*-

в начале.

2 голосов
/ 20 декабря 2010

Я полагаю, вы хотите метку доступа вместо метки.Смотрите здесь .

1 голос
/ 01 апреля 2015

Я думаю, вы можете использовать отрицательное число. Например, в моем c-offsets-alist у меня есть:

(inclass . +)

Затем в .emacs:

(c-set-offset 'access-label -1)

Что дает мне желаемое:

class A {
 public:
  A();
  ...
1 голос
/ 28 февраля 2013

Если вы используете

(c-set-offset 'innamespace 0)

тогда открывающая фигурная скобка пространства имен не увеличивает уровень отступа.

...