Org-Mode: Mi fichero de configuración

23 minutos de lectura

Después de todos estos artículos sobre org-mode creo que ya es hora de presentarte mi archivo de configuración, ya te enseñe mi flujo de trabajo, mas o menos he comentado todas las entradas, incluida las gracias a Terencio Agozzino (remenberyou) de quien base está configuración.

Inicialización de Emacs

Fuentes de Paquetes

Para instalar paquetes, es útil configurar las fuentes de paquetes.

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

use-package

Para poder gestionar la configuración con use-package es necesario primero instalarlo, si no lo has hecho ya.

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(use-package delight :ensure t)
(use-package use-package-ensure-system-package :ensure t)

Puesta en Marcha

Autenticación

Pongo mi archivo authinfo.gpg en Syncthing para poder usar fácilmente mi configuración en otros dispositivos.

(setq auth-sources '("~/.gnupg/shared/authinfo.gpg"))

Mejores valores por defecto

Para una mejor experiencia de usuario con Emacs GNU, aquí están los valores predeterminados que uso.

(setq
 ad-redefinition-action 'accept                    ; Silenciar warnings para la redefinición.
 cursor-in-non-selected-windows t                  ; Ocultar el cursor en ventanas inactivas.
 display-time-default-load-average nil             ; No mostrar el promedio de carga
 fill-column 80                                    ; Establecer ancho para el salto de línea automático
 help-window-select t                              ; Enfocar nueva ventana de ayuda cuando se abre
 inhibit-startup-screen t                          ; Desactivar la pantalla de inicio
 initial-scratch-message ""                        ; Vacía el búfer inicial * scratch *
 ;org-agenda-todo-ignore-scheduled 'future
 ;org-agenda-tags-todo-honor-ignore-options t
 kill-ring-max 128                                 ; Longitud máxima del anillo de matar
 load-prefer-newer t                               ; Prefiere la versión más reciente de un archivo.
 mark-ring-max 128                                 ; Longitud máxima del anillo de la marca
 scroll-conservatively most-positive-fixnum        ; Desplazarse siempre por una línea
 select-enable-clipboard t                         ; Sistema de fusión y portapapeles de Emacs.
 tab-width 4                                       ; Establecer ancho para pestañas
 use-package-always-ensure t                       ; Evita la clave :ensure para cada paquete
 user-full-name "Carlos M."                        ; Establecer el nombre completo del usuario actual
 user-mail-address "mi0@correo"                    ; Establecer la dirección de correo electrónico del usuario actual
 vc-follow-symlinks t                              ; Siempre sigue los enlaces simbólicos.
 view-read-only t)                                 ; Siempre abre buffers de solo lectura en el modo vista
 (cd "~/")                                         ; Mover al directorio del usuario
 (column-number-mode 1)                            ; Mostrar el número de columna
 (display-time-mode 1)                             ; Habilitar el tiempo en el modo línea
 (fset 'yes-or-no-p 'y-or-n-p)                     ; Reemplaza yes / no por  y / n
 (add-to-list 'default-frame-alist '(fullscreen . maximized))  ;pantalla completa
 (show-paren-mode 1)                               ; Mostrar al padre

Personalización

Para evitar sobrecargar el archivo de personalizacion de GNU Emacs init.el agrego el código generado en un archivo separado.

(setq-default custom-file (expand-file-name "custom.el" user-emacs-directory))
  (when (file-exists-p custom-file)
    (load custom-file t))

Me gustan los temas oscuros

;; Theme
(use-package nimbus-theme
  :config
  (add-to-list 'custom-theme-load-path (expand-file-name "~/.emacs.d/themes/"))
  (load-theme 'nimbus t))

(use-package smart-mode-line
     :defer 0.1
     :custom (sml/theme 'respectful)
     :config (sml/setup))

Desactivar opciones de la interfaz

Prefiero no usar ciertos elementos gráficos como la barra de herramientas, la barra de desplazamiento y tooltip

(when window-system
  (menu-bar-mode -1)                             ; Desactiva barra de menu
  (scroll-bar-mode -1)                            ; Desactiva barra desplazamiento
  (tool-bar-mode -1)                              ; Desactiva barra herramientas
  (tooltip-mode -1))                              ; Desactiva tooltips

UTF-8

Para evitar problemas con los acentos.

(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(if (boundp 'buffer-file-coding-system)
(setq-default buffer-file-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8))
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))

XDG

Para tener el home del usuario lo más limpio posible, sigo la XDG base directory specification

NOTA: para obtener más información, vista dotfiles

(defvar xdg-bin (getenv "XDG_BIN_HOME")
  "The XDG bin base directory.")

(defvar xdg-cache (getenv "XDG_CACHE_HOME")
  "The XDG cache base directory.")

(defvar xdg-config (getenv "XDG_CONFIG_HOME")
  "The XDG config base directory.")

(defvar xdg-data (getenv "XDG_DATA_HOME")
  "The XDG data base directory.")

(defvar xdg-lib (getenv "XDG_LIB_HOME")
  "The XDG lib base directory.")

Lenguajes

CSV

(use-package csv-mode)

LaTeX

Utilizo LaTeX para mis informes, CV, resúmenes, etc.

(use-package tex
  :ensure auctex
  :hook (LaTeX-mode . reftex-mode)
  :custom
  (TeX-PDF-mode t)
  (TeX-auto-save t)
  (TeX-byte-compile t)
  (TeX-clean-confirm nil)
  (TeX-master 'dwim)
  (TeX-parse-self t)
  (TeX-source-correlate-mode t)
  (TeX-view-program-selection '((output-pdf "Evince")
				(output-html "xdg-open"))))

(use-package bibtex
  :after auctex
  :hook (bibtex-mode . my/bibtex-fill-column)
  :preface
  (defun my/bibtex-fill-column ()
    "Ensures that each entry does not exceed 120 characters."
    (setq fill-column 120)))

(use-package company-auctex
  :after (auctex company)
  :config (company-auctex-init))

(use-package company-math :after (auctex company))

Quiero un motor TeX que pueda manejar Unicode y usar cualquier fuente que me guste.

(setq-default TeX-engine 'xetex)

reftex

Modo menor con distinto soporte para \label, \ref y \cite en LaTeX.

(use-package reftex :after auctex)

Markdown

Antes de que puedas usar este paquete, asegúrate de instalar markdown en tu sistema operativo.

(use-package markdown-mode
  :delight "μ "
  :mode ("INSTALAR\\'"
	 "LICENCIA\\'"
	 "LEEME\\'"
	 "\\.markdown\\'"
	 "\\.md\\'"))

Configuración Avanzada

Backups

Es importante tener un buen sistema de backups.

(setq
   backup-by-copying t      ; no copiar enlaces simbólicos
   backup-directory-alist
	  `(("." . ,(expand-file-name "backups/" user-emacs-directory)))
   delete-old-versions t
   kept-new-versions 4
   kept-old-versions 2
   version-control t)       ; usar versionado de backups

Buffers

Los buffers pueden convertirse rápidamente en un desastre. Para algunas personas, no es un problema, pero yo quiero tener de una forma rapida una lista de toso los buffers abiertos.

(use-package ibuffer
  :defer 0.2
  :bind ("C-x C-b" . ibuffer))

Calendario

Festivos

Lista de fechas importantes según mi país, España. Es muy probable que algunas fechas sean diferentes en tu país o Comunidad Autónoma, por lo tanto, adapta la configuración como corresponda.

(setq calendar-holidays '((holiday-fixed 1 1 "Año Nuevo")
			  (holiday-fixed 1 6 "Reyes Magos")
			  (holiday-fixed 4 18 "Jueves Santo")
			  (holiday-fixed 4 19 "Viernes Santo")
			  (holiday-fixed 5 1 "Dia del Trabajo")
			  (holiday-fixed 5 2 "Comunidad de Madrid")
			  (holiday-fixed 5 15 "San Isidro")
			  (holiday-fixed 8 15 "Asunción")
			  (holiday-fixed 10 02 "Día de la Policía")
			  (holiday-fixed 10 12 "Día de la Hispanidad")
			  (holiday-fixed 11 01 "Todos los Santos")
			  (holiday-fixed 11 09 "Almudena")
			  (holiday-fixed 12 06 "Constitución")
			  (holiday-fixed 12 08 "Inmaculada")
			  (holiday-fixed 12 25 "Navidad")
			  ))
(setq calendar-week-start-day 1) ;; la semana empieza el lunes
(setq european-calendar-style t) ;; estilo europeo

Sincronización con Caldav

org-caldav proporciona sincronización bidireccional con servidores CalDav.


(use-package org-caldav
  :ensure t
  :bind ([f3] . org-caldav-sync)
  :preface
  :custom
  ;; Calendarios a utilizar, Nextcloud en mi servidor
  (org-caldav-url "https://192.168.2.3/remote.php/dav/calendars/carlos/")
  (org-caldav-calendars
      '((:calendar-id "personal"
		      :files ("~/.personal/agenda/diario.org")
		      :inbox "~/.personal/agenda/diario-ibx.org")
  ))
  (org-caldav-backup-file "~/.personal/calendario/org-caldav-backup.org")
  (org-caldav-save-directory "~/.personal/calendario/")
  (org-icalendar-alarm-time 1)
)

Funciones de sincronización y auto-guardado para el calendario


;; sincroniza al cerrar, también pide guardar después de sincronizar
;; no se pierden cambios
(defun org-caldav-sync-at-close ()
    (org-caldav-sync)
    (save-some-buffers))

;; sincronización retardada; espera hasta que emacs haya estado inactivo
;; "x" segundos antes de sincronizar. El retraso es importante porque caldav-sync
;; puede tardar cinco o diez segundos, de esta manera, espera hasta que hayas estado
;; inactivo un tiempo para evitar molestar.
(defvar org-caldav-sync-timer nil
     "Temporizar `org-caldav-push-timer' se usa para reprogramarse a si mismo, o nil.")

(defun org-caldav-sync-with-delay (secs)
      (when org-caldav-sync-timer
      (cancel-timer org-caldav-sync-timer))
(setq org-caldav-sync-timer
	  (run-with-idle-timer
	   (* 1 secs) nil 'org-caldav-sync)))

;; Esto asegura que los elementos de las tareas pendientes puedan aparecer en el calendario
(setq org-icalendar-include-todo t)
;; Esto garantiza que todos las "deadlines" se muestren y se muestren como fechas de vencimiento
(setq org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due))
;; Esto garantiza que los elementos "dedlines" se muestren y se muestren como horas de inicio
(setq org-icalendar-use-scheduled '(todo-start event-if-todo event-if-not-todo))
;; hook de guardado con retraso, con un temporizador de inactividad de cinco minutos
(add-hook 'after-save-hook
  (lambda ()
      (when (eq major-mode 'org-mode)
	(org-caldav-sync-with-delay 300))))
;; Añade hook para el cierre de emacs
(add-hook 'kill-emacs-hook 'org-caldav-sync-at-close)

Calfw

Vista gráfica de la agenda a modo de calendario


(use-package calfw
:ensure t
:bind ([f8] . mi-calendario)
:custom
(cfw:org-overwrite-default-keybinding t)) ;; atajos de teclado de la agenda org-mode
;(setq cfw:display-calendar-holidays nil) ;; esconder fiestas calendario emacs

(use-package calfw-org
:ensure t)

;; calendarios a mostrar
(defun mi-calendario ()
  (interactive)
       (cfw:open-calendar-buffer
	:contents-sources
	(list
	 (cfw:org-create-source))))

Dashboard

Siempre es bueno tener un buen tablero al inicio.

(use-package dashboard
  :preface
    (setq dashboard-banner-logo-title (concat "GNU Emacs " emacs-version
					    " kernel " (car (split-string (shell-command-to-string "uname -r") "-"))
					    " x86_64 " (car (split-string (shell-command-to-string "/usr/bin/sh -c '. /etc/os-release && echo $PRETTY_NAME'") "\n"))))
  :init
    (add-hook 'after-init-hook 'dashboard-refresh-buffer)
  :custom (dashboard-set-file-icons t)
  :custom (dashboard-startup-banner 'logo)
  :config (dashboard-setup-startup-hook))

Dired

Configuración explorador de archivos GNU Emacs

(use-package dired
  :ensure nil
  :delight "Dired "
  :custom
  (dired-auto-revert-buffer t)
  (dired-dwim-target t)
  (dired-hide-details-hide-symlink-targets nil)
  (dired-listing-switches "-alh")
  (dired-ls-F-marks-symlinks nil)
  (dired-recursive-copies 'always))

(use-package dired-x
  :ensure nil
  :preface
  (defun my/dired-revert-after-cmd (command &optional output error)
    (revert-buffer))
  :config (advice-add 'dired-smart-shell-command :after #'my/dired-revert-after-cmd))

Acabando

El siguiente código, ejecuta org-babel-tangle asincrónicamente cuando se guarda config.org.

(use-package async)

(defvar *config-file* (expand-file-name "config.org" user-emacs-directory)
  "Archivo de configuracion.")

(defvar *config-last-change* (nth 5 (file-attributes *config-file*))
  "Tiempo desde la ultima modificacion del fichero.")

(defvar *show-async-tangle-results* nil
  "Mantiene los búferes asíncronos *emacs* para su posterior inspección..")

(defun my/config-updated ()
  "Comprueba si el archivo de configuración se ha actualizado desde la última vez."
  (time-less-p *config-last-change*
	       (nth 5 (file-attributes *config-file*))))

(defun my/config-tangle ()
  "Tangles the org file asynchronously."
  (when (my/config-updated)
    (setq *config-last-change*
	  (nth 5 (file-attributes *config-file*)))
    (my/async-babel-tangle *config-file*)))

(defun my/async-babel-tangle (org-file)
"Tangles the org file asynchronously."
  (let ((init-tangle-start-time (current-time))
	(file (buffer-file-name))
	(async-quiet-switch "-q"))
    (async-start
     `(lambda ()
	(require 'org)
	(org-babel-tangle-file ,org-file))
     (unless *show-async-tangle-results*
       `(lambda (result)
	  (if result
	      (message "SUCCESS: %s successfully tangled (%.2fs)."
		       ,org-file
		       (float-time (time-subtract (current-time)
						  ',init-tangle-start-time)))
	    (message "ERROR: %s as tangle failed." ,org-file)))))))

Ortografía

Corrector ortografico

(setq ispell-program-name "aspell")
(setq ispell-local-dictionary "espanol")
(setq ispell-local-dictionary-alist
      '(("es_ES" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil nil nil utf-8)))

Fly Spell

flyspell habilita la revisión ortográfica sobre la marcha en Emacs.

  (use-package flyspell
    :defer 1
    :delight
    :custom
    (flyspell-abbrev-p t)
    (flyspell-issue-message-flag nil)
    (flyspell-issue-welcome-flag nil)
    (flyspell-mode 1))

  (use-package flyspell-correct-ivy
    :after flyspell
    :bind (:map flyspell-mode-map
		("C-;" . flyspell-correct-word-generic))
    :custom (flyspell-correct-interface 'flyspell-correct-ivy))

  (use-package ispell
    :custom
    (ispell-silently-savep t))

;; Activar Flyspell en modo texto y modos relacionados
(add-hook 'text-mode-hook
'(lambda () (flyspell-mode 1)))

;; Como habitualmente nece sito cambiar entre el diccionario English y Spanish, uso esta función:

      (defun fd-switch-dictionary()
      (interactive)
      (let* ((dic ispell-current-dictionary)
       (change (if (string= dic "espanol") "english" "espanol")))
	(ispell-change-dictionary change)
	(message "Dicionario cambiado desde %s a %s" dic change)
	))

      (global-set-key (kbd "<f6>")   'fd-switch-dictionary)

General

aggressive-indent

Sangría automática a medida que se escribe.

electric-indent-mode es suficiente para mantener tu código bien alineado cuando escribes. Sin embargo, una vez que comienzas a desplazar bloques o líneas, la sangría puede ser errónea.

aggressive-indent-mode es un modo menor que mantiene tu código siempre sangrado. Se reinicia después de cada cambio

Artur Malabarba

(use-package aggressive-indent
  :defer 2
  :hook ((css-mode . aggressive-indent-mode)
	 (emacs-lisp-mode . aggressive-indent-mode)
	 (js-mode . aggressive-indent-mode)
	 (lisp-mode . aggressive-indent-mode))
  :custom (aggressive-indent-comments-too))

move-text

(use-package move-text
  :defer 2
  :bind (("M-p" . move-text-up)
	 ("M-n" . move-text-down))
  :config (move-text-default-bindings))

Mueve la línea actual (o si está marcada, las líneas completas de la región actual).

paradox

Menú de paquetes mejorado respecto al estándar de GNU Emacs.

Proyecto de modernización del menú de paquetes de Emacs. Con apariencia mejorada, información mode-line. Integración de Github, personalización, actualización asíncrona y Más.

Artur Malabarba

(use-package paradox
  :defer 1
  :custom
  (paradox-column-width-package 27)
  (paradox-column-width-version 13)
  (paradox-execute-asynchronously t)
  (paradox-hide-wiki-packages t)
  :config
  (paradox-enable)
  (remove-hook 'paradox-after-execute-functions #'paradox--report-buffer-print))

rainbow-mode

Colorea texto con su valor.

(use-package rainbow-mode
  :defer 2
  :delight
  :hook (prog-mode))
  • Reemplaza el archivo actual con el guardado.
Evita llamar a la función o recargar Emacs.

```emacs-lisp
(use-package autorevert
  :ensure nil
  :delight auto-revert-mode
  :bind ("C-x R" . revert-buffer)
  :custom (auto-revert-verbose nil)
  :config (global-auto-revert-mode 1))
```

undo-tree

En lugar de tratar el deshacer/rehacer como una secuencia lineal de cambios, el modo undo-tree-mode trata el historial de deshacer como un árbol ramificado de cambios, similar a la forma en que Vim lo maneja.

(use-package undo-tree
  :delight
  :bind ("C--" . undo-tree-redo)
  :init (global-undo-tree-mode)
  :custom
  (undo-tree-visualizer-timestamps t)
  (undo-tree-visualizer-diff t))

Ivy

Ivy es un mecanismo de finalización genérico para Emacs. Mientras opera de manera similar a otros esquemas de finalización como el modo completo, Ivy tiene como objetivo para ser más eficientes, más pequeños, más sencillos y más fáciles de usar pero altamente personalizable

Oleh Krehel

(use-package counsel
  :after ivy
  :delight
  :config (counsel-mode))

(use-package ivy
  :defer 0.1
  :delight
  :bind (("C-c C-r" . ivy-resume)
	 ("C-x B" . ivy-switch-buffer-other-window))
  :custom
  (ivy-count-format "(%d/%d) ")
  (ivy-use-virtual-buffers t)
  :config (ivy-mode))

(use-package ivy-pass
  :after ivy
  :commands ivy-pass)

(use-package ivy-rich
  :after ivy
  :custom
  (ivy-virtual-abbreviate 'full
			  ivy-rich-switch-buffer-align-virtual-buffer t
			  ivy-rich-path-style 'abbrev)
  :config
  (ivy-set-display-transformer 'ivy-switch-buffer
			       'ivy-rich-switch-buffer-transformer))

(use-package swiper
  :after ivy
  :bind (("C-s" . swiper)
	 ("C-r" . swiper)))

Paréntesis

rainbow-delimiters

rainbow-delimiters destaca delimitadores como paréntesis o llaves según su profundidad. Cada nivel se resalta en un color diferente.

Fanael Linithien

(use-package rainbow-delimiters
  :defer 1
  :hook (prog-mode . rainbow-delimiters-mode))

smartparens

Paquete para tratar con paréntesis. De todos modos, si no te gusta, puedes intentar echar un vistazo a paredit o autopair.

(use-package smartparens
  :defer 1
  :delight
  :config (smartparens-global-mode 1))

PDF

PDF Tools es, entre otras cosas, un reemplazo de DocView para archivos PDF. La diferencia clave es que las páginas no están pre-renderizadas por p.ej. ghostscript y almacenadas en el sistema de archivos, sino creado. bajo demanda y almacenado en memoria.

Andras Politz

(use-package pdf-tools
  :defer 1
  :init (pdf-tools-install :no-query))

  (use-package pdf-view
  :ensure nil
  :after pdf-tools
  :bind (:map pdf-view-mode-map
	      ("C-s" . isearch-forward)
	      ("d" . pdf-annot-delete)
	      ("h" . pdf-annot-add-highlight-markup-annotation)
	      ("t" . pdf-annot-add-text-annotation))
  :custom
  (pdf-view-display-size 'fit-page)
  (pdf-view-resize-factor 1.1)
  (pdf-view-use-unicode-ligther nil))

Archivos recientes

Proporciona un acceso rápido a los archivos recientes.

(use-package recentf
  :defer 2
  :bind ("C-c r" . recentf-open-files)
  :init (recentf-mode)
  :custom
  (recentf-max-menu-items 10)
  (recentf-max-saved-items 50)
  (recentf-exclude (list "COMMIT_EDITMSG"
			 "~$"
			 "/scp:"
			 "/ssh:"
			 "/sudo:"
			 "/tmp/"))
  :config (run-at-time nil (* 5 60) 'recentf-save-list))

Control de Versión

Es bastante común trabajar en repositorios Git, por lo que es importante tener una configuración que nos guste.

Magit es una interfaz para el sistema de control de versiones Git, implementado como un paquete Emacs. Mientras no podamos (todavía) afirmar que Magit envuelve y mejora todos y cada uno de los comandos de Git, es lo suficientemente completo como para permitir que incluso los usuarios experimentados de Git realicen casi todos sus tareas diarias de control de versiones directamente desde Emacs

Jonas Bernoulli

(use-package git-commit
  :after magit
  :hook (git-commit-mode . my/git-commit-auto-fill-everywhere)
  :custom (git-commit-summary-max-length 50)
  :bind ("C-x g" . magit-status)
  :preface
  (defun my/git-commit-auto-fill-everywhere ()
    "Asegura que el cuerpo del commit no exceda los 72 caracteres "
    (setq fill-column 72)
    (setq-local comment-auto-fill-only-comments nil)))

(use-package magit :defer 0.3)

Además de eso, me gusta ver las líneas que se están modificando en el archivo mientras se está editando.

(use-package git-gutter
  :defer 0.3
  :delight
  :init (global-git-gutter-mode +1))

Finalmente, un último paquete que me gusta usar con Git para ver fácilmente los cambios realizados en commits anteriores.

(use-package git-timemachine :defer 1 :delight)

Espacios en blanco

A menudo es molesto ver espacios en blanco innecesarios al final de una línea o archivo.

(use-package whitespace
  :defer 1
  :hook (before-save . delete-trailing-whitespace))

hungry-delete

Eliminar un carácter de espacio en blanco eliminará todos los espacios en blanco hasta el siguiente carácter no en blanco.

Nathaniel Flath

(use-package hungry-delete
  :defer 0.7
  :delight
  :config (global-hungry-delete-mode))

Ventanas

No pregunta antes de matar un búfer.

(global-set-key [remap kill-buffer] #'kill-this-buffer)

switch-window

Muestra una superposición en cada ventana mostrando una clave única, luego pregunta al usuario donde moverse en la ventana.

La mayoría de la gente usa ace-window, pero prefiero switch-window porque encuentro este paquete más ergonómico mediante el hecho de mostrar el número de búfer ocultando su contenido.

(use-package switch-window
  :defer 0.2
  :bind (("C-x o" . switch-window)
	 ("C-x w" . switch-window-then-swap-buffer)))

windmove

Le permite moverse de una ventana a otra algo más natural que cliclando C-x o (other-window).

(use-package windmove
  :defer 0.2
  :bind (("C-c h" . windmove-left)
	 ("C-c j" . windmove-down)
	 ("C-c k" . windmove-up)
	 ("C-c l" . windmove-right)))

winner

A menudo deshago y hago redo con configuraciones de ventana.

El modo winner es un modo global secundario que registra los cambios en la configuración de la ventana (es decir, cómo los marcos se dividen en ventanas) para que los cambios se pueden “deshacer” usando el comando winner-undo. Por defecto este es enlazado a la secuencia de teclas ctrl-c izquierda. Si cambias de opinión (mientras te deshaces), puede presionar ctrl-c derecha (llamando winner-redo).

Ivar Rummelhoff

(use-package winner
  :defer 2
  :config (winner-mode 1))

all-the-icons y neotree

Pequeño árbol de archivos como barra lateral, no olvides ejecutar M-x all-the-icons-install-fonts después de iniciar Emacs por primera vez.

(use-package all-the-icons :ensure t)

(use-package neotree
  :ensure t
  :bind ("<f2>" . neotree-toggle)
  :init
  (setq neo-theme (if (display-graphic-p) 'icons 'arrow)))

Ajuste de Línea

Me gusta tener líneas de la misma longitud.

(use-package simple
  :ensure nil
  :delight (auto-fill-function)
  :bind ("C-x p" . pop-to-mark-command)
  :hook ((prog-mode . turn-on-auto-fill)
	 (text-mode . turn-on-auto-fill))
  :custom (set-mark-command-repeat-pop t))

Org-Mode

El modo Org es para guardar notas, mantener listas de tareas pendientes, planificar proyectos y creación de documentos con un sistema de texto simple rápido y efectivo.

Carsten Dominik

  (use-package org
    :ensure org-plus-contrib
    :delight "Θ "
    :preface
    (defun my/org-compare-times (clocked estimated)
      "Obtiene la relación entre el tiempo programado y el tiempo estimado "
      (if (and (> (length clocked) 0) estimated)
	  (format "%.2f"
		  (/ (* 1.0 (org-hh:mm-string-to-minutes clocked))
		     (org-hh:mm-string-to-minutes estimated)))
	""))

    (defun my/org-archive-done-tasks ()
      "Archivos de tareas terminados o cancelados."
      (interactive)
      (org-map-entries
       (lambda ()
	 (org-archive-subtree)
	 (setq org-map-continue-from (outline-previous-heading)))
       "TODO=\"HECHA\"|TODO=\"CANCELADA\"" (if (org-before-first-heading-p) 'file 'tree)))

    (defun my/org-use-speed-commands-for-headings-and-lists ()
      "Activa los comandos de velocidad también en los elementos de la lista."
      (or (and (looking-at org-outline-regexp) (looking-back "^\**"))
	  (save-excursion (and (looking-at (org-item-re)) (looking-back "^[ \t]*")))))
    :hook ((after-save . my/config-tangle)
	   (auto-save . org-save-all-org-buffer)
	   (org-mode . org-indent-mode))
    :custom
    (org-blank-before-new-entry '((heading . t)
				  (plain-list-item . t)))
    (org-cycle-include-plain-lists 'integrate)
    (org-ditaa-jar-path "/home/carlos/bin/ditaa/ditaa.jar")
    (org-expiry-inactive-timestamps t)
    (org-export-backends '(ascii html icalendar latex md org texinfo))
    (org-log-done 'time)
    (org-log-into-drawer "LOGBOOK")
    (org-modules '(org-crypt
		   org-habit
		   org-info
		   org-mouse
		   org-protocol))
;;    (org-refile-allow-creating-parent-nodes 'confirm)
;;    (org-refile-use-cache nil)
;;    (org-refile-use-outline-path nil)
    (org-refile-targets '((org-agenda-files . (:maxlevel . 6))))
    (org-startup-folded nil)
    (org-startup-with-inline-images t)
    (org-tag-alist '(("@nota" . ?n)
		     ("@casa" . ?c)
		     ("@dinero" . ?d)
		     ("@fecha" . ?f)
		     ("@salud" . ?s)
		     ("@tarea" . ?t)
		     ("@coche" . ?h)
		     ("@trabajo" . ?b)
		     ("crypt" . ?C)))
    (org-tags-exclude-from-inheritance '("crypt" "project"))
    (org-todo-keywords '((sequence "TODO(t!)"
				   "INICIADA(i!)"
				   "SIGUIENTE(s!)"
				   "|" "HECHA(h!)" "PARADA(r@/)" "CANCELADA(c@)")))

    (org-use-effective-time t)
    (org-use-speed-commands 'my/org-use-speed-commands-for-headings-and-lists)
    (org-yank-adjusted-subtrees t)
    :config
    (add-to-list 'org-global-properties '("Esfuerzo_TODO". "0:05 0:15 0:30 1:00 2:00 3:00 4:00"))
    (add-to-list 'org-speed-commands-user '("$" call-interactively 'org-archive-subtree))
    (add-to-list 'org-speed-commands-user '("i" call-interactively 'org-clock-in))
    (add-to-list 'org-speed-commands-user '("o" call-interactively 'org-clock-out))
    (add-to-list 'org-speed-commands-user '("d" call-interactively 'org-clock-display))
    (add-to-list 'org-speed-commands-user '("s" call-interactively 'org-schedule))
    (add-to-list 'org-speed-commands-user '("x" org-todo "HECHA"))
    (add-to-list 'org-speed-commands-user '("p" org-todo "PUBLICADA"))
    (org-clock-persistence-insinuate))

toc-org mantendrá una tabla de contenido en el primer encabezado que tiene una etiqueta :TOC:.

(use-package toc-org
  :after org
  :hook (org-mode . toc-org-enable))

Para un modo en línea más limpio.

(use-package org-indent :after org :ensure nil :delight)

Agenda

Es importante tomarte tu tiempo para hacer una configuración que sea fácil de usar y que haga tu vida más fácil con una buena organización.

org-agenda me permite ser organizado con las tareas diarias.

Sincronizo mis archivos org mediante Syncthing para poder revisar mi agenda y actualizarla desde varios ordenadores y dispositivos móviles.

  (use-package org-agenda
    :ensure nil
    :after org
    :bind ([f7] . org-agenda)
    :custom
      (org-agenda-dim-blocked-tasks t)
      (org-agenda-files '("~/.personal/agenda"))
      (org-agenda-include-diary nil)
      (org-agenda-diary-file "~/.personal/agenda/diario.org")
      (org-agenda-inhibit-startup t)
      (org-agenda-show-log t)
      (org-agenda-skip-deadline-if-done t)
      (org-agenda-skip-deadline-prewarning-if-scheduled 'pre-scheduled)
      (org-agenda-skip-scheduled-if-done t)
      (org-agenda-span 2)
      (org-agenda-start-on-weekday 1)
      (org-agenda-sticky nil)
      (org-agenda-window-setup 'current-window) ;Sobrescribe la ventana actual con la agenda
      (org-agenda-tags-column -100)
      (org-agenda-time-grid '((daily today require-timed)))
      (org-agenda-use-tag-inheritance t)
;      (org-columns-default-format "%14SCHEDULED %Effort{:} %1PRIORITY %TODO %50ITEM %TAGS")
      (org-directory "~/.personal")
      (org-archive-location "~/.personal/archivo/%s_archivo.org::datetree/")
      (org-enforce-todo-dependencies t)
;      (org-habit-graph-column 80)
      (org-habit-show-habits-only-for-today nil)
      (org-track-ordered-property-with-tag t)
      (org-icalendar-timezone "Europe/Madrid")
      (calendar-day-name-array ["domingo" "lunes" "martes" "miércoles"
				 "jueves" "viernes" "sábado"])
      (calendar-month-name-array ["enero" "febrero" "marzo" "abril" "mayo"
				   "junio" "julio" "agosto" "septiembre"
				   "octubre" "noviembre" "diciembre"])
  (org-agenda-custom-commands
      '(("h" "Habitos" tags-todo "STYLE=\"habit\""
	 ((org-agenda-overriding-header "Habitos")
	  (org-agenda-sorting-strategy
	   '(todo-state-down effort-up category-keep))))
	("o" "Trabajo"
	  ((agenda "" )
	     (tags-todo "trabajo/INICIADA"
		   ((org-agenda-overriding-header "Tareas Iniciadas")
		    (org-tags-match-list-sublevels t)))
	     (tags-todo "trabajo/SIGUIENTE"
		   ((org-agenda-overriding-header "Siguientes Tareas")
		    (org-tags-match-list-sublevels t)))
	     (tags-todo "trabajo/TODO"
		   ((org-agenda-overriding-header "Tareas por Hacer")
		    (org-tags-match-list-sublevels t)))
	     (tags "trabajo/CANCELADA"
		   ((org-agenda-overriding-header "Tareas Canceladas")
		    (org-tags-match-list-sublevels t)))
	     (tags "trabajo/HECHA"
		   ((org-agenda-overriding-header "Tareas terminadas sin Archivar")
		    (org-tags-match-list-sublevels t)))
	     (tags "reubicar"
		   ((org-agenda-overriding-header "Reubicar")
		    (org-tags-match-list-sublevels t)))
	     nil))
      ;; Reportes personales
      ("p"  "Personal"
	  ((agenda "" )
	     (tags-todo "personal/INICIADA"
		   ((org-agenda-overriding-header "Tareas Iniciadas")
		    (org-tags-match-list-sublevels t)))
	     (tags-todo "personal/SIGUIENTE"
		   ((org-agenda-overriding-header "Siguientes Tareas")
		    (org-tags-match-list-sublevels t)))
	     (tags-todo "personal/TODO"
		   ((org-agenda-overriding-header "Tareas por Hacer")
		    (org-agenda-todo-ignore-deadlines 'future)
		    (org-agenda-todo-ignore-scheduled 'future)
		    (org-agenda-tags-todo-honor-ignore-options t)
		    (org-tags-match-list-sublevels t)))
	     (tags "personal/CANCELADA"
		   ((org-agenda-overriding-header "Tareas Canceladas")
		    (org-tags-match-list-sublevels t)))
;             (tags "diario"
;                   ((org-agenda-overriding-header "Citas")
;                    (org-tags-match-list-sublevels t)))
	     (tags "personal/HECHA"
		   ((org-agenda-overriding-header "Tareas terminadas sin Archivar")
		    (org-tags-match-list-sublevels t)))
	     (tags "reubicar"
		   ((org-agenda-overriding-header "Reubicar")
		    (org-tags-match-list-sublevels t)))
	     nil))
)))

Bullets

Prettier bullets en org-mode.

(use-package org-bullets
  :hook (org-mode . org-bullets-mode))

Captura

Las plantillas para org-capture ahorran mucho tiempo al agregar nuevas entradas. yo las suelo usar para registrar rápidamente tareas, notas y otra información.

(use-package org-capture
  :ensure nil
  :after org
  :bind ("C-c c" . org-capture)
  :preface
  (defvar my/org-basic-task-template "* TODO %^{Tareas}
   :PROPERTIES:
   :Effort: %^{effort|1:00|0:05|0:15|0:30|2:00|4:00}
   :END:
    Capturado %<%Y-%m-%d %H:%M>" "Plantilla básica de tareas.")

  (defvar my/org-contacts-template "* %(org-contacts-template-name)
   :PROPERTIES:
   :EMAIL: %(org-contacts-template-email)
   :PHONE: %^{123-456-789}
   :HOUSE: %^{123-456-789}
   :ALIAS: %^{nick}
   :NICKNAME: %^{hefistion}
   :IGNORE:
   :NOTE: %^{NOTA}
   :ADDRESS: %^{Calle Ejemplo 1 2A, 28320, Pinto, Madrid, España}
   :BIRTHDAY: %^{yyyy-mm-dd}
   :END:" "Plantilla para org-contacts.")
   :custom
  (org-capture-templates
   `(("c" "Contactos" entry (file+headline "~/.personal/agenda/contactos.org" "Amigos"),
      my/org-contacts-template
      :empty-lines 1)

     ("f" "Fecha" entry (file+headline "~/.personal/agenda/reubicar.org" "Fechas"),
      my/org-basic-task-template
      :empty-lines 1)

      ("n" "Nota" entry (file+headline "~/.personal/agenda/reubicar.org" "Nota"),
      my/org-basic-task-template
      :empty-lines 1)

      ("i" "Cita" entry (file "~/.personal/agenda/diario.org" ),
       "* cita con %? \n%T"
      :empty-lines 1)

      ("b" "Blog" entry (file+headline "~/.personal/agenda/reubicar.org" "Blog"),
      my/org-basic-task-template
      :empty-lines 1)

     ("t" "Tarea" entry (file+headline "~/.personal/agenda/reubicar.org" "Tareas"),
      my/org-basic-task-template
      :empty-lines 1))))

Reloj

org-clock permite estimar tus tareas y cronometrarlas. Esto es útil, puedes tener una mejor estimación del tiempo que debes dedicar a cada tarea.

(use-package org-clock
  :ensure nil
  :after org
  :preface
  (defun my/org-mode-ask-effort ()
    "Pida una estimación de esfuerzo al momento de crear la tarea."
    (unless (org-entry-get (point) "Esfuerzo")
      (let ((effort
	     (completing-read
	      "Esfuerzo: "
	      (org-entry-get-multivalued-property (point) "Esfuerzo"))))
	(unless (equal effort "")
	  (org-set-property "Esfuerzo" effort)))))
  :hook (org-clock-in-prepare-hook . my/org-mode-ask-effort)
  :custom
  (org-clock-clocktable-default-properties
   '(:block day :maxlevel 2 :scope agenda :link t :compact t :formula %
	    :step day :fileskip0 t :stepskip0 t :narrow 80
	    :properties ("Esfuerzo" "CLOCKSUM" "CLOCKSUM_T" "TODO")))
  (org-clock-continuously nil)
  (org-clock-in-switch-to-state "INICIADA")
  (org-clock-out-switch-to-state "PARADA")
  (org-clock-out-remove-zero-time-clocks t)
  (org-clock-persist t)
  (org-clock-persist-query-resume nil)
  (org-clock-report-include-clocking-task t)
  (org-show-notification-handler (lambda (msg) (alert msg))))

Contactos

La mejor solución para mantener tus contactos. Suelo usar org-contacts está disponible en org-plus-contrib.

(use-package org-contacts
  :ensure nil
  :after org
  :custom
  (org-contacts-files '("~/.personal/agenda/contactos.org")))

Personalización

Cambiemos el primer plano y el peso de cada palabra clave.

(use-package org-faces
  :ensure nil
  :after org
  :custom
  (org-todo-keyword-faces
   '(("TODO".(:foreground "yellow" :weight bold))
     ("INICIADA".(:foreground "green" :weight bold))
     ("BORRADOR".(:foreground "blue" :weight bold))
     ("SIGUIENTE".(:foreground "orange" :weight bold))
     ("HECHA".(:foreground "white" :weight bold))
     ("PUBLICADA".(:foreground "green" :weight bold))
     ("TERMINADA".(:foreground "pink" :weight bold))
     ("PARADA".(:foreground "magenta" :weight bold))
     ("CANCELADA".(:foreground "red" :weight bold)))))

Cifrado / Descifrado

Para poder habilitar el cifrado y descifrado de archivos .gpg con org-mode, necesitaremos instalar gnupg2.

Una vez hecho esto, simplemente configuramos org-crypt para aceptar nuestro identificador de clave pública para permitir el cifrado asimétrico.

NOTA: necesitas modificar la variable org-crypt-key para reemplazar mi identificador de clave por el tuyo (o nil para permitir el cifrado simétrico).

org-crypt cifra el texto de una entrada, pero no el título o las propiedades

(use-package org-crypt
  :ensure nil
      :after org
  :init (org-crypt-use-before-save-magic)
  :custom (org-crypt-key "id de tu llave"))

Lenguajes

Con esto, puedo compilar muchos idiomas con org-mode.

(use-package ob-ditaa :ensure nil :after org)
(use-package ob-emacs-lisp :ensure nil :after org)
(use-package ob-latex :ensure nil :after org)
(use-package ob-org :ensure nil :after org)
(use-package ob-shell :ensure nil :after org)

Ox-Hugo

Configuración de ox-hugo

(use-package ox-hugo
  :ensure t
  :after ox)

Seguro que hay cosas que no te serán útiles, espero que muchas otras si, siéntete libre de utilizar esta configuración como mejor desees.

Espero que te haya gustado, pasa un buen día…:penguin: