Dic 21 2008

C y C++ en emacs

Tag: basicoverdrive @ 8:34 pm

 

  • C en Emacs

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: bsdcc-modeellental (usado por Ellental labs), gnujavak&rlinuxpythonstroustrupuser (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»)

  • C++ en Emacs

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.


Oct 26 2008

edit-picture, picture-mode y artist-mode

Tag: basicoverdrive @ 4:30 pm

Desde emacs es posible dibujar ascii arts como en cualquier editor, quizás esta no sea la parte más productiva de emacs, pero en cualquier caso lo veo interesante nombrarlo.

  • edit-picture y picture-mode

El modo picture permite realizar dibujos o desplazarnos de una forma adaptada para estos dibujos, para ello debemos lanzar el modo mediante M-x edit-picture mientras que C-c C-c saldrá de dicho modo. Las teclas de desplazamiento son las siguientes:

Además existe otro modo parecido invocado mediante M-x picture-mode, el cual permite realizar tareas repetitivas así como insertar objetos pre-diseñados. Veamos ejemplos para dicho modo:

M-20 – : repite 20 veces el guión.

C-c . M-5 | : el primer comando (C-c .) cambiaría la dirección hacia abajo, mientras que el segundo (M-5 |) repetiría 5 veces el símbolo pipe en dicha dirección.

Además se pueden realizar estas acciones:

<CR> : se desplaza a la siguiente línea sin crear un salto.

C-c : ‘picture-open-line‘; inserta una nueva línea.

C-c C-w número: ‘picture-clear-rectangle-to-register‘; limpia el rectángulo y lo salva en el registro número.

C-u C-c C-w número: elimina el rectángulo y lo salva en el registro número.

C-c C-x número : ‘picture-same-rectangle-from-register‘; inserta un rectángulo del registro número.

C-c C-r : ‘picture-draw-rectangle‘; dibuja un rectángulo alrededor de la región actual.

C-c C-y : ‘picture-yank-rectangle‘; pega un rectángulo.

C-c C-k : ‘picture-clear-rectangle‘; borra un rectángulo.

C-c TAB : ‘picture-set-tab-stops‘; asigna el TAB stop.

M-TAB : ‘picture-tab-search‘; se desplaza a la siguiente imagen TAB.

C-k : ‘picture-decr-line‘; elimina el texto de la línea actual.

C-c C-d : ‘delete-char‘; elimina el carácter y mueve el l texto a la izquierda.

C-d : ‘picture-clear-column‘; crea un blanco en la siguiente línea.

C-p : ‘picture-move-up‘; mueve el cursor arriba.

C-n : ‘picture-move-down‘; mueve el cursor abajo.

C-b : ‘picture-backward-column‘; mueve el cursor a la izquierda.

C-f : ‘picture-forward-column‘; mueve el cursor hacia la derecha.

C-c C-b : ‘picture-motion-reverse‘; mueve el cursor en la dirección inversa.

  • Artist mode

    Con M-x artist-mode entraremos en dicho modo, el cual, permite insertar objetos predefinidos, así como diversos pinceles.

    F10 -> browsing -> edit -> settings -> podemos seleccionar entre variedades de pinceles y demás.

    C-c C-c : ‘artist-mode-off‘; sale del modo artist-mode.

    C-f : ‘artist-forward-char‘; mueve el cursor adelante.

    C-b : ‘artist-backward-char‘; mueve el cursor atrás.

    C-n : ‘artist-next-line‘; mueve el cursor a la siguiente línea.

    C-p : ‘artist-previous-line‘; mueve el cursor a la línea anterior.

    C-c C-a C-o : ‘artist-select-operation‘; selecciona una operación (pulsar TAB para obtener la lista completa).

    C-c C-a f : ‘artist-select-operation-flood-fill‘; selecciona flood kill.

    C-c C-a C-k : ‘artist-select-operation-cut-rectangle‘; corta un rectángulo.

    C-c C-a M-w : ‘artist-select-operation-copy-rectangle‘; copia un rectángulo.

    C-c C-a C-y : ‘artist-select-operation-paste’; pega un rectángulo.

    C-c C-a v : ‘artist-select-operation-vaporize-line‘; elimina una línea.

    C-c C-a C-d : ‘artist-select-operation-erase-char‘; borra caracteres.

    C-c C-a S : ‘artist-select-operation-spray-can‘; utiliza el spray.

    C-c C-a e : ‘artist-select-operation-ellipse‘; dibuja una elipse.

    C-c C-a p : ‘artist-select-operation-poly-line‘; dibuja poli líneas.

    C-c C-a r : ‘artist-select-operation-rectangle‘; dibuja rectángulos.

    C-c C-a l : ‘artist-select-operation-line‘; dibuja líneas.

    C-c C-a C-r : ‘artist-toggle-rubber-banding‘; muestra la goma de borrar.

    C-c C-a C-l : ‘artist-select-line-char‘; muestra el carácter a usar cuando se dibuja.

    C-c C-a C-f : ‘artist-select-fill-char‘; selecciona el carácter para diferenciar formas.


    Oct 25 2008

    Rectángulos

    Tag: basicoverdrive @ 11:10 pm

    Trabajar con rectángulos en emacs puede ser muy útil, pero antes de trabajar con rectángulos debemos seleccionar el buffer entero y cercionarnos de que dicho buffer no contiene tabulaciones si queremos evitar problemas.

    C-x h para seleccionar el buffer
    M-x untabify para quitar las tabulaciones.

    Decir que este paso es recomendable pero posiblemente innecesario, debido a que en las ultimas versiones de emacs (probablemente desde la 22) emacs es suficientemente inteligente para trabajar correctamente con rectángulos en un buffer con tabulaciones.

    Imaginemos que tenemos un documento a modo tabla en texto, con sus filas (separadas mediante y sus columnas separadas previamente con TAB pero esta vez convertidos a simple espacios con M-x untabify. Podemos desplazar el cursor hasta el primer carácter de la primera columna, pulsar C-SPC y desplazar de nuevo el caracter hasta el primer carácter de otra columna y otra fila cualquiera. Si ahora ejecutamos uno de los siguientes comandos podremos ver los siguientes efectos aplicados a rectángulos (notar que los prefixjos de rectángulos siempre comenzarán por C-x r.

    C-x r k : ‘kill-rectangle‘; elimina un rectángulo.
    C-x r y : ‘yank-rectangle‘; pega un rectángulo.
    C-x r o : ‘open-rectangle‘; crea un rectángulo como el seleccionado previamente sin contenido, abre una área.
    C-x r c : ‘clear-rectangle‘; rellena con espacios el rectángulo seleccionado, sin borrar su desplazamiento pero sí su contenido.
    C-x r d : ‘delete-rectangle‘; elimina un rectángulo seleccionado, incluyendo su desplazamiento y su contenido.
    C-x r r [a-z0-9]: ‘copy-rectangle-to-register‘; copia el rectángulo a un registro, que puede ser usado posteriormente, los registros validos son cualquier carácter alfanumérico.
    C-x r i : ‘insert-register‘; inserta el contenido de un registro.
    (sin keystroke asociada) : ‘delete-whitespace-rectangle‘; si contiene espacios en blancos adicionales, los elimina.
    C-x r t : ‘string-rectangle‘; rellena con un carácter o cadena un rectángulo. Además el rectángulo puede redimensionarse en caso de que el ancho exceda las dimensiones del rectángulo.
    (sin keystroke asociada) : ‘string-insert-rectangle‘; muestra un prompt para la cadena que posteriormente sera insertada en un rectángulo.

    • Rectángulos con CUA

    Si trabajamos con CUA, C-x se emplea para cortar, por lo que debemos buscar una manera alternativa para poder realizar las acciones anteriormente mencionadas.

    Con Shift-<CR> podremos seleccionar un rectángulo, una vez vista la parte seleccionada podemos presionar M-p, el cual seleccionará perfecto. Ahora podemos hacer uso de C-x y C-v ya sea para cortar o pegar.


    « Página anteriorPágina siguiente »