Ene 18
Servidor de emacs: emacsclient y emacsserver
Algunos usuarios se quejan de la tardanza que tiene emacs al cargar comparado con otros. Sobre todo debido a la gran carga a medida que este se va configurando modificando funcionalidades en nuestro .emacs. Para ello existe una solucion; usar emacsclient, que nos permitira evitar toda esta carga cada vez que lancemos emacs. Para ello no hay que hacer realmente nada, ya que esta feature viene en el paquete emacs base y tampoco requiere de ninguna configuracion especial. Aunque aqui incluiremos algunas lineas que nos facilitaran las tareas.
Recomiendo poner en nuestro .bashrc las siguientes lineas:
Estos cambios tendran efecto o bien si nos logueamos en otra consola, o bien si nos deslogueamos y logueamos en la misma o bien si lanzamos el comando source ~/.bashrc :
export EDITOR=»emacsclient -c»
export VISUAL=»emacsclient -c»
export ALTERNATIVE_EDITOR=»emacs»
alias e=»emacsclient -c»
alias es=»emacs –daemon»
alias ec=»emacsclient -c»
Nota para aquellos que no quieran usar estos alias: si no quisieramos poner estas lineas y seguir con la configuracion de toda la vida: debemos lanzar emacs –daemon la primera vez y luego ir lanzando emacsclient -c cada vez para cada hilo de ese daemon o bien emacs para un proceso nuevo cada vez.
Nota para los que si habeis decidido modificar vuestro .bashrc: De esta forma podemos lanzar el comando «es» desde cualquier terminal o consola la primera vez, y luego lanzar emacs (si queremos un proceso cada vez) o simplemente teclear e (si queremos un hilo cada vez). Veremos que se queda emacs como daemon o proceso residente en memoria, de esa forma cada vez que lanzamos emacs, se estara lanzando un hilo de este proceso en lugar de un proceso cada vez, ademas esto permitira intercomunicar los distintos hilos, sin importar si lo lanzamos en una consola y ahora nos encontramos en las XWindow y lo abrimos con GTK o desde un terminal, podremos tener acceso a los distintos buffers, con toda la informacion. etc. (Aqui el comando fbgrab lo empleo para capturas de pantalla en consola, pero carece de interes para el fin de este articulo, el comando verdaderamente importante es el primero que lanzo: emacs –daemon):
Emacs como daemon
Es importante tener en cuenta, que cuando salgamos de emacs (emacsclients) realmente es como si estuviesemos cerrando frames, ya que emacsserver seguira corriendo con aquella informacion modificada, asi que debemos cercionarnos de no apagar o reiniciar (aunque no veamos un emacs (en este caso emacsclient) mostrado, ya que podemos cerrar todos los emacsclients sin haber guardado ningun fichero o las ultimas modificaciones, ya que esto se queda residente en memoria aunque no tenga ninguna representacion).
Ahora ya tenemos nuestro querido emacs, que carga en 0 segundos. El «real» es el tiempo que he tardado desde que pulse intro del comando «time emacsclient -c» hasta que presione «C-x c» para cerrar emacs (es decir el tiempo que tarde en abrir y cerrar emacs), pero el tiempo de carga real como podemos ver ni siquiera llega a 1 milesima de segundo (el comando fbi es el que uso para previsualizar capturas en consola que carece de importancia en este articulo, el comando time precediendo a cualquier comando es el que nos da los tiempos):
Emacs cargado en menos de 1 milesima de segundo
Por ultimo hacer mencion especial a la primera captura de pantalla, si os fijais bien, tengo algunas features externas al paquete emacs, por lo que nuestro $HOME se va llenando de estas, aqui entra la esencia de reorganizar y reordenar estas features para no mezclarlas con otros ficheros y que nuestro directorio de usuario se convierta en algo caotico. Lo ideal, es emplear un directorio para ello por ejemplo ‘emacs‘ o ‘elisp‘ (ya que emacs se suele emplear cuando se descarga emacs desde el cvs/svn/git) donde dentro esten estas features o bien ‘.emacs.d/elisp‘. Todo esto es opcional, pero son buenas practicas que hara que todo nuestro sistema de ficheros tenga mayor coherencia a la hora de buscar ficheros; en mi caso, segun el ordenador que utilice, lo tengo mas o menos desordenado ;-).
enero 20th, 2011 at 10:48 pm
Dejo una funcioncilla que puede serle útil a alguien. Básicamente la idea es que tienes un emacs en modo demonio corriendo en local, y un emacs en modo demonio corriendo en las máquinas que suelas utilizar remotamente (por SSH). Normalmente trabajas en el terminal, y vas editando ficheros. La idea es que un mismo alias para emacsclient sirva tanto para editar ficheros remotos como para editar ficheros locales. wmctrl es un programa que cambia al escritorio donde esté arrancado emacs y pone el foco en el. Aquí va:
function em()
{
if [[ -f /usr/bin/wmctrl ]] ; then
emacsclient -n -a » $@ && wmctrl -a emacs@fcomputer
else
emacsclient –tty -a » $@;
fi
}
enero 20th, 2011 at 10:54 pm
Hola Kovan,
Parece muy util la funcion, lo cierto es que yo uso TRAMP (‘Transparent Remote (file) Access, Multiple Protocol’) para editar ficheros remotos, tambien juego mucho con el emacs DISPLAY con servidores X remotos que tambien puede ser de utilidad para alguien. A ver si escribo un articulo sobre todo ello.
Un saludo y gracias por tu aporte!
enero 26th, 2011 at 9:33 am
Antes que nada excelente blog :-)
Me encantaría ver un artículo sobre DISPLAY, tramp, screen y claro emacs :-)
enero 26th, 2011 at 11:44 am
Hola Adolfo, muchas gracias por tus palabras, lo cierto es que con tanto movimiento de pais en este ultimo ano, los articulos van llegando a veces de golpe y a veces con pasa un lapso de tiempo largo hasta que escribo uno nuevo. Asi que pido disculpas de antemano por ello.
Tendre en cuenta y lo pondre en mi lista de TODO ese articulo de DISPLAY, tramp, screen en combinandolo con emacs.
Por otra parte, tengo pendiente repasar todos y cada uno de los articulos anteriormente escritos, aunque esto me llevara bastante tiempo, asi que tampoco se cuando podre hacerlo.
Un saludo y gracias por leer este blog, cualquier sugerencia o critica constructiva es bienvenida!