New Answer
wpadłem dokładnie wymogu, że wspominał w swoim pytaniu. Musiałem ustawić wcięcia zgodnie ze stylem kodowania mojego nowego projektu. Po kilku badaniach osiągnąłem to, używając Custom Line-up Functions.
zmodyfikować my-cpp-mode
wyglądać tak:
(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++")
)
Jeśli ta odpowiedź jest do zaakceptowania, pójdę do przodu i zdjąć starą odpowiedź.
Old Odpowiedź
W oparciu o to, co staramy się osiągnąć, może proponuję inne podejście? Wygląda na to, że chcesz uzyskać etykietę dostępu na innym poziomie wcięcia niż klasa i członkowie klasy. Aby to osiągnąć, wykonaj następujące czynności.
(access-label . /)
Z dokumentacji Emacsa:
Jeśli przesunięcie jest jednym z symboli +',
- '++',
-', *', or
/” wówczas dodatnia lub ujemna wielokrotność` przesunięcie c-basic- "dodaje się do wcięcie podstawowe; Odpowiednio 1, -1, 2, -2, 0,5 i -0,5.
Oto fragment z jednego z niestandardowych stylów, które zdefiniowałem.
(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 . ++)
))))
Z c-basic-offset
ustawiona na 4, (access-label . /)
dodaje negatywny wcięcia 2 miejsca do etykiet dostępu. Oto rzeczywisty wynik mojego trybu wcięcia na przykładowym kodzie.
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
};
Polecam ten tryb, ponieważ poziom wcięcia zmiennych członkowskich/członków struktury jest spójny. FWIW, Google C Style postępuje zgodnie z tym samym podejściem.
Z tego co wiem, nie można rozróżnić między członkiem klasy lub członkiem struktury (element sytax inclass
). Można użyć M-x c-syntactic-information-on-region
, aby wykonać analizę składniową regionu. Jedna z takich analiz na przykładzie użytkownika daje następujące wyniki. Z danych wyjściowych nie ma nic do rozróżnienia, jeśli jesteś w klasie lub strukturze.
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))
Myślę, że po prostu chcesz public: and private: aby nie dodawać wcięć. – djechlin
Dzięki, ale jeśli masz na myśli "{" i "public:" w tej samej kolumnie, nie, to nie jest to, czego chcę. – Aurelien
Potrafię zrozumieć twoje pragnienie, i biorąc pod uwagę wystarczającą poprawę, powinno być możliwe. Z drugiej strony może się okazać, że nie jest to łatwe, ponieważ brak rozróżnienia między klasami i strukturami przebiega dość głęboko w C++: można nawet używać struktur specyfikacji dostępu. Ponieważ takie użycie jest rzadkie, udzielę +1 temu pytaniu i będę zainteresowany, czy pojawią się jakieś rozwiązania. – MvG