Org-Mode: Mi fichero de configuración
2019-12-16
Índice
- Inicialización de Emacs
- Puesta en Marcha
- Lenguajes
- Configuración Avanzada
- Org-Mode
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 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
:config
(setq cfw:org-overwrite-default-keybinding t)) ;; atajos de teclado de la agenda org-mode
(use-package calfw-org
:ensure t
:config
(setq cfw:org-overwrite-default-keybinding t)
:bind ([f8] . cfw:open-org-calendar))
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
(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.
(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.
(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
(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.
(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 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.
(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
(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.
(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 (llamandowinner-redo
).
(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.
(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.
(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…🐧