2012-06-16 12 views
10

A veces quiero tener comentarios temporales completamente justificados a la izquierda en una línea (//) o un bloque de líneas /* */. Sin embargo, CC Mode lo anula autodegradando al escribir la segunda clave. En general, me gusta el autoguiado para palabras clave, etc., pero preferiría que se deshabilite para comentarios. (Actualización. Quiero decir, para desactivar el modo comentario muesca se desencadena por los c-eléctrico- atajos de teclado, pero los comentarios todavía debería sangrar normalmente othewise)En emacs, ¿cómo deshabilitar la sangría automática de comentarios en C/C++?

He intentado poner estas líneas en .emacs, pero no evita el comportamiento.

(c-electric-slash nil) 
(c-electric-star nil) 

Respuesta

8

Respuesta corta:

(eval-after-load 'cc-mode 
    '(progn 
    (define-key c-mode-base-map "/" 'self-insert-command) 
    (define-key c-mode-base-map "*" 'self-insert-command))) 

Así es como voy alrededor que:

Averigüe la función obligado a /: C-h k /

Dice "/ ejecuta el comando c-electric-slash, que es una función compilada interactiva Lisp en 'cc-cmds.el'".

(Si no ve el enlace a cc-cmds.el, entonces no tiene instaladas las fuentes elisp. Suponiendo que no está en Windows, puede utilizar el gestor de paquetes del sistema para instalar el paquete emacs-el y tratar de nuevo.)

Siga ese enlace para abrir cc-cmds.el. La búsqueda de c-electric-slash no encuentra nada más que la definición de la función, por lo que las claves no están vinculadas en este archivo. Buscando en cc-mode.el desde este directorio revela:

(define-key c-mode-base-map "/" 'c-electric-slash) 

Ahora sabemos el nombre del "mapa de teclado" en la que la combinación de teclas para anular /.

Si añade algo como esto a su archivo de inicio, probablemente obtendrá un error en el arranque:

(define-key c-mode-base-map "/" 'self-insert-command) 

... porque se carga el fichero init antes cc-mode.el es, y c-mode-base-map no está definido. Entonces usamos eval-after-load (como en la parte superior de mi respuesta). El primer argumento, 'cc-mode, tiene que coincidir con la declaración provide al final de cc-mode.el. Si no sabe lo que significa el progn, haga C-h f progn.

Si te gusta este estilo de aprendizaje/descubrimiento de Emacs, puedes considerar leer mi "How to learn Emacs".

+0

¡Genial! ¡Qué gran explicación! ... y funciona también :) ... Gracias ... y yo ' Definitivamente estaré leyendo su guía sugerida. –

+0

Sugerencia: Actualice esto para usar 'with-eval-after-load' –

+0

Por lo que vale, estaba luchando con este problema al crear un modo importante derivado de' c-mode'. añadiendo las dos líneas 'define-key' a la definición del mapa de teclas de mi modo (y cambiando' c-mode-base-map' al nombre de mi mapa local), pude eliminar este comportamiento. ¡Gracias! – ohruunuruus

0

que sugieren que mirar a los c-indent-comment-alist & c-indent-comments-syntactically-p variables. Ver más información en la ayuda para esta variables (C-h v) y en las secciones "Customizing Indentation" y "Style Variables" del manual en modo CC

+0

Todavía no lo he leído (y mucho menos lidié con la nueva jerga de emacs), pero tengo la sensación de que su sugerencia cambia *** cómo *** cosas sangría.No quiero cambiar el comportamiento de sangría: sí quiero líneas de comentarios para sangrar normalmente en la mayoría de las situaciones, pero no quiero * (c-electric-slash * y * (c-electric-star *) para dictar que la sangría ocurre *** cuando se presionan *** '/' o '*'. Tal vez sea tan simple como volver a vincular las teclas '/' y '*' de las funciones * electric * a 'self-insert-command' , pero solo para * Modo CC * (ese es el truco que no sé cómo hacer). –

Cuestiones relacionadas