新しい回答
私はあなたがあなたの質問に言及していた正確な要件に走りました。 新しいプロジェクトのコーディングスタイルに合わせてインデントを設定する必要がありました。少しの研究の後、Custom Line-up Functionsを使ってこれを達成しました。
はこのようにあなたmy-cpp-mode
を変更します。
(defun my-c-lineup-inclass (langelem)
(let ((inclass (assoc 'inclass c-syntactic-context)))
(save-excursion
(goto-char (c-langelem-pos inclass))
(if (or (looking-at "struct")
(looking-at "typedef struct"))
'+
'++))))
(defun my-cpp-mode()
"My C++ mode"
(c++-mode)
(c-set-style "K&R")
(setq c-basic-offset 4)
(c-set-offset 'access-label '-)
(c-set-offset 'inclass 'my-c-lineup-inclass)
;; ...
(setq mode-name "My C++")
)
この答えが許容できる場合、私は先に行くと、古い答えを削除します。あなたが達成しようとしているものに基づいて
旧回答
、私は別のアプローチを提案することができますか?クラスとクラスのメンバーとは異なるインデントレベルでアクセスラベルが必要なようです。それを達成するために以下を使用してください。 Emacsのドキュメントから
(access-label . /)
:
OFFSET場合はシンボル+',
の一つである - '++',
- '、*', or
/」 その後、 `C-基本オフセットの正または負の倍数'は、ベースインデントの に追加されます。 1、-1,2、-2、0.5、および-0.5である。
ここでは、私が定義したカスタムスタイルのスニペットを示します。 c-basic-offset
セットで
(c-add-style
"xyz-style"
'((indent-tabs-mode . nil)
(fill-column . 75)
(c-basic-offset . 4)
(c-offsets-alist . (
(access-label . /)
(inextern-lang . 0)
(innamespace . 0)
(member-init-intro . ++)
))))
4に、(access-label . /)
アクセス・ラベルに2つのスペースの負のインデントを追加します。ここでは、サンプルコードのインデントモードの実際の結果を示します。
class A
{
// I ALWAYS use access labels in classes
public: // access-label
int member; // inclass
};
struct B
{
// I NEVER use access labels in structs
int member; // inclass
};
メンバ変数/構造体メンバのインデントレベルが一貫しているため、このモードをお勧めします。 FWIW、Google C Styleも同じアプローチに従います。
私が知る限り、クラスメンバーまたは構造メンバー(inclass
sytax要素)を区別することはできません。 M-x c-syntactic-information-on-region
を使用して、リージョンの構文分析を行うことができます。そのような分析の1つでは、次のような結果が得られます。出力から、クラスまたは構造体にあるかどうかを区別するものはありません。
class A // ((topmost-intro 1))
{ // ((class-open 1))
// ((inclass 64) (topmost-intro 64) (comment-intro))I ALWAYS use access labels in classes
// ((inclass 64) (topmost-intro 64))
public: // ((inclass 64) (access-label 64))access-label
int member; // ((inclass 64) (topmost-intro 64))inclass
}; // ((class-close 1))
// ((topmost-intro 503))
struct B // ((topmost-intro 503))
{ // ((class-open 629))
// ((inclass 694) (topmost-intro 694) (comment-intro))I NEVER use access labels in structs
// ((inclass 694) (topmost-intro 694))
int member; // ((inclass 694) (topmost-intro 694))inclass
}; // ((class-close 629))
私は、public:private:インデントレベルを追加しないことが望ましいと思います。 – djechlin
ありがとうございますが、 "{"と "public:"は同じ列にありますが、それは私が望むものではありません。 – Aurelien
私はあなたの欲望を理解することができ、十分な調整をすれば可能であるはずです。一方、クラスと構造の区別がないため、これは簡単には実現できません。C++では構造体のアクセス指定子を使用することもできます。しかし、その使用はまれですが、私はこの質問を+1し、解決策が出てくるかどうかを調べることに興味があります。 – MvG