Nuova risposta
ho incontrato l'esigenza esatta che aveva citato nella sua interrogazione. Ho dovuto impostare il rientro in base allo stile di codifica del mio nuovo progetto. Dopo un po 'di ricerche, ho raggiunto questo obiettivo utilizzando Custom Line-up Functions.
Modificare la tua my-cpp-mode
di simile a questa:
(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++")
)
Se questa risposta è accettabile, io vado avanti e rimuovere la vecchia risposta.
Vecchio risposta
In base a ciò che si sta cercando di ottenere, mi permetto di suggerire un approccio diverso? Sembra che tu voglia l'etichetta di accesso con un livello di indentazione diverso rispetto alla classe e ai membri della classe. Usa il seguente per farlo.
(access-label . /)
Da Emacs documentazione:
Se offset è uno dei simboli +',
- '++',
-', *', or
/' quindi un multiplo positivo o negativo del `c-base-offset 'è aggiunto a la rientranza di base; 1, -1, 2, -2, 0,5 e -0,5, rispettivamente.
Ecco uno snippet di uno degli stili personalizzati che ho definito.
(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 . ++)
))))
Con c-basic-offset
impostato su 4, (access-label . /)
aggiunge una rientranza negativo di 2 spazi verso le etichette di accesso. Ecco il risultato effettivo della mia modalità di indentazione sul tuo codice di esempio.
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
};
Consiglio questo modo perché, il livello di rientro dei membri variabili terzi/struct è coerente. FWIW, Google C Style segue lo stesso approccio.
Per quanto posso dire, non è possibile distinguere tra un membro della classe o un membro della struttura (inclass
elemento di sytax). È possibile utilizzare M-x c-syntactic-information-on-region
per eseguire un'analisi sintattica su un'area. Una di queste analisi sul tuo esempio produce quanto segue. Dall'output, non c'è nulla da distinguere se sei in una classe o in una struct.
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))
Penso che vorresti solo pubblico: e privato: per non aggiungere un livello di indentazione. – djechlin
Grazie, ma se intendi "{" e "public:" sulla stessa colonna, no non è quello che voglio. – Aurelien
Posso capire il tuo desiderio, e dato abbastanza tweaking dovrebbe essere possibile. D'altra parte, potrebbe benissimo essere che questo non è facilmente raggiungibile, perché la non distinzione tra classi e strutture funziona piuttosto in profondità in C++: puoi persino usare gli specificatori di accesso per le strutture. Poiché tale uso è raro, tuttavia, aggiungerò questa domanda e sarei interessato a vedere se emergono delle soluzioni. – MvG