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

Я не могу получить нулевое смещение для некоторых вещей для моих заголовочных файлов 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.

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

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

ОБНОВИТЬ:

Благодаря ответам мне удалось продвинуться немного дальше, но в целом решения по-прежнему нет, потому что изменение вещей, необходимых для получения полного смещения 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:

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

4 ответа

Решение

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

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

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

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

// -*- C++ -*-

в начале.

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

(inclass . +)

Затем в .emacs:

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

Что заставляет меня желать:

class A {
 public:
  A();
  ...

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

(c-set-offset 'innamespace 0)

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

Другие вопросы по тегам