2010-04-12 22 views
23

I tienen un espacio de nombres anidada se multiplican:Emacs - indentación override

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

guiones así que Emacs a la tercera posición. Sin embargo, solo quiero una sola sangría.
¿Es posible lograr este efecto simplemente?

Respuesta

23

uso de una columna de una muesca absoluta dentro del espacio de nombres:

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

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

A continuación, utilice c-set-estilo utilizar su propio estilo.

Tenga en cuenta que esto solo funciona en C++ - modo, c-mode no conoce "en el espacio del nombre".

1

Si simplemente desea introducir una ficha literal, en lugar de cambiar esquema de muesca de emacs, C-q TAB debería funcionar.

1

Por desgracia, no creo que Emacs tiene un estilo diferente para un espacio de nombres dentro de otro espacio de nombres. Si usted va a la línea interior y hacer C-C, C-O, usted puede cambiar el estilo superior de introducción, y si se ejecuta customize-variable c-offsets-alist puede editar todas las diferentes opciones de sangría emacs tiene, pero no existe uno para su caso de uso específico. Usted tendría que escribir manualmente en elisp

4

bien así que esto parece funcionar en ambos emacs 21 y 22, al menos:

(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 primera solución no es compatible con construcciones como

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

)

+0

muy agradable, Gracias. –

1

Estos trabajos para mí, herede de cc-mode y reemplace el espacio de nombre sangrando a 0, también conocido como, deshabilitar su sangría.

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

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

Un par de preguntas: ¿cómo se asegura de que my-cc-mode se base en su elección previa del estilo C y cómo lo active? – GreenAsJade

+1

Actívelo por este gancho: (add-hook 'C++ - modo-gancho (lambda() (c-set-style "estilo mi-cc") )) –

10

con C++ - el modo en Emacs 23, que tenía que hacer así:

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

Para desactivar la sangría en los espacios de nombre completo, cambie [4] a 0.

+0

Esto funcionó para mí en Emacs 24.5.1 (con 'innamespace [0]'), mientras que la respuesta aceptada no. – AlwaysLearning

+1

Solución mucho mejor que la aceptada, que requiere que te metas con el estilo real que estás usando (y no te dice cómo). La respuesta aceptada no funcionó para mí, esto sí. – GreenAsJade