Contenido

Emacs: Mis archivos de configuración

El mundo de Emacs es infinito y dentro de ese universo hay galaxias enteras que tratan acerca de los archivos de configuración.

Hay quienes utilizan Emacs hace años y estas configuraciones son abrumadoras.

Valga este humilde post para presentar mi pequeño (y bastante genérico) archivo de configuración.

La estructura de directorios

En el directorio .emacs.d/ ubicado dentro del /home, tenemos todo lo que hace a la configuración personal de Emacs.

Captura de pantalla mostrando estructura de directorios de la carpeta .emacs
Así es como me siento más cómodo configurando Emacs

El primer archivo que se ejecuta es init.el.

En este archivo tengo configurados cuales serán los próximos archivos que emacs usará para configurarse y que me permiten tener todo mejor organizado.

Este archivo indica la ruta donde se encuentran los otros archivos, enn este caso el directorio "elisp".

Archivos de configuración

init.el

(add-to-list 'load-path (concat user-emacs-directory "elisp"))
(require 'early-init) ;; Archivos que se inician primero
(require 'base) ;; Configuración básica o general de Emacs
(require 'orgmode) ;; Archivos de configuración de Org-mode
(require 'theme) ;; Archivos referentes a la configuracion del tema visual
(require 'completion) ;; Paquetes de completado automático y snippets
(require 'keymappings) ;; Atajos de teclado personalizados
(require 'varios) ;; Otras configuraciones
(require 'zettelkasten) ;; Configuración para el método Zettelkasten
(require 'markdown) ;; Configuración de Markdown
(require 'splash) ;; Pantalla de inicio
(require 'hugo) ;; Configuración de paquetes para manejo de Blogs en Hugo

early-init.el

;; Esta configuración fue tomada de Doom
;; Difiere la 'garbage collection' más tardiamente en el proceso de inicio.
(setq gc-cons-threshold most-positive-fixnum
        gc-cons-percentage 0.6)


;; Esto evita que Emacs cargue paquetes tempranamente y asi tenemos un inicio más rápido.
(setq package-enable-at-startup nil)

;; No permitir la carga desde la memoria caché del paquete (mismo motivo).
(setq package-quickstart nil)


;; Evita la aparición de Emacs 'sin estilo' al deshabilitar estos elementos de la interfaz de usuario antes de tiempo.
(push '(menu-bar-lines . 0) default-frame-alist)
(push '(tool-bar-lines . 0) default-frame-alist)
(push '(vertical-scroll-bars) default-frame-alist)

;; Cambiar el tamaño del marco de Emacs puede ser una parte muy costosa al cambiar la fuente.
;; Al inhibir esto, reducimos los tiempos de inicio con fuentes que son más grandes que las predeterminadas del sistema.
(setq frame-inhibit-implied-resize t)

;; Desactiva elementos de la interfaz gráfica
(menu-bar-mode -1) ;; Barra de menú
(tool-bar-mode -1) ;; Barra de heramientas
(scroll-bar-mode -1) ;; Barra de scroll
(setq inhibit-splash-screen t) ;; Pantalla de inicio
(setq use-file-dialog nil)

;; Evita las compilaciones no deseadas
(setq comp-deferred-compilation nil)

(provide 'early-init)

base.el

;; === Información Personal ===
(setq user-full-name "Javier Schulz"
      user-mail-address "[email protected]")

;; === Iniciar con la ventana maximizada ===
(add-to-list 'initial-frame-alist '(fullscreen . maximized))

;; === No utiliza para `init.el` para código `custom-*` - Utiliza `custom-file.el`. ===
(setq custom-file "~/.emacs.d/.custom-file.el")

;; Asumir que el código en el archivo custom-file.el se ejecuta antes que el código anterior a esta línea no es una suposición segura.
;; Así que cargue este archivo de forma proactiva.

(load-file custom-file)


;; === Manejo de Paquetes ===
(require 'package)
(add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/") t)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
(package-initialize)

(when (not package-archive-contents)
  (package-refresh-contents))

;; === Use-packacke ===
(unless (package-installed-p 'use-package)
  (package-install 'use-package))
(require 'use-package)

;; === Configuración de ventana ===
(tool-bar-mode -1)
(display-time-mode 1)

;; === Smooth scroll ==
(setq redisplay-dont-pause t
  scroll-margin 1
  scroll-step 1
  scroll-conservatively 10000
  scroll-preserve-screen-position 1)


;; === Mantener los buffers actualizados automáticamente ===
(global-auto-revert-mode t)

;; === Mostrar paréntesis coincidentes ===
(show-paren-mode 1)

;; === Codificación ===
(set-file-name-coding-system 'utf-8)
(set-clipboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
(setq locale-coding-system 'utf-8)
(set-language-environment "UTF-8")
(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))

;; === Highlight current line. ===
(global-hl-line-mode t)

;; === FUENTES: ===
(set-frame-font "DejaVu Sans Mono-12" nil t)
;; (set-frame-font "Fantasque Sans Mono-16" nil t)
;; (set-frame-font "Source Code Pro-14" nil t)
;; (set-frame-font "Monaco-14" nil t)
;; (set-frame-font "Cousine-14" nil t)
(setq default-frame-alist '((font . "DejaVu Sans Mono-12")))

;; === Entorno de shell del sistema a Emacs. ===
;; Importante principalmente para el shell dentro de Emacs,
;; También cosas como la exportación del modo Org a Tex PDF
(use-package exec-path-from-shell
  :ensure t
  :config
  (when (memq window-system '(mac ns x))
    (exec-path-from-shell-initialize)))

;; === Backups y autosalvados se graban en carpeta /home/javier/.emacs.d/auto-save-list/ ===
(setq
    backup-directory-alist '(("." . "/home/javier/.emacs.d/auto-save-list/"))
    backup-by-copying t
    auto-save-file-name-transforms '((".*" "/home/javier/.emacs.d/auto-save-list/" t))
    kept-new-versions 6
    kept-old-versions 2
    delete-old-versions t
    version-control t)

;; === Transforma las pregutnas  yes-or-no en y-or-n ===
(defalias 'yes-or-no-p 'y-or-n-p)

;; === iMenu ===
;; Mostrar el menu con las funciones de los archivos

(use-package imenu
	   :ensure nil
	   :bind (("C-." . imenu)))

;; === Activar chequeo ortográfico ===
(setq ispell-dictionary "castellano")    ;set the default dictionary
(dolist (hook '(text-mode-hook))
  (add-hook hook (lambda () (flyspell-mode 1))))

;; === Activar botón derecho para cambiar palabra sugerida por chequeo ortográfico ===
(eval-after-load "flyspell"
  '(progn
     (define-key flyspell-mouse-map [down-mouse-3] #'flyspell-correct-word)
     (define-key flyspell-mouse-map [mouse-3] #'undefined)))

;; === cambiar idiomas de diccionario ortográfico ===
(defun fd-switch-dictionary()
      (interactive)
      (let* ((dic ispell-current-dictionary)
    	 (change (if (string= dic "castellano") "english" "castellano")))
        (ispell-change-dictionary change)
        (message "Dictionary switched from %s to %s" dic change)
        ))
      (global-set-key (kbd "<f8>")   'fd-switch-dictionary)

;; === DIRECTORIO POR DEFECTO DE DOCUMENTOS DE EMACS ===
(setq default-directory "/media/datos/javier/Nextcloud/Notes/org/")

(provide 'base)

orgmode.el

;; === Evita que los heading se expandan al inicio ===
(setq org-startup-folded 't)

;; === Soporte habitual de la tecla Shift para selección de texto ===
(setq org-support-shift-select t)

;; === Opciones de la agenda de org-mode ===
(custom-set-variables
 '(org-agenda-files
   '("/media/datos/javier/Nextcloud/Notes/org/agenda.org" "/media/datos/javier/Nextcloud/Notes/org/inbox.org"))
 '(org-deadline-warning-days 7)
 '(org-directory "/media/datos/javier/Nextcloud/Notes/org/")
 '(org-clock-persist t)
 '(org-agenda-breadcrumbs-separator " ❱ "))

;; === Elimina la visualización de etiquetas en la agenda ===
;; (setq org-agenda-hide-tags-regexp ".") ;; Oculta todas las etiquetas
(setq org-agenda-hide-tags-regexp "inbox")

;; Compact the block agenda view
(setq org-agenda-compact-blocks t)

;; Archivo de notas por defecto
(setq org-default-notes-file "/media/datos/javier/Nextcloud/Notes/org/inbox.org")

;; Prioridades en Org-mode: (A B C)
(setq org-priority-faces '((?A . error)
					      (?B . warning)
				          (?C . success)))
(setq org-ellipsis (if (char-displayable-p ?) " " nil))

;;
(setq org-log-done t)



;; === Configuracion de Org-refile (C-c C-w) ===
(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps nil)
(setq org-refile-allow-creating-parent-nodes 'confirm)
;; (setq org-refile-targets '((org-agenda-files :maxlevel . 2)))
(setq org-refile-targets (quote (("projects.org" :maxlevel . 2)
                                 ("agenda.org" :level . 2)
                                 ("Notas Medicas.org" :level . 4))))

;; === Org-Alert ===

;; === COLORES DE ESTADOS ===
(setq org-todo-keyword-faces
      (quote (("TODO" :foreground "red" :weight bold)
              ("NEXT" :foreground "blue" :weight bold)
              ("DONE" :foreground "forest green" :weight bold)
              ("WAITING" :foreground "orange" :weight bold)
              ("HOLD" :foreground "magenta" :weight bold)
              ("CANCELLED" :foreground "forest green" :weight bold))))


;; === Toc-org ===
;; Mantendrá una tabla de contenido en el primer encabezado que tiene una etiqueta :TOC:.

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

;; === ORG-indent ===
;; Aspecto mejorado al indentar

;; === Configuracion para archivar notas en archivo dedicado a tal fin, por orden cronológico: ===
(setq org-archive-location "/media/datos/javier/Nextcloud/Notes/org/archive/%s_archivo.org::datetree/")

;; === Justifica el texto ==
;; Las lineas largas no se cortan, sino que van bajando a la siguiente linea.
(global-visual-line-mode t)

;; === ORG-CAPTURE ===
(global-set-key (kbd "C-c c") 'org-capture)
(setq org-default-notes-file "/media/datos/javier/Nextcloud/Notes/org/inbox.org")

;; === Capture templates ===
(setq org-capture-templates
              '(("t" "Nuevo TODO" entry
               (file+headline "/media/datos/javier/Nextcloud/Notes/org/agenda.org" "Pendientes")
               "* TODO %?\nCreada en: %U" :prepend t :empty-lines 1)
               ("i" "Ideas y notas" entry
               (file+headline "/media/datos/javier/Nextcloud/Notes/org/inbox.org" "Ideas")
               "** %?\nCreada en: %U" :prepend t :empty-lines 1)
               ("n" "Nota médica" entry
               (file "/media/datos/javier/Nextcloud/Notes/org/Notas Medicas.org")
               "* %?\n:PROPERTIES:\n:CUSTOM_ID: %<%Y%m%d%H%M%S - >\n:CREATED: %u\n:END:\n" :prepend nil :time-prompt t :empty-lines 1)
               ("a" "Audio Podcast" entry
               (file+olp "/media/datos/javier/Nextcloud/Notes/org/milangaelectronica.com.ar.org" "Homepage" "Audios")
               "** TODO %? %[~/.emacs.d/org-capture-template-milanga-podcast.txt]" :empty-lines 1 :prepend t)
               ("p" "Post milanga" entry
               (file+olp "/media/datos/javier/Nextcloud/Notes/org/milangaelectronica.com.ar.org" "Homepage" "Blog")
               "** TODO %? %[~/.emacs.d/org-capture-template-milanga-blog.txt]" :empty-lines 1 :prepend t)
               ("j" "Journal entry" entry
               (file+headline "/media/datos/javier/Nextcloud/Notes/org/tech.org" "Journal")
               "** %u %?" :prepend t :empty-lines 1 :time-prompt t :tree-type week)
               ("z" "Zettel" entry
               (file+headline "/media/datos/javier/Nextcloud/Notes/org/zettelkasten.org" "Zettels")
               "* %? %[~/.emacs.d/zettels.txt]" :empty-lines 1 :prepend t)))

;; === Org-superstar: Mejora estética de los encabezados ===
(use-package org-superstar
  :ensure t
  :after org
  :hook (org-mode . org-superstar-mode))

;; === Org-super-agenda ===
(use-package org-super-agenda
  :ensure t
  :config (org-super-agenda-mode))

(setq org-agenda-custom-commands
  '(("c" "Super Agenda" agenda
     (org-super-agenda-mode)
     ((org-super-agenda-groups
       '(;; Each group has an implicit boolean OR operator between its selectors.
         (:name "Programado para este dia"
				:time-grid t
				:scheduled today
                :order 0)
         (:name "Important"
                ;; Single arguments given alone
                :tag "Turnos"
                :priority "A"
                :order 1)
         (:name "Due soon"
				:deadline future)
         (:name "Reschedule"
                :scheduled past)
         (:name "Overdue"
                :deadline past)

         ;; Groups supply their own section names when none are given
         (:todo "WAITING" :order 8)  ; Set order of this section
         (:todo ("SOMEDAY" "HOLD" "CHECK" "NEXT" "WATCHING")
                ;; Show this group at the end of the agenda (since it has the
                ;; highest number). If you specified this group last, items
                ;; with these todo keywords that e.g. have priority A would be
                ;; displayed in that group instead, because items are grouped
                ;; out in the order the groups are listed.
                :order 9)
         (:priority<= "B"
                      ;; Show this section after "Today" and "Important", because
                      ;; their order is unspecified, defaulting to 0. Sections
                      ;; are displayed lowest-number-first.
                      :order 2)
         ;; After the last group, the agenda will display items that didn't
         ;; match any of these groups, with the default order position of 99
         )))

  '("t" "Todo View"
    (
     (todo "" ((org-agenda-overriding-header "")
               (org-super-agenda-groups
                '((:name "agenda"
                         :file-path "agenda"
                         :order 0
                         )
                  (:auto-category t
                                  :order 9)
         (org-agenda nil "a"))))))))))


;; === CALENDARIO calfw ===
;; https://github.com/kiwanami/emacs-calfw

(use-package calfw-org
    :ensure t
    :config
    (setq cfw:org-overwrite-default-keybinding t)
    (setq calendar-week-start-day 1)
    (setq calendar-month-name-array
        ["Enero" "Febrero" "Marzo" "Abril" "Mayo" "Junio" "Julio" "Agosto" "Septiembre" "Octubre" "Noviembre" "Diciembre"])
    (setq calendar-day-name-array
        ["Domingo" "Lunes" "Martes" "Miércoles" "Jueves" "Viernes" "Sábado"])
    :bind ("C-c f" . cfw:open-org-calendar))

(provide 'orgmode)

theme.el

;; === Tema de Emacs ===
(use-package dracula-theme
  :init
  (add-to-list 'custom-theme-load-path "~/.emacs.d/themes")
  (load-theme 'dracula t)
  :ensure t)

;; === ARREGLOS VISUALES ===

;; === Mostrar emojis ===
(use-package emojify
  :ensure t
  :hook (after-init . global-emojify-mode))

;; == Iconos ===
;; Primero es necesario hacer esto!!: "M-x all-the-icons-install-fonts"
(use-package all-the-icons
       :ensure t)

;; === Pretty-mode ===
;; Cambiar ciertos caracteres por unos visualmente atractivos
(use-package pretty-mode
	   :ensure t
	   :config (global-pretty-mode t))

(use-package smart-mode-line-powerline-theme :ensure t)
(use-package smart-mode-line
  :ensure t
  :init (add-hook 'after-init-hook 'sml/setup)
  :config
  (sml/apply-theme 'powerline))


(provide 'theme)

completion.el

;; === Completado automatico ==

(use-package ivy
  :diminish (ivy-mode . "")
  :init (ivy-mode 1) ; globally at startup
  :config
  (setq ivy-use-virtual-buffers t)
  (setq ivy-height 20)
  (setq ivy-count-format "%d/%d ")
  (provide 'init-ivy)
  :ensure t)

;; === Hacer más usable ivy ===
;; FLX ordena los resultados de M-x de acorde al último usado.

;; === Yasnippet===
;; YASnippet es un sistema de plantillas para Emacs. Le permite escribir una abreviatura y expandirla automáticamente.
(use-package yasnippet
  :ensure t
  :defer t
  :config
  (setq yas-snippet-dirs
        '("~/.emacs.d/snippets/")))
(use-package ivy-yasnippet
  :ensure t)
(add-hook 'org-mode-hook 'yas-minor-mode)
(global-set-key (kbd "C-c x")   'ivy-yasnippet)

(use-package company
  :ensure t
  :bind (:map company-active-map
         ("C-n" . company-select-next)
         ("C-p" . company-select-previous))
  :config
  (setq company-idle-delay 0.3)
  (global-company-mode t))

(provide 'completion)

keymappings.el

;; === ATAJOS DE TECLADO ==
;; F1           Borra ventana
;; F2           Treemacs
;; F5           Deft
;; F8           Cambia idioma del corrector.
;; F11          Abre el archivo agenda.org
;; F12          Agenda

;; C-x tt       treemacs
;; C-c ac       Super-agenda
;; C-x C-n      Dired sidebar
;; C-c x        Ivy Snippets


(global-set-key (kbd "<f1>") 'delete-window)
(global-set-key (kbd "<f2>") 'treemacs)
(global-set-key (kbd "<f12>") 'org-agenda-list)

(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)

;; asigna "F11" para abrir mi agenda.org sin tener que buscarlo
(global-set-key (kbd "<f11>")
                (lambda () (interactive) (find-file "/media/datos/javier/Nextcloud/Notes/org/agenda.org")))

;; asigna "C-c i" para abrir mi inbox.org sin tener que buscarlo
(global-set-key (kbd "C-c i")
                (lambda () (interactive) (find-file "/media/datos/javier/Nextcloud/Notes/org/inbox.org")))

;; asigna "C-c n" para abrir mi Notas médicas sin tener que buscarlo
(global-set-key (kbd "C-c n")
                (lambda () (interactive) (find-file "/media/datos/javier/Nextcloud/Notes/org/Notas Medicas.org")))

;; asigna "C-c p" para abrir mi Projects sin tener que buscarlo
(global-set-key (kbd "C-c p")
                (lambda () (interactive) (find-file "/media/datos/javier/Nextcloud/Notes/org/projects.org")))

;; === Regular undo-redo ===
(global-unset-key (kbd "C-z"))
(global-set-key (kbd "C-z")   'undo-fu-only-undo)

;; make some use of the Super key
(define-key global-map [?\s-a] 'dired-sidebar-toggle-sidebar)
(define-key global-map [?\s-c] 'cfw:open-org-calendar)

(provide 'keymappings)

varios.el

;; === Dired ==
;;
(use-package dired-sidebar
  :bind (("C-x C-n" . dired-sidebar-toggle-sidebar))
  :ensure t
  :commands (dired-sidebar-toggle-sidebar)
  :init
  (add-hook 'dired-sidebar-mode-hook
            (lambda ()
              (unless (file-remote-p default-directory)
                (auto-revert-mode))))
  :config
  (push 'toggle-window-split dired-sidebar-toggle-hidden-commands)
  (push 'rotate-windows dired-sidebar-toggle-hidden-commands)

  (setq dired-sidebar-subtree-line-prefix "__")
  (setq dired-sidebar-theme 'vscode)
  (setq dired-sidebar-use-term-integration t)
  (setq dired-sidebar-use-custom-font t))

;; === Treemacs ===
;;
(use-package treemacs
  :ensure t
  :defer t
  :init
  (with-eval-after-load 'winum
    (define-key winum-keymap (kbd "F2") #'treemacs-select-window))
  :config
  (progn
    (setq treemacs-collapse-dirs                 (if treemacs-python-executable 3 0)
          treemacs-deferred-git-apply-delay      0.5
          treemacs-directory-name-transformer    #'identity
          treemacs-display-in-side-window        t
          treemacs-eldoc-display                 t
          treemacs-file-event-delay              5000
          treemacs-file-extension-regex          treemacs-last-period-regex-value
          treemacs-file-follow-delay             0.2
          treemacs-file-name-transformer         #'identity
          treemacs-follow-after-init             t
          treemacs-git-command-pipe              ""
          treemacs-goto-tag-strategy             'refetch-index
          treemacs-indentation                   2
          treemacs-indentation-string            " "
          treemacs-is-never-other-window         nil
          treemacs-max-git-entries               5000
          treemacs-missing-project-action        'ask
          treemacs-move-forward-on-expand        nil
          treemacs-no-png-images                 nil
          treemacs-no-delete-other-windows       t
          treemacs-project-follow-cleanup        nil
          treemacs-persist-file                  (expand-file-name ".cache/treemacs-persist" user-emacs-directory)
          treemacs-position                      'left
          treemacs-read-string-input             'from-child-frame
          treemacs-recenter-distance             0.1
          treemacs-recenter-after-file-follow    nil
          treemacs-recenter-after-tag-follow     nil
          treemacs-recenter-after-project-jump   'always
          treemacs-recenter-after-project-expand 'on-distance
          treemacs-show-cursor                   nil
          treemacs-show-hidden-files             t
          treemacs-silent-filewatch              nil
          treemacs-silent-refresh                nil
          treemacs-sorting                       'alphabetic-asc
          treemacs-space-between-root-nodes      t
          treemacs-tag-follow-cleanup            t
          treemacs-tag-follow-delay              1.5
          treemacs-user-mode-line-format         nil
          treemacs-user-header-line-format       nil
          treemacs-width                         35
          treemacs-workspace-switch-cleanup      nil)

    ;; The default width and height of the icons is 22 pixels. If you are
    ;; using a Hi-DPI display, uncomment this to double the icon size.
    ;;(treemacs-resize-icons 44)

    (treemacs-follow-mode t)
    (treemacs-filewatch-mode t)
    (treemacs-fringe-indicator-mode 'always)
    (pcase (cons (not (null (executable-find "git")))
                 (not (null treemacs-python-executable)))
      (`(t . t)
       (treemacs-git-mode 'deferred))
      (`(t . _)
       (treemacs-git-mode 'simple))))
  :bind
  (:map global-map
        ("M-0"       . treemacs-select-window)
        ("C-x t 1"   . treemacs-delete-other-windows)
        ("C-x t t"   . treemacs)
        ("C-x t B"   . treemacs-bookmark)
        ("C-x t C-t" . treemacs-find-file)
        ("C-x t M-t" . treemacs-find-tag)))

(use-package treemacs-icons-dired
  :after (treemacs dired)
  :ensure t
  :config (treemacs-icons-dired-mode))

(provide 'varios)

zettelkasten

;; Arreglos para uso del método Zettelkasten con Zetteldeft

;; === Zetteldeft ===
(use-package zetteldeft
  :ensure t
  :after deft
  :config (zetteldeft-set-classic-keybindings))

(custom-set-variables
 '(zetteldeft-id-format "%Y%m%d%H%M%S")
 '(zetteldeft-id-regex "20[0-9]\\{4\\}\\([0-9]\\{2,\\}\\)\\{4\\}")
 '(zetteldeft-link-indicator "[[")
 '(zetteldeft-link-suffix "]]")
 '(zetteldeft-title-prefix "# "))

;; === Deft ===
(use-package deft
  :init
  (setq deft-directory "/media/datos/javier/Gdrive/Notes/zettelkasten/")
  (setq deft-extensions '("md" "org"))
  (setq deft-use-filename-as-title t)
  (setq deft-use-filter-string-for-filename t)
  (setq deft-recursive t)
    :bind
  ("<f5>" . deft)
  :ensure t)
(setq-default truncate-lines 1) ;; Hace que Deft ponga archivos y descripcion en una linea

;; === Obsidian ===
;; https://github.com/licht1stein/obsidian.el
(use-package obsidian
  :ensure t
  :demand t
  :config
  (obsidian-specify-path "/media/datos/javier/Nextcloud/Notes/Notes/")
  (global-obsidian-mode t)
  :custom
  ;; This directory will be used for `obsidian-capture' if set.
  (obsidian-inbox-directory "Inbox"))

(provide 'zettelkasten)

markdown.el

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

(provide 'markdown)

splash.el

;; === DASHBOARD ===

;; Dependencies
(use-package page-break-lines
  :ensure t)
  (use-package all-the-icons)

(use-package dashboard
  :init
  (add-hook 'after-init-hook 'dashboard-refresh-buffer)
  :ensure t
  :config
  (dashboard-setup-startup-hook)
  (add-to-list 'dashboard-items '(agenda) t)
  (setq dashboard-week-agenda t)
  (setq dashboard-set-heading-icons t)
  (setq dashboard-set-file-icons t)
  (setq dashboard-startup-banner 3)
  (setq dashboard-set-init-info t)
  (setq dashboard-items '((recents  . 5)
                        (bookmarks . 5)
                        (projects . 5)
                        (agenda . 5)
                        (registers . 5))))

(provide 'splash)

hugo.el

;; Configuracion de easy-hugo
(use-package easy-hugo
    :ensure t
    :init
    :config
    (setq easy-hugo-basedir "/media/datos/javier/Nextcloud/Blog/milanga-blog/")
    (setq easy-hugo-url "https://milangaelectronica.com.ar")
    (setq easy-hugo-sshdomain "milangaelectronica.com.ar")
    (setq easy-hugo-root "/media/datos/javier/Nextcloud/Blog/milanga-blog/")
    (setq easy-hugo-postdir "content/posts")
    (setq easy-hugo-previewtime "300")
    (define-key global-map (kbd "C-c C-e") 'easy-hugo)
    (setq easy-hugo-server-flags "-D"))

(provide 'hugo)