Hanabi Factory

Navi's Personal Blog


Mi configuración personal en Emacs

emacs_meme

Tras unas semanas entendiendo como funciona Emacs, leyendo tutoriales, y descubriendo como otros usuarios usan este software para sus diversas necesidades, he llegado a tener una configuración que me hace sentir relativamente cómodo (obviamente siempre puedes buscar más comodidad al seguir configurandolo, pero todavía estoy aprendiendo).

Aquí desglosaré mi init.el para quién busque inspiración, o simplemente quiera copiar el archivo, el cual tiene alrededor de 250 lineas de código.

Generalidades de esta configuración

Si bien no me ataño a ninguna filosofía en particular más de que debe ser cómodo para mi trabajar dentro de Emacs, trato de que:

  • Solo contenga software que voy a usar: No es necesariamente minimalista, pero tampoco quiero instalar cosas que no necesite, sino, hubiera elegido algo como Doom Emacs.
  • Mantenerse lo más apegado a los shortcuts originales de Emacs, no he hecho grandes cambios ni agregado muchos nuevos bindings, no pretendo usar Evil mode, dado que todavía me considero un novato con Emacs, por lo que prefiero que se retrate de forma más precisa como Emacs funciona 1.

Dentro del init.el

Para partir lo más básico es lo estético, he decidido remover las barras de herramientas, la barra para scroll y menú, además de algunas configuraciones de fuente y tamaño.

(setq inhibit-startup-message t)

(scroll-bar-mode -1)        ; Disable visible scrollbar
(tool-bar-mode -1)          ; Disable the toolbar
(tooltip-mode -1)           ; Disable tooltips
(set-fringe-mode 10)        ; Give some breathing room

(menu-bar-mode -1)            ; Disable the menu bar

;; Set up the visible bell
(setq visible-bell t)

;; set font decoration
(setq font-lock-maximum-decoration t)

(set-face-attribute 'default nil :font "Iosevka" :height 160)

;; set time
(setq display-time-24hr-format t)
(setq display-time-format "%H:%M")
(display-time-mode 1)

;;set full screen
(set-frame-parameter (selected-frame) 'fullscreen 'maximized)
(add-to-list 'default-frame-alist '(fullscreen . maximized))

Lo siguiente es inicializar el administrador de paquetes y las fuentes donde se descargaran estos paquetes. Aquí tengo seteado melpa (librerías de la comunidad para la comunidad) y elpa (librerías de GNU y adicionales).

;; Initialize package sources
(require 'package)

(setq package-archives '(("melpa" . "https://melpa.org/packages/")
			( "nongnu" . "https://elpa.nongnu.org/nongnu/")	    
                       ("gnu" . "https://elpa.gnu.org/packages/")
			 ))

(package-initialize)
(unless package-archive-contents
 (package-refresh-contents))

;; Initialize use-package on non-Linux platforms
(unless (package-installed-p 'use-package)
   (package-install 'use-package))

(require 'use-package)
(setq use-package-always-ensure t)

Una vez seteado las conexiones a melpa y elpa, ya puedes empezar a descargar y usar librerías, soy un ferviente usuario del tema gruvbox, y me gusta usar números relativos para editar 2 aunque lo desabilito en algunos unos casos

(use-package doom-themes
     :if window-system
     :ensure t
     :config
     (load-theme 'doom-gruvbox t)
     (doom-themes-org-config)
     (doom-themes-visual-bell-config)
     (menu-bar-mode -1)
     (tool-bar-mode -1)
     (fringe-mode -1)
     (scroll-bar-mode -1))


;; set numbers in the left
(column-number-mode)
(global-display-line-numbers-mode t)
(setq display-line-numbers 'relative)


;; But disable the numbers in some modes
(dolist (mode '(org-mode-hook
               term-mode-hook
               shell-mode-hook
   	vterm-mode-hook
               treemacs-mode-hook
   	dashboard-mode-hook
               eshell-mode-hook))
 (add-hook mode (lambda () (display-line-numbers-mode 0))))

Aquí agrego un poco de “color” a Emacs al agregar cosas como Ivy para autocompletado, agregar iconos para dired (el administrador de archivos por defecto de Emacs), modificar la barra de estatus, si quieres más color a esta última puedes usar doom-modeline, pero a mi parecer la barra de estatus que viene por defecto es lo suficientemente bueno.

;; Set Autocompletion
(use-package ivy)
(ivy-mode 1)

(setq ivy-use-virtual-buffers t)
(setq ivy-count-format "(%d/%d) ")

;; basic icons
(use-package all-the-icons
 :ensure t
 :init)

(use-package all-the-icons-dired
 :ensure t
 :init (add-hook 'dired-mode-hook 'all-the-icons-dired-mode))

(use-package all-the-icons-ibuffer
 :ensure t
 :init (all-the-icons-ibuffer-mode 1))

;; set delimiters to distinct the language
(use-package rainbow-delimiters
 :hook (prog-mode . rainbow-delimiters-mode))

;; ui to display characters
(use-package which-key
 :defer 0
 :diminish which-key-mode
 :config
 (which-key-mode)
 (setq which-key-idle-delay 1))

;; ivy rich
(use-package ivy-rich)
(ivy-rich-mode 1)

Dos librerías fundamentales para incorporar en el workflow de Emacs y que pareciera ser un “must” en la comunidad es Projectile (para administración de proyectos) y Magit (para control de versiones), no los he usado extensivamente pero son buenas piezas de software.

;; Projectile
(use-package projectile
 :ensure t
 :init
 (projectile-mode 1))

;; magit
(use-package magit
 :ensure t
 :config
 (setq magit-push-always-verify nil)
 (setq git-commit-summary-max-length 50)
 :bind
 ("M-g" . magit-status))

La parte que más me interesaba entender de Emacs era Orgmode, así que setié una configuración que me ha funcionado bien, y que las posibilidades son infinitas al momento de customizarlo.

En esta sección me enfoqué en definir una carpeta llamada org, donde he alojado varios archivos para eventos, tareas, etc. y ahí puedo hacer capturas de notas, tareas solo presionando C-c c, también saqué la idea de System Crafters 3 de usar org-refill para poder ir archivando tareas una vez que las completo, también agregué un poco de estilo a los archivos .org (para más placer).

;; org mode
(global-set-key (kbd "C-c l") #'org-store-link)
(global-set-key (kbd "C-c a") #'org-agenda)
(global-set-key (kbd "C-c c") #'org-capture)

(setq org-ellipsis " ")
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
(setq org-confirm-babel-evaluate nil)
(setq org-export-with-smart-quotes t)
(setq org-src-window-setup 'current-window)
(setq org-directory "~/org")
(setq org-agenda-files '("events.org" "tasks.org" "birthday.org"))
(setq org-agenda-start-with-log-mode t) ;; set log for completion in agenda
(setq org-log-done 'time)
(setq org-log-into-drawer t)

;; After complete a task send to Archive or other file listed
(setq org-refile-targets
     '(("archive.org" :maxlevel . 1)
   ("tasks.org" :maxlevel . 1)))
;; after send the task completed, save all the org files
(advice-add 'org-refile :after 'org-save-all-org-buffers)

;; Set templates for fast note taking and other
(setq org-capture-templates
     '(("t" "Todo" entry (file+headline "~/org/tasks.org" "INBOX")
        "* TODO %?\n  %i\n  %a")
       ("j" "Journal" entry (file+datetree "~/org/journal.org")
        "* %?\nEntered on %U\n  %i\n  %a")))


(add-hook 'org-mode-hook 'org-indent-mode)


;; sintactic sugar for bullets
(require 'org-bullets)
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))

Uso de Dashboard a la hora de abrir Emacs para poder ver archivos, proyectos y tareas pendientes, además de una frase bíblica para más inspiración.

dashboard

;; Dashboard at open emacs
(use-package dashboard
 :ensure t
 :config
   (dashboard-setup-startup-hook)
   (setq dashboard-center-content t)
   (setq dashboard-startup-banner 'official)
   (setq dashboard-items '((recents  . 5)
   		    (projects . 5)
   		    (agenda    . 5)))
   (setq dashboard-banner-logo-title "Do you see a man skillful in his work? He will stand before kings; he will not stand before obscure men. (Proverbs 22:29)"))

Permitir procesos asincronos

;; allow async process
(use-package async
 :ensure t
 :init (dired-async-mode 1))

Syntax highlighting para markdown

;; Use markdown
(use-package markdown-mode
 :ensure t
 :mode ("README\\.md\\'" . gfm-mode)
 :init (setq markdown-command "multimarkdown"))

Para leer archivos pdf, Emacs tiene incorporado un ereader, con funcionalidades básicas, sé que existe una librería con mayor funcionalidades llamado pdf-tools, pero no he tenido la necesidad de usarlo 4, sin embargo, porque tengo varios epubs que leo, instalé nov.el para dicho propósito.

También he incorporado emms para escuchar música, hace el trabajo de base, pero todavía no me he tomado el tiempo de revisar a fondo como funciona.

Y finalmente agregué elfeed para leer rss de distintas noticias y blogs, definitivamente me ha gustado más que newsboat. Dado que tiendo a leer blogs de estadística y análisis de datos que por su naturaleza contienen muchas imagenes, no requiero de abrir el navegador para poder tener un detalle completo sobre este.

utilities

;; Nov.el to read Epub
(use-package nov
 :ensure t)
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))

;; To display music as a gigachad
(use-package emms)
(emms-all)
(setq emms-player-list '(emms-player-mpv)
     emms-info-functions '(emms-info-native))

;; To read RSS
;; Somewhere in your .emacs file
(use-package elfeed)
(setq elfeed-feeds
     '(
   ("https://planet.emacslife.com/atom.xml" Emacs Blog)
   ("https://news.ycombinator.com/rss" News)
   ))
;; set global keybinding for elfeed
(global-set-key (kbd "C-x w") 'elfeed)

Ahora para algunas de las partes más relacionadas a desarrollo y análisis de datos, he incorporado ess (Emacs speaks Statistic), librería fundamental para trabajar con R y otros software 5. Para Python he incorporado elpy que es una librería que viene con lo necesario para desarrollo en Python, también sé de la existencia de ein para Jupyter Notebooks, no lo he probado todavía, tal vez lo haga en algún futuro. Para Julia hay varias discusiones dando vueltas sobre como aprovechar Emacs 6, por ahora tengo solo seteado 2 librerías, julia-mode y julia-snail, el primero es solo syntax highlighting y el segundo permite interactuar con el REPL, de una forma similar a la que usarías Slime, haciendo evaluaciones linea por linea cuando sea requerido.

;; statistical mode in emacs
(use-package ess)
(use-package company
 :config
 (add-hook 'after-init-hook 'global-company-mode))

;; python development
(use-package elpy
 :ensure t
 :init
 (elpy-enable))

;; Julia mode
(use-package julia-mode
 :ensure t)

(use-package julia-snail
 :ensure t
 :hook (julia-mode . julia-snail-mode))
(setq-default julia-snail-executable "/home/navi/.juliaup/bin/julia")

Emacs por alguna extraña razón tiene incorporado 3 terminales, eshell, shell, term. Sé que existen usos específicos para cada uno aunque aunque no estoy del todo claro 7, especialmente por ese extraño patrón de que puedes borrar lineas de código escritas en la terminal, o porque tienes que cambiar tus bindings al momento de moverte de un buffer a otro (C-x a C-c), o no ser capaz de abrir vim dentro estas terminales 8, sin embargo, leí comentarios positivos con respecto a Vterm, y decidí instalarlo y probarlo, hasta ahora es el que se ha ajustado mejor a mis preferencias. Y por lo tanto, he usado por defecto 9

;;A new  terminal with more capabilities
(use-package vterm
  :ensure t)

Finalmente, una cosa que a menudo me encuentro haciendo es copiando y pegando lineas completas de texto, tomé esta función customizada de BugsWriter para poder alcanzar ese propósito.

;; custom function to copy whole line with C-c w l
 (defun copy-whole-line ()
   (interactive)
   (save-excursion
     (kill-new
      (buffer-substring
	(point-at-bol)
	(point-at-eol)))))
(global-set-key (kbd "C-c w l") 'copy-whole-line)

Notar algo que apoyo completamente y doy como consejo es reemplazar el Ctrl por la tecla CapsLock, realmente resolverá un montón de dolores que tienes con Emacs y su extraña posición con las teclas lideres. Así que por favor antes que te lances a usar emacs por primera vez, te recomiendo hacer este cambio.

Trabajos y exploraciones futuras

Algunas cosas que quiero seguir explorando y probablemente incorporando en Emacs en caso de que se ajusten bien:

  1. Operar email dentro de Emacs
  2. Org Roam, bastantes cosas positivas he escuchado sobre este software para tomar notas que parece inspirarse en el Zettelkasten method. También Denote es una opción.
  3. Eglot o cualquier servidor del lenguaje que funcione.
  4. Org Babel, para literate programming.
  5. Integraciones con Quarto.
  6. EXWM, un windows manager dentro de Emacs, parece innecesario en mi caso de estar usando Sway, pero ¿Por qué no probarlo?.
  7. Aprender Elisp, hasta ahora he usado principalmente librerías que la comunidad o GNU han creado, pero el verdadero valor está en que puedas aprender Elisp y hackear por tu cuenta.
  8. Incorporar algún LLM 10.

Conclusiones

Dentro de todo, Emacs ha probado ser un interesante reemplazo al flujo de trabajo que estaba usando con Vim + Tmux + amigos, muchas de las cosas que me tomaron tiempo aprender a usar con este workflow, en Emacs fue resuelto casi en un par de semanas, por supuesto, hay un sesgo acá de aprendizaje de herramientas previas que sin dichas experiencias hubiera probablemente ralentizado mi aprendizaje de Emacs.

Otra cosa que cabe notar, es que si vienes con una mente abierta, Emacs puede ser realmente divertido de usar, Elisp realmente es un buen lenguaje para este software y la mística de “hackear” tu editor es algo que de verdad puede llevarte a inspirar hacer cosas por tu cuenta y darte absoluta libertad, convertir un editor en tu workshop digital tiene sus dificultades, pero estoy seguro de que vale la pena si te atreves a ensuciarte las manos.


  1. https://www.masteringemacs.org/article/beginners-guide-to-emacs ↩︎

  2. Practica que vengo usando desde vim ↩︎

  3. Buen canal para aprender sobre Emacs, Guix, Lisp, entre otros. https://systemcrafters.net/ ↩︎

  4. Tampoco soy mucho de andar destacando y tomando notas en el pdf, creo que es mejor tomar notas por separado. ↩︎

  5. Pero parecieran no estar tan depurados como R ↩︎

  6. https://discourse.julialang.org/t/emacs-and-julia-how-to/123623 ↩︎

  7. Aquí hay un artículo que lo explica sencillamente http://xahlee.info/emacs/emacs/emacs_shell_vs_term_vs_ansi-term_vs_eshell.html ↩︎

  8. Si, a veces quiero hacer algo como eso. ↩︎

  9. Aunque surfeando por la web, me encontré con este artículo que me hace replantear la idea de profundizar con Eshell: https://howardism.org/Technical/Emacs/eshell-why.html ↩︎

  10. Preferiblemente si es que puedo correrlo localmente. ↩︎

Articles from blogs I follow around the net

Emacs Redux: Emacs and XDG sitting on a tree

Where to place my Emacs configuration? That is the question! This fairly simple question has surprisingly many answers, as it often happens with projects as old as Emacs: Historically Emacs’s user config was a file called .emacs, placed in your home direct…

via Planet Emacslife January 12, 2025

Neurodivergence and accountability in free software

In November of last year, I wrote Richard Stallman’s political discourse on sex, which argues that Richard Stallman, the founder of and present-day voting member of the board of directors of the Free Software Foundation (FSF), endorses and advocates for a ha…

via Drew DeVault's blog September 25, 2024

Bayesian Modeling for Psychologists, Part 2

Setup Loading some packages for demonstrations and analysis: library(tidyverse) # Data wrangling and plotting library(ggdist) # Easy and aesthetic plotting of distributions library(ggExtra) # Adding marginal distributions for 2d plots libr…

via Tomer's stats blog April 27, 2024

Generated by openring