Para programar en c en emacs debemos emplear c-mode el cual se puede invocar mediante M-x c-mode. Existen distintos keystrokes básicos que pueden sernos de mucha utilidad:
M-a : ‘c-beginning-of-statement‘; se desplaza al inicio de la sentencia.
M-e : ‘c-end-of-statement‘; se desplaza al final de la sentencia.
M-q : ‘c-fill-paragraph‘; formatea un comentario y lo separa en distintas líneas según el ancho de columna máximo.
C-M-a : ‘beginning-of-defun‘; se desplaza al inicio de la función.
C-M-e : ‘end-of-defun‘; se desplaza al final de la función.
C-M-h : ‘c-mark-function‘; pone el cursor al inicio de la función y la marca al final.
C-c C-q : ‘c-indent-defun‘; indenta la función.
C-c C-v : ‘c-up-conditional‘ se desplaza al principio del actual preposición condicional.
C-c C-p : ‘c-backward-conditional‘; se desplaza a la preposición condicional anterior.
C-c C-n : ‘c-forward-conditional‘; se desplaza a la siguiente preposición condicional.
Además de ello podemos usar distintos estilos a la hora de programar en c, de todos ellos los más famosos o aceptados de forma general por un gran amplio grupo de usuarios están soportados en emacs, para formatear nuestro código con uno de estos estilos tan sólo debemos pulsar M-x c-set-style y presionando TAB mostrará la lista de posibles estilos a seleccionar entre ellos: bsd, cc-mode, ellental (usado por Ellental labs), gnu, java, k&r, linux, python, stroustrup, user (configurado por el usuario via custom mode) y whitesmith (usado por whitesmith compilers).
Para modificar el estilo de forma permanente debemos añadir a nuestro emacs:
‘(add-hook ‘c-mode-hook
‘(lambda()
(c-set-style «mystyle»)))
La variable c-style-alist contiene toda la carga de la configuración para cada estilo de c.
Siguiendo con el juego de keystrokes utiles podemos emplear algunas más las cuales pueden sernos de mucha utilidad:
C-c C-a : ‘c-toggle-auto-state‘; crea una nueva línea en caso de que se pulse el carácter ;, { o }.
C-c C-d : ‘hungry-delete-key‘; elimina todos los espacios en blanco que haya a la izquierda con delete.
(sin keystroke asociada) : ‘c-toggle-hungry-state‘; el modeline cambiará de C a C/h.
C-c C-t : ‘c-toggle-auto-hungry-state‘; activa/desactiva las C o C/h.
Si queremos activarlo al iniciar debemos poner esto en nuestro .emacs:
(add-hook ‘c-mode-hook
‘(lambda()
(c-toggle-auto-state)))
Si queremos cambiarlo en nuestro estilo específico debemos hacer:
(add-hook ‘c-mode-hook
‘(lambda()
(c-set-style «nombre del estilo»)))
A la hora de trabajar con comentarios tenemos varias opciones de estilo bastante utiles como por ejemplo:
M-j : ‘indent-new-comment-line‘; además si dejamos comment-multiline a nil crearía un nuevo comentario en la línea siguiente teniendo en cuenta la identación de la actual y poniendo /* */
M-j : ‘indent-new-comment-line‘; además si dejamos comment-multiline a true crearía un nuevo comentario en la línea siguiente teniendo en cuenta la identación de la actual y usando un sólo /* */ para todas las líneas.
Por último podemos expandir macros, lo cual es muy útil, ya que muchas macros complejas son el nacimiento de nuevos bugs o problemas en tiempo de ejecución.
C-c C-e : ‘c-macro-expand‘; antes deberemos tener seleccionada una región y esto nos expandirá las macros y mostrará el resultado en *Macro expansion* buffer.
C-c C-u : ‘c-up-conditional‘; se desplaza a la condición del preprocesador anterior.
Es posible modificar la variable c-macro-processor para cambiar las opciones por defecto que es /lib/cpp -C (la opcion -C es para preservar los comentarios) o bien modificar el .emacs para realizar este cambio de forma permanente:
(setq c-macro-processor «/usr/local/lib/cpp -C»)
Para programar en c++ debemos emplear c++-mode, el cual invocaremos mediante M-x c++-mode. Todos los keystrokes explicados previamente sirven para c++, ya que c++ incluye todo c y algo más. Sin embargo existe este otro modo ya que la sintaxis es opuesta y por lo tanto necesitamos otro modo para definir este nuevo comportamiento, además podemos añadir esto a nuestro .emacs:
(add-hook ‘c++-mode-hook
‘(lambda()
(c-set-style «Stroustrup»)
(c-toggle-auto-state))
C-c : : ‘c-scope-operator‘; inserta el scope operator para evitar problemas con el electric :.
(sin keystroke asociada) : ‘c-forward-subword‘; se desplaza hacia delante una subpalabra según la nomenclatura de estandares GNU.
(sin keystroke asociada) : ‘c-backward-subword‘; se desplaza hacia detrás una subpalabra según la nomenclatura de estandares GNU.