;;; init-base.el --- Configuración base de emacs	-*- lexical-binding: t -*-

;; Author: kj <webmaster@outcontrol.net>
;; URL: https://git.kj2.me/kj/confi-emacs-actual

;;; Commentary:

;; Configuración general de Emacs.
;; No incluye paquetes/extensiones, solo configuraciones generales.

;;; Code:

;; Native compilation
(when (and (fboundp 'native-comp-available-p)
           (native-comp-available-p))
  (progn
    (setq native-comp-async-report-warnings-errors nil)
    (setq comp-deferred-compilation t)
    (setq package-native-compile t)
    ))

;; Instalar elpaca.el (reemplpazando package.el)
(defvar elpaca-installer-version 0.7)
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
                              :ref nil
                              :files (:defaults "elpaca-test.el" (:exclude "extensions"))
                              :build (:not elpaca--activate-package)))
(let* ((repo  (expand-file-name "elpaca/" elpaca-repos-directory))
       (build (expand-file-name "elpaca/" elpaca-builds-directory))
       (order (cdr elpaca-order))
       (default-directory repo))
  (add-to-list 'load-path (if (file-exists-p build) build repo))
  (unless (file-exists-p repo)
    (make-directory repo t)
    (when (< emacs-major-version 28) (require 'subr-x))
    (condition-case-unless-debug err
        (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
                 ((zerop (call-process "git" nil buffer t "clone"
                                       (plist-get order :repo) repo)))
                 ((zerop (call-process "git" nil buffer t "checkout"
                                       (or (plist-get order :ref) "--"))))
                 (emacs (concat invocation-directory invocation-name))
                 ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
                                       "--eval" "(byte-recompile-directory \".\" 0 'force)")))
                 ((require 'elpaca))
                 ((elpaca-generate-autoloads "elpaca" repo)))
            (progn (message "%s" (buffer-string)) (kill-buffer buffer))
          (error "%s" (with-current-buffer buffer (buffer-string))))
      ((error) (warn "%s" err) (delete-directory repo 'recursive))))
  (unless (require 'elpaca-autoloads nil t)
    (require 'elpaca)
    (elpaca-generate-autoloads "elpaca" repo)
    (load "./elpaca-autoloads")))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))

;; Instalar use-package si no está instalado
(elpaca elpaca-use-package
  ;; Enable :elpaca use-package keyword.
  (elpaca-use-package-mode)
  ;; Assume :elpaca t unless otherwise specified.
  (setq elpaca-use-package-by-default t))

;; Block until current queue processed.
(elpaca-wait)

(defconst private-dir  (expand-file-name "private" user-emacs-directory))
(defconst temp-dir (format "%s/cache" private-dir)
  "Hostname-based elisp temp directories.")

;; UTF-8 please
(set-charset-priority 'unicode)
(setq locale-coding-system   'utf-8)   ; pretty
(set-terminal-coding-system  'utf-8)   ; pretty
(set-keyboard-coding-system  'utf-8)   ; pretty
(set-selection-coding-system 'utf-8)   ; please
(prefer-coding-system        'utf-8)   ; with sugar on top
(setq default-process-coding-system '(utf-8-unix . utf-8-unix))

;; Emacs customizations
(scroll-bar-mode -1)                            ; Quitar scrollbar.
(tooltip-mode -1)                               ; Disable tooltips.
(global-display-line-numbers-mode)              ; Mostar número de línea.
(show-paren-mode 1)                             ; Habilitar resaltado de brackets.
(pending-delete-mode t)                         ; Cuando selecciono un texto y escribo, el texto se borra (emacs por defecto solo escribe donde está el cursor).
;; (global-hl-line-mode)                           ; Resaltar línea actual por defecto.
(setq use-short-answers t)                      ; Usar respuesta cortas (y/n) en lugar de las largas (yes/no)
(setq-default
 cursor-type 'bar                               ; Usar la barrita como cursor
 cursor-in-non-selected-windows nil             ; Desaparecer el cursor en frames no activos.
 indent-tabs-mode nil                           ; Cambiar tabs por espacios.
 inhibit-startup-message t                      ; Eliminar el mensaje de inicio.
 )
(setq
 custom-file (concat private-dir "/.custom.el") ; Cabiar la ruta del código que se genera al isntalar un theme o package
 ac-ignore-case nil                             ; Desactivar el autocapitalizado.
 ac-disable-faces nil                           ; Auto-complete hablitado incluso entre comillas (fuente: https://bit.ly/3a9wCB4).
 tags-revert-without-query 1                    ; Recargar tags (ctags) sin pedir confirmación.
 )
;; Leve transparencia en emacs por defecto.
;; (set-frame-parameter nil 'alpha-background 95)

;; Backups enabled, use nil to disable
(setq
 history-length                     1000
 backup-inhibited                   nil
 make-backup-files                  nil
 auto-save-default                  nil
 auto-save-list-file-name           (concat temp-dir "/autosave")
 create-lockfiles                   nil
 backup-directory-alist            `((".*" . ,(concat temp-dir "/backup/")))
 auto-save-file-name-transforms    `((".*" ,(concat temp-dir "/auto-save-list/") t)))

;; Configuración cuando es un server
(defun setup-daemon ()
  "Carga la configuración del modo daemon."
  (message "Corriendo en modo daemon.")
  (set-face-attribute 'default nil :font "Fira Code Retina" :height 112)

  ;; Abrir primero el dashboard
  (setq initial-buffer-choice (lambda ()
                                (get-buffer "*dashboard*")
                                (dashboard-refresh-buffer)))

  ;; Cerrar buffers al cerrar emacsclient
  ;; (add-hook 'delete-frame-functions
  ;;           (lambda (frame)
  ;;             (mapc 'kill-buffer (delq (get-buffer "*dashboard*") (buffer-list)))
  ;;             ))
  )

(if (daemonp)
    (add-hook 'after-make-frame-functions
              (lambda (frame)
                (with-selected-frame frame
                  (setup-daemon))))
  (message "Corriendo en modo normal."))

(add-hook 'elpaca-after-init-hook (lambda () (load custom-file 'noerror)))

(provide 'init-base)
;;; init-base.el ends here