Nov 30 2009

Stumpwm

Tag: basicoverdrive @ 9:56 pm

Stumpwm es un window manager minimalista, probablemente el mas minimalista de todos debido a que intenta ser lo mas configurable posible (incluyendo en tiempo real) manteniendo una apariencia visual minima. En Stumpwm no existen decoraciones de ventanas, tampoco iconos ni botones, y ningun fondo por defecto o degradado, simplemente la misma percepcion que se tiene de las X lanzadas ‘a pelo’. Simplemente se configura de forma personal mediante hooks y modificando algunos valores de variables.

Por cierto Stumpwm esta intimamente relacionado con emacs; primero porque esta integramente escrito en lisp y es configurable en tiempo real, evaluando las expresiones de algo que esta ejecutandose en dicho momento y modificando por tanto su codigo y datos. Y segunda porque tiene ciertos keybindings asociados directamente y por defecto a nuestro entorno favorito, emacs.

Stumpwm se puede interpretar de dos formas, o bien haciendo uso de clisp (Common Lisp) o sbcl (Steal Bank Common Lisp, dialecto de Lisp y variante de CL). Por defecto si usamos el apt de debian empleara clisp, aunque yo recomiendo encarecidamente usar sbcl, requerido por ejemplo para el uso de xinerama con pantalla extendida para doble monitor, como es mi caso (recordad que el uso de 2 pantallas aumenta la productividad de manera significativa, asi que esto es importante).

Si habeis tenido el error de meter clisp mediante apt-get y ahora quereis meter sbcl, debemos limpiar ciertos directorios que apt-get install –remove –purge no habra realizado. Como por ejemplo eliminar el contenido del directorio /var/cache/common-lisp-controller/.

# rm -Rf /var/cache/common-lisp-controler/*

Ademas desde hace un par de semanas hasta ahora, existe un conflicto (no confundir con bug) desde que estan siendo retirados algunos scripts lisp en debian, y deberemos substituir el script asdf que se encuentre en el source de stumpwm (en caso de que instalemos stumpwm desde git). Asi que primero nos disponemos a bajar la ultima version de stumpwm en desarrollo:

$ git clone git://git.savannah.nongnu.org/stumpwm.git

Una vez hecho esto entramos en el directorio creado que por defecto es stumpwm:

$ cd stumpwm

Este es un paso adicional requerido solo en caso de que persista el conflicto de asdf.el que trae stumpwm (eso solo se puede saber intentando instalar el asdf original que trae stumpwm mediante sbcl, en caso de dar error de compilacion en los pasos siguientes), en ese caso substituimos el script asdf.el que incluye nuestro paquete stumpwm por el asdf de la version de desarrollo, para ello primero renombramos el original:

$ mv asdf.el asdf.el.old

Y luego realizamos descarga de asdf (Another System Definition Format) en su version en desarrollo:

$ git clone http://common-lisp.net/project/asdf/asdf.git

Una vez hecho esto necesitamos instalar asdf, asi como otros scripts en nuestro sistema sbcl, para ello primero entramos en sbcl (Hacedlo desde el directorio stumpwm para no tener que jugar con rutas):
$ sbcl
Y luego realizamos la instalacion de asdf, clx y cl-ppcre (requeridos por stumpwm), notese que los «son parte del prompt de sbcl:
: (require :asdf)
: (require :asdf-install)
: (asdf-install:install :clx)
: (asdf-install:install :cl-ppcre)

Ahora ya podemos lanzar el configure para compilar

stumpwm usando sbcl:

$ ./configure –with-lisp=sbcl

Y Luego obviamente compilamos stumpwm (para ello se usara el compilador sbcl especificado anteriormente):

$ make

Para finalmente instalarlo en nuestro sistema:

$ make install

En caso de haber tenido exito, ya podemos modificar nuestro .xinitrc y anadir una linea tal que asi:

$ exec stumpwm &

Si todo ha ido bien, ya podremos disfrutar de nuestro flamante stumpwm, del cual explicare los keystrokes fundamentales para poder moverse con un minimo de soltura (todos ellos vendran precedidos por el prefijo C-t):

C-t ! Evalua una expresion
C-t e Lanza emacs
C-t ? Lanza la Ayuda
C-t : Muestra el prompt de Stumpwm
C-t ; Muestra el prompt de CL
C-t : quit Llama a la funcion quit de stumpwm
C-t ; (ext:quit) Evalua la funcion quit de clisp (dependiendo de como se haya compilado puede funcionar o no existir)
C-t ; (sb-ext:quit) Evalua la funcion quit de sbcl (dependiendo de como se haya compilado puede funcionar o no existir)
C-t TAB Mueve el foco al siguiente frame
C-t r <arriba/abajo/izq/der> Redimensiona un frame acortado por arriba/abajo/izq/der (requiere al menos 2 frames)

C-t <arriba/abajo/izq/der> Mueve el foco arriba/abajo/izq/der.
C-t t Iguala dimensiones de los frames
C-t Desplaza el foco a un n-frame determinado
C-t q Libera frames muertos
C-t C-t Cambia a otro frame (switch)
C-t M-<arriba/abajo/izq/der> Desplaza el frame a arriba/abajo/izq/der

C-t s Divide la aplicacion de forma horizontal
C-t S Divide la aplicacion de forma vertical
C-t Q Hace que la aplicacion ocupe toda la pantalla (C-t r de resize solo permitira hasta cierto margen debido a que cada vez que se ejecuto C-t s o C-t S se creo un nuevo frame por eso es necesario usar C-t Q).

Recordad que en emacs y elisp, un frame es lo que a lo en la actualidad nos referimos a ventana, y un a ventana es lo que en la actualidad nos referimos a frame, debido a razones historicas.

Para un listado completo de todos los keybindings asi como el resto de componentes y como se manejan en stumpwm buscad en el manual oficial de stumpwm.

Si quereis meter un fondo de pantalla al iniciar stump, podeis crear el fichero .stumpwmrc con el contenido:

(set-bg-color «black»)

O bien:

(run-shell-command «xsetbg ~/fondos/fichero.png»)

Con Xinerama activado para los dos monitores, en mi caso este es el resultado:

stumpwm al iniciar (captura reducida, haced click para ampliar a 3360×1050)

Free Image Hosting at www.ImageShack.us

stumpwm mostrando la ayuda (captura reducida, haced click para ampliar a 3360×1050)

Free Image Hosting at www.ImageShack.us

Tambien si quereis experimentar eso que decia de ‘programar y evaluar vuestro codigo en tiempo real’ sin miedo de perder las X y por tanto vuestro trabajo, con dos monitores es posible, es decir en el primero lanzariais stumpwm y alli abririais vuestro emacs. Independientemente lanzais Xnest y un nuevo servidor en :1 que muestre en una pantalla del servidor en :0, desde emacs lanzais stumpwm y lo conectais a :1, asi tendriais en una pantalla emacs y en la otra el windowmanager. Ahora aqui en emacs podeis ir modificando y evaluando codigo de stumpwm y viendo en tiempo real dichos cambios.

Por acabar una demo de stumpwm (aunque algo antigua [2007] pero de las pocas que he encontrado):

Troubleshooting

Solucion de algunos problemas que me han surgido con stumpwm:

En latex-mode y AucTeX combinandolo con stumpwm surge un conflicto entre keybindings, ya que C-t C-t en stumpwm hace toggle entre frames mientras que C-c C-t C-p en latex-mode con AucTeX sirve para invocar pdfLatex para especificar si la salida sera dvi o pdf. La forma de solucionarlo es empleando el comando de stumpwm C-t t, el cual generara un C-t que nos servira para poder usar el comando C-c C-t C-p en cualquier otro WM, pero que en este se realizara mediante C-c C-t t C-p.


Nov 30 2009

Color-theme

Tag: basicoverdrive @ 5:20 pm

Color-theme es un script en elisp que permite la carga de temas para emacs. Color-theme.el carga el fichero color-theme-6.6.0/themes/color-theme-library.el, que es el fichero que contiene los temas que no son mas que pedazos de codigo a modo de funcion unidos en un mismo fichero e interpretados por color-theme.el.

Por lo tanto tendremos que cargar el script color-theme.el y especificar que tema queremos cargar en nuestro .emacs, y del resto ya lo hara nuestro color-theme.el.

Tambien podemos editar el fichero color-theme-library.el y modificar un tema a nuestro gusto, que siempre es una tarea menos compleja que comenzar uno de cero. En cualquier caso pasemos a explicar como instalar y configurar color-theme. Primero debemos descargarlo en la web oficial:

http://www.nongnu.org/color-theme/

Desde dicha web recomiendo usar la version tarball, ya que asi tenemos un control total de donde y como se instalan las cosas, donde descomprimimos, etc:

http://mirrors.aixtools.net/sv/color-theme/

Luego solo debemos descomprimirlo (por ejemplo en nuestro $HOME) mediante:

$ tar xvfz color-theme-6.6.0.tar.gz (o la version que sea)

Una vez hecho esto, no debemos compilar ni instalar (entendiendo por instalar un make install que simplemente copia ciertos ficheros generalmente binarios en directorios del sistema en lugar de directorios locales al usuario).

Una vez hecho esto tan solo debemos anadir a nuestro .emacs las siguientes lineas:

(add-to-list ‘load-path «~/color-theme-6.6.0»)
(require ‘color-theme)
(color-theme-initialize)

Y anadir esta otra para cargar un theme emacs (por ejemplo uno de mis favoritos):

(color-theme-goldenrod)

Para ver la lista de themes podemos e ir probando uno a uno podemos hacer M-x color-theme- y presionamos la tecla TAB, podremos ver un listado de los mismos, sin embargo la carga y recarga de uno y otro tema conlleva la ventaja de que es mas rapido ir probando nuevos temas, pero la desventaja que si un nuevo tema no cambia alguna propiedad de emacs, se quedara con la propiedad antigua, lo que no nos permitira ver totalmente o deformara el tema original.

Aqui dejo para quien quiera descargar mi color-theme basado en goldenrod (tan solo se deben copiar las siguientes lineas en el color-theme-library.el y anadir (color-theme-overdrive) en nuestro .emacs):

(defun color-theme-overdrive ()
«Brown color theme.  Very different from the others.
Supports standard, font-lock and info faces, and it uses
`color-theme-blue-gnus’, `color-theme-blue-erc’ , and
`color-theme-beige-diff’.»
(interactive)
(color-theme-blue-gnus)
(let ((color-theme-is-cumulative t))
(color-theme-blue-erc)
(color-theme-beige-diff)
(color-theme-beige-eshell)
(color-theme-install
‘(color-theme-goldenrod
((background-color . «black»)
(background-mode . dark)
(border-color . «black»)
(cursor-color . «light goldenrod»)
(foreground-color . «goldenrod»)
(mouse-color . «goldenrod»))
((goto-address-mail-face . info-xref)
(list-matching-lines-face . bold)
(view-highlight-face . highlight))
(default ((t (nil))))
(bold ((t (:bold t))))
(bold-italic ((t (:italic t :bold t :foreground «lavender»))))
(font-lock-builtin-face ((t (:foreground «pale goldenrod»))))
(font-lock-comment-face ((t (:foreground «indian red»))))
(font-lock-constant-face ((t (:foreground «pale green»))))
(font-lock-function-name-face ((t (:bold t :foreground «lemon chiffon»))))
(font-lock-keyword-face ((t (:foreground «wheat»))))
(font-lock-string-face ((t (:foreground «gold»))))
(font-lock-type-face ((t (:foreground «dark khaki» :bold t))))
(font-lock-variable-name-face ((t (:bold t :foreground «khaki»))))
(font-lock-warning-face ((t (:bold t :foreground «orange red»))))
(fringe ((t (:background «gray25»))))
(header-line ((t (:background «aliceblue» :foreground «black»))))

(highlight ((t (:background «dark slate blue»))))
(info-menu-5 ((t (:underline t))))
(info-node ((t (:bold t))))
(info-xref ((t (:bold t :foreground «pale goldenrod»))))
(isearch ((t (:background «SeaGreen4» :foreground «black»))))
(isearch-lazy-highlight-face ((t (:background «cyan» :foreground «black»))))
(italic ((t (:italic t :foreground «lavender»))))
(menu ((t (:background «gray25» :foreground «lemon chiffon»))))
(modeline ((t (:background «gray40» :foreground «lemon chiffon» :box (:line-width 1 :style released-button)))))
(modeline-buffer-id ((t (:background «AntiqueWhite4» :foreground «blue»))))
(modeline-mousable ((t (:background «AntiqueWhite4» :foreground «lemon chiffon»))))
(modeline-mousable-minor-mode ((t (:background «wheat» :foreground «lemon chiffon»))))
(mode-line-inactive ((t (:background «gray20» :foreground «lemon chiffon» :box (:line-width 1 :style released-button)))))
(region ((t (:background «red» :foreground «black»))))
(secondary-selection ((t (:background «dark green»))))
(tool-bar ((t (:background «gray25» :foreground «lemon chiffon» :box (:line-width 1 :style released-button)))))
(left-margin ((t (:background «darkblue» :foreground «yellow»))))
(underline ((t (:underline t))))))))

Algunas capturas de pantalla de mi theme:

Tema con codigo fuente buscando cadena con C-s y resaltando las ocurrencias

Tema con codigo empleando resaltado para regiones

Tema resaltando directorios y ficheros en eshell


Nov 30 2009

Yasnippet

Tag: basicoverdrive @ 3:16 pm

Yasnippet es un sistema de plantillas (templates) para emacs. Dicho sistema permite escribir con abreviaturas y que éstas se expandan automáticamente en plantillas para las funciones. Los lenguajes soportados de momento son c, c++, c#, perl, python, ruby, SQL, LaTeX, HTML, CSS, etc… aunque siempre puedes importar tus propios templates.

Para descargar yasnippet se puede realizar en su página oficial y la documentación es accesible desde aquí. Para instalar yanippet tan sólo se debe descargar, desempaquetar el .tgz y mover el fichero llamado yasnippet-bundle.el en ~/.emacs.d/plugins (o bien en cualquier directorio desde donde queramos cargarlo, siempre indicándolo en nuestro .emacs claro):

(add-to-list ‘load-path «~/.emacs.d/plugins»)
(require ‘yasnippet-bundle)
(yas/initialize)
(yas/load-directory «~/.emacs.d/plugins/yasnippet-version/snippets»)

Por si a alguien no le ha quedado aún claro, podéis ver una demo de como realizar la instalación:

Una vez hecho esto, lanzamos nuestro flamante emacs y probamos a escribir palabras reservadas como #include o bien cualquier función de la libc o cualquier parte de la demostración del video observada más arriba. Para comenzar a usarlo, tan sólo debemos usar la tecla TAB (tabulador).

Aunque yasnippet, como lo es emacs, es muy extensible, configurable  y organizable. Veamos como se puede usar toda la potencia de yasnippet.

Para la carga de snippets (ver la web oficial de yasnippet la sección «Snippet Organization»):

Podemos crear un directorio especialmente para nuestros propios snippets, en nuestro .emacs:

;; Keep personal snippets under ~/.emacs.d/mysnippets
(setq yas/root-directory «~/.emacs.d/mysnippets»)

;; Load the snippets
(yas/load-directory yas/root-directory)

Podemos conseguir un efecto árbol según los snippets que tengamos usando yas-parents, yas-make-groups, etc… (leer la documentacion oficial para mas informacion), aqui dejo los enlaces de dicha documentacion:

Organizacion de snippets

http://yasnippet.googlecode.com/svn/trunk/doc/snippet-organization.html

Expansión de triggers

http://yasnippet.googlecode.com/svn/trunk/doc/snippet-expansion.html

Desarrollo de snippets

http://yasnippet.googlecode.com/svn/trunk/doc/snippet-development.html


Página siguiente »