#+title: Instalar Emacs como servicio #+AUTHOR: Álvaro González Sotillo #+EMAIL: alvarogonzalezsotillo@gmail.com #+DATE: 2020-01-17 #+URI: /blog/instalar-emacs-como-servicio #+TAGS: emacs, orgmode #+DESCRIPTION: El tiempo de arranque de Emacs se puede disimular al inicio del sistema, y ser manejado como un servicio al que conectarse. Los usarios de *emacs* tenemos un complejo de inferioridad respecto del tiempo de arranque de la aplicación. Se han hecho muchos intentos para mejorarlo, como el [[https://dancol.org/pdumperpres.pdf][portable dumper]] o [[https://www.emacswiki.org/emacs/ProfileDotEmacs][profile-dot-emacs]], pero es innegable que *vi* y *vscode* arrancan más rápido. Al final, la mejor solución no es reducir el tiempo de arranque, sino /camuflarlo/. La mayoría de usuarios de *emacs* no abren una instancia cada vez que lo necesitan, sino que *emacs* está corriendo permanentemente y se abren nuevas /frames/ o /windows/. La forma de trabajo sería la siguiente - Abrir una instancia de *emacs* y arrancar el [[http://wikemacs.org/wiki/Emacs_server][servidor]]. - Cuando se necesite abrir un fichero, no se ejecuta una nueva instancia de *emacs*, sino que se utiliza *[[https://www.emacswiki.org/emacs/EmacsClient][emacsclient]]*. Este se conecta a la instancia inicial. El /hack/ final es hacer que la instancia de *emacs* se arranque automáticamente al iniciar sesión, o mejor aún, cuando se inicia el sistema como un servicio. Utilizo [[https://raw.githubusercontent.com/alvarogonzalezsotillo/alvarogonzalezsotillo.github.io/source/blog/instalar-emacs-como-servicio/instalar-emacs-como-servicio.org][este mismo fichero]] *org* para publicar esta entrada y para configurar mis ordenadores *GNU Linux*, con [[https://caiorss.github.io/Emacs-Elisp-Programming/Org-mode-recipes.html][literate]] [[http://cachestocaches.com/2018/6/org-literate-programming/][programming]]. Para activar la ejecución de bloques =shell= necesito ejecutar el siguiente bloque =elisp=: #+begin_src emacs-lisp (org-babel-do-load-languages 'org-babel-load-languages '( (shell . t))) #+end_src #+RESULTS: * Servicio Basado en [[https://www.emacswiki.org/emacs/EmacsAsDaemon]], utilizo la versión de *centos*, ya que funciona en *centos* y *ubuntu*. La diferencia está en el directorio que uso para dejar la *unit*: - En centos es =/usr/lib/systemd/system/emacs@.service= - Ubuntu es =/lib/systemd/system/emacs@.service= Este bloque de código se ejecuta en el directorio =/sudo::=, lo que indica a *emacs* que debe ejecutarlo con =sudo= utilizando [[https://www.gnu.org/software/tramp/tramp-emacs.html][TRAMP]]. #+BEGIN_SRC shell :dir "/sudo::" :cache no SERVICEFILE=/lib/systemd/system/emacs@.service EMACSDIR=/usr/local/bin sudo tee > $SERVICEFILE < ~/.local/share/applications/emacsclient.desktop < ~/.local/share/applications/emacsclient.svg < image/svg+xml EOF #+end_src #+RESULTS: * Problemas - *emacsclient* no encuentra el socket: añadir el parámetro =-s= con =/tmp/emacs1000/server=. El número =1000= indica el identificador del usuario. También puede especificarse la variable =server-socket-dir= al iniciar el servidor.