{"id":37,"date":"2008-12-21T20:34:46","date_gmt":"2008-12-21T18:34:46","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=37"},"modified":"2022-08-20T18:26:24","modified_gmt":"2022-08-20T16:26:24","slug":"c-y-c-en-emacs-c-mode-y-c-mode","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=37","title":{"rendered":"C y C++ en emacs"},"content":{"rendered":"<p>\u00a0<\/p>\n<ul>\n<li>C en Emacs<\/li>\n<\/ul>\n<p style=\"padding-left: 30px; \">Para programar en c en emacs debemos emplear <strong>c-mode<\/strong> el cual se puede invocar mediante <strong>M-x c-mode<\/strong>. Existen distintos keystrokes b\u00e1sicos que pueden sernos de mucha utilidad:<\/p>\n<p style=\"padding-left: 60px; \"><strong>M-a<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-beginning-of-statement<\/span>&#8216;; se desplaza al inicio de la sentencia.<\/p>\n<p style=\"padding-left: 60px; \"><strong>M-e<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-end-of-statement<\/span>&#8216;; se desplaza al final de la sentencia.<\/p>\n<p style=\"padding-left: 60px; \"><strong>M-q<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-fill-paragraph<\/span>&#8216;; formatea un comentario y lo separa en distintas l\u00edneas seg\u00fan el ancho de columna m\u00e1ximo.<\/p>\n<p style=\"padding-left: 60px; \"><strong>C-M-a<\/strong> : &#8216;<span style=\"color: #0000ff;\">beginning-of-defun<\/span>&#8216;; se desplaza al inicio de la funci\u00f3n.<\/p>\n<p style=\"padding-left: 60px; \"><strong>C-M-e<\/strong> : &#8216;<span style=\"color: #0000ff;\">end-of-defun<\/span>&#8216;; se desplaza al final de la funci\u00f3n.<\/p>\n<p style=\"padding-left: 60px; \"><strong>C-M-h<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-mark-function<\/span>&#8216;; pone el cursor al inicio de la funci\u00f3n y la marca al final.<\/p>\n<p style=\"padding-left: 60px; \"><strong>C-c C-q<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-indent-defun<\/span>&#8216;; indenta la funci\u00f3n.<\/p>\n<p style=\"padding-left: 60px; \"><strong>C-c C-v<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-up-conditional<\/span>&#8216; se desplaza al principio del actual preposici\u00f3n condicional.<\/p>\n<p style=\"padding-left: 60px; \"><strong>C-c C-p<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-backward-conditional<\/span>&#8216;; se desplaza a la preposici\u00f3n condicional anterior.<\/p>\n<p style=\"padding-left: 60px; \"><strong>C-c C-n<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-forward-conditional<\/span>&#8216;; se desplaza a la siguiente preposici\u00f3n condicional.<\/p>\n<p style=\"padding-left: 30px; \">Adem\u00e1s de ello podemos usar distintos estilos a la hora de programar en c, de todos ellos los m\u00e1s famosos o aceptados de forma general por un gran amplio grupo de usuarios est\u00e1n soportados en emacs, para formatear nuestro c\u00f3digo con uno de estos estilos tan s\u00f3lo debemos pulsar <strong>M-x c-set-style<\/strong>\u00a0y presionando <strong>TAB<\/strong> mostrar\u00e1 la lista de posibles estilos a seleccionar entre ellos:\u00a0<strong>bsd<\/strong>,\u00a0<strong>cc-mode<\/strong>,\u00a0<strong>ellental<\/strong> (usado por Ellental labs),\u00a0<strong>gnu<\/strong>,\u00a0<strong>java<\/strong>,\u00a0<strong>k&amp;r<\/strong>,\u00a0<strong>linux<\/strong>,\u00a0<strong>python<\/strong>,\u00a0<strong>stroustrup<\/strong>,\u00a0<strong>user<\/strong> (configurado por el usuario via custom mode) y\u00a0<strong>whitesmith<\/strong> (usado por whitesmith compilers).<\/p>\n<p style=\"padding-left: 30px; \">Para modificar el estilo de forma permanente debemos a\u00f1adir a nuestro emacs:<\/p>\n<p style=\"padding-left: 60px; \"><em>&#8216;(add-hook &#8216;c-mode-hook<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>\u00a0\u00a0&#8216;(lambda()<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>\u00a0\u00a0 \u00a0 (c-set-style \u00abmystyle\u00bb)))<\/em><\/p>\n<p style=\"padding-left: 30px; \">La variable <strong>c-style-alist<\/strong> contiene toda la carga de la configuraci\u00f3n para cada estilo de c.<\/p>\n<p style=\"padding-left: 30px; \">Siguiendo con el juego de keystrokes utiles podemos emplear algunas m\u00e1s las cuales pueden sernos de mucha utilidad:<\/p>\n<p style=\"padding-left: 30px; \"><strong>C-c C-a<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-toggle-auto-state<\/span>&#8216;; crea una nueva l\u00ednea en caso de que se pulse el car\u00e1cter <strong>;<\/strong>, <strong>{<\/strong> o <strong>}<\/strong>.<\/p>\n<p style=\"padding-left: 30px; \"><strong>C-c C-d<\/strong> : &#8216;<span style=\"color: #0000ff;\">hungry-delete-key<\/span>&#8216;; elimina todos los espacios en blanco que haya a la izquierda con delete.<\/p>\n<p style=\"padding-left: 30px; \"><strong>(sin keystroke asociada)\u00a0<\/strong>: &#8216;<span style=\"color: #0000ff;\">c-toggle-hungry-state<\/span>&#8216;; el modeline cambiar\u00e1 de <strong>C<\/strong> a <strong>C\/h<\/strong>.<\/p>\n<p style=\"padding-left: 30px; \"><strong>C-c C-t<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-toggle-auto-hungry-state<\/span>&#8216;; activa\/desactiva las <strong>C<\/strong> o <strong>C\/h<\/strong>.<\/p>\n<p style=\"padding-left: 30px; \">Si queremos activarlo al iniciar debemos poner esto en nuestro .emacs:<\/p>\n<p style=\"padding-left: 60px; \"><em>(add-hook &#8216;c-mode-hook<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>\u00a0&#8216;(lambda()<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>(c-toggle-auto-state)))<\/em><\/p>\n<p style=\"padding-left: 30px; \">Si queremos cambiarlo en nuestro estilo espec\u00edfico debemos hacer:<\/p>\n<p style=\"padding-left: 60px; \"><em>(add-hook &#8216;c-mode-hook<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>\u00a0&#8216;(lambda()<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>(c-set-style \u00abnombre del estilo\u00bb)))<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 30px; \">A la hora de trabajar con comentarios tenemos varias opciones de estilo bastante utiles como por ejemplo:<\/p>\n<p style=\"padding-left: 30px; \"><strong>M-j<\/strong> : &#8216;<span style=\"color: #0000ff;\">indent-new-comment-line<\/span>&#8216;; adem\u00e1s si dejamos comment-multiline a nil crear\u00eda un nuevo comentario en la l\u00ednea siguiente teniendo en cuenta la identaci\u00f3n de la actual y poniendo \/* *\/<\/p>\n<p style=\"padding-left: 30px; \"><strong>M-j<\/strong> : &#8216;<span style=\"color: #0000ff;\">indent-new-comment-line<\/span>&#8216;; adem\u00e1s si dejamos comment-multiline a true crear\u00eda un nuevo comentario en la l\u00ednea siguiente teniendo en cuenta la identaci\u00f3n de la actual y usando un s\u00f3lo \/* *\/ para todas las l\u00edneas.<\/p>\n<p style=\"padding-left: 30px; \">Por \u00faltimo podemos expandir macros, lo cual es muy \u00fatil, ya que muchas macros complejas son el nacimiento de nuevos bugs o problemas en tiempo de ejecuci\u00f3n.<\/p>\n<p style=\"padding-left: 30px; \"><strong>C-c C-e<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-macro-expand<\/span>&#8216;; antes deberemos tener seleccionada una regi\u00f3n y esto nos expandir\u00e1 las macros y mostrar\u00e1 el resultado en *Macro expansion* buffer.<\/p>\n<p style=\"padding-left: 30px; \"><strong>C-c C-u<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-up-conditional<\/span>&#8216;; se desplaza a la condici\u00f3n del preprocesador anterior.<\/p>\n<p style=\"padding-left: 30px; \">Es posible modificar la variable c-macro-processor para cambiar las opciones por defecto que es <strong>\/lib\/cpp -C<\/strong> (la opcion <strong>-C<\/strong> es para preservar los comentarios) o bien modificar el <strong>.emacs<\/strong> para realizar este cambio de forma permanente:<\/p>\n<p style=\"padding-left: 60px; \"><em>(setq c-macro-processor \u00ab\/usr\/local\/lib\/cpp -C\u00bb)<\/em><\/p>\n<ul style=\"padding-left: 30px; \">\n<li>C++ en Emacs<\/li>\n<\/ul>\n<p style=\"padding-left: 30px; \">Para programar en c++ debemos emplear c++-mode, el cual invocaremos mediante <strong>M-x c++-mode<\/strong>. Todos los keystrokes explicados previamente sirven para c++, ya que c++ incluye todo c y algo m\u00e1s. 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\u00e1s podemos a\u00f1adir esto a nuestro .emacs:<\/p>\n<p style=\"padding-left: 60px; \"><em>(add-hook &#8216;c++-mode-hook<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>\u00a0&#8216;(lambda()<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>\u00a0(c-set-style \u00abStroustrup\u00bb)<br \/>\n<\/em><\/p>\n<p style=\"padding-left: 60px; \"><em>\u00a0(c-toggle-auto-state))<\/em><\/p>\n<p style=\"padding-left: 30px; \"><strong>C-c :<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-scope-operator<\/span>&#8216;; inserta el scope operator para evitar problemas con el electric <strong>:<\/strong>.<\/p>\n<p style=\"padding-left: 30px; \"><strong>(sin keystroke asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-forward-subword<\/span>&#8216;; se desplaza hacia delante una subpalabra seg\u00fan la nomenclatura de estandares GNU.<\/p>\n<p style=\"padding-left: 30px; \"><strong>(sin keystroke asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">c-backward-subword<\/span>&#8216;; se desplaza hacia detr\u00e1s una subpalabra seg\u00fan la nomenclatura de estandares GNU.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00a0 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\u00e1sicos que pueden sernos de mucha utilidad: M-a : &#8216;c-beginning-of-statement&#8216;; se desplaza al inicio de la sentencia. M-e : &#8216;c-end-of-statement&#8216;; se desplaza al final de la sentencia. M-q : &#8216;c-fill-paragraph&#8216;; formatea [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[46,8],"class_list":["post-37","post","type-post","status-publish","format-standard","hentry","category-basic","tag-c-mode","tag-emacs"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/37"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=37"}],"version-history":[{"count":1,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/37\/revisions"}],"predecessor-version":[{"id":794,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/37\/revisions\/794"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=37"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=37"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=37"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}