Etiqueta: gnu

  • Este post está escrito utilizando org2blog, un paquete para GNU Emacs que permite enviar buffers en formato Org a un sitio web de WordPress usando la API.

    Estoy probando GNU Emacs estos días otra vez. Ya lo probé hace un par de meses pero acabé dejándolo de usar. Realmente me sigue dando cierta curiosidad sana ver cómo son las cosas en Emacs.

    A pesar de que con los años en Vim se han incluido funciones como terminales en línea, y de que existen plugins para trabajar con Git desde hace bastante tiempo, en la práctica suelo encontrar tanta fricción que al final mi forma de trabajar suele ser tmux + vim dentro de un pane, para poder abrir panes auxiliares cuando necesito escribir comandos.

    Me da cierta curiosidad como en Emacs las cosas se integran de forma tan natural y cómo el sistema reacciona mejor a cosas como intentar leer el e-mail o documentos web desde dentro del editor de textos, y eso es lo que me ha llevado a volver a intentar probarlo, con un poco más de calma.

    Esta es la lista de cosas que me atraen de GNU Emacs:

    • Org-mode, aunque tengo que aprender a usar las funciones de lista de tareas, calendario, agenda, pomodoro… O sea, todo lo que no es escribir.
    • Org-babel, que permite hacer programación literaria. Por ejemplo, el archivo de configuración de mis dotfiles de Emacs es un archivo .org con bloques de código metidos entre prosa. Con un comando es posible extraer esos bloques de código y evaluarlos por separado.
    • Por alguna razón, los plugins para desarrollo de Ruby on Rails funcionan con menos fricciones que sus equivalentes para Vim.
    • Por alguna razón también, esta gente ha solucionado de una forma limpia el problema de los language servers, a diferencia del espectáculo que encuentro en Vim.
    • Repositorios de paquetes, que se integran en la aplicación (MELPA).
    • nyan-mode.

    Esta es la lista de cosas que me generan cierta incomodidad en GNU Emacs:

    • No es un editor modal.
    • Atajos crear una línea en blanco encima o debajo de la que estás, un poco complicado de simular pero lo conseguí.
    • Invitación a padecer túnel carpiano.

    Esta es una lista de cosas que me gustaría aprender a partir de aquí:

    • Elisp.
    • Leer e-mail.
    • Leer feeds RSS.
    • Lo de la org-agenda.
  • Al hilo del programa que escribí hace poco para visualizar el fractal de Mandelbrot, puede resultar interesante a simple vista que haya escogido Racket como lenguaje de programación. Fundamentalmente lo elegí porque quería hacer programación visual, y en Racket esto resulta fácil de hacer desde su GUI de forma interactiva. Se puede hacer un (require racket/draw), y ya se pueden usar funciones para dibujar sobre mapas de bits que hasta se pueden visualizar dentro del propio DrRacket. Tengo un curso de Racket en mi canal de YouTube, pero está a medias.

    Racket es una implementación de Scheme, pero existen muchas otras. GNU Emacs es conocido por tener una implementación de Scheme (Emacs Lisp), con la que se pueden hacer hasta plugins; como una alternativa al Vimscript. También se puede activar el modo scratch y programar en Emacs Lisp desde dentro de Emacs, para darle más lore al meme de que GNU Emacs es un propio sistema operativo dentro de otro.

    Sin embargo, GNU tiene otra implementación alternativa de Scheme llamada GNU Guile, que también tiene características interesantes. Guile es como Lua. Se puede incrustar soporte para Guile en otro programa y utilizarlo como una herramienta para fabricar plugins o extensiones. Se puede pedir a código C que interactúe con Guile.

    Además, también Guile tiene un modo independiente para usarlo como una herramienta de línea de comandos más, e incluso para interpretar programas escritos en archivos de código fuente. Lo normal es que tengan la extension .scm (aunque, como siempre, en un entorno GNU esto suele dar igual), y que se invoque GNU Guile en este caso con guile -s codigo.scm.

    ~ $ guile
    GNU Guile 2.2.4
    Copyright (C) 1995-2017 Free Software Foundation, Inc.
    
    Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
    This program is free software, and you are welcome to redistribute it
    under certain conditions; type `,show c' for details.
    
    Enter `,help' for help.
    scheme@(guile-user)> (+ 2 2)
    $1 = 4
    scheme@(guile-user)>

    Existen algunas cosas que me gustan de GNU Guile viniendo de Racket. La mayoría de palabras clave funcionan igual. En GNU Guile existe la primitiva define y la primitiva let. No tienen nombres especiales o diferentes. También existen algunas carencias en GNU Guile, pero son fáciles de subsanar. Por ejemplo, muchas de las funciones para trabajar con listas (foldl o reduce) están declaradas en la librería SRFI-1, por lo que tienen que ser importadas antes de poder usarse con un (use-modules (srfi srfi-1)).

    ~ $ guile
    GNU Guile 2.2.4
    Copyright (C) 1995-2017 Free Software Foundation, Inc.
    
    Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
    This program is free software, and you are welcome to redistribute it
    under certain conditions; type `,show c' for details.
    
    Enter `,help' for help.
    scheme@(guile-user)> (use-modules (srfi srfi-1))
    scheme@(guile-user)> (reduce (lambda (x a) (+ x a)) 0 '(1 2 3 4 5))
    $1 = 15