2010-04-12 3 views
23

Ho un moltiplicano namespace nidificato:Emacs - Override rientro

namespace first {namespace second {namespace third { 
       // emacs indents three times 
    // I want to intend here 
} } } 

trattini in modo Emacs per la terza posizione. Comunque voglio solo una singola rientranza.
È possibile realizzare questo effetto semplicemente?

risposta

23

Utilizzare una una colonna di rientro assoluta all'interno dello spazio dei nomi:

(defconst my-cc-style 
    '("gnu" 
    (c-offsets-alist . ((innamespace . [4]))))) 

(c-add-style "my-cc-style" my-cc-style) 

Quindi utilizzare c-set-stile di utilizzare il proprio stile.

Si noti che questo funziona solo in C++ - modalità, la modalità c non conosce "spazio dei nomi".

1

Se si desidera semplicemente inserire una scheda letterale, anziché modificare lo schema di indentazione di emacs, è necessario utilizzare C-q TAB.

1

Sfortunatamente, non credo che emacs abbia uno stile separato per uno spazio dei nomi all'interno di un altro spazio dei nomi. Se vai nella riga interna e fai C-c, C-o, puoi cambiare lo stile di intro più in alto e se esegui customize-variable c-offsets-alist puoi modificare tutte le diverse opzioni di indentazione di emacs, ma non esiste per il tuo caso d'uso specifico. Si avrebbe bisogno di scrivere manualmente in elisp

4

OK quindi questo sembra funzionare in entrambi i emacs 21 e 22 almeno:

(defun followed-by (cases) 
    (cond ((null cases) nil) 
     ((assq (car cases) 
       (cdr (memq c-syntactic-element c-syntactic-context))) t) 
     (t (followed-by (cdr cases))))) 

(c-add-style "foo"  
       `((other . personalizations) 
     (c-offsets-alist 
     (more . stuff) 
     (innamespace 
      . (lambda (x) 
      (if (followed-by 
       '(innamespace namespace-close)) 0 '+)))))) 

(La prima soluzione non supporta costrutti come

namespace X { namespace Y { 
    class A; 
    namespace Z { 
     class B; 
    } 
}} 

)

+0

Molto bello, Grazie. –

1

questo funziona per me, eredita da cc-mode e sostituisco lo spazio del nome indenting a 0, ovvero disabilita il suo rientro.

(defconst my-cc-style 
    '("cc-mode" 
    (c-offsets-alist . ((innamespace . [0]))))) 

(c-add-style "my-cc-mode" my-cc-style) 
+0

Un paio di domande: come assicurate che my-cc-mode sia basato sulla vostra precedente scelta di stile C, e come lo attivate? – GreenAsJade

+1

Attivalo da questo hook: (add-hook 'C++ - modo-hook (lambda() (c-set-style "my-cc-style") )) –

10

Con C++ - Modalità di Emacs 23, ho dovuto fare in questo modo:

(defun my-c-setup() 
    (c-set-offset 'innamespace [4])) 
(add-hook 'c++-mode-hook 'my-c-setup) 

Per disattivare il rientro in spazi dei nomi del tutto, modificare [4] a 0.

+0

Questo ha funzionato per me in Emacs 24.5.1 (con 'innamespace [0]'), mentre la risposta accettata no. – AlwaysLearning

+1

Soluzione molto migliore rispetto a quella accettata, che richiede di interferire con lo stile effettivo che si sta utilizzando (e non spiega come). La risposta accettata non ha funzionato per me, questo fa. – GreenAsJade