c++ emacs indentation

Emacs C++-modo indentación incorrecta?



indentation (5)

Antes de ajustar las compensaciones individuales, configure el estilo preferido. Yo uso stroustrup, usted puede probar algunos otros, vea http://www.emacswiki.org/emacs/IndentingC#toc1 para los nombres y http://en.wikipedia.org/wiki/Indent_style#Variant:_Stroustrup para ver ejemplos

Mx customize-variable c-default-style (y configure su preferido para C ++ _

Estoy ejecutando emacs 23 con modo c ++ - y tengo algunos problemas de indentación. Supongamos que tengo este código:

void foo() { if (cond) { <--- int i; ... } <--- }

Este parece ser el comportamiento predeterminado de la sangría automática. Sin embargo, me gustaría cambiarlo para que sea así:

void foo() { if (cond) { int i; ... } }

¿Hay alguna manera de hacer esto fácilmente configurando el modo c ++ o mi archivo .emacs?


Esto es mío ... esto coincide con la configuración predeterminada para Visual Studio.

(defun my-c-mode-common-hook () ;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode (c-set-offset ''substatement-open 0) ;; other customizations can go here (setq c++-tab-always-indent t) (setq c-basic-offset 4) ;; Default is 2 (setq c-indent-level 4) ;; Default is 2 (setq tab-stop-list ''(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60)) (setq tab-width 4) (setq indent-tabs-mode t) ; use spaces only if nil ) (add-hook ''c-mode-common-hook ''my-c-mode-common-hook)


La respuesta aceptada es realmente incorrecta. Emacswiki no ayudará.

Inserte el siguiente código en ~ / .emacs:

(defun fix-c-indent-offset-according-to-syntax-context (key val) ;; remove the old element (setq c-offsets-alist (delq (assoc key c-offsets-alist) c-offsets-alist)) ;; new value (add-to-list ''c-offsets-alist ''(key . val))) (add-hook ''c-mode-common-hook (lambda () (when (derived-mode-p ''c-mode ''c++-mode ''java-mode) ;; indent (fix-c-indent-offset-according-to-syntax-context ''substatement-open 0)) ))

Consulte http://blog.binchen.org/posts/ccjava-code-indentation-in-emacs.html para obtener detalles técnicos.

La cuestión clave es c-set-offset ya no es confiable para detectar el contexto de sintaxis (Emacs24.3.1). Entonces, la única manera confiable es analizar el código original de emacs. Los pasos detallados para hackear el código se enumeran en mi artículo, básicamente se necesita leer la función c-indent-line que se define en /usr/share/emacs/24.3/lisp/progmodes/cc-cmds.el

Algunas personas se quejaron de que mi configuración no funciona. En realidad, funciona en todas las versiones estables de Emacs (23.4, 24.3, 24.4) si no cambia la configuración predeterminada (La sangría tiene diferentes perfiles, mi configuración se basa en el perfil predeterminado).

Mi punto clave es que, en este tema específico, necesitas leer el código.


Respuesta corta: Coloque esta línea en su archivo .emacs:

(c-set-offset ''substatement-open 0)

Respuesta larga: ...

Para aquellos de nosotros que somos nuevos en emacs-lisp, hay un método bastante simple en http://www.cs.cmu.edu/ :

  • Ir a la línea que desea sangrar

  • Escriba CC CO (esa es la letra "O", no cero)

  • Presione Entrar para aceptar la sugerencia predeterminada

  • Escriba "0" (que es un cero) para ninguna sangría adicional, presione Entrar

  • Escriba Tab para reinventar la línea.

  • El futuro "{" en esta situación tendrá la configuración de tabulación correcta, hasta que reinicie emacs.

Lo bueno de este método es que puedes ver el código de lisp que deseas cambiar. Puede poner su archivo .emacs:

(c-set-offset ''SYNTACTIC-SYMBOL OFFSET)

Además, es posible que desee comprobar el programa AStyle para formatear automáticamente la fuente de C ++ fuera de emacs.


Tengo lo siguiente en mi archivo .emacs:

(defun my-c++-mode-hook () (setq c-basic-offset 4) (c-set-offset ''substatement-open 0)) (add-hook ''c++-mode-hook ''my-c++-mode-hook)

Puede determinar qué desplazamiento editar presionando [ctrl-c ctrl-s] en cualquier línea. En la primera línea con un corsé después del if , dirá substatement-open .